jit 0.0.0 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/LICENSE.txt +674 -0
- data/bin/jit +21 -0
- data/lib/color.rb +32 -0
- data/lib/command.rb +62 -0
- data/lib/command/add.rb +65 -0
- data/lib/command/base.rb +92 -0
- data/lib/command/branch.rb +199 -0
- data/lib/command/checkout.rb +104 -0
- data/lib/command/cherry_pick.rb +51 -0
- data/lib/command/commit.rb +86 -0
- data/lib/command/config.rb +126 -0
- data/lib/command/diff.rb +114 -0
- data/lib/command/fetch.rb +116 -0
- data/lib/command/init.rb +41 -0
- data/lib/command/log.rb +188 -0
- data/lib/command/merge.rb +148 -0
- data/lib/command/push.rb +172 -0
- data/lib/command/receive_pack.rb +92 -0
- data/lib/command/remote.rb +55 -0
- data/lib/command/reset.rb +64 -0
- data/lib/command/rev_list.rb +33 -0
- data/lib/command/revert.rb +69 -0
- data/lib/command/rm.rb +105 -0
- data/lib/command/shared/fast_forward.rb +19 -0
- data/lib/command/shared/print_diff.rb +116 -0
- data/lib/command/shared/receive_objects.rb +37 -0
- data/lib/command/shared/remote_agent.rb +44 -0
- data/lib/command/shared/remote_client.rb +82 -0
- data/lib/command/shared/send_objects.rb +24 -0
- data/lib/command/shared/sequencing.rb +146 -0
- data/lib/command/shared/write_commit.rb +167 -0
- data/lib/command/status.rb +210 -0
- data/lib/command/upload_pack.rb +54 -0
- data/lib/config.rb +240 -0
- data/lib/config/stack.rb +42 -0
- data/lib/database.rb +112 -0
- data/lib/database/author.rb +27 -0
- data/lib/database/backends.rb +57 -0
- data/lib/database/blob.rb +24 -0
- data/lib/database/commit.rb +70 -0
- data/lib/database/entry.rb +7 -0
- data/lib/database/loose.rb +70 -0
- data/lib/database/packed.rb +75 -0
- data/lib/database/tree.rb +77 -0
- data/lib/database/tree_diff.rb +88 -0
- data/lib/diff.rb +46 -0
- data/lib/diff/combined.rb +72 -0
- data/lib/diff/hunk.rb +64 -0
- data/lib/diff/myers.rb +90 -0
- data/lib/editor.rb +59 -0
- data/lib/index.rb +212 -0
- data/lib/index/checksum.rb +44 -0
- data/lib/index/entry.rb +91 -0
- data/lib/lockfile.rb +55 -0
- data/lib/merge/bases.rb +38 -0
- data/lib/merge/common_ancestors.rb +77 -0
- data/lib/merge/diff3.rb +156 -0
- data/lib/merge/inputs.rb +42 -0
- data/lib/merge/resolve.rb +178 -0
- data/lib/pack.rb +45 -0
- data/lib/pack/compressor.rb +83 -0
- data/lib/pack/delta.rb +58 -0
- data/lib/pack/entry.rb +54 -0
- data/lib/pack/expander.rb +54 -0
- data/lib/pack/index.rb +100 -0
- data/lib/pack/indexer.rb +200 -0
- data/lib/pack/numbers.rb +79 -0
- data/lib/pack/reader.rb +98 -0
- data/lib/pack/stream.rb +80 -0
- data/lib/pack/unpacker.rb +62 -0
- data/lib/pack/window.rb +47 -0
- data/lib/pack/writer.rb +92 -0
- data/lib/pack/xdelta.rb +118 -0
- data/lib/pager.rb +24 -0
- data/lib/progress.rb +78 -0
- data/lib/refs.rb +260 -0
- data/lib/remotes.rb +82 -0
- data/lib/remotes/protocol.rb +82 -0
- data/lib/remotes/refspec.rb +70 -0
- data/lib/remotes/remote.rb +57 -0
- data/lib/repository.rb +64 -0
- data/lib/repository/divergence.rb +21 -0
- data/lib/repository/hard_reset.rb +35 -0
- data/lib/repository/inspector.rb +49 -0
- data/lib/repository/migration.rb +168 -0
- data/lib/repository/pending_commit.rb +60 -0
- data/lib/repository/sequencer.rb +118 -0
- data/lib/repository/status.rb +98 -0
- data/lib/rev_list.rb +244 -0
- data/lib/revision.rb +155 -0
- data/lib/sorted_hash.rb +17 -0
- data/lib/temp_file.rb +34 -0
- data/lib/workspace.rb +107 -0
- metadata +103 -9
@@ -0,0 +1,116 @@
|
|
1
|
+
require "set"
|
2
|
+
|
3
|
+
require_relative "./base"
|
4
|
+
require_relative "./shared/fast_forward"
|
5
|
+
require_relative "./shared/receive_objects"
|
6
|
+
require_relative "./shared/remote_client"
|
7
|
+
require_relative "../remotes"
|
8
|
+
require_relative "../rev_list"
|
9
|
+
|
10
|
+
module Command
|
11
|
+
class Fetch < Base
|
12
|
+
|
13
|
+
include FastForward
|
14
|
+
include ReceiveObjects
|
15
|
+
include RemoteClient
|
16
|
+
|
17
|
+
CAPABILITIES = ["ofs-delta"]
|
18
|
+
UPLOAD_PACK = "git-upload-pack"
|
19
|
+
|
20
|
+
def define_options
|
21
|
+
@parser.on("-f", "--force") { @options[:force] = true }
|
22
|
+
|
23
|
+
@parser.on "--upload-pack=<upload-pack>" do |uploader|
|
24
|
+
@options[:uploader] = uploader
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def run
|
29
|
+
configure
|
30
|
+
start_agent("fetch", @uploader, @fetch_url, CAPABILITIES)
|
31
|
+
|
32
|
+
recv_references
|
33
|
+
send_want_list
|
34
|
+
send_have_list
|
35
|
+
recv_objects
|
36
|
+
update_remote_refs
|
37
|
+
|
38
|
+
exit (@errors.empty? ? 0 : 1)
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
def configure
|
44
|
+
current_branch = repo.refs.current_ref.short_name
|
45
|
+
branch_remote = repo.config.get(["branch", current_branch, "remote"])
|
46
|
+
|
47
|
+
name = @args.fetch(0, branch_remote || Remotes::DEFAULT_REMOTE)
|
48
|
+
remote = repo.remotes.get(name)
|
49
|
+
|
50
|
+
@fetch_url = remote&.fetch_url || @args[0]
|
51
|
+
@uploader = @options[:uploader] || remote&.uploader || UPLOAD_PACK
|
52
|
+
@fetch_specs = (@args.size > 1) ? @args.drop(1) : remote&.fetch_specs
|
53
|
+
end
|
54
|
+
|
55
|
+
def send_want_list
|
56
|
+
@targets = Remotes::Refspec.expand(@fetch_specs, @remote_refs.keys)
|
57
|
+
wanted = Set.new
|
58
|
+
|
59
|
+
@local_refs = {}
|
60
|
+
|
61
|
+
@targets.each do |target, (source, _)|
|
62
|
+
local_oid = repo.refs.read_ref(target)
|
63
|
+
remote_oid = @remote_refs[source]
|
64
|
+
|
65
|
+
next if local_oid == remote_oid
|
66
|
+
|
67
|
+
@local_refs[target] = local_oid
|
68
|
+
wanted.add(remote_oid)
|
69
|
+
end
|
70
|
+
|
71
|
+
wanted.each { |oid| @conn.send_packet("want #{ oid }") }
|
72
|
+
@conn.send_packet(nil)
|
73
|
+
|
74
|
+
exit 0 if wanted.empty?
|
75
|
+
end
|
76
|
+
|
77
|
+
def send_have_list
|
78
|
+
options = { :all => true, :missing => true }
|
79
|
+
rev_list = ::RevList.new(repo, [], options)
|
80
|
+
|
81
|
+
rev_list.each { |commit| @conn.send_packet("have #{ commit.oid }") }
|
82
|
+
@conn.send_packet("done")
|
83
|
+
|
84
|
+
@conn.recv_until(Pack::SIGNATURE) {}
|
85
|
+
end
|
86
|
+
|
87
|
+
def recv_objects
|
88
|
+
unpack_limit = repo.config.get(["fetch", "unpackLimit"])
|
89
|
+
recv_packed_objects(unpack_limit, Pack::SIGNATURE)
|
90
|
+
end
|
91
|
+
|
92
|
+
def update_remote_refs
|
93
|
+
@stderr.puts "From #{ @fetch_url }"
|
94
|
+
|
95
|
+
@errors = {}
|
96
|
+
@local_refs.each { |target, oid| attempt_ref_update(target, oid) }
|
97
|
+
end
|
98
|
+
|
99
|
+
def attempt_ref_update(target, old_oid)
|
100
|
+
source, forced = @targets[target]
|
101
|
+
|
102
|
+
new_oid = @remote_refs[source]
|
103
|
+
ref_names = [source, target]
|
104
|
+
ff_error = fast_forward_error(old_oid, new_oid)
|
105
|
+
|
106
|
+
if @options[:force] or forced or ff_error == nil
|
107
|
+
repo.refs.update_ref(target, new_oid)
|
108
|
+
else
|
109
|
+
error = @errors[target] = ff_error
|
110
|
+
end
|
111
|
+
|
112
|
+
report_ref_update(ref_names, error, old_oid, new_oid, ff_error == nil)
|
113
|
+
end
|
114
|
+
|
115
|
+
end
|
116
|
+
end
|
data/lib/command/init.rb
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
require "fileutils"
|
2
|
+
|
3
|
+
require_relative "./base"
|
4
|
+
require_relative "../config"
|
5
|
+
require_relative "../refs"
|
6
|
+
|
7
|
+
module Command
|
8
|
+
class Init < Base
|
9
|
+
|
10
|
+
DEFAULT_BRANCH = "master"
|
11
|
+
|
12
|
+
def run
|
13
|
+
path = @args.fetch(0, @dir)
|
14
|
+
|
15
|
+
root_path = expanded_pathname(path)
|
16
|
+
git_path = root_path.join(".git")
|
17
|
+
|
18
|
+
["objects", "refs/heads"].each do |dir|
|
19
|
+
begin
|
20
|
+
FileUtils.mkdir_p(git_path.join(dir))
|
21
|
+
rescue Errno::EACCES => error
|
22
|
+
@stderr.puts "fatal: #{ error.message }"
|
23
|
+
exit 1
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
config = ::Config.new(git_path.join("config"))
|
28
|
+
config.open_for_update
|
29
|
+
config.set(["core", "bare"], false)
|
30
|
+
config.save
|
31
|
+
|
32
|
+
refs = Refs.new(git_path)
|
33
|
+
path = File.join("refs", "heads", DEFAULT_BRANCH)
|
34
|
+
refs.update_head("ref: #{ path }")
|
35
|
+
|
36
|
+
puts "Initialized empty Jit repository in #{ git_path }"
|
37
|
+
exit 0
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
end
|
data/lib/command/log.rb
ADDED
@@ -0,0 +1,188 @@
|
|
1
|
+
require_relative "./base"
|
2
|
+
require_relative "./shared/print_diff"
|
3
|
+
require_relative "../rev_list"
|
4
|
+
|
5
|
+
module Command
|
6
|
+
class Log < Base
|
7
|
+
|
8
|
+
include PrintDiff
|
9
|
+
|
10
|
+
def define_options
|
11
|
+
@rev_list_opts = {}
|
12
|
+
@parser.on("--all") { @rev_list_opts[:all] = true }
|
13
|
+
@parser.on("--branches") { @rev_list_opts[:branches] = true }
|
14
|
+
@parser.on("--remotes") { @rev_list_opts[:remotes] = true }
|
15
|
+
|
16
|
+
@options[:decorate] = "auto"
|
17
|
+
@options[:abbrev] = :auto
|
18
|
+
@options[:format] = "medium"
|
19
|
+
@options[:patch] = false
|
20
|
+
|
21
|
+
define_print_diff_options
|
22
|
+
|
23
|
+
@parser.on "--decorate[=<format>]" do |format|
|
24
|
+
@options[:decorate] = format || "short"
|
25
|
+
end
|
26
|
+
|
27
|
+
@parser.on "--no-decorate" do
|
28
|
+
@options[:decorate] = "no"
|
29
|
+
end
|
30
|
+
|
31
|
+
@parser.on "--[no-]abbrev-commit" do |value|
|
32
|
+
@options[:abbrev] = value
|
33
|
+
end
|
34
|
+
|
35
|
+
@parser.on "--pretty=<format>", "--format=<format>" do |format|
|
36
|
+
@options[:format] = format
|
37
|
+
end
|
38
|
+
|
39
|
+
@parser.on "--oneline" do
|
40
|
+
@options[:abbrev] = true if @options[:abbrev] == :auto
|
41
|
+
@options[:format] = "oneline"
|
42
|
+
end
|
43
|
+
|
44
|
+
@parser.on "--cc" do
|
45
|
+
@options[:combined] = @options[:patch] = true
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def run
|
50
|
+
setup_pager
|
51
|
+
|
52
|
+
@reverse_refs = repo.refs.reverse_refs
|
53
|
+
@current_ref = repo.refs.current_ref
|
54
|
+
|
55
|
+
@rev_list = ::RevList.new(repo, @args, @rev_list_opts)
|
56
|
+
@rev_list.each { |commit| show_commit(commit) }
|
57
|
+
|
58
|
+
exit 0
|
59
|
+
end
|
60
|
+
|
61
|
+
private
|
62
|
+
|
63
|
+
def blank_line
|
64
|
+
return if @options[:format] == "oneline"
|
65
|
+
puts "" if defined? @blank_line
|
66
|
+
@blank_line = true
|
67
|
+
end
|
68
|
+
|
69
|
+
def show_commit(commit)
|
70
|
+
case @options[:format]
|
71
|
+
when "medium" then show_commit_medium(commit)
|
72
|
+
when "oneline" then show_commit_oneline(commit)
|
73
|
+
end
|
74
|
+
|
75
|
+
show_patch(commit)
|
76
|
+
end
|
77
|
+
|
78
|
+
def show_commit_medium(commit)
|
79
|
+
author = commit.author
|
80
|
+
|
81
|
+
blank_line
|
82
|
+
puts fmt(:yellow, "commit #{ abbrev(commit) }") + decorate(commit)
|
83
|
+
|
84
|
+
if commit.merge?
|
85
|
+
oids = commit.parents.map { |oid| repo.database.short_oid(oid) }
|
86
|
+
puts "Merge: #{ oids.join(" ") }"
|
87
|
+
end
|
88
|
+
|
89
|
+
puts "Author: #{ author.name } <#{ author.email }>"
|
90
|
+
puts "Date: #{ author.readable_time }"
|
91
|
+
blank_line
|
92
|
+
commit.message.each_line { |line| puts " #{ line }" }
|
93
|
+
end
|
94
|
+
|
95
|
+
def show_commit_oneline(commit)
|
96
|
+
id = fmt(:yellow, abbrev(commit)) + decorate(commit)
|
97
|
+
puts "#{ id } #{ commit.title_line }"
|
98
|
+
end
|
99
|
+
|
100
|
+
def abbrev(commit)
|
101
|
+
if @options[:abbrev] == true
|
102
|
+
repo.database.short_oid(commit.oid)
|
103
|
+
else
|
104
|
+
commit.oid
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
def decorate(commit)
|
109
|
+
case @options[:decorate]
|
110
|
+
when "auto" then return "" unless @isatty
|
111
|
+
when "no" then return ""
|
112
|
+
end
|
113
|
+
|
114
|
+
refs = @reverse_refs[commit.oid]
|
115
|
+
return "" if refs.empty?
|
116
|
+
|
117
|
+
head, refs = refs.partition { |ref| ref.head? and not @current_ref.head? }
|
118
|
+
names = refs.map { |ref| decoration_name(head.first, ref) }
|
119
|
+
|
120
|
+
fmt(:yellow, " (") + names.join(fmt(:yellow, ", ")) + fmt(:yellow, ")")
|
121
|
+
end
|
122
|
+
|
123
|
+
def decoration_name(head, ref)
|
124
|
+
case @options[:decorate]
|
125
|
+
when "short", "auto" then name = ref.short_name
|
126
|
+
when "full" then name = ref.path
|
127
|
+
end
|
128
|
+
|
129
|
+
name = fmt(ref_color(ref), name)
|
130
|
+
|
131
|
+
if head and ref == @current_ref
|
132
|
+
name = fmt(ref_color(head), "#{ head.path } -> #{ name }")
|
133
|
+
end
|
134
|
+
|
135
|
+
name
|
136
|
+
end
|
137
|
+
|
138
|
+
def ref_color(ref)
|
139
|
+
return [:bold, :cyan] if ref.head?
|
140
|
+
return [:bold, :green] if ref.branch?
|
141
|
+
return [:bold, :red] if ref.remote?
|
142
|
+
end
|
143
|
+
|
144
|
+
def show_patch(commit)
|
145
|
+
return unless @options[:patch]
|
146
|
+
return show_merge_patch(commit) if commit.merge?
|
147
|
+
|
148
|
+
diff = @rev_list.tree_diff(commit.parent, commit.oid)
|
149
|
+
paths = diff.keys.sort_by(&:to_s)
|
150
|
+
|
151
|
+
blank_line
|
152
|
+
|
153
|
+
paths.each do |path|
|
154
|
+
old_item, new_item = diff[path]
|
155
|
+
print_diff(from_diff_item(path, old_item), from_diff_item(path, new_item))
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
159
|
+
def show_merge_patch(commit)
|
160
|
+
return unless @options[:combined]
|
161
|
+
|
162
|
+
diffs = commit.parents.map { |oid| @rev_list.tree_diff(oid, commit.oid) }
|
163
|
+
|
164
|
+
paths = diffs.first.keys.select do |path|
|
165
|
+
diffs.drop(1).all? { |diff| diff.has_key?(path) }
|
166
|
+
end
|
167
|
+
|
168
|
+
blank_line
|
169
|
+
|
170
|
+
paths.each do |path|
|
171
|
+
parents = diffs.map { |diff| from_diff_item(path, diff[path][0]) }
|
172
|
+
child = from_diff_item(path, diffs.first[path][1])
|
173
|
+
|
174
|
+
print_combined_diff(parents, child)
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
def from_diff_item(path, item)
|
179
|
+
if item
|
180
|
+
blob = repo.database.load(item.oid)
|
181
|
+
Target.new(path, item.oid, item.mode.to_s(8), blob.data)
|
182
|
+
else
|
183
|
+
Target.new(path, NULL_OID, nil, "")
|
184
|
+
end
|
185
|
+
end
|
186
|
+
|
187
|
+
end
|
188
|
+
end
|
@@ -0,0 +1,148 @@
|
|
1
|
+
require_relative "./base"
|
2
|
+
require_relative "./shared/write_commit"
|
3
|
+
require_relative "../merge/inputs"
|
4
|
+
require_relative "../merge/resolve"
|
5
|
+
require_relative "../revision"
|
6
|
+
|
7
|
+
module Command
|
8
|
+
class Merge < Base
|
9
|
+
|
10
|
+
include WriteCommit
|
11
|
+
|
12
|
+
COMMIT_NOTES = <<~MSG
|
13
|
+
Please enter a commit message to explain why this merge is necessary,
|
14
|
+
especially if it merges an updated upstream into a topic branch.
|
15
|
+
|
16
|
+
Lines starting with '#' will be ignored, and an empty message aborts
|
17
|
+
the commit.
|
18
|
+
MSG
|
19
|
+
|
20
|
+
def define_options
|
21
|
+
define_write_commit_options
|
22
|
+
|
23
|
+
@options[:mode] = :run
|
24
|
+
|
25
|
+
@parser.on("--abort") { @options[:mode] = :abort }
|
26
|
+
@parser.on("--continue") { @options[:mode] = :continue }
|
27
|
+
end
|
28
|
+
|
29
|
+
def run
|
30
|
+
handle_abort if @options[:mode] == :abort
|
31
|
+
handle_continue if @options[:mode] == :continue
|
32
|
+
handle_in_progress_merge if pending_commit.in_progress?
|
33
|
+
|
34
|
+
@inputs = ::Merge::Inputs.new(repo, Revision::HEAD, @args[0])
|
35
|
+
repo.refs.update_ref(Refs::ORIG_HEAD, @inputs.left_oid)
|
36
|
+
|
37
|
+
handle_merged_ancestor if @inputs.already_merged?
|
38
|
+
handle_fast_forward if @inputs.fast_forward?
|
39
|
+
|
40
|
+
pending_commit.start(@inputs.right_oid)
|
41
|
+
resolve_merge
|
42
|
+
commit_merge
|
43
|
+
|
44
|
+
exit 0
|
45
|
+
end
|
46
|
+
|
47
|
+
private
|
48
|
+
|
49
|
+
def resolve_merge
|
50
|
+
repo.index.load_for_update
|
51
|
+
|
52
|
+
merge = ::Merge::Resolve.new(repo, @inputs)
|
53
|
+
merge.on_progress { |info| puts info }
|
54
|
+
merge.execute
|
55
|
+
|
56
|
+
repo.index.write_updates
|
57
|
+
fail_on_conflict if repo.index.conflict?
|
58
|
+
end
|
59
|
+
|
60
|
+
def fail_on_conflict
|
61
|
+
edit_file(pending_commit.message_path) do |editor|
|
62
|
+
editor.puts(read_message || default_commit_message)
|
63
|
+
editor.puts("")
|
64
|
+
editor.note("Conflicts:")
|
65
|
+
repo.index.conflict_paths.each { |name| editor.note("\t#{ name }") }
|
66
|
+
editor.close
|
67
|
+
end
|
68
|
+
|
69
|
+
puts "Automatic merge failed; fix conflicts and then commit the result."
|
70
|
+
exit 1
|
71
|
+
end
|
72
|
+
|
73
|
+
def commit_merge
|
74
|
+
parents = [@inputs.left_oid, @inputs.right_oid]
|
75
|
+
message = compose_message
|
76
|
+
|
77
|
+
write_commit(parents, message)
|
78
|
+
|
79
|
+
pending_commit.clear
|
80
|
+
end
|
81
|
+
|
82
|
+
def compose_message
|
83
|
+
edit_file(pending_commit.message_path) do |editor|
|
84
|
+
editor.puts(read_message || default_commit_message)
|
85
|
+
editor.puts("")
|
86
|
+
editor.note(COMMIT_NOTES)
|
87
|
+
|
88
|
+
editor.close unless @options[:edit]
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
def default_commit_message
|
93
|
+
"Merge commit '#{ @inputs.right_name }'"
|
94
|
+
end
|
95
|
+
|
96
|
+
def handle_merged_ancestor
|
97
|
+
puts "Already up to date."
|
98
|
+
exit 0
|
99
|
+
end
|
100
|
+
|
101
|
+
def handle_fast_forward
|
102
|
+
a = repo.database.short_oid(@inputs.left_oid)
|
103
|
+
b = repo.database.short_oid(@inputs.right_oid)
|
104
|
+
|
105
|
+
puts "Updating #{ a }..#{ b }"
|
106
|
+
puts "Fast-forward"
|
107
|
+
|
108
|
+
repo.index.load_for_update
|
109
|
+
|
110
|
+
tree_diff = repo.database.tree_diff(@inputs.left_oid, @inputs.right_oid)
|
111
|
+
repo.migration(tree_diff).apply_changes
|
112
|
+
|
113
|
+
repo.index.write_updates
|
114
|
+
repo.refs.update_head(@inputs.right_oid)
|
115
|
+
|
116
|
+
exit 0
|
117
|
+
end
|
118
|
+
|
119
|
+
def handle_abort
|
120
|
+
repo.pending_commit.clear
|
121
|
+
|
122
|
+
repo.index.load_for_update
|
123
|
+
repo.hard_reset(repo.refs.read_head)
|
124
|
+
repo.index.write_updates
|
125
|
+
|
126
|
+
exit 0
|
127
|
+
rescue Repository::PendingCommit::Error => error
|
128
|
+
@stderr.puts "fatal: #{ error.message }"
|
129
|
+
exit 128
|
130
|
+
end
|
131
|
+
|
132
|
+
def handle_continue
|
133
|
+
repo.index.load
|
134
|
+
resume_merge(:merge)
|
135
|
+
rescue Repository::PendingCommit::Error => error
|
136
|
+
@stderr.puts "fatal: #{ error.message }"
|
137
|
+
exit 128
|
138
|
+
end
|
139
|
+
|
140
|
+
def handle_in_progress_merge
|
141
|
+
message = "Merging is not possible because you have unmerged files"
|
142
|
+
@stderr.puts "error: #{ message }."
|
143
|
+
@stderr.puts CONFLICT_MESSAGE
|
144
|
+
exit 128
|
145
|
+
end
|
146
|
+
|
147
|
+
end
|
148
|
+
end
|