mgit 0.2.0 → 0.2.1

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
- Yjg1YmQxYjM1YTZkYTU5Yzg0N2E4MzAwNWZmYTU3ZDQ0MTRhY2I0Yg==
4
+ MjEzMDA0N2Y1ODg5MDZmMmJiYmY4YTMxNjkwOGY4NGE2NTVmYWE2Yw==
5
5
  data.tar.gz: !binary |-
6
- MmJiYWNkNWNhYmUxMDQwYzBjYzg0Mjc0YjRhMDlkM2QxM2EzZWEzNQ==
6
+ YjA2NTMwODQ0MGQ5YjA1MmM1ZDhhOWMxYTY0MmY0ZjM0ZDQxN2NhOA==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- OWI0ZWRhMWJiYWNjYmM0YTgyMDQyYzkwMjA1OWViY2U1MTY0MDRiN2RjZWY3
10
- NDQ2ZTIzY2YzODQ5YmI2ZmRiMTkzMmIyM2YxODhhMmZmOTcxMGNlZjBjZDY3
11
- MTI2MGFjNWNiOGM0ZGQ2MmVjOTMwOGU1MGU0NzljN2UwZjJlNjg=
9
+ MzMwMDJmODQ1YTMyOTEyZjg3NmQwODY4ZjhiNWYwOTMxYmVjMDhjMDU3MjJh
10
+ NGYwNTNhYzA3NTRmZGQ0MTMwZmRhYTFmMGFjNTM1OGY4MjExYjUyY2VjZTg2
11
+ YTc1YmI5M2MxZDBkZWE2YTc5ZDE2MzI0YmJjOWQ5NjMxZTgzOTQ=
12
12
  data.tar.gz: !binary |-
13
- NTQ1MmI2NTA4OGQ2NDRlMjc4YTFlNGY4NWNmNDcwNDY0NjFmMWNkZWI2MDkz
14
- ZTdmNjNiOGRmMzlhY2RmNTZmODJiOGNiOTY4MjFmYmIyMTU0ZTA3YjJmNTlh
15
- ZjM2NzhhNmZhNWE4MGFiMzIwNzc5YTBhMmE5YWRmMjBmZjlhODc=
13
+ OTIwMWFiMWIzMDQ2NjE4Nzk0YjQ5OWFhMTFiMmU0MmMxZWY4YTk3YmI1MTFl
14
+ MDI3OTE5NzNmMDhlMDliOGVhODRjNzU1MTcyM2M0NGVhZDdiZjcyNmE4NzNh
15
+ NDQ1YjNmYTA4ZDQ3NDE5Yzc2OWJmMGViNWI5YTViNTFiN2U1MjQ=
data/lib/mgit/cli.rb CHANGED
@@ -2,10 +2,11 @@ module MGit
2
2
  class CLI
3
3
  def start
4
4
  raise NoCommandError if ARGV.size == 0
5
- command = Command.create(ARGV.shift)
6
- command.execute(ARGV)
5
+ command = Command.execute(ARGV.shift, ARGV)
7
6
  rescue UsageError => e
8
7
  $stderr.puts e
8
+ rescue GitError => e
9
+ $stderr.puts e
9
10
  end
10
11
  end
11
12
  end
data/lib/mgit/command.rb CHANGED
@@ -3,14 +3,14 @@ module MGit
3
3
  @@commands = {}
4
4
  @@aliases = {}
5
5
 
6
- def self.create(cmd)
7
- cmd = cmd.downcase.to_sym
8
- klass = @@commands[cmd] || @@aliases[cmd]
9
- if klass
10
- klass.new
11
- else
12
- raise UnknownCommandError.new(cmd)
13
- end
6
+ def self.execute(name, args)
7
+ cmd = self.create(name)
8
+
9
+ arity_min, arity_max = cmd.arity
10
+ raise TooFewArgumentsError.new(cmd) if arity_min && args.size < arity_min
11
+ raise TooManyArgumentsError.new(cmd) if arity_max && args.size > arity_max
12
+
13
+ cmd.execute(args)
14
14
  end
15
15
 
16
16
  def self.register_command(cmd)
@@ -31,6 +31,10 @@ module MGit
31
31
  end
32
32
  end
33
33
 
34
+ def arity
35
+ raise ImplementationError.new("Command #{self.class.name} doesn't implement the arity method.")
36
+ end
37
+
34
38
  def usage
35
39
  raise ImplementationError.new("Command #{self.class.name} doesn't implement the usage method.")
36
40
  end
@@ -42,5 +46,17 @@ module MGit
42
46
  def description
43
47
  raise ImplementationError.new("Command #{self.class.name} doesn't implement the description method.")
44
48
  end
