rubygems-mirror 1.0.1 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 461dc98f6c8403d54cbeb5a111627cafd5cdb594
4
+ data.tar.gz: 06dc9f69498a7a36f1eba4ac2c30c24bbcb5bd16
5
+ SHA512:
6
+ metadata.gz: 2b14b48eb67fc2ae987987db40b6b70a9c708fe301d7be10563445fa6dfca7c176c43424d0e54f0145cbf4ea532145321b9479aed1189ae75ac582aa49f7fb52
7
+ data.tar.gz: ecee0c9751f96129eeded015b43d9d548b98f1034ef6d7530173318963c8939db66e3395ff0175218ad7817a3a68ba35b97bf4b6b27463cbc5bd77ad49ab923e
@@ -1,3 +1,12 @@
1
+ === 1.1.0 / 2015-07-28
2
+
3
+ * Documentation corrections and updates
4
+ * Fix no longer implicit dependencies with modern rubygems and ruby versions
5
+ * Concurrency can be specified in configuration file
6
+ * Support permanent redirects
7
+ * Fixed support for system gems
8
+ * Mirroring now includes all specs files and .rz's, and /quick
9
+
1
10
  === 1.0.0 / 2011-10-01
2
11
 
3
12
  * 1 major enhancement
@@ -1,6 +1,8 @@
1
1
  = rubygems-mirror
2
2
 
