1#!/bin/sh
   2test_description='external diff interface test'
   4. ./test-lib.sh
   6_z40=0000000000000000000000000000000000000000
   8test_expect_success setup '
  10        test_tick &&
  12        echo initial >file &&
  13        git add file &&
  14        git commit -m initial &&
  15        test_tick &&
  17        echo second >file &&
  18        git add file &&
  19        git commit -m second &&
  20        test_tick &&
  22        echo third >file
  23'
  24test_expect_success 'GIT_EXTERNAL_DIFF environment' '
  26        GIT_EXTERNAL_DIFF=echo git diff | {
  28                read path oldfile oldhex oldmode newfile newhex newmode &&
  29                test "z$path" = zfile &&
  30                test "z$oldmode" = z100644 &&
  31                test "z$newhex" = "z$_z40" &&
  32                test "z$newmode" = z100644 &&
  33                oh=$(git rev-parse --verify HEAD:file) &&
  34                test "z$oh" = "z$oldhex"
  35        }
  36'
  38test_expect_success 'GIT_EXTERNAL_DIFF environment should apply only to diff' '
  40        GIT_EXTERNAL_DIFF=echo git log -p -1 HEAD |
  42        grep "^diff --git a/file b/file"
  43'
  45test_expect_success 'GIT_EXTERNAL_DIFF environment and --no-ext-diff' '
  47        GIT_EXTERNAL_DIFF=echo git diff --no-ext-diff |
  49        grep "^diff --git a/file b/file"
  50'
  52test_expect_success 'diff attribute' '
  54        git config diff.parrot.command echo &&
  56        echo >.gitattributes "file diff=parrot" &&
  58        git diff | {
  60                read path oldfile oldhex oldmode newfile newhex newmode &&
  61                test "z$path" = zfile &&
  62                test "z$oldmode" = z100644 &&
  63                test "z$newhex" = "z$_z40" &&
  64                test "z$newmode" = z100644 &&
  65                oh=$(git rev-parse --verify HEAD:file) &&
  66                test "z$oh" = "z$oldhex"
  67        }
  68'
  70test_expect_success 'diff attribute should apply only to diff' '
  72        git log -p -1 HEAD |
  74        grep "^diff --git a/file b/file"
  75'
  77test_expect_success 'diff attribute and --no-ext-diff' '
  79        git diff --no-ext-diff |
  81        grep "^diff --git a/file b/file"
  82'
  84test_expect_success 'diff attribute' '
  86        git config --unset diff.parrot.command &&
  88        git config diff.color.command echo &&
  89        echo >.gitattributes "file diff=color" &&
  91        git diff | {
  93                read path oldfile oldhex oldmode newfile newhex newmode &&
  94                test "z$path" = zfile &&
  95                test "z$oldmode" = z100644 &&
  96                test "z$newhex" = "z$_z40" &&
  97                test "z$newmode" = z100644 &&
  98                oh=$(git rev-parse --verify HEAD:file) &&
  99                test "z$oh" = "z$oldhex"
 100        }
 101'
 103test_expect_success 'diff attribute should apply only to diff' '
 105        git log -p -1 HEAD |
 107        grep "^diff --git a/file b/file"
 108'
 110test_expect_success 'diff attribute and --no-ext-diff' '
 112        git diff --no-ext-diff |
 114        grep "^diff --git a/file b/file"
 115'
 117test_expect_success 'no diff with -diff' '
 119        echo >.gitattributes "file -diff" &&
 120        git diff | grep Binary
 121'
 122echo NULZbetweenZwords | perl -pe 'y/Z/\000/' > file
 124test_expect_success 'force diff with "diff"' '
 126        echo >.gitattributes "file diff" &&
 127        git diff >actual &&
 128        test_cmp "$TEST_DIRECTORY"/t4020/diff.NUL actual
 129'
 130test_expect_success 'GIT_EXTERNAL_DIFF with more than one changed files' '
 132        echo anotherfile > file2 &&
 133        git add file2 &&
 134        git commit -m "added 2nd file" &&
 135        echo modified >file2 &&
 136        GIT_EXTERNAL_DIFF=echo git diff
 137'
 138test_done