jit 0.0.0 → 1.0.0
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.
- 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
data/lib/command/push.rb
ADDED
@@ -0,0 +1,172 @@
|
|
1
|
+
require_relative "./base"
|
2
|
+
require_relative "./shared/fast_forward"
|
3
|
+
require_relative "./shared/remote_client"
|
4
|
+
require_relative "./shared/send_objects"
|
5
|
+
require_relative "../remotes"
|
6
|
+
require_relative "../revision"
|
7
|
+
|
8
|
+
module Command
|
9
|
+
class Push < Base
|
10
|
+
|
11
|
+
include FastForward
|
12
|
+
include RemoteClient
|
13
|
+
include SendObjects
|
14
|
+
|
15
|
+
CAPABILITIES = ["report-status"]
|
16
|
+
RECEIVE_PACK = "git-receive-pack"
|
17
|
+
|
18
|
+
UNPACK_LINE = /^unpack (.+)$/
|
19
|
+
UPDATE_LINE = /^(ok|ng) (\S+)(.*)$/
|
20
|
+
|
21
|
+
def define_options
|
22
|
+
@parser.on("-f", "--force") { @options[:force] = true }
|
23
|
+
|
24
|
+
@parser.on "--receive-pack=<receive-pack>" do |receiver|
|
25
|
+
@options[:receiver] = receiver
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def run
|
30
|
+
configure
|
31
|
+
start_agent("push", @receiver, @push_url, CAPABILITIES)
|
32
|
+
|
33
|
+
recv_references
|
34
|
+
send_update_requests
|
35
|
+
send_objects
|
36
|
+
print_summary
|
37
|
+
recv_report_status
|
38
|
+
|
39
|
+
exit (@errors.empty? ? 0 : 1)
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
43
|
+
|
44
|
+
def configure
|
45
|
+
current_branch = repo.refs.current_ref.short_name
|
46
|
+
branch_remote = repo.config.get(["branch", current_branch, "remote"])
|
47
|
+
branch_merge = repo.config.get(["branch", current_branch, "merge"])
|
48
|
+
|
49
|
+
name = @args.fetch(0, branch_remote || Remotes::DEFAULT_REMOTE)
|
50
|
+
remote = repo.remotes.get(name)
|
51
|
+
|
52
|
+
@push_url = remote&.push_url || @args[0]
|
53
|
+
@fetch_specs = remote&.fetch_specs || []
|
54
|
+
@receiver = @options[:receiver] || remote&.receiver || RECEIVE_PACK
|
55
|
+
|
56
|
+
if @args.size > 1
|
57
|
+
@push_specs = @args.drop(1)
|
58
|
+
elsif branch_merge
|
59
|
+
spec = Remotes::Refspec.new(current_branch, branch_merge, false)
|
60
|
+
@push_specs = [spec.to_s]
|
61
|
+
else
|
62
|
+
@push_specs = remote&.push_specs
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def send_update_requests
|
67
|
+
@updates = {}
|
68
|
+
@errors = []
|
69
|
+
|
70
|
+
local_refs = repo.refs.list_all_refs.map(&:path).sort
|
71
|
+
targets = Remotes::Refspec.expand(@push_specs, local_refs)
|
72
|
+
|
73
|
+
targets.each do |target, (source, forced)|
|
74
|
+
select_update(target, source, forced)
|
75
|
+
end
|
76
|
+
|
77
|
+
@updates.each { |ref, (*, old, new)| send_update(ref, old, new) }
|
78
|
+
@conn.send_packet(nil)
|
79
|
+
end
|
80
|
+
|
81
|
+
def select_update(target, source, forced)
|
82
|
+
return select_deletion(target) unless source
|
83
|
+
|
84
|
+
old_oid = @remote_refs[target]
|
85
|
+
new_oid = Revision.new(repo, source).resolve
|
86
|
+
|
87
|
+
return if old_oid == new_oid
|
88
|
+
|
89
|
+
ff_error = fast_forward_error(old_oid, new_oid)
|
90
|
+
|
91
|
+
if @options[:force] or forced or ff_error == nil
|
92
|
+
@updates[target] = [source, ff_error, old_oid, new_oid]
|
93
|
+
else
|
94
|
+
@errors.push([[source, target], ff_error])
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
def select_deletion(target)
|
99
|
+
if @conn.capable?("delete-refs")
|
100
|
+
@updates[target] = [nil, nil, @remote_refs[target], nil]
|
101
|
+
else
|
102
|
+
@errors.push([[nil, target], "remote does not support deleting refs"])
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
def send_update(ref, old_oid, new_oid)
|
107
|
+
old_oid = nil_to_zero(old_oid)
|
108
|
+
new_oid = nil_to_zero(new_oid)
|
109
|
+
|
110
|
+
@conn.send_packet("#{ old_oid } #{ new_oid } #{ ref }")
|
111
|
+
end
|
112
|
+
|
113
|
+
def nil_to_zero(oid)
|
114
|
+
oid == nil ? ZERO_OID : oid
|
115
|
+
end
|
116
|
+
|
117
|
+
def send_objects
|
118
|
+
revs = @updates.values.map(&:last).compact
|
119
|
+
return if revs.empty?
|
120
|
+
|
121
|
+
revs += @remote_refs.values.map { |oid| "^#{ oid }" }
|
122
|
+
|
123
|
+
send_packed_objects(revs)
|
124
|
+
end
|
125
|
+
|
126
|
+
def print_summary
|
127
|
+
if @updates.empty? and @errors.empty?
|
128
|
+
@stderr.puts "Everything up-to-date"
|
129
|
+
else
|
130
|
+
@stderr.puts "To #{ @push_url }"
|
131
|
+
@errors.each { |ref_names, error| report_ref_update(ref_names, error) }
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
def recv_report_status
|
136
|
+
return unless @conn.capable?("report-status") and not @updates.empty?
|
137
|
+
|
138
|
+
unpack_result = UNPACK_LINE.match(@conn.recv_packet)[1]
|
139
|
+
|
140
|
+
unless unpack_result == "ok"
|
141
|
+
@stderr.puts "error: remote unpack failed: #{ unpack_result }"
|
142
|
+
end
|
143
|
+
|
144
|
+
@conn.recv_until(nil) { |line| handle_status(line) }
|
145
|
+
end
|
146
|
+
|
147
|
+
def handle_status(line)
|
148
|
+
return unless match = UPDATE_LINE.match(line)
|
149
|
+
|
150
|
+
status = match[1]
|
151
|
+
ref = match[2]
|
152
|
+
error = (status == "ok") ? nil : match[3].strip
|
153
|
+
|
154
|
+
@errors.push([ref, error]) if error
|
155
|
+
report_update(ref, error)
|
156
|
+
|
157
|
+
targets = Remotes::Refspec.expand(@fetch_specs, [ref])
|
158
|
+
|
159
|
+
targets.each do |local_ref, (remote_ref, _)|
|
160
|
+
new_oid = @updates[remote_ref].last
|
161
|
+
repo.refs.update_ref(local_ref, new_oid) unless error
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
def report_update(target, error)
|
166
|
+
source, ff_error, old_oid, new_oid = @updates[target]
|
167
|
+
ref_names = [source, target]
|
168
|
+
report_ref_update(ref_names, error, old_oid, new_oid, ff_error == nil)
|
169
|
+
end
|
170
|
+
|
171
|
+
end
|
172
|
+
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
require_relative "./base"
|
2
|
+
require_relative "./shared/fast_forward"
|
3
|
+
require_relative "./shared/receive_objects"
|
4
|
+
require_relative "./shared/remote_agent"
|
5
|
+
|
6
|
+
module Command
|
7
|
+
class ReceivePack < Base
|
8
|
+
|
9
|
+
include FastForward
|
10
|
+
include ReceiveObjects
|
11
|
+
include RemoteAgent
|
12
|
+
|
13
|
+
CAPABILITIES = ["no-thin", "report-status", "delete-refs", "ofs-delta"]
|
14
|
+
|
15
|
+
def run
|
16
|
+
accept_client("receive-pack", CAPABILITIES)
|
17
|
+
|
18
|
+
send_references
|
19
|
+
recv_update_requests
|
20
|
+
recv_objects
|
21
|
+
update_refs
|
22
|
+
|
23
|
+
exit 0
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def recv_update_requests
|
29
|
+
@requests = {}
|
30
|
+
|
31
|
+
@conn.recv_until(nil) do |line|
|
32
|
+
old_oid, new_oid, ref = line.split(/ +/)
|
33
|
+
@requests[ref] = [old_oid, new_oid].map { |oid| zero_to_nil(oid) }
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def zero_to_nil(oid)
|
38
|
+
oid == ZERO_OID ? nil : oid
|
39
|
+
end
|
40
|
+
|
41
|
+
def recv_objects
|
42
|
+
@unpack_error = nil
|
43
|
+
unpack_limit = repo.config.get(["receive", "unpackLimit"])
|
44
|
+
recv_packed_objects(unpack_limit) if @requests.values.any?(&:last)
|
45
|
+
report_status("unpack ok")
|
46
|
+
rescue => error
|
47
|
+
@unpack_error = error
|
48
|
+
report_status("unpack #{ error.message }")
|
49
|
+
end
|
50
|
+
|
51
|
+
def update_refs
|
52
|
+
@requests.each { |ref, (old, new)| update_ref(ref, old, new) }
|
53
|
+
report_status(nil)
|
54
|
+
end
|
55
|
+
|
56
|
+
def update_ref(ref, old_oid, new_oid)
|
57
|
+
return report_status("ng #{ ref } unpacker error") if @unpack_error
|
58
|
+
|
59
|
+
validate_update(ref, old_oid, new_oid)
|
60
|
+
repo.refs.compare_and_swap(ref, old_oid, new_oid)
|
61
|
+
report_status("ok #{ ref }")
|
62
|
+
rescue => error
|
63
|
+
report_status("ng #{ ref } #{ error.message }")
|
64
|
+
end
|
65
|
+
|
66
|
+
def validate_update(ref, old_oid, new_oid)
|
67
|
+
if repo.config.get(["receive", "denyDeletes"])
|
68
|
+
raise "deletion prohibited" unless new_oid
|
69
|
+
end
|
70
|
+
|
71
|
+
if repo.config.get(["receive", "denyNonFastForwards"])
|
72
|
+
raise "non-fast-forward" if fast_forward_error(old_oid, new_oid)
|
73
|
+
end
|
74
|
+
|
75
|
+
return unless repo.config.get(["core", "bare"]) == false and
|
76
|
+
repo.refs.current_ref.path == ref
|
77
|
+
|
78
|
+
unless repo.config.get(["receive", "denyCurrentBranch"]) == false
|
79
|
+
raise "branch is currently checked out" if new_oid
|
80
|
+
end
|
81
|
+
|
82
|
+
unless repo.config.get(["receive", "denyDeleteCurrent"]) == false
|
83
|
+
raise "deletion of the current branch prohibited" unless new_oid
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
def report_status(line)
|
88
|
+
@conn.send_packet(line) if @conn.capable?("report-status")
|
89
|
+
end
|
90
|
+
|
91
|
+
end
|
92
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require_relative "./base"
|
2
|
+
|
3
|
+
module Command
|
4
|
+
class Remote < Base
|
5
|
+
|
6
|
+
def define_options
|
7
|
+
@parser.on("-v", "--verbose") { @options[:verbose] = true }
|
8
|
+
|
9
|
+
@options[:tracked] = []
|
10
|
+
@parser.on("-t <branch>") { |branch| @options[:tracked].push(branch) }
|
11
|
+
end
|
12
|
+
|
13
|
+
def run
|
14
|
+
case @args.shift
|
15
|
+
when "add" then add_remote
|
16
|
+
when "remove" then remove_remote
|
17
|
+
else list_remotes
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def add_remote
|
24
|
+
name, url = @args[0], @args[1]
|
25
|
+
repo.remotes.add(name, url, @options[:tracked])
|
26
|
+
exit 0
|
27
|
+
rescue Remotes::InvalidRemote => error
|
28
|
+
@stderr.puts "fatal: #{ error.message }"
|
29
|
+
exit 128
|
30
|
+
end
|
31
|
+
|
32
|
+
def remove_remote
|
33
|
+
repo.remotes.remove(@args[0])
|
34
|
+
exit 0
|
35
|
+
rescue Remotes::InvalidRemote => error
|
36
|
+
@stderr.puts "fatal: #{ error.message }"
|
37
|
+
exit 128
|
38
|
+
end
|
39
|
+
|
40
|
+
def list_remotes
|
41
|
+
repo.remotes.list_remotes.each { |name| list_remote(name) }
|
42
|
+
exit 0
|
43
|
+
end
|
44
|
+
|
45
|
+
def list_remote(name)
|
46
|
+
return puts name unless @options[:verbose]
|
47
|
+
|
48
|
+
remote = repo.remotes.get(name)
|
49
|
+
|
50
|
+
puts "#{ name }\t#{ remote.fetch_url } (fetch)"
|
51
|
+
puts "#{ name }\t#{ remote.push_url } (push)"
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require "pathname"
|
2
|
+
|
3
|
+
require_relative "./base"
|
4
|
+
require_relative "../revision"
|
5
|
+
|
6
|
+
module Command
|
7
|
+
class Reset < Base
|
8
|
+
|
9
|
+
def define_options
|
10
|
+
@options[:mode] = :mixed
|
11
|
+
|
12
|
+
@parser.on("--soft") { @options[:mode] = :soft }
|
13
|
+
@parser.on("--mixed") { @options[:mode] = :mixed }
|
14
|
+
@parser.on("--hard") { @options[:mode] = :hard }
|
15
|
+
end
|
16
|
+
|
17
|
+
def run
|
18
|
+
select_commit_oid
|
19
|
+
|
20
|
+
repo.index.load_for_update
|
21
|
+
reset_files
|
22
|
+
repo.index.write_updates
|
23
|
+
|
24
|
+
if @args.empty?
|
25
|
+
head_oid = repo.refs.update_head(@commit_oid)
|
26
|
+
repo.refs.update_ref(Refs::ORIG_HEAD, head_oid)
|
27
|
+
end
|
28
|
+
|
29
|
+
exit 0
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def select_commit_oid
|
35
|
+
revision = @args.fetch(0, Revision::HEAD)
|
36
|
+
@commit_oid = Revision.new(repo, revision).resolve
|
37
|
+
@args.shift
|
38
|
+
rescue Revision::InvalidObject
|
39
|
+
@commit_oid = repo.refs.read_head
|
40
|
+
end
|
41
|
+
|
42
|
+
def reset_files
|
43
|
+
return if @options[:mode] == :soft
|
44
|
+
return repo.hard_reset(@commit_oid) if @options[:mode] == :hard
|
45
|
+
|
46
|
+
if @args.empty?
|
47
|
+
repo.index.clear!
|
48
|
+
reset_path(nil)
|
49
|
+
else
|
50
|
+
@args.each { |path| reset_path(Pathname.new(path)) }
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def reset_path(pathname)
|
55
|
+
listing = repo.database.load_tree_list(@commit_oid, pathname)
|
56
|
+
repo.index.remove(pathname) if pathname
|
57
|
+
|
58
|
+
listing.each do |path, entry|
|
59
|
+
repo.index.add_from_db(path, entry)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require_relative "./base"
|
2
|
+
require_relative "../rev_list"
|
3
|
+
|
4
|
+
module Command
|
5
|
+
class RevList < Base
|
6
|
+
|
7
|
+
def define_options
|
8
|
+
@parser.on("--all") { @options[:all] = true }
|
9
|
+
@parser.on("--branches") { @options[:branches] = true }
|
10
|
+
@parser.on("--remotes") { @options[:remotes] = true }
|
11
|
+
|
12
|
+
@parser.on("--ignore-missing") { @options[:missing] = true }
|
13
|
+
@parser.on("--objects") { @options[:objects] = true }
|
14
|
+
@parser.on("--reverse") { @options[:reverse] = true }
|
15
|
+
|
16
|
+
@options[:walk] = true
|
17
|
+
@parser.on("--do-walk") { @options[:walk] = true }
|
18
|
+
@parser.on("--no-walk") { @options[:walk] = false }
|
19
|
+
end
|
20
|
+
|
21
|
+
def run
|
22
|
+
rev_list = ::RevList.new(repo, @args, @options)
|
23
|
+
iterator = @options[:reverse] ? :reverse_each : :each
|
24
|
+
|
25
|
+
rev_list.__send__(iterator) do |object, path|
|
26
|
+
puts "#{ object.oid } #{ path }".strip
|
27
|
+
end
|
28
|
+
|
29
|
+
exit 0
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
require_relative "./base"
|
2
|
+
require_relative "./shared/sequencing"
|
3
|
+
require_relative "./shared/write_commit"
|
4
|
+
require_relative "../merge/inputs"
|
5
|
+
require_relative "../rev_list"
|
6
|
+
|
7
|
+
module Command
|
8
|
+
class Revert < Base
|
9
|
+
|
10
|
+
include Sequencing
|
11
|
+
include WriteCommit
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def merge_type
|
16
|
+
:revert
|
17
|
+
end
|
18
|
+
|
19
|
+
def store_commit_sequence
|
20
|
+
commits = ::RevList.new(repo, @args, :walk => false)
|
21
|
+
commits.each { |commit| sequencer.revert(commit) }
|
22
|
+
end
|
23
|
+
|
24
|
+
def revert(commit)
|
25
|
+
inputs = revert_merge_inputs(commit)
|
26
|
+
message = revert_commit_message(commit)
|
27
|
+
|
28
|
+
resolve_merge(inputs)
|
29
|
+
fail_on_conflict(inputs, message) if repo.index.conflict?
|
30
|
+
|
31
|
+
author = current_author
|
32
|
+
message = edit_revert_message(message)
|
33
|
+
picked = Database::Commit.new([inputs.left_oid], write_tree.oid,
|
34
|
+
author, author, message)
|
35
|
+
|
36
|
+
finish_commit(picked)
|
37
|
+
end
|
38
|
+
|
39
|
+
def revert_merge_inputs(commit)
|
40
|
+
short = repo.database.short_oid(commit.oid)
|
41
|
+
|
42
|
+
left_name = Refs::HEAD
|
43
|
+
left_oid = repo.refs.read_head
|
44
|
+
right_name = "parent of #{ short }... #{ commit.title_line.strip }"
|
45
|
+
right_oid = select_parent(commit)
|
46
|
+
|
47
|
+
::Merge::CherryPick.new(left_name, right_name,
|
48
|
+
left_oid, right_oid,
|
49
|
+
[commit.oid])
|
50
|
+
end
|
51
|
+
|
52
|
+
def revert_commit_message(commit)
|
53
|
+
<<~MESSAGE
|
54
|
+
Revert "#{ commit.title_line.strip }"
|
55
|
+
|
56
|
+
This reverts commit #{ commit.oid }.
|
57
|
+
MESSAGE
|
58
|
+
end
|
59
|
+
|
60
|
+
def edit_revert_message(message)
|
61
|
+
edit_file(commit_message_path) do |editor|
|
62
|
+
editor.puts(message)
|
63
|
+
editor.puts("")
|
64
|
+
editor.note(Commit::COMMIT_NOTES)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
69
|
+
end
|