git-multirepo 1.0.0.beta65 → 1.0.0.beta66

Sign up to get free protection for your applications and to get access to all the features.
Files changed (72) hide show
  1. checksums.yaml +4 -4
  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 +95 -91
  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 +51 -51
  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 +251 -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 +129 -129
  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 +72 -72
  54. data/lib/multirepo/logic/performer.rb +55 -55
  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 +99 -99
  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,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
@@ -1,17 +1,17 @@
1
- require_relative "git-runner"
2
-
3
- module MultiRepo
4
- class Remote
5
- attr_accessor :name
6
-
7
- def initialize(repo, name)
8
- @repo = repo
9
- @name = name
10
- end
11
-
12
- def url
13
- output = GitRunner.run(@repo.path, "config --get remote.#{@name}.url", Verbosity::OUTPUT_NEVER).strip
14
- return output == "" ? nil : output
15
- end
16
- end
17
- end
1
+ require_relative "git-runner"
2
+
3
+ module MultiRepo
4
+ class Remote
5
+ attr_accessor :name
6
+
7
+ def initialize(repo, name)
8
+ @repo = repo
9
+ @name = name
10
+ end
11
+
12
+ def url
13
+ output = GitRunner.run(@repo.path, "config --get remote.#{@name}.url", Verbosity::OUTPUT_NEVER).strip
14
+ return output == "" ? nil : output
15
+ end
16
+ end
17
+ end
@@ -1,129 +1,129 @@
1
- require_relative "branch"
2
- require_relative "remote"
3
- require_relative "commit"
4
- require_relative "change"
5
-
6
- module MultiRepo
7
- class Repo
8
- attr_accessor :path
9
- attr_accessor :basename
10
-
11
- def initialize(path)
12
- @path = path
13
- @basename = Pathname.new(path).basename.to_s
14
- end
15
-
16
- # Inspection
17
-
18
- def exists?
19
- return false unless Dir.exist?("#{@path}/.git")
20
- return GitRunner.run(@path, "rev-parse --is-inside-work-tree", Verbosity::OUTPUT_NEVER).strip == "true"
21
- end
22
-
23
- def head_born?
24
- result = GitRunner.run(@path, "rev-parse HEAD --", Verbosity::OUTPUT_NEVER).strip
25
- return !result.start_with?("fatal: bad revision")
26
- end
27
-
28
- def current_revision
29
- (current_branch || current_commit).name
30
- end
31
-
32
- def clean?
33
- changes.count == 0
34
- end
35
-
36
- def local_branches
37
- branches_by_removing_prefix(%r{^refs/heads/})
38
- end
39
-
40
- def remote_branches
41
- branches_by_removing_prefix(%r{^refs/remotes/})
42
- end
43
-
44
- def changes
45
- output = GitRunner.run(@path, "status --porcelain", Verbosity::OUTPUT_NEVER)
46
- lines = output.split("\n").each(&:strip).delete_if{ |f| f == "" }
47
- lines.map { |l| Change.new(l) }
48
- end
49
-
50
- # Operations
51
-
52
- def fetch
53
- GitRunner.run_as_system(@path, "fetch --prune")
54
- GitRunner.last_command_succeeded
55
- end
56
-
57
- def clone(url, options = nil)
58
- options = {} unless options
59
-
60
- branch = options[:branch]
61
-
62
- command = "clone #{url} #{@path}"
63
- command << " -q" if options[:quiet] || false
64
- command << " -b #{branch}" if branch
65
- command << " --depth 1" if options[:shallow] || false
66
-
67
- GitRunner.run_as_system(".", command)
68
- GitRunner.last_command_succeeded
69
- end
70
-
71
- def checkout(ref_name)
72
- GitRunner.run(@path, "checkout #{ref_name}", Verbosity::OUTPUT_ON_ERROR)
73
- GitRunner.last_command_succeeded
74
- end
75
-
76
- # Current
77
-
78
- def head
79
- return nil unless exists? && head_born?
80
- Ref.new(self, "HEAD")
81
- end
82
-
83
- def current_commit
84
- return nil unless exists? && head_born?
85
- Commit.new(self, head.commit_id)
86
- end
87
-
88
- def current_branch
89
- return nil unless exists? && head_born?
90
- name = GitRunner.run(@path, "rev-parse --abbrev-ref HEAD", Verbosity::OUTPUT_NEVER).strip
91
- return nil if name == "HEAD" # Code assumes that current_branch will be nil when we're in floating HEAD
92
- Branch.new(self, name)
93
- end
94
-
95
- # Factory methods
96
-
97
- def ref(name)
98
- Ref.new(self, name)
99
- end
100
-
101
- def branch(name)
102
- Branch.new(self, name)
103
- end
104
-
105
- def remote(name)
106
- Remote.new(self, name)
107
- end
108
-
109
- def commit(id)
110
- Commit.new(self, id)
111
- end
112
-
113
- # Private helper methods
114
-
115
- private
116
-
117
- def branches_by_removing_prefix(prefix_regex)
118
- output = GitRunner.run(@path, "for-each-ref --format='%(refname)'", Verbosity::OUTPUT_NEVER)
119
- all_refs = output.strip.split("\n")
120
-
121
- # Remove surrounding quotes on Windows
122
- all_refs = all_refs.map { |l| l.sub(/^\'/, "").sub(/\'$/, "") }
123
-
124
- full_names = all_refs.select { |r| r =~ prefix_regex }
125
- names = full_names.map{ |f| f.sub(prefix_regex, "") }.delete_if{ |n| n =~ /HEAD$/ }
126
- names.map { |b| Branch.new(self, b) }
127
- end
128
- end
129
- end
1
+ require_relative "branch"
2
+ require_relative "remote"
3
+ require_relative "commit"
4
+ require_relative "change"
5
+
6
+ module MultiRepo
7
+ class Repo
8
+ attr_accessor :path
9
+ attr_accessor :basename
10
+
11
+ def initialize(path)
12
+ @path = path
13
+ @basename = Pathname.new(path).basename.to_s
14
+ end
15
+
16
+ # Inspection
17
+
18
+ def exists?
19
+ return false unless Dir.exist?("#{@path}/.git")
20
+ return GitRunner.run(@path, "rev-parse --is-inside-work-tree", Verbosity::OUTPUT_NEVER).strip == "true"
21
+ end
22
+
23
+ def head_born?
24
+ result = GitRunner.run(@path, "rev-parse HEAD --", Verbosity::OUTPUT_NEVER).strip
25
+ return !result.start_with?("fatal: bad revision")
26
+ end
27
+
28
+ def current_revision
29
+ (current_branch || current_commit).name
30
+ end
31
+
32
+ def clean?
33
+ changes.count == 0
34
+ end
35
+
36
+ def local_branches
37
+ branches_by_removing_prefix(%r{^refs/heads/})
38
+ end
39
+
40
+ def remote_branches
41
+ branches_by_removing_prefix(%r{^refs/remotes/})
42
+ end
43
+
44
+ def changes
45
+ output = GitRunner.run(@path, "status --porcelain", Verbosity::OUTPUT_NEVER)
46
+ lines = output.split("\n").each(&:strip).delete_if{ |f| f == "" }
47
+ lines.map { |l| Change.new(l) }
48
+ end
49
+
50
+ # Operations
51
+
52
+ def fetch
53
+ GitRunner.run_as_system(@path, "fetch --prune")
54
+ GitRunner.last_command_succeeded
55
+ end
56
+
57
+ def clone(url, options = nil)
58
+ options = {} unless options
59
+
60
+ branch = options[:branch]
61
+
62
+ command = "clone #{url} #{@path}"
63
+ command << " -q" if options[:quiet] || false
64
+ command << " -b #{branch}" if branch
65
+ command << " --depth 1" if options[:shallow] || false
66
+
67
+ GitRunner.run_as_system(".", command)
68
+ GitRunner.last_command_succeeded
69
+ end
70
+
71
+ def checkout(ref_name)
72
+ GitRunner.run(@path, "checkout #{ref_name}", Verbosity::OUTPUT_ON_ERROR)
73
+ GitRunner.last_command_succeeded
74
+ end
75
+
76
+ # Current
77
+
78
+ def head
79
+ return nil unless exists? && head_born?
80
+ Ref.new(self, "HEAD")
81
+ end
82
+
83
+ def current_commit
84
+ return nil unless exists? && head_born?
85
+ Commit.new(self, head.commit_id)
86
+ end
87
+
88
+ def current_branch
89
+ return nil unless exists? && head_born?
90
+ name = GitRunner.run(@path, "rev-parse --abbrev-ref HEAD", Verbosity::OUTPUT_NEVER).strip
91
+ return nil if name == "HEAD" # Code assumes that current_branch will be nil when we're in floating HEAD
92
+ Branch.new(self, name)
93
+ end
94
+
95
+ # Factory methods
96
+
97
+ def ref(name)
98
+ Ref.new(self, name)
99
+ end
100
+
101
+ def branch(name)
102
+ Branch.new(self, name)
103
+ end
104
+
105
+ def remote(name)
106
+ Remote.new(self, name)
107
+ end
108
+
109
+ def commit(id)
110
+ Commit.new(self, id)
111
+ end
112
+
113
+ # Private helper methods
114
+
115
+ private
116
+
117
+ def branches_by_removing_prefix(prefix_regex)
118
+ output = GitRunner.run(@path, "for-each-ref --format='%(refname)'", Verbosity::OUTPUT_NEVER)
119
+ all_refs = output.strip.split("\n")
120
+
121
+ # Remove surrounding quotes on Windows
122
+ all_refs = all_refs.map { |l| l.sub(/^\'/, "").sub(/\'$/, "") }
123
+
124
+ full_names = all_refs.select { |r| r =~ prefix_regex }
125
+ names = full_names.map{ |f| f.sub(prefix_regex, "") }.delete_if{ |n| n =~ /HEAD$/ }
126
+ names.map { |b| Branch.new(self, b) }
127
+ end
128
+ end
129
+ end
@@ -1,23 +1,23 @@
1
- require "multirepo/files/config-file"
2
- require "multirepo/files/tracking-files"
3
- require "multirepo/utility/utils"
4
- require "multirepo/utility/console"
5
-
6
- module MultiRepo
7
- class PostCommitHook
8
- def self.run
9
- Config.instance.running_git_hook = true
10
-
11
- Console.log_step("Performing post-commit operations...")
12
-
13
- # Works around bug #91565510 (https://www.pivotaltracker.com/story/show/91565510)
14
- TrackingFiles.new(".").stage
15
- Console.log_info("Cleaned-up staging area")
16
-
17
- exit 0
18
- rescue StandardError => e
19
- Console.log_error("Post-commit hook failed to execute! #{e.message}")
20
- exit 1
21
- end
22
- end
23
- end
1
+ require "multirepo/files/config-file"
2
+ require "multirepo/files/tracking-files"
3
+ require "multirepo/utility/utils"
4
+ require "multirepo/utility/console"
5
+
6
+ module MultiRepo
7
+ class PostCommitHook
8
+ def self.run
9
+ Config.instance.running_git_hook = true
10
+
11
+ Console.log_step("Performing post-commit operations...")
12
+
13
+ # Works around bug #91565510 (https://www.pivotaltracker.com/story/show/91565510)
14
+ TrackingFiles.new(".").stage
15
+ Console.log_info("Cleaned-up staging area")
16
+
17
+ exit 0
18
+ rescue StandardError => e
19
+ Console.log_error("Post-commit hook failed to execute! #{e.message}")
20
+ exit 1
21
+ end
22
+ end
23
+ end
@@ -1,35 +1,35 @@
1
- require "multirepo/files/config-file"
2
- require "multirepo/files/tracking-files"
3
- require "multirepo/utility/utils"
4
- require "multirepo/utility/console"
5
-
6
- module MultiRepo
7
- class PreCommitHook
8
- def self.run
9
- Config.instance.running_git_hook = true
10
-
11
- Console.log_step("Performing pre-commit operations...")
12
-
13
- dependencies_clean = Utils.dependencies_clean?(ConfigFile.new(".").load_entries)
14
-
15
- unless dependencies_clean
16
- Console.log_error("You must commit changes to your dependencies before you can commit this repo")
17
- exit 1
18
- end
19
-
20
- tracking_files = TrackingFiles.new(".")
21
- tracking_files.update
22
- tracking_files.stage
23
-
24
- Console.log_info("Updated and staged tracking files")
25
-
26
- exit 0
27
- rescue MultiRepoException => e
28
- Console.log_error("Can't perform commit. #{e.message}")
29
- exit 1
30
- rescue StandardError => e
31
- Console.log_error("Pre-commit hook failed to execute! #{e.message}")
32
- exit 1
33
- end
34
- end
35
- end
1
+ require "multirepo/files/config-file"
2
+ require "multirepo/files/tracking-files"
3
+ require "multirepo/utility/utils"
4
+ require "multirepo/utility/console"
5
+
6
+ module MultiRepo
7
+ class PreCommitHook
8
+ def self.run
9
+ Config.instance.running_git_hook = true
10
+
11
+ Console.log_step("Performing pre-commit operations...")
12
+
13
+ dependencies_clean = Utils.dependencies_clean?(ConfigFile.new(".").load_entries)
14
+
15
+ unless dependencies_clean
16
+ Console.log_error("You must commit changes to your dependencies before you can commit this repo")
17
+ exit 1
18
+ end
19
+
20
+ tracking_files = TrackingFiles.new(".")
21
+ tracking_files.update
22
+ tracking_files.stage
23
+
24
+ Console.log_info("Updated and staged tracking files")
25
+
26
+ exit 0
27
+ rescue MultiRepoException => e
28
+ Console.log_error("Can't perform commit. #{e.message}")
29
+ exit 1
30
+ rescue StandardError => e
31
+ Console.log_error("Pre-commit hook failed to execute! #{e.message}")
32
+ exit 1
33
+ end
34
+ end
35
+ end
@@ -1,5 +1,5 @@
1
- module MultiRepo
2
- NAME = "git-multirepo"
3
- VERSION = "1.0.0.beta65"
4
- DESCRIPTION = "Track multiple Git repositories side-by-side."
5
- end
1
+ module MultiRepo
2
+ NAME = "git-multirepo"
3
+ VERSION = "1.0.0.beta66"
4
+ DESCRIPTION = "Track multiple Git repositories side-by-side."
5
+ end
@@ -1,6 +1,6 @@
1
- module MultiRepo
2
- class Dependency
3
- attr_accessor :config_entry
4
- attr_accessor :lock_entry
5
- end
6
- end
1
+ module MultiRepo
2
+ class Dependency
3
+ attr_accessor :config_entry
4
+ attr_accessor :lock_entry
5
+ end
6
+ end