git-multirepo 1.0.0.beta70 → 1.0.0.beta71

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 (72) hide show
  1. checksums.yaml +5 -5
  2. data/.gitattributes +4 -4
  3. data/.gitbugtraq +3 -3
  4. data/.gitignore +38 -38
  5. data/.rspec +2 -2
  6. data/.rubocop.yml +79 -79
  7. data/CHANGELOG.md +116 -112
  8. data/Gemfile +4 -4
  9. data/Gemfile.lock +47 -47
  10. data/LICENSE +22 -22
  11. data/README.md +178 -178
  12. data/Rakefile +1 -1
  13. data/bin/multi +11 -11
  14. data/docs/bug-repros/91565510-repro.sh +20 -20
  15. data/git-multirepo.gemspec +31 -31
  16. data/lib/git-multirepo.rb +3 -3
  17. data/lib/multirepo/commands/add-command.rb +55 -55
  18. data/lib/multirepo/commands/branch-command.rb +88 -88
  19. data/lib/multirepo/commands/checkout-command.rb +127 -127
  20. data/lib/multirepo/commands/clone-command.rb +68 -68
  21. data/lib/multirepo/commands/command.rb +87 -87
  22. data/lib/multirepo/commands/commands.rb +14 -14
  23. data/lib/multirepo/commands/do-command.rb +101 -101
  24. data/lib/multirepo/commands/init-command.rb +121 -121
  25. data/lib/multirepo/commands/inspect-command.rb +48 -48
  26. data/lib/multirepo/commands/install-command.rb +170 -170
  27. data/lib/multirepo/commands/merge-command.rb +249 -249
  28. data/lib/multirepo/commands/open-command.rb +55 -55
  29. data/lib/multirepo/commands/remove-command.rb +48 -48
  30. data/lib/multirepo/commands/uninit-command.rb +18 -18
  31. data/lib/multirepo/commands/update-command.rb +112 -112
  32. data/lib/multirepo/config.rb +19 -19
  33. data/lib/multirepo/files/config-entry.rb +39 -39
  34. data/lib/multirepo/files/config-file.rb +52 -52
  35. data/lib/multirepo/files/lock-entry.rb +29 -29
  36. data/lib/multirepo/files/lock-file.rb +62 -62
  37. data/lib/multirepo/files/meta-file.rb +51 -51
  38. data/lib/multirepo/files/tracking-file.rb +9 -9
  39. data/lib/multirepo/files/tracking-files.rb +64 -64
  40. data/lib/multirepo/git/branch.rb +32 -32
  41. data/lib/multirepo/git/change.rb +11 -11
  42. data/lib/multirepo/git/commit.rb +7 -7
  43. data/lib/multirepo/git/git-runner.rb +56 -56
  44. data/lib/multirepo/git/git.rb +10 -10
  45. data/lib/multirepo/git/ref.rb +38 -38
  46. data/lib/multirepo/git/remote.rb +17 -17
  47. data/lib/multirepo/git/repo.rb +131 -131
  48. data/lib/multirepo/hooks/post-commit-hook.rb +23 -23
  49. data/lib/multirepo/hooks/pre-commit-hook.rb +35 -35
  50. data/lib/multirepo/info.rb +5 -5
  51. data/lib/multirepo/logic/dependency.rb +6 -6
  52. data/lib/multirepo/logic/merge-descriptor.rb +95 -95
  53. data/lib/multirepo/logic/node.rb +75 -75
  54. data/lib/multirepo/logic/performer.rb +62 -62
  55. data/lib/multirepo/logic/repo-selection.rb +25 -25
  56. data/lib/multirepo/logic/revision-selection.rb +15 -15
  57. data/lib/multirepo/logic/revision-selector.rb +23 -23
  58. data/lib/multirepo/logic/version-comparer.rb +10 -10
  59. data/lib/multirepo/multirepo-exception.rb +6 -6
  60. data/lib/multirepo/output/extra-output.rb +12 -12
  61. data/lib/multirepo/output/teamcity-extra-output.rb +11 -11
  62. data/lib/multirepo/utility/console.rb +52 -52
  63. data/lib/multirepo/utility/popen-runner.rb +27 -27
  64. data/lib/multirepo/utility/system-runner.rb +14 -14
  65. data/lib/multirepo/utility/utils.rb +107 -107
  66. data/lib/multirepo/utility/verbosity.rb +6 -6
  67. data/resources/.gitconfig +2 -2
  68. data/resources/post-commit +0 -0
  69. data/resources/pre-commit +0 -0
  70. data/spec/integration/init_spec.rb +19 -19
  71. data/spec/spec_helper.rb +89 -89
  72. metadata +3 -3
