knife-essentials 0.8.1 → 0.8.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -108,7 +108,12 @@ module ChefFS
108
108
  # are_same = (value == other_value)
109
109
  # end
110
110
  def compare_to(other)
111
- return nil
111
+ nil
112
+ end
113
+
114
+ def chef_object
115
+ raise ChefFS::FileSystem::NotFoundError, "Nonexistent #{path_for_printing}" if !exists?
116
+ nil
112
117
  end
113
118
 
114
119
  # Important directory attributes: name, parent, path, root
@@ -0,0 +1,37 @@
1
+ #
2
+ # Author:: John Keiser (<jkeiser@opscode.com>)
3
+ # Copyright:: Copyright (c) 2013 Opscode, Inc.
4
+ # License:: Apache License, Version 2.0
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+
19
+ require 'chef_fs/file_system/chef_repository_file_system_entry'
20
+ require 'chef/cookbook/chefignore'
21
+
22
+ module ChefFS
23
+ module FileSystem
24
+ class ChefRepositoryFileSystemCookbooksDir < ChefRepositoryFileSystemEntry
25
+ def initialize(name, parent, file_path)
26
+ super(name, parent, file_path)
27
+ @chefignore = Chef::Cookbook::Chefignore.new(self.file_path)
28
+ end
29
+
30
+ attr_reader :chefignore
31
+
32
+ def ignore_empty_directories?
33
+ true
34
+ end
35
+ end
36
+ end
37
+ end
@@ -17,7 +17,6 @@
17
17
  #
18
18
 
19
19
  require 'chef_fs/file_system/file_system_entry'
20
- require 'chef/cookbook/chefignore'
21
20
  require 'chef/cookbook/cookbook_version_loader'
22
21
  require 'chef/node'
23
22
  require 'chef/role'
@@ -30,23 +29,16 @@ module ChefFS
30
29
  # ChefRepositoryFileSystemEntry works just like FileSystemEntry,
31
30
  # except can inflate Chef objects
32
31
  class ChefRepositoryFileSystemEntry < FileSystemEntry
33
- def initialize(name, parent, file_path = nil)
32
+ def initialize(name, parent, file_path = nil, ignore_empty_directories = nil, chefignore = nil)
34
33
  super(name, parent, file_path)
35
- # Load /cookbooks/chefignore
36
- if path == '/cookbooks'
37
- @chefignore = Chef::Cookbook::Chefignore.new(self.file_path)
38
- @ignore_empty_directories = true
39
- # If we are a cookbook or a cookbook subdirectory, empty directories
40
- # underneath us are ignored (since they cannot be uploaded)
41
- elsif parent && parent.ignore_empty_directories?
42
- @ignore_empty_directories = true
43
- end
44
34
  end
45
35
 
46
- attr_reader :chefignore
36
+ def chefignore
37
+ nil
38
+ end
47
39
 
48
40
  def ignore_empty_directories?
49
- @ignore_empty_directories
41
+ parent.ignore_empty_directories?
50
42
  end
51
43
 
52
44
  def chef_object
@@ -68,43 +60,36 @@ module ChefFS
68
60
  def children
69
61
  @children ||=
70
62
  Dir.entries(file_path).
71
- select { |entry| entry != '.' && entry != '..' && !ignored?(entry) }.
72
- map { |entry| ChefRepositoryFileSystemEntry.new(entry, self) }
63
+ select { |entry| entry != '.' && entry != '..' }.
64
+ map { |entry| ChefRepositoryFileSystemEntry.new(entry, self) }.
65
+ select { |entry| !ignored?(entry) }
73
66
  end
74
67
 
75
- attr_reader :chefignore
76
-
77
68
  private
78
69
 
79
- def is_cookbooks_dir?
80
- # We check name first because it's a faster fail than path
81
- path == "/cookbooks"
82
- end
83
-
84
- def ignored?(child_name)
85
- # empty directories inside a cookbook are ignored
86
- if ignore_empty_directories?
87
- child_path = PathUtils.join(file_path, child_name)
88
- if File.directory?(child_path) && Dir.entries(child_path) == [ '.', '..' ]
70
+ def ignored?(child_entry)
71
+ if child_entry.dir?
72
+ # empty cookbooks and cookbook directories are ignored
73
+ if ignore_empty_directories? && child_entry.children.size == 0
89
74
  return true
