vendorificator 0.3.0 → 0.4.0

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.
Files changed (58) hide show
  1. data/.travis.yml +2 -4
  2. data/CHANGELOG.md +12 -0
  3. data/Gemfile +5 -1
  4. data/README.md +33 -0
  5. data/Rakefile +7 -0
  6. data/cucumber.yml +1 -1
  7. data/features/download.feature +14 -0
  8. data/features/environment.feature +27 -2
  9. data/features/fixtures/rubygems/.gitignore +1 -0
  10. data/features/fixtures/rubygems/Marshal.4.8 +0 -0
  11. data/features/fixtures/rubygems/Marshal.4.8.Z +2 -0
  12. data/features/fixtures/rubygems/Rakefile +46 -0
  13. data/features/fixtures/rubygems/gems/first-0.gem +0 -0
  14. data/features/fixtures/rubygems/gems/hello-0.0.1.gem +0 -0
  15. data/features/fixtures/rubygems/gems/second-0.gem +0 -0
  16. data/features/fixtures/rubygems/latest_specs.4.8 +0 -0
  17. data/features/fixtures/rubygems/latest_specs.4.8.gz +0 -0
  18. data/features/fixtures/rubygems/prerelease_specs.4.8 +0 -0
  19. data/features/fixtures/rubygems/prerelease_specs.4.8.gz +0 -0
  20. data/features/fixtures/rubygems/quick/Marshal.4.8/first-0.gemspec.rz +0 -0
  21. data/features/fixtures/rubygems/quick/Marshal.4.8/hello-0.0.1.gemspec.rz +3 -0
  22. data/features/fixtures/rubygems/quick/Marshal.4.8/second-0.gemspec.rz +0 -0
  23. data/features/fixtures/rubygems/specs.4.8 +0 -0
  24. data/features/fixtures/rubygems/specs.4.8.gz +0 -0
  25. data/features/fixtures/rubygems/src/README.md +4 -0
  26. data/features/fixtures/rubygems/src/first.gemspec +16 -0
  27. data/features/fixtures/rubygems/src/second.gemspec +14 -0
  28. data/features/fixtures/vcr/vendorificator.yml +551 -56
  29. data/features/git.feature +5 -2
  30. data/features/step_definitions/aruba_ext.rb +1 -0
  31. data/features/step_definitions/basic.rb +7 -0
  32. data/features/step_definitions/git.rb +14 -1
  33. data/features/step_definitions/vendorificator.rb +6 -2
  34. data/features/support/aruba_ext.rb +8 -0
  35. data/features/support/env.rb +3 -0
  36. data/features/support/minigit.rb +6 -0
  37. data/features/tarball.feature +3 -0
  38. data/features/tool.feature +67 -0
  39. data/features/tool_shortcuts.feature +42 -0
  40. data/features/vendor.feature +4 -1
  41. data/lib/vendorificator/cli.rb +7 -2
  42. data/lib/vendorificator/commit.rb +56 -0
  43. data/lib/vendorificator/config.rb +6 -0
  44. data/lib/vendorificator/environment.rb +66 -9
  45. data/lib/vendorificator/vendor/archive.rb +62 -40
  46. data/lib/vendorificator/vendor/download.rb +20 -10
  47. data/lib/vendorificator/vendor/git.rb +20 -13
  48. data/lib/vendorificator/vendor/tool.rb +60 -0
  49. data/lib/vendorificator/vendor.rb +113 -74
  50. data/lib/vendorificator/version.rb +1 -1
  51. data/lib/vendorificator.rb +2 -0
  52. data/spec/spec_helper.rb +18 -8
  53. data/spec/vendorificator/config_spec.rb +7 -0
  54. data/spec/vendorificator/environment_spec.rb +21 -0
  55. data/spec/vendorificator/vendor/git_spec.rb +23 -0
  56. data/spec/vendorificator/vendor_spec.rb +68 -0
  57. data/vendorificator.gemspec +9 -3
  58. metadata +110 -9
data/features/git.feature CHANGED
@@ -11,6 +11,7 @@ Scenario: Vendorificating a git repo
11
11
  | Version | 10e9ac58c77bc229d8c59a5b4eb7422916453148 |
12
12
  | With file | test/alias.c |
13
13
  And there's a git log message including "at revision 10e9ac58c77bc229d8c59a5b4eb7422916453148"
14
+ And there's a git commit note including "10e9ac" in "git_revision"
14
15
 
15
16
  Scenario: Vendorificating a subdirectory from a git repo