@@ -1,9 +1,9 @@
1
- module MultiRepo
2
- class TrackingFile
3
- def update_internal(file, new_content)
4
- old_content = File.exist?(file) ? File.read(file) : nil
5
- File.write(file, new_content)
6
- return new_content != old_content
7
- end
8
- end
9
- end
1
+ module MultiRepo
2
+ class TrackingFile
3
+ def update_internal(file, new_content)
4
+ old_content = File.exist?(file) ? File.read(file) : nil
5
+ File.write(file, new_content)
6
+ return new_content != old_content
7
+ end
8
+ end
9
+ end
@@ -1,64 +1,64 @@
1
- require "multirepo/git/git-runner"
2
- require_relative "meta-file"
3
- require_relative "lock-file"
4
- require "multirepo/info"
5
- require "multirepo/logic/version-comparer"
6
-
7
- module MultiRepo
8
- class TrackingFiles
9
- attr_accessor :files
10
-
11
- def initialize(path)
12
- @path = path
13
- @meta_file = MetaFile.new(path)
14
- @lock_file = LockFile.new(path)
15
- @files = [@meta_file, @lock_file]
16
- end
17
-
18
- def update
19
- ensure_tool_not_outdated
20
- updated = false
21
- files.each { |f| updated |= f.update }
22
- return updated
23
- end
24
-
25
- def ensure_tool_not_outdated
26
- return if !@meta_file.exists?
27
-
28
- base_message = "Can't update tracking files with an outdated version of git-multirepo."
29
- current_version = MultiRepo::VERSION
30
- meta_version = @meta_file.load.version
31
- outdated_tool = !VersionComparer.is_latest(current: current_version, last: meta_version)
32
- message = base_message + " Current version is #{current_version} and repo is tracked by #{meta_version}"
33
-
34
- fail MultiRepoException, message if outdated_tool
35
- end
36
-
37
- def stage
38
- GitRunner.run(@path, "add --force -- #{files_pathspec}", Verbosity::OUTPUT_ON_ERROR)
39
- end
40
-
41
- def commit(message)
42
- stage
43
-
44
- output = GitRunner.run(@path, "ls-files --modified --others -- #{files_pathspec}", Verbosity::OUTPUT_NEVER)
45
- files_are_untracked_or_modified = output.strip != ""
46
-
47
- output = GitRunner.run(@path, "diff --name-only --cached -- #{files_pathspec}", Verbosity::OUTPUT_NEVER)
48
- files_are_staged = output.strip != ""
49
-
50
- must_commit = files_are_untracked_or_modified || files_are_staged
51
- GitRunner.run(@path, "commit --no-verify -m \"#{message}\" --only -- #{files_pathspec}", Verbosity::OUTPUT_ON_ERROR) if must_commit
52
-
53
- return must_commit
54
- end
55
-
56
- def delete
57
- files.each { |f| FileUtils.rm_f(f.file) }
58
- end
59
-
60
- def files_pathspec
61
- files.map{ |f| File.basename(f.file) }.join(" ")
62
- end
63
- end
64
- end
1
+ require "multirepo/git/git-runner"
2
+ require_relative "meta-file"
3
+ require_relative "lock-file"
4
+ require "multirepo/info"
5
+ require "multirepo/logic/version-comparer"
6
+
7
+ module MultiRepo
8
+ class TrackingFiles
9
+ attr_accessor :files
10
+
11
+ def initialize(path)
12
+ @path = path
13
+ @meta_file = MetaFile.new(path)
14
+ @lock_file = LockFile.new(path)
15
+ @files = [@meta_file, @lock_file]
16
+ end
17
+
18
+ def update
19
+ ensure_tool_not_outdated
20
+ updated = false
21
+ files.each { |f| updated |= f.update }
22
+ return updated
23
+ end
24
+
25
+ def ensure_tool_not_outdated
26
+ return if !@meta_file.exists?
27
+
28
+ base_message = "Can't update tracking files with an outdated version of git-multirepo."
29
+ current_version = MultiRepo::VERSION
30
+ meta_version = @meta_file.load.version
31
+ outdated_tool = !VersionComparer.is_latest(current: current_version, last: meta_version)
32
+ message = base_message + " Current version is #{current_version} and repo is tracked by #{meta_version}"
33
+
34
+ fail MultiRepoException, message if outdated_tool
35
+ end
36
+
37
+ def stage
38
+ GitRunner.run(@path, "add --force -- #{files_pathspec}", Verbosity::OUTPUT_ON_ERROR)
39
+ end
40
+
41
+ def commit(message)
42
+ stage
43
+
44
+ output = GitRunner.run(@path, "ls-files --modified --others -- #{files_pathspec}", Verbosity::OUTPUT_NEVER)
45
+ files_are_untracked_or_modified = output.strip != ""
46
+
47
+ output = GitRunner.run(@path, "diff --name-only --cached -- #{files_pathspec}", Verbosity::OUTPUT_NEVER)
48
+ files_are_staged = output.strip != ""
49
+
50
+ must_commit = files_are_untracked_or_modified || files_are_staged
51
+ GitRunner.run(@path, "commit --no-verify -m \"#{message}\" --only -- #{files_pathspec}", Verbosity::OUTPUT_ON_ERROR) if must_commit
52
+
53
+ return must_commit
54
+ end
55
+
56
+ def delete
57
+ files.each { |f| FileUtils.rm_f(f.file) }
58
+ end
59
+
60
+ def files_pathspec
61
+ files.map{ |f| File.basename(f.file) }.join(" ")
62
+ end
63
+ end
64
+ end
@@ -1,32 +1,32 @@
1
- require_relative "ref"
2
- require_relative "git-runner"
3
-
4
- module MultiRepo
5
- class Branch < Ref
6
- def exists?
7
- lines = GitRunner.run(@repo.path, "branch", Verbosity::OUTPUT_NEVER).split("\n")
8
- branch_names = lines.map { |line| line.tr("* ", "") }
9
- branch_names.include?(@name)
10
- end
11
-
12
- def upstream_branch
13
- output = GitRunner.run(@repo.path, "config --get branch.#{@name}.merge", Verbosity::OUTPUT_NEVER)
14
- output.sub!("refs/heads/", "")
15
- return nil if output == ""
16
- Branch.new(@repo, "origin/#{output}")
17
- end
18
-
19
- def create
20
- GitRunner.run(@repo.path, "branch #{@name}", Verbosity::OUTPUT_ON_ERROR)
21
- end
22
-
23
- def push
24
- GitRunner.run(@repo.path, "push -u origin #{@name}", Verbosity::OUTPUT_ON_ERROR)
25
- end
26
-
27
- def checkout
28
- GitRunner.run(@repo.path, "checkout #{@name}", Verbosity::OUTPUT_ON_ERROR)
29
- GitRunner.last_command_succeeded
30
- end
31
- end
32
- end
1
+ require_relative "ref"
2
+ require_relative "git-runner"
3
+
4
+ module MultiRepo
5
+ class Branch < Ref
6
+ def exists?
7
+ lines = GitRunner.run(@repo.path, "branch", Verbosity::OUTPUT_NEVER).split("\n")
8
+ branch_names = lines.map { |line| line.tr("* ", "") }
9
+ branch_names.include?(@name)
10
+ end
11
+
12
+ def upstream_branch
13
+ output = GitRunner.run(@repo.path, "config --get branch.#{@name}.merge", Verbosity::OUTPUT_NEVER)
14
+ output.sub!("refs/heads/", "")
15
+ return nil if output == ""
16
+ Branch.new(@repo, "origin/#{output}")
17
+ end
18
+
19
+ def create
20
+ GitRunner.run(@repo.path, "branch #{@name}", Verbosity::OUTPUT_ON_ERROR)
21
+ end
22
+
23
+ def push
24
+ GitRunner.run(@repo.path, "push -u origin #{@name}", Verbosity::OUTPUT_ON_ERROR)
25
+ end
26
+
27
+ def checkout
28
+ GitRunner.run(@repo.path, "checkout #{@name}", Verbosity::OUTPUT_ON_ERROR)
29
+ GitRunner.last_command_succeeded
30
+ end
31
+ end
32
+ end
@@ -1,11 +1,11 @@
1
- module MultiRepo
2
- class Change
3
- attr_accessor :status
4
- attr_accessor :path
5
-
6
- def initialize(line)
7
- @status = line[0...2].strip
8
- @path = line[3..-1]
9
- end
10
- end
11
- end
1
+ module MultiRepo
2
+ class Change
3
+ attr_accessor :status
4
+ attr_accessor :path
5
+
6
+ def initialize(line)
7
+ @status = line[0...2].strip
8
+ @path = line[3..-1]
9
+ end
10
+ end
11
+ end
@@ -1,7 +1,7 @@
1
- require_relative "ref"
2
- require_relative "git-runner"
3
-
4
- module MultiRepo
5
- class Commit < Ref
6
- end
7
- end
1
+ require_relative "ref"
2
+ require_relative "git-runner"
3
+
4
+ module MultiRepo
5
+ class Commit < Ref
6
+ end
7
+ end
@@ -1,56 +1,56 @@
1
- require "multirepo/utility/verbosity"
2
- require "multirepo/utility/popen-runner"
3
- require "multirepo/utility/system-runner"
4
- require "multirepo/config"
5
-
6
- module MultiRepo
7
- class GitRunner
8
- class << self
9
- attr_accessor :last_command_succeeded
10
- end
11
-
12
- def self.run(path, git_command, verbosity)
13
- command = build_command(path, git_command)
14
- runner_popen(command, verbosity)
15
- end
16
-
17
- def self.run_as_system(path, git_command)
18
- command = build_command(path, git_command)
19
- runner_system(command)
20
- end
21
-
22
- def self.build_command(path, git_command)
23
- if path == "."
24
- # It is always better to skip -C when running git commands in the
25
- # current directory (especially in hooks). Doing this prevents
26
- # any future issues because we automatically fallback to non-"-C" for ".".
27
- # Fixes bug: https://www.pivotaltracker.com/story/show/94505654
28
- return "#{git_executable} #{git_command}"
29
- end
30
-
31
- full_command = "#{git_executable} -C \"#{path}\" #{git_command}"
32
- if Config.instance.running_git_hook
33
- # True fix for the -C flag issue in pre-commit hook where the status command would
34
- # fail to provide correct results if a pathspec was provided when performing a commit.
35
- # http://thread.gmane.org/gmane.comp.version-control.git/263319/focus=263323
36
- full_command = "sh -c 'unset $(git rev-parse --local-env-vars); #{full_command};'"
37
- end
38
-
39
- return full_command
40
- end
41
-
42
- def self.runner_popen(full_command, verbosity)
43
- result, @last_command_succeeded = PopenRunner.run(full_command, verbosity)
44
- return result
45
- end
46
-
47
- def self.runner_system(full_command)
48
- result, @last_command_succeeded = SystemRunner.run(full_command)
49
- return result
50
- end
51
-
52
- def self.git_executable
53
- Config.instance.git_executable || "git"
54
- end
55
- end
56
- end
1
+ require "multirepo/utility/verbosity"
2
+ require "multirepo/utility/popen-runner"
3
+ require "multirepo/utility/system-runner"
4
+ require "multirepo/config"
5
+
6
+ module MultiRepo
7
+ class GitRunner
8
+ class << self
9
+ attr_accessor :last_command_succeeded
10
+ end
11
+
12
+ def self.run(path, git_command, verbosity)
13
+ command = build_command(path, git_command)
14
+ runner_popen(command, verbosity)
15
+ end
16
+
17
+ def self.run_as_system(path, git_command)
18
+ command = build_command(path, git_command)
19
+ runner_system(command)
20
+ end
21
+
22
+ def self.build_command(path, git_command)
23
+ if path == "."
24
+ # It is always better to skip -C when running git commands in the
25
+ # current directory (especially in hooks). Doing this prevents
26
+ # any future issues because we automatically fallback to non-"-C" for ".".
27
+ # Fixes bug: https://www.pivotaltracker.com/story/show/94505654
28
+ return "#{git_executable} #{git_command}"
29
+ end
30
+
31
+ full_command = "#{git_executable} -C \"#{path}\" #{git_command}"
32
+ if Config.instance.running_git_hook
33
+ # True fix for the -C flag issue in pre-commit hook where the status command would
34
+ # fail to provide correct results if a pathspec was provided when performing a commit.
35
+ # http://thread.gmane.org/gmane.comp.version-control.git/263319/focus=263323
36
+ full_command = "sh -c 'unset $(git rev-parse --local-env-vars); #{full_command};'"
37
+ end
38
+
39
+ return full_command
40
+ end
41
+
42
+ def self.runner_popen(full_command, verbosity)
43
+ result, @last_command_succeeded = PopenRunner.run(full_command, verbosity)
44
+ return result
45
+ end
46
+
47
+ def self.runner_system(full_command)
48
+ result, @last_command_succeeded = SystemRunner.run(full_command)
49
+ return result
50
+ end
51
+
52
+ def self.git_executable
53
+ Config.instance.git_executable || "git"
54
+ end
55
+ end
56
+ end
@@ -1,10 +1,10 @@
1
- require "multirepo/git/git-runner"
2
-
3
- module MultiRepo
4
- class Git
5
- def self.valid_branch_name?(name)
6
- GitRunner.run(".", "check-ref-format --branch \"#{name}\"", Verbosity::OUTPUT_NEVER)
7
- GitRunner.last_command_succeeded
8
- end
9
- end
10
- end
1
+ require "multirepo/git/git-runner"
2
+
3
+ module MultiRepo
4
+ class Git
5
+ def self.valid_branch_name?(name)
6
+ GitRunner.run(".", "check-ref-format --branch \"#{name}\"", Verbosity::OUTPUT_NEVER)
7
+ GitRunner.last_command_succeeded
8
+ end
9
+ end
10
+ end
@@ -1,38 +1,38 @@
1
- require_relative "git-runner"
2
-
3
- module MultiRepo
4
- class Ref
5
- attr_accessor :name
6
-
7
- def initialize(repo, name)
8
- @repo = repo
9
- @name = name
10
- end
11
-
12
- def exists?
13
- output = GitRunner.run(@repo.path, "rev-parse --verify --quiet #{@name}", Verbosity::OUTPUT_NEVER).strip
14
- return output != ""
15
- end
16
-
17
- def commit_id
18
- GitRunner.run(@repo.path, "rev-parse #{@name}", Verbosity::OUTPUT_NEVER).strip
19
- end
20
-
21
- def short_commit_id
22
- GitRunner.run(@repo.path, "rev-parse --short #{@name}", Verbosity::OUTPUT_NEVER).strip
23
- end
24
-
25
- def merge_commit?
26
- lines = GitRunner.run(@repo.path, "cat-file -p #{@name}", Verbosity::OUTPUT_NEVER).split("\n")
27
- parents = lines.grep(/^parent /)
28
- return parents.count > 1
29
- end
30
-
31
- def can_fast_forward_to?(ref)
32
- # http://stackoverflow.com/a/2934062/167983
33
- rev_parse_output = GitRunner.run(@repo.path, "rev-parse #{@name}", Verbosity::OUTPUT_NEVER)
34
- merge_base_output = GitRunner.run(@repo.path, "merge-base \"#{rev_parse_output}\" \"#{ref.name}\"", Verbosity::OUTPUT_NEVER)
35
- return merge_base_output == rev_parse_output
36
- end
37
- end
38
- end
1
+ require_relative "git-runner"
2
+
3
+ module MultiRepo
4
+ class Ref
5
+ attr_accessor :name
6
+
7
+ def initialize(repo, name)
8
+ @repo = repo
9
+ @name = name
10
+ end
11
+
12
+ def exists?
13
+ output = GitRunner.run(@repo.path, "rev-parse --verify --quiet #{@name}", Verbosity::OUTPUT_NEVER).strip
14
+ return output != ""
15
+ end
16
+
17
+ def commit_id
18
+ GitRunner.run(@repo.path, "rev-parse #{@name}", Verbosity::OUTPUT_NEVER).strip
19
+ end
20
+
21
+ def short_commit_id
22
+ GitRunner.run(@repo.path, "rev-parse --short #{@name}", Verbosity::OUTPUT_NEVER).strip
23
+ end
24
+
25
+ def merge_commit?
26
+ lines = GitRunner.run(@repo.path, "cat-file -p #{@name}", Verbosity::OUTPUT_NEVER).split("\n")
27
+ parents = lines.grep(/^parent /)
28
+ return parents.count > 1
29
+ end
30
+
31
+ def can_fast_forward_to?(ref)
32
+ # http://stackoverflow.com/a/2934062/167983
33
+ rev_parse_output = GitRunner.run(@repo.path, "rev-parse #{@name}", Verbosity::OUTPUT_NEVER)
34
+ merge_base_output = GitRunner.run(@repo.path, "merge-base \"#{rev_parse_output}\" \"#{ref.name}\"", Verbosity::OUTPUT_NEVER)
35
+ return merge_base_output == rev_parse_output
36
+ end
37
+ end
38
+ end