mirror of
https://github.com/git-for-windows/git.git
synced 2026-04-28 10:34:31 -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>
195 lines
2.6 KiB
Plaintext
195 lines
2.6 KiB
Plaintext
commit 4659538844daa2849b1a9e7d6fadb96fcd26fc83
|
|
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 0b9cae5..5de3ea4 100644
|
|
--- a/a.c
|
|
+++ b/a.c
|
|
@@ -4,19 +4,21 @@
|
|
long f(long x)
|
|
{
|
|
int s = 0;
|
|
while (x) {
|
|
x >>= 1;
|
|
s++;
|
|
}
|
|
return s;
|
|
}
|
|
|
|
/*
|
|
* This is only an example!
|
|
*/
|
|
|
|
int main ()
|
|
{
|
|
printf("%ld\n", f(15));
|
|
return 0;
|
|
-}
|
|
\ No newline at end of file
|
|
+}
|
|
+
|
|
+/* incomplete lines are bad! */
|
|
|
|
commit 100b61a6f2f720f812620a9d10afb3a960ccb73c
|
|
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 5e709a1..0b9cae5 100644
|
|
--- a/a.c
|
|
+++ b/a.c
|
|
@@ -4,19 +4,19 @@
|
|
long f(long x)
|
|
{
|
|
int s = 0;
|
|
while (x) {
|
|
x >>= 1;
|
|
s++;
|
|
}
|
|
return s;
|
|
}
|
|
|
|
/*
|
|
* This is only an example!
|
|
*/
|
|
|
|
int main ()
|
|
{
|
|
printf("%ld\n", f(15));
|
|
return 0;
|
|
-}
|
|
+}
|
|
\ No newline at end of file
|
|
|
|
commit 39b6eb2d5b706d3322184a169f666f25ed3fbd00
|
|
Author: Thomas Rast <trast@student.ethz.ch>
|
|
Date: Thu Feb 28 10:45:41 2013 +0100
|
|
|
|
touch comment
|
|
|
|
diff --git a/a.c b/a.c
|
|
index e51de13..bdb2bb1 100644
|
|
--- a/a.c
|
|
+++ b/a.c
|
|
@@ -3,19 +3,19 @@
|
|
long f(long x)
|
|
{
|
|
int s = 0;
|
|
while (x) {
|
|
x >>= 1;
|
|
s++;
|
|
}
|
|
return s;
|
|
}
|
|
|
|
/*
|
|
- * A comment.
|
|
+ * This is only an example!
|
|
*/
|
|
|
|
int main ()
|
|
{
|
|
printf("%ld\n", f(15));
|
|
return 0;
|
|
}
|
|
|
|
commit a6eb82647d5d67f893da442f8f9375fd89a3b1e2
|
|
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 3233403..e51de13 100644
|
|
--- a/a.c
|
|
+++ b/a.c
|
|
@@ -3,19 +3,19 @@
|
|
-int f(int x)
|
|
+long f(long x)
|
|
{
|
|
int s = 0;
|
|
while (x) {
|
|
x >>= 1;
|
|
s++;
|
|
}
|
|
return s;
|
|
}
|
|
|
|
/*
|
|
* A comment.
|
|
*/
|
|
|
|
int main ()
|
|
{
|
|
- printf("%d\n", f(15));
|
|
+ printf("%ld\n", f(15));
|
|
return 0;
|
|
}
|
|
|
|
commit f04fb20f2c77850996cba739709acc6faecc58f7
|
|
Author: Thomas Rast <trast@student.ethz.ch>
|
|
Date: Thu Feb 28 10:44:55 2013 +0100
|
|
|
|
change f()
|
|
|
|
diff --git a/a.c b/a.c
|
|
index 444e415..3233403 100644
|
|
--- a/a.c
|
|
+++ b/a.c
|
|
@@ -3,18 +3,19 @@
|
|
int f(int x)
|
|
{
|
|
int s = 0;
|
|
while (x) {
|
|
x >>= 1;
|
|
s++;
|
|
}
|
|
+ return s;
|
|
}
|
|
|
|
/*
|
|
* A comment.
|
|
*/
|
|
|
|
int main ()
|
|
{
|
|
printf("%d\n", f(15));
|
|
return 0;
|
|
}
|
|
|
|
commit de4c48ae814792c02a49c4c3c0c757ae69c55f6a
|
|
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..444e415
|
|
--- /dev/null
|
|
+++ b/a.c
|
|
@@ -0,0 +3,18 @@
|
|
+int f(int x)
|
|
+{
|
|
+ int s = 0;
|
|
+ while (x) {
|
|
+ x >>= 1;
|
|
+ s++;
|
|
+ }
|
|
+}
|
|
+
|
|
+/*
|
|
+ * A comment.
|
|
+ */
|
|
+
|
|
+int main ()
|
|
+{
|
|
+ printf("%d\n", f(15));
|
|
+ return 0;
|
|
+}
|