Skip to content

Commit

Permalink
t4211: fix broken test when one -L range is subset of another
Browse files Browse the repository at this point in the history
t4211 attempts to test multiple git-log -L ranges where one range is a
superset of the other, and falsely succeeds because its "expected"
output is incorrect.

Overlapping -L ranges handed to git-log are coalesced by
line-log.c:sort_and_merge_range_set() into a set of non-overlapping,
disjoint ranges. When one range is a subset of another,
sort_and_merge_range_set() should coalesce both ranges to the superset
range, but instead the coalesced range often is incorrectly truncated to
the end of the subset range. For example, ranges 2-8 and 3-4 are
coalesced incorrectly to 2-4.

One can observe this incorrect behavior with git-log -L using the test
repository created by t4211. The superset/subset ranges t4211 employs
are 4-$ and 8-12 (where $ represents end-of-file). The coalesced range
should be 4-$. Manually invoking git-log with the same ranges the test
employs, we see:

  % git log -L 4:a.c simple |
    awk '/^commit [0-9a-f]{40}/ { print substr($2,1,7) }'
  4659538
  100b61a
  39b6eb2
  a6eb826
  f04fb20
  de4c48a

  % git log -L 8,12:a.c simple | awk ...
  f04fb20
  de4c48a

  % git log -L 4:a.c -L 8,12:a.c simple | awk ...
  a6eb826
  f04fb20
  de4c48a

This last output is incorrect. 8-12 is a subset of 4-$, hence the output
of the coalesced range should be the same as the 4-$ output shown first.
In fact, the above incorrect output is the truncated bogus range 4-12:

  % git log -L 4,12:a.c simple | awk ...
  a6eb826
  f04fb20
  de4c48a

Fix the test to correctly fail in the presence of the
sort_and_merge_range_set() coalescing bug. Do so by changing the
"expected" output to the commits mentioned in the 4-$ output above.

Signed-off-by: Eric Sunshine <sunshine@sunshineco.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Eric Sunshine authored and Junio C Hamano committed Jul 9, 2013
1 parent 1ddac3f commit 18d472d
Show file tree
Hide file tree
Showing 2 changed files with 133 additions and 5 deletions.
4 changes: 2 additions & 2 deletions t/t4211-line-log.sh
Original file line number Diff line number Diff line change
Expand Up @@ -50,8 +50,8 @@ canned_test "-M -L ':f:b.c' parallel-change" parallel-change-f-to-main
canned_test "-L 4,12:a.c -L :main:a.c simple" multiple
canned_test "-L 4,18:a.c -L :main:a.c simple" multiple-overlapping
canned_test "-L :main:a.c -L 4,18:a.c simple" multiple-overlapping
canned_test "-L 4:a.c -L 8,12:a.c simple" multiple-superset
canned_test "-L 8,12:a.c -L 4:a.c simple" multiple-superset
canned_test_failure "-L 4:a.c -L 8,12:a.c simple" multiple-superset
canned_test_failure "-L 8,12:a.c -L 4:a.c simple" multiple-superset

test_bad_opts "-L" "switch.*requires a value"
test_bad_opts "-L b.c" "argument.*not of the form"
Expand Down
134 changes: 131 additions & 3 deletions t/t4211/expect.multiple-superset
Original file line number Diff line number Diff line change
@@ -1,3 +1,100 @@
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
--- 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
--- 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
--- 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
Expand All @@ -7,7 +104,7 @@ Date: Thu Feb 28 10:45:16 2013 +0100
diff --git a/a.c b/a.c
--- a/a.c
+++ b/a.c
@@ -3,9 +3,9 @@
@@ -3,19 +3,19 @@
-int f(int x)
+long f(long x)
{
Expand All @@ -18,6 +115,17 @@ diff --git a/a.c b/a.c
}
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>
Expand All @@ -28,7 +136,7 @@ Date: Thu Feb 28 10:44:55 2013 +0100
diff --git a/a.c b/a.c
--- a/a.c
+++ b/a.c
@@ -3,8 +3,9 @@
@@ -3,18 +3,19 @@
int f(int x)
{
int s = 0;
Expand All @@ -38,6 +146,16 @@ diff --git a/a.c b/a.c
}
+ return s;
}

/*
* A comment.
*/

int main ()
{
printf("%d\n", f(15));
return 0;
}

commit de4c48ae814792c02a49c4c3c0c757ae69c55f6a
Author: Thomas Rast <trast@student.ethz.ch>
Expand All @@ -48,7 +166,7 @@ Date: Thu Feb 28 10:44:48 2013 +0100
diff --git a/a.c b/a.c
--- /dev/null
+++ b/a.c
@@ -0,0 +3,8 @@
@@ -0,0 +3,18 @@
+int f(int x)
+{
+ int s = 0;
Expand All @@ -57,3 +175,13 @@ diff --git a/a.c b/a.c
+ s++;
+ }
+}
+
+/*
+ * A comment.
+ */
+
+int main ()
+{
+ printf("%d\n", f(15));
+ return 0;
+}

0 comments on commit 18d472d

Please sign in to comment.