git-multirepo 1.0.0.beta42 → 1.0.0.beta43

Sign up to get free protection for your applications and to get access to all the features.
Files changed (64) 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 +143 -143
  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 +13 -13
  16. data/lib/git-multirepo.rb +2 -2
  17. data/lib/info.rb +4 -4
  18. data/lib/multirepo/commands/add-command.rb +50 -50
  19. data/lib/multirepo/commands/branch-command.rb +81 -81
  20. data/lib/multirepo/commands/checkout-command.rb +119 -119
  21. data/lib/multirepo/commands/clone-command.rb +67 -67
  22. data/lib/multirepo/commands/command.rb +89 -89
  23. data/lib/multirepo/commands/do-command.rb +100 -100
  24. data/lib/multirepo/commands/graph-command.rb +42 -42
  25. data/lib/multirepo/commands/init-command.rb +119 -119
  26. data/lib/multirepo/commands/install-command.rb +106 -106
  27. data/lib/multirepo/commands/merge-command.rb +225 -225
  28. data/lib/multirepo/commands/open-command.rb +55 -55
  29. data/lib/multirepo/commands/remove-command.rb +47 -47
  30. data/lib/multirepo/commands/uninit-command.rb +17 -17
  31. data/lib/multirepo/commands/update-command.rb +55 -55
  32. data/lib/multirepo/config.rb +15 -15
  33. data/lib/multirepo/files/config-entry.rb +38 -38
  34. data/lib/multirepo/files/config-file.rb +45 -45
  35. data/lib/multirepo/files/lock-entry.rb +28 -28
  36. data/lib/multirepo/files/lock-file.rb +55 -55
  37. data/lib/multirepo/files/meta-file.rb +40 -40
  38. data/lib/multirepo/files/tracking-file.rb +8 -8
  39. data/lib/multirepo/files/tracking-files.rb +46 -46
  40. data/lib/multirepo/git/branch.rb +31 -31
  41. data/lib/multirepo/git/change.rb +10 -10
  42. data/lib/multirepo/git/commit.rb +6 -6
  43. data/lib/multirepo/git/git-runner.rb +46 -46
  44. data/lib/multirepo/git/git.rb +9 -9
  45. data/lib/multirepo/git/ref.rb +37 -37
  46. data/lib/multirepo/git/remote.rb +16 -16
  47. data/lib/multirepo/git/repo.rb +122 -122
  48. data/lib/multirepo/hooks/post-commit-hook.rb +22 -22
  49. data/lib/multirepo/hooks/pre-commit-hook.rb +34 -34
  50. data/lib/multirepo/logic/dependency.rb +5 -5
  51. data/lib/multirepo/logic/merge-descriptor.rb +94 -94
  52. data/lib/multirepo/logic/node.rb +71 -71
  53. data/lib/multirepo/logic/performer.rb +56 -56
  54. data/lib/multirepo/logic/revision-selector.rb +34 -34
  55. data/lib/multirepo/multirepo-exception.rb +5 -5
  56. data/lib/multirepo/utility/console.rb +51 -51
  57. data/lib/multirepo/utility/runner.rb +34 -34
  58. data/lib/multirepo/utility/utils.rb +94 -94
  59. data/resources/.gitconfig +2 -2
  60. data/resources/post-commit +5 -5
  61. data/resources/pre-commit +5 -5
  62. data/spec/integration/init_spec.rb +18 -18
  63. data/spec/spec_helper.rb +89 -89
  64. metadata +2 -2
