gem-fast 0.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.md +1 -0
- data/lib/gem-fast.rb +24 -0
- data/lib/gem-fast/command.rb +75 -0
- data/lib/gem-fast/remote_fetcher.rb +141 -0
- data/lib/gem-fast/utils.rb +73 -0
- data/lib/gem-fast/version.rb +3 -0
- data/lib/rubygems_plugin.rb +10 -0
- metadata +85 -0
data/README.md
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
Welcome!
|
data/lib/gem-fast.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rubygems/user_interaction'
|
3
|
+
require "rubygems/remote_fetcher"
|
4
|
+
$:.unshift File.dirname(__FILE__)+"/../lib"
|
5
|
+
|
6
|
+
require 'gem-fast/utils'
|
7
|
+
require 'gem-fast/remote_fetcher'
|
8
|
+
module GemFast
|
9
|
+
RUBYGEMPLUS_CACHE = File.join((File.writable?(Gem.dir) ? Gem.dir : Gem.user_dir), 'cache')
|
10
|
+
RUBYGEMPLUS_USER_AGENT = "rubygem-gemfast"
|
11
|
+
def self.curl?
|
12
|
+
curl_ok = false
|
13
|
+
begin
|
14
|
+
if `curl --version`.strip.size > 0
|
15
|
+
curl_ok = true
|
16
|
+
end
|
17
|
+
rescue Exception => e
|
18
|
+
end
|
19
|
+
curl_ok
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
|
@@ -0,0 +1,75 @@
|
|
1
|
+
require 'gem-fast/ui'
|
2
|
+
module GemFast
|
3
|
+
module Command
|
4
|
+
class Base
|
5
|
+
include GemFast::UI
|
6
|
+
attr_accessor :args
|
7
|
+
|
8
|
+
def initialize(args)
|
9
|
+
@args = args
|
10
|
+
end
|
11
|
+
|
12
|
+
def usage
|
13
|
+
<<-EOTXT
|
14
|
+
=== Command List:
|
15
|
+
sudo gem-fast patch apply, apply patch to rubygems then you will use curl to download gems
|
16
|
+
sudo gem-fast patch revert, revert back to original
|
17
|
+
|
18
|
+
|
19
|
+
EOTXT
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
class InvalidCommand < RuntimeError; end
|
24
|
+
class CommandFailed < RuntimeError; end
|
25
|
+
|
26
|
+
class << self
|
27
|
+
|
28
|
+
include GemFast::UI
|
29
|
+
def run(command, args, retries=0)
|
30
|
+
begin
|
31
|
+
run_internal(command, args.dup)
|
32
|
+
rescue InvalidCommand
|
33
|
+
error "Unknown command. Run 'autoweb help' for usage information."
|
34
|
+
rescue CommandFailed => e
|
35
|
+
error e.message
|
36
|
+
rescue Interrupt => e
|
37
|
+
error "\n[canceled]"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def run_internal(command, args)
|
42
|
+
klass, method = parse(command)
|
43
|
+
runner = klass.new(args)
|
44
|
+
raise InvalidCommand unless runner.respond_to?(method)
|
45
|
+
runner.send(method)
|
46
|
+
end
|
47
|
+
|
48
|
+
def parse(command)
|
49
|
+
parts = command.split(':')
|
50
|
+
case parts.size
|
51
|
+
when 1
|
52
|
+
begin
|
53
|
+
return eval("GemFast::Command::#{command.capitalize}"), :index
|
54
|
+
#rescue NameError, NoMethodError
|
55
|
+
# return Autoweb::Command::Help, command
|
56
|
+
end
|
57
|
+
when 2
|
58
|
+
begin
|
59
|
+
return GemFast::Command.const_get(parts[0].capitalize), parts[1]
|
60
|
+
rescue NameError
|
61
|
+
raise InvalidCommand
|
62
|
+
end
|
63
|
+
else
|
64
|
+
raise InvalidCommand
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
Dir["#{File.dirname(__FILE__)}/../../commands/*.rb"].each { |c|
|
72
|
+
unless (/_helper\.rb$/=~c)
|
73
|
+
require c
|
74
|
+
end
|
75
|
+
}
|
@@ -0,0 +1,141 @@
|
|
1
|
+
module GemFast
|
2
|
+
class RemoteFetcher < Gem::RemoteFetcher
|
3
|
+
|
4
|
+
def download(spec, source_uri, install_dir = Gem.dir)
|
5
|
+
return super unless scheme_supported?(source_uri)
|
6
|
+
CurlUnsafeDownloadStrategy.new(source_uri + "gems/#{spec.file_name}", spec.file_name).fetch
|
7
|
+
end
|
8
|
+
|
9
|
+
def fetch_path(uri, mtime = nil, head = false)
|
10
|
+
return super unless scheme_supported?(uri)
|
11
|
+
|
12
|
+
path = CurlUnsafeDownloadStrategy.new(uri,nil).fetch
|
13
|
+
data = nil
|
14
|
+
File.open(path, "rb"){|f|data = f.read}
|
15
|
+
data = Gem.gunzip data if data and not head and uri.to_s =~ /gz$/
|
16
|
+
data
|
17
|
+
end
|
18
|
+
|
19
|
+
def fetch_size(url)
|
20
|
+
puts "fetch size : #{url}"
|
21
|
+
super
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
def scheme_supported?(uri)
|
26
|
+
uri && uri.to_s.strip =~ %r[^https?://]
|
27
|
+
end
|
28
|
+
|
29
|
+
def ensure_tmp_dir(install_dir)
|
30
|
+
gem_file_name = spec.file_name
|
31
|
+
local_gem_path = File.join RUBYGEMPLUS_CACHE, gem_file_name
|
32
|
+
FileUtils.mkdir_p cache_dir rescue nil unless File.exist? cache_dir
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
|
37
|
+
class AbstractDownloadStrategy
|
38
|
+
include Util
|
39
|
+
|
40
|
+
def initialize url, name=nil
|
41
|
+
@url=url
|
42
|
+
@unique_token="#{name}" unless name.to_s.empty? or name == '__UNKNOWN__'
|
43
|
+
end
|
44
|
+
|
45
|
+
def expand_safe_system_args args
|
46
|
+
args.each_with_index do |arg, ii|
|
47
|
+
if arg.is_a? Hash
|
48
|
+
unless ARGV.verbose?
|
49
|
+
args[ii] = arg[:quiet_flag]
|
50
|
+
else
|
51
|
+
args.delete_at ii
|
52
|
+
end
|
53
|
+
return args
|
54
|
+
end
|
55
|
+
end
|
56
|
+
# 2 as default because commands are eg. svn up, git pull
|
57
|
+
args.insert(2, '-q') unless ARGV.verbose?
|
58
|
+
return args
|
59
|
+
end
|
60
|
+
|
61
|
+
def quiet_safe_system *args
|
62
|
+
safe_system *expand_safe_system_args(args)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
class CurlDownloadStrategy <AbstractDownloadStrategy
|
67
|
+
attr_reader :tarball_path
|
68
|
+
|
69
|
+
def initialize url, name
|
70
|
+
super
|
71
|
+
if @unique_token
|
72
|
+
@tarball_path=File.join(RUBYGEMPLUS_CACHE,@unique_token)
|
73
|
+
else
|
74
|
+
@tarball_path=File.join(RUBYGEMPLUS_CACHE,File.basename(@url.to_s))
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def cached_location
|
79
|
+
@tarball_path
|
80
|
+
end
|
81
|
+
|
82
|
+
# Private method, can be overridden if needed.
|
83
|
+
def _fetch
|
84
|
+
curl @url, '-o', @tarball_path
|
85
|
+
end
|
86
|
+
|
87
|
+
def fetch
|
88
|
+
say "Downloading #{@url}"
|
89
|
+
unless File.exist?(@tarball_path)
|
90
|
+
begin
|
91
|
+
_fetch
|
92
|
+
rescue Exception
|
93
|
+
# ignore_interrupts { @tarball_path.unlink if @tarball_path.exist? }
|
94
|
+
raise
|
95
|
+
end
|
96
|
+
else
|
97
|
+
puts "File already downloaded and cached to #{RUBYGEMPLUS_CACHE}"
|
98
|
+
end
|
99
|
+
return @tarball_path # thus performs checksum verification
|
100
|
+
end
|
101
|
+
|
102
|
+
private
|
103
|
+
def chdir
|
104
|
+
entries=Dir['*']
|
105
|
+
case entries.length
|
106
|
+
when 0 then raise "Empty archive"
|
107
|
+
when 1 then Dir.chdir entries.first rescue nil
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
# Download via an HTTP POST.
|
113
|
+
# Query parameters on the URL are converted into POST parameters
|
114
|
+
class CurlPostDownloadStrategy <CurlDownloadStrategy
|
115
|
+
def _fetch
|
116
|
+
base_url,data = @url.split('?')
|
117
|
+
curl base_url, '-d', data, '-o', @tarball_path
|
118
|
+
end
|
119
|
+
|
120
|
+
|
121
|
+
end
|
122
|
+
|
123
|
+
# Use this strategy to download but not unzip a file.
|
124
|
+
# Useful for installing jars.
|
125
|
+
class NoUnzipCurlDownloadStrategy <CurlDownloadStrategy
|
126
|
+
def stage
|
127
|
+
FileUtils.cp @tarball_path, File.basename(@url)
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
# This Download Strategy is provided for use with sites that
|
132
|
+
# only provide HTTPS and also have a broken cert.
|
133
|
+
# Try not to need this, as we probably won't accept the forulae
|
134
|
+
# into trunk.
|
135
|
+
class CurlUnsafeDownloadStrategy <CurlDownloadStrategy
|
136
|
+
def _fetch
|
137
|
+
curl @url, '--insecure', '-o', @tarball_path
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
module GemFast
|
2
|
+
module Util
|
3
|
+
include Gem::UserInteraction
|
4
|
+
|
5
|
+
def curl *args
|
6
|
+
begin
|
7
|
+
safe_system 'curl', '-f#LA', RUBYGEMPLUS_USER_AGENT, *args unless args.empty?
|
8
|
+
rescue ExecutionError => e
|
9
|
+
if GemFast.curl?
|
10
|
+
raise e
|
11
|
+
else
|
12
|
+
not_install_curl
|
13
|
+
end
|
14
|
+
rescue Errno::ENOENT => e
|
15
|
+
not_install_curl
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
|
20
|
+
def not_install_curl
|
21
|
+
alert_error("use: 'gem uninstall gem-fast' to return back, Curl not installed on your mathine!")
|
22
|
+
exit(1)
|
23
|
+
end
|
24
|
+
|
25
|
+
def safe_system cmd, *args
|
26
|
+
raise ExecutionError.new(cmd, args, $?) unless system(cmd, *args)
|
27
|
+
end
|
28
|
+
|
29
|
+
def system cmd, *args
|
30
|
+
yield if block_given?
|
31
|
+
args.collect!{|arg| arg.to_s}
|
32
|
+
`#{cmd} #{args.join(" ")}`
|
33
|
+
$?.success?
|
34
|
+
end
|
35
|
+
|
36
|
+
|
37
|
+
class ExecutionError <RuntimeError
|
38
|
+
attr :exit_status
|
39
|
+
attr :command
|
40
|
+
|
41
|
+
def initialize cmd, args = [], es = nil
|
42
|
+
@command = cmd
|
43
|
+
super "Failure while executing: #{cmd} #{pretty(args)*' '}"
|
44
|
+
@exit_status = es.exitstatus rescue 1
|
45
|
+
end
|
46
|
+
|
47
|
+
def was_running_configure?
|
48
|
+
@command == './configure'
|
49
|
+
end
|
50
|
+
|
51
|
+
private
|
52
|
+
|
53
|
+
def pretty args
|
54
|
+
args.collect do |arg|
|
55
|
+
if arg.to_s.include? ' '
|
56
|
+
"'#{ arg.gsub "'", "\\'" }'"
|
57
|
+
else
|
58
|
+
arg
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
class BuildError <ExecutionError
|
65
|
+
attr :env
|
66
|
+
|
67
|
+
def initialize cmd, args = [], es = nil
|
68
|
+
super
|
69
|
+
@env = ENV.to_hash
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
require "gem-fast"
|
2
|
+
|
3
|
+
# see http://help.rubygems.org/discussions/problems/378-gempre_install-does-not-working-as-it-named
|
4
|
+
# Gem.pre_install do
|
5
|
+
# if !GemFast.curl?
|
6
|
+
# raise Gem::InstallError, "You should install curl first! If you already install it , please add it to your $PATH\n\t OR you can run 'gem uninstall gem-fast' to return back."
|
7
|
+
# end
|
8
|
+
# end
|
9
|
+
|
10
|
+
Gem::RemoteFetcher.instance_variable_set "@fetcher", GemFast::RemoteFetcher.new(Gem.configuration[:http_proxy])
|
metadata
ADDED
@@ -0,0 +1,85 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: gem-fast
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 19
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
- 6
|
10
|
+
version: 0.0.6
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- dazuiba
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2010-10-28 00:00:00 +08:00
|
19
|
+
default_executable:
|
20
|
+
dependencies: []
|
21
|
+
|
22
|
+
description: "Gem-fast, make your gem install faster!, Replace gem fetcher with curl "
|
23
|
+
email: come2u@gmail.com
|
24
|
+
executables: []
|
25
|
+
|
26
|
+
extensions: []
|
27
|
+
|
28
|
+
extra_rdoc_files: []
|
29
|
+
|
30
|
+
files:
|
31
|
+
- README.md
|
32
|
+
- lib/gem-fast/command.rb
|
33
|
+
- lib/gem-fast/remote_fetcher.rb
|
34
|
+
- lib/gem-fast/utils.rb
|
35
|
+
- lib/gem-fast/version.rb
|
36
|
+
- lib/gem-fast.rb
|
37
|
+
- lib/rubygems_plugin.rb
|
38
|
+
has_rdoc: true
|
39
|
+
homepage: http://github.com/dazuiba/gem-fast.git
|
40
|
+
licenses: []
|
41
|
+
|
42
|
+
post_install_message: |+
|
43
|
+
|
44
|
+
========================================================================
|
45
|
+
|
46
|
+
Thanks for installing Gem-Fast!
|
47
|
+
Gem-Fast will use curl to make your gem install faster!
|
48
|
+
|
49
|
+
Try it now use: gem install rails
|
50
|
+
|
51
|
+
========================================================================
|
52
|
+
|
53
|
+
rdoc_options: []
|
54
|
+
|
55
|
+
require_paths:
|
56
|
+
- lib
|
57
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
58
|
+
none: false
|
59
|
+
requirements:
|
60
|
+
- - ">="
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
hash: 59
|
63
|
+
segments:
|
64
|
+
- 1
|
65
|
+
- 8
|
66
|
+
- 6
|
67
|
+
version: 1.8.6
|
68
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
69
|
+
none: false
|
70
|
+
requirements:
|
71
|
+
- - ">="
|
72
|
+
- !ruby/object:Gem::Version
|
73
|
+
hash: 3
|
74
|
+
segments:
|
75
|
+
- 0
|
76
|
+
version: "0"
|
77
|
+
requirements: []
|
78
|
+
|
79
|
+
rubyforge_project:
|
80
|
+
rubygems_version: 1.3.7
|
81
|
+
signing_key:
|
82
|
+
specification_version: 3
|
83
|
+
summary: Gem for the rest
|
84
|
+
test_files: []
|
85
|
+
|