git-multirepo 1.0.0.beta56 → 1.0.0.beta57

Sign up to get free protection for your applications and to get access to all the features.
Files changed (73) 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/.rubocop.yml +79 -79
  8. data/CHANGELOG.md +61 -57
  9. data/Gemfile +4 -4
  10. data/Gemfile.lock +42 -42
  11. data/LICENSE +22 -22
  12. data/README.md +179 -178
  13. data/Rakefile +1 -1
  14. data/bin/multi +11 -11
  15. data/docs/bug-repros/91565510-repro.sh +20 -20
  16. data/git-multirepo.gemspec +31 -31
  17. data/lib/git-multirepo.rb +3 -3
  18. data/lib/multirepo/commands/add-command.rb +51 -51
  19. data/lib/multirepo/commands/branch-command.rb +82 -82
  20. data/lib/multirepo/commands/checkout-command.rb +127 -127
  21. data/lib/multirepo/commands/clone-command.rb +68 -68
  22. data/lib/multirepo/commands/command.rb +87 -87
  23. data/lib/multirepo/commands/commands.rb +15 -15
  24. data/lib/multirepo/commands/do-command.rb +101 -101
  25. data/lib/multirepo/commands/graph-command.rb +43 -43
  26. data/lib/multirepo/commands/init-command.rb +121 -121
  27. data/lib/multirepo/commands/inspect-command.rb +48 -48
  28. data/lib/multirepo/commands/install-command.rb +161 -161
  29. data/lib/multirepo/commands/merge-command.rb +249 -249
  30. data/lib/multirepo/commands/open-command.rb +55 -55
  31. data/lib/multirepo/commands/remove-command.rb +48 -48
  32. data/lib/multirepo/commands/uninit-command.rb +18 -18
  33. data/lib/multirepo/commands/update-command.rb +112 -112
  34. data/lib/multirepo/config.rb +19 -19
  35. data/lib/multirepo/files/config-entry.rb +39 -39
  36. data/lib/multirepo/files/config-file.rb +46 -46
  37. data/lib/multirepo/files/lock-entry.rb +29 -29
  38. data/lib/multirepo/files/lock-file.rb +56 -56
  39. data/lib/multirepo/files/meta-file.rb +41 -41
  40. data/lib/multirepo/files/tracking-file.rb +9 -9
  41. data/lib/multirepo/files/tracking-files.rb +47 -47
  42. data/lib/multirepo/git/branch.rb +32 -32
  43. data/lib/multirepo/git/change.rb +11 -11
  44. data/lib/multirepo/git/commit.rb +7 -7
  45. data/lib/multirepo/git/git-runner.rb +56 -56
  46. data/lib/multirepo/git/git.rb +10 -10
  47. data/lib/multirepo/git/ref.rb +38 -38
  48. data/lib/multirepo/git/remote.rb +17 -17
  49. data/lib/multirepo/git/repo.rb +129 -129
  50. data/lib/multirepo/hooks/post-commit-hook.rb +23 -23
  51. data/lib/multirepo/hooks/pre-commit-hook.rb +35 -35
  52. data/lib/multirepo/info.rb +5 -5
  53. data/lib/multirepo/logic/dependency.rb +6 -6
  54. data/lib/multirepo/logic/merge-descriptor.rb +95 -95
  55. data/lib/multirepo/logic/node.rb +72 -72
  56. data/lib/multirepo/logic/performer.rb +55 -55
  57. data/lib/multirepo/logic/repo-selection.rb +25 -25
  58. data/lib/multirepo/logic/revision-selection.rb +15 -15
  59. data/lib/multirepo/logic/revision-selector.rb +23 -23
  60. data/lib/multirepo/multirepo-exception.rb +6 -6
  61. data/lib/multirepo/output/extra-output.rb +12 -12
  62. data/lib/multirepo/output/teamcity-extra-output.rb +11 -11
  63. data/lib/multirepo/utility/console.rb +52 -52
  64. data/lib/multirepo/utility/popen-runner.rb +27 -27
  65. data/lib/multirepo/utility/system-runner.rb +14 -14
  66. data/lib/multirepo/utility/utils.rb +99 -99
  67. data/lib/multirepo/utility/verbosity.rb +6 -6
  68. data/resources/.gitconfig +2 -2
  69. data/resources/post-commit +6 -6
  70. data/resources/pre-commit +6 -6
  71. data/spec/integration/init_spec.rb +19 -19
  72. data/spec/spec_helper.rb +89 -89
  73. metadata +3 -3
