git-multirepo 1.0.0.beta60 → 1.0.0.beta61

Sign up to get free protection for your applications and to get access to all the features.
Files changed (73) hide show
  1. checksums.yaml +4 -4
  2. data/.gitattributes +2 -2
  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 +75 -71
  8. data/Gemfile +4 -4
  9. data/Gemfile.lock +49 -47
  10. data/LICENSE +22 -22
  11. data/README.md +179 -179
  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 +32 -32
  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 +15 -15
  23. data/lib/multirepo/commands/do-command.rb +101 -101
  24. data/lib/multirepo/commands/graph-command.rb +43 -43
  25. data/lib/multirepo/commands/init-command.rb +121 -121
  26. data/lib/multirepo/commands/inspect-command.rb +48 -48
  27. data/lib/multirepo/commands/install-command.rb +170 -170
  28. data/lib/multirepo/commands/merge-command.rb +249 -249
  29. data/lib/multirepo/commands/open-command.rb +55 -55
  30. data/lib/multirepo/commands/remove-command.rb +48 -48
  31. data/lib/multirepo/commands/uninit-command.rb +18 -18
  32. data/lib/multirepo/commands/update-command.rb +112 -112
  33. data/lib/multirepo/config.rb +19 -19
  34. data/lib/multirepo/files/config-entry.rb +39 -39
  35. data/lib/multirepo/files/config-file.rb +52 -48
  36. data/lib/multirepo/files/lock-entry.rb +29 -29
  37. data/lib/multirepo/files/lock-file.rb +62 -58
  38. data/lib/multirepo/files/meta-file.rb +51 -47
  39. data/lib/multirepo/files/tracking-file.rb +9 -9
  40. data/lib/multirepo/files/tracking-files.rb +65 -65
  41. data/lib/multirepo/git/branch.rb +32 -32
  42. data/lib/multirepo/git/change.rb +11 -11
  43. data/lib/multirepo/git/commit.rb +7 -7
  44. data/lib/multirepo/git/git-runner.rb +56 -56
  45. data/lib/multirepo/git/git.rb +10 -10
  46. data/lib/multirepo/git/ref.rb +38 -38
  47. data/lib/multirepo/git/remote.rb +17 -17
  48. data/lib/multirepo/git/repo.rb +129 -129
  49. data/lib/multirepo/hooks/post-commit-hook.rb +23 -23
  50. data/lib/multirepo/hooks/pre-commit-hook.rb +35 -35
  51. data/lib/multirepo/info.rb +5 -5
  52. data/lib/multirepo/logic/dependency.rb +6 -6
  53. data/lib/multirepo/logic/merge-descriptor.rb +95 -95
  54. data/lib/multirepo/logic/node.rb +72 -72
  55. data/lib/multirepo/logic/performer.rb +55 -55
  56. data/lib/multirepo/logic/repo-selection.rb +25 -25
  57. data/lib/multirepo/logic/revision-selection.rb +15 -15
  58. data/lib/multirepo/logic/revision-selector.rb +23 -23
  59. data/lib/multirepo/logic/version-comparer.rb +10 -10
  60. data/lib/multirepo/multirepo-exception.rb +6 -6
  61. data/lib/multirepo/output/extra-output.rb +12 -12
  62. data/lib/multirepo/output/teamcity-extra-output.rb +11 -11
  63. data/lib/multirepo/utility/console.rb +52 -52
  64. data/lib/multirepo/utility/popen-runner.rb +27 -27
  65. data/lib/multirepo/utility/system-runner.rb +14 -14
  66. data/lib/multirepo/utility/utils.rb +99 -99
  67. data/lib/multirepo/utility/verbosity.rb +6 -6
  68. data/resources/.gitconfig +2 -2
  69. data/resources/post-commit +6 -6
  70. data/resources/pre-commit +6 -6
  71. data/spec/integration/init_spec.rb +19 -19
  72. data/spec/spec_helper.rb +89 -89
  73. metadata +9 -15