90
75
  end
91
- end
92
-
93
- ignorer = parent
94
- begin
95
- if ignorer.chefignore
96
- # Grab the path from entry to child
97
- path_to_child = child_name
98
- child = self
99
- while child.parent != ignorer
100
- path_to_child = PathUtils.join(child.name, path_to_child)
101
- child = child.parent
76
+ else
77
+ ignorer = parent
78
+ begin
79
+ if ignorer.chefignore
80
+ # Grab the path from entry to child
81
+ path_to_child = child_entry.name
82
+ child = self
83
+ while child.parent != ignorer
84
+ path_to_child = PathUtils.join(child.name, path_to_child)
85
+ child = child.parent
86
+ end
87
+ # Check whether that relative path is ignored
88
+ return ignorer.chefignore.ignored?(path_to_child)
102
89
  end
103
- # Check whether that relative path is ignored
104
- return ignorer.chefignore.ignored?(path_to_child)
105
- end
106
- ignorer = ignorer.parent
107
- end while ignorer
90
+ ignorer = ignorer.parent
91
+ end while ignorer
92
+ end
108
93
  end
109
94
 
110
95
  end
@@ -18,6 +18,7 @@
18
18
 
19
19
  require 'chef_fs/file_system/base_fs_dir'
20
20
  require 'chef_fs/file_system/chef_repository_file_system_entry'
21
+ require 'chef_fs/file_system/chef_repository_file_system_cookbooks_dir'
21
22
  require 'chef_fs/file_system/multiplexed_dir'
22
23
 
23
24
  module ChefFS
@@ -62,7 +63,11 @@ module ChefFS
62
63
  if paths.size == 0
63
64
  return nil
64
65
  end
65
- dirs = paths.map { |path| ChefRepositoryFileSystemEntry.new(name, self, path) }
66
+ if name == 'cookbooks'
67
+ dirs = paths.map { |path| ChefRepositoryFileSystemCookbooksDir.new(name, self, path) }
68
+ else
69
+ dirs = paths.map { |path| ChefRepositoryFileSystemEntry.new(name, self, path) }
70
+ end
66
71
  MultiplexedDir.new(dirs)
67
72
  end
68
73
  end
data/lib/chef_fs/knife.rb CHANGED
@@ -47,7 +47,7 @@ module ChefFS
47
47
  end
48
48
  end
49
49
 
50
- # Smooth out some inappropriate (for know) variable defaults in Chef.
50
+ # Smooth out some inappropriate (for now) variable defaults in Chef.
51
51
  def config_var(name)
52
52
  case name
53
53
  when :data_bag_path
@@ -66,7 +66,12 @@ module ChefFS
66
66
  def object_paths
67
67
  @object_paths ||= begin
68
68
  result = {}
69
- %w(clients cookbooks data_bags environments nodes roles users).each do |object_name|
69
+ if config[:repo_mode] == 'everything'
70
+ object_names = %w(clients cookbooks data_bags environments nodes roles users)
71
+ else
72
+ object_names = %w(cookbooks data_bags environments roles)
73
+ end
74
+ object_names.each do |object_name|
70
75
  variable_name = "#{object_name[0..-2]}_path" # cookbooks -> cookbook_path
71
76
  paths = config_var(variable_name.to_sym)
72
77
  if !paths
@@ -135,7 +140,7 @@ module ChefFS
135
140
 
136
141
  # Print the given server path, relative to the current directory
137
142
  def format_path(server_path)
138
- if server_path[0,base_path.length] == base_path
143
+ if base_path && server_path[0,base_path.length] == base_path
139
144
  if server_path == base_path
140
145
  return "."
141
146
  elsif server_path[base_path.length] == "/"
@@ -1,4 +1,4 @@
1
1
  module ChefFS
2
- VERSION = "0.8.1"
2
+ VERSION = "0.8.2"
3
3
  end
4
4
 
@@ -34,7 +34,7 @@ describe ChefFS::FileSystem do
34
34
  list_should_yield_paths(fs, '/a', '/a')
35
35
  end
36
36
  it '/a/b' do
37
- list_should_yield_paths(fs, '/a/b')
37
+ list_should_yield_paths(fs, '/a/b', '/a/b')
38
38
  end
