Class: Gem::Mirror

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

Defined Under Namespace

Modules: TestSetup Classes: Fetcher, Pool

Constant Summary collapse

VERSION =
'1.3.0'
SPECS_FILES =
[ "specs.#{Gem.marshal_version}", "prerelease_specs.#{Gem.marshal_version}", "latest_specs.#{Gem.marshal_version}" ]
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 = nil, retries = nil, skiperror = nil) ⇒ Mirror

Returns a new instance of Mirror.



16
17
18
19
20
# File 'lib/rubygems/mirror.rb', line 16

def initialize(from = DEFAULT_URI, to = DEFAULT_TO, parallelism = nil, retries = nil, skiperror = nil)
  @from, @to = from, to
  @fetcher = Fetcher.new :retries => retries, :skiperror => skiperror
  @pool = Pool.new(parallelism || 10)
end

Instance Method Details

#delete_gemsObject



111
112
113
114
115
116
117
118
119
120
# File 'lib/rubygems/mirror.rb', line 111

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

  @pool.run_til_done
end

#existing_gemsObject



71
72
73
# File 'lib/rubygems/mirror.rb', line 71

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

#existing_gemspecsObject



75
76
77
# File 'lib/rubygems/mirror.rb', line 75

def existing_gemspecs
  Dir[to("quick/Marshal.#{Gem.marshal_version}", '*.rz')].entries.map { |f| File.basename(f) }
end

#from(*args) ⇒ Object



22
23
24
# File 'lib/rubygems/mirror.rb', line 22

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

#gemsObject



40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# File 'lib/rubygems/mirror.rb', line 40

def gems
  gems = []

  SPECS_FILES.each do |sf|
    update_specs unless File.exist?(to(sf))

    gems += Marshal.load(File.read(to(sf)))
  end

  if ENV["RUBYGEMS_MIRROR_ONLY_LATEST"].to_s.upcase != "TRUE"
    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
  else
    latest_gems = {}

    gems.each do |name, ver, plat|
      next if ver.prerelease?
      next unless plat == RUBY
      latest_gems[name] = ver
    end

    gems = latest_gems.map do |name, ver|
      "#{name}-#{ver}.gem"
    end
  end

  gems
end

#gems_to_deleteObject



87
88
89
# File 'lib/rubygems/mirror.rb', line 87

def gems_to_delete
  existing_gems - gems
end

#gems_to_fetchObject



79
80
81
# File 'lib/rubygems/mirror.rb', line 79

def gems_to_fetch
  gems - existing_gems
end

#gemspecs_to_fetchObject



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

def gemspecs_to_fetch
  gems.map { |g| "#{g}spec.rz" } - existing_gemspecs
end

#to(*args) ⇒ Object



26
27
28
# File 'lib/rubygems/mirror.rb', line 26

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

#updateObject



122
123
124
125
126
# File 'lib/rubygems/mirror.rb', line 122

def update
  update_specs
  update_gems
  cleanup_gems
end

#update_gemsObject



91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
# File 'lib/rubygems/mirror.rb', line 91

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

  if ENV["RUBYGEMS_MIRROR_ONLY_LATEST"].to_s.upcase != "TRUE"
    gemspecs_to_fetch.each do |g_spec|
      @pool.job do
        @fetcher.fetch(from("quick/Marshal.#{Gem.marshal_version}", g_spec), to("quick/Marshal.#{Gem.marshal_version}", g_spec))
        yield if block_given?
      end
    end
  end

  @pool.run_til_done
end

#update_specsObject



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

def update_specs
  SPECS_FILES.each do |sf|
    sfz = "#{sf}.gz"

    specz = to(sfz)
    @fetcher.fetch(from(sfz), specz)
    open(to(sf), 'wb') { |f| f << Gem::Util.gunzip(File.read(specz)) }
  end
end