16
17
  Given a repository with following Vendorfile:
@@ -38,8 +39,8 @@ Scenario: Vendorificating a certain branch from a git repo
38
39
  | Version | ecbfa229ba5f11c05b18bcc4f7c32b8f25d63f8c |
39
40
  | With file | README.md |
40
41
  And there's a git log message including "at revision ecbfa229ba5f11c05b18bcc4f7c32b8f25d63f8c"
42
+ And there's a git commit note including "ecbfa2" in "git_revision"
41
43
 
42
- @wip
43
44
  Scenario: Vendorificating a certain tag from a git repo
44
45
  Given a repository with following Vendorfile:
45
46
  """ruby
@@ -51,8 +52,9 @@ Scenario: Vendorificating a certain tag from a git repo
51
52
  | Name | testrepo |
52
53
  | Version | email-v0 |
53
54
  | Without file | README.md |
54
- | With file | test/alias.c |
55
+ | With file | test/alias.c |
55
56
  And there's a git log message including "at revision f81247bde4ef7a1c7d280140cc0bcf0b8221a51f"
57
+ And there's a git commit note including "f81247" in "git_revision"
56
58
 
57
59
  Scenario: Vendorificating a certain revision from a git repo
58
60
  Given a repository with following Vendorfile:
@@ -67,3 +69,4 @@ Scenario: Vendorificating a certain revision from a git repo
67
69
  | With file | alias.c |
68
70
  | Without file | test/alias.c |
69
71
  And there's a git log message including "at revision 6ff1be9c3819c93a2f41e0ddc09f252fcf154f34"
72
+ And there's a git commit note including "6ff1be" in "git_revision"
@@ -1,3 +1,4 @@
1
+
1
2
  Then /^the last output should match (#{PATTERN})$/ do |expected|
2
3
  assert { last_output =~ expected }
3
4
  end
@@ -30,6 +30,13 @@ Given /^a remote repository$/ do
30
30
  run_simple 'git remote add origin ../remote-repository'
31
31
  end
32
32
 
33
+ When /(?:I have following Gemfile|I change Gemfile to|following Gemfile):$/ do |gemfile_contents|
34
+ write_file('Gemfile', gemfile_contents)
35
+ run_simple(without_bundler('bundle'))
36
+ run_simple 'git add Gemfile Gemfile.lock'
37
+ run_simple 'git commit -m bundle'
38
+ end
39
+
33
40
  When /^I change Vendorfile to:$/ do |vendorfile_contents|
34
41
  write_file('Vendorfile', vendorfile_contents)
35
42
  run_simple 'git commit -m "Updated Vendorfile" Vendorfile'
@@ -38,10 +38,19 @@ Then /^tag matching (#{PATTERN}) does not exist$/ do |pat|
38
38
  deny { git.tags.any? { |t| t =~ pat } }
39
39
  end
40
40
 
41
- Then(/^there's a git log message including "(.*?)"$/) do |message|
41
+ Then /^there's a git log message including "(.*?)"$/ do |message|
42
42
  assert { git.log.lines.any? { |ln| ln.include?(message) } }
43
43
  end
44
44
 
45
+ Then /^there's a git commit note including "(.*?)" in "(.*?)"$/ do |value, key|
46
+ # Not in the assert block, because it raises an exception on failure.
47
+ contains_note = git.notes({:ref => 'vendor'}, 'list').lines.any? do |line|
48
+ note = YAML.load git.show(line.split[0])
49
+ (note[key] || note[key.to_sym]).to_s.include? value
50
+ end
51
+ assert { contains_note == true }
52
+ end
53
+
45
54
  Then /^branch "(.*?)" exists in the remote repo$/ do |branch_name|
46
55
  assert { remote_git.heads.include?(branch_name) }
47
56
  end
@@ -49,3 +58,7 @@ end
49
58
  Then /^tag "(.*?)" exists in the remote repo$/ do |tag_name|
50
59
  assert { remote_git.tags.include?(tag_name) }
51
60
  end
61
+
62
+ Then /^notes ref "(.*?)" exists in the remote repo$/ do |ref_name|
63
+ assert { remote_git.note_refs.include?(ref_name) }
64
+ end
@@ -1,3 +1,7 @@
1
+ def vendor_path_for(mod, path)
2
+ File.join('vendor', mod['Path'] || mod['Name'], path)
3
+ end
4
+
1
5
  Then /^(?:the )?following has( not)? been conjured:$/ do |not_p, table|
2
6
  exists_p = not_p ? "does not exist" : "exists"
3
7
 
@@ -14,12 +18,12 @@ Then /^(?:the )?following has( not)? been conjured:$/ do |not_p, table|
14
18
 
15
19
  if mod['With file']
16
20
  check_file_presence(mod['With file'].lines.
17
- map { |ln| File.join('vendor', mod['Name'], ln.strip) }, !not_p)
21
+ map { |ln| vendor_path_for(mod, ln.strip) }, !not_p)
18
22
  end
19
23
 
20
24
  if mod['Without file']
21
25
  check_file_presence(mod['Without file'].lines.
22
- map { |ln| File.join('vendor', mod['Name'], ln.strip) }, !!not_p)
26
+ map { |ln| vendor_path_for(mod, ln.strip) }, !!not_p)
23
27
  end
24
28
  end
25
29
  end
@@ -1,3 +1,5 @@
1
+ require 'shellwords'
2
+
1
3
  module Vendorificator
2
4
  module TestSupport
3
5
  module ArubaExt
@@ -16,6 +18,12 @@ module Vendorificator
16
18
  def last_output
17
19
  last_stdout + last_stderr
18
20
  end
21
+
22
+ def without_bundler(cmd)
23
+ cmd = %w[ RUBYOPT BUNDLE_PATH BUNDLE_BIN_PATH BUNDLE_GEMFILE
24
+ ].map { |v| "unset #{v} ; " }.join << cmd
25
+ "sh -c #{Shellwords.escape(cmd)}"
26
+ end
19
27
  end
20
28
  end
21
29
  end
@@ -5,6 +5,9 @@ require 'tmpdir'
5
5
  require 'aruba/cucumber'
6
6
  require 'wrong'
7
7
 
8
+ ENV['GIT_AUTHOR_NAME'] = ENV['GIT_COMMITTER_NAME'] = 'Vendorificator Cucumber'
9
+ ENV['GIT_AUTHOR_EMAIL'] = ENV['GIT_COMMITTER_EMAIL'] = 'nonexistent@example.com'
10
+
8
11
  World(Wrong)
9
12
 
10
13
  ENV['FIXTURES_DIR'] = Pathname.new(__FILE__).
@@ -19,6 +19,12 @@ module Vendorificator
19
19
  def tags
20
20
  refs(:tags)
21
21
  end
22
+
23
+ def note_refs
24
+ show_ref.lines.
25
+ map { |ln| ln =~ /[0-9a-f]{40} refs\/notes\// and $'.strip }.
26
+ compact
27
+ end
22
28
  end
23
29
 
24
30
  def git
@@ -36,6 +36,9 @@ Scenario: Version & checksum
36
36
  | Name | testrepo |
37
37
  | Version | 0.1 |
38
38
  | With file | test/alias.c |
39
+ And there's a git commit note including "ea207a" in "archive_checksum"
40
+ And there's a git commit note including "20480" in "archive_filesize"
41
+ And there's a git commit note including "test-assets.3ofcoins" in "archive_url"
39
42
 
40
43
  Scenario: Wrong checksum
41
44
  Given a repository with following Vendorfile:
@@ -0,0 +1,67 @@
1
+ Feature: use a tool to download stuff
2
+
3
+ Background:
4
+ Given a repository with following Vendorfile:
5
+ """ruby
6
+ # Delete Bundler's variables
7
+ %w[RUBYOPT BUNDLE_PATH BUNDLE_BIN_PATH BUNDLE_GEMFILE].each do |var|
8
+ ENV.delete(var)
9
+ end
10
+
11
+ tool 'bundler',
12
+ :path => 'cache', # Hardcoded, meh
13
+ :specs => [ 'Gemfile', 'Gemfile.lock' ],
14
+ :command => 'bundle package --all'
15
+ """
16
+
17
+ Scenario: Use Gem bundler to download rubygems, and Vendorificator to vendor them
18
+ Given I have following Gemfile:
19
+ """ruby
20
+ source "file://#{ENV['FIXTURES_DIR']}/rubygems"
21
+ gem "hello"
22
+ """
23
+ When I successfully run `vendor sync`
24
+ Then following has been conjured:
25
+ | Name | bundler |
26
+ | Path | cache |
27
+ | With file | hello-0.0.1.gem |
28
+ | Without file | first-0.gem |
29
+
30
+ Scenario: Bundler correctly downloads and caches dependencies
31
+ Given I have following Gemfile:
32
+ """ruby
33
+ source "file://#{ENV['FIXTURES_DIR']}/rubygems"
34
+ gem "first"
35
+ """
36
+ When I successfully run `vendor sync`
37
+ Then following has been conjured:
38
+ | Name | bundler |
39
+ | Path | cache |
40
+ | Without file | hello-0.0.1.gem |
41
+ | With file | first-0.gem |
42
+ | With file | second-0.gem |
43
+
44
+ Scenario: directory contents are completely replaced on re-vendoring
45
+ Given I have following Gemfile:
46
+ """ruby
47
+ source "file://#{ENV['FIXTURES_DIR']}/rubygems"
48
+ gem "hello"
49
+ """
50
+ When I successfully run `vendor sync`
51
+ Then following has been conjured:
52
+ | Name | bundler |
53
+ | Path | cache |
54
+ | With file | hello-0.0.1.gem |
55
+ | Without file | first-0.gem |
56
+ When I change Gemfile to:
57
+ """ruby
58
+ source "file://#{ENV['FIXTURES_DIR']}/rubygems"
59
+ gem "first"
60
+ """
61
+ And I successfully run `vendor sync`
62
+ Then following has been conjured:
63
+ | Name | bundler |
64
+ | Path | cache |
65
+ | Without file | hello-0.0.1.gem |
66
+ | With file | first-0.gem |
67
+ | With file | second-0.gem |
@@ -0,0 +1,42 @@
1
+ Feature: `rubygems_bundler` and `chef_berkshelf` shortcuts for tools
2
+
3
+ Scenario: rubygems_bundler
4
+ Given a repository with following Vendorfile:
5
+ """ruby
6
+ # Delete Bundler's variables
7
+ %w[RUBYOPT BUNDLE_PATH BUNDLE_BIN_PATH BUNDLE_GEMFILE].each do |var|
8
+ ENV.delete(var)
9
+ end
10
+ rubygems_bundler
11
+ """
12
+ And following Gemfile:
13
+ """ruby
14
+ source "file://#{ENV['FIXTURES_DIR']}/rubygems"
15
+ gem "hello"
16
+ """
17
+ When I successfully run `vendor sync`
18
+ Then following has been conjured:
19
+ | Name | rubygems |
20
+ | Path | cache |
21
+ | With file | hello-0.0.1.gem |
22
+ | Without file | first-0.gem |
23
+
24
+ @berkshelf
25
+ Scenario: chef_berkshelf
26
+ Given a repository with following Vendorfile:
27
+ """ruby
28
+ chef_berkshelf
29
+ """
30
+ And a file named "Berksfile" with:
31
+ """ruby
32
+ site :opscode
33
+ cookbook 'build-essential'
34
+ """
35
+ And I successfully run `berks install`
36
+ And I successfully run `git add Berksfile Berksfile.lock`
37
+ And I successfully run `git commit -m Berksfile`
38
+ When I successfully run `vendor sync`
39
+ Then following has been conjured:
40
+ | Name | cookbooks |
41
+ | With file | build-essential/metadata.rb |
42
+
@@ -3,7 +3,8 @@ Feature: bare 'vendor' clause
3
3
  Scenario:
4
4
  Given a repository with following Vendorfile:
5
5
  """ruby
