braid 1.1.9 → 1.1.10

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0ddcc3421c5a2dffcf7634e71118d7392d9f506ab49064f25eb2c38f7f0d67b1
4
- data.tar.gz: d3ad647f242d287ece52de41be7edb56cfdc3c469336ee84bb35c15257ca4d36
3
+ metadata.gz: f38ff51ac35694b840f6dbc049ae5bf630fc3b6cf0e6e781431c5f9190f12df1
4
+ data.tar.gz: de2a9463583afbbb4d0a380ffbef2d68defb9b505f7aa27a684e5bc53c5e4579
5
5
  SHA512:
6
- metadata.gz: f002d88fa8bb752ab878d746c8b1ead6c73b80518d37a06f261eba2b99540c6081c7991a9f404ec0ca26c39165b6e9345725e4b4f49f52ad132ca1e359465e39
7
- data.tar.gz: 4da0947c03c1846b073b331f4118f8b07e42b4138c3450b3f2ce6ba967e3a8451edf843622e3e6b6bbe4f5c70951866d7c6abbcc7e1211d10501b75fefa8e095
6
+ metadata.gz: 7cf1ec0a11f3f02788d41cb710e49263e3ea429d9e0db7ee856453a3616fc7d8350498e96401efed19f45afa90fe4ef61bdfa484568b5520c78cbd67988120d4
7
+ data.tar.gz: f7dd2378a8fcb3704db070f20a814c7c4f90956e34684ad22d68335ac3f0ed37ce268bd43ebcab92427ad017c74fa5ed4f5225bfda6cf7623c01643d2561ef23
data/lib/braid/command.rb CHANGED
@@ -1,4 +1,4 @@
1
- # typed: true
1
+ # typed: strict
2
2
  module Braid
3
3
  class Command
4
4
  extend T::Sig
@@ -9,15 +9,13 @@ module Braid
9
9
  extend Operations::VersionControl
10
10
  include Operations::VersionControl
11
11
 
12
- def self.run(command, *args)
12
+ sig {void}
13
+ def run
13
14
  verify_git_version!
14
15
  check_working_dir!
15
-
16
- klass = Commands.const_get(command.to_s)
17
- klass.new.run(*args)
18
-
16
+ run_internal
19
17
  rescue BraidError => error
20
- handle_error(error)
18
+ Command.handle_error(error)
21
19
  end
22
20
 
23
21
  sig {params(error: BraidError).returns(T.noreturn)}
@@ -36,6 +34,11 @@ module Braid
36
34
  puts "Braid: #{str}"
37
35
  end
38
36
 
37
+ sig {void}
38
+ def initialize
39
+ @config = T.let(nil, T.nilable(Config))
40
+ end
41
+
39
42
  sig {params(str: String).void}
40
43
  def msg(str)
41
44
  self.class.msg(str)
@@ -43,7 +46,7 @@ module Braid
43
46
 
44
47
  sig {returns(Config)}
45
48
  def config
46
- @config ||= Config.new({'mode' => config_mode})
49
+ @config ||= Config.new(mode: config_mode)
47
50
  end
48
51
 
49
52
  sig {returns(T::Boolean)}
@@ -58,23 +61,32 @@ module Braid
58
61
 
59
62
  private
60
63
 
64
+ # TODO (typing): We could make this method abstract if our fake Sorbet
65
+ # runtime supported abstract methods.
66
+ sig {void}
67
+ def run_internal
68
+ raise InternalError, 'Command.run_internal not overridden'
69
+ end
70
+
61
71
  sig {returns(Config::ConfigMode)}
62
72
  def config_mode
63
73
  Config::MODE_MAY_WRITE
64
74
  end
65
75
 
76
+ sig {params(mirror: Mirror).void}
66
77
  def setup_remote(mirror)
67
78
  existing_force = Braid.force
68
79
  begin
69
80
  Braid.force = true
70
- Command.run(:Setup, mirror.path)
81
+ Commands::Setup.new(mirror.path).run
71
82
  ensure
72
83
  Braid.force = existing_force
73
84
  end
74
85
  end
75
86
 
76
- def clear_remote(mirror, options)
77
- git.remote_rm(mirror.remote) unless options['keep']
87
+ sig {params(mirror: Mirror).void}
88
+ def clear_remote(mirror)
89
+ git.remote_rm(mirror.remote)
78
90
  end