39
39
  it '/*' do
40
40
  list_should_yield_paths(fs, '/*', '/')
@@ -104,7 +104,7 @@ describe ChefFS::FileSystem do
104
104
  end
105
105
  it 'nonexistent /a/ab/blah/bjork' do
106
106
  no_blocking_calls_allowed
107
- list_should_yield_paths(fs, '/a/ab/blah/bjork')
107
+ list_should_yield_paths(fs, '/a/ab/blah/bjork', '/a/ab/blah/bjork')
108
108
  end
109
109
  end
110
110
 
@@ -0,0 +1,650 @@
1
+ require 'support/integration_helper'
2
+ require 'chef/knife/list_essentials'
3
+
4
+ describe 'knife list' do
5
+ extend IntegrationSupport
6
+ include KnifeSupport
7
+
8
+ context 'directories and files that should/should not be ignored' do
9
+ when_the_repository "has empty roles, environments and data bag item directories" do
10
+ directory "roles"
11
+ directory "environments"
12
+ directory "data_bags/bag1"
13
+
14
+ it "knife list --local -R / returns them" do
15
+ knife('list --local -R /').should_succeed <<EOM
16
+ /:
17
+ data_bags
18
+ environments
19
+ roles
20
+
21
+ /data_bags:
22
+ bag1
23
+
24
+ /data_bags/bag1:
25
+
26
+ /environments:
27
+
28
+ /roles:
29
+ EOM
30
+ end
31
+ end
32
+
33
+ when_the_repository "has an empty data_bags directory" do
34
+ directory "data_bags"
35
+
36
+ it "knife list --local / returns it" do
37
+ knife('list --local /').should_succeed "/data_bags\n"
38
+ end
39
+ end
40
+
41
+ when_the_repository "has an empty cookbook directory" do
42
+ directory 'cookbooks/cookbook1'
43
+
44
+ it "knife list --local -R / does not return it" do
45
+ knife('list --local -R /').should_succeed <<EOM
46
+ /:
47
+ cookbooks
48
+
49
+ /cookbooks:
50
+ EOM
51
+ end
52
+ end
53
+
54
+ when_the_repository "has only empty cookbook subdirectories" do
55
+ directory 'cookbooks/cookbook1/recipes'
56
+
57
+ it "knife list --local -R / does not return it" do
58
+ knife('list --local -R /').should_succeed <<EOM
59
+ /:
60
+ cookbooks
61
+
62
+ /cookbooks:
63
+ EOM
64
+ end
65
+ end
66
+
67
+ when_the_repository "has empty and non-empty cookbook subdirectories" do
68
+ directory 'cookbooks/cookbook1/recipes'
69
+ file 'cookbooks/cookbook1/templates/default/x.txt', ''
70
+
71
+ it "knife list --local -R / does not return the empty ones" do
72
+ knife('list --local -R /').should_succeed <<EOM
73
+ /:
74
+ cookbooks
75
+
76
+ /cookbooks:
77
+ cookbook1
78
+
79
+ /cookbooks/cookbook1:
80
+ templates
81
+
82
+ /cookbooks/cookbook1/templates:
83
+ default
84
+
85
+ /cookbooks/cookbook1/templates/default:
86
+ x.txt
87
+ EOM
88
+ end
89
+ end
90
+
91
+ when_the_repository "has only empty cookbook sub-sub-directories" do
92
+ directory 'cookbooks/cookbook1/templates/default'
93
+
94
+ it "knife list --local -R / does not return it" do
95
+ knife('list --local -R /').should_succeed <<EOM
96
+ /:
97
+ cookbooks
98
+
99
+ /cookbooks:
100
+ EOM
101
+ end
102
+ end
103
+
104
+ when_the_repository "has empty cookbook sub-sub-directories alongside non-empty ones" do
105
+ file 'cookbooks/cookbook1/templates/default/x.txt', ''
106
+ directory 'cookbooks/cookbook1/templates/rhel'
107
+ directory 'cookbooks/cookbook1/files/default'
108
+
109
+ it "knife list --local -R / does not return the empty ones" do
110
+ knife('list --local -R /').should_succeed <<EOM
111
+ /:
112
+ cookbooks
113
+
114
+ /cookbooks:
115
+ cookbook1
116
+
117
+ /cookbooks/cookbook1:
118
+ templates
119
+
120
+ /cookbooks/cookbook1/templates:
121
+ default
122
+
123
+ /cookbooks/cookbook1/templates/default:
124
+ x.txt
125
+ EOM
126
+ end
127
+ end
128
+
129
+ when_the_repository "has an extra schmenvironments directory" do
130
+ directory "schmenvironments" do
131
+ file "_default.json", {}
132
+ end
133
+
134
+ it "knife list --local -R / should NOT return it" do
135
+ knife('list --local -R /').should_succeed ""
136
+ end
137
+ end
138
+
139
+ when_the_repository "has extra subdirectories and files under data bag items, roles, and environments" do
140
+ directory "data_bags/bag1" do
141
+ file "item1.json", {}
142
+ file "item2.xml", ""
143
+ file "another_subdir/item.json", {}
144
+ end
145
+ directory "roles" do
146
+ file "role1.json", {}
147
+ file "role2.xml", ""
148
+ file "subdir/role.json", {}
149
+ end
150
+ directory "environments" do
151
+ file "environment1.json", {}
152
+ file "environment2.xml", ""
153
+ file "subdir/environment.json", {}
154
+ end
155
+
156
+ it "knife list --local -R / should NOT return them" do
157
+ pending "Decide whether this is a good/bad idea" do
158
+ knife('list --local -R /').should_succeed <<EOM
159
+ /:
160
+ data_bags
161
+ environments
162
+ roles
163
+
164
+ /data_bags:
165
+ bag1
166
+
167
+ /data_bags/bag1:
168
+ item1.json
169
+
170
+ /environments:
171
+ environment1.json
172
+
173
+ /roles:
174
+ role1.json
175
+ EOM
176
+ end
177
+ end
178
+ end
179
+
180
+ when_the_repository "has extraneous subdirectories and files under cookbooks" do
181
+ directory 'cookbooks/cookbook1' do
182
+ file 'a.rb', ''
183
+ file 'blarghle/blah.rb', ''
184
+ directory 'attributes' do
185
+ file 'a.rb', ''
186
+ file 'b.json', {}
187
+ file 'c/d.rb', ''
188
+ file 'c/e.json', {}
189
+ end
190
+ directory 'definitions' do
191
+ file 'a.rb', ''
192
+ file 'b.json', {}
193
+ file 'c/d.rb', ''
194
+ file 'c/e.json', {}
195
+ end
196
+ directory 'recipes' do
197
+ file 'a.rb', ''
198
+ file 'b.json', {}
199
+ file 'c/d.rb', ''
200
+ file 'c/e.json', {}
201
+ end
202
+ directory 'libraries' do
203
+ file 'a.rb', ''
204
+ file 'b.json', {}
205
+ file 'c/d.rb', ''
206
+ file 'c/e.json', {}
207
+ end
208
+ directory 'templates' do
209
+ file 'a.rb', ''
210
+ file 'b.json', {}
211
+ file 'c/d.rb', ''
212
+ file 'c/e.json', {}
213
+ end
214
+ directory 'files' do
215
+ file 'a.rb', ''
216
+ file 'b.json', {}
217
+ file 'c/d.rb', ''
218
+ file 'c/e.json', {}
219
+ end
220
+ directory 'resources' do
221
+ file 'a.rb', ''
222
+ file 'b.json', {}
223
+ file 'c/d.rb', ''
224
+ file 'c/e.json', {}
225
+ end
226
+ directory 'providers' do
227
+ file 'a.rb', ''
228
+ file 'b.json', {}
229
+ file 'c/d.rb', ''
230
+ file 'c/e.json', {}
231
+ end
232
+ end
233
+
234
+ it "knife list --local -R / should NOT return them" do
235
+ pending "Decide whether this is a good idea" do
236
+ knife('list --local -R /').should_succeed <<EOM
237
+ /:
238
+ cookbooks
239
+
240
+ /cookbooks:
241
+ cookbook1
242
+
243
+ /cookbooks/cookbook1:
244
+ a.rb
245
+ attributes
246
+ definitions
247
+ files
248
+ libraries
249
+ providers
250
+ recipes
251
+ resources
252
+ templates
253
+
254
+ /cookbooks/cookbook1/attributes:
255
+ a.rb
256
+
257
+ /cookbooks/cookbook1/definitions:
258
+ a.rb
259
+
260
+ /cookbooks/cookbook1/files:
261
+ a.rb
262
+ b.json
263
+ c
264
+
265
+ /cookbooks/cookbook1/files/c:
266
+ d.rb
267
+ e.json
268
+
269
+ /cookbooks/cookbook1/libraries:
270
+ a.rb
271
+
272
+ /cookbooks/cookbook1/providers:
273
+ a.rb
274
+ c
275
+
276
+ /cookbooks/cookbook1/providers/c:
277
+ d.rb
278
+
279
+ /cookbooks/cookbook1/recipes:
280
+ a.rb
281
+
282
+ /cookbooks/cookbook1/resources:
283
+ a.rb
284
+ c
285
+
286
+ /cookbooks/cookbook1/resources/c:
287
+ d.rb
288
+
289
+ /cookbooks/cookbook1/templates:
290
+ a.rb
291
+ b.json
292
+ c
293
+
294
+ /cookbooks/cookbook1/templates/c:
295
+ d.rb
296
+ e.json
297
+ EOM
298
+ end
299
+ end
300
+ end
301
+
302
+ when_the_repository "has a file in cookbooks/" do
303
+ file 'cookbooks/file', ''
304
+ it 'does not show up in list -R' do
305
+ pending "don't show files when only directories are allowed" do
306
+ knife('list --local -R /').should_succeed <<EOM
307
+ /:
308
+ cookbooks
309
+
310
+ /cookbooks:
311
+ EOM
312
+ end
313
+ end
314
+ end
315
+
316
+ when_the_repository "has a file in data_bags/" do
317
+ file 'data_bags/file', ''
318
+ it 'does not show up in list -R' do
319
+ pending "don't show files when only directories are allowed" do
320
+ knife('list --local -R /').should_succeed <<EOM
321
+ /:
322
+ data_bags
323
+
324
+ /data_bags:
325
+ EOM
326
+ end
327
+ end
328
+ end
329
+ end
330
+
331
+ context 'chefignore tests' do
332
+ when_the_repository "has lots of stuff in it" do
333
+ file 'roles/x.json', {}
334
+ file 'environments/x.json', {}
335
+ file 'data_bags/bag1/x.json', {}
336
+ file 'cookbooks/cookbook1/x.json', {}
337
+
338
+ context "and has a chefignore everywhere except cookbooks" do
339
+ chefignore = "x.json\nroles/x.json\nenvironments/x.json\ndata_bags/bag1/x.json\nbag1/x.json\ncookbooks/cookbook1/x.json\ncookbook1/x.json\n"
340
+ file 'chefignore', chefignore
341
+ file 'roles/chefignore', chefignore
342
+ file 'environments/chefignore', chefignore
343
+ file 'data_bags/chefignore', chefignore
344
+ file 'data_bags/bag1/chefignore', chefignore
345
+ file 'cookbooks/cookbook1/chefignore', chefignore
346
+
347
+ it 'nothing is ignored' do
348
+ # NOTE: many of the "chefignore" files should probably not show up
349
+ # themselves, but we have other tests that talk about that
350
+ knife('list --local -R /').should_succeed <<EOM
351
+ /:
352
+ cookbooks
353
+ data_bags
354
+ environments
355
+ roles
356
+
357
+ /cookbooks:
358
+ cookbook1
359
+
360
+ /cookbooks/cookbook1:
361
+ chefignore
362
+ x.json
363
+
364
+ /data_bags:
365
+ bag1
366
+ chefignore
367
+
368
+ /data_bags/bag1:
369
+ chefignore
370
+ x.json
371
+
372
+ /environments:
373
+ chefignore
374
+ x.json
375
+
376
+ /roles:
377
+ chefignore
378
+ x.json
379
+ EOM
380
+ end
381
+ end
382
+ end
383
+
384
+ when_the_repository 'has a cookbook with only chefignored files' do
385
+ file 'cookbooks/cookbook1/templates/default/x.rb', ''
386
+ file 'cookbooks/cookbook1/libraries/x.rb', ''
387
+ file 'cookbooks/chefignore', "libraries/x.rb\ntemplates/default/x.rb\n"
388
+
389
+ it 'the cookbook is not listed' do
390
+ knife('list --local -R /').should_succeed <<EOM
391
+ /:
392
+ cookbooks
393
+
394
+ /cookbooks:
395
+ chefignore
396
+ EOM
397
+ end
398
+ end
399
+
400
+ when_the_repository "has multiple cookbooks" do
401
+ file 'cookbooks/cookbook1/x.json', {}
402
+ file 'cookbooks/cookbook1/y.json', {}
403
+ file 'cookbooks/cookbook2/x.json', {}
404
+ file 'cookbooks/cookbook2/y.json', {}
405
+
406
+ context 'and has a chefignore with filenames' do
407
+ file 'cookbooks/chefignore', "x.json\n"
408
+
409
+ it 'matching files and directories get ignored in all cookbooks' do
410
+ knife('list --local -R /').should_succeed <<EOM
411
+ /:
412
+ cookbooks
413
+
414
+ /cookbooks:
415
+ chefignore
416
+ cookbook1
417
+ cookbook2
418
+
419
+ /cookbooks/cookbook1:
420
+ y.json
421
+
422
+ /cookbooks/cookbook2:
423
+ y.json
424
+ EOM
425
+ end
426
+ end
427
+
428
+ context "and has a chefignore with wildcards" do
429
+ file 'cookbooks/chefignore', "x.*\n"
430
+ file 'cookbooks/cookbook1/x.rb', ''
431
+
432
+ it 'matching files and directories get ignored in all cookbooks' do
433
+ knife('list --local -R /').should_succeed <<EOM
434
+ /:
435
+ cookbooks
436
+
437
+ /cookbooks:
438
+ chefignore
439
+ cookbook1
440
+ cookbook2
441
+
442
+ /cookbooks/cookbook1:
443
+ y.json
444
+
445
+ /cookbooks/cookbook2:
446
+ y.json
447
+ EOM
448
+ end
449
+ end
450
+
451
+ context "and has a chefignore with relative paths" do
452
+ file 'cookbooks/cookbook1/recipes/x.rb', ''
453
+ file 'cookbooks/cookbook2/recipes/y.rb', ''
454
+ file 'cookbooks/chefignore', "recipes/x.rb\n"
455
+
456
+ it 'matching directories get ignored' do
457
+ knife('list --local -R /').should_succeed <<EOM
458
+ /:
459
+ cookbooks
460
+
461
+ /cookbooks:
462
+ chefignore
463
+ cookbook1
464
+ cookbook2
465
+
466
+ /cookbooks/cookbook1:
467
+ x.json
468
+ y.json
469
+
470
+ /cookbooks/cookbook2:
471
+ recipes
472
+ x.json
473
+ y.json
474
+
475
+ /cookbooks/cookbook2/recipes:
476
+ y.rb
477
+ EOM
478
+ end
479
+ end
480
+
481
+ context "and has a chefignore with subdirectories" do
482
+ file 'cookbooks/cookbook1/recipes/y.rb', ''
483
+ file 'cookbooks/chefignore', "recipes\n"
484
+
485
+ it 'matching directories do NOT get ignored' do
486
+ knife('list --local -R /').should_succeed <<EOM
487
+ /:
488
+ cookbooks
489
+
490
+ /cookbooks:
491
+ chefignore
492
+ cookbook1
493
+ cookbook2
494
+
495
+ /cookbooks/cookbook1:
496
+ recipes
497
+ x.json
498
+ y.json
499
+
500
+ /cookbooks/cookbook1/recipes:
501
+ y.rb
502
+
503
+ /cookbooks/cookbook2:
504
+ x.json
505
+ y.json
506
+ EOM
507
+ end
508
+ end
509
+
510
+ context "and has a chefignore that ignores all files in a subdirectory" do
511
+ file 'cookbooks/cookbook1/templates/default/x.rb', ''
512
+ file 'cookbooks/cookbook1/libraries/x.rb', ''
513
+ file 'cookbooks/chefignore', "libraries/x.rb\ntemplates/default/x.rb\n"
514
+
515
+ it 'ignores the subdirectory entirely' do
516
+ knife('list --local -R /').should_succeed <<EOM
517
+ /:
518
+ cookbooks
519
+
520
+ /cookbooks:
521
+ chefignore
522
+ cookbook1
523
+ cookbook2
524
+
525
+ /cookbooks/cookbook1:
526
+ x.json
527
+ y.json
528
+
529
+ /cookbooks/cookbook2:
530
+ x.json
531
+ y.json
532
+ EOM
533
+ end
534
+ end
535
+
536
+ context "and has an empty chefignore" do
537
+ file 'cookbooks/chefignore', "\n"
538
+
539
+ it 'nothing is ignored' do
540
+ knife('list --local -R /').should_succeed <<EOM
541
+ /:
542
+ cookbooks
543
+
544
+ /cookbooks:
545
+ chefignore
546
+ cookbook1
547
+ cookbook2
548
+
549
+ /cookbooks/cookbook1:
550
+ x.json
551
+ y.json
552
+
553
+ /cookbooks/cookbook2:
554
+ x.json
555
+ y.json
556
+ EOM
557
+ end
558
+ end
559
+
560
+ context "and has a chefignore with comments and empty lines" do
561
+ file 'cookbooks/chefignore', "\n\n # blah\n#\nx.json\n\n"
562
+
563
+ it 'matching files and directories get ignored in all cookbooks' do
564
+ knife('list --local -R /').should_succeed <<EOM
565
+ /:
566
+ cookbooks
567
+
568
+ /cookbooks:
569
+ chefignore
570
+ cookbook1
571
+ cookbook2
572
+
573
+ /cookbooks/cookbook1:
574
+ y.json
575
+
576
+ /cookbooks/cookbook2:
577
+ y.json
578
+ EOM
579
+ end
580
+ end
581
+ end
582
+
583
+ when_the_repository "has multiple cookbook paths" do
584
+ before :each do
585
+ Chef::Config.cookbook_path = [
586
+ File.join(Chef::Config.chef_repo_path, 'cookbooks1'),
587
+ File.join(Chef::Config.chef_repo_path, 'cookbooks2')
588
+ ]
589
+ end
590
+
591
+ file 'cookbooks1/mycookbook/metadata.rb', ''
592
+ file 'cookbooks1/mycookbook/x.json', {}
593
+ file 'cookbooks2/yourcookbook/metadata.rb', ''
594
+ file 'cookbooks2/yourcookbook/x.json', ''
595
+
596
+ context "and multiple chefignores" do
597
+ file 'cookbooks1/chefignore', "metadata.rb\n"
598
+ file 'cookbooks2/chefignore', "x.json\n"
599
+ it "chefignores apply only to the directories they are in" do
600
+ knife('list --local -R /').should_succeed <<EOM
601
+ /:
602
+ cookbooks
603
+
604
+ /cookbooks:
605
+ chefignore
606
+ mycookbook
607
+ yourcookbook
608
+
609
+ /cookbooks/mycookbook:
610
+ x.json
611
+
612
+ /cookbooks/yourcookbook:
613
+ metadata.rb
614
+ EOM
615
+ end
616
+
617
+ context "and conflicting cookbooks" do
618
+ file 'cookbooks1/yourcookbook/metadata.rb', ''
619
+ file 'cookbooks1/yourcookbook/x.json', ''
620
+ file 'cookbooks1/yourcookbook/onlyincookbooks1.rb', ''
621
+ file 'cookbooks2/yourcookbook/onlyincookbooks2.rb', ''
622
+
623
+ it "chefignores apply only to the winning cookbook" do
624
+ knife('list --local -R /').should_succeed <<EOM
625
+ /:
626
+ cookbooks
627
+
628
+ /cookbooks:
629
+ chefignore
630
+ mycookbook
631
+ yourcookbook
632
+
633
+ /cookbooks/mycookbook:
634
+ x.json
635
+
636
+ /cookbooks/yourcookbook:
637
+ onlyincookbooks1.rb
638
+ x.json
639
+ EOM
640
+ end
641
+ end
642
+ end
643
+ end
644
+ end
645
+
646
+ # TODO alternate repo_path / *_path
647
+ # TODO multiple *_path
648
+ # TODO nonexistent repo_path / *_path
649
+ # TODO empty *_path
650
+ end