6
- vendor 'generated', :version => '0.23' do |v|
6
+ annotate 'foo', 'bar'
7
+ vendor 'generated', :version => '0.23', :annotate => 'by Przemo' do |v|
7
8
  File.open('README', 'w') { |f| f.puts "Hello, World!" }
8
9
  File.open('VERSION', 'w') { |f| f.puts v.version }
9
10
  end
@@ -14,3 +15,5 @@ Scenario:
14
15
  | Version | 0.23 |
15
16
  | With file | README |
16
17
  And the file "vendor/generated/VERSION" should contain "0.23"
18
+ And there's a git commit note including "bar" in "foo"
19
+ And there's a git commit note including "by Przemo" in "module_annotations"
@@ -85,10 +85,15 @@ module Vendorificator
85
85
  end
86
86
 
87
87
  say_status( mod.status.to_s.gsub('_', ' '), status_line,
88
- ( mod.status==:up_to_date ? :green : :yellow ) )
88
+ ( mod.status == :up_to_date ? :green : :yellow ) )
89
89
  end
90
90
  end
91
91
 
92
+ desc 'info MODULE', "Show module information"
93
+ def info(mod_name)
94
+ environment.info mod_name, options
95
+ end
96
+
92
97
  desc :pull, "Pull upstream branches from a remote repository"
