Class: Gem::Mirror

Inherits:
Object
  • Object
show all
Defined in:
lib/rubygems/mirror/test_setup.rb,
lib/rubygems/mirror.rb

Defined Under Namespace

Modules: TestSetup

Constant Summary collapse

VERSION =
'1.0.1'
SPECS_FILE =
"specs.#{Gem.marshal_version}"
SPECS_FILE_Z =
"specs.#{Gem.marshal_version}.gz"
DEFAULT_URI =
'http://production.cf.rubygems.org/'
DEFAULT_TO =
File.join(Gem.user_home, '.gem', 'mirror')
RUBY =
'ruby'

Instance Method Summary collapse

Constructor Details

#initialize(from = DEFAULT_URI, to = DEFAULT_TO, parallelism = 10) ⇒ Mirror

Returns a new instance of Mirror.



18
19
20
21
22
# File 'lib/rubygems/mirror.rb', line 18

def initialize(from = DEFAULT_URI, to = DEFAULT_TO, parallelism = 10)
  @from, @to = from, to
  @fetcher = Fetcher.new
  @pool = Pool.new(parallelism)
end

Instance Method Details

#delete_gemsObject



72
73
74
75
76
77
78
79
80
81
# File 'lib/rubygems/mirror.rb', line 72

def delete_gems
  gems_to_delete.each do |g|
    @pool.job do
      File.delete(to('gems', g))
      yield
    end
  end

  @pool.run_til_done
end

#existing_gemsObject



49
50
51
# File 'lib/rubygems/mirror.rb', line 49

def existing_gems
  Dir[to('gems', '*.gem')].entries.map { |f| File.basename(f) }
end

#from(*args) ⇒ Object



24
25
26
# File 'lib/rubygems/mirror.rb', line 24

def from(*args)
  File.join(@from, *args)
end

#gemsObject



38
39
40
41
42
43
44
45
46
47
# File 'lib/rubygems/mirror.rb', line 38

def gems
  update_specs unless File.exists?(to(SPECS_FILE))

  gems = Marshal.load(File.read(to(SPECS_FILE)))
  gems.map! do |name, ver, plat|
    # If the platform is ruby, it is not in the gem name
    "#{name}-#{ver}#{"-#{plat}" unless plat == RUBY}.gem"
  end
  gems
end

#gems_to_deleteObject



57
58
59
# File 'lib/rubygems/mirror.rb', line 57

def gems_to_delete
  existing_gems - gems
end

#gems_to_fetchObject



53
54
55
# File 'lib/rubygems/mirror.rb', line 53

def gems_to_fetch
  gems - existing_gems
end

#to(*args) ⇒ Object



28
29
30
# File 'lib/rubygems/mirror.rb', line 28

def to(*args)
  File.join(@to, *args)
end

#updateObject



83
84
85
86
87
# File 'lib/rubygems/mirror.rb', line 83

def update
  update_specs
  update_gems
  cleanup_gems
end

#update_gemsObject



61
62
63
64
65
66
67
68
69
70
# File 'lib/rubygems/mirror.rb', line 61

def update_gems
  gems_to_fetch.each do |g|
    @pool.job do
      @fetcher.fetch(from('gems', g), to('gems', g))
      yield
    end
  end

  @pool.run_til_done
end

#update_specsObject



32
33
34
35
36
# File 'lib/rubygems/mirror.rb', line 32

def update_specs
  specz = to(SPECS_FILE_Z)
  @fetcher.fetch(from(SPECS_FILE_Z), specz)
  open(to(SPECS_FILE), 'wb') { |f| f << Gem.gunzip(File.read(specz)) }
end