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

[PATCH] git gui: use apply --unidiff-zero when staging hunks without context

From
Clemens Buchacher <drizzd@aon.at>
Date
Aug 30, 2008, 16:56 UTC
Message-ID
<20080830165600.GB25370@localhost>
In-Reply-To
<20080830164527.GA25370@localhost>

git apply does not work correctly with zero-context patches. It does a little better with --unidiff-zero. ---

This appears to fix staging hunks with zero context lines in the majority of cases. Staging individual lines still is a problem frequently.

In any case, it's easy enough to break zero-context diff & patch like this:

echo a > victim git add victim echo b >> victim git diff -U0 | git apply --cached --unidiff-zero git diff

So before delving into this problem to deeply, I'd like to find out who needs fixing exactly. Is there documentation defining how zero-context git diff output should look like? Or is git apply the culprit in the bug above?

Or do we even want to support applying zero-context patches? If not, we should detect and fail such attempts.

Clemens
 git-gui/lib/diff.tcl |   10 ++++++++--
 1 files changed, 8 insertions(+), 2 deletions(-)
diff --git a/git-gui/lib/diff.tcl b/git-gui/lib/diff.tcl
index 52b79e4..78c1b56 100644
--- a/git-gui/lib/diff.tcl
+++ b/git-gui/lib/diff.tcl
@@ -302,12 +302,15 @@ proc read_diff {fd scroll_pos} {
 
 proc apply_hunk {x y} {
 	global current_diff_path current_diff_header current_diff_side
-	global ui_diff ui_index file_states
+	global ui_diff ui_index file_states repo_config
 
 	if {$current_diff_path eq {} || $current_diff_header eq {}} return
 	if {![lock_index apply_hunk]} return
 
 	set apply_cmd {apply --cached --whitespace=nowarn}
+	if {$repo_config(gui.diffcontext) eq 0} {
+		lappend apply_cmd --unidiff-zero
+	}
 	set mi [lindex $file_states($current_diff_path) 0]
 	if {$current_diff_side eq $ui_index} {
 		set failed_msg [mc "Failed to unstage selected hunk."]
@@ -375,12 +378,15 @@ proc apply_hunk {x y} {
 
 proc apply_line {x y} {
 	global current_diff_path current_diff_header current_diff_side
-	global ui_diff ui_index file_states
+	global ui_diff ui_index file_states repo_config
 
 	if {$current_diff_path eq {} || $current_diff_header eq {}} return
 	if {![lock_index apply_hunk]} return
 
 	set apply_cmd {apply --cached --whitespace=nowarn}
+	if {$repo_config(gui.diffcontext) eq 0} {
+		lappend apply_cmd --unidiff-zero
+	}
 	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."]
-- 
1.6.0
Previous: Clemens BuchacherNext: Junio C Hamano
Message 2 of 17 in “git gui: show diffs with a minimum of 1 context line”
  1. git gui: show diffs with a minimum of 1 context lineClemens Buchacher, Aug 30, 2008
  2. git gui: use apply --unidiff-zero when staging hunks without contextClemens Buchacher, Aug 30, 2008
  3. Junio C HamanoAug 30, 2008
  4. git apply: do not match beginning in special unidiff-zero caseClemens Buchacher, Aug 30, 2008
  5. Junio C HamanoAug 30, 2008
  6. git-apply: Loosen "match_beginning" logicJunio C Hamano, Aug 30, 2008
  7. Johannes SixtAug 30, 2008
  8. Clemens BuchacherAug 30, 2008
  9. Junio C HamanoAug 30, 2008
  10. Clemens BuchacherAug 30, 2008
  11. Shawn O. PearceSep 1, 2008
  12. Junio C HamanoAug 30, 2008
  13. Junio C HamanoAug 30, 2008
  14. git gui: show diffs with a minimum of 1 context lineClemens Buchacher, Aug 30, 2008
  15. Shawn O. PearceSep 1, 2008
  16. Clemens BuchacherSep 1, 2008
  17. Shawn O. PearceSep 1, 2008

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.