93
98
  method_option :remote, :aliases => ['-r'], :default => nil
94
99
  method_option :dry_run, :aliases => ['-n'], :default => false, :type => :boolean
@@ -111,7 +116,7 @@ module Vendorificator
111
116
  long_desc <<EOF
112
117
  Run a git command for specified modules. Within GIT_ARGS arguments,
113
118
  you can use @MERGED@ and @PATH@ tags, which will be substituted with
114
- mo#dule's most recently merged revision and full path of its work
119
+ module's most recently merged revision and full path of its work
115
120
  directory.
116
121
 
117
122
  The 'diff' and 'log' commands are simple aliases for 'git' command.
@@ -0,0 +1,56 @@
1
+ require 'yaml'
2
+
3
+ module Vendorificator
4
+ class Commit
5
+ attr_reader :git, :rev
6
+
7
+ # Public: Initializes the object
8
+ #
9
+ # rev - The String containing revision expression for this commit.
10
+ # git - The MiniGit instance to use.
11
+ #
12
+ # Returns Commit object.
13
+ def initialize(rev, git)
14
+ @rev = rev
15
+ @git = git
16
+ end
17
+
18
+ # Public: Finds branches that contain this commit.
19
+ #
20
+ # Returns Array of branch names.
21
+ def branches
22
+ git.capturing.branch({:contains => true}, rev).split("\n").map do |name|
23
+ name.tr('*', '').strip
24
+ end
25
+ end
26
+
27
+ # Public: Checks if such a commit exists in the repository.
28
+ #
29
+ # Returns Boolean.
30
+ def exists?
31
+ git.capturing.rev_parse rev
32
+ true
33
+ rescue MiniGit::GitError
34
+ false
35
+ end
36
+
37
+ # Public: Returns vendorificator git notes for the commit.
38
+ #
39
+ # Returns the notes Hash.
40
+ def notes
41
+ YAML.load(git.capturing.notes({:ref => 'vendor'}, 'show', rev))
42
+ end
43
+
44
+ # Public: Returns vendorificator git notes for the commit if it exists.
45
+ #
46
+ # Returns the notes Hash or an empty one.
47
+ def notes?
48
+ if exists?
49
+ YAML.load(git.capturing.notes({:ref => 'vendor'}, 'show', rev))
50
+ else
51
+ {}
52
+ end
53
+ end
54
+
55
+ end
56
+ end
@@ -3,6 +3,7 @@ require 'pathname'
3
3
  module Vendorificator
