vendorificator 0.5.git.v0.4.0.17.g26d50d8 → 0.5.git.v0.4.0.60.g9c35209

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- YmMwNmEwMDhlYTI0Y2Q1MmQxY2E3MmFkZmNmYjE2Zjg3YTdiNGZlZQ==
4
+ ZWI0NzRjOTRjNDkzZTI2NjkyY2NhZDJhYjE4NDU3NGI5ZDIyZTY4Zg==
5
5
  data.tar.gz: !binary |-
6
- NzY3ZmNkZTRjOTNjMWQzNWJmMGFmZTJjNGJlYTViZTJmZmQ2NmZjYQ==
6
+ ZWQwNTNhNWFhMTY5ZDhhZWM0MjJjMTI2Y2IzZGU2ZTQ3NGY2ZGZlZA==
7
7
  !binary "U0hBNTEy":
8
8
  metadata.gz: !binary |-
9
- NDNmZGIwYzNhZGJjZjIwNTk3NzhlZDRjYWRkMDZlZmJhNmM4ODA2YWQ4MTBj
10
- MGUwZTFiZWNjZjI4ZmViNzQ5YmQ4OGU2ODdlYTNhNTg5OWQ5NmU5YWE0ZTM3
11
- NjJmODhkOGIxZTQzYTk0M2Y5ZmM4M2NmMTI0NWQ3OWQzMjE0NjM=
9
+ Y2Q1MDc2YjNmMzgxMWI1N2RhNjRmMWVkYzYzYTAyMjA4MTYzMjMwNmVkZmJi
10
+ MmNkY2FkN2VmMGM4MzdlMDFkM2VlMmZiYTM5MmRjM2VmM2M2YzJhNTk2M2Vh
11
+ M2FlNmQ5M2EzYjZhODNjYmZiNGIwZmViNGNlZmVjZDhjZTU4YjQ=
12
12
  data.tar.gz: !binary |-
13
- ODdlNmQzODdjNTA0MjBkZWFkYTMzMjkwZTdjNzNhNTE1ZmEzYzZhOTI3MTU4
14
- MjJmNjBmZTgwMTU4MjczNmYyZTFhMjUyNDQ2ZTEwZTUzYmNlODA2NDg2NjRl
15
- NDNlOTc5OTZlNmQ4ZWRhZDQzZjUwMDc2M2ExMWMyZDM5ZmMxNmU=
13
+ YjE3ZjE1MjYzYTc4NjFiZWU3MTM1MGI5MGE1OWQ4ZWZiZjY2NmZlMDFjNzFl
14
+ MTRhOTA1Yjc4N2ZlOTQ0ZWI3ZDk5ODAyZWFlZGJjMjE4MzhhM2FiNTA5NWJh
15
+ YTdlYjliY2MyNDIzMmFiNjY0MjQzYzhkM2RjMjhjZjEwYzM0ZjY=
data/Gemfile CHANGED
@@ -19,4 +19,5 @@ group :development_workstation do
19
19
  gem "pry"
20
20
  gem "awesome_print"
21
21
  gem "relish"
22
+ gem 'debugger'
22
23
  end
data/README.md CHANGED
@@ -57,8 +57,8 @@ detail.
57
57
  a Git remote
58
58
  * `vendor push` will push all vendor branches, tags, and notes to
59
59
  a Git remote
60
- * `vendor diff` will show the differences between vendor module's
61
- pristine branch and curent work tree
60
+ * `vendor diff` will show a `git diff` of vendor module's files between vendor
61
+ module's pristine branch and current work tree
62
62
  * `vendor log` will show a `git log` of all changes made to a particular
63
63
  vendor module's files that are not in module's pristine branch
64
64
 
@@ -112,10 +112,10 @@ It takes following options:
112
112
  * `:version` - the version of module. If the module's contents should
113
113
  change, increase the version, so that Vendorificator knows it needs
114
114
  to re-create the module.
115
- * `:category` - module's *category* is subdirectory of the basedir
115
+ * `:group` - module's *group* is subdirectory of the basedir
116
116
  where module's directory will be created. For example, `vendor
117
117
  "foo"` will go to `vendor/foo` by default, but `vendor "foo",
118
- :category => :widgets` will go to `vendor/widgets/foo`. It is also
118
+ :group => :widgets` will go to `vendor/widgets/foo`. It is also
119
119
  added in a similar way to module's branch name, tag names, etc.
