git-multirepo 1.0.0.beta49 → 1.0.0.beta50
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.
- checksums.yaml +4 -4
- data/.gitattributes +2 -2
- data/.gitbugtraq +3 -3
- data/.gitignore +38 -38
- data/.multirepo.meta +2 -2
- data/.rspec +2 -2
- data/.rubocop.yml +79 -79
- data/CHANGELOG.md +29 -25
- data/Gemfile +4 -4
- data/Gemfile.lock +42 -42
- data/LICENSE +22 -22
- data/README.md +154 -154
- data/Rakefile +1 -1
- data/bin/multi +11 -11
- data/docs/bug-repros/91565510-repro.sh +20 -20
- data/git-multirepo.gemspec +31 -31
- data/lib/git-multirepo.rb +3 -3
- data/lib/multirepo/commands/add-command.rb +51 -51
- data/lib/multirepo/commands/branch-command.rb +82 -82
- data/lib/multirepo/commands/checkout-command.rb +120 -120
- data/lib/multirepo/commands/clone-command.rb +68 -68
- data/lib/multirepo/commands/command.rb +90 -90
- data/lib/multirepo/commands/commands.rb +15 -0
- data/lib/multirepo/commands/do-command.rb +103 -103
- data/lib/multirepo/commands/graph-command.rb +43 -43
- data/lib/multirepo/commands/init-command.rb +121 -121
- data/lib/multirepo/commands/inspect-command.rb +39 -39
- data/lib/multirepo/commands/install-command.rb +153 -153
- data/lib/multirepo/commands/merge-command.rb +249 -225
- data/lib/multirepo/commands/open-command.rb +57 -57
- data/lib/multirepo/commands/remove-command.rb +48 -48
- data/lib/multirepo/commands/uninit-command.rb +18 -18
- data/lib/multirepo/commands/update-command.rb +106 -94
- data/lib/multirepo/config.rb +16 -16
- data/lib/multirepo/files/config-entry.rb +39 -39
- data/lib/multirepo/files/config-file.rb +46 -46
- data/lib/multirepo/files/lock-entry.rb +29 -29
- data/lib/multirepo/files/lock-file.rb +56 -56
- data/lib/multirepo/files/meta-file.rb +41 -41
- data/lib/multirepo/files/tracking-file.rb +9 -9
- data/lib/multirepo/files/tracking-files.rb +47 -47
- data/lib/multirepo/git/branch.rb +32 -32
- data/lib/multirepo/git/change.rb +11 -11
- data/lib/multirepo/git/commit.rb +7 -7
- data/lib/multirepo/git/git-runner.rb +56 -56
- data/lib/multirepo/git/git.rb +10 -10
- data/lib/multirepo/git/ref.rb +38 -38
- data/lib/multirepo/git/remote.rb +17 -17
- data/lib/multirepo/git/repo.rb +124 -124
- data/lib/multirepo/hooks/post-commit-hook.rb +23 -23
- data/lib/multirepo/hooks/pre-commit-hook.rb +35 -35
- data/lib/{info.rb → multirepo/info.rb} +5 -5
- data/lib/multirepo/logic/dependency.rb +6 -6
- data/lib/multirepo/logic/merge-descriptor.rb +95 -95
- data/lib/multirepo/logic/node.rb +72 -72
- data/lib/multirepo/logic/performer.rb +55 -55
- data/lib/multirepo/logic/revision-selector.rb +35 -35
- data/lib/multirepo/multirepo-exception.rb +6 -6
- data/lib/multirepo/utility/console.rb +52 -52
- data/lib/multirepo/utility/popen-runner.rb +27 -27
- data/lib/multirepo/utility/system-runner.rb +14 -14
- data/lib/multirepo/utility/utils.rb +95 -95
- data/lib/multirepo/utility/verbosity.rb +6 -6
- data/resources/.gitconfig +2 -2
- data/resources/post-commit +6 -6
- data/resources/pre-commit +6 -6
- data/spec/integration/init_spec.rb +19 -19
- data/spec/spec_helper.rb +89 -89
- metadata +33 -33
- data/lib/commands.rb +0 -15
@@ -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 ==(other)
|
26
|
-
other_path = Pathname.new(other.path)
|
27
|
-
self_path = Pathname.new(path)
|
28
|
-
other_path.exist? && self_path.exist? && other_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
|
-
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 ==(other)
|
26
|
+
other_path = Pathname.new(other.path)
|
27
|
+
self_path = Pathname.new(path)
|
28
|
+
other_path.exist? && self_path.exist? && other_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
|
+
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.exist?(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
|
-
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.exist?(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
|
+
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
|
29
|
-
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
|
+
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.exist?(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(@path, "check-ref-format --branch #{entry.branch}", Verbosity::OUTPUT_NEVER)
|
51
|
-
valid &= (entry.branch == "" || GitRunner.last_command_succeeded)
|
52
|
-
|
53
|
-
return valid
|
54
|
-
end
|
55
|
-
end
|
56
|
-
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.exist?(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(@path, "check-ref-format --branch #{entry.branch}", Verbosity::OUTPUT_NEVER)
|
51
|
+
valid &= (entry.branch == "" || GitRunner.last_command_succeeded)
|
52
|
+
|
53
|
+
return valid
|
54
|
+
end
|
55
|
+
end
|
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
|
41
|
-
end
|
1
|
+
require "pathname"
|
2
|
+
require "psych"
|
3
|
+
|
4
|
+
require "multirepo/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
|
+
end
|
@@ -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,47 +1,47 @@
|
|
1
|
-
require "multirepo/git/git-runner"
|
2
|
-
require_relative "meta-file"
|
3
|
-
require_relative "lock-file"
|
4
|
-
|
5
|
-
module MultiRepo
|
6
|
-
class TrackingFiles
|
7
|
-
attr_accessor :files
|
8
|
-
|
9
|
-
def initialize(path)
|
10
|
-
@path = path
|
11
|
-
@files = [MetaFile.new(path), LockFile.new(path)]
|
12
|
-
end
|
13
|
-
|
14
|
-
def update
|
15
|
-
updated = false
|
16
|
-
files.each { |f| updated |= f.update }
|
17
|
-
return updated
|
18
|
-
end
|
19
|
-
|
20
|
-
def stage
|
21
|
-
GitRunner.run(@path, "add --force -- #{files_pathspec}", Verbosity::OUTPUT_ON_ERROR)
|
22
|
-
end
|
23
|
-
|
24
|
-
def commit(message)
|
25
|
-
stage
|
26
|
-
|
27
|
-
output = GitRunner.run(@path, "ls-files --modified --others -- #{files_pathspec}", Verbosity::OUTPUT_NEVER)
|
28
|
-
files_are_untracked_or_modified = output.strip != ""
|
29
|
-
|
30
|
-
output = GitRunner.run(@path, "diff --name-only --cached -- #{files_pathspec}", Verbosity::OUTPUT_NEVER)
|
31
|
-
files_are_staged = output.strip != ""
|
32
|
-
|
33
|
-
must_commit = files_are_untracked_or_modified || files_are_staged
|
34
|
-
GitRunner.run(@path, "commit --no-verify -m \"#{message}\" --only -- #{files_pathspec}", Verbosity::OUTPUT_ON_ERROR) if must_commit
|
35
|
-
|
36
|
-
return must_commit
|
37
|
-
end
|
38
|
-
|
39
|
-
def delete
|
40
|
-
files.each { |f| FileUtils.rm_f(f.file) }
|
41
|
-
end
|
42
|
-
|
43
|
-
def files_pathspec
|
44
|
-
files.map{ |f| File.basename(f.file) }.join(" ")
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
1
|
+
require "multirepo/git/git-runner"
|
2
|
+
require_relative "meta-file"
|
3
|
+
require_relative "lock-file"
|
4
|
+
|
5
|
+
module MultiRepo
|
6
|
+
class TrackingFiles
|
7
|
+
attr_accessor :files
|
8
|
+
|
9
|
+
def initialize(path)
|
10
|
+
@path = path
|
11
|
+
@files = [MetaFile.new(path), LockFile.new(path)]
|
12
|
+
end
|
13
|
+
|
14
|
+
def update
|
15
|
+
updated = false
|
16
|
+
files.each { |f| updated |= f.update }
|
17
|
+
return updated
|
18
|
+
end
|
19
|
+
|
20
|
+
def stage
|
21
|
+
GitRunner.run(@path, "add --force -- #{files_pathspec}", Verbosity::OUTPUT_ON_ERROR)
|
22
|
+
end
|
23
|
+
|
24
|
+
def commit(message)
|
25
|
+
stage
|
26
|
+
|
27
|
+
output = GitRunner.run(@path, "ls-files --modified --others -- #{files_pathspec}", Verbosity::OUTPUT_NEVER)
|
28
|
+
files_are_untracked_or_modified = output.strip != ""
|
29
|
+
|
30
|
+
output = GitRunner.run(@path, "diff --name-only --cached -- #{files_pathspec}", Verbosity::OUTPUT_NEVER)
|
31
|
+
files_are_staged = output.strip != ""
|
32
|
+
|
33
|
+
must_commit = files_are_untracked_or_modified || files_are_staged
|
34
|
+
GitRunner.run(@path, "commit --no-verify -m \"#{message}\" --only -- #{files_pathspec}", Verbosity::OUTPUT_ON_ERROR) if must_commit
|
35
|
+
|
36
|
+
return must_commit
|
37
|
+
end
|
38
|
+
|
39
|
+
def delete
|
40
|
+
files.each { |f| FileUtils.rm_f(f.file) }
|
41
|
+
end
|
42
|
+
|
43
|
+
def files_pathspec
|
44
|
+
files.map{ |f| File.basename(f.file) }.join(" ")
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|