4
4
  class Config
5
5
  attr_accessor :environment
6
+ attr_reader :metadata
6
7
 
7
8
  @defaults = {}
8
9
  @modules = {}
@@ -34,6 +35,7 @@ module Vendorificator
34
35
 
35
36
  def initialize(params = {})
36
37
  @configuration = self.class.defaults.merge(params)
38
+ @metadata = {}
37
39
  end
38
40
 
39
41
  def read_file(filename)
@@ -66,6 +68,10 @@ module Vendorificator
66
68
  self.class.modules
67
69
  end
68
70
 
71
+ def annotate key, value
72
+ @metadata.merge!({key => value})
73
+ end
74
+
69
75
  def method_missing(method_symbol, *args, &block)
70
76
  if modules.keys.include? method_symbol
71
77
  modules[method_symbol].new(environment, args.delete_at(0).to_s, *args, &block)
@@ -1,7 +1,6 @@
1
1
  require 'pathname'
2
-
3
2
  require 'minigit'
4
-
3
+ require 'awesome_print'
5
4
  require 'vendorificator/config'
6
5
 
7
6
  module Vendorificator
@@ -9,12 +8,15 @@ module Vendorificator
9
8
  attr_reader :config
10
9
  attr_accessor :shell, :vendor_instances
11
10
 
12
- def initialize(vendorfile=nil)
11
+ def initialize(vendorfile=nil, &block)
13
12
  @vendor_instances = []
14
13
 
15
14
  @config = Vendorificator::Config.new
16
15
  @config.environment = self
17
- @config.read_file(find_vendorfile(vendorfile).to_s)
16
+ if vendorfile || !block_given?
17
+ @config.read_file(find_vendorfile(vendorfile).to_s)
18
+ end
19
+ @config.instance_eval(&block) if block_given?
18
20
 
19
21
  self.each_vendor_instance{ |mod| mod.compute_dependencies! }