120
120
  * `:path` - lets you specify subdirectory in which the module will be
121
121
  downloaded
@@ -197,7 +197,7 @@ Example:
197
197
  ```ruby
198
198
  git 'git://github.com/mpasternacki/nagios.git',
199
199
  :branch => 'COOK-1997',
200
- :category => :cookbooks,
200
+ :group => :cookbooks,
201
201
  :version => '0.20130124.2'
202
202
  ```
203
203
 
@@ -206,7 +206,7 @@ git 'git://github.com/mpasternacki/nagios.git',
206
206
  Downloads an Opscode Chef cookbook from http://community.opscode.com/
207
207
  website (same thing that `knife cookbook site install` does). It
208
208
  resolves dependencies -- all needed modules will be downloaded by
209
- default. Its category defaults to `:cookbooks`. It may take the same
209
+ default. Its group defaults to `:cookbooks`. It may take the same
210
210
  arguments as `archive` (but the name and possibly version is almost
211
211
  always enough), plus:
212
212
 
@@ -238,7 +238,7 @@ option to add it:
238
238
 
239
239
  ```ruby
240
240
  git 'git://github.com/user/cookbook.git',
241
- :category => :cookbooks,
241
+ :group => :cookbooks,
242
242
  :hooks => 'ChefCookbookDependencies'
243
243
  end
244
244
  ```
@@ -5,7 +5,7 @@ Scenario: A single cookbook, without dependencies
5
5
  """ruby
6
6
  chef_cookbook 'apt'
7
7
  """
8
- When I run vendor command "sync"
8
+ When I run vendor command "install"
9
9
  Then following has been conjured:
10
10
  | Name | cookbooks/apt |
11
11
  | With file | metadata.rb |
@@ -15,7 +15,7 @@ Scenario: Dependency hook
15
15
  """ruby
16
16
  chef_cookbook 'memcached'
17
17
  """
18
- When I run vendor command "sync"
18
+ When I run vendor command "install"
19
19
  Then following has been conjured:
20
20
  | Name | cookbooks/memcached | cookbooks/runit |
21
21
  | With file | metadata.rb | metadata.rb |
@@ -26,7 +26,7 @@ Scenario: Ignored dependency
26
26
  chef_cookbook_ignore_dependencies ['runit']
27
27
  chef_cookbook 'memcached'
28
28
  """
29
- When I run vendor command "sync"
29
+ When I run vendor command "install"
30
30
  Then following has been conjured:
31
31
  | Name | cookbooks/memcached |
32
32
  | With file | metadata.rb |
@@ -40,7 +40,7 @@ Scenario: Ignored all dependencies
40
40
  chef_cookbook_ignore_dependencies true
41
41
  chef_cookbook 'chef-server'
42
42
  """
43
- When I run vendor command "sync"
43
+ When I run vendor command "install"
44
44
  Then following has been conjured:
45
45
  | Name | cookbooks/chef-server |
46
46
  | With file | metadata.rb |
@@ -5,7 +5,7 @@ Scenario: just URL as name
5
5
  """ruby
6
6
  download 'http://test-assets.3ofcoins.net.s3-website-us-east-1.amazonaws.com/testrepo-0.1.tar.gz'
7
7
  """
8
- When I run vendor command "sync"
8
+ When I run vendor command "install"
9
9
  Then following has been conjured:
10
10
  | Name | testrepo-0.1.tar.gz |
11
11
  And there's a git commit note including "ea207a" in "download_checksum"
@@ -7,7 +7,7 @@ Scenario: module with a .gitignore file
7
7
  File.open('.gitignore', 'w') { |f| f.puts 'ignored.txt' }
8
8
  end
9
9
  """
10
- When I run vendor command "sync"
10
+ When I run vendor command "install"
11
11
  Then the following has been conjured:
12
12
  | Name | ignore |
13
13
  | With file | .gitignore |
@@ -25,7 +25,7 @@ Scenario: module with a .gitignore file
25
25
  File.open('.gitignore', 'w') { |f| f.puts 'ignored.txt' }
26
26
  end
27
27
  """
28
- And I run vendor command "sync"
28
+ And I run vendor command "install"
29
29
  Then the file "vendor/ignore/files.txt" should not contain "ignored.txt"
30
30
  And the file "vendor/ignore/ignored.txt" should contain exactly:
31
31
  """
@@ -8,7 +8,7 @@ Scenario: Pushing to remote repo
8
8
  end
9
9
  """
