mirror of
https://github.com/git-for-windows/git.git
synced 2026-04-20 17:54:13 -05:00
`git log -L` has always bypassed the standard diff pipeline.
`dump_diff_hacky()` in line-log.c hand-rolls its own diff headers and
hunk output, which means most diff formatting options are silently
ignored. A NEEDSWORK comment has acknowledged this since the feature
was introduced:
/*
* NEEDSWORK: manually building a diff here is not the Right
* Thing(tm). log -L should be built into the diff pipeline.
*/
Remove `dump_diff_hacky()` and its helpers and route -L output through
`builtin_diff()` / `fn_out_consume()`, the same path used by `git diff`
and `git log -p`. The mechanism is a pair of callback wrappers that sit
between `xdi_diff_outf()` and `fn_out_consume()`, filtering xdiff's
output to only the tracked line ranges. To ensure xdiff emits all lines
within each range as context, the context length is inflated to span the
largest range.
Wire up the `-L` implies `--patch` default in revision setup rather
than forcing it at output time, so `line_log_print()` is just
`diffcore_std()` + `diff_flush()` with no format save/restore.
Rename detection is a no-op since pairs are already resolved during
the history walk in `queue_diffs()`, but running `diffcore_std()`
means `-S`/`-G` (pickaxe), `--orderfile`, and `--diff-filter` now
work with `-L`, and `diff_resolve_rename_copy()` sets pair statuses
correctly without manual assignment.
Switch `diff_filepair_dup()` from `xmalloc` to `xcalloc` so that new
fields (including `line_ranges`) are zero-initialized by default.
As a result, diff formatting options that were previously silently
ignored (e.g. --word-diff, --no-prefix, -w, --color-moved) now work
with -L, and output gains `index` lines, `new file mode` headers, and
funcname context in `@@` headers. This is a user-visible output change:
tools that parse -L output may need to handle the additional header
lines.
The context-length inflation means xdiff may process more output than
needed for very wide line ranges, but benchmarks on files up to 7800
lines show no measurable regression.
Signed-off-by: Michael Montalbo <mmontalbo@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
74 lines
1.4 KiB
Plaintext
74 lines
1.4 KiB
Plaintext
commit 5526ed05c2476b56af8b7be499e8f78bd50f490740733a9ca7e1f55878fa90a9
|
|
Author: Thomas Rast <trast@student.ethz.ch>
|
|
Date: Thu Feb 28 10:48:43 2013 +0100
|
|
|
|
change back to complete line
|
|
|
|
diff --git a/a.c b/a.c
|
|
index e4fa1d8..62c1fc2 100644
|
|
--- a/a.c
|
|
+++ b/a.c
|
|
@@ -18,5 +18,5 @@ long f(long x)
|
|
int main ()
|
|
{
|
|
printf("%ld\n", f(15));
|
|
return 0;
|
|
-}
|
|
\ No newline at end of file
|
|
+}
|
|
|
|
commit 29f32ac3141c48b22803e5c4127b719917b67d0f8ca8c5248bebfa2a19f7da10
|
|
Author: Thomas Rast <trast@student.ethz.ch>
|
|
Date: Thu Feb 28 10:48:10 2013 +0100
|
|
|
|
change to an incomplete line at end
|
|
|
|
diff --git a/a.c b/a.c
|
|
index d325124..e4fa1d8 100644
|
|
--- a/a.c
|
|
+++ b/a.c
|
|
@@ -18,5 +18,5 @@ long f(long x)
|
|
int main ()
|
|
{
|
|
printf("%ld\n", f(15));
|
|
return 0;
|
|
-}
|
|
+}
|
|
\ No newline at end of file
|
|
|
|
commit ccf97b9878189c40a981da50b15713bb80a35755326320ec80900caf22ced46f
|
|
Author: Thomas Rast <trast@student.ethz.ch>
|
|
Date: Thu Feb 28 10:45:16 2013 +0100
|
|
|
|
touch both functions
|
|
|
|
diff --git a/a.c b/a.c
|
|
index 7a296b9..75c0119 100644
|
|
--- a/a.c
|
|
+++ b/a.c
|
|
@@ -17,5 +17,5 @@ int f(int x)
|
|
int main ()
|
|
{
|
|
- printf("%d\n", f(15));
|
|
+ printf("%ld\n", f(15));
|
|
return 0;
|
|
}
|
|
|
|
commit 1dd7e9b2b1699324b53b341e728653b913bc192a14dfea168c5b51f2b3d03592
|
|
Author: Thomas Rast <trast@student.ethz.ch>
|
|
Date: Thu Feb 28 10:44:48 2013 +0100
|
|
|
|
initial
|
|
|
|
diff --git a/a.c b/a.c
|
|
new file mode 100644
|
|
index 0000000..9f550c3
|
|
--- /dev/null
|
|
+++ b/a.c
|
|
@@ -0,0 +16,5 @@
|
|
+int main ()
|
|
+{
|
|
+ printf("%d\n", f(15));
|
|
+ return 0;
|
|
+}
|