79
91
 
80
92
  sig {returns(T::Boolean)}
@@ -83,12 +95,12 @@ module Braid
83
95
  end
84
96
 
85
97
  sig {void}
86
- def self.verify_git_version!
98
+ def verify_git_version!
87
99
  git.require_version!(REQUIRED_GIT_VERSION)
88
100
  end
89
101
 
90
102
  sig {void}
91
- def self.check_working_dir!
103
+ def check_working_dir!
92
104
  # If we aren't in a git repository at all, git.is_inside_worktree will
93
105
  # propagate a "fatal: Not a git repository" ShellException.
94
106
  unless git.is_inside_worktree
@@ -104,7 +116,12 @@ module Braid
104
116
  git.ensure_clean!
105
117
  end
106
118
 
107
- def with_reset_on_error
119
+ sig {
120
+ type_parameters(:R).params(
121
+ blk: T.proc.returns(T.type_parameter(:R))
122
+ ).returns(T.type_parameter(:R))
123
+ }
124
+ def with_reset_on_error(&blk)
108
125
  bail_on_local_changes!
109
126
 
110
127
  work_head = git.head
@@ -124,11 +141,16 @@ module Braid
124
141
  git.add(CONFIG_FILE)
125
142
  end
126
143
 
144
+ sig {params(mirror: Mirror, revision: T.nilable(String)).returns(String)}
127
145
  def display_revision(mirror, revision = nil)
128
- revision ||= mirror.revision
146
+ # This shouldn't be called while `mirror.revision` is nil in the middle of
147
+ # `braid add`. TODO (typing): Remove `T.must` if we restructure the code
148
+ # so `mirror.revision` is annotated as non-nil.
149
+ revision ||= T.must(mirror.revision)
129
150
  "'#{revision[0, 7]}'"
130
151
  end
131
152
 
153
+ sig {params(mirror: Mirror).returns(Operations::Git::ObjectID)}
132
154
  def determine_repository_revision(mirror)
133
155
  if mirror.tag
134
156
  if use_local_cache?
@@ -148,6 +170,7 @@ module Braid
148
170
  end
149
171
  end
150
172
 
173
+ sig {params(mirror: Mirror, revision: T.nilable(Operations::Git::ObjectExpr)).returns(Operations::Git::ObjectID)}
151
174
  def validate_new_revision(mirror, revision)
152
175
  if revision.nil?
153
176
  determine_repository_revision(mirror)
@@ -1,4 +1,4 @@
1
- # typed: true
1
+ # typed: strict
2
2
  module Braid
3
3
  module Commands
4
4
  class Add < Command
@@ -13,6 +13,7 @@ module Braid
13
13
  # the mirror to the remote HEAD revision, but that's probably not what the
14
14
  # user wants. It's much more likely that something is wrong and Braid
15
15
  # should report an error.
16
+ sig {params(url: String).returns(T.nilable(String))}
16
17
  def get_default_branch_name(url)
17
18
  head_targets = []
18
19
  # The `HEAD` parameter here doesn't appear to do an exact match (it
@@ -30,28 +31,37 @@ module Braid
30
31
  m[1]
31
32
  end
32
33
 
33
- def run(url, options = {})
34
+ sig {params(url: String, options: Mirror::Options).void}
35
+ def initialize(url, options)
36
+ @url = url
37
+ @options = options
38
+ end
39
+
40
+ private
41
+
42
+ sig {void}
43
+ def run_internal
34
44
  with_reset_on_error do
35
- if options['branch'].nil? && options['tag'].nil? && options['revision'].nil?
36
- default_branch = get_default_branch_name(url)
45
+ if @options.branch.nil? && @options.tag.nil? && @options.revision.nil?
46
+ default_branch = get_default_branch_name(@url)
37
47
  if default_branch.nil?
38
48
  raise BraidError, <<-MSG
39
49
  Failed to detect the default branch of the remote repository. Please specify
40
50
  the branch you want to use via the --branch option.
41
51
  MSG
42
52
  end
43
- options['branch'] = default_branch
53
+ @options.branch = default_branch
44
54
  end
45
55
 
46
- mirror = config.add_from_options(url, options)
56
+ mirror = config.add_from_options(@url, @options)
47
57
  add_config_file
48
58
 
