git-multirepo 1.0.0.beta39 → 1.0.0.beta40

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.
Files changed (63) hide show
  1. checksums.yaml +4 -4
  2. data/.gitattributes +2 -2
  3. data/.gitbugtraq +3 -3
  4. data/.gitignore +38 -38
  5. data/.multirepo.meta +2 -2
  6. data/.rspec +2 -2
  7. data/Gemfile +4 -4
  8. data/Gemfile.lock +42 -42
  9. data/LICENSE +22 -22
  10. data/README.md +146 -145
  11. data/Rakefile +2 -2
  12. data/bin/multi +10 -10
  13. data/docs/bug-repros/91565510-repro.sh +20 -20
  14. data/git-multirepo.gemspec +31 -31
  15. data/lib/commands.rb +15 -14
  16. data/lib/git-multirepo.rb +2 -2
  17. data/lib/info.rb +4 -4
  18. data/lib/multirepo/commands/add-command.rb +53 -53
  19. data/lib/multirepo/commands/branch-command.rb +82 -82
  20. data/lib/multirepo/commands/checkout-command.rb +122 -122
  21. data/lib/multirepo/commands/clean-command.rb +31 -31
  22. data/lib/multirepo/commands/clone-command.rb +70 -70
  23. data/lib/multirepo/commands/command.rb +75 -75
  24. data/lib/multirepo/commands/do-command.rb +76 -0
  25. data/lib/multirepo/commands/fetch-command.rb +30 -30
  26. data/lib/multirepo/commands/graph-command.rb +45 -45
  27. data/lib/multirepo/commands/init-command.rb +119 -119
  28. data/lib/multirepo/commands/install-command.rb +103 -103
  29. data/lib/multirepo/commands/merge-command.rb +167 -167
  30. data/lib/multirepo/commands/open-command.rb +57 -57
  31. data/lib/multirepo/commands/remove-command.rb +50 -50
  32. data/lib/multirepo/commands/uninit-command.rb +20 -20
  33. data/lib/multirepo/commands/update-command.rb +60 -60
  34. data/lib/multirepo/config.rb +15 -15
  35. data/lib/multirepo/files/config-entry.rb +38 -38
  36. data/lib/multirepo/files/config-file.rb +45 -45
  37. data/lib/multirepo/files/lock-entry.rb +24 -24
  38. data/lib/multirepo/files/lock-file.rb +38 -38
  39. data/lib/multirepo/files/meta-file.rb +40 -40
  40. data/lib/multirepo/files/tracking-file.rb +8 -8
  41. data/lib/multirepo/files/tracking-files.rb +46 -46
  42. data/lib/multirepo/git/branch.rb +30 -30
  43. data/lib/multirepo/git/change.rb +10 -10
  44. data/lib/multirepo/git/commit.rb +17 -17
  45. data/lib/multirepo/git/git-runner.rb +46 -46
  46. data/lib/multirepo/git/remote.rb +16 -16
  47. data/lib/multirepo/git/repo.rb +77 -77
  48. data/lib/multirepo/hooks/post-commit-hook.rb +22 -22
  49. data/lib/multirepo/hooks/pre-commit-hook.rb +31 -31
  50. data/lib/multirepo/logic/merge-descriptor.rb +12 -12
  51. data/lib/multirepo/logic/node.rb +44 -44
  52. data/lib/multirepo/logic/performer.rb +62 -62
  53. data/lib/multirepo/logic/revision-selector.rb +34 -34
  54. data/lib/multirepo/multirepo-exception.rb +5 -5
  55. data/lib/multirepo/utility/console.rb +51 -51
  56. data/lib/multirepo/utility/runner.rb +34 -34
  57. data/lib/multirepo/utility/utils.rb +81 -81
  58. data/resources/.gitconfig +2 -2
  59. data/resources/post-commit +5 -5
  60. data/resources/pre-commit +5 -5
  61. data/spec/integration/init_spec.rb +18 -18
  62. data/spec/spec_helper.rb +89 -89
  63. metadata +4 -3
data/Rakefile CHANGED
@@ -1,2 +1,2 @@
1
- require "bundler/gem_tasks"
2
-
1
+ require "bundler/gem_tasks"
2
+
data/bin/multi CHANGED
@@ -1,11 +1,11 @@
1
- #!/usr/bin/env ruby
2
-
3
- require "claide"
4
- require "commands"
5
-
6
- trap("INT") do
7
- puts "\rAbort, abort!!" # \r hides the interrupt control characters
8
- exit
9
- end
10
-
1
+ #!/usr/bin/env ruby
2
+
3
+ require "claide"
4
+ require "commands"
5
+
6
+ trap("INT") do
7
+ puts "\rAbort, abort!!" # \r hides the interrupt control characters
8
+ exit
9
+ end
10
+
11
11
  MultiRepo::Command.run(ARGV)
