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.
Files changed (63) 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.meta +2 -2
  6. data/.rspec +2 -2
  7. data/Gemfile +4 -4
  8. data/Gemfile.lock +42 -42
  9. data/LICENSE +22 -22
  10. data/README.md +146 -145
  11. data/Rakefile +2 -2
  12. data/bin/multi +10 -10
  13. data/docs/bug-repros/91565510-repro.sh +20 -20
  14. data/git-multirepo.gemspec +31 -31
  15. data/lib/commands.rb +15 -14
  16. data/lib/git-multirepo.rb +2 -2
  17. data/lib/info.rb +4 -4
  18. data/lib/multirepo/commands/add-command.rb +53 -53
  19. data/lib/multirepo/commands/branch-command.rb +82 -82
  20. data/lib/multirepo/commands/checkout-command.rb +122 -122
  21. data/lib/multirepo/commands/clean-command.rb +31 -31
  22. data/lib/multirepo/commands/clone-command.rb +70 -70
  23. data/lib/multirepo/commands/command.rb +75 -75
  24. data/lib/multirepo/commands/do-command.rb +76 -0
  25. data/lib/multirepo/commands/fetch-command.rb +30 -30
  26. data/lib/multirepo/commands/graph-command.rb +45 -45
  27. data/lib/multirepo/commands/init-command.rb +119 -119
  28. data/lib/multirepo/commands/install-command.rb +103 -103
  29. data/lib/multirepo/commands/merge-command.rb +167 -167
  30. data/lib/multirepo/commands/open-command.rb +57 -57
  31. data/lib/multirepo/commands/remove-command.rb +50 -50
  32. data/lib/multirepo/commands/uninit-command.rb +20 -20
  33. data/lib/multirepo/commands/update-command.rb +60 -60
  34. data/lib/multirepo/config.rb +15 -15
  35. data/lib/multirepo/files/config-entry.rb +38 -38
  36. data/lib/multirepo/files/config-file.rb +45 -45
  37. data/lib/multirepo/files/lock-entry.rb +24 -24
  38. data/lib/multirepo/files/lock-file.rb +38 -38
  39. data/lib/multirepo/files/meta-file.rb +40 -40
  40. data/lib/multirepo/files/tracking-file.rb +8 -8
  41. data/lib/multirepo/files/tracking-files.rb +46 -46
  42. data/lib/multirepo/git/branch.rb +30 -30
  43. data/lib/multirepo/git/change.rb +10 -10
  44. data/lib/multirepo/git/commit.rb +17 -17
  45. data/lib/multirepo/git/git-runner.rb +46 -46
  46. data/lib/multirepo/git/remote.rb +16 -16
  47. data/lib/multirepo/git/repo.rb +77 -77
  48. data/lib/multirepo/hooks/post-commit-hook.rb +22 -22
  49. data/lib/multirepo/hooks/pre-commit-hook.rb +31 -31
  50. data/lib/multirepo/logic/merge-descriptor.rb +12 -12
  51. data/lib/multirepo/logic/node.rb +44 -44
  52. data/lib/multirepo/logic/performer.rb +62 -62
  53. data/lib/multirepo/logic/revision-selector.rb +34 -34
  54. data/lib/multirepo/multirepo-exception.rb +5 -5
  55. data/lib/multirepo/utility/console.rb +51 -51
  56. data/lib/multirepo/utility/runner.rb +34 -34
  57. data/lib/multirepo/utility/utils.rb +81 -81
  58. data/resources/.gitconfig +2 -2
  59. data/resources/post-commit +5 -5
  60. data/resources/pre-commit +5 -5
  61. data/spec/integration/init_spec.rb +18 -18
  62. data/spec/spec_helper.rb +89 -89
  63. 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.add_nodes(child_node.name)
41
- graph.add_edges(parent_graph_node, child_graph_node)
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