20
22
  end
@@ -66,6 +68,7 @@ module Vendorificator
66
68
 
67
69
  git.fetch(remote)
68
70
  git.fetch({:tags => true}, remote)
71
+ git.fetch(remote, 'refs/notes/vendor:refs/notes/vendor')
69
72
 
70
73
  ref_rx = /^refs\/remotes\/#{Regexp.quote(remote)}\//
71
74
  remote_branches = Hash[ git.capturing.show_ref.
@@ -97,6 +100,26 @@ module Vendorificator
97
100
  end
98
101
  end
99
102
 
103
+ # Public: Displays info about the last merged version of module.
104
+ #
105
+ # mod - String with the module name
106
+ # options - Hash containing options
107
+ #
108
+ # Returns nothing.
109
+ def info(mod_name, options = {})
110
+ if vendor = find_vendor_instance_by_name(mod_name)
111
+ shell.say "Module name: #{vendor.name}\n"
112
+ shell.say "Module category: #{vendor.category}\n"
113
+ shell.say "Module merged version: #{vendor.merged_version}\n"
114
+ shell.say "Module merged notes: #{vendor.merged_notes.ai}\n"
115
+ elsif (commit = Commit.new(mod_name, git)).exists?
116
+ shell.say "Branches that contain this commit: #{commit.branches.join(', ')}\n"
117
+ shell.say "Vendorificator notes on this commit: #{commit.notes.ai}\n"
118
+ else
119
+ shell.say "Module or ref #{mod_name.inspect} not found."
120
+ end
121
+ end
122
+
100
123
  # Public: Push changes on module branches.
101
124
  #
102
125
  # options - The Hash containing options
@@ -109,9 +132,11 @@ module Vendorificator
109
132
  each_vendor_instance{ |mod| pushable += mod.pushable_refs }
110
133
 
111
134
  remotes = options[:remote] ? options[:remote].split(',') : config[:remotes]
112
- remotes.each{ |remote| git.push remote, pushable }
113
-
114
- git.push :tags => true
135
+ remotes.each do |remote|
136
+ git.push remote, pushable
137
+ git.push remote, :tags => true
138
+ git.push remote, 'refs/notes/vendor'
139
+ end
115
140
  end
116
141
 
117
142
  # Public: Runs all the vendor modules.
@@ -122,11 +147,12 @@ module Vendorificator
122
147
  def sync(options = {})
123
148
  ensure_clean!
124
149
  config[:use_upstream_version] = options[:update]
150
+ metadata = metadata_snapshot
125
151
 
126
152
  each_vendor_instance(*options[:modules]) do |mod|
127
153
  say_status :module, mod.name
128
154
  indent do
129
- mod.run!
155
+ mod.run!(:metadata => metadata)
130
156
  end
131
157
  end
132
158
  end
@@ -166,8 +192,40 @@ module Vendorificator
166
192
  false
167
193
  end
168
194
 
195
+ def metadata_snapshot
196
+ {
197
+ :vendorificator_version => ::Vendorificator::VERSION,
198
+ :current_branch => git.capturing.rev_parse({:abbrev_ref => true}, 'HEAD').strip,
199
+ :current_sha => git.capturing.rev_parse('HEAD').strip,
200
+ :git_describe => (git.capturing.describe.strip rescue '')
201
+ }
202
+ end
203
+
204
+ # Public: returns `config[:root_dir]` relative to Git repository root
205
+ def relative_root_dir
206
+ @relative_root_dir ||= config[:root_dir].relative_path_from(
207
+ Pathname.new(git.git_work_tree))
208
+ end
209
+
210
+ # Public: Returns module with given name
211
+ def [](name)
212
+ vendor_instances.find { |v| v.name == name }
213
+ end
214
+
169
215
  private
170
216
 
217
+ # Private: Finds a vendor instance by module name.
218
+ #
219
+ # mod_name - The String containing the module name.
220
+ #
221
+ # Returns Vendor instance.
222
+ def find_vendor_instance_by_name(mod_name)
223
+ each_vendor_instance do |mod|
224
+ return mod if mod.name == mod_name
225
+ end
226
+ nil
227
+ end
228
+
171
229
  # Private: Finds the vendorfile to use.
172
230
  #
173
231
  # given - the optional String containing vendorfile path.
@@ -213,6 +271,5 @@ module Vendorificator
213
271
  ensure
214
272
  shell.padding -= 1 if shell
215
273
  end
216
-
217
274
  end
218
275
  end