@@ -1,21 +1,21 @@
1
- echo "----> Setup a new test repo"
2
- dir_name="PreCommitHookAddTest"
3
- rm -rf $dir_name; mkdir $dir_name; cd $dir_name
4
- git init; git commit --allow-empty -m "Initial commit"
5
-
6
- echo "----> Add a pre-commit hook that stages a file that doesn't currently exist in the repo"
7
- echo "touch auto-added; git add auto-added" > .git/hooks/pre-commit
8
- chmod +x .git/hooks/pre-commit
9
-
10
- echo "----> Try committing a new file using the '-o' flag"
11
- touch manually-added; git add manually-added
12
- git commit -o -m "Commit that ran the pre-commit hook and should contain file 'auto-added'" -- manually-added
13
-
14
- echo "----> Results (expected: working copy clean; actual: auto-added is reported as both DELETED and UNTRACKED. HEAD and working copy are the same, staging area contains ‘incorrect' state)"
15
- git status
16
-
17
- echo "----> Stage the file after the fact"
18
- git add auto-added
19
-
20
- echo "----> Notice that the working copy is now clean"
1
+ echo "----> Setup a new test repo"
2
+ dir_name="PreCommitHookAddTest"
3
+ rm -rf $dir_name; mkdir $dir_name; cd $dir_name
4
+ git init; git commit --allow-empty -m "Initial commit"
5
+
6
+ echo "----> Add a pre-commit hook that stages a file that doesn't currently exist in the repo"
7
+ echo "touch auto-added; git add auto-added" > .git/hooks/pre-commit
8
+ chmod +x .git/hooks/pre-commit
9
+
10
+ echo "----> Try committing a new file using the '-o' flag"
11
+ touch manually-added; git add manually-added
12
+ git commit -o -m "Commit that ran the pre-commit hook and should contain file 'auto-added'" -- manually-added
13
+
14
+ echo "----> Results (expected: working copy clean; actual: auto-added is reported as both DELETED and UNTRACKED. HEAD and working copy are the same, staging area contains ‘incorrect' state)"
15
+ git status
16
+
17
+ echo "----> Stage the file after the fact"
18
+ git add auto-added
19
+
20
+ echo "----> Notice that the working copy is now clean"
21
21
  git status