@@ -1,120 +1,120 @@
1
- require "multirepo/utility/console"
2
- require "multirepo/logic/revision-selector"
3
- require "multirepo/logic/performer"
4
-
5
- module MultiRepo
6
- class CheckoutCommand < Command
7
- self.command = "checkout"
8
- self.summary = "Checks out the specified commit or branch of the main repo and checks out matching versions of all dependencies."
9
-
10
- def self.options
11
- [
12
- ['<refname>', 'The main repo tag, branch or commit id to checkout.'],
13
- ['[--latest]', 'Checkout the HEAD of each dependency branch (as recorded in the lock file) instead of the exact required commits.'],
14
- ['[--exact]', 'Checkout the exact specified ref for each repo, regardless of what\'s stored in the lock file.']
15
- ].concat(super)
16
- end
17
-
18
- def initialize(argv)
19
- @ref_name = argv.shift_argument
20
- @checkout_latest = argv.flag?("latest")
21
- @checkout_exact = argv.flag?("exact")
22
- super
23
- end
24
-
25
- def validate!
26
- super
27
- help! "You must specify a branch or commit id to checkout" unless @ref_name
28
- unless validate_only_one_flag(@checkout_latest, @checkout_exact)
29
- help! "You can't provide more than one operation modifier (--latest, --exact, etc.)"
30
- end
31
- end
32
-
33
- def run
34
- ensure_in_work_tree
35
-
36
- # Find out the checkout mode based on command-line options
37
- mode = RevisionSelector.mode_for_args(@checkout_latest, @checkout_exact)
38
-
39
- strategy_name = RevisionSelectionMode.name_for_mode(mode)
40
- Console.log_step("Checking out #{@ref_name} and its dependencies using the '#{strategy_name}' strategy...")
41
-
42
- main_repo = Repo.new(".")
43
-
44
- unless proceed_if_merge_commit?(main_repo, @ref_name, mode)
45
- raise MultiRepoException, "Aborting checkout"
46
- end
47
-
48
- checkout_core(main_repo, mode)
49
-
50
- Console.log_step("Done!")
51
- end
52
-
53
- def checkout_core(main_repo, mode)
54
- initial_revision = main_repo.current_revision
55
- begin
56
- # Checkout first because the current ref might not be multirepo-enabled
57
- checkout_main_repo_step(main_repo)
58
- # Only then can we check for dependencies and make sure they are clean
59
- ensure_dependencies_clean_step(main_repo)
60
- rescue MultiRepoException => e
61
- Console.log_warning("Restoring working copy to #{initial_revision}")
62
- main_repo.checkout(initial_revision)
63
- raise e
64
- end
65
- dependencies_checkout_step(mode, @ref_name)
66
- end
67
-
68
- def checkout_main_repo_step(main_repo)
69
- Performer.perform_main_repo_checkout(main_repo, @ref_name)
70
- end
71
-
72
- def ensure_dependencies_clean_step(main_repo)
73
- unless Utils.dependencies_clean?(ConfigFile.new(".").load_entries)
74
- raise MultiRepoException, "Dependencies are not clean!"
75
- end
76
- end
77
-
78
- def dependencies_checkout_step(mode, ref_name = nil)
79
- Performer.dependencies.each do |dependency|
80
- # Find out the required dependency revision based on the checkout mode
81
- revision = RevisionSelector.revision_for_mode(mode, ref_name, dependency.lock_entry)
82
- perform_dependency_checkout(dependency.config_entry, revision)
83
- end
84
- end
85
-
86
- def proceed_if_merge_commit?(main_repo, ref_name, mode)
87
- return true unless main_repo.ref(ref_name).is_merge?
88
-
89
- case mode
90
- when RevisionSelectionMode::AS_LOCK
91
- Console.log_error("The specified ref is a merge commit and an \"as-lock\" checkout was requested.")
92
- Console.log_error("The resulting checkout would most probably not result in a valid project state.")
93
- return false
94
- when RevisionSelectionMode::LATEST
95
- Console.log_warning("The specified ref is a merge commit and a \"latest\" checkout was requested.")
96
- Console.log_warning("The work branches recorded in the branch from which the merge was performed will be checked out.")
97
- end
98
-
99
- return true
100
- end
101
-
102
- def perform_dependency_checkout(config_entry, revision)
103
- dependency_name = config_entry.repo.basename
104
-
105
- # Make sure the repo exists on disk, and clone it if it doesn't
106
- # (in case the checked-out revision had an additional dependency)
107
- unless config_entry.repo.exists?
108
- Console.log_substep("Cloning missing dependency '#{config_entry.path}' from #{config_entry.url}")
109
- config_entry.repo.clone(config_entry.url)
110
- end
111
-
112
- # Checkout!
113
- if config_entry.repo.checkout(revision)
114
- Console.log_substep("Checked out #{dependency_name} #{revision}")
115
- else
116
- raise MultiRepoException, "Couldn't check out the appropriate version of dependency #{dependency_name}"
117
- end
118
- end
119
- end
1
+ require "multirepo/utility/console"
2
+ require "multirepo/logic/revision-selector"
3
+ require "multirepo/logic/performer"
4
+
5
+ module MultiRepo
6
+ class CheckoutCommand < Command
7
+ self.command = "checkout"
8
+ self.summary = "Checks out the specified commit or branch of the main repo and checks out matching versions of all dependencies."
9
+
10
+ def self.options
11
+ [
12
+ ['<refname>', 'The main repo tag, branch or commit id to checkout.'],
13
+ ['[--latest]', 'Checkout the HEAD of each dependency branch (as recorded in the lock file) instead of the exact required commits.'],
14
+ ['[--exact]', 'Checkout the exact specified ref for each repo, regardless of what\'s stored in the lock file.']
15
+ ].concat(super)
16
+ end
17
+
18
+ def initialize(argv)
19
+ @ref_name = argv.shift_argument
20
+ @checkout_latest = argv.flag?("latest")
21
+ @checkout_exact = argv.flag?("exact")
22
+ super
23
+ end
24
+
25
+ def validate!
26
+ super
27
+ help! "You must specify a branch or commit id to checkout" unless @ref_name
28
+ unless validate_only_one_flag(@checkout_latest, @checkout_exact)
29
+ help! "You can't provide more than one operation modifier (--latest, --exact, etc.)"
30
+ end
31
+ end
32
+
33
+ def run
34
+ ensure_in_work_tree
35
+
36
+ # Find out the checkout mode based on command-line options
37
+ mode = RevisionSelector.mode_for_args(@checkout_latest, @checkout_exact)
38
+
39
+ strategy_name = RevisionSelectionMode.name_for_mode(mode)
40
+ Console.log_step("Checking out #{@ref_name} and its dependencies using the '#{strategy_name}' strategy...")
41
+
42
+ main_repo = Repo.new(".")
43
+
44
+ unless proceed_if_merge_commit?(main_repo, @ref_name, mode)
45
+ raise MultiRepoException, "Aborting checkout"
46
+ end
47
+
48
+ checkout_core(main_repo, mode)
49
+
50
+ Console.log_step("Done!")
51
+ end
52
+
53
+ def checkout_core(main_repo, mode)
54
+ initial_revision = main_repo.current_revision
55
+ begin
56
+ # Checkout first because the current ref might not be multirepo-enabled
57
+ checkout_main_repo_step(main_repo)
58
+ # Only then can we check for dependencies and make sure they are clean
59
+ ensure_dependencies_clean_step(main_repo)
60
+ rescue MultiRepoException => e
61
+ Console.log_warning("Restoring working copy to #{initial_revision}")
62
+ main_repo.checkout(initial_revision)
63
+ raise e
64
+ end
65
+ dependencies_checkout_step(mode, @ref_name)
66
+ end
67
+
68
+ def checkout_main_repo_step(main_repo)
69
+ Performer.perform_main_repo_checkout(main_repo, @ref_name)
70
+ end
71
+
72
+ def ensure_dependencies_clean_step(main_repo)
73
+ unless Utils.dependencies_clean?(ConfigFile.new(".").load_entries)
74
+ raise MultiRepoException, "Dependencies are not clean!"
75
+ end
76
+ end
77
+
78
+ def dependencies_checkout_step(mode, ref_name = nil)
79
+ Performer.dependencies.each do |dependency|
80
+ # Find out the required dependency revision based on the checkout mode
81
+ revision = RevisionSelector.revision_for_mode(mode, ref_name, dependency.lock_entry)
82
+ perform_dependency_checkout(dependency.config_entry, revision)
83
+ end
84
+ end
85
+
86
+ def proceed_if_merge_commit?(main_repo, ref_name, mode)
87
+ return true unless main_repo.ref(ref_name).is_merge?
88
+
89
+ case mode
90
+ when RevisionSelectionMode::AS_LOCK
91
+ Console.log_error("The specified ref is a merge commit and an \"as-lock\" checkout was requested.")
92
+ Console.log_error("The resulting checkout would most probably not result in a valid project state.")
93
+ return false
94
+ when RevisionSelectionMode::LATEST
95
+ Console.log_warning("The specified ref is a merge commit and a \"latest\" checkout was requested.")
96
+ Console.log_warning("The work branches recorded in the branch from which the merge was performed will be checked out.")
97
+ end
98
+
99
+ return true
100
+ end
101
+
102
+ def perform_dependency_checkout(config_entry, revision)
103
+ dependency_name = config_entry.repo.basename
104
+
105
+ # Make sure the repo exists on disk, and clone it if it doesn't
106
+ # (in case the checked-out revision had an additional dependency)
107
+ unless config_entry.repo.exists?
108
+ Console.log_substep("Cloning missing dependency '#{config_entry.path}' from #{config_entry.url}")
109
+ config_entry.repo.clone(config_entry.url)
110
+ end
111
+
112
+ # Checkout!
113
+ if config_entry.repo.checkout(revision)
114
+ Console.log_substep("Checked out #{dependency_name} #{revision}")
115
+ else
116
+ raise MultiRepoException, "Couldn't check out the appropriate version of dependency #{dependency_name}"
117
+ end
118
+ end
119
+ end
120
120
  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