@@ -1,52 +1,52 @@
1
- require "colored"
2
-
3
- module MultiRepo
4
- class Console
5
- def self.log_step(message)
6
- print_prefix
7
- puts $stdout.isatty ? message.bold.green : message
8
- end
9
-
10
- def self.log_substep(message)
11
- print_prefix
12
- puts $stdout.isatty ? message.blue : message
13
- end
14
-
15
- def self.log_info(message)
16
- print_prefix
17
- puts $stdout.isatty ? message.white : message
18
- end
19
-
20
- def self.log_warning(message)
21
- print_prefix
22
- puts $stdout.isatty ? message.yellow : message
23
- end
24
-
25
- def self.log_error(message)
26
- print_prefix
27
- puts $stdout.isatty ? message.red : message
28
- end
29
-
30
- def self.ask(message)
31
- answered = false
32
- until answered
33
- print_prefix
34
- print message
35
- print " (y/n) "
36
-
37
- case $stdin.gets.strip.downcase
38
- when "y", "yes"
39
- answered = true
40
- return true
41
- when "n", "no"
42
- answered = true
43
- return false
44
- end
45
- end
46
- end
47
-
48
- def self.print_prefix
49
- print $stdout.isatty ? "> ".white : "[multirepo] "
50
- end
51
- end
52
- end
1
+ require "colored"
2
+
3
+ module MultiRepo
4
+ class Console
5
+ def self.log_step(message)
6
+ print_prefix
7
+ puts $stdout.isatty ? message.bold.green : message
8
+ end
9
+
10
+ def self.log_substep(message)
11
+ print_prefix
12
+ puts $stdout.isatty ? message.blue : message
13
+ end
14
+
15
+ def self.log_info(message)
16
+ print_prefix
17
+ puts $stdout.isatty ? message.white : message
18
+ end
19
+
20
+ def self.log_warning(message)
21
+ print_prefix
22
+ puts $stdout.isatty ? message.yellow : message
23
+ end
24
+
25
+ def self.log_error(message)
26
+ print_prefix
27
+ puts $stdout.isatty ? message.red : message
28
+ end
29
+
30
+ def self.ask(message)
31
+ answered = false
32
+ until answered
33
+ print_prefix
34
+ print message
35
+ print " (y/n) "
36
+
37
+ case $stdin.gets.strip.downcase
38
+ when "y", "yes"
39
+ answered = true
40
+ return true
41
+ when "n", "no"
42
+ answered = true
43
+ return false
44
+ end
45
+ end
46
+ end
47
+
48
+ def self.print_prefix
49
+ print $stdout.isatty ? "> ".white : "[multirepo] "
50
+ end
51
+ end
52
+ end
@@ -1,27 +1,27 @@
1
- require "open3"
2
-
3
- require "multirepo/utility/console"
4
-
5
- module MultiRepo
6
- class PopenRunner
7
- def self.run(cmd, verbosity)
8
- Console.log_info("Command: #{cmd}") if Config.instance.verbose
9
-
10
- lines = []
11
- last_command_succeeded = false
12
- Open3.popen2e(cmd) do |_stdin, stdout_and_stderr, thread|
13
- stdout_and_stderr.each do |line|
14
- print line if Config.instance.verbose
15
- lines << line
16
- end
17
- last_command_succeeded = thread.value.success?
18
- end
19
-
20
- output = lines.join("").rstrip
21
-
22
- Console.log_error(output) if !last_command_succeeded && verbosity == Verbosity::OUTPUT_ON_ERROR
23
-
24
- return output, last_command_succeeded
25
- end
26
- end
27
- end
1
+ require "open3"
2
+
3
+ require "multirepo/utility/console"
4
+
5
+ module MultiRepo
6
+ class PopenRunner
7
+ def self.run(cmd, verbosity)
8
+ Console.log_info("Command: #{cmd}") if Config.instance.verbose
9
+
10
+ lines = []
11
+ last_command_succeeded = false
12
+ Open3.popen2e(cmd) do |_stdin, stdout_and_stderr, thread|
13
+ stdout_and_stderr.each do |line|
14
+ print line if Config.instance.verbose
15
+ lines << line
16
+ end
17
+ last_command_succeeded = thread.value.success?
18
+ end
19
+
20
+ output = lines.join("").rstrip
21
+
22
+ Console.log_error(output) if !last_command_succeeded && verbosity == Verbosity::OUTPUT_ON_ERROR
23
+
24
+ return output, last_command_succeeded
25
+ end
26
+ end
27
+ end
@@ -1,14 +1,14 @@
1
- require "multirepo/utility/console"
2
-
3
- module MultiRepo
4
- class SystemRunner
5
- def self.run(cmd)
6
- Console.log_info("Command: #{cmd}") if Config.instance.verbose
7
-
8
- output = system(cmd)
9
- last_command_succeeded = ($?.exitstatus == 0)
10
-
11
- return output, last_command_succeeded
12
- end
13
- end
14
- end
1
+ require "multirepo/utility/console"
2
+
3
+ module MultiRepo
4
+ class SystemRunner
5
+ def self.run(cmd)
6
+ Console.log_info("Command: #{cmd}") if Config.instance.verbose
7
+
8
+ output = system(cmd)
9
+ last_command_succeeded = ($?.exitstatus == 0)
10
+
11
+ return output, last_command_succeeded
12
+ end
13
+ end
14
+ end
@@ -1,99 +1,99 @@
1
- require "multirepo/multirepo-exception"
2
- require "fileutils"
3
-
4
- module MultiRepo
5
- class Utils
6
- def self.only_one_true?(*flags)
7
- flags.reduce(0) { |count, flag| count += 1 if flag; count } <= 1
8
- end
9
-
10
- def self.path_for_resource(resource_name)
11
- gem_path = Gem::Specification.find_by_name("git-multirepo").gem_dir
12
- File.join(gem_path, "resources/#{resource_name}")
13
- end
14
-
15
- def self.multirepo_enabled?(path)
16
- File.exist?(File.join(path, ".multirepo"))
17
- end
18
-
19
- def self.multirepo_tracked?(path)
20
- multirepo_enabled?(path) && File.exist?(File.join(path, ".multirepo.lock"))
21
- end
22
-
23
- def self.install_hook(name, path)
24
- destination_path = File.join(path, ".git/hooks")
25
- destination_file = File.join(destination_path, name)
26
- FileUtils.cp(path_for_resource(name), destination_file)
27
- FileUtils.chmod(0755, destination_file) # -rwxr-xr-x
28
- end
29
-
30
- def self.sibling_repos
31
- sibling_directories = Dir['../*/']
32
- sibling_repos = sibling_directories.map{ |d| Repo.new(d) }.select(&:exists?)
33
- sibling_repos.delete_if{ |r| Pathname.new(r.path).realpath == Pathname.new(".").realpath }
34
- end
35
-
36
- def self.dependencies_clean?(config_entries)
37
- clean = true
38
- missing = false
39
- config_entries.each do |e|
40
- # Ensure the dependency exists
41
- unless e.repo.exists?
42
- Console.log_error("Dependency '#{e.path}' does not exist on disk")
43
- missing |= true
44
- next
45
- end
46
-
47
- # Ensure it contains no uncommitted changes
48
- dependency_clean = e.repo.clean?
49
- clean &= dependency_clean
50
- Console.log_warning("Dependency '#{e.repo.path}' contains uncommitted changes") unless dependency_clean
51
- end
52
-
53
- fail MultiRepoException, "Some dependencies are not present on this machine." \
54
- " Run \"multi install\" to clone missing dependencies." if missing
55
-
56
- return clean
57
- end
58
-
59
- def self.ensure_working_copies_clean(repos)
60
- clean = true
61
- repos.each do |repo|
62
- dependency_clean = repo.clean?
63
- clean &= dependency_clean
64
- Console.log_warning("Repo '#{repo.path}' contains uncommitted changes") unless dependency_clean
65
- end
66
- return clean
67
- end
68
-
69
- def self.convert_to_windows_path(unix_path)
70
- components = Pathname.new(unix_path).each_filename.to_a
71
- components.join(File::ALT_SEPARATOR)
72
- end
73
-
74
- def self.reveal_in_default_file_browser(unix_path)
75
- if OS.osx?
76
- system %(open "#{unix_path}")
77
- elsif OS.windows?
78
- system %(explorer "#{Utils.convert_to_windows_path(unix_path)}")
79
- end
80
- end
81
-
82
- def self.open_in_default_app(unix_path)
83
- if OS.osx?
84
- system %(open "#{unix_path}")
85
- elsif OS.windows?
86
- system %(cmd /c "start C:\\#{Utils.convert_to_windows_path(unix_path)}")
87
- end
88
- end
89
-
90
- def self.append_if_missing(path, pattern, string_to_append)
91
- if File.exist?(path)
92
- string_located = File.readlines(path).grep(pattern).any?
93
- File.open(path, 'a') { |f| f.puts(string_to_append) } unless string_located
94
- else
95
- File.open(path, 'w') { |f| f.puts(string_to_append) }
96
- end
97
- end
98
- end
99
- end
1
+ require "multirepo/multirepo-exception"
2
+ require "fileutils"
3
+
4
+ module MultiRepo
5
+ class Utils
6
+ def self.only_one_true?(*flags)
7
+ flags.reduce(0) { |count, flag| count += 1 if flag; count } <= 1
8
+ end
9
+
10
+ def self.path_for_resource(resource_name)
11
+ gem_path = Gem::Specification.find_by_name("git-multirepo").gem_dir
12
+ File.join(gem_path, "resources/#{resource_name}")
13
+ end
14
+
15
+ def self.multirepo_enabled?(path)
16
+ File.exist?(File.join(path, ".multirepo"))
17
+ end
18
+
19
+ def self.multirepo_tracked?(path)
20
+ multirepo_enabled?(path) && File.exist?(File.join(path, ".multirepo.lock"))
21
+ end
22
+
23
+ def self.install_hook(name, path)
24
+ destination_path = File.join(path, ".git/hooks")
25
+ destination_file = File.join(destination_path, name)
26
+ FileUtils.cp(path_for_resource(name), destination_file)
27
+ FileUtils.chmod(0755, destination_file) # -rwxr-xr-x
28
+ end
29
+
30
+ def self.sibling_repos
31
+ sibling_directories = Dir['../*/']
32
+ sibling_repos = sibling_directories.map{ |d| Repo.new(d) }.select(&:exists?)
33
+ sibling_repos.delete_if{ |r| Pathname.new(r.path).realpath == Pathname.new(".").realpath }
34
+ end
35
+
36
+ def self.dependencies_clean?(config_entries)
37
+ clean = true
38
+ missing = false
39
+ config_entries.each do |e|
40
+ # Ensure the dependency exists
41
+ unless e.repo.exists?
42
+ Console.log_error("Dependency '#{e.path}' does not exist on disk")
43
+ missing |= true
44
+ next
45
+ end
46
+
47
+ # Ensure it contains no uncommitted changes
48
+ dependency_clean = e.repo.clean?
49
+ clean &= dependency_clean
50
+ Console.log_warning("Dependency '#{e.repo.path}' contains uncommitted changes") unless dependency_clean
51
+ end
52
+
53
+ fail MultiRepoException, "Some dependencies are not present on this machine." \
54
+ " Run \"multi install\" to clone missing dependencies." if missing
55
+
56
+ return clean
57
+ end
58
+
59
+ def self.ensure_working_copies_clean(repos)
60
+ clean = true
61
+ repos.each do |repo|
62
+ dependency_clean = repo.clean?
63
+ clean &= dependency_clean
64
+ Console.log_warning("Repo '#{repo.path}' contains uncommitted changes") unless dependency_clean
65
+ end
66
+ return clean
67
+ end
68
+
69
+ def self.convert_to_windows_path(unix_path)
70
+ components = Pathname.new(unix_path).each_filename.to_a
71
+ components.join(File::ALT_SEPARATOR)
72
+ end
73
+
74
+ def self.reveal_in_default_file_browser(unix_path)
75
+ if OS.osx?
76
+ system %(open "#{unix_path}")
77
+ elsif OS.windows?
78
+ system %(explorer "#{Utils.convert_to_windows_path(unix_path)}")
79
+ end
80
+ end
81
+
82
+ def self.open_in_default_app(unix_path)
83
+ if OS.osx?
84
+ system %(open "#{unix_path}")
85
+ elsif OS.windows?
86
+ system %(cmd /c "start C:\\#{Utils.convert_to_windows_path(unix_path)}")
87
+ end
88
+ end
89
+
90
+ def self.append_if_missing(path, pattern, string_to_append)
91
+ if File.exist?(path)
92
+ string_located = File.readlines(path).grep(pattern).any?
93
+ File.open(path, 'a') { |f| f.puts(string_to_append) } unless string_located
94
+ else
95
+ File.open(path, 'w') { |f| f.puts(string_to_append) }
96
+ end
97
+ end
98
+ end
99
+ end
@@ -1,6 +1,6 @@
1
- module MultiRepo
2
- class Verbosity
3
- OUTPUT_NEVER = 0
4
- OUTPUT_ON_ERROR = 1
5
- end
6
- end
1
+ module MultiRepo
2
+ class Verbosity
3
+ OUTPUT_NEVER = 0
4
+ OUTPUT_ON_ERROR = 1
5
+ end
6
+ end
@@ -1,3 +1,3 @@
1
- [merge "ours"]
2
- name = "Always keep ours"
1
+ [merge "ours"]
2
+ name = "Always keep ours"
3
3
  driver = true
