vendorificator 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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