10
10
  And a remote repository
11
- When I run vendor command "sync"
11
+ When I run vendor command "install"
12
12
  And I run vendor command "push"
13
13
  Then branch "vendor/generated" exists in the remote repo
14
14
  And tag "vendor/generated/0.23" exists in the remote repo
@@ -23,7 +23,7 @@ Scenario: Getting module information
23
23
  end
24
24
  """
25
25
  And a remote repository
26
- When I run vendor command "sync"
26
+ When I run vendor command "install"
27
27
  And I run vendor command "info generated"
28
28
  Then the last vendor output should match /Module merged version: 0.23/
29
29
  And the last vendor output should match /unparsed_args/
@@ -36,7 +36,58 @@ Scenario: Getting revision information
36
36
  end
37
37
  """
38
38
  And a remote repository
39
- When I run vendor command "sync"
39
+ When I run vendor command "install"
40
40
  And I run vendor command "info HEAD^2"
41
41
  Then the last vendor output should match /master, vendor\/generated/
42
42
  Then the last vendor output should match /:unparsed_args/
43
+
44
+ Scenario: Working with empty Vendorfile
45
+ Given a repository with following Vendorfile:
46
+ """ruby
47
+ """
48
+ And a remote repository
49
+ When I run vendor command "sync"
50
+ And I run vendor command "list"
51
+ Then the last vendor output should match /\A\z/
52
+
53
+ Scenario: Running tasks without Vendorfile where they don't need it
54
+ Given a directory named "foo"
55
+ When I cd to "foo"
56
+ And I run vendor command "help"
57
+ Then the last vendor output should match /diff \[MODULE \[MODULE \.\.\.\]\]/
58
+ And the last vendor output should not match /Vendorfile not found/
59
+
60
+ Scenario: Running tasks without Vendorfile where they need it
61
+ Given a directory named "foo"
62
+ When I cd to "foo"
63
+ And I run vendor command "pull"
64
+ Then the last vendor output should match /Vendorfile not found/
65
+
66
+ Scenario: Getting module list
67
+ Given a repository with following Vendorfile:
68
+ """ruby
69
+ vendor 'generated', :version => '0.23' do |v|
70
+ File.open('README', 'w') { |f| f.puts "Hello, World!" }
71
+ end
72
+ """
73
+ When I run vendor command "install"
74
+ And I run vendor command "list"
75
+ Then the last vendor output should match /Module: generated, version: 0.23/
76
+
77
+ Scenario: Getting list of outdated modules
78
+ Given a repository with following Vendorfile:
79
+ """ruby
80
+ vendor 'generated', :version => '0.23' do |v|
81
+ File.open('README', 'w') { |f| f.puts "Hello, World!" }
82
+ end
83
+ """
84
+ When I run vendor command "install"
85
+ And I change Vendorfile to:
86
+ """ruby
87
+ vendor 'generated', :version => '0.42' do |v|
88
+ File.open('README', 'w') { |f| f.puts "Hello, Updated, World!" }
89
+ File.open('VERSION', 'w') { |f| f.puts v.version }
90
+ end
91
+ """
92
+ And I run vendor command "outdated"
93
+ Then the last vendor output should match /outdated\s+generated/
data/features/git.feature CHANGED
@@ -5,7 +5,7 @@ Scenario: Vendorificating a git repo
5
5
  """ruby
6
6
  git "file://#{ENV['FIXTURES_DIR']}/git/testrepo"
7
7
  """
8
- When I run vendor command "sync"
8
+ When I run vendor command "install"
9
9
  Then following has been conjured:
10
10
  | Name | testrepo |
11
11
  | Version | 10e9ac58c77bc229d8c59a5b4eb7422916453148 |
@@ -19,7 +19,7 @@ Scenario: Vendorificating a subdirectory from a git repo
19
19
  git "file://#{ENV['FIXTURES_DIR']}/git/testrepo",
20
20
  :subdirectory => 'test'
21
21
  """
22
- When I run vendor command "sync"
22
+ When I run vendor command "install"
23
23
  Then following has been conjured:
24
24
  | Name | testrepo |
25
25
  | Version | 10e9ac58c77bc229d8c59a5b4eb7422916453148 |
@@ -33,7 +33,7 @@ Scenario: Vendorificating a certain branch from a git repo
33
33
  git "file://#{ENV['FIXTURES_DIR']}/git/testrepo",
34
34
  :branch => 'topic/pink'
35
35
  """