- raise MultiRepoException, "A directory named #{@name} already exists" if Dir.exists?(@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
- raise 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
- raise 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.is_multirepo_tracked(main_repo_path)
55
- raise 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
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
+ raise MultiRepoException, "A directory named #{@name} already exists" if Dir.exists?(@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
+ raise 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
+ raise 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.is_multirepo_tracked(main_repo_path)
55
+ raise 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
68
  end
@@ -1,90 +1,90 @@
1
- require "claide"
2
-
3
- require "info"
4
- require "multirepo/multirepo-exception"
5
- require "multirepo/config"
6
- require "multirepo/files/config-file"
7
- require "multirepo/files/lock-file"
8
-
9
- module MultiRepo
10
- class Command < CLAide::Command
11
- self.abstract_command = true
12
- self.command = "multi"
13
- self.version = VERSION
14
- self.description = DESCRIPTION
15
-
16
- def self.report_error(exception)
17
- if exception.instance_of?(MultiRepoException)
18
- Console.log_error(exception.message)
19
- return
20
- end
21
- raise exception
22
- end
23
-
24
- def initialize(argv)
25
- @argv = argv
26
- Config.instance.verbose = argv.flag?("verbose") ? true : false
27
- Config.instance.git_executable = argv.option("git-exe", "git")
28
- super
29
- end
30
-
31
- def run
32
- help!
33
- end
34
-
35
- def validate!
36
- super
37
- path = Config.instance.git_executable
38
- is_git_exe = path =~ /.*(git)|(git.exe)$/
39
- file_exists = path == "git" || File.exists?(path)
40
- help! "Invalid git executable '#{path}'" unless is_git_exe && file_exists
41
- end
42
-
43
- def install_hooks(path)
44
- actual_path = path || "."
45
- Utils.install_hook("pre-commit", actual_path)
46
- Utils.install_hook("post-commit", actual_path)
47
- end
48
-
49
- def uninstall_hooks
50
- FileUtils.rm_f(".git/hooks/pre-commit")
51
- FileUtils.rm_f(".git/hooks/post-commit")
52
- end
53
-
54
- def update_gitconfig(path)
55
- actual_path = path || "."
56
- resource_file = Utils.path_for_resource(".gitconfig")
57
- target_file = File.join(actual_path, '.git/config')
58
-
59
- template = File.read(resource_file)
60
- first_template_line = template.lines.first
61
-
62
- Utils.append_if_missing(target_file, Regexp.new(Regexp.quote(first_template_line)), template)
63
- end
64
-
65
- def multirepo_enabled_dependencies
66
- ConfigFile.new(".").load_entries.select { |e| Utils.is_multirepo_enabled(e.repo.path) }
67
- end
68
-
69
- def validate_only_one_flag(*flags)
70
- flags.reduce(0) { |count, flag| count += 1 if flag; count } <= 1
71
- end
72
-
73
- def ensure_in_work_tree
74
- repo = Repo.new(".")
75
- raise MultiRepoException, "Not a git repository" unless repo.exists?
76
- raise MultiRepoException, "HEAD is unborn (you must perform at least one commit)" unless repo.head_born?
77
- end
78
-
79
- def ensure_multirepo_enabled
80
- raise MultiRepoException, "multirepo is not initialized in this repository." unless Utils.is_multirepo_enabled(".")
81
- end
82
-
83
- def ensure_multirepo_tracked
84
- raise MultiRepoException, "Revision is not tracked by multirepo." unless Utils.is_multirepo_tracked(".")
85
-
86
- lock_file_valid = LockFile.new(".").validate!
87
- raise MultiRepoException, "Revision is multirepo-enabled but contains a corrupted lock file!" unless lock_file_valid
88
- end
89
- end
1
+ require "claide"
2
+
3
+ require "info"
4
+ require "multirepo/multirepo-exception"
5
+ require "multirepo/config"
6
+ require "multirepo/files/config-file"
7
+ require "multirepo/files/lock-file"
8
+
9
+ module MultiRepo
10
+ class Command < CLAide::Command
11
+ self.abstract_command = true
12
+ self.command = "multi"
13
+ self.version = VERSION
14
+ self.description = DESCRIPTION
15
+
16
+ def self.report_error(exception)
17
+ if exception.instance_of?(MultiRepoException)
18
+ Console.log_error(exception.message)
19
+ exit 1
20
+ end
21
+ raise exception
22
+ end
23
+
24
+ def initialize(argv)
25
+ @argv = argv
26
+ Config.instance.verbose = argv.flag?("verbose") ? true : false
27
+ Config.instance.git_executable = argv.option("git-exe", "git")
28
+ super
29
+ end
30
+
31
+ def run
32
+ help!
33
+ end
34
+
35
+ def validate!
36
+ super
37
+ path = Config.instance.git_executable
38
+ is_git_exe = path =~ /.*(git)|(git.exe)$/
39
+ file_exists = path == "git" || File.exists?(path)
40
+ help! "Invalid git executable '#{path}'" unless is_git_exe && file_exists
41
+ end
42
+
43
+ def install_hooks(path)
44
+ actual_path = path || "."
45
+ Utils.install_hook("pre-commit", actual_path)
46
+ Utils.install_hook("post-commit", actual_path)
47
+ end
48
+
49
+ def uninstall_hooks
50
+ FileUtils.rm_f(".git/hooks/pre-commit")
51
+ FileUtils.rm_f(".git/hooks/post-commit")
52
+ end
53
+
54
+ def update_gitconfig(path)
55
+ actual_path = path || "."
56
+ resource_file = Utils.path_for_resource(".gitconfig")
57
+ target_file = File.join(actual_path, '.git/config')
58
+
59
+ template = File.read(resource_file)
60
+ first_template_line = template.lines.first
61
+
62
+ Utils.append_if_missing(target_file, Regexp.new(Regexp.quote(first_template_line)), template)
63
+ end
64
+
65
+ def multirepo_enabled_dependencies
66
+ ConfigFile.new(".").load_entries.select { |e| Utils.is_multirepo_enabled(e.repo.path) }
67
+ end
68
+
69
+ def validate_only_one_flag(*flags)
70
+ flags.reduce(0) { |count, flag| count += 1 if flag; count } <= 1
71
+ end
72
+
73
+ def ensure_in_work_tree
74
+ repo = Repo.new(".")
75
+ raise MultiRepoException, "Not a git repository" unless repo.exists?
76
+ raise MultiRepoException, "HEAD is unborn (you must perform at least one commit)" unless repo.head_born?
77
+ end
78
+
79
+ def ensure_multirepo_enabled
80
+ raise MultiRepoException, "multirepo is not initialized in this repository." unless Utils.is_multirepo_enabled(".")
81
+ end
82
+
83
+ def ensure_multirepo_tracked
84
+ raise MultiRepoException, "Revision is not tracked by multirepo." unless Utils.is_multirepo_tracked(".")
85
+
86
+ lock_file_valid = LockFile.new(".").validate!
87
+ raise MultiRepoException, "Revision is multirepo-enabled but contains a corrupted lock file!" unless lock_file_valid
88
+ end
89
+ end
90
90
  end