vendorificator 0.1.1 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.travis.yml +5 -2
- data/Gemfile +0 -1
- data/README.md +9 -0
- data/Rakefile +7 -1
- data/features/chef_cookbook.feature +4 -6
- data/features/deprecated.feature +4 -4
- data/features/git.feature +41 -2
- data/features/needed.feature +8 -7
- data/features/smoke.feature +7 -5
- data/features/status.feature +15 -15
- data/features/step_definitions/aruba_ext.rb +11 -0
- data/features/step_definitions/basic.rb +16 -43
- data/features/step_definitions/git.rb +11 -11
- data/features/step_definitions/vendorificator.rb +4 -6
- data/features/support/aruba_ext.rb +23 -0
- data/features/support/env.rb +13 -20
- data/features/support/minigit.rb +37 -0
- data/features/tarball.feature +7 -7
- data/features/tarball_edit.feature +1 -1
- data/features/vendor.feature +2 -2
- data/lib/vendorificator/cli.rb +36 -61
- data/lib/vendorificator/config.rb +5 -42
- data/lib/vendorificator/environment.rb +111 -0
- data/lib/vendorificator/hooks/chef_cookbook.rb +59 -23
- data/lib/vendorificator/vendor/archive.rb +2 -2
- data/lib/vendorificator/vendor/chef_cookbook.rb +2 -2
- data/lib/vendorificator/vendor/download.rb +44 -0
- data/lib/vendorificator/vendor/git.rb +9 -11
- data/lib/vendorificator/vendor.rb +105 -48
- data/lib/vendorificator/version.rb +1 -1
- data/lib/vendorificator.rb +2 -0
- data/spec/spec_helper.rb +1 -0
- data/spec/vendorificator/vendor_spec.rb +15 -7
- data/vendorificator.gemspec +4 -4
- metadata +24 -21
- data/features/support/world_git.rb +0 -40
- data/features/support/world_runs.rb +0 -93
- data/lib/vendorificator/repo.rb +0 -69
data/lib/vendorificator/cli.rb
CHANGED
@@ -4,25 +4,38 @@ require 'vendorificator'
|
|
4
4
|
|
5
5
|
module Vendorificator
|
6
6
|
class CLI < Thor
|
7
|
-
|
7
|
+
attr_reader :environment
|
8
8
|
|
9
9
|
check_unknown_options! :except => [:git, :diff, :log]
|
10
10
|
stop_on_unknown_option! :git, :diff, :log
|
11
11
|
|
12
12
|
default_task :help
|
13
13
|
|
14
|
-
class_option :file,
|
15
|
-
|
16
|
-
class_option :
|
17
|
-
class_option :
|
14
|
+
class_option :file, :aliases => '-f', :type => :string,
|
15
|
+
:banner => 'PATH'
|
16
|
+
class_option :debug, :aliases => '-d', :type => :boolean, :default => false
|
17
|
+
class_option :quiet, :aliases => '-q', :type => :boolean, :default => false
|
18
|
+
class_option :modules, :aliases => '-m', :type => :string, :default => '',
|
18
19
|
:banner => 'mod1,mod2,...,modN',
|
19
20
|
:desc => 'Run only for specified modules (name or path, comma separated)'
|
21
|
+
class_option :version, :type => :boolean
|
22
|
+
class_option :help, :aliases => '-h', :type => :boolean
|
20
23
|
|
21
|
-
def initialize(
|
24
|
+
def initialize(args=[], options={}, config={})
|
22
25
|
super
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
+
|
27
|
+
if self.options[:version]
|
28
|
+
say "Vendorificator #{Vendorificator::VERSION}"
|
29
|
+
exit
|
30
|
+
end
|
31
|
+
|
32
|
+
if self.options[:help] && config[:current_task].name != 'help'
|
33
|
+
invoke :help, [ config[:current_task].name ]
|
34
|
+
exit
|
35
|
+
end
|
36
|
+
|
37
|
+
@environment = Vendorificator::Environment.new(self.options[:file])
|
38
|
+
environment.shell = shell
|
26
39
|
|
27
40
|
class << shell
|
28
41
|
# Make say_status always say it.
|
@@ -35,9 +48,9 @@ module Vendorificator
|
|
35
48
|
desc :sync, "Download new or updated vendor files"
|
36
49
|
method_option :update, :type => :boolean, :default => false
|
37
50
|
def sync
|
38
|
-
|
39
|
-
|
40
|
-
Vendorificator::
|
51
|
+
ensure_clean!
|
52
|
+
environment.config[:use_upstream_version] = options[:update]
|
53
|
+
Vendorificator::Vendor.each(*modules) do |mod|
|
41
54
|
say_status :module, mod.name
|
42
55
|
begin
|
43
56
|
shell.padding += 1
|
@@ -51,9 +64,9 @@ module Vendorificator
|
|
51
64
|
desc "status", "List known vendor modules and their status"
|
52
65
|
method_option :update, :type => :boolean, :default => false
|
53
66
|
def status
|
54
|
-
say_status 'WARNING', 'Git repository is not clean', :red unless
|
55
|
-
|
56
|
-
Vendorificator::
|
67
|
+
say_status 'WARNING', 'Git repository is not clean', :red unless environment.clean?
|
68
|
+
environment.config[:use_upstream_version] = options[:update]
|
69
|
+
Vendorificator::Vendor.each(*modules) do |mod|
|
57
70
|
status_line = mod.to_s
|
58
71
|
|
59
72
|
updatable = mod.updatable?
|
@@ -74,11 +87,11 @@ module Vendorificator
|
|
74
87
|
method_option :remote, :aliases => ['-r'], :default => nil
|
75
88
|
method_option :dry_run, :aliases => ['-n'], :default => false, :type => :boolean
|
76
89
|
def pull
|
77
|
-
|
78
|
-
remotes = options[:remote] ? options[:remote].split(',') :
|
90
|
+
ensure_clean!
|
91
|
+
remotes = options[:remote] ? options[:remote].split(',') : environment.config[:remotes]
|
79
92
|
remotes.each do |remote|
|
80
93
|
indent 'remote', remote do
|
81
|
-
|
94
|
+
environment.pull(remote, options)
|
82
95
|
end
|
83
96
|
end
|
84
97
|
end
|
@@ -96,9 +109,8 @@ module Vendorificator
|
|
96
109
|
vendor git log @MERGED@..HEAD -- @PATH@ # basic 'vendor log'
|
97
110
|
vendor git diff --stat @MERGED@ -- @PATH@ # 'vendor diff', as diffstat
|
98
111
|
EOF
|
99
|
-
method_option :only_changed, :default => false, :type => :boolean
|
100
112
|
def git(command, *args)
|
101
|
-
Vendorificator::
|
113
|
+
Vendorificator::Vendor.each(*modules) do |mod|
|
102
114
|
unless mod.merged
|
103
115
|
say_status 'unmerged', mod.to_s, :red unless options[:only_changed]
|
104
116
|
next
|
@@ -110,26 +122,19 @@ EOF
|
|
110
122
|
gsub('@PATH@', mod.work_dir)
|
111
123
|
end
|
112
124
|
|
113
|
-
|
114
|
-
|
115
|
-
say_status 'unchanged', mod.to_s, :green unless options[:only_changed]
|
116
|
-
else
|
117
|
-
say_status 'changed', mod.to_s, :yellow
|
118
|
-
end
|
119
|
-
puts output unless options[:quiet] || output.empty?
|
125
|
+
say_status command, mod.to_s
|
126
|
+
output = environment.git.git(command, *actual_args)
|
120
127
|
end
|
121
128
|
end
|
122
129
|
|
123
130
|
desc "diff [OPTIONS] [GIT OPTIONS]",
|
124
131
|
"Show differences between work tree and upstream module(s)"
|
125
|
-
method_option :only_changed, :default => false, :type => :boolean
|
126
132
|
def diff(*args)
|
127
133
|
invoke :git, %w'diff' + args + %w'@MERGED@ -- @PATH@'
|
128
134
|
end
|
129
135
|
|
130
136
|
desc "log [OPTIONS] [GIT OPTIONS]",
|
131
137
|
"Show git log of commits added to upstream module(s)"
|
132
|
-
method_option :only_changed, :default => false, :type => :boolean
|
133
138
|
def log(*args)
|
134
139
|
invoke :git, %w'log' + args + %w'@MERGED@..HEAD -- @PATH@'
|
135
140
|
end
|
@@ -175,14 +180,6 @@ EOF
|
|
175
180
|
options[:modules].split(',').map(&:strip)
|
176
181
|
end
|
177
182
|
|
178
|
-
def conf
|
179
|
-
Vendorificator::Config
|
180
|
-
end
|
181
|
-
|
182
|
-
def repo
|
183
|
-
Vendorificator::Config.repo
|
184
|
-
end
|
185
|
-
|
186
183
|
def fail!(message, exception_message='I give up.')
|
187
184
|
say_status('FATAL', message, :red)
|
188
185
|
raise Thor::Error, 'I give up.'
|
@@ -196,30 +193,8 @@ EOF
|
|
196
193
|
shell.padding -= 1
|
197
194
|
end
|
198
195
|
|
199
|
-
|
200
|
-
|
201
|
-
given = options.file || ENV['VENDORFILE']
|
202
|
-
return Pathname.new(given).expand_path if given && !given.empty?
|
203
|
-
|
204
|
-
Pathname.pwd.ascend do |dir|
|
205
|
-
vf = dir.join('Vendorfile')
|
206
|
-
return vf if vf.exist?
|
207
|
-
|
208
|
-
vf = dir.join('config/vendor.rb')
|
209
|
-
return vf if vf.exist?
|
210
|
-
|
211
|
-
# avoid stepping above the tmp directory when testing
|
212
|
-
if ENV['VENDORIFICATOR_SPEC_RUN'] &&
|
213
|
-
dir.join('vendorificator.gemspec').exist?
|
214
|
-
raise RuntimeError, "Vendorfile not found"
|
215
|
-
end
|
216
|
-
end
|
217
|
-
|
218
|
-
raise RuntimeError, "Vendorfile not found"
|
219
|
-
end
|
220
|
-
|
221
|
-
def ensure_clean_repo!
|
222
|
-
unless repo.clean?
|
196
|
+
def ensure_clean!
|
197
|
+
unless environment.clean?
|
223
198
|
fail!('Repository is not clean.')
|
224
199
|
end
|
225
200
|
end
|
@@ -2,21 +2,22 @@ require 'pathname'
|
|
2
2
|
|
3
3
|
require 'mixlib/config'
|
4
4
|
|
5
|
-
require 'vendorificator/repo'
|
6
|
-
|
7
5
|
module Vendorificator
|
8
6
|
class Config
|
9
7
|
extend Mixlib::Config
|
10
8
|
|
9
|
+
attr_accessor :environment
|
10
|
+
|
11
11
|
configure do |c|
|
12
12
|
c[:basedir] = 'vendor'
|
13
13
|
c[:branch_prefix] = 'vendor'
|
14
|
-
c[:modules] = []
|
15
14
|
c[:remotes] = %w(origin)
|
16
15
|
end
|
17
16
|
|
18
17
|
def self.from_file(filename)
|
19
18
|
pathname = Pathname.new(filename).cleanpath.expand_path
|
19
|
+
|
20
|
+
self[:vendorfile_path] = pathname
|
20
21
|
self[:root_dir] =
|
21
22
|
if ( pathname.basename.to_s == 'vendor.rb' &&
|
22
23
|
pathname.dirname.basename.to_s == 'config' )
|
@@ -25,46 +26,8 @@ module Vendorificator
|
|
25
26
|
else
|
26
27
|
pathname.dirname
|
27
28
|
end
|
28
|
-
self[:vendorfile_path] = pathname
|
29
|
-
super(pathname.to_s)
|
30
|
-
end
|
31
29
|
|
32
|
-
|
33
|
-
@repo ||= begin
|
34
|
-
git_root_path = self[:repo_dir] || _find_git_root
|
35
|
-
raise "Can't find Git repository" unless git_root_path
|
36
|
-
Vendorificator::Repo.new( git_root_path.to_s )
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
def self.each_module(*modules)
|
41
|
-
module_paths = modules.map { |m| File.expand_path(m) }
|
42
|
-
|
43
|
-
# We don't use self[:modules].each here, because mod.run! is
|
44
|
-
# explicitly allowed to append to Config[:modules], and #each
|
45
|
-
# fails to catch up on some Ruby implementations.
|
46
|
-
i = 0
|
47
|
-
while true
|
48
|
-
break if i >= Vendorificator::Config[:modules].length
|
49
|
-
mod = Vendorificator::Config[:modules][i]
|
50
|
-
yield mod if
|
51
|
-
modules.empty? ||
|
52
|
-
modules.include?(mod.name) ||
|
53
|
-
module_paths.include?(mod.work_dir)
|
54
|
-
i += 1
|
55
|
-
|
56
|
-
# Add dependencies
|
57
|
-
work_dirs = Vendorificator::Config[:modules].map(&:work_dir)
|
58
|
-
Vendorificator::Config[:modules] +=
|
59
|
-
mod.dependencies.reject { |dep| work_dirs.include?(dep.work_dir) }
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
def self._find_git_root
|
64
|
-
self[:root_dir].ascend do |dir|
|
65
|
-
return dir if dir.join('.git').exist?
|
66
|
-
end
|
30
|
+
super(pathname.to_s)
|
67
31
|
end
|
68
|
-
private_class_method :_find_git_root
|
69
32
|
end
|
70
33
|
end
|
@@ -0,0 +1,111 @@
|
|
1
|
+
require 'pathname'
|
2
|
+
|
3
|
+
require 'minigit'
|
4
|
+
|
5
|
+
require 'vendorificator/config'
|
6
|
+
|
7
|
+
module Vendorificator
|
8
|
+
class Environment
|
9
|
+
attr_reader :config
|
10
|
+
attr_accessor :shell
|
11
|
+
|
12
|
+
def initialize(vendorfile=nil)
|
13
|
+
@config = Vendorificator::Config
|
14
|
+
config.environment = self
|
15
|
+
config.from_file(self.class.find_vendorfile(vendorfile))
|
16
|
+
Vendorificator::Vendor.compute_dependencies!
|
17
|
+
end
|
18
|
+
|
19
|
+
def say_status(*args)
|
20
|
+
shell.say_status(*args) if shell
|
21
|
+
end
|
22
|
+
|
23
|
+
# Main MiniGit instance
|
24
|
+
def git
|
25
|
+
@git ||= MiniGit::new(config[:vendorfile_path])
|
26
|
+
end
|
27
|
+
|
28
|
+
# Git helpers
|
29
|
+
def remotes
|
30
|
+
@remotes ||= git.capturing.remote.lines.map(&:strip)
|
31
|
+
end
|
32
|
+
|
33
|
+
def current_branch
|
34
|
+
git.capturing.rev_parse({:abbrev_ref => true}, 'HEAD').strip
|
35
|
+
end
|
36
|
+
|
37
|
+
def fast_forwardable?(to, from)
|
38
|
+
git.capturing.merge_base(to, from).strip == from
|
39
|
+
end
|
40
|
+
|
41
|
+
def clean?
|
42
|
+
# copy code from http://stackoverflow.com/a/3879077/16390
|
43
|
+
git.update_index :q => true, :ignore_submodules => true, :refresh => true
|
44
|
+
git.diff_files '--quiet', '--ignore-submodules', '--'
|
45
|
+
git.diff_index '--cached', '--quiet', 'HEAD', '--ignore-submodules', '--'
|
46
|
+
true
|
47
|
+
rescue MiniGit::GitError
|
48
|
+
false
|
49
|
+
end
|
50
|
+
|
51
|
+
def pull(remote, options={})
|
52
|
+
raise RuntimeError, "Unknown remote #{remote}" unless remotes.include?(remote)
|
53
|
+
|
54
|
+
git.fetch(remote)
|
55
|
+
git.fetch({:tags => true}, remote)
|
56
|
+
|
57
|
+
ref_rx = /^refs\/remotes\/#{Regexp.quote(remote)}\//
|
58
|
+
remote_branches = Hash[ git.capturing.show_ref.
|
59
|
+
lines.
|
60
|
+
map(&:split).
|
61
|
+
map { |sha, name| name =~ ref_rx ? [$', sha] : nil }.
|
62
|
+
compact ]
|
63
|
+
|
64
|
+
Vendorificator::Vendor.each do |mod|
|
65
|
+
ours = mod.head
|
66
|
+
theirs = remote_branches[mod.branch_name]
|
67
|
+
if theirs
|
68
|
+
if not ours
|
69
|
+
say_status 'new', mod.branch_name, :yellow
|
70
|
+
git.branch({:track=>true}, mod.branch_name, remote_head.name) unless options[:dry_run]
|
71
|
+
elsif ours == theirs
|
72
|
+
say_status 'unchanged', mod.branch_name
|
73
|
+
elsif fast_forwardable?(theirs, ours)
|
74
|
+
say_status 'updated', mod.name, :yellow
|
75
|
+
mod.in_branch { git.merge({:ff_only => true}, theirs) } unless options[:dry_run]
|
76
|
+
elsif fast_forwardable?(ours, theirs)
|
77
|
+
say_status 'older', mod.branch_name
|
78
|
+
else
|
79
|
+
say_status 'complicated', mod.branch_name, :red
|
80
|
+
end
|
81
|
+
else
|
82
|
+
say_status 'unknown', mod.branch_name
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
end
|
87
|
+
|
88
|
+
def self.find_vendorfile(given=nil)
|
89
|
+
given = [ given, ENV['VENDORFILE'] ].find do |candidate|
|
90
|
+
candidate && !(candidate.respond_to?(:empty?) && candidate.empty?)
|
91
|
+
end
|
92
|
+
return given if given
|
93
|
+
|
94
|
+
Pathname.pwd.ascend do |dir|
|
95
|
+
vf = dir.join('Vendorfile')
|
96
|
+
return vf if vf.exist?
|
97
|
+
|
98
|
+
vf = dir.join('config/vendor.rb')
|
99
|
+
return vf if vf.exist?
|
100
|
+
|
101
|
+
# avoid stepping above the tmp directory when testing
|
102
|
+
if ENV['VENDORIFICATOR_SPEC_RUN'] &&
|
103
|
+
dir.join('vendorificator.gemspec').exist?
|
104
|
+
raise ArgumentError, "Vendorfile not found"
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
raise ArgumentError, "Vendorfile not found"
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
@@ -1,36 +1,72 @@
|
|
1
1
|
module Vendorificator::Hooks
|
2
2
|
module ChefCookbookDependencies
|
3
|
+
class FakeMetadata
|
4
|
+
attr_reader :dependencies
|
5
|
+
def initialize ; @dependencies = [] ; end
|
6
|
+
def from_file(filename) ; self.instance_eval(IO.read(filename), filename, 1) ; end
|
7
|
+
def depends(*args) ; @dependencies << args ; end
|
8
|
+
def method_missing(method, *args) ; end
|
9
|
+
end
|
10
|
+
|
3
11
|
def initialize(*args)
|
4
|
-
|
12
|
+
begin
|
13
|
+
end
|
5
14
|
super
|
6
15
|
end
|
7
16
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
17
|
+
def compute_dependencies!
|
18
|
+
super
|
19
|
+
|
20
|
+
# Dependencies
|
21
|
+
ign = self.args.key?(:ignore_dependencies) ?
|
22
|
+
args[:ignore_dependencies] :
|
23
|
+
environment.config[:chef_cookbook_ignore_dependencies]
|
24
|
+
|
25
|
+
if !ign || ign.respond_to?(:include?)
|
26
|
+
metadata = File.join(self.work_dir, 'metadata.rb')
|
27
|
+
|
28
|
+
unless File.exist?(metadata)
|
29
|
+
shell.say_status 'WARNING', "Metadata of #{name} does not exist at #{metadata}, could not gather dependencies", :red
|
30
|
+
return super
|
31
|
+
end
|
20
32
|
|
21
|
-
|
22
|
-
|
33
|
+
cbmd = Vendorificator::Hooks::ChefCookbookDependencies.metadata_class.new
|
34
|
+
cbmd.from_file(metadata)
|
23
35
|
|
24
|
-
|
25
|
-
|
26
|
-
#
|
27
|
-
super
|
28
|
-
else
|
36
|
+
basedir = Pathname.new(work_dir).dirname
|
37
|
+
|
38
|
+
# All of cookbook's dependencies
|
29
39
|
deps = cbmd.dependencies.map(&:first)
|
30
|
-
|
31
|
-
|
32
|
-
|
40
|
+
|
41
|
+
# Reject ignored dependencies, if there's a list
|
42
|
+
deps.reject! { |dep| ign.include?(dep) } if ign
|
43
|
+
|
44
|
+
# Reject dependencies that already have a module
|
45
|
+
deps.reject! do |dep|
|
46
|
+
dir = basedir.join(dep).to_s
|
47
|
+
Vendorificator::Vendor.instances.any? do |vi|
|
48
|
+
vi.work_dir == dir
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
# Create module for the dependencies
|
53
|
+
deps.each do |dep|
|
54
|
+
Vendorificator::Vendor::ChefCookbook.new(environment, dep)
|
55
|
+
end
|
33
56
|
end
|
34
57
|
end
|
58
|
+
|
59
|
+
private
|
60
|
+
|
61
|
+
def self.metadata_class
|
62
|
+
@metadata_class ||=
|
63
|
+
begin
|
64
|
+
require 'chef/cookbook/metadata' unless defined?(Chef::Cookbook::Metadata)
|
65
|
+
Chef::Cookbook::Metadata
|
66
|
+
rescue LoadError
|
67
|
+
# FIXME: warn
|
68
|
+
FakeMetadata
|
69
|
+
end
|
70
|
+
end
|
35
71
|
end
|
36
72
|
end
|
@@ -11,7 +11,7 @@ class Vendorificator::Vendor::Archive < Vendorificator::Vendor
|
|
11
11
|
arg_reader :url, :strip_root, :type, :checksum, :filename, :basename, :extname, :unpack
|
12
12
|
attr_reader :conjured_checksum
|
13
13
|
|
14
|
-
def initialize(name, args={}, &block)
|
14
|
+
def initialize(environment, name, args={}, &block)
|
15
15
|
no_url_given = !args[:url]
|
16
16
|
|
17
17
|
args[:url] ||= name
|
@@ -48,7 +48,7 @@ class Vendorificator::Vendor::Archive < Vendorificator::Vendor
|
|
48
48
|
|
49
49
|
name = args[:basename] if no_url_given
|
50
50
|
|
51
|
-
super(name, args, &block)
|
51
|
+
super(environment, name, args, &block)
|
52
52
|
end
|
53
53
|
|
54
54
|
def conjure!
|
@@ -13,11 +13,11 @@ class Vendorificator::Vendor::ChefCookbook < Vendorificator::Vendor::Archive
|
|
13
13
|
|
14
14
|
API_PREFIX = 'http://cookbooks.opscode.com/api/v1/cookbooks/'
|
15
15
|
|
16
|
-
def initialize(name, args={}, &block)
|
16
|
+
def initialize(environment, name, args={}, &block)
|
17
17
|
args[:url] ||= true # to avoid having name treated as url
|
18
18
|
args[:filename] ||= "#{name}.tgz"
|
19
19
|
|
20
|
-
super(name, args, &block)
|
20
|
+
super(environment, name, args, &block)
|
21
21
|
end
|
22
22
|
|
23
23
|
def api_data(v=nil)
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'digest'
|
2
|
+
require 'open-uri'
|
3
|
+
require 'tempfile'
|
4
|
+
require 'uri'
|
5
|
+
|
6
|
+
require 'vendorificator/vendor'
|
7
|
+
|
8
|
+
class Vendorificator::Vendor::Download < Vendorificator::Vendor
|
9
|
+
arg_reader :url
|
10
|
+
attr_reader :conjured_checksum
|
11
|
+
|
12
|
+
def initialize(environment, name, args={}, &block)
|
13
|
+
no_url_given = !args[:url]
|
14
|
+
|
15
|
+
args[:url] ||= name
|
16
|
+
name = URI::parse(args[:url]).path.split('/').last if no_url_given
|
17
|
+
|
18
|
+
super(environment, name, args, &block)
|
19
|
+
end
|
20
|
+
|
21
|
+
def path
|
22
|
+
args[:path] || category
|
23
|
+
end
|
24
|
+
|
25
|
+
def conjure!
|
26
|
+
shell.say_status :download, url
|
27
|
+
File.open name, 'w' do |outf|
|
28
|
+
outf.write( open(url).read )
|
29
|
+
end
|
30
|
+
@conjured_checksum = Digest::SHA256.file(name).hexdigest
|
31
|
+
end
|
32
|
+
|
33
|
+
def upstream_version
|
34
|
+
conjured_checksum || Digest::SHA256.hexdigest( open(url).read )
|
35
|
+
end
|
36
|
+
|
37
|
+
def conjure_commit_message
|
38
|
+
rv = "Conjured #{name} from #{url}\nChecksum: #{conjured_checksum}"
|
39
|
+
rv << "Version: #{args[:version]}" if args[:version]
|
40
|
+
rv
|
41
|
+
end
|
42
|
+
|
43
|
+
install!
|
44
|
+
end
|
@@ -1,34 +1,32 @@
|
|
1
1
|
require 'fileutils'
|
2
|
-
|
3
|
-
require 'grit'
|
4
|
-
|
5
2
|
require 'vendorificator/vendor'
|
6
3
|
|
7
4
|
class Vendorificator::Vendor::Git < Vendorificator::Vendor
|
8
5
|
arg_reader :repository, :revision, :branch
|
9
|
-
attr_reader :
|
6
|
+
attr_reader :git, :conjured_revision
|
10
7
|
|
11
|
-
def initialize(name, args={}, &block)
|
8
|
+
def initialize(environment, name, args={}, &block)
|
12
9
|
unless args.include?(:repository)
|
13
10
|
args[:repository] = name
|
14
11
|
name = name.split('/').last.sub(/\.git$/, '')
|
15
12
|
end
|
16
|
-
super(name, args, &block)
|
13
|
+
super(environment, name, args, &block)
|
17
14
|
end
|
18
15
|
|
19
16
|
def conjure!
|
20
17
|
shell.say_status :clone, repository
|
21
|
-
|
22
|
-
@
|
18
|
+
MiniGit.git :clone, repository, '.'
|
19
|
+
@git = MiniGit.new('.')
|
23
20
|
|
24
21
|
if revision
|
25
|
-
|
22
|
+
git.checkout({:b => 'vendorified'}, revision)
|
26
23
|
elsif branch
|
27
|
-
|
24
|
+
git.checkout({:b => 'vendorified'}, "origin/#{branch}")
|
28
25
|
end
|
29
26
|
|
30
27
|
super
|
31
|
-
|
28
|
+
|
29
|
+
@conjured_revision = git.capturing.rev_parse('HEAD').strip
|
32
30
|
FileUtils::rm_rf '.git'
|
33
31
|
end
|
34
32
|
|