git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH 2/3] git-gui: Add the ability to revert selected lines

From
Pratyush Yadav <me@yadavpratyush.com>
Date
Aug 19, 2019, 21:41 UTC
Message-ID
<20190819214110.26461-3-me@yadavpratyush.com>
In-Reply-To
<20190819214110.26461-1-me@yadavpratyush.com>

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>
---
 git-gui/git-gui.sh   | 25 ++++++++++++++++++++++++-
 git-gui/lib/diff.tcl | 31 ++++++++++++++++++++++++++-----
 2 files changed, 50 insertions(+), 6 deletions(-)
diff --git a/git-gui/git-gui.sh b/git-gui/git-gui.sh
index 6de74ce639..2011894bef 100755
--- a/git-gui/git-gui.sh
+++ b/git-gui/git-gui.sh
@@ -3611,9 +3611,15 @@ 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 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]
+set ui_diff_revertline [$ctxm index last]
 $ctxm add separator
 $ctxm add command \
 	-label [mc "Show Less Context"] \
@@ -3711,15 +3717,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
@@ -3730,11 +3740,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
 	}
 }
diff --git a/git-gui/lib/diff.tcl b/git-gui/lib/diff.tcl
index 68c4a6c736..4b2b00df4b 100644
--- a/git-gui/lib/diff.tcl
+++ b/git-gui/lib/diff.tcl
@@ -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
 
@@ -660,25 +660,46 @@ 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
 		}
 	}
 
+	if {$revert} {
+		set query "[mc "Revert changes in file %s?" \
+			[short_path $current_diff_path]]
+
+[mc "The selected lines will be permanently lost by the revert."]"
+
+		set reply [revert_dialog $query]
+		if {$reply ne 1} {
+			unlock_index
+			return
+		}
+	}
+
 	set wholepatch {}
 
 	while {$first_l < $last_l} {
-- 
2.21.0
Previous: Pratyush YadavNext: Johannes Sixt
Message 3 of 49 in “git-gui: Add ability to revert selected hunks and lines”
  1. 0/3 git-gui: Add ability to revert selected hunks and linesPratyush Yadav, Aug 19, 2019
  2. 1/3 git-gui: Move revert confirmation dialog creation to separate functionPratyush Yadav, Aug 19, 2019
  3. 2/3 git-gui: Add the ability to revert selected linesPratyush Yadav, Aug 19, 2019
  4. Johannes SixtAug 20, 2019
  5. Pratyush YadavAug 20, 2019
  6. Johannes SixtAug 20, 2019
  7. Pratyush YadavAug 21, 2019
  8. Johannes SchindelinAug 23, 2019
  9. Junio C HamanoAug 23, 2019
  10. Pratyush YadavAug 23, 2019
  11. Johannes SixtAug 23, 2019
  12. 3/3 git-gui: Add the ability to revert selected hunkPratyush Yadav, Aug 19, 2019
  13. Junio C HamanoAug 20, 2019
  14. Pratyush YadavAug 20, 2019
  15. Bert WesargAug 21, 2019
  16. Pratyush YadavAug 21, 2019
  17. 0/4 git-gui: Add ability to revert selected hunks and linesPratyush Yadav, Aug 22, 2019
  18. 1/4 git-gui: Move revert confirmation dialog creation to separate functionPratyush Yadav, Aug 22, 2019
  19. 2/4 git-gui: Add option to disable the revert confirmation promptPratyush Yadav, Aug 22, 2019
  20. 3/4 git-gui: Add the ability to revert selected linesPratyush Yadav, Aug 22, 2019
  21. Bert WesargAug 23, 2019
  22. Pratyush YadavAug 23, 2019
  23. 4/4 git-gui: Add the ability to revert selected hunkPratyush Yadav, Aug 22, 2019
  24. Junio C HamanoAug 22, 2019
  25. Pratyush YadavAug 22, 2019
  26. Bert WesargAug 23, 2019
  27. Junio C HamanoAug 23, 2019
  28. Pratyush YadavAug 23, 2019
  29. David AguilarAug 23, 2019
  30. Bert WesargAug 24, 2019
  31. Bert WesargAug 24, 2019
  32. David AguilarAug 24, 2019
  33. Johannes SixtAug 24, 2019
  34. 0/4 git-gui: Add ability to revert selected hunks and linesPratyush Yadav, Aug 28, 2019
  35. 1/4 git-gui: allow reverting selected linesPratyush Yadav, Aug 28, 2019
  36. 2/4 git-gui: allow reverting selected hunkPratyush Yadav, Aug 28, 2019
  37. 3/4 git-gui: return early when patch fails to applyPratyush Yadav, Aug 28, 2019
  38. 4/4 git-gui: allow undoing last revertPratyush Yadav, Aug 28, 2019
  39. Bert WesargOct 21, 2019
  40. Pratyush YadavOct 21, 2019
  41. Bert WesargOct 22, 2019
  42. Pratyush YadavOct 23, 2019
  43. Johannes SixtOct 21, 2019
  44. Bert WesargOct 22, 2019
  45. Pratyush YadavOct 23, 2019
  46. Pratyush YadavSep 10, 2019
  47. Johannes SixtSep 10, 2019
  48. Bert WesargSep 12, 2019
  49. Pratyush YadavAug 25, 2019

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.