[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