gem-checkout 0.0.5
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.
- checksums.yaml +7 -0
- data/LICENSE.txt +21 -0
- data/README.md +65 -0
- data/lib/gem-checkout/logger.rb +15 -0
- data/lib/gem-checkout/process.rb +26 -0
- data/lib/gem-checkout/repository.rb +8 -0
- data/lib/gem-checkout/repository/git-hub.rb +55 -0
- data/lib/gem-checkout/repository/git.rb +58 -0
- data/lib/gem-checkout/source.rb +123 -0
- data/lib/gem-checkout/spec.rb +238 -0
- data/lib/rubygems/commands/checkout_command.rb +49 -0
- data/lib/rubygems_plugin.rb +2 -0
- metadata +83 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: ee28067ee5184c515081a3cfad38b70eda8c9bb7
|
4
|
+
data.tar.gz: e3a3abe9fa00964bfa733ead7414a266baa961ac
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 8a55d5ba004b3989f3020f892bf5112a1016a9d867a41ce16bc969c8e256511c674559cafa7e95d9ff3120ecbf34763c10628d5d542fafc93091a427f569ca38
|
7
|
+
data.tar.gz: 2ab5e1fb93f34b50f3e44899bc292765737960c99e3cc2c6060b5241fa30007d9a435376be850a2e8d5f95eb9de2ded837fc05ef02f7c51b604cb71788fb0c44
|
data/LICENSE.txt
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2015 Cezary Baginski
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
13
|
+
all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
+
THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,65 @@
|
|
1
|
+
# Gem::Checkout
|
2
|
+
|
3
|
+
RubyGems addon command ('checkout') which, given a gem, will checkout the matching sources at the same version.
|
4
|
+
|
5
|
+
Why? So you no longer have to work out where the source code for a given gem is.
|
6
|
+
|
7
|
+
(Which allows you to automate a LOT of tasks given just a gem name!).
|
8
|
+
|
9
|
+
For example:
|
10
|
+
|
11
|
+
```bash
|
12
|
+
$ gem checkout nenv -v 0.2.0
|
13
|
+
```
|
14
|
+
|
15
|
+
will checkout the GitHub source code (into the current dir) for the `nenv` gem at `0.2.0` (commit: beb9981)
|
16
|
+
|
17
|
+
|
18
|
+
## Installation
|
19
|
+
|
20
|
+
Add this line to your application's Gemfile:
|
21
|
+
|
22
|
+
```sh
|
23
|
+
gem install gem-checkout
|
24
|
+
```
|
25
|
+
|
26
|
+
## Usage
|
27
|
+
|
28
|
+
Proof of concept right now, so open issues and/or PRs for improvements.
|
29
|
+
|
30
|
+
Options:
|
31
|
+
|
32
|
+
```
|
33
|
+
-d LEVEL
|
34
|
+
```
|
35
|
+
sets the debug level, where 0=debug, 1=warn, and so on...
|
36
|
+
|
37
|
+
```
|
38
|
+
-v, --version VERSION
|
39
|
+
```
|
40
|
+
|
41
|
+
The version of the gem to you want to hack on - the repo and revision will be discovered.
|
42
|
+
|
43
|
+
(If you don't provide this option, the latest version will be used).
|
44
|
+
|
45
|
+
## FAQ
|
46
|
+
|
47
|
+
None yet, so open an issue...
|
48
|
+
|
49
|
+
|
50
|
+
## Development
|
51
|
+
|
52
|
+
```
|
53
|
+
bundle install
|
54
|
+
bundle exec guard
|
55
|
+
```
|
56
|
+
|
57
|
+
To install this gem onto your local machine, run `bundle exec rake install`.
|
58
|
+
|
59
|
+
## Contributing
|
60
|
+
|
61
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/e2/gem-checkout
|
62
|
+
|
63
|
+
## License
|
64
|
+
|
65
|
+
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Gem
|
2
|
+
module Checkout
|
3
|
+
class Process
|
4
|
+
class Error < RuntimeError
|
5
|
+
class CommandFailed < Error
|
6
|
+
attr_reader :exit_code
|
7
|
+
|
8
|
+
def initialize(exit_code)
|
9
|
+
@exit_code = exit_code
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.run(*args)
|
15
|
+
pid = Kernel.spawn(*args)
|
16
|
+
result = ::Process.wait2(pid)
|
17
|
+
exit_code = result.last.exitstatus
|
18
|
+
fail(Error::CommandFailed, exit_code) unless exit_code.zero?
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.capture(*args)
|
22
|
+
IO.popen(args).read
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require 'gem-checkout/repository/git'
|
2
|
+
|
3
|
+
|
4
|
+
module Gem
|
5
|
+
module Checkout
|
6
|
+
module Repository
|
7
|
+
class GitHub
|
8
|
+
class Error < Repository::Error
|
9
|
+
class BadURI < Error
|
10
|
+
class NotGitHub < BadURI
|
11
|
+
end
|
12
|
+
|
13
|
+
class NoProjectName < BadURI
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def initialize(vague_uri)
|
19
|
+
uri = vague_uri.dup
|
20
|
+
fail Error::BadURI::NotGitHub unless uri.host == 'github.com'
|
21
|
+
|
22
|
+
|
23
|
+
uri.scheme = 'https'
|
24
|
+
uri.port = nil
|
25
|
+
uri.userinfo = nil
|
26
|
+
uri.query = nil
|
27
|
+
uri.fragment = nil
|
28
|
+
uri = URI.parse(uri.to_s)
|
29
|
+
|
30
|
+
m = /(?<org>[[:alnum:]_.-]+)\/(?<project>[[:alnum:]_.-]+)/.match(uri.path)
|
31
|
+
|
32
|
+
fail Error::BadURI::NoProjectName unless m
|
33
|
+
org = m[:org]
|
34
|
+
project = m[:project]
|
35
|
+
uri.path = "/#{org}/#{project}.git"
|
36
|
+
|
37
|
+
@git = Git.new(uri)
|
38
|
+
end
|
39
|
+
|
40
|
+
def clone(*args)
|
41
|
+
@git.clone(*args)
|
42
|
+
end
|
43
|
+
|
44
|
+
def checkout(*args)
|
45
|
+
@git.checkout(*args)
|
46
|
+
end
|
47
|
+
|
48
|
+
def get_tag_ref(*args)
|
49
|
+
@git.get_tag_ref(*args)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require 'gem-checkout/logger'
|
2
|
+
require 'gem-checkout/process'
|
3
|
+
require 'gem-checkout/repository'
|
4
|
+
|
5
|
+
module Gem
|
6
|
+
module Checkout
|
7
|
+
module Repository
|
8
|
+
class Git
|
9
|
+
class Error < Repository::Error
|
10
|
+
class SingleTagNotFound < Error
|
11
|
+
end
|
12
|
+
|
13
|
+
class CloneFailed < Error
|
14
|
+
end
|
15
|
+
|
16
|
+
class CheckoutFailed < Error
|
17
|
+
end
|
18
|
+
|
19
|
+
class FailedToFetchTags < Error
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
attr_reader :uri
|
24
|
+
def initialize(uri)
|
25
|
+
@uri = uri
|
26
|
+
end
|
27
|
+
|
28
|
+
def clone(options)
|
29
|
+
dir = options[:directory]
|
30
|
+
Gem::Checkout.logger.debug "Cloning: #{uri.to_s}"
|
31
|
+
Process.run('git', 'clone', uri.to_s, dir)
|
32
|
+
rescue Process::Error => ex
|
33
|
+
fail Error::CloneFailed, "Failed to clone #{uri.to_s} (#{ex.message})"
|
34
|
+
end
|
35
|
+
|
36
|
+
def checkout(ref)
|
37
|
+
Process.run('git', 'checkout', ref)
|
38
|
+
rescue Process::Error => ex
|
39
|
+
fail Error::CheckoutFailed, "Failed to checkout #{ref} (#{ex})"
|
40
|
+
end
|
41
|
+
|
42
|
+
def get_tag_ref(tag)
|
43
|
+
Gem::Checkout.logger.debug "Looking up tag: #{tag.inspect}"
|
44
|
+
Gem::Checkout.logger.debug "Getting tags from : #{uri.to_s}"
|
45
|
+
output = Process.capture('git', 'ls-remote', '--tags', uri.to_s)
|
46
|
+
tag_info = output.split("\n")
|
47
|
+
matching = tag_info.select { |details| details =~ /refs\/tags\/#{tag}$/}
|
48
|
+
unless matching.size == 1
|
49
|
+
fail Error::SingleTagNotFound, "Expected to match 1 tag #{tag}, matched: #{matching.inspect}"
|
50
|
+
end
|
51
|
+
matching.first.split("\t").first
|
52
|
+
rescue Process::Error => ex
|
53
|
+
fail Error::FailedToFetchTags, ex.message
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,123 @@
|
|
1
|
+
require 'ostruct'
|
2
|
+
require 'uri'
|
3
|
+
require 'logger'
|
4
|
+
|
5
|
+
require 'gem-checkout/repository/git-hub'
|
6
|
+
require 'gem-checkout/spec'
|
7
|
+
|
8
|
+
module Gem
|
9
|
+
module Checkout
|
10
|
+
class DataFinder
|
11
|
+
class Error < RuntimeError
|
12
|
+
class NoMatch < Error
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
class << self
|
17
|
+
def detect(klass, object, priorities)
|
18
|
+
found = nil
|
19
|
+
priorities.values.each do |fields|
|
20
|
+
found = traverse_find(klass, object, fields)
|
21
|
+
break if found
|
22
|
+
end
|
23
|
+
found
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def traverse_find(klass, object, fields)
|
29
|
+
loop do
|
30
|
+
fields.each do |field|
|
31
|
+
url = object.public_send(field)
|
32
|
+
begin
|
33
|
+
return klass.new(url)
|
34
|
+
rescue Error::NoMatch
|
35
|
+
next
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
object = object.alternative
|
40
|
+
return nil unless object
|
41
|
+
next
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
class RepositoryInfo < DataFinder
|
48
|
+
PRIORITIES = {
|
49
|
+
recommended: %i(source_code_uri),
|
50
|
+
sufficient: %i(source_code_url repository_uri repository_url),
|
51
|
+
user_pages: %i(project_uri project_url homepage),
|
52
|
+
last_resort: %i(bug_tracker_uri bug_tracker_url)
|
53
|
+
}
|
54
|
+
|
55
|
+
def self.detect(object)
|
56
|
+
DataFinder.detect(self, object, PRIORITIES)
|
57
|
+
end
|
58
|
+
|
59
|
+
attr_reader :repository
|
60
|
+
|
61
|
+
def initialize(url)
|
62
|
+
fail Error::NoMatch if !url || url.empty?
|
63
|
+
Gem::Checkout.logger.debug "Found non-empty url: #{url}"
|
64
|
+
uri = URI.parse(url)
|
65
|
+
@repository = Repository::GitHub.new(uri)
|
66
|
+
Gem::Checkout.logger.debug "Detected GitHub repository url: #{uri}"
|
67
|
+
rescue Gem::Checkout::Repository::GitHub::Error::BadURI
|
68
|
+
fail Error::NoMatch
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
class RepositoryHash < DataFinder
|
73
|
+
PRIORITIES = {
|
74
|
+
recommended: %i(source_reference),
|
75
|
+
sufficient: %i(commit revision),
|
76
|
+
}
|
77
|
+
|
78
|
+
def self.detect(object)
|
79
|
+
DataFinder.detect(self, object, PRIORITIES)
|
80
|
+
end
|
81
|
+
|
82
|
+
attr_reader :reference
|
83
|
+
|
84
|
+
def initialize(reference)
|
85
|
+
fail Error::NoMatch unless (reference && !reference.empty?)
|
86
|
+
@reference = reference
|
87
|
+
Gem::Checkout.logger.debug "Found gem's commit info: #{reference}"
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
class Source
|
92
|
+
attr_reader :source_reference
|
93
|
+
attr_reader :repository
|
94
|
+
|
95
|
+
class Error < RuntimeError
|
96
|
+
class NoValidRepositoryFound
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
def initialize(name, version=nil)
|
101
|
+
Gem::Checkout.logger.debug "Gathering infor about #{name} (#{version || 'latest'})"
|
102
|
+
object = Spec.info(name, version)
|
103
|
+
|
104
|
+
@name = name
|
105
|
+
|
106
|
+
repository = RepositoryInfo.detect(object)
|
107
|
+
fail Error::NoValidRepositoryFound unless repository
|
108
|
+
@repository = repository.repository
|
109
|
+
|
110
|
+
reference = RepositoryHash.detect(object)
|
111
|
+
|
112
|
+
@source_reference =
|
113
|
+
if reference
|
114
|
+
reference.reference
|
115
|
+
else
|
116
|
+
Gem::Checkout.logger.warn "No metadata key with commit! Matching tag to version, which is insecure if you don't trust the repository owners!"
|
117
|
+
@repository.get_tag_ref("v#{object.version}")
|
118
|
+
end
|
119
|
+
# TODO: check integrity of gem vs source
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
@@ -0,0 +1,238 @@
|
|
1
|
+
require 'ostruct'
|
2
|
+
require 'gems'
|
3
|
+
|
4
|
+
require 'gem-checkout/logger'
|
5
|
+
|
6
|
+
module Gem
|
7
|
+
module Checkout
|
8
|
+
class Spec
|
9
|
+
class Error < RuntimeError
|
10
|
+
class NoSuchGem < Error
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
module CommonMetadata
|
15
|
+
attr_reader :alternative
|
16
|
+
def initialize(data, alternative=nil)
|
17
|
+
@alternative = alternative
|
18
|
+
@data = OpenStruct.new(data)
|
19
|
+
end
|
20
|
+
|
21
|
+
def homepage
|
22
|
+
read(:homepage_uri)
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def data
|
28
|
+
@data
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
class Local < Spec
|
33
|
+
class Metadata
|
34
|
+
include CommonMetadata
|
35
|
+
|
36
|
+
%i(
|
37
|
+
source_code_uri
|
38
|
+
source_code_url
|
39
|
+
repository_uri
|
40
|
+
repository_url
|
41
|
+
project_uri
|
42
|
+
project_url
|
43
|
+
source_reference
|
44
|
+
commit
|
45
|
+
revision
|
46
|
+
bug_tracker_uri
|
47
|
+
bug_tracker_url
|
48
|
+
).each do |name|
|
49
|
+
define_method(name) do
|
50
|
+
read(name)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
|
55
|
+
private
|
56
|
+
|
57
|
+
def read(key)
|
58
|
+
Gem::Checkout.logger.debug "Checking local metadata (#{key})"
|
59
|
+
data.public_send(key) if data.respond_to?(key)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def initialize(name, version, remote)
|
64
|
+
@data = find_by_name(name, version)
|
65
|
+
@name = name
|
66
|
+
@version = version
|
67
|
+
@remote = remote
|
68
|
+
end
|
69
|
+
|
70
|
+
# TODO: fake fields - just as proof of concept
|
71
|
+
|
72
|
+
%i(
|
73
|
+
source_code_uri
|
74
|
+
source_code_url
|
75
|
+
repository_uri
|
76
|
+
repository_url
|
77
|
+
project_uri
|
78
|
+
project_url
|
79
|
+
source_reference
|
80
|
+
commit
|
81
|
+
revision
|
82
|
+
).each do |name|
|
83
|
+
define_method(name) do
|
84
|
+
read(name)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
def homepage
|
89
|
+
read(:homepage)
|
90
|
+
end
|
91
|
+
|
92
|
+
def version
|
93
|
+
read(:version)
|
94
|
+
end
|
95
|
+
|
96
|
+
def alternative
|
97
|
+
Metadata.new(data.metadata, @remote)
|
98
|
+
end
|
99
|
+
|
100
|
+
private
|
101
|
+
|
102
|
+
def data
|
103
|
+
@data
|
104
|
+
end
|
105
|
+
|
106
|
+
def find_by_name(*args)
|
107
|
+
spec = Gem::Specification
|
108
|
+
return spec.find_by_name(*args) if spec.respond_to?(:find_by_name)
|
109
|
+
Gem.source_index.find_name(*args).last or raise Gem::LoadError
|
110
|
+
end
|
111
|
+
|
112
|
+
def read(key)
|
113
|
+
Gem::Checkout.logger.debug "Checking local info (#{key})"
|
114
|
+
data.public_send(key) if data.respond_to?(key)
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
class Remote < Spec
|
119
|
+
class Metadata
|
120
|
+
include CommonMetadata
|
121
|
+
|
122
|
+
%i(
|
123
|
+
source_code_uri
|
124
|
+
source_code_url
|
125
|
+
repository_uri
|
126
|
+
repository_url
|
127
|
+
project_uri
|
128
|
+
project_url
|
129
|
+
source_reference
|
130
|
+
commit
|
131
|
+
revision
|
132
|
+
bug_tracker_uri
|
133
|
+
bug_tracker_url
|
134
|
+
).each do |name|
|
135
|
+
define_method(name) do
|
136
|
+
data.public_send(name) if data.respond_to?(name)
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
private
|
141
|
+
|
142
|
+
def read(key)
|
143
|
+
Gem::Checkout.logger.debug "Checking remote metadata (#{key})"
|
144
|
+
data.public_send(key) if data.respond_to?(key)
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
def initialize(name, version)
|
149
|
+
@data = nil
|
150
|
+
@name = name
|
151
|
+
@version = version
|
152
|
+
|
153
|
+
# @homepage = nil_when_empty(object.homepage)
|
154
|
+
# @homepage = nil_when_empty(object.homepage_uri)
|
155
|
+
end
|
156
|
+
|
157
|
+
%i(
|
158
|
+
source_code_uri
|
159
|
+
source_code_url
|
160
|
+
repository_uri
|
161
|
+
repository_url
|
162
|
+
project_uri
|
163
|
+
project_url
|
164
|
+
source_reference
|
165
|
+
commit
|
166
|
+
revision
|
167
|
+
bug_tracker_uri
|
168
|
+
bug_tracker_url
|
169
|
+
).each do |name|
|
170
|
+
define_method(name) do
|
171
|
+
read(name)
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
def alternative
|
176
|
+
Metadata.new(data.metadata, nil)
|
177
|
+
end
|
178
|
+
|
179
|
+
def version
|
180
|
+
data.number
|
181
|
+
end
|
182
|
+
|
183
|
+
def homepage
|
184
|
+
base.homepage_uri
|
185
|
+
end
|
186
|
+
|
187
|
+
private
|
188
|
+
|
189
|
+
def base
|
190
|
+
@base ||=
|
191
|
+
begin
|
192
|
+
name = @name
|
193
|
+
Gem::Checkout.logger.debug "Looking up latest gem info ..."
|
194
|
+
result = Gems.info(name)
|
195
|
+
return OpenStruct.new(result) if result.is_a?(Hash)
|
196
|
+
fail Error::NoSuchGem, result
|
197
|
+
end
|
198
|
+
end
|
199
|
+
|
200
|
+
def data
|
201
|
+
@data ||= find_on_rubygems
|
202
|
+
end
|
203
|
+
|
204
|
+
def find_on_rubygems
|
205
|
+
name = @name
|
206
|
+
version = @version
|
207
|
+
return base if version.nil?
|
208
|
+
|
209
|
+
Gem::Checkout.logger.debug "Looking all gem versions ..."
|
210
|
+
versions = Gems.versions(name)
|
211
|
+
version = versions.detect do |info|
|
212
|
+
info['number'] == version
|
213
|
+
end
|
214
|
+
|
215
|
+
fail Error::NoSuchGem, "Could not find #{name} on rubygems.org" unless version
|
216
|
+
Gem::Checkout.logger.debug "Found info matching gem version #{@version}"
|
217
|
+
OpenStruct.new(version)
|
218
|
+
end
|
219
|
+
|
220
|
+
private
|
221
|
+
|
222
|
+
def read(key)
|
223
|
+
Gem::Checkout.logger.debug "Checking remote info (#{key})"
|
224
|
+
data.public_send(key) if data.respond_to?(key)
|
225
|
+
end
|
226
|
+
end
|
227
|
+
|
228
|
+
def self.info(name, version=nil)
|
229
|
+
remote = Spec::Remote.new(name, version)
|
230
|
+
Gem::Checkout.logger.debug "Checking for info locally ..."
|
231
|
+
Spec::Local.new(name, version, remote)
|
232
|
+
rescue Gem::LoadError
|
233
|
+
Gem::Checkout.logger.debug "Checking for info remotely ..."
|
234
|
+
remote
|
235
|
+
end
|
236
|
+
end
|
237
|
+
end
|
238
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'logger'
|
2
|
+
|
3
|
+
require 'gem-checkout/source'
|
4
|
+
|
5
|
+
class Gem::Commands::CheckoutCommand < Gem::Command
|
6
|
+
def initialize
|
7
|
+
super 'checkout', description
|
8
|
+
add_option('-v', '--version VERSION', 'version to checkout') do |version, options|
|
9
|
+
options[:version] = version
|
10
|
+
end
|
11
|
+
|
12
|
+
add_option('-d', '--debug LEVEL', 'set debug mode (0=debug)') do |level, options|
|
13
|
+
options[:debug_level] = Integer(level)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def arguments # :nodoc:
|
18
|
+
"checkout checkout the original repository at the same version"
|
19
|
+
end
|
20
|
+
|
21
|
+
def usage # :nodoc:
|
22
|
+
"#{program_name}"
|
23
|
+
end
|
24
|
+
|
25
|
+
def defaults_str # :nodoc:
|
26
|
+
""
|
27
|
+
end
|
28
|
+
|
29
|
+
def description # :nodoc:
|
30
|
+
"Checkout a gem's repository or sources at the same version"
|
31
|
+
end
|
32
|
+
|
33
|
+
def execute
|
34
|
+
logger = Logger.new(STDERR)
|
35
|
+
logger.level = options[:debug_level] || Logger::WARN
|
36
|
+
Gem::Checkout.logger = logger
|
37
|
+
|
38
|
+
name = get_one_gem_name
|
39
|
+
source = Gem::Checkout::Source.new(name, options[:version])
|
40
|
+
repository = source.repository
|
41
|
+
repository.clone(directory: name)
|
42
|
+
Dir.chdir(name) do
|
43
|
+
repository.checkout(source.source_reference)
|
44
|
+
end
|
45
|
+
rescue Gem::Checkout::Repository::Error => ex
|
46
|
+
alert_error ex.message
|
47
|
+
terminate_interaction 1
|
48
|
+
end
|
49
|
+
end
|
metadata
ADDED
@@ -0,0 +1,83 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: gem-checkout
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.5
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Cezary Baginski
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-10-21 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: gems
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0.8'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0.8'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: bundler
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.10'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.10'
|
41
|
+
description: Uses gem's metadata or version to work out which commit to checkout
|
42
|
+
email:
|
43
|
+
- cezary@chronomantic.net
|
44
|
+
executables: []
|
45
|
+
extensions: []
|
46
|
+
extra_rdoc_files: []
|
47
|
+
files:
|
48
|
+
- LICENSE.txt
|
49
|
+
- README.md
|
50
|
+
- lib/gem-checkout/logger.rb
|
51
|
+
- lib/gem-checkout/process.rb
|
52
|
+
- lib/gem-checkout/repository.rb
|
53
|
+
- lib/gem-checkout/repository/git-hub.rb
|
54
|
+
- lib/gem-checkout/repository/git.rb
|
55
|
+
- lib/gem-checkout/source.rb
|
56
|
+
- lib/gem-checkout/spec.rb
|
57
|
+
- lib/rubygems/commands/checkout_command.rb
|
58
|
+
- lib/rubygems_plugin.rb
|
59
|
+
homepage: https://github.com/e2/gem-checkout
|
60
|
+
licenses:
|
61
|
+
- MIT
|
62
|
+
metadata: {}
|
63
|
+
post_install_message:
|
64
|
+
rdoc_options: []
|
65
|
+
require_paths:
|
66
|
+
- lib
|
67
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
68
|
+
requirements:
|
69
|
+
- - ">="
|
70
|
+
- !ruby/object:Gem::Version
|
71
|
+
version: '0'
|
72
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
73
|
+
requirements:
|
74
|
+
- - ">="
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '0'
|
77
|
+
requirements: []
|
78
|
+
rubyforge_project:
|
79
|
+
rubygems_version: 2.4.5
|
80
|
+
signing_key:
|
81
|
+
specification_version: 4
|
82
|
+
summary: Gem command download and checkout repository at same version as gem
|
83
|
+
test_files: []
|