36
- When I run vendor command "sync"
36
+ When I run vendor command "install"
37
37
  Then following has been conjured:
38
38
  | Name | testrepo |
39
39
  | Version | ecbfa229ba5f11c05b18bcc4f7c32b8f25d63f8c |
@@ -47,7 +47,7 @@ Scenario: Vendorificating a certain tag from a git repo
47
47
  git "file://#{ENV['FIXTURES_DIR']}/git/testrepo",
48
48
  :tag => 'email-v0'
49
49
  """
50
- When I run vendor command "sync"
50
+ When I run vendor command "install"
51
51
  Then following has been conjured:
52
52
  | Name | testrepo |
53
53
  | Version | email-v0 |
@@ -62,7 +62,7 @@ Scenario: Vendorificating a certain revision from a git repo
62
62
  git "file://#{ENV['FIXTURES_DIR']}/git/testrepo",
63
63
  :revision => '6ff1be'
64
64
  """
65
- When I run vendor command "sync"
65
+ When I run vendor command "install"
66
66
  Then following has been conjured:
67
67
  | Name | testrepo |
68
68
  | Version | 6ff1be9c3819c93a2f41e0ddc09f252fcf154f34 |
@@ -6,12 +6,12 @@ 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 command "sync"
9
+ When I run vendor command "install"
10
10
  Then I'm on "master" branch
11
11
  And the last vendor output should match /module\s+testrepo/
12
12
  And the last vendor output should match "testrepo-0.1.tar.gz"
13
13
 
14
- When I run vendor command "sync"
14
+ When I run vendor command "install"
15
15
  Then the last vendor output should match /module\s+testrepo/
16
16
  And the last vendor output should match /up to date\s+testrepo/
17
17
  And the last vendor output should not match "testrepo-0.1.tar.gz"
@@ -16,12 +16,12 @@ Scenario: status new module
16
16
  Then the last vendor output should match /new\s+generated\/0.23/
17
17
 
18
18
  Scenario: status up-to-date module
19
- When I run vendor command "sync"
19
+ When I run vendor command "install"
20
20
  And I run vendor command "status"
21
21
  Then the last vendor output should match /up to date\s+generated\/0.23/
22
22
 
23
23
  Scenario: status outdated modules
24
- When I run vendor command "sync"
24
+ When I run vendor command "install"
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 command "status"
42
42
  Then the last vendor output should match /new\s+memcached/
43
43
  And the last vendor output should not match "runit"
44
- When I run vendor command "sync"
44
+ When I run vendor command "install"
45
45
  And I run vendor command "status"
46
46
  Then the last vendor output should match /up to date\s+memcached/
47
47
  And the last vendor output should match /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 command "sync"
8
+ When I run vendor command "install"
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 command "sync"
20
+ When I run vendor command "install"
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 command "sync"
34
+ When I run vendor command "install"
35
35
  Then following has been conjured:
36
36
  | Name | testrepo |
37
37
  | Version | 0.1 |
@@ -48,7 +48,7 @@ Scenario: Wrong checksum
48
48
  :version => '0.1',
49
49
  :checksum => 'incorrect'
50
50
  """
51
- When I run `vendor sync`
51
+ When I run `vendor install`
52
52
  Then it should fail
53
53
  And following has not been conjured:
54
54
  | Name | testrepo |
@@ -60,7 +60,7 @@ Scenario: Tarball without a root directory
60
60
  archive :testrepo,
61
61
  :url => 'http://test-assets.3ofcoins.net.s3-website-us-east-1.amazonaws.com/testrepo-0.1-noroot.tar.gz'
62
62
  """
63
- When I run vendor command "sync"
63
+ When I run vendor command "install"
64
64
  Then following has been conjured:
65
65
  | Name | testrepo |
66
66
  | 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 command "sync"
11
+ When I run vendor command "install"
12
12
  Then following has been conjured:
13
13
  | Name | testrepo |
14
14
  | With file | test/alias.c |
@@ -20,7 +20,7 @@ Scenario: Use Gem bundler to download rubygems, and Vendorificator to vendor the
20
20
  source "file://#{ENV['FIXTURES_DIR']}/rubygems"
21
21
  gem "hello"
