vendorificator 0.0.1

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 (57) hide show
  1. data/.gitignore +19 -0
  2. data/.travis.yml +9 -0
  3. data/Gemfile +11 -0
  4. data/LICENSE +22 -0
  5. data/README.md +45 -0
  6. data/Rakefile +29 -0
  7. data/bin/vendor +4 -0
  8. data/bin/vendorify +6 -0
  9. data/examples/Vendorfile +25 -0
  10. data/features/chef_cookbook.feature +44 -0
  11. data/features/deprecated.feature +17 -0
  12. data/features/fixtures/git/testrepo/HEAD +1 -0
  13. data/features/fixtures/git/testrepo/config +7 -0
  14. data/features/fixtures/git/testrepo/description +1 -0
  15. data/features/fixtures/git/testrepo/hooks/applypatch-msg.sample +15 -0
  16. data/features/fixtures/git/testrepo/hooks/commit-msg.sample +24 -0
  17. data/features/fixtures/git/testrepo/hooks/post-update.sample +8 -0
  18. data/features/fixtures/git/testrepo/hooks/pre-applypatch.sample +14 -0
  19. data/features/fixtures/git/testrepo/hooks/pre-commit.sample +50 -0
  20. data/features/fixtures/git/testrepo/hooks/pre-rebase.sample +169 -0
  21. data/features/fixtures/git/testrepo/hooks/prepare-commit-msg.sample +36 -0
  22. data/features/fixtures/git/testrepo/hooks/update.sample +128 -0
  23. data/features/fixtures/git/testrepo/info/exclude +6 -0
  24. data/features/fixtures/git/testrepo/info/refs +5 -0
  25. data/features/fixtures/git/testrepo/objects/info/packs +2 -0
  26. data/features/fixtures/git/testrepo/objects/pack/pack-46f7621b6a6b9b1c22dd15c08d457dfedf76e55f.idx +0 -0
  27. data/features/fixtures/git/testrepo/objects/pack/pack-46f7621b6a6b9b1c22dd15c08d457dfedf76e55f.pack +0 -0
  28. data/features/fixtures/git/testrepo/packed-refs +6 -0
  29. data/features/fixtures/git/testrepo/refs/heads/.sentinel +0 -0
  30. data/features/fixtures/git/testrepo/refs/tags/.sentinel +0 -0
  31. data/features/fixtures/vcr_cassettes/vendorificator.yml +2375 -0
  32. data/features/git.feature +12 -0
  33. data/features/needed.feature +16 -0
  34. data/features/smoke.feature +14 -0
  35. data/features/status.feature +47 -0
  36. data/features/step_definitions/basic.rb +52 -0
  37. data/features/step_definitions/git.rb +39 -0
  38. data/features/step_definitions/vendorificator.rb +27 -0
  39. data/features/support/env.rb +32 -0
  40. data/features/support/transform_pattern.rb +12 -0
  41. data/features/support/world_git.rb +40 -0
  42. data/features/support/world_runs.rb +90 -0
  43. data/features/tarball.feature +63 -0
  44. data/features/tarball_edit.feature +15 -0
  45. data/features/vendor.feature +16 -0
  46. data/lib/vendorificator/cli.rb +233 -0
  47. data/lib/vendorificator/config.rb +72 -0
  48. data/lib/vendorificator/hooks/chef_cookbook.rb +23 -0
  49. data/lib/vendorificator/repo.rb +69 -0
  50. data/lib/vendorificator/vendor/archive.rb +90 -0
  51. data/lib/vendorificator/vendor/chef_cookbook.rb +58 -0
  52. data/lib/vendorificator/vendor/git.rb +47 -0
  53. data/lib/vendorificator/vendor.rb +260 -0
  54. data/lib/vendorificator/version.rb +3 -0
  55. data/lib/vendorificator.rb +9 -0
  56. data/vendorificator.gemspec +30 -0
  57. metadata +321 -0
