| #!/bin/sh |
| |
| test_description='git blame with specific diff algorithm' |
| |
| . ./test-lib.sh |
| |
| test_expect_success setup ' |
| cat >file.c <<-\EOF && |
| int f(int x, int y) |
| { |
| if (x == 0) |
| { |
| return y; |
| } |
| return x; |
| } |
| |
| int g(size_t u) |
| { |
| while (u < 30) |
| { |
| u++; |
| } |
| return u; |
| } |
| EOF |
| test_write_lines x x x x >file.txt && |
| git add file.c file.txt && |
| GIT_AUTHOR_NAME=Commit_1 git commit -m Commit_1 && |
| |
| cat >file.c <<-\EOF && |
| int g(size_t u) |
| { |
| while (u < 30) |
| { |
| u++; |
| } |
| return u; |
| } |
| |
| int h(int x, int y, int z) |
| { |
| if (z == 0) |
| { |
| return x; |
| } |
| return y; |
| } |
| EOF |
| test_write_lines x x x A B C D x E F G >file.txt && |
| git add file.c file.txt && |
| GIT_AUTHOR_NAME=Commit_2 git commit -m Commit_2 |
| ' |
| |
| test_expect_success 'blame uses Myers diff algorithm by default' ' |
| cat >expected <<-\EOF && |
| Commit_2 int g(size_t u) |
| Commit_1 { |
| Commit_2 while (u < 30) |
| Commit_1 { |
| Commit_2 u++; |
| Commit_1 } |
| Commit_2 return u; |
| Commit_1 } |
| Commit_1 |
| Commit_2 int h(int x, int y, int z) |
| Commit_1 { |
| Commit_2 if (z == 0) |
| Commit_1 { |
| Commit_2 return x; |
| Commit_1 } |
| Commit_2 return y; |
| Commit_1 } |
| EOF |
| |
| git blame file.c >output && |
| sed -e "s/^[^ ]* (\([^ ]*\) [^)]*)/\1/g" output >without_varying_parts && |
| sed -e "s/ *$//g" without_varying_parts >actual && |
| test_cmp expected actual |
| ' |
| |
| test_expect_success 'blame honors --diff-algorithm option' ' |
| cat >expected <<-\EOF && |
| Commit_1 int g(size_t u) |
| Commit_1 { |
| Commit_1 while (u < 30) |
| Commit_1 { |
| Commit_1 u++; |
| Commit_1 } |
| Commit_1 return u; |
| Commit_1 } |
| Commit_2 |
| Commit_2 int h(int x, int y, int z) |
| Commit_2 { |
| Commit_2 if (z == 0) |
| Commit_2 { |
| Commit_2 return x; |
| Commit_2 } |
| Commit_2 return y; |
| Commit_2 } |
| EOF |
| |
| git blame file.c --diff-algorithm histogram >output && |
| sed -e "s/^[^ ]* (\([^ ]*\) [^)]*)/\1/g" output >without_varying_parts && |
| sed -e "s/ *$//g" without_varying_parts >actual && |
| test_cmp expected actual |
| ' |
| |
| test_expect_success 'blame honors diff.algorithm config variable' ' |
| cat >expected <<-\EOF && |
| Commit_1 int g(size_t u) |
| Commit_1 { |
| Commit_1 while (u < 30) |
| Commit_1 { |
| Commit_1 u++; |
| Commit_1 } |
| Commit_1 return u; |
| Commit_1 } |
| Commit_2 |
| Commit_2 int h(int x, int y, int z) |
| Commit_2 { |
| Commit_2 if (z == 0) |
| Commit_2 { |
| Commit_2 return x; |
| Commit_2 } |
| Commit_2 return y; |
| Commit_2 } |
| EOF |
| |
| git -c diff.algorithm=histogram blame file.c >output && |
| sed -e "s/^[^ ]* (\([^ ]*\) [^)]*)/\1/g" \ |
| -e "s/ *$//g" output >actual && |
| test_cmp expected actual |
| ' |
| |
| test_expect_success 'blame gives priority to --diff-algorithm over diff.algorithm' ' |
| cat >expected <<-\EOF && |
| Commit_1 int g(size_t u) |
| Commit_1 { |
| Commit_1 while (u < 30) |
| Commit_1 { |
| Commit_1 u++; |
| Commit_1 } |
| Commit_1 return u; |
| Commit_1 } |
| Commit_2 |
| Commit_2 int h(int x, int y, int z) |
| Commit_2 { |
| Commit_2 if (z == 0) |
| Commit_2 { |
| Commit_2 return x; |
| Commit_2 } |
| Commit_2 return y; |
| Commit_2 } |
| EOF |
| |
| git -c diff.algorithm=myers blame file.c --diff-algorithm histogram >output && |
| sed -e "s/^[^ ]* (\([^ ]*\) [^)]*)/\1/g" \ |
| -e "s/ *$//g" output >actual && |
| test_cmp expected actual |
| ' |
| |
| test_expect_success 'blame honors --minimal option' ' |
| cat >expected <<-\EOF && |
| Commit_1 x |
| Commit_1 x |
| Commit_1 x |
| Commit_2 A |
| Commit_2 B |
| Commit_2 C |
| Commit_2 D |
| Commit_1 x |
| Commit_2 E |
| Commit_2 F |
| Commit_2 G |
| EOF |
| |
| git blame file.txt --minimal >output && |
| sed -e "s/^[^ ]* (\([^ ]*\) [^)]*)/\1/g" output >actual && |
| test_cmp expected actual |
| ' |
| |
| test_expect_success 'blame respects the order of diff options' ' |
| cat >expected <<-\EOF && |
| Commit_1 x |
| Commit_1 x |
| Commit_1 x |
| Commit_2 A |
| Commit_2 B |
| Commit_2 C |
| Commit_2 D |
| Commit_2 x |
| Commit_2 E |
| Commit_2 F |
| Commit_2 G |
| EOF |
| |
| git blame file.txt --minimal --diff-algorithm myers >output && |
| sed -e "s/^[^ ]* (\([^ ]*\) [^)]*)/\1/g" output >actual && |
| test_cmp expected actual |
| ' |
| |
| test_done |