git-multirepo 1.0.0.beta45 → 1.0.0.beta46

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 (68) 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 +21 -21
  6. data/.multirepo.lock +26 -26
  7. data/.multirepo.meta +2 -2
  8. data/.rspec +2 -2
  9. data/Gemfile +4 -4
  10. data/Gemfile.lock +42 -42
  11. data/LICENSE +22 -22
  12. data/README.md +154 -144
  13. data/Rakefile +2 -2
  14. data/bin/multi +10 -10
  15. data/docs/bug-repros/91565510-repro.sh +20 -20
  16. data/docs/git-multirepo-cheatsheet.docx +0 -0
  17. data/git-multirepo.gemspec +31 -31
  18. data/lib/commands.rb +14 -14
  19. data/lib/git-multirepo.rb +2 -2
  20. data/lib/info.rb +4 -4
  21. data/lib/multirepo/commands/add-command.rb +50 -50
  22. data/lib/multirepo/commands/branch-command.rb +81 -81
  23. data/lib/multirepo/commands/checkout-command.rb +119 -119
  24. data/lib/multirepo/commands/clone-command.rb +67 -67
  25. data/lib/multirepo/commands/command.rb +89 -89
  26. data/lib/multirepo/commands/do-command.rb +102 -100
  27. data/lib/multirepo/commands/graph-command.rb +42 -42
  28. data/lib/multirepo/commands/init-command.rb +119 -119
  29. data/lib/multirepo/commands/inspect-command.rb +38 -39
  30. data/lib/multirepo/commands/install-command.rb +146 -137
  31. data/lib/multirepo/commands/merge-command.rb +225 -225
  32. data/lib/multirepo/commands/open-command.rb +56 -55
  33. data/lib/multirepo/commands/remove-command.rb +47 -47
  34. data/lib/multirepo/commands/uninit-command.rb +17 -17
  35. data/lib/multirepo/commands/update-command.rb +55 -55
  36. data/lib/multirepo/config.rb +15 -15
  37. data/lib/multirepo/files/config-entry.rb +38 -38
  38. data/lib/multirepo/files/config-file.rb +45 -45
  39. data/lib/multirepo/files/lock-entry.rb +28 -28
  40. data/lib/multirepo/files/lock-file.rb +55 -55
  41. data/lib/multirepo/files/meta-file.rb +40 -40
  42. data/lib/multirepo/files/tracking-file.rb +8 -8
  43. data/lib/multirepo/files/tracking-files.rb +46 -46
  44. data/lib/multirepo/git/branch.rb +31 -31
  45. data/lib/multirepo/git/change.rb +10 -10
  46. data/lib/multirepo/git/commit.rb +6 -6
  47. data/lib/multirepo/git/git-runner.rb +46 -46
  48. data/lib/multirepo/git/git.rb +9 -9
  49. data/lib/multirepo/git/ref.rb +37 -37
  50. data/lib/multirepo/git/remote.rb +16 -16
  51. data/lib/multirepo/git/repo.rb +122 -122
  52. data/lib/multirepo/hooks/post-commit-hook.rb +22 -22
  53. data/lib/multirepo/hooks/pre-commit-hook.rb +34 -34
  54. data/lib/multirepo/logic/dependency.rb +5 -5
  55. data/lib/multirepo/logic/merge-descriptor.rb +94 -94
  56. data/lib/multirepo/logic/node.rb +71 -71
  57. data/lib/multirepo/logic/performer.rb +56 -56
  58. data/lib/multirepo/logic/revision-selector.rb +34 -34
  59. data/lib/multirepo/multirepo-exception.rb +5 -5
  60. data/lib/multirepo/utility/console.rb +51 -51
  61. data/lib/multirepo/utility/runner.rb +34 -34
  62. data/lib/multirepo/utility/utils.rb +94 -94
  63. data/resources/.gitconfig +2 -2
  64. data/resources/post-commit +5 -5
  65. data/resources/pre-commit +5 -5
  66. data/spec/integration/init_spec.rb +18 -18
  67. data/spec/spec_helper.rb +89 -89
  68. metadata +2 -2