@@ -0,0 +1,260 @@
1
+ require 'fileutils'
2
+
3
+ require 'thor/shell/basic'
4
+
5
+ require 'vendorificator/config'
6
+
7
+ module Vendorificator
8
+ class Vendor
9
+
10
+ class << self
11
+ attr_accessor :category, :method_name
12
+
13
+ # Define a method on Vendorificator::Config to add the
14
+ # vendor module to the module definition list.
15
+ def install!
16
+ @method_name ||= self.name.split('::').last.downcase.to_sym
17
+ _cls = self # for self is obscured in define_method block's body
18
+ ( class << Vendorificator::Config ; self ; end ).
19
+ send(:define_method, @method_name ) do |name, *args, &block|
20
+ mod = _cls.new(name.to_s, *args, &block)
21
+ self[:modules] << mod
22
+ mod
23
+ end
24
+ end
25
+
26
+ def arg_reader(*names)
27
+ names.each do |name|
28
+ define_method(name) do
29
+ args[name]
30
+ end
31
+ end
32
+ end
33
+ end
34
+
35
+ attr_reader :config, :name, :args, :block
36
+ arg_reader :version, :path
37
+
38
+ def path
39
+ args[:path] || _join(category, name)
40
+ end
41
+
42
+ def initialize(name, args={}, &block)
43
+ @name = name
44
+ @args = args
45
+ @block = block
46
+ end
47
+
48
+ def shell
49
+ @shell ||=
50
+ Vendorificator::Config[:shell] || Thor::Shell::Basic.new
51
+ end
52
+
53
+ def category
54
+ self.class.category
55
+ end
56
+
57
+ def branch_name
58
+ _join(Vendorificator::Config[:branch_prefix], category, name)
59
+ end
60
+
61
+ def to_s
62
+ _join(name, version)
63
+ end
64
+
65
+ def inspect
66
+ "#<#{self.class} #{self}>"
67
+ end
68
+
69
+ def work_subdir
70
+ File.join(Vendorificator::Config[:basedir], path)
71
+ end
72
+
73
+ def work_dir
74
+ File.join(Vendorificator::Config[:root_dir], work_subdir)
75
+ end
76
+
77
+ def head
78
+ repo.get_head(branch_name)
79
+ end
80
+
81
+ def tag
82
+ repo.tags.find { |t| t.name == tag_name }
83
+ end
84
+
85
+ def merged
86
+ unless @_has_merged
87
+ if head
88
+ merged = repo.git.
89
+ merge_base({}, head.commit.sha, repo.head.commit.sha).strip
90
+ @merged = merged unless merged.empty?
91
+ end
92
+ @_has_merged = true
93
+ end
94
+ @merged
95
+ end
96
+
97
+ def merged_tag
98
+ unless @_has_merged_tag
99
+ if merged
100
+ tag = repo.git.describe( {
101
+ :exact_match => true,
102
+ :match => _join(tag_name_base, '*') },
103
+ merged).strip
104
+ @merged_tag = tag unless tag.empty?
105
+ end
106
+ @_has_merged_tag = true
107
+ end
108
+ @merged_tag
109
+ end
110
+
111
+ def merged_version
112
+ merged_tag && merged_tag[(1+tag_name_base.length)..-1]
113
+ end
114
+
115
+ def version
116
+ @args[:version] || merged_version || upstream_version
117
+ end
118
+
119
+ def upstream_version
120
+ # To be overriden
121
+ end
122
+
123
+ def updatable?
124
+ return nil if self.status == :up_to_date
125
+ return false if !head
126
+ return false if head && merged == head.commit.sha
127
+ head_tag = repo.tags.find { |t| t.name == repo.recent_tag_name(head.name) }
128
+ return head_tag || true
129
+ end
130
+
131
+ def status
132
+ # If there's no branch yet, it's a completely new module
133
+ return :new unless head
134
+
135
+ # If there's a branch but no tag, it's a known module that's not
136
+ # been updated for the new definition yet.
137
+ return :outdated unless tag
138
+
139
+ # Well, this is awkward: branch is in config and exists, but is
140
+ # not merged into current branch at all.
141
+ return :unmerged unless merged
142
+
143
+ # Merge base is tagged with our tag. We're good.
144
+ return :up_to_date if tag.commit.sha == merged
145
+
146
+ return :unpulled if repo.fast_forwardable?(tag.commit.sha, merged)
147
+
148
+ return :unknown
149
+ end
150
+
151
+ def needed?
152
+ return self.status != :up_to_date
153
+ end
154
+
155
+ def in_branch(options={}, &block)
156
+ orig_head = repo.head
157
+
158
+ # We want to be in repository's root now, as we may need to
159
+ # remove stuff and don't want to have removed directory as cwd.
160
+ Dir::chdir repo.working_dir do
161
+ # If our branch exists, check it out; otherwise, create a new
162
+ # orphaned branch.
163
+ if self.head
164
+ repo.git.checkout( {}, branch_name )
165
+ repo.git.rm( { :r => true, :f => true }, '.') if options[:clean]
166
+ else
167
+ repo.git.checkout( { :orphan => true }, branch_name )
168
+ repo.git.rm( { :r => true, :f => true }, '.')
169
+ end
170
+ end
171
+
172
+ yield
173
+ ensure
174
+ # We should make sure we're back on original branch
175
+ repo.git.checkout( {}, orig_head.name ) if defined?(orig_head) rescue nil
176
+ end
177
+
178
+ def run!
179
+ case status
180
+
181
+ when :up_to_date
182
+ shell.say_status 'up to date', self.to_s
183
+
184
+ when :unpulled, :unmerged
185
+ shell.say_status 'merging', self.to_s, :yellow
186
+ repo.git.merge({}, tag.name)
187
+
188
+ when :outdated, :new
189
+ shell.say_status 'fetching', self.to_s, :yellow
190
+ begin
191
+ shell.padding += 1
192
+ in_branch(:clean => true) do
193
+ FileUtils::mkdir_p work_dir
194
+
195
+ # Actually fill the directory with the wanted content
196
+ Dir::chdir work_dir do
197
+ begin
198
+ shell.padding += 1
199
+ self.conjure!
200
+ ensure
201
+ shell.padding -= 1
202
+ end
203
+ end
204
+
205
+ # Commit and tag the conjured module
206
+ repo.add(work_dir)
207
+ repo.commit_index(conjure_commit_message)
208
+ repo.git.tag( { :a => true, :m => tag_message }, tag_name )
209
+ shell.say_status :tag, tag_name
210
+ end
211
+ # Merge back to the original branch
212
+ repo.git.merge( {}, branch_name )
213
+ ensure
214
+ shell.padding -= 1
215
+ end
216
+
217
+ else
218
+ say_status self.status, "I'm unsure what to do.", :red
219
+ end
220
+ end
221
+
222
+ def tag_name_base
223
+ _join('vendor', category, name)
224
+ end
225
+
226
+ def tag_name
227
+ _join(tag_name_base, version)
228
+ end
229
+
230
+ def conjure_commit_message
231
+ "Conjured vendor module #{name} version #{version}"
232
+ end
233
+
234
+ def tag_message
235
+ conjure_commit_message
236
+ end
237
+
238
+ def conjure!
239
+ block.call(self) if block
240
+ end
241
+
242
+ def dependencies ; [] ; end
243
+
244
+ private
245
+
246
+ def conf
247
+ Vendorificator::Config
248
+ end
249
+
250
+ def repo
251
+ Vendorificator::Config.repo
252
+ end
253
+
254
+ def _join(*parts)
255
+ parts.compact.map(&:to_s).join('/')
256
+ end
257
+
258
+ install!
259
+ end
260
+ end
@@ -0,0 +1,3 @@
1
+ module Vendorificator
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,9 @@
1
+ # Require everything except the CLI.
2
+
3
+ require "vendorificator/version"
4
+
5
+ require 'vendorificator/config'
6
+
7
+ require 'vendorificator/vendor'
8
+ require 'vendorificator/vendor/archive'
9
+ require 'vendorificator/vendor/git'
@@ -0,0 +1,30 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path('../lib/vendorificator/version', __FILE__)
3
+
4
+ Gem::Specification.new do |gem|
5
+ gem.authors = ["Maciej Pasternacki"]
6
+ gem.email = ["maciej@pasternacki.net"]
7
+ gem.description = "Vendor everything. Stay sane."
8
+ gem.summary = "Integrate third-party vendor modules into your git repository"
9
+ gem.homepage = "https://github.com/3ofcoins/vendorificator/"
10
+
11
+ gem.files = `git ls-files`.split($\)
12
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
13
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
14
+ gem.name = "vendorificator"
15
+ gem.require_paths = ["lib"]
16
+ gem.version = Vendorificator::VERSION
17
+
18
+ gem.add_dependency 'escape'
19
+ gem.add_dependency 'grit'
20
+ gem.add_dependency 'thor', '>= 0.17.0'
21
+ gem.add_dependency 'mixlib-config'
22
+
23
+ gem.add_development_dependency 'cucumber'
24
+ gem.add_development_dependency 'git'
25
+ gem.add_development_dependency 'mixlib-shellout'
26
+ gem.add_development_dependency 'chef', '>= 10.16.0'
27
+ gem.add_development_dependency 'vcr'
28
+ gem.add_development_dependency 'fakeweb'
29
+ gem.add_development_dependency 'wrong'
30
+ end
metadata ADDED
@@ -0,0 +1,321 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: vendorificator
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Maciej Pasternacki
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-02-02 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: escape
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: grit
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: thor
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: 0.17.0
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: 0.17.0
62
+ - !ruby/object:Gem::Dependency
63
+ name: mixlib-config
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :runtime
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ - !ruby/object:Gem::Dependency
79
+ name: cucumber
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ type: :development
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ - !ruby/object:Gem::Dependency
95
+ name: git
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ! '>='
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ - !ruby/object:Gem::Dependency
111
+ name: mixlib-shellout
112
+ requirement: !ruby/object:Gem::Requirement
113
+ none: false
114
+ requirements:
115
+ - - ! '>='
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ! '>='
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
126
+ - !ruby/object:Gem::Dependency
127
+ name: chef
128
+ requirement: !ruby/object:Gem::Requirement
129
+ none: false
130
+ requirements:
131
+ - - ! '>='
132
+ - !ruby/object:Gem::Version
133
+ version: 10.16.0
134
+ type: :development
135
+ prerelease: false
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ none: false
138
+ requirements:
139
+ - - ! '>='
140
+ - !ruby/object:Gem::Version
141
+ version: 10.16.0
142
+ - !ruby/object:Gem::Dependency
143
+ name: vcr
144
+ requirement: !ruby/object:Gem::Requirement
145
+ none: false
146
+ requirements:
147
+ - - ! '>='
148
+ - !ruby/object:Gem::Version
149
+ version: '0'
150
+ type: :development
151
+ prerelease: false
152
+ version_requirements: !ruby/object:Gem::Requirement
153
+ none: false
154
+ requirements:
155
+ - - ! '>='
156
+ - !ruby/object:Gem::Version
157
+ version: '0'
158
+ - !ruby/object:Gem::Dependency
159
+ name: fakeweb
160
+ requirement: !ruby/object:Gem::Requirement
161
+ none: false
162
+ requirements:
163
+ - - ! '>='
164
+ - !ruby/object:Gem::Version
165
+ version: '0'
166
+ type: :development
167
+ prerelease: false
168
+ version_requirements: !ruby/object:Gem::Requirement
169
+ none: false
170
+ requirements:
171
+ - - ! '>='
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ - !ruby/object:Gem::Dependency
175
+ name: wrong
176
+ requirement: !ruby/object:Gem::Requirement
177
+ none: false
178
+ requirements:
179
+ - - ! '>='
180
+ - !ruby/object:Gem::Version
181
+ version: '0'
182
+ type: :development
183
+ prerelease: false
184
+ version_requirements: !ruby/object:Gem::Requirement
185
+ none: false
186
+ requirements:
187
+ - - ! '>='
188
+ - !ruby/object:Gem::Version
189
+ version: '0'
190
+ description: Vendor everything. Stay sane.
191
+ email:
192
+ - maciej@pasternacki.net
193
+ executables:
194
+ - vendor
195
+ - vendorify
196
+ extensions: []
197
+ extra_rdoc_files: []
198
+ files:
199
+ - .gitignore
200
+ - .travis.yml
201
+ - Gemfile
202
+ - LICENSE
203
+ - README.md
204
+ - Rakefile
205
+ - bin/vendor
206
+ - bin/vendorify
207
+ - examples/Vendorfile
208
+ - features/chef_cookbook.feature
209
+ - features/deprecated.feature
210
+ - features/fixtures/git/testrepo/HEAD
211
+ - features/fixtures/git/testrepo/config
212
+ - features/fixtures/git/testrepo/description
213
+ - features/fixtures/git/testrepo/hooks/applypatch-msg.sample
214
+ - features/fixtures/git/testrepo/hooks/commit-msg.sample
215
+ - features/fixtures/git/testrepo/hooks/post-update.sample
216
+ - features/fixtures/git/testrepo/hooks/pre-applypatch.sample
217
+ - features/fixtures/git/testrepo/hooks/pre-commit.sample
218
+ - features/fixtures/git/testrepo/hooks/pre-rebase.sample
219
+ - features/fixtures/git/testrepo/hooks/prepare-commit-msg.sample
220
+ - features/fixtures/git/testrepo/hooks/update.sample
221
+ - features/fixtures/git/testrepo/info/exclude
222
+ - features/fixtures/git/testrepo/info/refs
223
+ - features/fixtures/git/testrepo/objects/info/packs
224
+ - features/fixtures/git/testrepo/objects/pack/pack-46f7621b6a6b9b1c22dd15c08d457dfedf76e55f.idx
225
+ - features/fixtures/git/testrepo/objects/pack/pack-46f7621b6a6b9b1c22dd15c08d457dfedf76e55f.pack
226
+ - features/fixtures/git/testrepo/packed-refs
227
+ - features/fixtures/git/testrepo/refs/heads/.sentinel
228
+ - features/fixtures/git/testrepo/refs/tags/.sentinel
229
+ - features/fixtures/vcr_cassettes/vendorificator.yml
230
+ - features/git.feature
231
+ - features/needed.feature
232
+ - features/smoke.feature
233
+ - features/status.feature
234
+ - features/step_definitions/basic.rb
235
+ - features/step_definitions/git.rb
236
+ - features/step_definitions/vendorificator.rb
237
+ - features/support/env.rb
238
+ - features/support/transform_pattern.rb
239
+ - features/support/world_git.rb
240
+ - features/support/world_runs.rb
241
+ - features/tarball.feature
242
+ - features/tarball_edit.feature
243
+ - features/vendor.feature
244
+ - lib/vendorificator.rb
245
+ - lib/vendorificator/cli.rb
246
+ - lib/vendorificator/config.rb
247
+ - lib/vendorificator/hooks/chef_cookbook.rb
248
+ - lib/vendorificator/repo.rb
249
+ - lib/vendorificator/vendor.rb
250
+ - lib/vendorificator/vendor/archive.rb
251
+ - lib/vendorificator/vendor/chef_cookbook.rb
252
+ - lib/vendorificator/vendor/git.rb
253
+ - lib/vendorificator/version.rb
254
+ - vendorificator.gemspec
255
+ homepage: https://github.com/3ofcoins/vendorificator/
256
+ licenses: []
257
+ post_install_message:
258
+ rdoc_options: []
259
+ require_paths:
260
+ - lib
261
+ required_ruby_version: !ruby/object:Gem::Requirement
262
+ none: false
263
+ requirements:
264
+ - - ! '>='
265
+ - !ruby/object:Gem::Version
266
+ version: '0'
267
+ segments:
268
+ - 0
269
+ hash: 1339257298363592646
270
+ required_rubygems_version: !ruby/object:Gem::Requirement
271
+ none: false
272
+ requirements:
273
+ - - ! '>='
274
+ - !ruby/object:Gem::Version
275
+ version: '0'
276
+ segments:
277
+ - 0
278
+ hash: 1339257298363592646
279
+ requirements: []
280
+ rubyforge_project:
281
+ rubygems_version: 1.8.24
282
+ signing_key:
283
+ specification_version: 3
284
+ summary: Integrate third-party vendor modules into your git repository
285
+ test_files:
286
+ - features/chef_cookbook.feature
287
+ - features/deprecated.feature
288
+ - features/fixtures/git/testrepo/HEAD
289
+ - features/fixtures/git/testrepo/config
290
+ - features/fixtures/git/testrepo/description
291
+ - features/fixtures/git/testrepo/hooks/applypatch-msg.sample
292
+ - features/fixtures/git/testrepo/hooks/commit-msg.sample
293
+ - features/fixtures/git/testrepo/hooks/post-update.sample
294
+ - features/fixtures/git/testrepo/hooks/pre-applypatch.sample
295
+ - features/fixtures/git/testrepo/hooks/pre-commit.sample
296
+ - features/fixtures/git/testrepo/hooks/pre-rebase.sample
297
+ - features/fixtures/git/testrepo/hooks/prepare-commit-msg.sample
298
+ - features/fixtures/git/testrepo/hooks/update.sample
299
+ - features/fixtures/git/testrepo/info/exclude
300
+ - features/fixtures/git/testrepo/info/refs
301
+ - features/fixtures/git/testrepo/objects/info/packs
302
+ - features/fixtures/git/testrepo/objects/pack/pack-46f7621b6a6b9b1c22dd15c08d457dfedf76e55f.idx
303
+ - features/fixtures/git/testrepo/objects/pack/pack-46f7621b6a6b9b1c22dd15c08d457dfedf76e55f.pack
304
+ - features/fixtures/git/testrepo/packed-refs
305
+ - features/fixtures/git/testrepo/refs/heads/.sentinel
306
+ - features/fixtures/git/testrepo/refs/tags/.sentinel
307
+ - features/fixtures/vcr_cassettes/vendorificator.yml
308
+ - features/git.feature
309
+ - features/needed.feature
310
+ - features/smoke.feature
311
+ - features/status.feature
312
+ - features/step_definitions/basic.rb
313
+ - features/step_definitions/git.rb
314
+ - features/step_definitions/vendorificator.rb
315
+ - features/support/env.rb
316
+ - features/support/transform_pattern.rb
317
+ - features/support/world_git.rb
318
+ - features/support/world_runs.rb
319
+ - features/tarball.feature
320
+ - features/tarball_edit.feature
321
+ - features/vendor.feature