49
- mirror.branch = nil if options['revision']
50
- raise BraidError, 'Can not add mirror specifying both a revision and a tag' if options['revision'] && mirror.tag
59
+ mirror.branch = nil if @options.revision
60
+ raise BraidError, 'Can not add mirror specifying both a revision and a tag' if @options.revision && mirror.tag
51
61
 
52
62
  branch_message = mirror.branch.nil? ? '' : " branch '#{mirror.branch}'"
53
63
  tag_message = mirror.tag.nil? ? '' : " tag '#{mirror.tag}'"
54
- revision_message = options['revision'] ? " at #{display_revision(mirror, options['revision'])}" : ''
64
+ revision_message = @options.revision ? " at #{display_revision(mirror, @options.revision)}" : ''
55
65
  msg "Adding mirror of '#{mirror.url}'#{branch_message}#{tag_message}#{revision_message}."
56
66
 
57
67
  # these commands are explained in the subtree merge guide
@@ -61,7 +71,7 @@ MSG
61
71
  setup_remote(mirror)
62
72
  mirror.fetch
63
73
 
64
- new_revision = validate_new_revision(mirror, options['revision'])
74
+ new_revision = validate_new_revision(mirror, @options.revision)
65
75
  target_item = mirror.upstream_item_for_revision(new_revision)
66
76
 
67
77
  git.add_item_to_index(target_item, mirror.path, true)
@@ -73,7 +83,7 @@ MSG
73
83
  git.commit("Add mirror '#{mirror.path}' at #{display_revision(mirror)}")
74
84
  msg "Added mirror at #{display_revision(mirror)}."
75
85
 
76
- clear_remote(mirror, options)
86
+ clear_remote(mirror)
77
87
  end
78
88
  end
79
89
  end
@@ -1,14 +1,27 @@
1
- # typed: true
1
+ # typed: strict
2
2
  module Braid
3
3
  module Commands
4
4
  class Diff < Command
5
- def run(path = nil, options = {})
6
- path ? diff_one(path, options) : diff_all(options)
5
+ class Options < T::Struct
6
+ prop :git_diff_args, T::Array[String]
7
+ prop :keep, T::Boolean
8
+ end
9
+
10
+ sig {params(path: T.nilable(String), options: Options).void}
11
+ def initialize(path, options)
12
+ @path = path
13
+ @options = options
7
14
  end
8
15
 
9
16
  private
10
17
 
11
- def diff_all(options = {})
18
+ sig {void}
19
+ def run_internal
20
+ @path ? diff_one(@path) : diff_all
21
+ end
22
+
23
+ sig {void}
24
+ def diff_all
12
25
  # We don't want "git diff" to invoke the pager once for each mirror.
13
26
  # TODO: Invoke the default pager once for the entire output.
14
27
  Operations::with_modified_environment({ 'GIT_PAGER' => ''}) do
@@ -16,31 +29,35 @@ module Braid
16
29
  separator
17
30
  msg "Diffing #{path}\n"
18
31
  separator
19
- show_diff(path, options)
32
+ show_diff(path)
20
33
  end
21
34
  end
22
35
  end
23
36
 
24
- def diff_one(path, options = {})
25
- show_diff(path, options)
37
+ sig {params(path: String).void}
38
+ def diff_one(path)
39
+ show_diff(path)
26
40
  end
27
41
 
42
+ sig {void}
28
43
  def separator
29
44
  puts "=======================================================\n"
30
45
  end
31
46
 
32
- def show_diff(path, options = {})
47
+ sig {params(path: String).void}
48
+ def show_diff(path)
33
49
  mirror = config.get!(path)
34
50
  setup_remote(mirror)
35
51
  mirror.fetch_base_revision_if_missing
36
52
 
37
53
  # XXX: Warn if the user specifies file paths that are outside the
38
54
  # mirror? Currently, they just won't match anything.
39
- git.diff_to_stdout(mirror.diff_args(options['git_diff_args']))
55
+ git.diff_to_stdout(mirror.diff_args(@options.git_diff_args))
40
56
 
41
- clear_remote(mirror, options)
57
+ clear_remote(mirror) unless @options.keep
42
58
  end
43
59
 
60
+ sig {returns(Config::ConfigMode)}
44
61
  def config_mode
45
62
  Config::MODE_READ_ONLY
