git-multirepo 1.0.0.beta27 → 1.0.0.beta29
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/.gitignore +38 -38
- data/.rspec +2 -2
- data/Gemfile +4 -4
- data/Gemfile.lock +38 -38
- data/LICENSE +22 -22
- data/README.md +141 -141
- data/Rakefile +2 -2
- data/bin/multi +10 -10
- data/git-multirepo.gemspec +29 -29
- data/lib/commands.rb +11 -11
- data/lib/git-multirepo.rb +1 -3
- data/lib/info.rb +4 -4
- data/lib/multirepo/commands/add-command.rb +50 -51
- data/lib/multirepo/commands/branch-command.rb +59 -59
- data/lib/multirepo/commands/checkout-command.rb +139 -119
- data/lib/multirepo/commands/clone-command.rb +69 -69
- data/lib/multirepo/commands/command.rb +62 -62
- data/lib/multirepo/commands/fetch-command.rb +23 -23
- data/lib/multirepo/commands/init-command.rb +94 -51
- data/lib/multirepo/commands/install-command.rb +104 -87
- data/lib/multirepo/commands/open-command.rb +25 -25
- data/lib/multirepo/commands/remove-command.rb +48 -48
- data/lib/multirepo/commands/uninit-command.rb +19 -19
- data/lib/multirepo/commands/update-command.rb +53 -47
- data/lib/multirepo/config.rb +15 -15
- data/lib/multirepo/files/config-entry.rb +34 -34
- data/lib/multirepo/files/config-file.rb +33 -37
- data/lib/multirepo/files/lock-entry.rb +25 -25
- data/lib/multirepo/files/lock-file.rb +44 -39
- data/lib/multirepo/git/branch.rb +27 -27
- data/lib/multirepo/git/change.rb +10 -10
- data/lib/multirepo/git/commit.rb +18 -0
- data/lib/multirepo/git/git.rb +42 -42
- data/lib/multirepo/git/remote.rb +15 -15
- data/lib/multirepo/git/repo.rb +71 -66
- data/lib/multirepo/hooks/pre-commit-hook.rb +29 -25
- data/lib/multirepo/multirepo-exception.rb +5 -5
- data/lib/multirepo/utility/console.rb +51 -51
- data/lib/multirepo/utility/runner.rb +32 -32
- data/lib/multirepo/utility/utils.rb +66 -54
- data/resources/.gitconfig +3 -0
- data/resources/pre-commit +5 -5
- data/spec/integration/init_spec.rb +18 -22
- data/spec/spec_helper.rb +89 -89
- metadata +5 -7
- data/lib/multirepo/hooks/post-merge-hook.rb +0 -20
- data/lib/multirepo/hooks/prepare-commit-msg-hook.rb +0 -28
- data/resources/post-merge +0 -6
- data/resources/prepare-commit-msg +0 -6
@@ -1,88 +1,105 @@
|
|
1
|
-
require "multirepo/utility/console"
|
2
|
-
require "multirepo/utility/utils"
|
3
|
-
require "multirepo/git/repo"
|
4
|
-
require "multirepo/commands/checkout-command"
|
5
|
-
|
6
|
-
module MultiRepo
|
7
|
-
class InstallCommand < Command
|
8
|
-
self.command = "install"
|
9
|
-
self.summary = "Clones and checks out dependencies as defined in the version-controlled multirepo metadata files and installs git-multirepo's local git hooks."
|
10
|
-
|
11
|
-
def self.options
|
12
|
-
[['[--hooks]', 'Only install local git hooks.']].concat(super)
|
13
|
-
end
|
14
|
-
|
15
|
-
def initialize(argv)
|
16
|
-
@hooks = argv.flag?("hooks")
|
17
|
-
super
|
18
|
-
end
|
19
|
-
|
20
|
-
def run
|
21
|
-
validate_in_work_tree
|
22
|
-
ensure_multirepo_tracked
|
23
|
-
|
24
|
-
if @hooks
|
25
|
-
Console.log_step("Installing hooks in main repo and all dependencies...")
|
26
|
-
install_hooks_step
|
27
|
-
else
|
28
|
-
Console.log_step("Cloning dependencies and installing hooks...")
|
29
|
-
|
30
|
-
end
|
31
|
-
|
32
|
-
Console.log_step("Done!")
|
33
|
-
rescue MultiRepoException => e
|
34
|
-
Console.log_error(e.message)
|
35
|
-
end
|
36
|
-
|
37
|
-
def
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
1
|
+
require "multirepo/utility/console"
|
2
|
+
require "multirepo/utility/utils"
|
3
|
+
require "multirepo/git/repo"
|
4
|
+
require "multirepo/commands/checkout-command"
|
5
|
+
|
6
|
+
module MultiRepo
|
7
|
+
class InstallCommand < Command
|
8
|
+
self.command = "install"
|
9
|
+
self.summary = "Clones and checks out dependencies as defined in the version-controlled multirepo metadata files and installs git-multirepo's local git hooks."
|
10
|
+
|
11
|
+
def self.options
|
12
|
+
[['[--hooks]', 'Only install local git hooks.']].concat(super)
|
13
|
+
end
|
14
|
+
|
15
|
+
def initialize(argv)
|
16
|
+
@hooks = argv.flag?("hooks")
|
17
|
+
super
|
18
|
+
end
|
19
|
+
|
20
|
+
def run
|
21
|
+
validate_in_work_tree
|
22
|
+
ensure_multirepo_tracked
|
23
|
+
|
24
|
+
if @hooks
|
25
|
+
Console.log_step("Installing hooks in main repo and all dependencies...")
|
26
|
+
install_hooks_step
|
27
|
+
else
|
28
|
+
Console.log_step("Cloning dependencies and installing hooks...")
|
29
|
+
full_install
|
30
|
+
end
|
31
|
+
|
32
|
+
Console.log_step("Done!")
|
33
|
+
rescue MultiRepoException => e
|
34
|
+
Console.log_error(e.message)
|
35
|
+
end
|
36
|
+
|
37
|
+
def full_install
|
38
|
+
install_dependencies_step
|
39
|
+
install_hooks_step
|
40
|
+
update_gitconfigs_step
|
41
|
+
end
|
42
|
+
|
43
|
+
def install_dependencies_step
|
44
|
+
# Read config entries as-is on disk, without prior checkout
|
45
|
+
config_entries = ConfigFile.load
|
46
|
+
Console.log_substep("Installing #{config_entries.count} dependencies...");
|
47
|
+
|
48
|
+
# Clone or fetch all configured dependencies to make sure nothing is missing locally
|
49
|
+
config_entries.each { |entry| clone_or_fetch(entry) }
|
50
|
+
|
51
|
+
# Checkout the appropriate branches as specified in the lock file
|
52
|
+
checkout_command = CheckoutCommand.new(CLAide::ARGV.new([]))
|
53
|
+
checkout_command.dependencies_checkout_step(CheckoutCommand::CheckoutMode::LATEST)
|
54
|
+
end
|
55
|
+
|
56
|
+
def install_hooks_step
|
57
|
+
install_hooks(".")
|
58
|
+
Console.log_substep("Installed git hooks in main repo")
|
59
|
+
|
60
|
+
multirepo_enabled_dependencies.each do |entry|
|
61
|
+
install_hooks(entry.repo.path)
|
62
|
+
Console.log_substep("Installed hooks in multirepo-enabled dependency '#{entry.repo.path}'")
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def update_gitconfigs_step
|
67
|
+
update_gitconfig(".")
|
68
|
+
Console.log_substep("Updated .git/config file")
|
69
|
+
|
70
|
+
multirepo_enabled_dependencies.each do |entry|
|
71
|
+
update_gitconfig(entry.repo.path)
|
72
|
+
Console.log_substep("Updated .git/config in multirepo-enabled dependency '#{entry.repo.path}'")
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def clone_or_fetch(entry)
|
77
|
+
if entry.repo.exists?
|
78
|
+
check_repo_validity(entry)
|
79
|
+
fetch_repo(entry)
|
80
|
+
else
|
81
|
+
clone_repo(entry)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
# Repo operations
|
86
|
+
|
87
|
+
def fetch_repo(entry)
|
88
|
+
Console.log_substep("Working copy '#{entry.repo.path}' already exists, fetching instead...")
|
89
|
+
raise MultiRepoException, "Could not fetch from remote #{entry.repo.remote('origin').url}" unless entry.repo.fetch
|
90
|
+
end
|
91
|
+
|
92
|
+
def clone_repo(entry)
|
93
|
+
Console.log_substep("Cloning #{entry.url} into '#{entry.repo.path}'")
|
94
|
+
raise MultiRepoException, "Could not clone remote #{entry.url}" unless entry.repo.clone(entry.url)
|
95
|
+
end
|
96
|
+
|
97
|
+
# Validation
|
98
|
+
|
99
|
+
def check_repo_validity(entry)
|
100
|
+
unless entry.repo.remote("origin").url == entry.url
|
101
|
+
raise MultiRepoException, "'#{entry.path}' origin URL (#{entry.repo.remote('origin').url}) does not match entry (#{entry.url})!"
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
88
105
|
end
|
@@ -1,26 +1,26 @@
|
|
1
|
-
require "os"
|
2
|
-
|
3
|
-
require "multirepo/utility/console"
|
4
|
-
require "multirepo/utility/utils"
|
5
|
-
|
6
|
-
module MultiRepo
|
7
|
-
class OpenCommand < Command
|
8
|
-
self.command = "open"
|
9
|
-
self.summary = "Opens all dependencies in the current OS's file explorer."
|
10
|
-
|
11
|
-
def run
|
12
|
-
validate_in_work_tree
|
13
|
-
ensure_multirepo_enabled
|
14
|
-
|
15
|
-
ConfigFile.load.each do |entry|
|
16
|
-
if OS.osx?
|
17
|
-
`open "#{entry.repo.path}"`
|
18
|
-
elsif OS.windows?
|
19
|
-
`explorer "#{Utils.convert_to_windows_path(entry.repo.path)}"`
|
20
|
-
end
|
21
|
-
end
|
22
|
-
rescue MultiRepoException => e
|
23
|
-
Console.log_error(e.message)
|
24
|
-
end
|
25
|
-
end
|
1
|
+
require "os"
|
2
|
+
|
3
|
+
require "multirepo/utility/console"
|
4
|
+
require "multirepo/utility/utils"
|
5
|
+
|
6
|
+
module MultiRepo
|
7
|
+
class OpenCommand < Command
|
8
|
+
self.command = "open"
|
9
|
+
self.summary = "Opens all dependencies in the current OS's file explorer."
|
10
|
+
|
11
|
+
def run
|
12
|
+
validate_in_work_tree
|
13
|
+
ensure_multirepo_enabled
|
14
|
+
|
15
|
+
ConfigFile.load.each do |entry|
|
16
|
+
if OS.osx?
|
17
|
+
`open "#{entry.repo.path}"`
|
18
|
+
elsif OS.windows?
|
19
|
+
`explorer "#{Utils.convert_to_windows_path(entry.repo.path)}"`
|
20
|
+
end
|
21
|
+
end
|
22
|
+
rescue MultiRepoException => e
|
23
|
+
Console.log_error(e.message)
|
24
|
+
end
|
25
|
+
end
|
26
26
|
end
|
@@ -1,49 +1,49 @@
|
|
1
|
-
require "multirepo/utility/console"
|
2
|
-
require "multirepo/files/config-file"
|
3
|
-
|
4
|
-
module MultiRepo
|
5
|
-
class RemoveCommand < Command
|
6
|
-
self.command = "remove"
|
7
|
-
self.summary = "Removes the specified dependency from multirepo."
|
8
|
-
|
9
|
-
def self.options
|
10
|
-
[
|
11
|
-
['<path>', 'The relative path to the dependency to remove (e.g. ../MyOldDependency).'],
|
12
|
-
['[--delete]', 'Delete the dependency on disk in addition to removing it from the multirepo config.']
|
13
|
-
].concat(super)
|
14
|
-
end
|
15
|
-
|
16
|
-
def initialize(argv)
|
17
|
-
@path = argv.shift_argument
|
18
|
-
@delete = argv.flag?("delete")
|
19
|
-
super
|
20
|
-
end
|
21
|
-
|
22
|
-
def validate!
|
23
|
-
super
|
24
|
-
help! "You must specify a dependency repository to remove" unless @path
|
25
|
-
end
|
26
|
-
|
27
|
-
def run
|
28
|
-
validate_in_work_tree
|
29
|
-
ensure_multirepo_enabled
|
30
|
-
|
31
|
-
repo = Repo.new(@path)
|
32
|
-
entry = ConfigEntry.new(repo)
|
33
|
-
|
34
|
-
if ConfigFile.entry_exists?(entry)
|
35
|
-
ConfigFile.remove_entry(entry)
|
36
|
-
Console.log_step("Removed '#{@path}' from the .multirepo file")
|
37
|
-
|
38
|
-
if @delete
|
39
|
-
FileUtils.rm_rf(@path)
|
40
|
-
Console.log_step("Deleted '#{@path}' from disk")
|
41
|
-
end
|
42
|
-
else
|
43
|
-
raise MultiRepoException, "'#{@path}' isn't tracked by multirepo"
|
44
|
-
end
|
45
|
-
rescue MultiRepoException => e
|
46
|
-
Console.log_error(e.message)
|
47
|
-
end
|
48
|
-
end
|
1
|
+
require "multirepo/utility/console"
|
2
|
+
require "multirepo/files/config-file"
|
3
|
+
|
4
|
+
module MultiRepo
|
5
|
+
class RemoveCommand < Command
|
6
|
+
self.command = "remove"
|
7
|
+
self.summary = "Removes the specified dependency from multirepo."
|
8
|
+
|
9
|
+
def self.options
|
10
|
+
[
|
11
|
+
['<path>', 'The relative path to the dependency to remove (e.g. ../MyOldDependency).'],
|
12
|
+
['[--delete]', 'Delete the dependency on disk in addition to removing it from the multirepo config.']
|
13
|
+
].concat(super)
|
14
|
+
end
|
15
|
+
|
16
|
+
def initialize(argv)
|
17
|
+
@path = argv.shift_argument
|
18
|
+
@delete = argv.flag?("delete")
|
19
|
+
super
|
20
|
+
end
|
21
|
+
|
22
|
+
def validate!
|
23
|
+
super
|
24
|
+
help! "You must specify a dependency repository to remove" unless @path
|
25
|
+
end
|
26
|
+
|
27
|
+
def run
|
28
|
+
validate_in_work_tree
|
29
|
+
ensure_multirepo_enabled
|
30
|
+
|
31
|
+
repo = Repo.new(@path)
|
32
|
+
entry = ConfigEntry.new(repo)
|
33
|
+
|
34
|
+
if ConfigFile.entry_exists?(entry)
|
35
|
+
ConfigFile.remove_entry(entry)
|
36
|
+
Console.log_step("Removed '#{@path}' from the .multirepo file")
|
37
|
+
|
38
|
+
if @delete
|
39
|
+
FileUtils.rm_rf(@path)
|
40
|
+
Console.log_step("Deleted '#{@path}' from disk")
|
41
|
+
end
|
42
|
+
else
|
43
|
+
raise MultiRepoException, "'#{@path}' isn't tracked by multirepo"
|
44
|
+
end
|
45
|
+
rescue MultiRepoException => e
|
46
|
+
Console.log_error(e.message)
|
47
|
+
end
|
48
|
+
end
|
49
49
|
end
|
@@ -1,20 +1,20 @@
|
|
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
|
-
validate_in_work_tree
|
10
|
-
|
11
|
-
File.delete(".multirepo")
|
12
|
-
File.delete(".multirepo.lock")
|
13
|
-
uninstall_hooks
|
14
|
-
|
15
|
-
Console.log_step("All traces of multirepo have been removed from this repository")
|
16
|
-
rescue MultiRepoException => e
|
17
|
-
Console.log_error(e.message)
|
18
|
-
end
|
19
|
-
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
|
+
validate_in_work_tree
|
10
|
+
|
11
|
+
File.delete(".multirepo")
|
12
|
+
File.delete(".multirepo.lock")
|
13
|
+
uninstall_hooks
|
14
|
+
|
15
|
+
Console.log_step("All traces of multirepo have been removed from this repository")
|
16
|
+
rescue MultiRepoException => e
|
17
|
+
Console.log_error(e.message)
|
18
|
+
end
|
19
|
+
end
|
20
20
|
end
|
@@ -1,48 +1,54 @@
|
|
1
|
-
require "multirepo/utility/console"
|
2
|
-
|
3
|
-
module MultiRepo
|
4
|
-
class UpdateCommand < Command
|
5
|
-
self.command = "update"
|
6
|
-
self.summary = "Force-updates the multirepo lock file."
|
7
|
-
|
8
|
-
def self.options
|
9
|
-
[
|
10
|
-
['[--force]', 'Update the lock file even if dependencies contain uncommitted changes.'],
|
11
|
-
['[--commit]', 'Commit the lock file after updating it.']
|
12
|
-
].concat(super)
|
13
|
-
end
|
14
|
-
|
15
|
-
def initialize(argv)
|
16
|
-
@commit = argv.flag?("commit")
|
17
|
-
@force = argv.flag?("force")
|
18
|
-
super
|
19
|
-
end
|
20
|
-
|
21
|
-
def run
|
22
|
-
validate_in_work_tree
|
23
|
-
ensure_multirepo_enabled
|
24
|
-
|
25
|
-
Console.log_step("Updating...")
|
26
|
-
|
27
|
-
dependencies_clean = Utils.ensure_dependencies_clean(ConfigFile.load)
|
28
|
-
if dependencies_clean
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
1
|
+
require "multirepo/utility/console"
|
2
|
+
|
3
|
+
module MultiRepo
|
4
|
+
class UpdateCommand < Command
|
5
|
+
self.command = "update"
|
6
|
+
self.summary = "Force-updates the multirepo lock file."
|
7
|
+
|
8
|
+
def self.options
|
9
|
+
[
|
10
|
+
['[--force]', 'Update the lock file even if dependencies contain uncommitted changes.'],
|
11
|
+
['[--commit]', 'Commit the lock file after updating it.']
|
12
|
+
].concat(super)
|
13
|
+
end
|
14
|
+
|
15
|
+
def initialize(argv)
|
16
|
+
@commit = argv.flag?("commit")
|
17
|
+
@force = argv.flag?("force")
|
18
|
+
super
|
19
|
+
end
|
20
|
+
|
21
|
+
def run
|
22
|
+
validate_in_work_tree
|
23
|
+
ensure_multirepo_enabled
|
24
|
+
|
25
|
+
Console.log_step("Updating...")
|
26
|
+
|
27
|
+
dependencies_clean = Utils.ensure_dependencies_clean(ConfigFile.load)
|
28
|
+
if dependencies_clean
|
29
|
+
update_lock_file_step("Updated lock file with latest dependency commits")
|
30
|
+
elsif !dependencies_clean && @force
|
31
|
+
update_lock_file_step("Force-updated lock file with latest dependency commits (ignoring uncommitted changes)")
|
32
|
+
else
|
33
|
+
raise MultiRepoException, "Can't update because not all dependencies are clean"
|
34
|
+
end
|
35
|
+
|
36
|
+
Console.log_step("Done!")
|
37
|
+
rescue MultiRepoException => e
|
38
|
+
Console.log_error(e.message)
|
39
|
+
end
|
40
|
+
|
41
|
+
def update_lock_file_step(log_message)
|
42
|
+
changed = LockFile.update
|
43
|
+
|
44
|
+
if changed && @commit
|
45
|
+
Console.log_substep("Committing updated lock file")
|
46
|
+
LockFile.commit("[multirepo] Manually updated lock file")
|
47
|
+
elsif changed
|
48
|
+
Console.log_substep(log_message)
|
49
|
+
else
|
50
|
+
Console.log_info("Lock file is already up-to-date")
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
48
54
|
end
|