49
+
50
+ private
51
+
52
+ def self.create(cmd)
53
+ cmd = cmd.downcase.to_sym
54
+ klass = @@commands[cmd] || @@aliases[cmd]
55
+ if klass
56
+ klass.new
57
+ else
58
+ raise UnknownCommandError.new(cmd)
59
+ end
60
+ end
45
61
  end
46
62
  end
@@ -1,17 +1,19 @@
1
1
  module MGit
2
2
  class AddCommand < Command
3
3
  def execute(args)
4
- raise TooFewArgumentsError.new(self) if args.size == 0
5
- raise TooManyArgumentsError.new(self) if args.size > 2
6
-
7
4
  path = File.expand_path(args[0])
8
5
  raise CommandUsageError.new('First argument must be a path to a git repository.', self) unless is_git_dir?(path)
9
6
 
10
7
  name = (args.size == 2) ? args[1] : (ask('Name of the repository? ') { |q| q.default = File.basename(path) })
11
-
8
+ raise CommandUsageError.new("Repository named #{name} already exists with different path.", self) unless is_new_or_same?(name, path)
9
+
12
10
  Registry.add(name, path)
13
11
  end
14
12
 
13
+ def arity
14
+ [1, 2]
15
+ end
16
+
15
17
  def usage
16
18
  'add <path_to_git_repository> [name]'
17
19
  end
@@ -24,6 +26,11 @@ module MGit
24
26
 
25
27
  private
26
28
 
29
+ def is_new_or_same?(name, path)
30
+ repo = Registry.find { |r| r.name == name }
31
+ repo.nil? || repo.path == path
32
+ end
33
+
27
34
  def is_git_dir?(path)
28
35
  File.directory?(path) && (File.directory?(File.join(path, '.git')) || File.file?(File.join(path, 'HEAD')))
29
36
  end
@@ -0,0 +1,32 @@
1
+ module MGit
2
+ class CloneCommand < Command
3
+ def execute(args)
4
+ log = `git clone #{args.join(' ')}`
5
+ raise GitError.new('Clone command failed.') if $?.exitstatus != 0
6
+
7
+ m = /Cloning into '(.*)'/.match(log.split("\n").first)
8
+ puts m[1]
9
+ Command.execute('add', [m[1]])
10
+ end
11
+
12
+ def arity
13
+ [1, nil]
14
+ end
15
+
16
+ def usage
17
+ 'clone [options] <url> [<directory>]'
18
+ end
19
+
20
+ def description
21
+ 'clone repository and add to mgit'
22
+ end
23
+
24
+ register_command :clone
25
+
26
+ private
27
+
28
+ def option?(arg)
29
+ arg.start_with?('-')
30
+ end
31
+ end
32
+ end
@@ -1,8 +1,6 @@
1
1
  module MGit
2
2
  class FetchCommand < Command
3
3
  def execute(args)
4
- raise TooManyArgumentsError.new(self) if args.size != 0
5
-
6
4
  Registry.chdir_each do |repo|
7
5
  `git remote`.split.each do |remote|
8
6
  puts "Fetching #{remote} in repository #{repo.name}...".yellow
@@ -11,6 +9,10 @@ module MGit
11
9
  end
12
10
  end
13
11
 
12
+ def arity
13
+ [nil, 0]
14
+ end
15
+
14
16
  def usage
15
17
  'fetch'
16
18
  end
@@ -1,8 +1,6 @@
1
1
  module MGit
2
2
  class FFMergeCommand < Command
3
3
  def execute(args)
4
- raise TooManyArgumentsError.new(self) if args.size != 0
5
-
6
4
  Registry.chdir_each do |repo|
7
5
  if repo.dirty?
8
6
  puts "Skipping repository #{repo.name} since it's dirty.".red
@@ -20,6 +18,10 @@ module MGit
20
18
  end
21
19
  end
22
20
 
21
+ def arity
22
+ [nil, 0]
23
+ end
24
+
23
25
  def usage
24
26
  'ffmerge'
25
27
  end
@@ -1,8 +1,6 @@
1
1
  module MGit
2
2
  class ForEachCommand < Command
3
3
  def execute(args)
4
- raise TooFewArgumentsError.new(self) if args.size == 0
5
-
6
4
  command = args.join(' ')
7
5
 
8
6
  Registry.chdir_each do |repo|
@@ -13,6 +11,10 @@ module MGit
13
11
  end
14
12
  end
15
13
 
14
+ def arity
15
+ [1, nil]
16
+ end
17
+
16
18
  def usage
17
19
  'foreach <command...>'
18
20
  end
@@ -1,9 +1,6 @@
1
1
  module MGit
2
2
  class GrepCommand < Command
3
3
  def execute(args)
4
- raise TooFewArgumentsError.new(self) if args.size == 0
5
- raise TooManyArgumentsError.new(self) if args.size > 1
6
-
7
4
  ptrn = args[0]