@@ -1,31 +1,31 @@
1
- # coding: utf-8
2
- lib = File.expand_path('../lib', __FILE__)
3
- $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
- require 'info'
5
-
6
- Gem::Specification.new do |spec|
7
- spec.name = MultiRepo::NAME
8
- spec.version = MultiRepo::VERSION
9
- spec.authors = ["Michaël Fortin"]
10
- spec.email = ["fortinmike@irradiated.net"]
11
- spec.summary = %q{Track multiple Git repositories side-by-side}
12
- spec.description = MultiRepo::DESCRIPTION
13
- spec.homepage = "https://github.com/fortinmike/git-multirepo"
14
- spec.license = "MIT"
15
-
16
- spec.required_ruby_version = '~> 2.0'
17
- spec.files = `git ls-files -z`.split("\x0")
18
- spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
19
- spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
20
- spec.require_paths = ["lib"]
21
-
22
- spec.add_development_dependency "bundler", "~> 1.7"
23
- spec.add_development_dependency "rake", "~> 10.0"
24
- spec.add_development_dependency "rspec", "~> 3.1.0"
25
-
26
- spec.add_runtime_dependency "claide", "~> 0.8", ">= 0.8.0"
27
- spec.add_runtime_dependency "colored", "~> 1.2"
28
- spec.add_runtime_dependency "os", "~> 0.9.6"
29
- spec.add_runtime_dependency "terminal-table", "~> 1.4.5"
30
- spec.add_runtime_dependency "ruby-graphviz", "~> 1.2.1"
31
- end
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'info'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = MultiRepo::NAME
8
+ spec.version = MultiRepo::VERSION
9
+ spec.authors = ["Michaël Fortin"]
10
+ spec.email = ["fortinmike@irradiated.net"]
11
+ spec.summary = %q{Track multiple Git repositories side-by-side}
12
+ spec.description = MultiRepo::DESCRIPTION
13
+ spec.homepage = "https://github.com/fortinmike/git-multirepo"
14
+ spec.license = "MIT"
15
+
16
+ spec.required_ruby_version = '~> 2.0'
17
+ spec.files = `git ls-files -z`.split("\x0")
18
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
19
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
20
+ spec.require_paths = ["lib"]
21
+
22
+ spec.add_development_dependency "bundler", "~> 1.7"
23
+ spec.add_development_dependency "rake", "~> 10.0"
24
+ spec.add_development_dependency "rspec", "~> 3.1.0"
25
+
26
+ spec.add_runtime_dependency "claide", "~> 0.8", ">= 0.8.0"
27
+ spec.add_runtime_dependency "colored", "~> 1.2"
28
+ spec.add_runtime_dependency "os", "~> 0.9.6"
29
+ spec.add_runtime_dependency "terminal-table", "~> 1.4.5"
30
+ spec.add_runtime_dependency "ruby-graphviz", "~> 1.2.1"
31
+ end
data/lib/commands.rb CHANGED
@@ -1,15 +1,16 @@
1
- require_relative "multirepo/commands/command"
2
- require_relative "multirepo/commands/add-command"
3
- require_relative "multirepo/commands/branch-command"
4
- require_relative "multirepo/commands/checkout-command"
5
- require_relative "multirepo/commands/clean-command"
6
- require_relative "multirepo/commands/clone-command"
7
- require_relative "multirepo/commands/fetch-command"
8
- require_relative "multirepo/commands/graph-command"
9
- require_relative "multirepo/commands/init-command"
10
- require_relative "multirepo/commands/install-command"
11
- require_relative "multirepo/commands/merge-command"
12
- require_relative "multirepo/commands/open-command"
13
- require_relative "multirepo/commands/remove-command"
14
- require_relative "multirepo/commands/uninit-command"
1
+ require_relative "multirepo/commands/command"
2
+ require_relative "multirepo/commands/add-command"
3
+ require_relative "multirepo/commands/branch-command"
4
+ require_relative "multirepo/commands/checkout-command"
5
+ require_relative "multirepo/commands/clean-command"
6
+ require_relative "multirepo/commands/clone-command"
7
+ require_relative "multirepo/commands/do-command"
8
+ require_relative "multirepo/commands/fetch-command"
9
+ require_relative "multirepo/commands/graph-command"
10
+ require_relative "multirepo/commands/init-command"
11
+ require_relative "multirepo/commands/install-command"
12
+ require_relative "multirepo/commands/merge-command"
13
+ require_relative "multirepo/commands/open-command"
14
+ require_relative "multirepo/commands/remove-command"
15
+ require_relative "multirepo/commands/uninit-command"
15
16
  require_relative "multirepo/commands/update-command"
data/lib/git-multirepo.rb CHANGED
@@ -1,3 +1,3 @@
1
- require "multirepo/utility/console"
2
- require "multirepo/hooks/pre-commit-hook"
1
+ require "multirepo/utility/console"
2
+ require "multirepo/hooks/pre-commit-hook"
3
3
  require "multirepo/hooks/post-commit-hook"
data/lib/info.rb CHANGED
@@ -1,5 +1,5 @@
1
- module MultiRepo
2
- NAME = "git-multirepo"
3
- VERSION = "1.0.0.beta39"
4
- DESCRIPTION = "Track multiple Git repositories side-by-side."
1
+ module MultiRepo
2
+ NAME = "git-multirepo"
3
+ VERSION = "1.0.0.beta40"
4
+ DESCRIPTION = "Track multiple Git repositories side-by-side."
5
5
  end