22
22
  """
23
- When I run vendor command "sync"
23
+ When I run vendor command "install"
24
24
  Then following has been conjured:
25
25
  | Name | bundler |
26
26
  | Path | cache |
@@ -33,7 +33,7 @@ Scenario: Bundler correctly downloads and caches dependencies
33
33
  source "file://#{ENV['FIXTURES_DIR']}/rubygems"
34
34
  gem "first"
35
35
  """
36
- When I run vendor command "sync"
36
+ When I run vendor command "install"
37
37
  Then following has been conjured:
38
38
  | Name | bundler |
39
39
  | Path | cache |
@@ -47,7 +47,7 @@ Scenario: directory contents are completely replaced on re-vendoring
47
47
  source "file://#{ENV['FIXTURES_DIR']}/rubygems"
48
48
  gem "hello"
49
49
  """
50
- When I run vendor command "sync"
50
+ When I run vendor command "install"
51
51
  Then following has been conjured:
52
52
  | Name | bundler |
53
53
  | Path | cache |
@@ -58,7 +58,7 @@ Scenario: directory contents are completely replaced on re-vendoring
58
58
  source "file://#{ENV['FIXTURES_DIR']}/rubygems"
59
59
  gem "first"
60
60
  """
61
- And I run vendor command "sync"
61
+ And I run vendor command "install"
62
62
  Then following has been conjured:
63
63
  | Name | bundler |
64
64
  | Path | cache |
@@ -14,7 +14,7 @@ Scenario: rubygems_bundler
14
14
  source "file://#{ENV['FIXTURES_DIR']}/rubygems"
15
15
  gem "hello"
16
16
  """
17
- When I run vendor command "sync"
17
+ When I run vendor command "install"
18
18
  Then following has been conjured:
19
19
  | Name | rubygems |
20
20
  | Path | cache |
@@ -35,7 +35,7 @@ Scenario: chef_berkshelf
35
35
  And I successfully run `berks install`
36
36
  And I successfully run `git add Berksfile Berksfile.lock`
37
37
  And I successfully run `git commit -m Berksfile`
38
- When I run vendor command "sync"
38
+ When I run vendor command "install"
39
39
  Then following has been conjured:
40
40
  | Name | cookbooks |
41
41
  | With file | build-essential/metadata.rb |
@@ -9,7 +9,7 @@ Scenario:
9
9
  File.open('VERSION', 'w') { |f| f.puts v.version }
10
10
  end
11
11
  """
12
- When I run vendor command "sync"
12
+ When I run vendor command "install -v 1"
13
13
  Then the following has been conjured:
14
14
  | Name | generated |
15
15
  | Version | 0.23 |
@@ -14,6 +14,7 @@ require 'vendorificator'
14
14
 
15
15
  module Vendorificator
16
16
  class CLI < Thor
17
+ VERBOSITY_LEVELS = {1 => :quiet, 2 => :default, 3 => :chatty, 9 => :debug}
17
18
  attr_reader :environment
18
19
 
19
20
  check_unknown_options! :except => [:git, :diff, :log]
@@ -21,18 +22,16 @@ module Vendorificator
21
22
 
22
23
  default_task :help
23
24
 
24
- class_option :file, :aliases => '-f', :type => :string,
25
- :banner => 'PATH'
26
- class_option :debug, :aliases => '-d', :type => :boolean, :default => false
27
- class_option :quiet, :aliases => '-q', :type => :boolean, :default => false
25
+ class_option :file, :aliases => '-f', :type => :string, :banner => 'PATH'
28
26
  class_option :modules, :aliases => '-m', :type => :string, :default => '',
29
27
  :banner => 'mod1,mod2,...,modN',
30
28
  :desc => 'Run only for specified modules (name or path, comma separated)'
31
29
  class_option :version, :type => :boolean
32
- class_option :help, :aliases => '-h', :type => :boolean
30
+ class_option :verbose, :aliases => '-v', :type => :numeric
33
31
 
34
- def initialize(args=[], options={}, config={})
32
+ def initialize(args = [], options = {}, config = {})
35
33
  super
34
+ parse_options
36
35
 
37
36
  if self.options[:debug]
38
37
  MiniGit.debug = true
@@ -43,13 +42,11 @@ module Vendorificator
43
42
  exit
44
43
  end
45
44
 
46
- if self.options[:help] && config[:current_task].name != 'help'
47
- invoke :help, [ config[:current_task].name ]
48
- exit
49
- end
50
-
51
- @environment = Vendorificator::Environment.new(self.options[:file])
52
- environment.shell = shell
45
+ @environment = Vendorificator::Environment.new(
46
+ shell,
47
+ VERBOSITY_LEVELS[self.options[:verbose]] || :default,
48
+ self.options[:file]
49
+ )
53
50
 