8
5
 
9
6
  Registry.chdir_each do |repo|
@@ -13,6 +10,10 @@ module MGit
13
10
  end
14
11
  end
15
12
 
13
+ def arity
14
+ [1, 1]
15
+ end
16
+
16
17
  def usage
17
18
  'grep <pattern>'
18
19
  end
@@ -1,8 +1,6 @@
1
1
  module MGit
2
2
  class HelpCommand < Command
3
3
  def execute(args)
4
- raise TooManyArgumentsError.new(self) if args.size > 1
5
-
6
4
  if args.size == 0
7
5
  puts "M[eta]Git - manage multiple git repositories at the same time"
8
6
  puts
@@ -15,6 +13,10 @@ module MGit
15
13
  end
16
14
  end
17
15
 
16
+ def arity
17
+ [0, 1]
18
+ end
19
+
18
20
  def usage
19
21
  'help [command]'
20
22
  end
@@ -1,8 +1,6 @@
1
1
  module MGit
2
2
  class ListCommand < Command
3
3
  def execute(args)
4
- raise TooManyArgumentsError.new(self) if args.size != 0
5
-
6
4
  Registry.each do |repo|
7
5
  nc = 24
8
6
  display = (repo.name.size > nc) ? (repo.name[0..(nc - 3)] + '...') : repo.name.ljust(nc, ' ')
@@ -10,6 +8,10 @@ module MGit
10
8
  end
11
9
  end
12
10
 
11
+ def arity
12
+ [nil, 0]
13
+ end
14
+
13
15
  def usage
14
16
  'list'
15
17
  end
@@ -15,6 +15,10 @@ module MGit
15
15
  end
16
16
  end
17
17
 
18
+ def arity
19
+ [nil, 0]
20
+ end
21
+
18
22
  def usage
19
23
  'log'
20
24
  end
@@ -1,9 +1,6 @@
1
1
  module MGit
2
2
  class RemoveCommand < Command
3
3
  def execute(args)
4
- raise TooFewArgumentsError.new(self) if args.size == 0
5
- raise TooManyArgumentsError.new(self) if args.size > 1
6
-
7
4
  ptrn = args[0]
8
5
 
9
6
  repo = Registry.find do |repo|
@@ -16,6 +13,10 @@ module MGit
16
13
  puts "Removed repository #{repo.name}.".yellow
17
14
  end
18
15
 
16
+ def arity
17
+ [1, 1]
18
+ end
19
+
19
20
  def usage
20
21
  'remove <name/path>'
21
22
  end
@@ -3,8 +3,6 @@ require 'set'
3
3
  module MGit
4
4
  class StatusCommand < Command
5
5
  def execute(args)
6
- raise TooManyArgumentsError.new(self) if args.size != 0
7
-
8
6
  Registry.chdir_each do |repo|
9
7
  nc = 36
10
8
  display = (repo.name.size > nc) ? (repo.name[0..(nc - 3)] + '...') : repo.name.ljust(nc, ' ')
@@ -12,6 +10,10 @@ module MGit
12
10
  end
13
11
  end
14
12
 
13
+ def arity
14
+ [nil, 0]
15
+ end
16
+
15
17
  def usage
16
18
  'status'
17
19
  end
@@ -1,10 +1,13 @@
1
1
  module MGit
2
2
  class VersionCommand < Command
3
3
  def execute(args)
4
- raise TooManyArgumentsError.new(self) if args.size != 0
5
4
  puts "mgit version #{MGit::VERSION}"
6
5
  end
7
6
 
7
+ def arity
8
+ [nil, 0]
9
+ end
10
+
8
11
  def usage
9
12
  'version'
10
13
  end
@@ -1,6 +1,16 @@
1
1
  module MGit
2
2
  class ImplementationError < StandardError; end
3
3
 
4
+ class GitError < StandardError
5
+ def initialize(error)
6
+ @error = error
7
+ end
8
+
9
+ def to_s
10
+ "Git error: #{@error}"
11
+ end
12
+ end
13
+
4
14
  class UsageError < StandardError
5
15
  def initialize(error, usage)
6
16
  @error = error
data/lib/mgit/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module MGit
2
- VERSION = '0.2.0'
2
+ VERSION = '0.2.1'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mgit
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - FlavourSys Technology GmbH
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-10-21 00:00:00.000000000 Z
11
+ date: 2013-11-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: colorize
@@ -62,6 +62,7 @@ files:
62
62
  - lib/mgit/exceptions.rb
63
63
  - lib/mgit/cli.rb
64
64
  - lib/mgit/command.rb
65
+ - lib/mgit/commands/clone.rb
65
66
  - lib/mgit/commands/add.rb
66
67
  - lib/mgit/commands/list.rb
67
68
  - lib/mgit/commands/help.rb