@@ -1,6 +1,6 @@
1
- #!/usr/bin/env ruby
2
-
3
- require "rubygems"
4
- require "git-multirepo"
5
-
6
- MultiRepo::PostCommitHook.run
1
+ #!/usr/bin/env ruby
2
+
3
+ require "rubygems"
4
+ require "git-multirepo"
5
+
6
+ MultiRepo::PostCommitHook.run
@@ -1,6 +1,6 @@
1
- #!/usr/bin/env ruby
2
-
3
- require "rubygems"
4
- require "git-multirepo"
5
-
6
- MultiRepo::PreCommitHook.run
1
+ #!/usr/bin/env ruby
2
+
3
+ require "rubygems"
4
+ require "git-multirepo"
5
+
6
+ MultiRepo::PreCommitHook.run
@@ -1,19 +1,19 @@
1
- require "multirepo/commands/init"
2
-
3
- RSpec.describe("Init") do
4
- it "creates the config file" do
5
- pending
6
- end
7
-
8
- it "adds only specified repos to the config file" do
9
- pending
10
- end
11
-
12
- it "installs the hooks" do
13
- pending
14
- end
15
-
16
- it "fails when there are uncommitted changes in dependencies" do
17
- pending
18
- end
19
- end
1
+ require "multirepo/commands/init"
2
+
3
+ RSpec.describe("Init") do
4
+ it "creates the config file" do
5
+ pending
6
+ end
7
+
8
+ it "adds only specified repos to the config file" do
9
+ pending
10
+ end
11
+
12
+ it "installs the hooks" do
13
+ pending
14
+ end
15
+
16
+ it "fails when there are uncommitted changes in dependencies" do
17
+ pending
18
+ end
19
+ end