46
63
  end
@@ -1,9 +1,10 @@
1
- # typed: true
1
+ # typed: strict
2
2
  require 'fileutils'
3
3
  require 'tmpdir'
4
4
 
5
5
  module Braid
6
6
  class NoPushToTag < BraidError
7
+ sig {returns(String)}
7
8
  def message
8
9
  "mirror is based off a tag. Can not push to a tag: #{super}"
9
10
  end
@@ -11,12 +12,26 @@ module Braid
11
12
 
12
13
  module Commands
13
14
  class Push < Command
14
- def run(path, options = {})
15
- mirror = config.get!(path)
15
+ class Options < T::Struct
16
+ prop :keep, T::Boolean
17
+ prop :branch, T.nilable(String)
18
+ end
19
+
20
+ sig {params(path: String, options: Options).void}
21
+ def initialize(path, options)
22
+ @path = path
23
+ @options = options
24
+ end
25
+
26
+ private
16
27
 
17
- branch = options['branch'] || mirror.branch
28
+ sig {void}
29
+ def run_internal
30
+ mirror = config.get!(@path)
18
31
 
19
- raise NoPushToTag, path unless branch
32
+ branch = @options.branch || mirror.branch
33
+
34
+ raise NoPushToTag, @path unless branch
20
35
 
21
36
  setup_remote(mirror)
22
37
  mirror.fetch
@@ -24,14 +39,14 @@ module Braid
24
39
  base_revision = determine_repository_revision(mirror)
25
40
  unless mirror.merged?(base_revision)
26
41
  msg 'Mirror is not up to date. Stopping.'
27
- clear_remote(mirror, options)
42
+ clear_remote(mirror) unless @options.keep
28
43
  return
29
44
  end
30
45
 
31
46
  diff = mirror.diff
32
47
  if diff.empty?
33
48
  msg 'No local changes found. Stopping.'
34
- clear_remote(mirror, options)
49
+ clear_remote(mirror) unless @options.keep
35
50
  return
36
51
  end
37
52
  local_mirror_item = git.get_tree_item('HEAD', mirror.path)
@@ -115,14 +130,13 @@ module Braid
115
130
  end
116
131
  FileUtils.rm_r(clone_dir)
117
132
 
118
- clear_remote(mirror, options)
133
+ clear_remote(mirror) unless @options.keep
119
134
  end
120
- end
121
135
 
122
- private
123
-
124
- def config_mode
125
- Config::MODE_READ_ONLY # Surprisingly enough.
136
+ sig {returns(Config::ConfigMode)}
137
+ def config_mode
138
+ Config::MODE_READ_ONLY # Surprisingly enough.
139
+ end
126
140
  end
127
141
  end
128
142
  end
@@ -1,9 +1,22 @@
1
- # typed: true
1
+ # typed: strict
2
2
  module Braid
3
3
  module Commands
4
4
  class Remove < Command
5
- def run(path, options = {})
6
- mirror = config.get!(path)
5
+ class Options < T::Struct
6
+ prop :keep, T::Boolean
7
+ end
8
+
9
+ sig {params(path: String, options: Options).void}
10
+ def initialize(path, options)
11
+ @path = path
12
+ @options = options
13
+ end
14
+
15
+ private
16
+
17
+ sig {void}
18
+ def run_internal
19
+ mirror = config.get!(@path)
7
20
 
8
21
  with_reset_on_error do
9
22
  msg "Removing mirror from '#{mirror.path}'."
@@ -13,7 +26,7 @@ module Braid
13
26
  config.remove(mirror)
14
27
  add_config_file
15
28
 
16
- if options[:keep]
29
+ if @options.keep
17
30
  msg "Not removing remote '#{mirror.remote}'" if verbose?
18
31
  elsif git.remote_url(mirror.remote)
19
32
  msg "Removed remote '#{mirror.path}'" if verbose?
@@ -1,13 +1,20 @@
1
- # typed: true
1
+ # typed: strict
2
2
  module Braid
3
3
  module Commands
4
4
  class Setup < Command
5
- def run(path = nil)
6
- path ? setup_one(path) : setup_all
5
+ sig {params(path: T.nilable(String)).void}
6
+ def initialize(path = nil)
7
+ @path = path
7
8
  end
8
9
 
9
10
  private
10
11
 
