Skip to content

Commit

Permalink
git-gui: allow reverting selected lines
Browse files Browse the repository at this point in the history
Just like the user can select lines to stage or unstage, add the
ability to revert selected lines.

Signed-off-by: Pratyush Yadav <me@yadavpratyush.com>
  • Loading branch information
prati0100 committed Aug 25, 2019
1 parent 5ab7227 commit 5f0a516
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 7 deletions.
25 changes: 24 additions & 1 deletion git-gui.sh
Original file line number Diff line number Diff line change
Expand Up @@ -3587,10 +3587,16 @@ set ui_diff_applyhunk [$ctxm index last]
lappend diff_actions [list $ctxm entryconf $ui_diff_applyhunk -state]
$ctxm add command \
-label [mc "Apply/Reverse Line"] \
-command {apply_range_or_line $cursorX $cursorY; do_rescan}
-command {apply_or_revert_range_or_line $cursorX $cursorY 0; do_rescan}
set ui_diff_applyline [$ctxm index last]
lappend diff_actions [list $ctxm entryconf $ui_diff_applyline -state]
$ctxm add separator
$ctxm add command \
-label [mc "Revert Line"] \
-command {apply_or_revert_range_or_line $cursorX $cursorY 1; do_rescan}
set ui_diff_revertline [$ctxm index last]
lappend diff_actions [list $ctxm entryconf $ui_diff_revertline -state]
$ctxm add separator
$ctxm add command \
-label [mc "Show Less Context"] \
-command show_less_context
Expand Down Expand Up @@ -3687,15 +3693,19 @@ proc popup_diff_menu {ctxm ctxmmg ctxmsm x y X Y} {
set l [mc "Unstage Hunk From Commit"]
if {$has_range} {
set t [mc "Unstage Lines From Commit"]
set r [mc "Revert Lines"]
} else {
set t [mc "Unstage Line From Commit"]
set r [mc "Revert Line"]
}
} else {
set l [mc "Stage Hunk For Commit"]
if {$has_range} {
set t [mc "Stage Lines For Commit"]
set r [mc "Revert Lines"]
} else {
set t [mc "Stage Line For Commit"]
set r [mc "Revert Line"]
}
}
if {$::is_3way_diff
Expand All @@ -3706,11 +3716,24 @@ proc popup_diff_menu {ctxm ctxmmg ctxmsm x y X Y} {
|| [string match {T?} $state]
|| [has_textconv $current_diff_path]} {
set s disabled
set revert_state disabled
} else {
set s normal
# Only allow reverting changes in the working tree. If
# the user wants to revert changes in the index, they
# need to unstage those first.
if {$::ui_workdir eq $::current_diff_side} {
set revert_state normal
} else {
set revert_state disabled
}
}
$ctxm entryconf $::ui_diff_applyhunk -state $s -label $l
$ctxm entryconf $::ui_diff_applyline -state $s -label $t
$ctxm entryconf $::ui_diff_revertline -state $revert_state \
-label $r
tk_popup $ctxm $X $Y
}
}
Expand Down
20 changes: 14 additions & 6 deletions lib/diff.tcl
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ proc reshow_diff {{after {}}} {

proc force_diff_encoding {enc} {
global current_diff_path

if {$current_diff_path ne {}} {
force_path_encoding $current_diff_path $enc
reshow_diff
Expand Down Expand Up @@ -640,7 +640,7 @@ proc apply_hunk {x y} {
}
}

proc apply_range_or_line {x y} {
proc apply_or_revert_range_or_line {x y revert} {
global current_diff_path current_diff_header current_diff_side
global ui_diff ui_index file_states

Expand All @@ -660,19 +660,27 @@ proc apply_range_or_line {x y} {
if {$current_diff_path eq {} || $current_diff_header eq {}} return
if {![lock_index apply_hunk]} return

set apply_cmd {apply --cached --whitespace=nowarn}
set apply_cmd {apply --whitespace=nowarn}
set mi [lindex $file_states($current_diff_path) 0]
if {$current_diff_side eq $ui_index} {
set failed_msg [mc "Failed to unstage selected line."]
set to_context {+}
lappend apply_cmd --reverse
lappend apply_cmd --reverse --cached
if {[string index $mi 0] ne {M}} {
unlock_index
return
}
} else {
set failed_msg [mc "Failed to stage selected line."]
set to_context {-}
if {$revert} {
set failed_msg [mc "Failed to revert selected line."]
set to_context {+}
lappend apply_cmd --reverse
} else {
set failed_msg [mc "Failed to stage selected line."]
set to_context {-}
lappend apply_cmd --cached
}

if {[string index $mi 1] ne {M}} {
unlock_index
return
Expand Down

0 comments on commit 5f0a516

Please sign in to comment.