| #!/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 |