git-multirepo 1.0.0.beta39 → 1.0.0.beta40
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/Gemfile +4 -4
- data/Gemfile.lock +42 -42
- data/LICENSE +22 -22
- data/README.md +146 -145
- data/Rakefile +2 -2
- data/bin/multi +10 -10
- data/docs/bug-repros/91565510-repro.sh +20 -20
- data/git-multirepo.gemspec +31 -31
- data/lib/commands.rb +15 -14
- data/lib/git-multirepo.rb +2 -2
- data/lib/info.rb +4 -4
- data/lib/multirepo/commands/add-command.rb +53 -53
- data/lib/multirepo/commands/branch-command.rb +82 -82
- data/lib/multirepo/commands/checkout-command.rb +122 -122
- data/lib/multirepo/commands/clean-command.rb +31 -31
- data/lib/multirepo/commands/clone-command.rb +70 -70
- data/lib/multirepo/commands/command.rb +75 -75
- data/lib/multirepo/commands/do-command.rb +76 -0
- data/lib/multirepo/commands/fetch-command.rb +30 -30
- data/lib/multirepo/commands/graph-command.rb +45 -45
- data/lib/multirepo/commands/init-command.rb +119 -119
- data/lib/multirepo/commands/install-command.rb +103 -103
- data/lib/multirepo/commands/merge-command.rb +167 -167
- data/lib/multirepo/commands/open-command.rb +57 -57
- data/lib/multirepo/commands/remove-command.rb +50 -50
- data/lib/multirepo/commands/uninit-command.rb +20 -20
- data/lib/multirepo/commands/update-command.rb +60 -60
- data/lib/multirepo/config.rb +15 -15
- data/lib/multirepo/files/config-entry.rb +38 -38
- data/lib/multirepo/files/config-file.rb +45 -45
- data/lib/multirepo/files/lock-entry.rb +24 -24
- data/lib/multirepo/files/lock-file.rb +38 -38
- data/lib/multirepo/files/meta-file.rb +40 -40
- data/lib/multirepo/files/tracking-file.rb +8 -8
- data/lib/multirepo/files/tracking-files.rb +46 -46
- data/lib/multirepo/git/branch.rb +30 -30
- data/lib/multirepo/git/change.rb +10 -10
- data/lib/multirepo/git/commit.rb +17 -17
- data/lib/multirepo/git/git-runner.rb +46 -46
- data/lib/multirepo/git/remote.rb +16 -16
- data/lib/multirepo/git/repo.rb +77 -77
- data/lib/multirepo/hooks/post-commit-hook.rb +22 -22
- data/lib/multirepo/hooks/pre-commit-hook.rb +31 -31
- data/lib/multirepo/logic/merge-descriptor.rb +12 -12
- data/lib/multirepo/logic/node.rb +44 -44
- data/lib/multirepo/logic/performer.rb +62 -62
- data/lib/multirepo/logic/revision-selector.rb +34 -34
- data/lib/multirepo/multirepo-exception.rb +5 -5
- data/lib/multirepo/utility/console.rb +51 -51
- data/lib/multirepo/utility/runner.rb +34 -34
- data/lib/multirepo/utility/utils.rb +81 -81
- data/resources/.gitconfig +2 -2
- data/resources/post-commit +5 -5
- data/resources/pre-commit +5 -5
- data/spec/integration/init_spec.rb +18 -18
- data/spec/spec_helper.rb +89 -89
- metadata +4 -3
@@ -1,76 +1,76 @@
|
|
1
|
-
require "claide"
|
2
|
-
|
3
|
-
require "info"
|
4
|
-
require "multirepo/multirepo-exception"
|
5
|
-
require "multirepo/config"
|
6
|
-
|
7
|
-
module MultiRepo
|
8
|
-
class Command < CLAide::Command
|
9
|
-
self.abstract_command = true
|
10
|
-
self.command = "multi"
|
11
|
-
self.version = VERSION
|
12
|
-
self.description = DESCRIPTION
|
13
|
-
|
14
|
-
def initialize(argv)
|
15
|
-
@argv = argv
|
16
|
-
Config.instance.verbose = argv.flag?("verbose") ? true : false
|
17
|
-
Config.instance.git_executable = argv.option("git-exe", "git")
|
18
|
-
super
|
19
|
-
end
|
20
|
-
|
21
|
-
def run
|
22
|
-
help! "Unknown argument(s): #{@argv.remainder.join(', ')}" unless @argv.empty?
|
23
|
-
end
|
24
|
-
|
25
|
-
def validate!
|
26
|
-
path = Config.instance.git_executable
|
27
|
-
is_git_exe = path =~ /.*(git)|(git.exe)$/
|
28
|
-
file_exists = path == "git" || File.exists?(path)
|
29
|
-
help! "Invalid git executable '#{path}'" unless is_git_exe && file_exists
|
30
|
-
end
|
31
|
-
|
32
|
-
def install_hooks(path)
|
33
|
-
actual_path = path || "."
|
34
|
-
Utils.install_hook("pre-commit", actual_path)
|
35
|
-
Utils.install_hook("post-commit", actual_path)
|
36
|
-
end
|
37
|
-
|
38
|
-
def uninstall_hooks
|
39
|
-
FileUtils.rm_f(".git/hooks/pre-commit")
|
40
|
-
FileUtils.rm_f(".git/hooks/post-commit")
|
41
|
-
end
|
42
|
-
|
43
|
-
def update_gitconfig(path)
|
44
|
-
actual_path = path || "."
|
45
|
-
resource_file = Utils.path_for_resource(".gitconfig")
|
46
|
-
target_file = File.join(actual_path, '.git/config')
|
47
|
-
|
48
|
-
template = File.read(resource_file)
|
49
|
-
first_template_line = template.lines.first
|
50
|
-
|
51
|
-
Utils.append_if_missing(target_file, Regexp.new(Regexp.quote(first_template_line)), template)
|
52
|
-
end
|
53
|
-
|
54
|
-
def multirepo_enabled_dependencies
|
55
|
-
ConfigFile.new(".").load_entries.select { |e| Utils.is_multirepo_enabled(e.repo.path) }
|
56
|
-
end
|
57
|
-
|
58
|
-
def validate_only_one_flag(*flags)
|
59
|
-
flags.reduce(0) { |count, flag| count += 1 if flag; count } <= 1
|
60
|
-
end
|
61
|
-
|
62
|
-
def ensure_in_work_tree
|
63
|
-
repo = Repo.new(".")
|
64
|
-
raise MultiRepoException, "Not a git repository" unless repo.exists?
|
65
|
-
raise MultiRepoException, "HEAD is unborn (you must perform at least one commit)" unless repo.head_born?
|
66
|
-
end
|
67
|
-
|
68
|
-
def ensure_multirepo_enabled
|
69
|
-
raise MultiRepoException, "multirepo is not initialized in this repository." unless Utils.is_multirepo_enabled(".")
|
70
|
-
end
|
71
|
-
|
72
|
-
def ensure_multirepo_tracked
|
73
|
-
raise MultiRepoException, "This revision is not tracked by multirepo." unless Utils.is_multirepo_tracked(".")
|
74
|
-
end
|
75
|
-
end
|
1
|
+
require "claide"
|
2
|
+
|
3
|
+
require "info"
|
4
|
+
require "multirepo/multirepo-exception"
|
5
|
+
require "multirepo/config"
|
6
|
+
|
7
|
+
module MultiRepo
|
8
|
+
class Command < CLAide::Command
|
9
|
+
self.abstract_command = true
|
10
|
+
self.command = "multi"
|
11
|
+
self.version = VERSION
|
12
|
+
self.description = DESCRIPTION
|
13
|
+
|
14
|
+
def initialize(argv)
|
15
|
+
@argv = argv
|
16
|
+
Config.instance.verbose = argv.flag?("verbose") ? true : false
|
17
|
+
Config.instance.git_executable = argv.option("git-exe", "git")
|
18
|
+
super
|
19
|
+
end
|
20
|
+
|
21
|
+
def run
|
22
|
+
help! "Unknown argument(s): #{@argv.remainder.join(', ')}" unless @argv.empty?
|
23
|
+
end
|
24
|
+
|
25
|
+
def validate!
|
26
|
+
path = Config.instance.git_executable
|
27
|
+
is_git_exe = path =~ /.*(git)|(git.exe)$/
|
28
|
+
file_exists = path == "git" || File.exists?(path)
|
29
|
+
help! "Invalid git executable '#{path}'" unless is_git_exe && file_exists
|
30
|
+
end
|
31
|
+
|
32
|
+
def install_hooks(path)
|
33
|
+
actual_path = path || "."
|
34
|
+
Utils.install_hook("pre-commit", actual_path)
|
35
|
+
Utils.install_hook("post-commit", actual_path)
|
36
|
+
end
|
37
|
+
|
38
|
+
def uninstall_hooks
|
39
|
+
FileUtils.rm_f(".git/hooks/pre-commit")
|
40
|
+
FileUtils.rm_f(".git/hooks/post-commit")
|
41
|
+
end
|
42
|
+
|
43
|
+
def update_gitconfig(path)
|
44
|
+
actual_path = path || "."
|
45
|
+
resource_file = Utils.path_for_resource(".gitconfig")
|
46
|
+
target_file = File.join(actual_path, '.git/config')
|
47
|
+
|
48
|
+
template = File.read(resource_file)
|
49
|
+
first_template_line = template.lines.first
|
50
|
+
|
51
|
+
Utils.append_if_missing(target_file, Regexp.new(Regexp.quote(first_template_line)), template)
|
52
|
+
end
|
53
|
+
|
54
|
+
def multirepo_enabled_dependencies
|
55
|
+
ConfigFile.new(".").load_entries.select { |e| Utils.is_multirepo_enabled(e.repo.path) }
|
56
|
+
end
|
57
|
+
|
58
|
+
def validate_only_one_flag(*flags)
|
59
|
+
flags.reduce(0) { |count, flag| count += 1 if flag; count } <= 1
|
60
|
+
end
|
61
|
+
|
62
|
+
def ensure_in_work_tree
|
63
|
+
repo = Repo.new(".")
|
64
|
+
raise MultiRepoException, "Not a git repository" unless repo.exists?
|
65
|
+
raise MultiRepoException, "HEAD is unborn (you must perform at least one commit)" unless repo.head_born?
|
66
|
+
end
|
67
|
+
|
68
|
+
def ensure_multirepo_enabled
|
69
|
+
raise MultiRepoException, "multirepo is not initialized in this repository." unless Utils.is_multirepo_enabled(".")
|
70
|
+
end
|
71
|
+
|
72
|
+
def ensure_multirepo_tracked
|
73
|
+
raise MultiRepoException, "This revision is not tracked by multirepo." unless Utils.is_multirepo_tracked(".")
|
74
|
+
end
|
75
|
+
end
|
76
76
|
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
require "multirepo/utility/console"
|
2
|
+
require "multirepo/git/git-runner"
|
3
|
+
require "multirepo/logic/performer"
|
4
|
+
|
5
|
+
module MultiRepo
|
6
|
+
class DoCommand < Command
|
7
|
+
self.command = "do"
|
8
|
+
self.summary = "Perform an arbitrary Git operation in the main repository, dependency repositories or all repositories."
|
9
|
+
|
10
|
+
def self.options
|
11
|
+
[
|
12
|
+
['"<operation>"', 'The git command to perform, between quotes, omitting the executable name (ex: "reset --hard HEAD")'],
|
13
|
+
['[--main]', 'Perform the operation in the main repository only.'],
|
14
|
+
['[--deps]', 'Perform the operation in dependencies only.'],
|
15
|
+
['[--all]', 'Perform the operation in the main repository and all dependencies.']
|
16
|
+
].concat(super)
|
17
|
+
end
|
18
|
+
|
19
|
+
def initialize(argv)
|
20
|
+
@operation = argv.shift_argument
|
21
|
+
@main_only = argv.flag?("main")
|
22
|
+
@deps_only = argv.flag?("deps")
|
23
|
+
argv.flag?("all") # Eat the default flag!
|
24
|
+
super
|
25
|
+
end
|
26
|
+
|
27
|
+
def validate!
|
28
|
+
super
|
29
|
+
unless validate_only_one_flag(@main_only, @deps_only, @all)
|
30
|
+
help! "You can't provide more than one operation modifier (--deps, --main, etc.)"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def run
|
35
|
+
super
|
36
|
+
ensure_in_work_tree
|
37
|
+
ensure_multirepo_enabled
|
38
|
+
|
39
|
+
if @main_only
|
40
|
+
message = "Perform operation on the #{'main repo'.bold}:\n git #{@operation}"
|
41
|
+
op = lambda { perform_operation_on_main(@operation) }
|
42
|
+
elsif @deps_only
|
43
|
+
message = "Perform operation on #{'dependencies'.bold}:\n git #{@operation}"
|
44
|
+
op = lambda { perform_operation_on_dependencies(@operation) }
|
45
|
+
else
|
46
|
+
message = "Perform operation on #{'dependencies'.bold} and the #{'main repo'.bold}:\n git #{@operation}"
|
47
|
+
op = lambda {
|
48
|
+
perform_operation_on_dependencies(@operation) # Ordered dependencies first
|
49
|
+
perform_operation_on_main(@operation) # Main last
|
50
|
+
}
|
51
|
+
end
|
52
|
+
|
53
|
+
raise MultiRepoException, "Operation cancelled" unless Console.ask_yes_no(message)
|
54
|
+
|
55
|
+
op.call
|
56
|
+
rescue MultiRepoException => e
|
57
|
+
Console.log_error(e.message)
|
58
|
+
end
|
59
|
+
|
60
|
+
def perform_operation_on_main(operation)
|
61
|
+
perform_operation(".", operation)
|
62
|
+
end
|
63
|
+
|
64
|
+
def perform_operation_on_dependencies(operation)
|
65
|
+
Performer.perform_on_dependencies do |config_entry, lock_entry|
|
66
|
+
perform_operation(config_entry.repo.path, operation)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def perform_operation(path, operation)
|
71
|
+
Console.log_step("Performing operation on '#{path}'")
|
72
|
+
Console.log_info("git #{operation}")
|
73
|
+
GitRunner.run_in_working_dir(path, operation, Runner::Verbosity::OUTPUT_ALWAYS)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
@@ -1,31 +1,31 @@
|
|
1
|
-
require "multirepo/utility/console"
|
2
|
-
|
3
|
-
module MultiRepo
|
4
|
-
class FetchCommand < Command
|
5
|
-
self.command = "fetch"
|
6
|
-
self.summary = "Performs a git fetch on all dependencies."
|
7
|
-
|
8
|
-
def run
|
9
|
-
super
|
10
|
-
ensure_in_work_tree
|
11
|
-
ensure_multirepo_enabled
|
12
|
-
|
13
|
-
Console.log_step("Fetching main repo...")
|
14
|
-
|
15
|
-
main_repo = Repo.new(".")
|
16
|
-
Console.log_substep("Fetching from #{main_repo.remote('origin').url}...")
|
17
|
-
main_repo.fetch
|
18
|
-
|
19
|
-
Console.log_step("Fetching dependencies...")
|
20
|
-
|
21
|
-
ConfigFile.new(".").load_entries.each do |entry|
|
22
|
-
Console.log_substep("Fetching from #{entry.repo.remote('origin').url}...")
|
23
|
-
entry.repo.fetch
|
24
|
-
end
|
25
|
-
|
26
|
-
Console.log_step("Done!")
|
27
|
-
rescue MultiRepoException => e
|
28
|
-
Console.log_error(e.message)
|
29
|
-
end
|
30
|
-
end
|
1
|
+
require "multirepo/utility/console"
|
2
|
+
|
3
|
+
module MultiRepo
|
4
|
+
class FetchCommand < Command
|
5
|
+
self.command = "fetch"
|
6
|
+
self.summary = "Performs a git fetch on all dependencies."
|
7
|
+
|
8
|
+
def run
|
9
|
+
super
|
10
|
+
ensure_in_work_tree
|
11
|
+
ensure_multirepo_enabled
|
12
|
+
|
13
|
+
Console.log_step("Fetching main repo...")
|
14
|
+
|
15
|
+
main_repo = Repo.new(".")
|
16
|
+
Console.log_substep("Fetching from #{main_repo.remote('origin').url}...")
|
17
|
+
main_repo.fetch
|
18
|
+
|
19
|
+
Console.log_step("Fetching dependencies...")
|
20
|
+
|
21
|
+
ConfigFile.new(".").load_entries.each do |entry|
|
22
|
+
Console.log_substep("Fetching from #{entry.repo.remote('origin').url}...")
|
23
|
+
entry.repo.fetch
|
24
|
+
end
|
25
|
+
|
26
|
+
Console.log_step("Done!")
|
27
|
+
rescue MultiRepoException => e
|
28
|
+
Console.log_error(e.message)
|
29
|
+
end
|
30
|
+
end
|
31
31
|
end
|
@@ -1,46 +1,46 @@
|
|
1
|
-
require "os"
|
2
|
-
require "graphviz"
|
3
|
-
|
4
|
-
require "multirepo/utility/utils"
|
5
|
-
require "multirepo/utility/console"
|
6
|
-
require "multirepo/logic/node"
|
7
|
-
|
8
|
-
module MultiRepo
|
9
|
-
class GraphCommand < Command
|
10
|
-
self.command = "graph"
|
11
|
-
self.summary = "Graphs the dependency tree from the current repository."
|
12
|
-
|
13
|
-
def run
|
14
|
-
super
|
15
|
-
ensure_in_work_tree
|
16
|
-
ensure_multirepo_enabled
|
17
|
-
|
18
|
-
root = Node.new(".")
|
19
|
-
graph = GraphViz.new(:G, :type => :digraph)
|
20
|
-
build_graph_recursive(graph, root)
|
21
|
-
|
22
|
-
path = File.expand_path("~/Desktop/#{root.name}-graph.png")
|
23
|
-
|
24
|
-
begin
|
25
|
-
graph.output(:png => path)
|
26
|
-
Utils.open_in_default_app(path)
|
27
|
-
rescue StandardError => e
|
28
|
-
Console.log_error(e.message)
|
29
|
-
raise MultiRepoException, "Could not generate graph image because an error occurred during graph generation"
|
30
|
-
end
|
31
|
-
|
32
|
-
Console.log_step("Generated graph image #{path}")
|
33
|
-
rescue MultiRepoException => e
|
34
|
-
Console.log_error(e.message)
|
35
|
-
end
|
36
|
-
|
37
|
-
def build_graph_recursive(graph, node)
|
38
|
-
parent_graph_node = graph.add_nodes(node.name)
|
39
|
-
node.children.each do |child_node|
|
40
|
-
child_graph_node = graph.
|
41
|
-
graph.
|
42
|
-
build_graph_recursive(graph, child_node)
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
1
|
+
require "os"
|
2
|
+
require "graphviz"
|
3
|
+
|
4
|
+
require "multirepo/utility/utils"
|
5
|
+
require "multirepo/utility/console"
|
6
|
+
require "multirepo/logic/node"
|
7
|
+
|
8
|
+
module MultiRepo
|
9
|
+
class GraphCommand < Command
|
10
|
+
self.command = "graph"
|
11
|
+
self.summary = "Graphs the dependency tree from the current repository."
|
12
|
+
|
13
|
+
def run
|
14
|
+
super
|
15
|
+
ensure_in_work_tree
|
16
|
+
ensure_multirepo_enabled
|
17
|
+
|
18
|
+
root = Node.new(".")
|
19
|
+
graph = GraphViz.new(:G, :type => :digraph)
|
20
|
+
build_graph_recursive(graph, root)
|
21
|
+
|
22
|
+
path = File.expand_path("~/Desktop/#{root.name}-graph.png")
|
23
|
+
|
24
|
+
begin
|
25
|
+
graph.output(:png => path)
|
26
|
+
Utils.open_in_default_app(path)
|
27
|
+
rescue StandardError => e
|
28
|
+
Console.log_error(e.message)
|
29
|
+
raise MultiRepoException, "Could not generate graph image because an error occurred during graph generation"
|
30
|
+
end
|
31
|
+
|
32
|
+
Console.log_step("Generated graph image #{path}")
|
33
|
+
rescue MultiRepoException => e
|
34
|
+
Console.log_error(e.message)
|
35
|
+
end
|
36
|
+
|
37
|
+
def build_graph_recursive(graph, node)
|
38
|
+
parent_graph_node = graph.add_nodes(node.name)
|
39
|
+
node.children.each do |child_node|
|
40
|
+
child_graph_node = graph.add_node(child_node.name)
|
41
|
+
graph.add_edge(parent_graph_node, child_graph_node)
|
42
|
+
build_graph_recursive(graph, child_node)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
46
|
end
|
@@ -1,120 +1,120 @@
|
|
1
|
-
require "multirepo/utility/console"
|
2
|
-
require "multirepo/utility/utils"
|
3
|
-
require "multirepo/files/config-file"
|
4
|
-
require "multirepo/files/lock-file"
|
5
|
-
require "multirepo/files/tracking-files"
|
6
|
-
require "multirepo/commands/command"
|
7
|
-
|
8
|
-
module MultiRepo
|
9
|
-
class InitCommand < Command
|
10
|
-
self.command = "init"
|
11
|
-
self.summary = "Initialize the current repository as a multirepo project."
|
12
|
-
|
13
|
-
def self.options
|
14
|
-
[['[--extras]', 'Keep the current .multirepo config file as-is and initialize everything else.']].concat(super)
|
15
|
-
end
|
16
|
-
|
17
|
-
def initialize(argv)
|
18
|
-
@only_extras = argv.flag?("extras")
|
19
|
-
super
|
20
|
-
end
|
21
|
-
|
22
|
-
def run
|
23
|
-
super
|
24
|
-
ensure_in_work_tree
|
25
|
-
|
26
|
-
if @only_extras
|
27
|
-
ensure_multirepo_enabled
|
28
|
-
Console.log_step("Initializing extras...")
|
29
|
-
initialize_extras_step
|
30
|
-
else
|
31
|
-
Console.log_step("Initializing multirepo...")
|
32
|
-
full_initialize_step
|
33
|
-
end
|
34
|
-
|
35
|
-
Console.log_step("Done!")
|
36
|
-
rescue MultiRepoException => e
|
37
|
-
Console.log_error(e.message)
|
38
|
-
end
|
39
|
-
|
40
|
-
def full_initialize_step
|
41
|
-
if ConfigFile.new(".").exists?
|
42
|
-
reinitialize = Console.ask_yes_no(".multirepo file already exists. Reinitialize?")
|
43
|
-
raise MultiRepoException, "Initialization aborted" unless reinitialize
|
44
|
-
end
|
45
|
-
|
46
|
-
unless add_sibling_repos_step
|
47
|
-
raise MultiRepoException, "There are no sibling repositories to track as dependencies. Initialization aborted."
|
48
|
-
end
|
49
|
-
|
50
|
-
initialize_extras_step
|
51
|
-
end
|
52
|
-
|
53
|
-
def add_sibling_repos_step
|
54
|
-
sibling_repos = Utils.sibling_repos
|
55
|
-
return false unless sibling_repos.any?
|
56
|
-
|
57
|
-
Console.log_substep("Creating new multirepo config...")
|
58
|
-
|
59
|
-
valid_repos = find_valid_repos(sibling_repos)
|
60
|
-
entries = create_entries(valid_repos)
|
61
|
-
|
62
|
-
raise MultiRepoException, "No sibling repositories were added as dependencies; aborting." unless entries.any?
|
63
|
-
|
64
|
-
ConfigFile.new(".").save_entries(entries)
|
65
|
-
return true
|
66
|
-
end
|
67
|
-
|
68
|
-
def initialize_extras_step
|
69
|
-
install_hooks_step
|
70
|
-
update_gitattributes_step
|
71
|
-
update_gitconfig_step
|
72
|
-
end
|
73
|
-
|
74
|
-
def install_hooks_step
|
75
|
-
install_hooks(".")
|
76
|
-
Console.log_substep("Installed git hooks")
|
77
|
-
end
|
78
|
-
|
79
|
-
def update_gitattributes_step
|
80
|
-
TrackingFiles.new(".").files.each do |f|
|
81
|
-
filename = f.filename
|
82
|
-
regex_escaped_filename = Regexp.quote(filename)
|
83
|
-
Utils.append_if_missing("./.gitattributes", /^#{regex_escaped_filename} .*/, "#{filename} merge=ours")
|
84
|
-
end
|
85
|
-
Console.log_substep("Updated .gitattributes file")
|
86
|
-
end
|
87
|
-
|
88
|
-
def update_gitconfig_step
|
89
|
-
update_gitconfig(".")
|
90
|
-
Console.log_substep("Updated .git/config file")
|
91
|
-
end
|
92
|
-
|
93
|
-
def find_valid_repos(repos)
|
94
|
-
repos.select do |repo|
|
95
|
-
next true if repo.head_born?
|
96
|
-
Console.log_warning("Ignoring repo '#{repo.path}' because its HEAD is unborn. You must perform at least one commit.")
|
97
|
-
end
|
98
|
-
end
|
99
|
-
|
100
|
-
def create_entries(repos)
|
101
|
-
entries = []
|
102
|
-
repos.each do |repo|
|
103
|
-
origin_url = repo.remote('origin').url
|
104
|
-
current_branch = repo.current_branch
|
105
|
-
|
106
|
-
if Console.ask_yes_no("Do you want to add '#{repo.path}' as a dependency?\n [origin: #{origin_url || "NONE"}, branch: #{current_branch}]")
|
107
|
-
raise MultiRepoException, "Repo 'origin' remote url is not set; aborting." unless origin_url
|
108
|
-
entries.push(ConfigEntry.new(repo))
|
109
|
-
Console.log_substep("Added the repository '#{repo.path}' to the .multirepo file")
|
110
|
-
end
|
111
|
-
end
|
112
|
-
return entries
|
113
|
-
end
|
114
|
-
|
115
|
-
def check_repo_exists
|
116
|
-
if !Dir.exists?(@repo.path) then raise MultiRepoException, "There is no folder at path '#{@repo.path}'" end
|
117
|
-
if !@repo.exists? then raise MultiRepoException, "'#{@repo.path}' is not a repository" end
|
118
|
-
end
|
119
|
-
end
|
1
|
+
require "multirepo/utility/console"
|
2
|
+
require "multirepo/utility/utils"
|
3
|
+
require "multirepo/files/config-file"
|
4
|
+
require "multirepo/files/lock-file"
|
5
|
+
require "multirepo/files/tracking-files"
|
6
|
+
require "multirepo/commands/command"
|
7
|
+
|
8
|
+
module MultiRepo
|
9
|
+
class InitCommand < Command
|
10
|
+
self.command = "init"
|
11
|
+
self.summary = "Initialize the current repository as a multirepo project."
|
12
|
+
|
13
|
+
def self.options
|
14
|
+
[['[--extras]', 'Keep the current .multirepo config file as-is and initialize everything else.']].concat(super)
|
15
|
+
end
|
16
|
+
|
17
|
+
def initialize(argv)
|
18
|
+
@only_extras = argv.flag?("extras")
|
19
|
+
super
|
20
|
+
end
|
21
|
+
|
22
|
+
def run
|
23
|
+
super
|
24
|
+
ensure_in_work_tree
|
25
|
+
|
26
|
+
if @only_extras
|
27
|
+
ensure_multirepo_enabled
|
28
|
+
Console.log_step("Initializing extras...")
|
29
|
+
initialize_extras_step
|
30
|
+
else
|
31
|
+
Console.log_step("Initializing multirepo...")
|
32
|
+
full_initialize_step
|
33
|
+
end
|
34
|
+
|
35
|
+
Console.log_step("Done!")
|
36
|
+
rescue MultiRepoException => e
|
37
|
+
Console.log_error(e.message)
|
38
|
+
end
|
39
|
+
|
40
|
+
def full_initialize_step
|
41
|
+
if ConfigFile.new(".").exists?
|
42
|
+
reinitialize = Console.ask_yes_no(".multirepo file already exists. Reinitialize?")
|
43
|
+
raise MultiRepoException, "Initialization aborted" unless reinitialize
|
44
|
+
end
|
45
|
+
|
46
|
+
unless add_sibling_repos_step
|
47
|
+
raise MultiRepoException, "There are no sibling repositories to track as dependencies. Initialization aborted."
|
48
|
+
end
|
49
|
+
|
50
|
+
initialize_extras_step
|
51
|
+
end
|
52
|
+
|
53
|
+
def add_sibling_repos_step
|
54
|
+
sibling_repos = Utils.sibling_repos
|
55
|
+
return false unless sibling_repos.any?
|
56
|
+
|
57
|
+
Console.log_substep("Creating new multirepo config...")
|
58
|
+
|
59
|
+
valid_repos = find_valid_repos(sibling_repos)
|
60
|
+
entries = create_entries(valid_repos)
|
61
|
+
|
62
|
+
raise MultiRepoException, "No sibling repositories were added as dependencies; aborting." unless entries.any?
|
63
|
+
|
64
|
+
ConfigFile.new(".").save_entries(entries)
|
65
|
+
return true
|
66
|
+
end
|
67
|
+
|
68
|
+
def initialize_extras_step
|
69
|
+
install_hooks_step
|
70
|
+
update_gitattributes_step
|
71
|
+
update_gitconfig_step
|
72
|
+
end
|
73
|
+
|
74
|
+
def install_hooks_step
|
75
|
+
install_hooks(".")
|
76
|
+
Console.log_substep("Installed git hooks")
|
77
|
+
end
|
78
|
+
|
79
|
+
def update_gitattributes_step
|
80
|
+
TrackingFiles.new(".").files.each do |f|
|
81
|
+
filename = f.filename
|
82
|
+
regex_escaped_filename = Regexp.quote(filename)
|
83
|
+
Utils.append_if_missing("./.gitattributes", /^#{regex_escaped_filename} .*/, "#{filename} merge=ours")
|
84
|
+
end
|
85
|
+
Console.log_substep("Updated .gitattributes file")
|
86
|
+
end
|
87
|
+
|
88
|
+
def update_gitconfig_step
|
89
|
+
update_gitconfig(".")
|
90
|
+
Console.log_substep("Updated .git/config file")
|
91
|
+
end
|
92
|
+
|
93
|
+
def find_valid_repos(repos)
|
94
|
+
repos.select do |repo|
|
95
|
+
next true if repo.head_born?
|
96
|
+
Console.log_warning("Ignoring repo '#{repo.path}' because its HEAD is unborn. You must perform at least one commit.")
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
def create_entries(repos)
|
101
|
+
entries = []
|
102
|
+
repos.each do |repo|
|
103
|
+
origin_url = repo.remote('origin').url
|
104
|
+
current_branch = repo.current_branch
|
105
|
+
|
106
|
+
if Console.ask_yes_no("Do you want to add '#{repo.path}' as a dependency?\n [origin: #{origin_url || "NONE"}, branch: #{current_branch}]")
|
107
|
+
raise MultiRepoException, "Repo 'origin' remote url is not set; aborting." unless origin_url
|
108
|
+
entries.push(ConfigEntry.new(repo))
|
109
|
+
Console.log_substep("Added the repository '#{repo.path}' to the .multirepo file")
|
110
|
+
end
|
111
|
+
end
|
112
|
+
return entries
|
113
|
+
end
|
114
|
+
|
115
|
+
def check_repo_exists
|
116
|
+
if !Dir.exists?(@repo.path) then raise MultiRepoException, "There is no folder at path '#{@repo.path}'" end
|
117
|
+
if !@repo.exists? then raise MultiRepoException, "'#{@repo.path}' is not a repository" end
|
118
|
+
end
|
119
|
+
end
|
120
120
|
end
|