@@ -1,18 +1,18 @@
1
- require "multirepo/utility/console"
2
-
3
- module MultiRepo
4
- class UninitCommand < Command
5
- self.command = "uninit"
6
- self.summary = "Removes all traces of multirepo in the current multirepo repository."
7
-
8
- def run
9
- ensure_in_work_tree
10
-
11
- FileUtils.rm_f(".multirepo")
12
- TrackingFiles.new(".").delete
13
- uninstall_hooks
14
-
15
- Console.log_step("All traces of multirepo have been removed from this repository")
16
- end
17
- end
1
+ require "multirepo/utility/console"
2
+
3
+ module MultiRepo
4
+ class UninitCommand < Command
5
+ self.command = "uninit"
6
+ self.summary = "Removes all traces of multirepo in the current multirepo repository."
7
+
8
+ def run
9
+ ensure_in_work_tree
10
+
11
+ FileUtils.rm_f(".multirepo")
12
+ TrackingFiles.new(".").delete
13
+ uninstall_hooks
14
+
15
+ Console.log_step("All traces of multirepo have been removed from this repository")
16
+ end
17
+ end
18
18
  end
@@ -1,56 +1,56 @@
1
- require "multirepo/utility/console"
2
- require "multirepo/files/tracking-files"
3
-
4
- module MultiRepo
5
- class UpdateCommand < Command
6
- self.command = "update"
7
- self.summary = "Force-updates the multirepo tracking files."
8
-
9
- def self.options
10
- [
11
- ['[--force]', 'Update the tracking files even if dependencies contain uncommitted changes.'],
12
- ['[--commit]', 'Commit the tracking files after updating them.']
13
- ].concat(super)
14
- end
15
-
16
- def initialize(argv)
17
- @commit = argv.flag?("commit")
18
- @force = argv.flag?("force")
19
- super
20
- end
21
-
22
- def run
23
- ensure_in_work_tree
24
- ensure_multirepo_enabled
25
-
26
- Console.log_step("Updating...")
27
-
28
- dependencies_clean = Utils.dependencies_clean?(ConfigFile.new(".").load_entries)
29
- if dependencies_clean
30
- update_lock_file_step("Updated tracking files")
31
- elsif !dependencies_clean && @force
32
- update_lock_file_step("Force-updated tracking files (ignoring uncommitted changes)")
33
- else
34
- raise MultiRepoException, "Can't update because not all dependencies are clean"
35
- end
36
-
37
- Console.log_step("Done!")
38
- end
39
-
40
- def update_lock_file_step(log_message)
41
- tracking_files = TrackingFiles.new(".")
42
- changed = tracking_files.update
43
-
44
- if changed
45
- Console.log_substep("Updated tracking files")
46
- else
47
- Console.log_substep("Tracking files are already up-to-date")
48
- end
49
-
50
- if @commit
51
- committed = tracking_files.commit("[multirepo] Updated tracking files manually")
52
- Console.log_substep("Committed tracking files") if committed
53
- end
54
- end
55
- end
1
+ require "multirepo/utility/console"
2
+ require "multirepo/files/tracking-files"
3
+
4
+ module MultiRepo
5
+ class UpdateCommand < Command
6
+ self.command = "update"
7
+ self.summary = "Force-updates the multirepo tracking files."
8
+
9
+ def self.options
10
+ [
11
+ ['[--force]', 'Update the tracking files even if dependencies contain uncommitted changes.'],
12
+ ['[--commit]', 'Commit the tracking files after updating them.']
13
+ ].concat(super)
14
+ end
15
+
16
+ def initialize(argv)
17
+ @commit = argv.flag?("commit")
18
+ @force = argv.flag?("force")
19
+ super
20
+ end
21
+
22
+ def run
23
+ ensure_in_work_tree
24
+ ensure_multirepo_enabled
25
+
26
+ Console.log_step("Updating...")
27
+
28
+ dependencies_clean = Utils.dependencies_clean?(ConfigFile.new(".").load_entries)
29
+ if dependencies_clean
30
+ update_lock_file_step("Updated tracking files")
31
+ elsif !dependencies_clean && @force
32
+ update_lock_file_step("Force-updated tracking files (ignoring uncommitted changes)")
33
+ else
34
+ raise MultiRepoException, "Can't update because not all dependencies are clean"
35
+ end
36
+
37
+ Console.log_step("Done!")
38
+ end
39
+
40
+ def update_lock_file_step(log_message)
41
+ tracking_files = TrackingFiles.new(".")
42
+ changed = tracking_files.update
43
+
44
+ if changed
45
+ Console.log_substep("Updated tracking files")
46
+ else
47
+ Console.log_substep("Tracking files are already up-to-date")
48
+ end
49
+
50
+ if @commit
51
+ committed = tracking_files.commit("[multirepo] Updated tracking files manually")
52
+ Console.log_substep("Committed tracking files") if committed
53
+ end
54
+ end
55
+ end
56
56
  end