3
- http://github.com/rubygems/rubygems-mirror
3
+ https://github.com/rubygems/rubygems-mirror
4
+
5
+ {<img src="https://badge.fury.io/rb/rubygems-mirror.svg" alt="Gem Version" />}[http://badge.fury.io/rb/rubygems-mirror]
4
6
 
5
7
  == DESCRIPTION:
6
8
 
@@ -24,9 +26,13 @@ will maintain stability in master.
24
26
 
25
27
  * In a file at ~/.gem/.mirrorrc add a config that looks like the following:
26
28
 
27
- ---
28
- - from: http://rubygems.org
29
- to: /data/rubygems
29
+ ---
30
+ - from: http://rubygems.org
31
+ to: /data/rubygems
32
+ parallelism: 10
33
+ retries: 3
34
+ delete: false
35
+ skiperror: true
30
36
 
31
37
  * Either install the gem, then run `gem mirror`, or
32
38
  * Clone then run `rake mirror:update`
@@ -37,12 +43,12 @@ will maintain stability in master.
37
43
 
38
44
  == RESOURCES
39
45
 
40
- * {Website}[http://rubygems.org/]
41
- * {Documentation}[http://rubygems.rubyforge.org/rubygems-mirror/README_rdoc.html]
42
- * {Wiki}[http://wiki.github.com/rubygems/rubygems-mirror/]
43
- * {Source Code}[http://github.com/rubygems/rubygems-mirror/]
44
- * {Issues}[http://github.com/rubygems/rubygems-mirror/issues]
45
- * {Rubyforge}[http://rubyforge.org/projects/rubygems]
46
+ * {Website}[https://rubygems.org/]
47
+ * {Documentation}[https://github.com/rubygems/rubygems-mirror/blob/master/README.rdoc]
48
+ * {Wiki}[https://wiki.github.com/rubygems/rubygems-mirror/]
49
+ * {Source Code}[https://github.com/rubygems/rubygems-mirror/]
50
+ * {Issues}[https://github.com/rubygems/rubygems-mirror/issues]
51
+ * {Rubyforge}[https://rubyforge.org/projects/rubygems]
46
52
 
47
53
  == LICENSE:
48
54
 
data/Rakefile CHANGED
@@ -1,21 +1,18 @@
1
1
  #!/usr/bin/env rake
2
2
 
3
3
  require 'hoe'
4
- Hoe.plugin :doofus, :git, :gemcutter
4
+ Hoe.plugin :doofus, :git
5
5
 
6
6
  Hoe.spec 'rubygems-mirror' do
7
- developer('James Tucker', 'raggi@rubyforge.org')
7
+ developer('James Tucker', 'jftucker@gmail.com')
8
+ license "MIT"
8
9
 
9
- extra_dev_deps << %w[hoe-doofus >=1.0.0]
10
- extra_dev_deps << %w[hoe-git >=1.3.0]
11
- extra_dev_deps << %w[hoe-gemcutter >=1.0.0]
12
- extra_dev_deps << %w[builder >=2.1.2]
13
- extra_deps << %w[net-http-persistent >=2.1]
10
+ extra_dev_deps << %w[minitest ~>5.7]
11
+ extra_deps << %w[net-http-persistent ~>2.9]
14
12
 
15
13
  self.extra_rdoc_files = FileList["**/*.rdoc"]
16
14
  self.history_file = "CHANGELOG.rdoc"
17
15
  self.readme_file = "README.rdoc"
18
- self.rubyforge_name = 'rubygems'
19
16
  self.testlib = :minitest
20
17
  end
21
18
 
@@ -5,20 +5,19 @@ class Gem::Mirror
5
5
  autoload :Fetcher, 'rubygems/mirror/fetcher'
6
6
  autoload :Pool, 'rubygems/mirror/pool'
7
7
 
8
- VERSION = '1.0.1'
8
+ VERSION = '1.1.0'
9
9
 
10
- SPECS_FILE = "specs.#{Gem.marshal_version}"
11
- SPECS_FILE_Z = "specs.#{Gem.marshal_version}.gz"
10
+ SPECS_FILES = [ "specs.#{Gem.marshal_version}", "prerelease_specs.#{Gem.marshal_version}", "latest_specs.#{Gem.marshal_version}" ]
12
11
 
13
12
  DEFAULT_URI = 'http://production.cf.rubygems.org/'
14
13
  DEFAULT_TO = File.join(Gem.user_home, '.gem', 'mirror')
15
14
 
16
15
  RUBY = 'ruby'
17
16
 
18
- def initialize(from = DEFAULT_URI, to = DEFAULT_TO, parallelism = 10)
17
+ def initialize(from = DEFAULT_URI, to = DEFAULT_TO, parallelism = nil, retries = nil, skiperror = nil)
19
18
  @from, @to = from, to
20
- @fetcher = Fetcher.new
21
- @pool = Pool.new(parallelism)
19
+ @fetcher = Fetcher.new :retries => retries, :skiperror => skiperror
20
+ @pool = Pool.new(parallelism || 10)
22
21
  end
23
22
 
24
23
  def from(*args)
@@ -30,15 +29,24 @@ class Gem::Mirror
30
29
  end
31
30
 
32
31
  def update_specs
33
- specz = to(SPECS_FILE_Z)
34
- @fetcher.fetch(from(SPECS_FILE_Z), specz)
35
- open(to(SPECS_FILE), 'wb') { |f| f << Gem.gunzip(File.read(specz)) }
32
+ SPECS_FILES.each do |sf|
33
+ sfz = "#{sf}.gz"
34
+
35
+ specz = to(sfz)
36
+ @fetcher.fetch(from(sfz), specz)
37
+ open(to(sf), 'wb') { |f| f << Gem.gunzip(File.read(specz)) }
38
+ end
36
39
  end
37
40
 
38
41
  def gems
39
- update_specs unless File.exists?(to(SPECS_FILE))
42
+ gems = []
43
+
44
+ SPECS_FILES.each do |sf|
45
+ update_specs unless File.exist?(to(sf))
46
+
47
+ gems += Marshal.load(File.read(to(sf)))
48
+ end
40
49
 
41
- gems = Marshal.load(File.read(to(SPECS_FILE)))
42
50
  gems.map! do |name, ver, plat|
43
51
  # If the platform is ruby, it is not in the gem name
44
52
  "#{name}-#{ver}#{"-#{plat}" unless plat == RUBY}.gem"
@@ -50,10 +58,18 @@ class Gem::Mirror
50
58
  Dir[to('gems', '*.gem')].entries.map { |f| File.basename(f) }
51
59
  end
52
60
 
61
+ def existing_gemspecs
62
+ Dir[to("quick/Marshal.#{Gem.marshal_version}", '*.rz')].entries.map { |f| File.basename(f) }
63
+ end
64
+
53
65
  def gems_to_fetch
54
66
  gems - existing_gems
55
67
  end
56
68
 
69
+ def gemspecs_to_fetch
70
+ gems.map { |g| "#{g}spec.rz" } - existing_gemspecs
71
+ end
72
+
57
73
  def gems_to_delete
58
74
  existing_gems - gems
59
75
  end
@@ -62,7 +78,14 @@ class Gem::Mirror
62
78
  gems_to_fetch.each do |g|
63
79
  @pool.job do
64
80
  @fetcher.fetch(from('gems', g), to('gems', g))
65
- yield
81
+ yield if block_given?
82
+ end
83
+ end
84
+
85
+ gemspecs_to_fetch.each do |g_spec|
86
+ @pool.job do
87
+ @fetcher.fetch(from("quick/Marshal.#{Gem.marshal_version}", g_spec), to("quick/Marshal.#{Gem.marshal_version}", g_spec))
88
+ yield if block_given?
66
89
  end
67
90
  end
68
91
 
@@ -73,7 +96,7 @@ class Gem::Mirror
73
96
  gems_to_delete.each do |g|
74
97
  @pool.job do
75
98
  File.delete(to('gems', g))
76
- yield
99
+ yield if block_given?
77
100
  end
78
101
  end
79
102
 
@@ -11,13 +11,17 @@ class Gem::Commands::MirrorCommand < Gem::Command
11
11
 
12
12
  def description # :nodoc:
13
13
  <<-EOF
14
- The mirror command uses the ~/.gem/.mirrorrc config file to mirror remote gem
15
- repositories to a local path. The config file is a YAML document that looks
16
- like this:
14
+ The mirror command uses the ~/.gem/.mirrorrc config file to mirror
15
+ remote gem repositories to a local path. The config file is a YAML
16
+ document that looks like this:
17
17
 
18
18
  ---
19
19
  - from: http://gems.example.com # source repository URI
20
20
  to: /path/to/mirror # destination directory
21
+ parallelism: 10 # use 10 threads for downloads
22
+ retries: 3 # retry 3 times if fail to download a gem, optional, def is 1. (no retry)
23
+ delete: false # whether delete gems (if remote ones are removed),optional, default is false.
24
+ skiperror: true # whether skip error, optional, def is true. will stop at error if set this to false.
21
25
 
22
26
  Multiple sources and destinations may be specified.
23
27
  EOF
@@ -38,13 +42,20 @@ Multiple sources and destinations may be specified.
38
42
 
39
43
  get_from = mir['from']
40
44
  save_to = File.expand_path mir['to']
45
+ parallelism = mir['parallelism']
46
+ retries = mir['retries'] || 1
47
+ skiperror = mir['skiperror']
48
+ delete = mir['delete']
41
49
 
42
50
  raise "Directory not found: #{save_to}" unless File.exist? save_to
43
51
  raise "Not a directory: #{save_to}" unless File.directory? save_to
44
52
 
45
- mirror = Gem::Mirror.new(get_from, save_to)
53
+ mirror = Gem::Mirror.new(get_from, save_to, parallelism, retries, skiperror)
46
54
 
47
- say "Fetching: #{mirror.from(Gem::Mirror::SPECS_FILE_Z)}"
55
+ Gem::Mirror::SPECS_FILES.each do |sf|
56
+ say "Fetching: #{mirror.from(sf)}"
57
+ end
58
+
48
59
  mirror.update_specs
49
60
 
50
61
  say "Total gems: #{mirror.gems.size}"
@@ -58,14 +69,17 @@ Multiple sources and destinations may be specified.
58
69
 
59
70
  mirror.update_gems { progress.updated true }
60
71
 
61
- num_to_delete = mirror.gems_to_delete.size
62
72
 
63
- progress = ui.progress_reporter num_to_delete,
73
+ if delete
74
+ num_to_delete = mirror.gems_to_delete.size
75
+
76
+ progress = ui.progress_reporter num_to_delete,
64
77
  "Deleting #{num_to_delete} gems"
65
78
 
66
- trap(:INFO) { puts "Fetched: #{progress.count}/#{num_to_delete}" } if SUPPORTS_INFO_SIGNAL
79
+ trap(:INFO) { puts "Fetched: #{progress.count}/#{num_to_delete}" } if SUPPORTS_INFO_SIGNAL
67
80
 
68
- mirror.delete_gems { progress.updated true }
81
+ mirror.delete_gems { progress.updated true }
82
+ end
69
83
  end
70
84
  end
71
85
  end
@@ -5,20 +5,42 @@ class Gem::Mirror::Fetcher
5
5
  # TODO beef
6
6
  class Error < StandardError; end
7
7
 
8
- def initialize
8
+ def initialize(opts = {})
9
9
  @http = Net::HTTP::Persistent.new(self.class.name, :ENV)
10
+ @opts = opts
11
+
12
+ # default opts
13
+ @opts[:retries] ||= 1
14
+ @opts[:skiperror] = true if @opts[:skiperror].nil?
10
15
  end
11
16
 
12
17
  # Fetch a source path under the base uri, and put it in the same or given
13
18
  # destination path under the base path.
14
19
  def fetch(uri, path)
15
- modified_time = File.exists?(path) && File.stat(path).mtime.rfc822
20
+ modified_time = File.exist?(path) && File.stat(path).mtime.rfc822
16
21
 
17
22
  req = Net::HTTP::Get.new URI.parse(uri).path
18
23
  req.add_field 'If-Modified-Since', modified_time if modified_time
19
24
 
20
- @http.request URI(uri), req do |resp|
21
- return handle_response(resp, path)
25
+ retries = @opts[:retries]
26
+
27
+ begin
28
+ puts "get: #{uri}, #{retries}"
29
+
30
+ # Net::HTTP will throw an exception on things like http timeouts.
31
+ # Therefore some generic error handling is needed in case no response
32
+ # is returned so the whole mirror operation doesn't abort prematurely.
33
+ begin
34
+ @http.request URI(uri), req do |resp|
35
+ return handle_response(resp, path)
36
+ end
37
+ rescue Exception => e
38
+ warn "Error connecting to #{uri.to_s}: #{e.message}"
39
+ end
40
+ rescue Error
41
+ retries -= 1
42
+ retry if retries > 0
43
+ raise if not @opts[:skiperror]
22
44
  end
23
45
  end
24
46
 
@@ -27,12 +49,12 @@ class Gem::Mirror::Fetcher
27
49
  def handle_response(resp, path)
28
50
  case resp.code.to_i
29
51
  when 304
30
- when 302
52
+ when 301, 302
31
53
  fetch resp['location'], path
32
54
  when 200
33
55
  write_file(resp, path)
34
56
  when 403, 404
35
- warn "#{resp.code} on #{File.basename(path)}"
57
+ raise Error,"#{resp.code} on #{File.basename(path)}"
36
58
  else
37
59
  raise Error, "unexpected response #{resp.inspect}"
38
60
  end
@@ -67,11 +67,13 @@ class Gem::Mirror
67
67
  Dir.mkdir gemdir = File.join(@source_path, 'gems')
68
68
 
69
69
  @source_working = working = Dir.mktmpdir("test_gem_source_#{$$}")
70
+ FileUtils.mkdir_p rzspecdir = File.join(@source_path, "quick/Marshal.#{Gem.marshal_version}")
70
71
 
71
72
  Dir.mkdir File.join(working, 'lib')
72
73
 
73
74
  gemspecs = %w[a b c].map do |name|
74
75
  FileUtils.touch File.join(working, 'lib', "#{name}.rb")
76
+ FileUtils.touch File.join(rzspecdir, "#{name}spec.rz")
75
77
  Gem::Specification.new do |s|
76
78
  s.platform = Gem::Platform::RUBY
77
79
  s.name = name
@@ -88,13 +90,35 @@ class Gem::Mirror
88
90
  end
89
91
  end
90
92
 
93
+ # add prerelease gem versions
94
+ prerelease_gemspecs = %w[x y].map do |name|
95
+ FileUtils.touch File.join(working, 'lib', "#{name}.rb")
96
+ FileUtils.touch File.join(rzspecdir, "#{name}spec.rz")
97
+ Gem::Specification.new do |s|
98
+ s.platform = Gem::Platform::RUBY
99
+ s.name = name
100
+ s.version = "0.1.b"
101
+ s.author = 'rubygems'
102
+ s.email = 'example@example.com'
103
+ s.homepage = 'http://example.com'
104
+ s.has_rdoc = false
105
+ s.description = 'desc'
106
+ s.summary = "summ"
107
+ s.require_paths = %w[lib]
108
+ s.files = %W[lib/#{name}.rb]
109
+ s.rubyforge_project = 'rubygems'
110
+ end
111
+ end
112
+
113
+ gemspecs.concat(prerelease_gemspecs)
114
+
91
115
  gemspecs.each do |spec|
92
116
  path = File.join(working, "#{spec.name}.gemspec")
93
117
  open(path, 'w') do |io|
94
118
  io.write(spec.to_ruby)
95
119
  end
96
120
  Dir.chdir(working) do
97
- gem_file = Gem::Builder.new(spec).build
121
+ gem_file = Gem::Package.build(spec)
98
122
  FileUtils.mv(gem_file, File.join(@source_path, 'gems', gem_file))
99
123
  end
100
124
  end
@@ -149,7 +173,7 @@ class Gem::Mirror
149
173
  @server && @server.shutdown
150
174
  @server_thread && @server_thread.join
151
175
  end
152
-
176
+
153
177
  def with_server
154
178
  setup_ui
155
179
  setup_gem_source
@@ -4,7 +4,7 @@ require "rubygems/mirror/test_setup"
4
4
 
5
5
  require 'minitest/autorun' # damn you autotest.
6
6
 
7
- class TestGemMirror < MiniTest::Unit::TestCase
7
+ class TestGemMirror < Minitest::Test
8
8
  include Gem::Mirror::TestSetup
9
9
 
10
10
  # Used to make sure we don't raise on construction, works against defaults
@@ -16,8 +16,9 @@ class TestGemMirror < MiniTest::Unit::TestCase
16
16
  with_server do
17
17
  mirror = Gem::Mirror.new(*opts)
18
18
  mirror.update_specs
19
- assert File.exists?(mirror_path + "/#{Gem::Mirror::SPECS_FILE_Z}")
20
- assert File.exists?(mirror_path + "/#{Gem::Mirror::SPECS_FILE_Z}")
19
+ Gem::Mirror::SPECS_FILES.each do |sf|
20
+ assert File.exist?(mirror_path + "/#{sf}.gz")
21
+ end
21
22
  end
22
23
  end
23
24
 
@@ -32,8 +33,14 @@ class TestGemMirror < MiniTest::Unit::TestCase
32
33
  Dir[path + '/gems/*'].map { |f| File.basename(f) }
33
34
  end
34
35
 
36
+ source_rz_specs, mirror_rz_specs = [source_path, mirror_path].map do |path|
37
+ Dir[path + "/quick/Marshal.#{Gem.marshal_version}/*"].map { |f| File.basename(f) }
38
+ end
39
+
35
40
  assert_equal source_gems, mirror_gems
36
- assert_equal 3, updates
41
+ assert_equal source_rz_specs, mirror_rz_specs
42
+ # XXX(raggi): need to figure out how to hide the system gems in 2.0
43
+ assert 10 <= updates
37
44
  end
38
45
  end
39
46
 
metadata CHANGED
@@ -1,137 +1,86 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: rubygems-mirror
3
- version: !ruby/object:Gem::Version
4
- hash: 21
5
- prerelease:
6
- segments:
7
- - 1
8
- - 0
9
- - 1
10
- version: 1.0.1
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.1.0
11
5
  platform: ruby
12
- authors:
6
+ authors:
13
7
  - James Tucker
14
8
  autorequire:
15
9
  bindir: bin
16
10
  cert_chain: []
17
-
18
- date: 2011-10-02 00:00:00 Z
19
- dependencies:
20
- - !ruby/object:Gem::Dependency
11
+ date: 2015-07-28 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
21
14
  name: net-http-persistent
22
- prerelease: false
23
- requirement: &id001 !ruby/object:Gem::Requirement
24
- none: false
25
- requirements:
26
- - - ">="
27
- - !ruby/object:Gem::Version
28
- hash: 1
29
- segments:
30
- - 2
31
- - 1
32
- version: "2.1"
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '2.9'
33
20
  type: :runtime
34
- version_requirements: *id001
35
- - !ruby/object:Gem::Dependency
36
- name: hoe-doofus
37
- prerelease: false
38
- requirement: &id002 !ruby/object:Gem::Requirement
39
- none: false
40
- requirements:
41
- - - ">="
42
- - !ruby/object:Gem::Version
43
- hash: 23
44
- segments:
45
- - 1
46
- - 0
47
- - 0
48
- version: 1.0.0
49
- type: :development
50
- version_requirements: *id002
51
- - !ruby/object:Gem::Dependency
52
- name: hoe-git
53
21
  prerelease: false
54
- requirement: &id003 !ruby/object:Gem::Requirement
55
- none: false
56
- requirements:
57
- - - ">="
58
- - !ruby/object:Gem::Version
59
- hash: 27
60
- segments:
61
- - 1
62
- - 3
63
- - 0
64
- version: 1.3.0
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '2.9'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rdoc
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: '4.0'
65
34
  type: :development
66
- version_requirements: *id003
67
- - !ruby/object:Gem::Dependency
68
- name: hoe-gemcutter
69
35
  prerelease: false
70
- requirement: &id004 !ruby/object:Gem::Requirement
71
- none: false
72
- requirements:
73
- - - ">="
74
- - !ruby/object:Gem::Version
75
- hash: 23
76
- segments:
77
- - 1
78
- - 0
79
- - 0
80
- version: 1.0.0
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: '4.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: minitest
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ~>
46
+ - !ruby/object:Gem::Version
47
+ version: '5.7'
81
48
  type: :development
82
- version_requirements: *id004
83
- - !ruby/object:Gem::Dependency
84
- name: builder
85
49
  prerelease: false
86
- requirement: &id005 !ruby/object:Gem::Requirement
87
- none: false
88
- requirements:
89
- - - ">="
90
- - !ruby/object:Gem::Version
91
- hash: 15
92
- segments:
93
- - 2
94
- - 1
95
- - 2
96
- version: 2.1.2
97
- type: :development
98
- version_requirements: *id005
99
- - !ruby/object:Gem::Dependency
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: '5.7'
55
+ - !ruby/object:Gem::Dependency
100
56
  name: hoe
101
- prerelease: false
102
- requirement: &id006 !ruby/object:Gem::Requirement
103
- none: false
104
- requirements:
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
105
59
  - - ~>
106
- - !ruby/object:Gem::Version
107
- hash: 27
108
- segments:
109
- - 2
110
- - 12
111
- version: "2.12"
60
+ - !ruby/object:Gem::Version
61
+ version: '3.13'
112
62
  type: :development
113
- version_requirements: *id006
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ~>
67
+ - !ruby/object:Gem::Version
68
+ version: '3.13'
114
69
  description: |-
115
70
  This is an update to the old `gem mirror` command. It uses net/http/persistent
116
71
  and threads to grab the mirror set a little faster than the original.
117
72
  Eventually it will replace `gem mirror` completely. Right now the API is not
118
73
  completely stable (it will change several times before release), however, I
119
74
  will maintain stability in master.
120
- email:
121
- - raggi@rubyforge.org
75
+ email:
76
+ - jftucker@gmail.com
122
77
  executables: []
123
-
124
78
  extensions: []
125
-
126
- extra_rdoc_files:
127
- - Manifest.txt
79
+ extra_rdoc_files:
128
80
  - CHANGELOG.rdoc
129
- - pkg/rubygems-mirror-1.0.0/CHANGELOG.rdoc
130
- - pkg/rubygems-mirror-1.0.0/pkg/rubygems-mirror-1.0.0/CHANGELOG.rdoc
131
- - pkg/rubygems-mirror-1.0.0/pkg/rubygems-mirror-1.0.0/README.rdoc
132
- - pkg/rubygems-mirror-1.0.0/README.rdoc
81
+ - Manifest.txt
133
82
  - README.rdoc
134
- files:
83
+ files:
135
84
  - .autotest
136
85
  - CHANGELOG.rdoc
137
86
  - Manifest.txt
@@ -144,46 +93,31 @@ files:
144
93
  - lib/rubygems/mirror/test_setup.rb
145
94
  - lib/rubygems_plugin.rb
146
95
  - test/test_gem_mirror.rb
147
- - pkg/rubygems-mirror-1.0.0/CHANGELOG.rdoc
148
- - pkg/rubygems-mirror-1.0.0/pkg/rubygems-mirror-1.0.0/CHANGELOG.rdoc
149
- - pkg/rubygems-mirror-1.0.0/pkg/rubygems-mirror-1.0.0/README.rdoc
150
- - pkg/rubygems-mirror-1.0.0/README.rdoc
151
96
  - .gemtest
152
- homepage: http://github.com/rubygems/rubygems-mirror
153
- licenses: []
154
-
97
+ homepage: https://github.com/rubygems/rubygems-mirror
98
+ licenses:
99
+ - MIT
155
100
  metadata: {}
156
-
157
101
  post_install_message:
158
- rdoc_options:
102
+ rdoc_options:
159
103
  - --main
160
104
  - README.rdoc
161
- require_paths:
105
+ require_paths:
162
106
  - lib
163
- required_ruby_version: !ruby/object:Gem::Requirement
164
- none: false
165
- requirements:
166
- - - ">="
167
- - !ruby/object:Gem::Version
168
- hash: 3
169
- segments:
170
- - 0
171
- version: "0"
172
- required_rubygems_version: !ruby/object:Gem::Requirement
173
- none: false
174
- requirements:
175
- - - ">="
176
- - !ruby/object:Gem::Version
177
- hash: 3
178
- segments:
179
- - 0
180
- version: "0"
107
+ required_ruby_version: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - '>='
110
+ - !ruby/object:Gem::Version
111
+ version: '0'
112
+ required_rubygems_version: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - '>='
115
+ - !ruby/object:Gem::Version
116
+ version: '0'
181
117
  requirements: []
182
-
183
- rubyforge_project: rubygems
184
- rubygems_version: 1.8.10
118
+ rubyforge_project:
119
+ rubygems_version: 2.0.3
185
120
  signing_key:
186
121
  specification_version: 4
187
122
  summary: This is an update to the old `gem mirror` command
188
- test_files:
189
- - test/test_gem_mirror.rb
123
+ test_files: []
@@ -1,5 +0,0 @@
1
- === 1.0.0 / 2011-10-01
2
-
3
- * 1 major enhancement
4
-
5
- * Birthday!
@@ -1,70 +0,0 @@
1
- = rubygems-mirror
2
-
3
- http://github.com/rubygems/rubygems-mirror
4
-
5
- == DESCRIPTION:
6
-
7
- This is an update to the old `gem mirror` command. It uses net/http/persistent
8
- and threads to grab the mirror set a little faster than the original.
9
- Eventually it will replace `gem mirror` completely. Right now the API is not
10
- completely stable (it will change several times before release), however, I
11
- will maintain stability in master.
12
-
13
- == FEATURES/PROBLEMS:
14
-
15
- * Fast mirroring
16
- * Limited tests - just functional
17
-
18
- == REQUIREMENTS:
19
-
20
- * rubygems
21
- * net/http/persistent
22
-
23
- == USAGE
24
-
25
- * In a file at ~/.gem/.mirrorrc add a config that looks like the following:
26
-
27
- ---
28
- - from: http://rubygems.org
29
- to: /data/rubygems
30
-
31
- * Either install the gem, then run `gem mirror`, or
32
- * Clone then run `rake mirror:update`
33
-
34
- == INSTALL:
35
-
36
- * gem install rubygems-mirror
37
-
38
- == RESOURCES
39
-
40
- * {Website}[http://rubygems.org/]
41
- * {Documentation}[http://rubygems.rubyforge.org/rubygems-mirror/README_rdoc.html]
42
- * {Wiki}[http://wiki.github.com/rubygems/rubygems-mirror/]
43
- * {Source Code}[http://github.com/rubygems/rubygems-mirror/]
44
- * {Issues}[http://github.com/rubygems/rubygems-mirror/issues]
45
- * {Rubyforge}[http://rubyforge.org/projects/rubygems]
46
-
47
- == LICENSE:
48
-
49
- (The MIT License)
50
-
51
- Copyright (c) 2010 James Tucker, The RubyGems Team
52
-
53
- Permission is hereby granted, free of charge, to any person obtaining
54
- a copy of this software and associated documentation files (the
55
- 'Software'), to deal in the Software without restriction, including
56
- without limitation the rights to use, copy, modify, merge, publish,
57
- distribute, sublicense, and/or sell copies of the Software, and to
58
- permit persons to whom the Software is furnished to do so, subject to
59
- the following conditions:
60
-
61
- The above copyright notice and this permission notice shall be
62
- included in all copies or substantial portions of the Software.
63
-
64
- THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
65
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
66
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
67
- IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
68
- CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
69
- TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
70
- SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -1,5 +0,0 @@
1
- === 1.0.0 / 2011-10-01
2
-
3
- * 1 major enhancement
4
-
5
- * Birthday!
@@ -1,70 +0,0 @@
1
- = rubygems-mirror
2
-
3
- http://github.com/rubygems/rubygems-mirror
4
-
5
- == DESCRIPTION:
6
-
7
- This is an update to the old `gem mirror` command. It uses net/http/persistent
8
- and threads to grab the mirror set a little faster than the original.
9
- Eventually it will replace `gem mirror` completely. Right now the API is not
10
- completely stable (it will change several times before release), however, I
11
- will maintain stability in master.
12
-
13
- == FEATURES/PROBLEMS:
14
-
15
- * Fast mirroring
16
- * Limited tests - just functional
17
-
18
- == REQUIREMENTS:
19
-
20
- * rubygems
21
- * net/http/persistent
22
-
23
- == USAGE
24
-
25
- * In a file at ~/.gem/.mirrorrc add a config that looks like the following:
26
-
27
- ---
28
- - from: http://rubygems.org
29
- to: /data/rubygems
30
-
31
- * Either install the gem, then run `gem mirror`, or
32
- * Clone then run `rake mirror:update`
33
-
34
- == INSTALL:
35
-
36
- * gem install rubygems-mirror
37
-
38
- == RESOURCES
39
-
40
- * {Website}[http://rubygems.org/]
41
- * {Documentation}[http://rubygems.rubyforge.org/rubygems-mirror/README_rdoc.html]
42
- * {Wiki}[http://wiki.github.com/rubygems/rubygems-mirror/]
43
- * {Source Code}[http://github.com/rubygems/rubygems-mirror/]
44
- * {Issues}[http://github.com/rubygems/rubygems-mirror/issues]
45
- * {Rubyforge}[http://rubyforge.org/projects/rubygems]
46
-
47
- == LICENSE:
48
-
49
- (The MIT License)
50
-
51
- Copyright (c) 2010 James Tucker, The RubyGems Team
52
-
53
- Permission is hereby granted, free of charge, to any person obtaining
54
- a copy of this software and associated documentation files (the
55
- 'Software'), to deal in the Software without restriction, including
56
- without limitation the rights to use, copy, modify, merge, publish,
57
- distribute, sublicense, and/or sell copies of the Software, and to
58
- permit persons to whom the Software is furnished to do so, subject to
59
- the following conditions:
60
-
61
- The above copyright notice and this permission notice shall be
62
- included in all copies or substantial portions of the Software.
63
-
64
- THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
65
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
66
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
67
- IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
68
- CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
69
- TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
70
- SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.