vendorificator 0.0.1 → 0.1.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.
data/README.md CHANGED
@@ -1,7 +1,6 @@
1
1
  # Vendorificator
2
2
 
3
- > **THIS WORK IS HEAVILY IN PROGRESS** and is far from usable yet. Sorry
4
- about that - I'm working on it. Expect first usable version in January 2013.
3
+ > **THIS PROGRAM IS STILL IN BETA**, use on your own risk!
5
4
 
6
5
  ## About
7
6
 
@@ -34,7 +33,199 @@ Or install it yourself as:
34
33
 
35
34
  ## Usage
36
35
 
37
- TODO: Write usage instructions here
36
+ Vendorificator is a command-line tool. The command is called `vendor`
37
+ (`bundle exec vendor` if you use Bundler). It accepts multiple
38
+ subcommands.
39
+
40
+ Run `vendor` to see list of subcommands. Run `vendor help _command_`
41
+ to get detailed description of a command.
42
+
43
+ ### Commands
44
+
45
+ Most important commands are listed here; use `vendor help` for more
46
+ detail.
47
+
48
+ * `vendor sync` will update all vendor modules that need updating
49
+ * `vendor status` will list all the modules and their status
50
+ * `vendor pull` will pull all vendor branches, tags, and notes from a
51
+ Git remote
52
+ * `vendor diff` will show the differences between vendor module's
53
+ pristine branch and curent work tree
54
+ * `vendor log` will show a `git log` of all changes made to a particular
55
+ vendor module's files that are not in module's pristine branch
56
+
57
+ ## Configuration
58
+
59
+ Vendorificator reads its configuration from a Ruby file named
60
+ `Vendorfile` (or `config/vendor.rb`). If the file does not exist in
61
+ the current directory, it looks for it in parent directories until it
62
+ gets to the git repository's root. All files Vendorificator creates
63
+ are rooted in directory containing the `Vendorfile` (or the directory
64
+ containing `config` directory with `vendor.rb` file in it).
65
+
66
+ Vendorfile is a Ruby file containing configuration settings and
67
+ description of upstream vendor modules. It may also contain any custom
68
+ Ruby code if needed.
69
+
70
+ ### Settings
71
+
72
+ * `basedir "subpath"` -- directory below work root where
73
+ Vendorificator will download modules. Defaults to `"vendor"`.
74
+ * `branch_prefix "prefix"` -- prefix for name of Git
75
+ branches. Defaults to `"vendor"`, which means all branches created
76
+ by Vendorificator start with `"vendor/"`.
77
+ * `remotes ['remote1', 'remote2', ...]` -- list of Git remotes that
78
+ `vendor pull` will use as default. Defaults to `['origin']`.
79
+ * `chef_cookbook_ignore_dependencies ['cookbook1', 'cookbook2', ...]`
80
+ -- default value for `:ignore_dependencies` argument of
81
+ `chef_cookbook` modules.
82
+
83
+ ### Modules
84
+
85
+ A **vendor module** is a single piece of upstream code managed by
86
+ Vendorificator. It is a basic building block. A vendor module is
87
+ declared by calling one of a couple functions that define them.
88
+
89
+ #### vendor
90
+
91
+ Vendor is most general of those. You call it like this:
92
+
93
+ ```ruby
94
+ vendor 'name', :option => 'value' do
95
+ # here in the block you code what needs to be done
96
+ # to get ("conjure") the module. You're already in
97
+ # the right directory, branch, etc, and what you add to the
98
+ # current directory will be committed and tagged.
99
+ end
100
+ ```
101
+
102
+ It takes following options:
103
+
104
+ * `:version` - the version of module. If the module's contents should
105
+ change, increase the version, so that Vendorificator knows it needs
106
+ to re-create the module.
107
+ * `:category` - module's *category* is subdirectory of the basedir
108
+ where module's directory will be created. For example, `vendor
109
+ "foo"` will go to `vendor/foo` by default, but `vendor "foo",
110
+ :category => :widgets` will go to `vendor/widgets/foo`. It is also
111
+ added in a similar way to module's branch name, tag names, etc.
112
+ * `:path` - lets you specify subdirectory in which the module will be
113
+ downloaded
114
+
115
+ All other upstream modules take these options, and can be given a
116
+ block to postprocess their content (e.g. if a tarball includes a
117
+ `.git` file/directory that confuses Git, you can remove it in a
118
+ block).
119
+
120
+ Example:
121
+
122
+ ```ruby
123
+ vendor 'generated', :version => '0.23' do |mod|
124
+ File.open('README') { |f| f.puts "Hello, World!" }
125
+ File.open('VERSION') { |f| f.puts mod.version }
126
+ end
127
+ ```
128
+
129
+ #### archive
130
+
131
+ Archive takes a tar.gz, tar.bz2, or zip file, downloads it, and
132
+ unpacks it as contents of the module. It takes same options as
133
+ `vendor`, plus:
134
+
135
+ * `:url` -- address from which to download the archive. If not given,
136
+ module's name will be used as URL, and its basename as module's
137
+ name (e.g. `archive
138
+ "http://ftp.gnu.org/gnu/hello/hello-2.8.tar.gz"` will be named
139
+ `"hello-2.8"` and downloaded from the URL).
140
+ * `:filename` -- a filename to download. Useful if URL doesn't
141
+ specify this nwell.
142
+ * `:type` -- `:targz`, `:tarbz2`, or `:zip`
143
+ * `:unpack` -- a command that will be used to unpack the file
144
+ * `:basename` -- defaults to basename of `filename`, will be used as
145
+ directory name
146
+ * `:no_strip_root` -- by default, if archive consists of a single
147
+ directory, Vendorificator will strip it. Setting this to true
148
+ disables this behaviour.
149
+ * `:checksum` -- if set to SHA256 checksum of the file, it will be
150
+ checked on download.
151
+
152
+ Archive's `:version` defaults to file name.
153
+
154
+ Example:
155
+
156
+ ```ruby
157
+ archive :hello,
158
+ :url => 'http://ftp.gnu.org/gnu/hello/hello-2.8.tar.gz',
159
+ :version => '2.8',
160
+ :checksum => 'e6b77f81f7cf7daefad4a9f5b65de6cae9c3f13b8cfbaea8cb53bb5ea5460d73'
161
+ ```
162
+
163
+ #### git
164
+
165
+ Downloads snapshot of a Git repository. Takes the same options as
166
+ `vendor`, plus:
167
+
168
+ * `:repository` -- address of the repository. Defaults to name (and
169
+ sets name to its basename then), just like `:url` for `archive`
170
+ (e.g. `git "git://github.com/github/testrepo.git"` will be cloned
171
+ from that repository, and named `testrepo`).
172
+ * `:branch`, `:revision` -- what to check out when repository is
173
+ cloned.
174
+
175
+ Git module's `:version` defaults to the conjured revision.
176
+
177
+ Example:
178
+
179
+ ```ruby
180
+ git 'git://github.com/mpasternacki/nagios.git',
181
+ :branch => 'COOK-1997',
182
+ :category => :cookbooks,
183
+ :version => '0.20130124.2'
184
+ ```
185
+
186
+ #### chef_cookbook
187
+
188
+ Downloads an Opscode Chef cookbook from http://community.opscode.com/
189
+ website (same thing that `knife cookbook site install` does). It
190
+ resolves dependencies -- all needed modules will be downloaded by
191
+ default. Its category defaults to `:cookbooks`. It may take the same
192
+ arguments as `archive` (but the name and possibly version is almost
193
+ always enough), plus:
194
+
195
+ * `:ignore_dependencies` -- if true, ignore dependencies
196
+ completely. If an array, don't download dependencies that are in
197
+ the array. Default for that is `chef_cookbook_ignore_dependencies`
198
+ setting.
199
+
200
+ Examples:
201
+
202
+ ```ruby
203
+ chef_cookbook 'apt'
204
+ chef_cookbook 'memcached'
205
+ chef_cookbook 'chef-server', :ignore_dependences => true
206
+ ```
207
+
208
+ ```ruby
209
+ chef_cookbook_ignore_dependencies ['runit']
210
+ chef_cookbook 'memcached'
211
+ ```
212
+
213
+ ```ruby
214
+ chef_cookbook 'memcached', ignore_dependencies => ['runit']
215
+ ```
216
+
217
+ If you get Chef cookbooks from Git or anywhere else than Opscode's
218
+ community website, you can still use dependency resolution by mixing
219
+ in the hook class:
220
+
221
+ ```ruby
222
+ class << git 'git://github.com/user/cookbook.git', :category => :cookbooks
223
+ include Vendorificator::Hooks::ChefCookbookDependencies
224
+ end
225
+ ```
226
+
227
+ This is a bit convoluted, but there will soon be an argument to do
228
+ that in a nicer way.
38
229
 
39
230
  ## Contributing
40
231
 
@@ -5,11 +5,9 @@ Scenario: A single cookbook, without dependencies
5
5
  Scenario: Version & checksum
6
6
  Given a repository with following Vendorfile:
7
7
  """ruby
8
- require 'vendorificator/vendor/chef_cookbook'
9
-
10
8
  chef_cookbook 'apt'
11
9
  """
12
- When I run "vendor"
10
+ When I run "vendor sync"
13
11
  Then following has been conjured:
14
12
  | Name | cookbooks/apt |
15
13
  | With file | metadata.rb |
@@ -17,11 +15,9 @@ Scenario: Version & checksum
17
15
  Scenario: Dependency hook
18
16
  Given a repository with following Vendorfile:
19
17
  """ruby
20
- require 'vendorificator/vendor/chef_cookbook'
21
-
22
18
  chef_cookbook 'memcached'
23
19
  """
24
- When I run "vendor"
20
+ When I run "vendor sync"
25
21
  Then following has been conjured:
26
22
  | Name | cookbooks/memcached | cookbooks/runit |
27
23
  | With file | metadata.rb | metadata.rb |
@@ -29,16 +25,33 @@ Scenario: Dependency hook
29
25
  Scenario: Ignored dependency
30
26
  Given a repository with following Vendorfile:
31
27
  """ruby
32
- require 'vendorificator/vendor/chef_cookbook'
33
-
34
28
  chef_cookbook_ignore_dependencies ['runit']
35
-
36
29
  chef_cookbook 'memcached'
37
30
  """
38
- When I run "vendor"
31
+ When I run "vendor sync"
39
32
  Then following has been conjured:
40
33
  | Name | cookbooks/memcached |
41
34
  | With file | metadata.rb |
42
35
  And following has not been conjured:
43
36
  | Name | cookbooks/runit |
44
37
  | With file | metadata.rb |
38
+
39
+ Scenario: Ignored all dependencies
40
+ Given a repository with following Vendorfile:
41
+ """ruby
42
+ chef_cookbook_ignore_dependencies true
43
+ chef_cookbook 'chef-server'
44
+ """
45
+ When I run "vendor sync"
46
+ Then following has been conjured:
47
+ | Name | cookbooks/chef-server |
48
+ | With file | metadata.rb |
49
+ And following has not been conjured:
50
+ | Name | cookbooks/runit |
51
+ | With file | metadata.rb |
52
+ And following has not been conjured:
53
+ | Name | cookbooks/daemontools |
54
+ | With file | metadata.rb |
55
+ And following has not been conjured:
56
+ | Name | cookbooks/apache2 |
57
+ | With file | metadata.rb |
@@ -2372,4 +2372,685 @@ http_interactions:
2372
2372
  string: ! '{"error_messages":["Resource does not exist"],"error_code":"NOT_FOUND"}'
2373
2373
  http_version: '1.1'
2374
2374
  recorded_at: Fri, 01 Feb 2013 18:47:12 GMT
2375
+ - request:
2376
+ method: get
2377
+ uri: http://cookbooks.opscode.com/api/v1/cookbooks/chef-server
2378
+ body:
2379
+ encoding: US-ASCII
2380
+ string: ''
2381
+ headers:
2382
+ accept:
2383
+ - ! '*/*'
2384
+ user-agent:
2385
+ - Ruby
2386
+ response:
2387
+ status:
2388
+ code: 200
2389
+ message: OK
2390
+ headers:
2391
+ server:
2392
+ - nginx/1.0.5
2393
+ date:
2394
+ - Sat, 02 Feb 2013 18:10:19 GMT
2395
+ content-type:
2396
+ - application/json; charset=utf-8
2397
+ connection:
2398
+ - keep-alive
2399
+ status:
2400
+ - 200 OK
2401
+ x-runtime:
2402
+ - '120'
2403
+ cache-control:
2404
+ - private, max-age=0, must-revalidate
2405
+ set-cookie:
2406
+ - logged-in-username=; domain=.opscode.com; path=/
2407
+ - _sandbox_session=eyJzZXNzaW9uX2lkIjoiNTZjNDY4ZWYwMzkyNzY3NDdjYWEzZGE3ODg2MzUxYjAiLCJsb2NhdGlvbiI6eyJhY3Rpb24iOiJzaG93IiwiaWQiOiJjaGVmLXNlcnZlciIsImNvbnRyb2xsZXIiOiJhcGkvdjEvY29va2Jvb2tzIn19--f8b9737a8b6006284bd4828f470097c4bb804cbd;
2408
+ domain=.opscode.com; path=/; HttpOnly
2409
+ content-length:
2410
+ - '758'
2411
+ etag:
2412
+ - ! '"6ddf0a9e2de4ae6e63f2948aeb98b5f2"'
2413
+ body:
2414
+ encoding: US-ASCII
2415
+ string: ! '{"maintainer":"opscode","updated_at":"2012-11-26T01:02:01Z","category":"Utilities","external_url":"github.com/opscode-cookbooks/chef-server","latest_version":"http://cookbooks.opscode.com/api/v1/cookbooks/chef-server/versions/1_1_0","created_at":"2011-05-03T13:54:53Z","average_rating":null,"name":"chef-server","versions":["http://cookbooks.opscode.com/api/v1/cookbooks/chef-server/versions/1_1_0","http://cookbooks.opscode.com/api/v1/cookbooks/chef-server/versions/1_0_0","http://cookbooks.opscode.com/api/v1/cookbooks/chef-server/versions/0_99_12","http://cookbooks.opscode.com/api/v1/cookbooks/chef-server/versions/0_99_11","http://cookbooks.opscode.com/api/v1/cookbooks/chef-server/versions/0_99_10"],"description":"Installs
2416
+ and configures Chef Server"}'
2417
+ http_version: '1.1'
2418
+ recorded_at: Sat, 02 Feb 2013 18:10:20 GMT
2419
+ - request:
2420
+ method: get
2421
+ uri: http://cookbooks.opscode.com/api/v1/cookbooks/chef-server/versions/1_1_0
2422
+ body:
2423
+ encoding: US-ASCII
2424
+ string: ''
2425
+ headers:
2426
+ accept:
2427
+ - ! '*/*'
2428
+ user-agent:
2429
+ - Ruby
2430
+ response:
2431
+ status:
2432
+ code: 200
2433
+ message: OK
2434
+ headers:
2435
+ server:
2436
+ - nginx/1.0.5
2437
+ date:
2438
+ - Sat, 02 Feb 2013 18:10:19 GMT
2439
+ content-type:
2440
+ - application/json; charset=utf-8
2441
+ connection:
2442
+ - keep-alive
2443
+ status:
2444
+ - 200 OK
2445
+ etag:
2446
+ - ! '"3f5257f87da094ff8a4a4a6d2ed82a07"'
2447
+ set-cookie:
2448
+ - logged-in-username=; domain=.opscode.com; path=/
2449
+ - _sandbox_session=eyJzZXNzaW9uX2lkIjoiZTVhMTQwNTAzMjA5YWMyNDMxZDllOTJiMTA0MzY1NmEiLCJsb2NhdGlvbiI6eyJjb29rYm9va19pZCI6ImNoZWYtc2VydmVyIiwiY29udHJvbGxlciI6ImFwaS92MS9jb29rYm9va192ZXJzaW9ucyIsImlkIjoiMV8xXzAiLCJhY3Rpb24iOiJzaG93In19--94011b94ebf69c3bf33559b400e4b8316464c187;
2450
+ domain=.opscode.com; path=/; HttpOnly
2451
+ cache-control:
2452
+ - private, max-age=0, must-revalidate
2453
+ content-length:
2454
+ - '362'
2455
+ x-runtime:
2456
+ - '131'
2457
+ body:
2458
+ encoding: US-ASCII
2459
+ string: ! '{"tarball_file_size":24907,"version":"1.1.0","file":"http://s3.amazonaws.com/community-files.opscode.com/cookbook_versions/tarballs/2451/original/chef-server.tgz?1353891710","created_at":"2012-11-26T01:01:53Z","cookbook":"http://cookbooks.opscode.com/api/v1/cookbooks/chef-server","license":"Apache
2460
+ 2.0","average_rating":null,"updated_at":"2012-11-26T01:01:53Z"}'
2461
+ http_version: '1.1'
2462
+ recorded_at: Sat, 02 Feb 2013 18:10:20 GMT
2463
+ - request:
2464
+ method: get
2465
+ uri: http://s3.amazonaws.com/community-files.opscode.com/cookbook_versions/tarballs/2451/original/chef-server.tgz?1353891710
2466
+ body:
2467
+ encoding: US-ASCII
2468
+ string: ''
2469
+ headers:
2470
+ accept:
2471
+ - ! '*/*'
2472
+ user-agent:
2473
+ - Ruby
2474
+ response:
2475
+ status:
2476
+ code: 200
2477
+ message: OK
2478
+ headers:
2479
+ x-amz-id-2:
2480
+ - 8EyI7PGag1vh8CtWeHpxSMNMYua3ZOTXfblA27zkczQg6QNiAU1O1cWBbSZT1NBD
2481
+ x-amz-request-id:
2482
+ - 11511F2E851F7F7E
2483
+ date:
2484
+ - Sat, 02 Feb 2013 18:10:23 GMT
2485
+ last-modified:
2486
+ - Mon, 26 Nov 2012 01:02:06 GMT
2487
+ etag:
2488
+ - ! '"f5f46683f0fb341eaea7fee9bf2f7f57"'
2489
+ accept-ranges:
2490
+ - bytes
2491
+ content-type:
2492
+ - application/octet-stream
2493
+ content-length:
2494
+ - '24907'
2495
+ server:
2496
+ - AmazonS3
2497
+ body:
2498
+ encoding: ASCII-8BIT
2499
+ string: !binary |-
2500
+ H4sIAH6/slAAA+19+0PbRrbw/qy/YtZJF2htY94NbXqXAmnZTSALZNt+Sa4j
2501
+ 2zKoyJIryYDb5P7t33nNaCTL2CaEJK117zZYmseZM2fOa86ZaZ973VrixZde
2502
+ vPy3D/Q0Go2tjQ1F/27yv43Vdf5XHrWy2thY31jb2tjaVI2V9c1G429q40MB
2503
+ ZD+DJHVjAOXX1O+1vLjnhuXloFi3e0M7Mg7z72fytK35r5/5qX8WRrF3t30A
2504
+ PjbX12+Y/7X1wvxvbmxu/E017haM8ucvPv/11iDsBJ5Tb7tACk79wk/h39Bp
2505
+ +aHzsWGbPx/+sde/m6ax3xqkXnK3omB2/r+5tbk55//38djzv/vjzuEP+0+P
2506
+ fqj3OnfZxwT+vwLsvjj/6yvrc/5/H8+DB+pypb5Sb2w7zpfq5e7R0b9rK5tr
2507
+ W69VTe35sddOo3io2rHnpn4UKj9UFsWo5DwaBB3V8hSUHMSJf+nZrXyNrVjl
2508
+ t9UzH9QL1Y2iTjsGZaOtuv71oJ+o0PM6Xsequ76GdXehrjrhvnaj6KIF/4M2
2509
+ ksQPz9R+HLjwD4D0zEvdjpu6as/re2EnydrZ2qSRDBJP9QM37UZxr9l1e34w
2510
+ LA6lLc07DqOkkUPJ140VbMftdJTbc38HTAR+OLjOvn+9qfsByan6bnoOLYaJ
2511
+ n6RemAbDDCJQdrCkd913ww702woGXt8PAtWJvCRcSNW5e+mpjtd1B0GqLl34
2512
+ DPiKVRh1PEdBo4MwZRgb9UeP6iurFpSwegjjUa/vtlPlQqvpuacufe8qw8mj
2513
+ zUdY6A2Puxm6Pe+NAljMGzfw3cRL4GWCY+j6Z4PYbQWeyuSDAgS8Qew1ZWK3
2514
+ wzM/vK714+h6KK3lPrt9VC/k+1yx+HSeHP8/Ojw9Pvj+xenB4Z2KgJv5/+pG
2515
+ Y2utwP+3GuuNOf+/j+cB8NWQlzXy1DRSR/2kDbzG8NvEcX6CtR976ixwO2oY
2516
+ DdSVG6ZYtK2reqUV/65Ogft0/ThJHeCDfeUnxI86XgKSBav4PeAIwO7wLfz1
2517
+ K4ibuuP8Al203RBqAh/BT26YXHlxgjWAA/soidxAdWPvtwFxV+BUF15Hwa8E
2518
+ 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
2878
+ W2OztqqqQhFh8C+VrCxxNTwFUhA7oRqW1LXwkoLpamFJU8vD288oAG38uPIl
2879
+ NbrprawioqKRQya/fvT1GhTkY+7HrzP8LNtveE4LhuC1XTKbqdlx9jL8QBO5
2880
+ YldC+/qmSvB9pA5OPdXB4rkvdK159uVjs9XP5pkg/7Pjnd6jjwnyv7G1ulKU
2881
+ /6tb8/jfe3ky+Y+H7H9A6V8q5Ofc+r24tdv7rc8+sQpeUgiscGbON2H9X9Zy
2882
+ GfA1mMqaHMI2fR+T1n9jvbj+N9ZX5/m/9/I8+DtGQy8n54537bVVcgkzDIpU
2883
+ mqr6Mp4ROZekf+5nxvU/89rHZ9L6X18Zyf/c3Jiv/3t5svWPWRCPP4uMDWZV
2884
+ q9/9Y4X/0qAse+Fl4XjpGU9s+etxu+nWv+x13kr630r+r8zl//08c/n/135m
2885
+ Wv+3kv6T1//GanH/Z31tY57/dS/Pn1P+v/e5Dar2fHy9fJay7JF9QcnOnx27
2886
+ nGn9k2t+di1gdvm/ubo+3/+7l2cu///azy3W/537/0bPf91Yn5//dD/Pn1n+
2887
+ 38EpfTPrAXKe3mejDUy5/vFC4lta/7eR/+ubjbn8v5dnLv//2s8M6/+W1v/k
2888
+ 9b+2tjZy/uPqfP//Xp4/qfwHep1zrmmeqeK/8cqxeufWYeCNmeO/Vzc35ve/
2889
+ 3Mszy/znttZmEAUT+P/66krx/MfNxuZc/7uXR/h/ywUJgBFf+e3TEzwScNCX
2890
+ SxTz92/L1cAUquzFUvmC7zDcVjX1aEM1NuAl33tPl5tuq5Ncpez6SX2rnhWK
2891
+ XnecBw8eqO/3fzg4VAeHB6fwnydH0ODzOLr0odXtPLDw5Vgu1KsR3NvqIYmu
2892
+ ZjdRD0MvxTMj1cPY60Wph++MpFD6rmJZCPmWov77NHRyHg2CDCAMW+6oh5iz
2893
+ bn+kPka+xWltL4e8GWZD7d0a7Yj1/cM9C+cIDl8n3R2EbBcHfit246FT5xxZ
2894
+ 4RD6c+KQZH6cRb7lLqp9/bICREe2c2X0hpeKA/b32ePC5TKO81LVutxbMkyY
2895
+ zpYfYlH1GpMR66XfHId/PX74x+7R4ZODH2pZuLFhZXHrnQPmOuYOQLnnB3t4
2896
+ WkhtLOza7q/kL1mBFt45QCgX0s7To91/U0PLly5pURfLyaAF8DFkWPbMFP3B
2897
+ LnlWgC/A0nw/cAKlj57T/Yw1PO4ASWJxSTI6AUPX6iHpRK/V27fKu/ZTtaE/
2898
+ ddVDxoX1cZNTUdvnEYZKPKwQieH9jATituJjMfnoU36naqCDtVVF2qqo2lP4
2899
+ IUOpoL+k8lBwWYE/BWpuJ/bSSzd4/PB/TK8C20P+omreb6rB05nivea08Aif
2900
+ uv4gDnVpOu4Blo4Zvj2MqN8fGcaFHwR4hCm6gzSMXGJm6OIe4XMCdHKmqjIQ
2901
+ IrjyB7znIkHkdkwBqYFfYHm3veb47/F5E/5OB4n5+EABZSrOPcF7Qzteirds
2902
+ hnTFvXXTLN4OCiXpHs6IruPl4F6/rbhFDSL8WYIru+/mbxlo+p36DvSHy+Vw
2903
+ EASspEOFtgudVB6uVIAHZQhYcnSIq9Ugopdos2G+Plwxf37zjUFkeW1N2TfV
2904
+ Fiwu3VgE8X5zF1s31KfZqxVbsed0dEjYfEmPxYJ4Hq+M4G0aD2sjo7kZHZqE
2905
+ Cq1+mdWndfSw8iIBmwzkUkP9wZ0h0t9yy281AGOAectjfGuj4V0l6wFBWnW8
2906
+ xG079Dcsuo+tCf01n5n1/5ybezobYJL+v7U5sv+71Zjv/9zLU6r/57ZPSrTO
2907
+ kUIl2v+WaqyNav8UlkEHVY5RQkE9AjJMQEyk3pm+PT4GzRiV7mlNgjxotzIL
2908
+ vFvbAfek+Y9O1KjS/77Y/liWgD2snDWQ/3D3FgFztfcyB3L8EXdQ7t4uyHVB
2909
+ tgHuXiKoR8entfXGeuOd44WX8GL/8L8Hx0eHeCJiLdvUfOe4HbcPuiGU2Nnb
2910
+ eX66f1xLz3143z73g44MHS2N3R8Pnu4JAk5uhQHeCH3nYOYmNHiyf/zf/ePm
2911
+ C/iXdhbeOZS4mX354fjoxXP59ClZPLvjLZ4+WjwwARXcOq48BMxX1Cuj6pin
2912
+ 5sJHQbzYSTl0w7sBvENEwZ8/wJ+EmtK2MrtKVf6RqdufuJWl5mbW3MwqFpmb
2913
+ WR/VzLql/j/TRvBE/X9lJP9jY3N9rv/fx3OD/j9B6yzR+WHq1sfo/B9c238P
2914
+ 9/8N2wizOP+LzdyfATBO9f8Mlf4Sdf9DKPrmYKv31vQ/qI5fpt03PgXtfq7X
2915
+ m2eu18/1+rleP1Jkrtd/Ftsns+v/eCTUbGGgk/T/xubo/Q9rc///vTw5/V8Z
2916
+ AwD12THhJnRQlISbeHQRS4klsK4amyOWwEjFfAjLbGE/FOI5o84/o25/P+E7
2917
+ ZfgsaPNTIu6jae50V66tt9ML1Nq9u9Xa+Ti699HZ5TbhO1bW5Z7eT0u1/bMF
2918
+ 6czVzLmaOVJkrmZ+Fmrm/PlEn6nuf/gI+R9r8/P/7+WZZf4/TP7HCvwo5v9v
2919
+ Ntbm9//dy/Pg70onAE4yu7JnUt4FCdtsi8SYVoX0iHGGHJpTt2pjj8nWBkOt
2920
+ qjW1rjZyX00HoCiuqM1yc43tNeXmR1tmZdEZylF/GPtn56BGtpfUaqPxqLYK
2921
+ pK2O+mDddLyqOgjb6tvAO3ODf0b8rt6Oet+VJN3oZ9yejwVK3ur+egOWTtHq
2922
+ JkGfKGgn34sfaouhh7A4I/mfSSEB1Er9zKV9mkxQZ29n/9nR4ePb5Hw4eDfr
2923
+ 4/yrvf2T3cIrsfbGdzE+NcNx8Ihksr0YTkvpQmMY7OLlIGkRr6tZ5jDYZDEb
2924
+ qpopPkRYcyZs7ovjgB7/Uv0dbbDp4FSvv0HFH1Xu3gUehT1dNQcXYnQFtgxu
2925
+ u2w/pC2Waet2fUfmqwmW6snjCluMD9nmRgvxoSAbbceHYvfC9x/3nzT3f36+
2926
+ c7i3f9zcOf7hBAx9MVOagGYxNOCvx6Ruo1fk8UO8WRkQ+TubnRWxztgSW6Fv
2927
+ hK5lNPyWsQiXsIu0e53Hb9puahVahncBGk5vVRqrhVfAdxfgn3ABXrhXF2rh
2928
+ 8Pjx49WFN9QB2MI96Pnvj+EvBKoy2oX82SDbiYckwyH4ulBTcDI6AhwwgaeL
2929
+ YK8WXsg8s0lvTL+0XGXWpHMiJ8Id18bZRgAM0Yid1pT1jLagnjvd4UNrrh26
2930
+ HA05EFvRXpB4WSs1tB9quqkam8a1GjBnD/81RqbuQe9i1Wrt80E2RATS+kbu
2931
+ Dg1MrVaEpwAREGdmqMsX7UjI42Ya5ORdCgXMcIlc7xlCxmAk6k+DEPhG11WU
2932
+ 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
3053
+ 5s/8mT/zZ/7Mn8/5+f8QS8V/ADACAA==
3054
+ http_version: '1.1'
3055
+ recorded_at: Sat, 02 Feb 2013 18:10:23 GMT
2375
3056
  recorded_with: VCR 2.3.0
data/features/git.feature CHANGED
@@ -5,7 +5,7 @@ Scenario:
5
5
  """ruby
6
6
  git "file://#{ENV['FIXTURES_DIR']}/git/testrepo"
7
7
  """
8
- When I run "vendor"
8
+ When I run "vendor sync"
9
9
  Then following has been conjured:
10
10
  | Name | testrepo |
11
11
  | Version | 10e9ac58c77bc229d8c59a5b4eb7422916453148 |
@@ -6,11 +6,11 @@ Scenario: already downloaded tarball
6
6
  archive :testrepo, :version => '0.1',
7
7
  :url => 'http://test-assets.3ofcoins.net.s3-website-us-east-1.amazonaws.com/testrepo-0.1.tar.gz'
8
8
  """
9
- When I run "vendor"
9
+ When I run "vendor sync"
10
10
  Then I'm on "master" branch
11
11
  And command output includes /module\s+testrepo/
12
12
  And command output includes "testrepo-0.1.tar.gz"
13
- Then I run "vendor"
13
+ Then I run "vendor sync"
14
14
  And command output includes /module\s+testrepo/
15
15
  And command output includes /up to date\s+testrepo/
16
16
  And command output does not include "testrepo-0.1.tar.gz"
@@ -16,12 +16,12 @@ Scenario: status new module
16
16
  Then command output includes /new\s+generated\/0.23/
17
17
 
18
18
  Scenario: status up-to-date module
19
- When I run "vendor"
19
+ When I run "vendor sync"
20
20
  And I run "vendor status"
21
21
  Then command output includes /up to date\s+generated\/0.23/
22
22
 
23
23
  Scenario: status outdated modules
24
- When I run "vendor"
24
+ When I run "vendor sync"
25
25
  And I change Vendorfile to:
26
26
  """ruby
27
27
  vendor 'generated', :version => '0.42' do |v|
@@ -41,7 +41,7 @@ Scenario: Module's dependencies are statused if they are known
41
41
  And I run "vendor status"
42
42
  Then command output includes /new\s+memcached/
43
43
  And command output does not include "runit"
44
- When I run "vendor"
44
+ When I run "vendor sync"
45
45
  And I run "vendor status"
46
46
  Then command output includes /up to date\s+memcached/
47
47
  And command output includes /up to date\s+runit/
@@ -5,7 +5,7 @@ Scenario: just URL as name
5
5
  """ruby
6
6
  archive 'http://test-assets.3ofcoins.net.s3-website-us-east-1.amazonaws.com/testrepo-0.1.tar.gz'
7
7
  """
8
- When I run "vendor"
8
+ When I run "vendor sync"
9
9
  Then following has been conjured:
10
10
  | Name | testrepo-0.1 |
11
11
  | Version | testrepo-0.1.tar.gz |
@@ -17,7 +17,7 @@ Scenario: URL as keyword
17
17
  archive :testrepo,
18
18
  :url => 'http://test-assets.3ofcoins.net.s3-website-us-east-1.amazonaws.com/testrepo-0.1.tar.gz'
19
19
  """
20
- When I run "vendor"
20
+ When I run "vendor sync"
21
21
  Then following has been conjured:
22
22
  | Name | testrepo |
23
23
  | Version | testrepo-0.1.tar.gz |
@@ -31,7 +31,7 @@ Scenario: Version & checksum
31
31
  :version => '0.1',
32
32
  :checksum => 'ea207a896f929ffb3a1dfe128332d6134a18edab7c01b97bfb2b1c7eacebe0cb'
33
33
  """
34
- When I run "vendor"
34
+ When I run "vendor sync"
35
35
  Then following has been conjured:
36
36
  | Name | testrepo |
37
37
  | Version | 0.1 |
@@ -45,7 +45,7 @@ Scenario: Wrong checksum
45
45
  :version => '0.1',
46
46
  :checksum => 'incorrect'
47
47
  """
48
- When I try to run "vendor"
48
+ When I try to run "vendor sync"
49
49
  Then the command has failed
50
50
  Then following has not been conjured:
51
51
  | Name | testrepo |
@@ -57,7 +57,7 @@ Scenario: Tarball without a root directory
57
57
  archive :testrepo,
58
58
  :url => 'http://test-assets.3ofcoins.net.s3-website-us-east-1.amazonaws.com/testrepo-0.1-noroot.tar.gz'
59
59
  """
60
- When I run "vendor"
60
+ When I run "vendor sync"
61
61
  Then following has been conjured:
62
62
  | Name | testrepo |
63
63
  | With file | test/alias.c |
@@ -8,7 +8,7 @@ Scenario:
8
8
  FileUtils::rm Dir['test/archive*.c']
9
9
  end
10
10
  """
11
- When I run "vendor"
11
+ When I run "vendor sync"
12
12
  Then following has been conjured:
13
13
  | Name | testrepo |
14
14
  | With file | test/alias.c |
@@ -8,7 +8,7 @@ Scenario:
8
8
  File.open('VERSION', 'w') { |f| f.puts v.version }
9
9
  end
10
10
  """
11
- When I run "vendor"
11
+ When I run "vendor sync"
12
12
  Then the following has been conjured:
13
13
  | Name | generated |
14
14
  | Version | 0.23 |
@@ -9,7 +9,7 @@ module Vendorificator
9
9
  check_unknown_options! :except => [:git, :diff, :log]
10
10
  stop_on_unknown_option! :git, :diff, :log
11
11
 
12
- default_task :sync
12
+ default_task :help
13
13
 
14
14
  class_option :file, :aliases => '-f', :type => :string, :banner => 'PATH'
15
15
  class_option :debug, :aliases => '-d', :type => :boolean, :default => false
@@ -9,7 +9,6 @@ module Vendorificator
9
9
  extend Mixlib::Config
10
10
 
11
11
  configure do |c|
12
- c[:root] = Pathname.getwd
13
12
  c[:basedir] = 'vendor'
14
13
  c[:branch_prefix] = 'vendor'
15
14
  c[:modules] = []
@@ -27,7 +26,6 @@ module Vendorificator
27
26
  pathname.dirname
28
27
  end
29
28
  self[:vendorfile_path] = pathname
30
- self[:lockfile_path] = pathname.dirname.join(pathname.basename.to_s + '.lock')
31
29
  super(pathname.to_s)
32
30
  end
33
31
 
@@ -1,10 +1,16 @@
1
- require 'chef/cookbook/metadata'
2
-
3
1
  module Vendorificator::Hooks
4
2
  module ChefCookbookDependencies
3
+ def initialize(*args)
4
+ require 'chef/cookbook/metadata'
5
+ super
6
+ end
7
+
5
8
  # Add required Chef cookbooks to vendor modules
6
9
  def dependencies
7
- ignored = Vendorificator::Config[:chef_cookbook_ignore_dependencies] || []
10
+ ignored =
11
+ args.key?(:ignore_dependencies) ?
12
+ args[:ignore_dependencies] :
13
+ Vendorificator::Config[:chef_cookbook_ignore_dependencies]
8
14
  metadata = File.join(self.work_dir, 'metadata.rb')
9
15
 
10
16
  unless File.exist?(metadata)
@@ -15,9 +21,16 @@ module Vendorificator::Hooks
15
21
  cbmd = Chef::Cookbook::Metadata.new
16
22
  cbmd.from_file(metadata)
17
23
 
18
- super + cbmd.dependencies.
19
- reject { |name, version| ignored.include?(name) }.
20
- map { |name, version| Vendorificator::Vendor::ChefCookbook.new(name) }
24
+ if ignored && !ignored.respond_to?(:include?)
25
+ # ignored is a truthy value that's not a set-like thing, so we
26
+ # ignore all dependencies altogether.
27
+ super
28
+ else
29
+ deps = cbmd.dependencies.map(&:first)
30
+ deps.reject! { |n| ignored.include?(n) } if ignored.respond_to?(:include?)
31
+ deps.map! { |n| Vendorificator::Vendor::ChefCookbook.new(n) }
32
+ super + deps
33
+ end
21
34
  end
22
35
  end
23
36
  end
@@ -32,7 +32,7 @@ module Vendorificator
32
32
  end
33
33
  end
34
34
 
35
- attr_reader :config, :name, :args, :block
35
+ attr_reader :name, :args, :block
36
36
  arg_reader :version, :path
37
37
 
38
38
  def path
@@ -40,6 +40,8 @@ module Vendorificator
40
40
  end
41
41
 
42
42
  def initialize(name, args={}, &block)
43
+ @category = args.delete(:category)
44
+
43
45
  @name = name
44
46
  @args = args
45
47
  @block = block
@@ -51,7 +53,7 @@ module Vendorificator
51
53
  end
52
54
 
53
55
  def category
54
- self.class.category
56
+ @category || self.class.category
55
57
  end
56
58
 
57
59
  def branch_name
@@ -1,3 +1,3 @@
1
1
  module Vendorificator
2
- VERSION = "0.0.1"
2
+ VERSION = "0.1.0"
3
3
  end
@@ -7,3 +7,4 @@ require 'vendorificator/config'
7
7
  require 'vendorificator/vendor'
8
8
  require 'vendorificator/vendor/archive'
9
9
  require 'vendorificator/vendor/git'
10
+ require 'vendorificator/vendor/chef_cookbook'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vendorificator
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-02-02 00:00:00.000000000 Z
12
+ date: 2013-02-03 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: escape
@@ -266,7 +266,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
266
266
  version: '0'
267
267
  segments:
268
268
  - 0
269
- hash: 1339257298363592646
269
+ hash: 4082258902042132214
270
270
  required_rubygems_version: !ruby/object:Gem::Requirement
271
271
  none: false
272
272
  requirements:
@@ -275,7 +275,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
275
275
  version: '0'
276
276
  segments:
277
277
  - 0
278
- hash: 1339257298363592646
278
+ hash: 4082258902042132214
279
279
  requirements: []
280
280
  rubyforge_project:
281
281
  rubygems_version: 1.8.24