12
+ sig {void}
13
+ def run_internal
14
+ @path ? setup_one(@path) : setup_all
15
+ end
16
+
17
+ sig {void}
11
18
  def setup_all
12
19
  msg 'Setting up all mirrors.'
13
20
  config.mirrors.each do |path|
@@ -15,6 +22,7 @@ module Braid
15
22
  end
16
23
  end
17
24
 
25
+ sig {params(path: String).void}
18
26
  def setup_one(path)
19
27
  mirror = config.get!(path)
20
28
 
@@ -33,6 +41,7 @@ module Braid
33
41
  git.remote_add(mirror.remote, url)
34
42
  end
35
43
 
44
+ sig {returns(Config::ConfigMode)}
36
45
  def config_mode
37
46
  Config::MODE_READ_ONLY
38
47
  end
@@ -1,23 +1,31 @@
1
- # typed: true
1
+ # typed: strict
2
2
  module Braid
3
3
  module Commands
4
4
  class Status < Command
5
- def run(path = nil, options = {})
6
- path ? status_one(path, options) : status_all(options)
5
+ sig {params(path: T.nilable(String)).void}
6
+ def initialize(path)
7
+ @path = path
7
8
  end
8
9
 
9
10
  private
10
11
 
11
- def status_all(options = {})
12
+ sig {void}
13
+ def run_internal
14
+ @path ? status_one(@path) : status_all
15
+ end
16
+
17
+ sig {void}
18
+ def status_all
12
19
  print "\n"
13
20
  msg "Listing all mirrors.\n=======================================================\n"
14
21
  config.mirrors.each do |path|
15
- status_one(path, options)
22
+ status_one(path)
16
23
  end
17
24
  print "\n"
18
25
  end
19
26
 
20
- def status_one(path, options = {})
27
+ sig {params(path: String).void}
28
+ def status_one(path)
21
29
  mirror = config.get!(path)
22
30
  setup_remote(mirror)
23
31
  mirror.fetch
@@ -31,7 +39,7 @@ module Braid
31
39
  print " [BRANCH=#{mirror.branch}]"
32
40
  end
33
41
  msg "Fetching new commits for '#{mirror.path}'." if verbose?
34
- new_revision = validate_new_revision(mirror, options['revision'])
42
+ new_revision = validate_new_revision(mirror, nil)
35
43
  print ' (Remote Modified)' if new_revision.to_s != mirror.base_revision.to_s
36
44
  local_file_count = git.read_ls_files(mirror.path).split.size
37
45
  if 0 == local_file_count
@@ -40,9 +48,10 @@ module Braid
40
48
  print ' (Locally Modified)'
41
49
  end
42
50
  print "\n"
43
- clear_remote(mirror, options)
51
+ clear_remote(mirror)
44
52
  end
45
53
 
54
+ sig {returns(Config::ConfigMode)}
46
55
  def config_mode
47
56
  Config::MODE_READ_ONLY
48
57
  end
@@ -1,26 +1,47 @@
1
- # typed: true
1
+ # typed: strict
2
2
  module Braid
3
3
  module Commands
4
4
  class Update < Command
5
- def run(path, options = {})
6
- path ? update_one(path, options) : update_all(options)
5
+ class Options < T::Struct
6
+ prop :branch, T.nilable(String)
7
+ prop :tag, T.nilable(String)
8
+ prop :revision, T.nilable(Operations::Git::ObjectExpr)
9
+ prop :head, T::Boolean
10
+ prop :keep, T::Boolean
7
11
  end
8
12
 
9
- protected
13
+ sig {params(path: T.nilable(String), options: Options).void}
14
+ def initialize(path, options)
15
+ @path = path
16
+ @options = options
17
+ end
18
+
19
+ private
20
+
21
+ sig {void}
22
+ def run_internal
23
+ @path ? update_one(@path) : update_all
24
+ end
25
+
26
+ sig {void}
27
+ def update_all
28
+ # Maintain previous behavior of ignoring these options when updating all
29
+ # mirrors. TODO: Should we make it an error if the options were passed?
30
+ @options.revision = nil
31
+ @options.head = false
10
32
 
11
- def update_all(options = {})
12
- options.reject! { |k, v| %w(revision head).include?(k) }
13
33
  msg 'Updating all mirrors.'
14
34
  config.mirrors.each do |path|