@@ -1,54 +1,54 @@
1
- require "multirepo/utility/console"
2
- require "multirepo/files/config-file"
3
-
4
- module MultiRepo
5
- class AddCommand < Command
6
- self.command = "add"
7
- self.summary = "Track an additional dependency with multirepo."
8
-
9
- def self.options
10
- [['<path>', 'The relative path to the new dependency (e.g. ../MyNewDependency)']].concat(super)
11
- end
12
-
13
- def initialize(argv)
14
- @path = argv.shift_argument
15
- super
16
- end
17
-
18
- def validate!
19
- super
20
- help! "You must specify a repository to add as a dependency" unless @path
21
- end
22
-
23
- def run
24
- super
25
- ensure_in_work_tree
26
- ensure_multirepo_enabled
27
- ensure_repo_valid
28
-
29
- config_file = ConfigFile.new(".")
30
- entry = ConfigEntry.new(Repo.new(@path))
31
-
32
- if config_file.entry_exists?(entry)
33
- Console.log_info("There is already an entry for '#{@path}' in the .multirepo file")
34
- else
35
- config_file.add_entry(entry)
36
- Console.log_step("Added '#{@path}' to the .multirepo file")
37
- end
38
- rescue MultiRepoException => e
39
- Console.log_error(e.message)
40
- end
41
-
42
- def ensure_repo_valid
43
- raise MultiRepoException, "The provided path is not a direct sibling of the main repository" unless validate_is_sibling_repo(@path)
44
- raise MultiRepoException, "There is no folder at path '#{@path}'" unless Dir.exists?(@path)
45
- raise MultiRepoException, "'#{@path}' is not a repository" unless Repo.new(@path).exists?
46
- end
47
-
48
- def validate_is_sibling_repo(path)
49
- parent_dir = File.expand_path("..")
50
- path = File.expand_path("..", path)
51
- return parent_dir == path
52
- end
53
- end
1
+ require "multirepo/utility/console"
2
+ require "multirepo/files/config-file"
3
+
4
+ module MultiRepo
5
+ class AddCommand < Command
6
+ self.command = "add"
7
+ self.summary = "Track an additional dependency with multirepo."
8
+
9
+ def self.options
10
+ [['<path>', 'The relative path to the new dependency (e.g. ../MyNewDependency)']].concat(super)
11
+ end
12
+
13
+ def initialize(argv)
14
+ @path = argv.shift_argument
15
+ super
16
+ end
17
+
18
+ def validate!
19
+ super
20
+ help! "You must specify a repository to add as a dependency" unless @path
21
+ end
22
+
23
+ def run
24
+ super
25
+ ensure_in_work_tree
26
+ ensure_multirepo_enabled
27
+ ensure_repo_valid
28
+
29
+ config_file = ConfigFile.new(".")
30
+ entry = ConfigEntry.new(Repo.new(@path))
31
+
32
+ if config_file.entry_exists?(entry)
33
+ Console.log_info("There is already an entry for '#{@path}' in the .multirepo file")
34
+ else
35
+ config_file.add_entry(entry)
36
+ Console.log_step("Added '#{@path}' to the .multirepo file")
37
+ end
38
+ rescue MultiRepoException => e
39
+ Console.log_error(e.message)
40
+ end
41
+
42
+ def ensure_repo_valid
43
+ raise MultiRepoException, "The provided path is not a direct sibling of the main repository" unless validate_is_sibling_repo(@path)
44
+ raise MultiRepoException, "There is no folder at path '#{@path}'" unless Dir.exists?(@path)
45
+ raise MultiRepoException, "'#{@path}' is not a repository" unless Repo.new(@path).exists?
46
+ end
47
+
48
+ def validate_is_sibling_repo(path)
49
+ parent_dir = File.expand_path("..")
50
+ path = File.expand_path("..", path)
51
+ return parent_dir == path
52
+ end
53
+ end
54
54
  end