54
51
  class << shell
55
52
  # Make say_status always say it.
@@ -62,16 +59,37 @@ module Vendorificator
62
59
  desc :sync, "Download new or updated vendor files"
63
60
  method_option :update, :type => :boolean, :default => false
64
61
  def sync
62
+ say_status 'DEPRECATED', 'Using vendor sync is deprecated and will be removed in future versions. Use vendor install or vendor update instead.', :yellow
63
+ environment.sync options.merge(:modules => modules)
64
+ rescue DirtyRepoError
65
+ fail! 'Repository is not clean.'
66
+ rescue MissingVendorfileError
67
+ fail! "Vendorfile not found. Vendorificator needs to run in the directory containing Vendorfile or config/vendor.rb."
68
+ end
69
+
70
+ desc :install, "Download and install new or updated vendor files"
71
+ def install(*modules)
65
72
  environment.sync options.merge(:modules => modules)
66
73
  rescue DirtyRepoError
67
74
  fail! 'Repository is not clean.'
68
75
  end
69
76
 
77
+ desc :update, "Update installed vendor files"
78
+ def update(*modules)
79
+ environment.sync options.merge(:modules => modules, :update => true)
80
+ rescue DirtyRepoError
81
+ fail! 'Repository is not clean.'
82
+ end
83
+
70
84
  desc "status", "List known vendor modules and their status"
71
85
  method_option :update, :type => :boolean, :default => false
72
86
  def status
73
- say_status 'WARNING', 'Git repository is not clean', :red unless environment.clean?
74
87
  environment.config[:use_upstream_version] = options[:update]
88
+ environment.load_vendorfile
89
+
90
+ say_status 'DEPRECATED', 'Using vendor status is deprecated and will be removed in future versions', :yellow
91
+ say_status 'WARNING', 'Git repository is not clean', :red unless environment.clean?
92
+
75
93
  environment.each_vendor_instance(*modules) do |mod|
76
94
  status_line = mod.to_s
77
95
 
@@ -87,11 +105,25 @@ module Vendorificator
87
105
  say_status( mod.status.to_s.gsub('_', ' '), status_line,
88
106
  ( mod.status == :up_to_date ? :green : :yellow ) )
89
107
  end
108
+ rescue MissingVendorfileError
109
+ fail! "Vendorfile not found. Vendorificator needs to run in the directory containing Vendorfile or config/vendor.rb."
90
110
  end
91
111
 
92
112
  desc 'info MODULE', "Show module information"
93
113
  def info(mod_name)
94
114
  environment.info mod_name, options
115
+ rescue MissingVendorfileError
116
+ fail! "Vendorfile not found. Vendorificator needs to run in the directory containing Vendorfile or config/vendor.rb."
117
+ end
118
+
119
+ desc :list, 'List all currently installed modules'
120
+ def list
121
+ environment.list
122
+ end
123
+
124
+ desc :outdated, 'List all currently installed modules'
125
+ def outdated
126
+ environment.outdated
95
127
  end
96
128
 
97
129
  desc :pull, "Pull upstream branches from a remote repository"
@@ -101,6 +133,8 @@ module Vendorificator
101
133
  environment.pull_all options
102
134
  rescue DirtyRepoError
103
135
  fail! 'Repository is not clean.'
136
+ rescue MissingVendorfileError
137
+ fail! "Vendorfile not found. Vendorificator needs to run in the directory containing Vendorfile or config/vendor.rb."
104
138
  end
105
139
 
106
140
  desc :push, "Push local changes back to the remote repository"
@@ -109,10 +143,12 @@ module Vendorificator
109
143
  environment.push options
110
144
  rescue DirtyRepoError
111
145
  fail! 'Repository is not clean.'
146
+ rescue MissingVendorfileError
147
+ fail! "Vendorfile not found. Vendorificator needs to run in the directory containing Vendorfile or config/vendor.rb."
112
148
  end
113
149
 
114
- desc "git GIT_COMMAND [GIT_ARGS [...]]",
115
- "Run a git command for specified modules"
150
+ desc "git GIT_COMMAND [MODULE [MODULE ...]] [-- GIT_OPTIONS]",
151
+ "Run a git command for specified module(s)"
116
152
  long_desc <<EOF