@@ -1,16 +1,16 @@
1
- require "singleton"
2
-
3
- module MultiRepo
4
- class Config
5
- include Singleton
6
-
7
- attr_accessor :verbose
8
- @verbose = false
9
-
10
- attr_accessor :running_git_hook
11
- @running_git_hook = false
12
-
13
- attr_accessor :git_executable
14
- @git_executable = nil
15
- end
1
+ require "singleton"
2
+
3
+ module MultiRepo
4
+ class Config
5
+ include Singleton
6
+
7
+ attr_accessor :verbose
8
+ @verbose = false
9
+
10
+ attr_accessor :running_git_hook
11
+ @running_git_hook = false
12
+
13
+ attr_accessor :git_executable
14
+ @git_executable = nil
15
+ end
16
16
  end
@@ -1,39 +1,39 @@
1
- require "securerandom"
2
-
3
- require "multirepo/utility/console"
4
- require "multirepo/git/repo"
5
-
6
- module MultiRepo
7
- class ConfigEntry
8
- attr_accessor :id
9
- attr_accessor :path
10
- attr_accessor :url
11
- attr_accessor :repo
12
-
13
- def encode_with(coder)
14
- coder["id"] = @id
15
- coder["path"] = @path
16
- coder["url"] = @url
17
- end
18
-
19
- def initialize(repo)
20
- @id = SecureRandom.uuid
21
- @path = repo.path
22
- @url = repo.exists? ? repo.remote('origin').url : nil
23
- end
24
-
25
- def ==(entry)
26
- entry_path = Pathname.new(entry.path)
27
- self_path = Pathname.new(self.path)
28
- entry_path.exist? && self_path.exist? && entry_path.realpath == self_path.realpath
29
- end
30
-
31
- def repo
32
- Repo.new(path)
33
- end
34
-
35
- def name
36
- repo.basename
37
- end
38
- end
1
+ require "securerandom"
2
+
3
+ require "multirepo/utility/console"
4
+ require "multirepo/git/repo"
5
+
6
+ module MultiRepo
7
+ class ConfigEntry
8
+ attr_accessor :id
9
+ attr_accessor :path
10
+ attr_accessor :url
11
+ attr_accessor :repo
12
+
13
+ def encode_with(coder)
14
+ coder["id"] = @id
15
+ coder["path"] = @path
16
+ coder["url"] = @url
17
+ end
18
+
19
+ def initialize(repo)
20
+ @id = SecureRandom.uuid
21
+ @path = repo.path
22
+ @url = repo.exists? ? repo.remote('origin').url : nil
23
+ end
24
+
25
+ def ==(entry)
26
+ entry_path = Pathname.new(entry.path)
27
+ self_path = Pathname.new(self.path)
28
+ entry_path.exist? && self_path.exist? && entry_path.realpath == self_path.realpath
29
+ end
30
+
31
+ def repo
32
+ Repo.new(path)
33
+ end
34
+
35
+ def name
36
+ repo.basename
37
+ end
38
+ end
39
39
  end
