vendorificator 0.0.1 → 0.1.0

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