gitk: Add menu item for reverting commits

Sometimes it's helpful (at least psychologically) to have this feature
easily accessible.  Code borrows heavily from cherrypick.

Signed-off-by: Knut Franke <Knut.Franke@gmx.de>
Signed-off-by: Paul Mackerras <paulus@samba.org>
This commit is contained in:
Knut Franke 2013-04-27 16:36:13 +02:00 committed by Paul Mackerras
parent 2c8cd905d1
commit 8f3ff9339f

62
gitk
View file

@ -2567,6 +2567,7 @@ proc makewindow {} {
{mc "Compare with marked commit" command compare_commits}
{mc "Diff this -> marked commit" command {diffvsmark 0}}
{mc "Diff marked commit -> this" command {diffvsmark 1}}
{mc "Revert this commit" command revert}
}
$rowctxmenu configure -tearoff 0
@ -9346,6 +9347,67 @@ proc cherrypick {} {
notbusy cherrypick
}
proc revert {} {
global rowmenuid curview
global mainhead mainheadid
global gitdir
set oldhead [exec git rev-parse HEAD]
set dheads [descheads $rowmenuid]
if { $dheads eq {} || [lsearch -exact $dheads $oldhead] == -1 } {
set ok [confirm_popup [mc "Commit %s is not\
included in branch %s -- really revert it?" \
[string range $rowmenuid 0 7] $mainhead]]
if {!$ok} return
}
nowbusy revert [mc "Reverting"]
update
if [catch {exec git revert --no-edit $rowmenuid} err] {
notbusy revert
if [regexp {files would be overwritten by merge:(\n(( |\t)+[^\n]+\n)+)}\
$err match files] {
regsub {\n( |\t)+} $files "\n" files
error_popup [mc "Revert failed because of local changes to\
the following files:%s Please commit, reset or stash \
your changes and try again." $files]
} elseif [regexp {error: could not revert} $err] {
if [confirm_popup [mc "Revert failed because of merge conflict.\n\
Do you wish to run git citool to resolve it?"]] {
# Force citool to read MERGE_MSG
file delete [file join $gitdir "GITGUI_MSG"]
exec_citool {} $rowmenuid
}
} else { error_popup $err }
run updatecommits
return
}
set newhead [exec git rev-parse HEAD]
if { $newhead eq $oldhead } {
notbusy revert
error_popup [mc "No changes committed"]
return
}
addnewchild $newhead $oldhead
if [commitinview $oldhead $curview] {
# XXX this isn't right if we have a path limit...
insertrow $newhead $oldhead $curview
if {$mainhead ne {}} {
movehead $newhead $mainhead
movedhead $newhead $mainhead
}
set mainheadid $newhead
redrawtags $oldhead
redrawtags $newhead
selbyid $newhead
}
notbusy revert
}
proc resethead {} {
global mainhead rowmenuid confirm_ok resettype NS