@@ -1,46 +1,46 @@
1
- require "fileutils"
2
- require "pathname"
3
-
4
- require_relative "config-entry"
5
-
6
- module MultiRepo
7
- class ConfigFile
8
- FILENAME = ".multirepo"
9
-
10
- def initialize(path)
11
- @path = path
12
- end
13
-
14
- def file
15
- File.join(@path, FILENAME)
16
- end
17
-
18
- def filename
19
- FILENAME
20
- end
21
-
22
- def exists?
23
- File.exists?(file)
24
- end
25
-
26
- def load_entries
27
- Psych.load(File.read(file))
28
- end
29
-
30
- def save_entries(entries)
31
- File.write(file, Psych.dump(entries))
32
- end
33
-
34
- def entry_exists?(entry)
35
- load_entries.any? { |e| e == entry }
36
- end
37
-
38
- def add_entry(entry)
39
- save_entries(load_entries.push(entry))
40
- end
41
-
42
- def remove_entry(entry)
43
- save_entries(load_entries.delete_if { |e| e == entry })
44
- end
45
- end
1
+ require "fileutils"
2
+ require "pathname"
3
+
4
+ require_relative "config-entry"
5
+
6
+ module MultiRepo
7
+ class ConfigFile
8
+ FILENAME = ".multirepo"
9
+
10
+ def initialize(path)
11
+ @path = path
12
+ end
13
+
14
+ def file
15
+ File.join(@path, FILENAME)
16
+ end
17
+
18
+ def filename
19
+ FILENAME
20
+ end
21
+
22
+ def exists?
23
+ File.exists?(file)
24
+ end
25
+
26
+ def load_entries
27
+ Psych.load(File.read(file))
28
+ end
29
+
30
+ def save_entries(entries)
31
+ File.write(file, Psych.dump(entries))
32
+ end
33
+
34
+ def entry_exists?(entry)
35
+ load_entries.any? { |e| e == entry }
36
+ end
37
+
38
+ def add_entry(entry)
39
+ save_entries(load_entries.push(entry))
40
+ end
41
+
42
+ def remove_entry(entry)
43
+ save_entries(load_entries.delete_if { |e| e == entry })
44
+ end
45
+ end
46
46
  end
@@ -1,29 +1,29 @@
1
- require "multirepo/utility/console"
2
- require "multirepo/git/repo"
3
-
4
- module MultiRepo
5
- class LockEntry
6
- attr_accessor :name
7
- attr_accessor :id
8
- attr_accessor :head
9
- attr_accessor :branch
10
-
11
- def encode_with(coder)
12
- coder["name"] = @name
13
- coder["id"] = @id
14
- coder["head"] = @head
15
- coder["branch"] = @branch
16
- end
17
-
18
- def initialize(config_entry)
19
- @name = config_entry.name
20
- @id = config_entry.id
21
-
22
- head = config_entry.repo.head
23
- @head = head.commit_id
24
-
25
- current_branch = config_entry.repo.current_branch
26
- @branch = current_branch ? current_branch.name : nil
27
- end
28
- end
1
+ require "multirepo/utility/console"
2
+ require "multirepo/git/repo"
3
+
4
+ module MultiRepo
5
+ class LockEntry
6
+ attr_accessor :name
7
+ attr_accessor :id
8
+ attr_accessor :head
9
+ attr_accessor :branch
10
+
11
+ def encode_with(coder)
12
+ coder["name"] = @name
13
+ coder["id"] = @id
14
+ coder["head"] = @head
15
+ coder["branch"] = @branch
16
+ end
17
+
18
+ def initialize(config_entry)
19
+ @name = config_entry.name
20
+ @id = config_entry.id
21
+
22
+ head = config_entry.repo.head
23
+ @head = head.commit_id
24
+
25
+ current_branch = config_entry.repo.current_branch
26
+ @branch = current_branch ? current_branch.name : nil
27
+ end
28
+ end
29
29
  end