15
35
  bail_on_local_changes!
16
- update_one(path, options)
36
+ update_one(path)
17
37
  end
18
38
  end
19
39
 
20
- def update_one(path, options = {})
40
+ sig {params(path: String).void}
41
+ def update_one(path)
21
42
  bail_on_local_changes!
22
43
 
23
- raise BraidError, "Do not specify --head option anymore. Please use '--branch MyBranch' to track a branch or '--tag MyTag' to track a branch" if options['head']
44
+ raise BraidError, "Do not specify --head option anymore. Please use '--branch MyBranch' to track a branch or '--tag MyTag' to track a branch" if @options.head
24
45
 
25
46
  mirror = config.get!(path)
26
47
 
@@ -31,16 +52,16 @@ module Braid
31
52
  original_branch = mirror.branch
32
53
  original_tag = mirror.tag
33
54
 
34
- raise BraidError, 'Can not update mirror specifying both a revision and a tag' if options['revision'] && options['tag']
35
- raise BraidError, 'Can not update mirror specifying both a branch and a tag' if options['branch'] && options['tag']
55
+ raise BraidError, 'Can not update mirror specifying both a revision and a tag' if @options.revision && @options.tag
56
+ raise BraidError, 'Can not update mirror specifying both a branch and a tag' if @options.branch && @options.tag
36
57
 
37
- if options['tag']
38
- mirror.tag = options['tag']
58
+ if @options.tag
59
+ mirror.tag = @options.tag
39
60
  mirror.branch = nil
40
- elsif options['branch']
61
+ elsif @options.branch
41
62
  mirror.tag = nil
42
- mirror.branch = options['branch']
43
- elsif options['revision']
63
+ mirror.branch = @options.branch
64
+ elsif @options.revision
44
65
  mirror.tag = nil
45
66
  mirror.branch = nil
46
67
  end
@@ -51,11 +72,14 @@ module Braid
51
72
  msg "Fetching new commits for '#{mirror.path}'." if verbose?
52
73
  mirror.fetch
53
74
 
54
- new_revision = options['revision']
75
+ new_revision = @options.revision
55
76
  begin
56
77
  new_revision = validate_new_revision(mirror, new_revision)
57
78
  rescue InvalidRevision
58
79
  # Ignored as it means the revision matches expected
80
+ # This can only happen if new_revision was non-nil.
81
+ # TODO (typing): Untangle the logic and remote this `T.must`.
82
+ new_revision = T.must(new_revision)
59
83
  end
60
84
 
61
85
  from_desc =
@@ -68,19 +92,19 @@ module Braid
68
92
  msg "Switching mirror '#{mirror.path}' to branch '#{mirror.branch}' from #{from_desc}."
69
93
  elsif mirror.tag && original_tag != mirror.tag
70
94
  msg "Switching mirror '#{mirror.path}' to tag '#{mirror.tag}' from #{from_desc}."
71
- elsif options['revision'] && original_revision != options['revision']
72
- msg "Switching mirror '#{mirror.path}' to revision '#{options['revision']}' from #{from_desc}."
95
+ elsif @options.revision && original_revision != @options.revision
96
+ msg "Switching mirror '#{mirror.path}' to revision '#{@options.revision}' from #{from_desc}."
73
97
  else
74
98
  switching = false
75
99
  end
76
100
 
77
101
  if !switching &&
78
102
  (
79
- (options['revision'] && was_locked && new_revision == mirror.base_revision) ||
80
- (options['revision'].nil? && !was_locked && mirror.merged?(git.rev_parse(new_revision)))
103
+ (@options.revision && was_locked && new_revision == mirror.base_revision) ||
104
+ (@options.revision.nil? && !was_locked && mirror.merged?(git.rev_parse(new_revision)))
81
105
  )
82
106
  msg "Mirror '#{mirror.path}' is already up to date."
83
- clear_remote(mirror, options)
107
+ clear_remote(mirror) unless @options.keep
84
108
  return
85
109
  end
86
110
 
@@ -120,7 +144,7 @@ module Braid
120
144
 
121
145
  git.commit(commit_message)
122
146
  msg "Updated mirror to #{display_revision(mirror)}."
123
- clear_remote(mirror, options)
147
+ clear_remote(mirror) unless @options.keep
124
148
  end
125
149
  end
126
150
  end