117
153
  Run a git command for specified modules. Within GIT_ARGS arguments,
118
154
  you can use @MERGED@ and @PATH@ tags, which will be substituted with
@@ -122,17 +158,18 @@ module Vendorificator
122
158
  The 'diff' and 'log' commands are simple aliases for 'git' command.
123
159
 
124
160
  Examples:
125
- vendor git log @MERGED@..HEAD -- @PATH@ # basic 'vendor log'
126
- vendor git diff --stat @MERGED@ -- @PATH@ # 'vendor diff', as diffstat
161
+ vendor git log my_module -- @MERGED@..HEAD -- @PATH@ # basic 'vendor log'
162
+ vendor git diff module1 module2 -- --stat @MERGED@ -- @PATH@ # 'vendor diff', as diffstat
127
163
  EOF
128
164
  def git(command, *args)
165
+ modules, git_options = split_git_options(args)
129
166
  environment.each_vendor_instance(*modules) do |mod|
130
167
  unless mod.merged
131
- say_status 'unmerged', mod.to_s, :red unless options[:only_changed]
168
+ say_status 'unmerged', mod.to_s, :red
132
169
  next
133
170
  end
134
171
 
135
- actual_args = args.dup.map do |arg|
172
+ actual_args = git_options.dup.map do |arg|
136
173
  arg.
137
174
  gsub('@MERGED@', mod.merged).
138
175
  gsub('@PATH@', mod.work_dir)
@@ -143,16 +180,18 @@ EOF
143
180
  end
144
181
  end
145
182
 
146
- desc "diff [OPTIONS] [GIT OPTIONS]",
183
+ desc "diff [MODULE [MODULE ...]] [-- GIT_OPTIONS]",
147
184
  "Show differences between work tree and upstream module(s)"
148
185
  def diff(*args)
149
- invoke :git, %w'diff' + args + %w'@MERGED@ -- @PATH@'
186
+ modules, git_options = split_git_options(args)
187
+ invoke :git, %w'diff' + modules + %w'--' + git_options + %w'@MERGED@ -- @PATH@'
150
188
  end
151
189
 
152
- desc "log [OPTIONS] [GIT OPTIONS]",
190
+ desc "log [MODULE [MODULE ...]] [-- GIT_OPTIONS]",
153
191
  "Show git log of commits added to upstream module(s)"
154
192
  def log(*args)
155
- invoke :git, %w'log' + args + %w'@MERGED@..HEAD -- @PATH@'
193
+ modules, git_options = split_git_options(args)
194
+ invoke :git, %w'log' + modules + %w'--' + git_options + %w'@MERGED@..HEAD -- @PATH@'
156
195
  end
157
196
 
158
197
  desc :pry, 'Pry into the binding', :hide => true
@@ -184,21 +223,36 @@ EOF
184
223
 
185
224
  private
186
225
 
226
+ # Private: Parses general vendorificator options.
227
+ #
228
+ # Returns nothing.
229
+ def parse_options
230
+ if options[:version]
231
+ say "Vendorificator #{Vendorificator::VERSION}"
232
+ exit
233
+ end
234
+
235
+ if options[:verbose] && (!VERBOSITY_LEVELS.keys.include? options[:verbose])
236
+ fail! "Unknown verbosity level: #{options[:verbose].inspect}"
237
+ end
238
+ end
239
+
187
240
  def split_git_options(args)
188
- case i = args.index('--git-options')
189
- when nil then [ args, [] ]
190
- when 0 then [ [], args[1..-1] ]
191
- else [ args[0..(i-1)], args[(i+1)..-1] ]
241
+ case i = args.index('--')
242
+ when nil then [args, []]
243
+ when 0 then [[], args[1..-1]]
244
+ else [args[0..(i - 1)], args[(i + 1)..-1]]
192
245
  end
193
246
  end
194
247
 
195
248
  def modules
249
+ say_status 'DEPRECATED', 'Using --modules option is deprecated and will be removed in future versions.', :yellow unless options[:modules].empty?
196
250
  options[:modules].split(',').map(&:strip)
197
251
  end
198
252
 
199
- def fail!(message, exception_message='I give up.')
253
+ def fail!(message, exception_message = 'I give up.')
200
254
  say_status('FATAL', message, :red)
201
- raise Thor::Error, 'I give up.'
255
+ raise Thor::Error, exception_message
202
256
  end
203
257
 
204
258
  end