@@ -1,56 +1,56 @@
1
- require "pathname"
2
- require "psych"
3
-
4
- require_relative "tracking-file"
5
- require_relative "lock-entry"
6
- require_relative "config-file"
7
-
8
- module MultiRepo
9
- class LockFile < TrackingFile
10
- FILENAME = ".multirepo.lock"
11
-
12
- def initialize(path)
13
- @path = path
14
- end
15
-
16
- def file
17
- File.join(@path, FILENAME)
18
- end
19
-
20
- def filename
21
- FILENAME
22
- end
23
-
24
- def exists?
25
- File.exists?(file)
26
- end
27
-
28
- def load_entries
29
- Psych.load(File.read(file))
30
- end
31
-
32
- def update
33
- config_entries = ConfigFile.new(@path).load_entries
34
- lock_entries = config_entries.map { |c| LockEntry.new(c) }
35
- content = Psych.dump(lock_entries)
36
- return update_internal(file, content)
37
- end
38
-
39
- def validate!
40
- load_entries.all? { |e| validate_entry! e }
41
- end
42
-
43
- def validate_entry!(entry)
44
- valid = true
45
-
46
- # head
47
- valid &= /\b([a-f0-9]{40})\b/ =~ entry.head.to_s
48
-
49
- # branch
50
- GitRunner.run_in_working_dir(@path, "check-ref-format --branch #{entry.branch}", Runner::Verbosity::OUTPUT_NEVER)
51
- valid &= (entry.branch == "" || GitRunner.last_command_succeeded)
52
-
53
- return valid
54
- end
55
- end
1
+ require "pathname"
2
+ require "psych"
3
+
4
+ require_relative "tracking-file"
5
+ require_relative "lock-entry"
6
+ require_relative "config-file"
7
+
8
+ module MultiRepo
9
+ class LockFile < TrackingFile
10
+ FILENAME = ".multirepo.lock"
11
+
12
+ def initialize(path)
13
+ @path = path
14
+ end
15
+
16
+ def file
17
+ File.join(@path, FILENAME)
18
+ end
19
+
20
+ def filename
21
+ FILENAME
22
+ end
23
+
24
+ def exists?
25
+ File.exists?(file)
26
+ end
27
+
28
+ def load_entries
29
+ Psych.load(File.read(file))
30
+ end
31
+
32
+ def update
33
+ config_entries = ConfigFile.new(@path).load_entries
34
+ lock_entries = config_entries.map { |c| LockEntry.new(c) }
35
+ content = Psych.dump(lock_entries)
36
+ return update_internal(file, content)
37
+ end
38
+
39
+ def validate!
40
+ load_entries.all? { |e| validate_entry! e }
41
+ end
42
+
43
+ def validate_entry!(entry)
44
+ valid = true
45
+
46
+ # head
47
+ valid &= /\b([a-f0-9]{40})\b/ =~ entry.head.to_s
48
+
49
+ # branch
50
+ GitRunner.run_in_working_dir(@path, "check-ref-format --branch #{entry.branch}", Runner::Verbosity::OUTPUT_NEVER)
51
+ valid &= (entry.branch == "" || GitRunner.last_command_succeeded)
52
+
53
+ return valid
54
+ end
55
+ end
56
56
  end
@@ -1,41 +1,41 @@
1
- require "pathname"
2
- require "psych"
3
-
4
- require "info"
5
- require_relative "tracking-file"
6
- require_relative "lock-entry"
7
- require_relative "config-file"
8
-
9
- module MultiRepo
10
- class MetaFile < TrackingFile
11
- FILENAME = ".multirepo.meta"
12
-
13
- attr_accessor :version
14
-
15
- def initialize(path)
16
- @path = path
17
- @version = MultiRepo::VERSION
18
- end
19
-
20
- def file
21
- File.join(@path, FILENAME)
22
- end
23
-
24
- def filename
25
- FILENAME
26
- end
27
-
28
- def encode_with(coder)
29
- coder["version"] = @version
30
- end
31
-
32
- def load
33
- Psych.load(File.read(file))
34
- end
35
-
36
- def update
37
- content = Psych.dump(self)
38
- return update_internal(file, content)
39
- end
40
- end
1
+ require "pathname"
2
+ require "psych"
3
+
4
+ require "info"
5
+ require_relative "tracking-file"
6
+ require_relative "lock-entry"
7
+ require_relative "config-file"
8
+
9
+ module MultiRepo
10
+ class MetaFile < TrackingFile
11
+ FILENAME = ".multirepo.meta"
12
+
13
+ attr_accessor :version
14
+
15
+ def initialize(path)
16
+ @path = path
17
+ @version = MultiRepo::VERSION
18
+ end
19
+
20
+ def file
21
+ File.join(@path, FILENAME)
22
+ end
23
+
24
+ def filename
25
+ FILENAME
26
+ end
27
+
28
+ def encode_with(coder)
29
+ coder["version"] = @version
30
+ end
31
+
32
+ def load
33
+ Psych.load(File.read(file))
34
+ end
35
+
36
+ def update
37
+ content = Psych.dump(self)
38
+ return update_internal(file, content)
39
+ end
40
+ end
41
41
  end
@@ -1,9 +1,9 @@
1
- module MultiRepo
2
- class TrackingFile
3
- def update_internal(file, new_content)
4
- old_content = File.exists?(file) ? File.read(file) : nil
5
- File.write(file, new_content)
6
- return new_content != old_content
7
- end
8
- end
1
+ module MultiRepo
2
+ class TrackingFile
3
+ def update_internal(file, new_content)
4
+ old_content = File.exists?(file) ? File.read(file) : nil
5
+ File.write(file, new_content)
6
+ return new_content != old_content
7
+ end
8
+ end
9
9
  end