@@ -1,83 +1,83 @@
1
- require "multirepo/utility/console"
2
- require "multirepo/files/config-file"
3
- require "multirepo/files/tracking-files"
4
- require "multirepo/logic/performer"
5
-
6
- module MultiRepo
7
- class BranchCommand < Command
8
- self.command = "branch"
9
- self.summary = "Create and/or checkout a new branch for all repos."
10
-
11
- def self.options
12
- [
13
- ['<branch name>', 'The name of the branch to create and checkout.'],
14
- ['[--force]', 'Force creating the branch even if the repos contain uncommmitted changes.'],
15
- ['[--no-push]', 'Do not push the branch on creation.']
16
- ].concat(super)
17
- end
18
-
19
- def initialize(argv)
20
- @branch_name = argv.shift_argument
21
- @force = argv.flag?("force")
22
- @remote_tracking = argv.flag?("push", true)
23
- super
24
- end
25
-
26
- def validate!
27
- super
28
- help! "You must specify a branch name" unless @branch_name
29
- end
30
-
31
- def run
32
- super
33
- ensure_in_work_tree
34
- ensure_multirepo_enabled
35
-
36
- Console.log_step("Branching...")
37
-
38
- main_repo = Repo.new(".")
39
-
40
- # Ensure the main repo is clean
41
- raise MultiRepoException, "Main repo is not clean; multi branch aborted" unless main_repo.clean?
42
-
43
- # Ensure dependencies are clean
44
- config_entries = ConfigFile.new(".").load_entries
45
- unless Utils.ensure_dependencies_clean(config_entries)
46
- raise MultiRepoException, "Dependencies are not clean; multi branch aborted"
47
- end
48
-
49
- # Branch dependencies
50
- Performer.perform_on_dependencies do |config_entry, lock_entry|
51
- perform_branch(config_entry.repo)
52
- end
53
-
54
- # Branch the main repo
55
- perform_branch(main_repo)
56
-
57
- Console.log_step("Done!")
58
- rescue MultiRepoException => e
59
- Console.log_error(e.message)
60
- end
61
-
62
- def perform_branch(repo)
63
- Console.log_substep("Branching '#{repo.path}' ...")
64
- Console.log_info("Creating and checking out branch #{@branch_name} ...")
65
-
66
- branch = repo.branch(@branch_name)
67
- branch.create unless branch.exists?
68
- branch.checkout
69
-
70
- if Utils.is_multirepo_enabled(repo.path)
71
- Console.log_info("Updating and committing tracking files")
72
- tracking_files = TrackingFiles.new(repo.path)
73
- tracking_files.update
74
- tracking_files.commit("[multirepo] Post-branch tracking files update")
75
- end
76
-
77
- if @remote_tracking
78
- Console.log_info("Pushing #{@branch_name} to origin/#{@branch_name}")
79
- repo.branch(@branch_name).push
80
- end
81
- end
82
- end
1
+ require "multirepo/utility/console"
2
+ require "multirepo/files/config-file"
3
+ require "multirepo/files/tracking-files"
4
+ require "multirepo/logic/performer"
5
+
6
+ module MultiRepo
7
+ class BranchCommand < Command
8
+ self.command = "branch"
9
+ self.summary = "Create and/or checkout a new branch for all repos."
10
+
11
+ def self.options
12
+ [
13
+ ['<branch name>', 'The name of the branch to create and checkout.'],
14
+ ['[--force]', 'Force creating the branch even if the repos contain uncommmitted changes.'],
15
+ ['[--no-push]', 'Do not push the branch on creation.']
16
+ ].concat(super)
17
+ end
18
+
19
+ def initialize(argv)
20
+ @branch_name = argv.shift_argument
21
+ @force = argv.flag?("force")
22
+ @remote_tracking = argv.flag?("push", true)
23
+ super
24
+ end
25
+
26
+ def validate!
27
+ super
28
+ help! "You must specify a branch name" unless @branch_name
29
+ end
30
+
31
+ def run
32
+ super
33
+ ensure_in_work_tree
34
+ ensure_multirepo_enabled
35
+
36
+ Console.log_step("Branching...")
37
+
38
+ main_repo = Repo.new(".")
39
+
40
+ # Ensure the main repo is clean
41
+ raise MultiRepoException, "Main repo is not clean; multi branch aborted" unless main_repo.clean?
42
+
43
+ # Ensure dependencies are clean
44
+ config_entries = ConfigFile.new(".").load_entries
45
+ unless Utils.ensure_dependencies_clean(config_entries)
46
+ raise MultiRepoException, "Dependencies are not clean; multi branch aborted"
47
+ end
48
+
49
+ # Branch dependencies
50
+ Performer.perform_on_dependencies do |config_entry, lock_entry|
51
+ perform_branch(config_entry.repo)
52
+ end
53
+
54
+ # Branch the main repo
55
+ perform_branch(main_repo)
56
+
57
+ Console.log_step("Done!")
58
+ rescue MultiRepoException => e
59
+ Console.log_error(e.message)
60
+ end
61
+
62
+ def perform_branch(repo)
63
+ Console.log_substep("Branching '#{repo.path}' ...")
64
+ Console.log_info("Creating and checking out branch #{@branch_name} ...")
65
+
66
+ branch = repo.branch(@branch_name)
67
+ branch.create unless branch.exists?
68
+ branch.checkout
69
+
70
+ if Utils.is_multirepo_enabled(repo.path)
71
+ Console.log_info("Updating and committing tracking files")
72
+ tracking_files = TrackingFiles.new(repo.path)
73
+ tracking_files.update
74
+ tracking_files.commit("[multirepo] Post-branch tracking files update")
75
+ end
76
+
77
+ if @remote_tracking
78
+ Console.log_info("Pushing #{@branch_name} to origin/#{@branch_name}")
79
+ repo.branch(@branch_name).push
80
+ end
81
+ end
82
+ end
83
83
  end