@@ -1,88 +1,88 @@
1
- require "multirepo/utility/console"
2
- require "multirepo/git/git"
3
- require "multirepo/files/config-file"
4
- require "multirepo/files/tracking-files"
5
- require "multirepo/logic/performer"
6
-
7
- module MultiRepo
8
- class BranchCommand < Command
9
- self.command = "branch"
10
- self.summary = "Create and/or checkout a new branch for all repos."
11
-
12
- def self.options
13
- [
14
- ['<branch name>', 'The name of the branch to create and checkout.'],
15
- ['[--force]', 'Force creating the branch even if there are uncommmitted changes.'],
16
- ['[--no-push]', 'Do not push the branch on creation.']
17
- ].concat(super)
18
- end
19
-
20
- def initialize(argv)
21
- @branch_name = argv.shift_argument
22
- @force = argv.flag?("force")
23
- @push = argv.flag?("push", true)
24
- super
25
- end
26
-
27
- def validate!
28
- super
29
- help! "You must specify a branch name" unless @branch_name
30
- help! "Please provide a valid branch name" unless Git.valid_branch_name?(@branch_name)
31
- end
32
-
33
- def run
34
- ensure_in_work_tree
35
- ensure_multirepo_enabled
36
-
37
- Console.log_step("Branching...")
38
-
39
- main_repo = Repo.new(".")
40
-
41
- unless @force
42
- # Ensure the main repo is clean
43
- fail MultiRepoException, "Main repo is not clean; multi branch aborted" unless main_repo.clean?
44
-
45
- # Ensure dependencies are clean
46
- config_entries = ConfigFile.new(".").load_entries
47
- unless Utils.dependencies_clean?(config_entries)
48
- fail MultiRepoException, "Dependencies are not clean; multi branch aborted"
49
- end
50
- end
51
-
52
- # Branch dependencies
53
- Performer.depth_ordered_dependencies.each do |dependency|
54
- perform_branch(dependency.config_entry.repo)
55
- end
56
-
57
- # Branch the main repo
58
- perform_branch(main_repo)
59
-
60
- Console.log_step("Done!")
61
- end
62
-
63
- def perform_branch(repo)
64
- Console.log_substep("Branching '#{repo.path}' ...")
65
- Console.log_info("Creating and checking out branch #{@branch_name} ...")
66
-
67
- branch = repo.branch(@branch_name)
68
- branch.create unless branch.exists?
69
- branch.checkout
70
-
71
- if Utils.multirepo_enabled?(repo.path)
72
- Console.log_info("Updating and committing tracking files")
73
- tracking_files = TrackingFiles.new(repo.path)
74
- tracking_files.update
75
- tracking_files.commit("[multirepo] Post-branch tracking files update")
76
- end
77
-
78
- return unless @push
79
-
80
- if @force
81
- Console.log_warning("Skipping #{@branch_name} branch push because we're force-branching")
82
- else
83
- Console.log_info("Pushing #{@branch_name} to origin/#{@branch_name}")
84
- repo.branch(@branch_name).push
85
- end
86
- end
87
- end
88
- end
1
+ require "multirepo/utility/console"
2
+ require "multirepo/git/git"
3
+ require "multirepo/files/config-file"
4
+ require "multirepo/files/tracking-files"
5
+ require "multirepo/logic/performer"
6
+
7
+ module MultiRepo
8
+ class BranchCommand < Command
9
+ self.command = "branch"
10
+ self.summary = "Create and/or checkout a new branch for all repos."
11
+
12
+ def self.options
13
+ [
14
+ ['<branch name>', 'The name of the branch to create and checkout.'],
15
+ ['[--force]', 'Force creating the branch even if there are uncommmitted changes.'],
16
+ ['[--no-push]', 'Do not push the branch on creation.']
17
+ ].concat(super)
18
+ end
19
+
20
+ def initialize(argv)
21
+ @branch_name = argv.shift_argument
22
+ @force = argv.flag?("force")
23
+ @push = argv.flag?("push", true)
24
+ super
25
+ end
26
+
27
+ def validate!
28
+ super
29
+ help! "You must specify a branch name" unless @branch_name
30
+ help! "Please provide a valid branch name" unless Git.valid_branch_name?(@branch_name)
31
+ end
32
+
33
+ def run
34
+ ensure_in_work_tree
35
+ ensure_multirepo_enabled
36
+
37
+ Console.log_step("Branching...")
38
+
39
+ main_repo = Repo.new(".")
40
+
41
+ unless @force
42
+ # Ensure the main repo is clean
43
+ fail MultiRepoException, "Main repo is not clean; multi branch aborted" unless main_repo.clean?
44
+
45
+ # Ensure dependencies are clean
46
+ config_entries = ConfigFile.new(".").load_entries
47
+ unless Utils.dependencies_clean?(config_entries)
48
+ fail MultiRepoException, "Dependencies are not clean; multi branch aborted"
49
+ end
50
+ end
51
+
52
+ # Branch dependencies
53
+ Performer.depth_ordered_dependencies.each do |dependency|
54
+ perform_branch(dependency.config_entry.repo)
55
+ end
56
+
57
+ # Branch the main repo
58
+ perform_branch(main_repo)
59
+
60
+ Console.log_step("Done!")
61
+ end
62
+
63
+ def perform_branch(repo)
64
+ Console.log_substep("Branching '#{repo.path}' ...")
65
+ Console.log_info("Creating and checking out branch #{@branch_name} ...")
66
+
67
+ branch = repo.branch(@branch_name)
68
+ branch.create unless branch.exists?
69
+ branch.checkout
70
+
71
+ if Utils.multirepo_enabled?(repo.path)
72
+ Console.log_info("Updating and committing tracking files")
73
+ tracking_files = TrackingFiles.new(repo.path)
74
+ tracking_files.update
75
+ tracking_files.commit("[multirepo] Post-branch tracking files update")
76
+ end
77
+
78
+ return unless @push
79
+
80
+ if @force
81
+ Console.log_warning("Skipping #{@branch_name} branch push because we're force-branching")
82
+ else
83
+ Console.log_info("Pushing #{@branch_name} to origin/#{@branch_name}")
84
+ repo.branch(@branch_name).push
85
+ end
86
+ end
87
+ end
88
+ end
@@ -1,127 +1,127 @@
1
- require "multirepo/utility/console"
2
- require "multirepo/utility/utils"
3
- require "multirepo/output/extra-output"
4
- require "multirepo/logic/revision-selector"
5
- require "multirepo/logic/performer"
6
-
7
- module MultiRepo
8
- class CheckoutCommand < Command
9
- self.command = "checkout"
10
- self.summary = "Checks out the specified commit or branch of the main repo and checks out matching versions of all dependencies."
11
-
12
- def self.options
13
- [
14
- ['<refname>', 'The main repo tag, branch or commit id to checkout.'],
15
- ['[--latest]', 'Checkout the HEAD of each dependency branch (as recorded in the lock file) instead of the exact required commits.'],
16
- ['[--exact]', 'Checkout the exact specified ref for each repo, regardless of what\'s stored in the lock file.'],
17
- ['[--force]', 'Force checkout even if there are uncommmitted changes.']
18
- ].concat(super)
19
- end
20
-
21
- def initialize(argv)
22
- @ref_name = argv.shift_argument
23
- @checkout_latest = argv.flag?("latest")
24
- @checkout_exact = argv.flag?("exact")
25
- @force = argv.flag?("force")
26
- super
27
- end
28
-
29
- def validate!
30
- super
31
- help! "You must specify a branch or commit id to checkout" unless @ref_name
32
- unless Utils.only_one_true?(@checkout_latest, @checkout_exact)
33
- help! "You can't provide more than one operation modifier (--latest, --exact, etc.)"
34
- end
35
- end
36
-
37
- def run
38
- ensure_in_work_tree
39
-
40
- # Find out the checkout mode based on command-line options
41
- mode = RevisionSelector.mode_for_args(@checkout_latest, @checkout_exact)
42
-
43
- strategy_name = RevisionSelection.name_for_mode(mode)
44
- Console.log_step("Checking out #{@ref_name} and its dependencies using the '#{strategy_name}' strategy...")
45
-
46
- main_repo = Repo.new(".")
47
-
48
- unless proceed_if_merge_commit?(main_repo, @ref_name, mode)
49
- fail MultiRepoException, "Aborting checkout"
50
- end
51
-
52
- checkout_core(main_repo, mode)
53
-
54
- Console.log_step("Done!")
55
- end
56
-
57
- def checkout_core(main_repo, mode)
58
- initial_revision = main_repo.current_revision
59
- begin
60
- # Checkout first because the current ref might not be multirepo-enabled
61
- checkout_main_repo_step(main_repo)
62
- # Only then can we check for dependencies and make sure they are clean
63
- ensure_dependencies_clean_step if !@force
64
- rescue MultiRepoException => e
65
- Console.log_warning("Restoring working copy to #{initial_revision}")
66
- main_repo.checkout(initial_revision)
67
- raise e
68
- end
69
- dependencies_checkout_step(mode, @ref_name)
70
- end
71
-
72
- def checkout_main_repo_step(main_repo)
73
- Performer.perform_main_repo_checkout(main_repo, @ref_name, @force)
74
- end
75
-
76
- def ensure_dependencies_clean_step
77
- unless Utils.dependencies_clean?(ConfigFile.new(".").load_entries)
78
- fail MultiRepoException, "Dependencies are not clean!"
79
- end
80
- end
81
-
82
- def dependencies_checkout_step(mode, ref_name = nil)
83
- Performer.depth_ordered_dependencies.each do |dependency|
84
- # Find out the required dependency revision based on the checkout mode
85
- revision = RevisionSelector.revision_for_mode(mode, ref_name, dependency.lock_entry)
86
- perform_dependency_checkout(dependency.config_entry, revision)
87
- end
88
- end
89
-
90
- def proceed_if_merge_commit?(main_repo, ref_name, mode)
91
- return true unless main_repo.ref(ref_name).merge_commit?
92
-
93
- case mode
94
- when RevisionSelection::AS_LOCK
95
- Console.log_error("The specified ref is a merge commit and an \"as-lock\" checkout was requested.")
96
- Console.log_error("The resulting checkout would most probably not result in a valid project state.")
97
- return false
98
- when RevisionSelection::LATEST
99
- Console.log_warning("The specified ref is a merge commit and a \"latest\" checkout was requested.")
100
- Console.log_warning("The work branches recorded in the branch from which the merge was performed will be checked out.")
101
- end
102
-
103
- return true
104
- end
105
-
106
- def perform_dependency_checkout(config_entry, revision)
107
- dependency_name = config_entry.repo.basename
108
-
109
- # Make sure the repo exists on disk, and clone it if it doesn't
110
- # (in case the checked-out revision had an additional dependency)
111
- unless config_entry.repo.exists?
112
- Console.log_substep("Cloning missing dependency '#{config_entry.path}' from #{config_entry.url}")
113
- ExtraOutput.progress("Cloning missing dependency #{config_entry.path}")
114
- config_entry.repo.clone(config_entry.url)
115
- end
116
-
117
- # Checkout!
118
- ExtraOutput.progress("Checking out #{dependency_name} #{revision}")
119
- if config_entry.repo.checkout(revision)
120
- Console.log_substep("Checked out #{dependency_name} '#{revision}'")
121
- else
122
- ExtraOutput.error("Couldn|'t check out dependency #{dependency_name}")
123
- fail MultiRepoException, "Couldn't check out the appropriate version of dependency #{dependency_name}"
124
- end
125
- end
126
- end
127
- end
1
+ require "multirepo/utility/console"
2
+ require "multirepo/utility/utils"
3
+ require "multirepo/output/extra-output"
4
+ require "multirepo/logic/revision-selector"
5
+ require "multirepo/logic/performer"
6
+
7
+ module MultiRepo
8
+ class CheckoutCommand < Command
9
+ self.command = "checkout"
10
+ self.summary = "Checks out the specified commit or branch of the main repo and checks out matching versions of all dependencies."
11
+
12
+ def self.options
13
+ [
14
+ ['<refname>', 'The main repo tag, branch or commit id to checkout.'],
15
+ ['[--latest]', 'Checkout the HEAD of each dependency branch (as recorded in the lock file) instead of the exact required commits.'],
16
+ ['[--exact]', 'Checkout the exact specified ref for each repo, regardless of what\'s stored in the lock file.'],
17
+ ['[--force]', 'Force checkout even if there are uncommmitted changes.']
18
+ ].concat(super)
19
+ end
20
+
21
+ def initialize(argv)
22
+ @ref_name = argv.shift_argument
23
+ @checkout_latest = argv.flag?("latest")
24
+ @checkout_exact = argv.flag?("exact")
25
+ @force = argv.flag?("force")
26
+ super
27
+ end
28
+
29
+ def validate!
30
+ super
31
+ help! "You must specify a branch or commit id to checkout" unless @ref_name
32
+ unless Utils.only_one_true?(@checkout_latest, @checkout_exact)
33
+ help! "You can't provide more than one operation modifier (--latest, --exact, etc.)"
34
+ end
35
+ end
36
+
37
+ def run
38
+ ensure_in_work_tree
39
+
40
+ # Find out the checkout mode based on command-line options
41
+ mode = RevisionSelector.mode_for_args(@checkout_latest, @checkout_exact)
42
+
43
+ strategy_name = RevisionSelection.name_for_mode(mode)
44
+ Console.log_step("Checking out #{@ref_name} and its dependencies using the '#{strategy_name}' strategy...")
45
+
46
+ main_repo = Repo.new(".")
47
+
48
+ unless proceed_if_merge_commit?(main_repo, @ref_name, mode)
49
+ fail MultiRepoException, "Aborting checkout"
50
+ end
51
+
52
+ checkout_core(main_repo, mode)
53
+
54
+ Console.log_step("Done!")
55
+ end
56
+
57
+ def checkout_core(main_repo, mode)
58
+ initial_revision = main_repo.current_revision
59
+ begin
60
+ # Checkout first because the current ref might not be multirepo-enabled
61
+ checkout_main_repo_step(main_repo)
62
+ # Only then can we check for dependencies and make sure they are clean
63
+ ensure_dependencies_clean_step if !@force
64
+ rescue MultiRepoException => e
65
+ Console.log_warning("Restoring working copy to #{initial_revision}")
66
+ main_repo.checkout(initial_revision)
67
+ raise e
68
+ end
69
+ dependencies_checkout_step(mode, @ref_name)
70
+ end
71
+
72
+ def checkout_main_repo_step(main_repo)
73
+ Performer.perform_main_repo_checkout(main_repo, @ref_name, @force)
74
+ end
75
+
76
+ def ensure_dependencies_clean_step
77
+ unless Utils.dependencies_clean?(ConfigFile.new(".").load_entries)
78
+ fail MultiRepoException, "Dependencies are not clean!"
79
+ end
80
+ end
81
+
82
+ def dependencies_checkout_step(mode, ref_name = nil)
83
+ Performer.depth_ordered_dependencies.each do |dependency|
84
+ # Find out the required dependency revision based on the checkout mode
85
+ revision = RevisionSelector.revision_for_mode(mode, ref_name, dependency.lock_entry)
86
+ perform_dependency_checkout(dependency.config_entry, revision)
87
+ end
88
+ end
89
+
90
+ def proceed_if_merge_commit?(main_repo, ref_name, mode)
91
+ return true unless main_repo.ref(ref_name).merge_commit?
92
+
93
+ case mode
94
+ when RevisionSelection::AS_LOCK
95
+ Console.log_error("The specified ref is a merge commit and an \"as-lock\" checkout was requested.")
96
+ Console.log_error("The resulting checkout would most probably not result in a valid project state.")
97
+ return false
98
+ when RevisionSelection::LATEST
99
+ Console.log_warning("The specified ref is a merge commit and a \"latest\" checkout was requested.")
100
+ Console.log_warning("The work branches recorded in the branch from which the merge was performed will be checked out.")
101
+ end
102
+
103
+ return true
104
+ end
105
+
106
+ def perform_dependency_checkout(config_entry, revision)
107
+ dependency_name = config_entry.repo.basename
108
+
109
+ # Make sure the repo exists on disk, and clone it if it doesn't
110
+ # (in case the checked-out revision had an additional dependency)
111
+ unless config_entry.repo.exists?
112
+ Console.log_substep("Cloning missing dependency '#{config_entry.path}' from #{config_entry.url}")
113
+ ExtraOutput.progress("Cloning missing dependency #{config_entry.path}")
114
+ config_entry.repo.clone(config_entry.url)
115
+ end
116
+
117
+ # Checkout!
118
+ ExtraOutput.progress("Checking out #{dependency_name} #{revision}")
119
+ if config_entry.repo.checkout(revision)
120
+ Console.log_substep("Checked out #{dependency_name} '#{revision}'")
121
+ else
122
+ ExtraOutput.error("Couldn|'t check out dependency #{dependency_name}")
123
+ fail MultiRepoException, "Couldn't check out the appropriate version of dependency #{dependency_name}"
124
+ end
125
+ end
126
+ end
127
+ end
@@ -1,68 +1,68 @@
1
- require "multirepo/utility/console"
2
- require "multirepo/utility/utils"
3
- require "multirepo/git/repo"
4
- require_relative "install-command"
5
-
6
- module MultiRepo
7
- class CloneCommand < Command
8
- self.command = "clone"
9
- self.summary = "Clones the specified repository in a subfolder, then installs it."
10
-
11
- def self.options
12
- [
13
- ['<url>', 'The repository to clone.'],
14
- ['<name>', 'The name of the containing folder that will be created.'],
15
- ['[<refname>]', 'The branch, tag or commit id to checkout. Checkout will use "master" if unspecified.']
16
- ].concat(super)
17
- end
18
-
19
- def initialize(argv)
20
- @url = argv.shift_argument
21
- @name = argv.shift_argument
22
- @ref_name = argv.shift_argument || "master"
23
- super
24
- end
25
-
26
- def validate!
27
- super
28
- help! "You must specify a repository to clone" unless @url
29
- help! "You must specify a containing folder name" unless @name
30
- end
31
-
32
- def run
33
- Console.log_step("Cloning #{@url} ...")
34
-
35
- fail MultiRepoException, "A directory named #{@name} already exists" if Dir.exist?(@name)
36
-
37
- main_repo_path = "#{@name}/#{@name}"
38
- main_repo = Repo.new(main_repo_path)
39
-
40
- # Recursively create the directory where we'll clone the main repo
41
- FileUtils.mkpath(main_repo_path)
42
-
43
- # Clone the specified remote in the just-created directory
44
- fail MultiRepoException, "Could not clone repo from #{@url}" unless main_repo.clone(@url)
45
-
46
- # Checkout the specified main repo ref so that install reads the proper config file
47
- unless main_repo.checkout(@ref_name)
48
- fail MultiRepoException, "Couldn't perform checkout of main repo #{@ref_name}!"
49
- end
50
-
51
- Console.log_substep("Checked out main repo #{@ref_name}")
52
-
53
- # Make sure the ref we just checked out is tracked by multirepo
54
- unless Utils.multirepo_tracked?(main_repo_path)
55
- fail MultiRepoException, "Ref #{@ref_name} is not tracked by multirepo"
56
- end
57
-
58
- # Install
59
- original_path = Dir.pwd
60
- Dir.chdir(main_repo_path)
61
- install_command = InstallCommand.new(CLAide::ARGV.new([]))
62
- install_command.full_install
63
- Dir.chdir(original_path)
64
-
65
- Console.log_step("Done!")
66
- end
67
- end
68
- end
1
+ require "multirepo/utility/console"
2
+ require "multirepo/utility/utils"
3
+ require "multirepo/git/repo"
4
+ require_relative "install-command"
5
+
6
+ module MultiRepo
7
+ class CloneCommand < Command
8
+ self.command = "clone"
9
+ self.summary = "Clones the specified repository in a subfolder, then installs it."
10
+
11
+ def self.options
12
+ [
13
+ ['<url>', 'The repository to clone.'],
14
+ ['<name>', 'The name of the containing folder that will be created.'],
15
+ ['[<refname>]', 'The branch, tag or commit id to checkout. Checkout will use "master" if unspecified.']
16
+ ].concat(super)
17
+ end
18
+
19
+ def initialize(argv)
20
+ @url = argv.shift_argument
21
+ @name = argv.shift_argument
22
+ @ref_name = argv.shift_argument || "master"
23
+ super
24
+ end
25
+
26
+ def validate!
27
+ super
28
+ help! "You must specify a repository to clone" unless @url
29
+ help! "You must specify a containing folder name" unless @name
30
+ end
31
+
32
+ def run
33
+ Console.log_step("Cloning #{@url} ...")
34
+
35
+ fail MultiRepoException, "A directory named #{@name} already exists" if Dir.exist?(@name)
36
+
37
+ main_repo_path = "#{@name}/#{@name}"
38
+ main_repo = Repo.new(main_repo_path)
39
+
40
+ # Recursively create the directory where we'll clone the main repo
41
+ FileUtils.mkpath(main_repo_path)
42
+
43
+ # Clone the specified remote in the just-created directory
44
+ fail MultiRepoException, "Could not clone repo from #{@url}" unless main_repo.clone(@url)
45
+
46
+ # Checkout the specified main repo ref so that install reads the proper config file
47
+ unless main_repo.checkout(@ref_name)
48
+ fail MultiRepoException, "Couldn't perform checkout of main repo #{@ref_name}!"
49
+ end
50
+
51
+ Console.log_substep("Checked out main repo #{@ref_name}")
52
+
53
+ # Make sure the ref we just checked out is tracked by multirepo
54
+ unless Utils.multirepo_tracked?(main_repo_path)
55
+ fail MultiRepoException, "Ref #{@ref_name} is not tracked by multirepo"
56
+ end
57
+
58
+ # Install
59
+ original_path = Dir.pwd
60
+ Dir.chdir(main_repo_path)
61
+ install_command = InstallCommand.new(CLAide::ARGV.new([]))
62
+ install_command.full_install
63
+ Dir.chdir(original_path)
64
+
65
+ Console.log_step("Done!")
66
+ end
67
+ end
68
+ end