t / t4008-diff-break-rewrite.shon commit Documentation/everyday: match undefline with the text (f3f38c7)
   1#!/bin/sh
   2#
   3# Copyright (c) 2005 Junio C Hamano
   4#
   5
   6test_description='Break and then rename
   7
   8We have two very different files, file0 and file1, registered in a tree.
   9
  10We update file1 so drastically that it is more similar to file0, and
  11then remove file0.  With -B, changes to file1 should be broken into
  12separate delete and create, resulting in removal of file0, removal of
  13original file1 and creation of completely rewritten file1.
  14
  15Further, with -B and -M together, these three modifications should
  16turn into rename-edit of file0 into file1.
  17
  18Starting from the same two files in the tree, we swap file0 and file1.
  19With -B, this should be detected as two complete rewrites, resulting in
  20four changes in total.
  21
  22Further, with -B and -M together, these should turn into two renames.
  23'
  24. ./test-lib.sh
  25. "$TEST_DIRECTORY"/diff-lib.sh ;# test-lib chdir's into trash
  26
  27test_expect_success \
  28    setup \
  29    'cat "$TEST_DIRECTORY"/../README >file0 &&
  30     cat "$TEST_DIRECTORY"/../COPYING >file1 &&
  31    git update-index --add file0 file1 &&
  32    tree=$(git write-tree) &&
  33    echo "$tree"'
  34
  35test_expect_success \
  36    'change file1 with copy-edit of file0 and remove file0' \
  37    'sed -e "s/git/GIT/" file0 >file1 &&
  38     rm -f file0 &&
  39    git update-index --remove file0 file1'
  40
  41test_expect_success \
  42    'run diff with -B' \
  43    'git diff-index -B --cached "$tree" >current'
  44
  45cat >expected <<\EOF
  46:100644 000000 f5deac7be59e7eeab8657fd9ae706fd6a57daed2 0000000000000000000000000000000000000000 D      file0
  47:100644 100644 6ff87c4664981e4397625791c8ea3bbb5f2279a3 11e331465a89c394dc25c780de230043750c1ec8 M100   file1
  48EOF
  49
  50test_expect_success \
  51    'validate result of -B (#1)' \
  52    'compare_diff_raw expected current'
  53
  54test_expect_success \
  55    'run diff with -B and -M' \
  56    'git diff-index -B -M "$tree" >current'
  57
  58cat >expected <<\EOF
  59:100644 100644 f5deac7be59e7eeab8657fd9ae706fd6a57daed2 08bb2fb671deff4c03a4d4a0a1315dff98d5732c R100   file0   file1
  60EOF
  61
  62test_expect_success \
  63    'validate result of -B -M (#2)' \
  64    'compare_diff_raw expected current'
  65
  66test_expect_success \
  67    'swap file0 and file1' \
  68    'rm -f file0 file1 &&
  69     git read-tree -m $tree &&
  70     git checkout-index -f -u -a &&
  71     mv file0 tmp &&
  72     mv file1 file0 &&
  73     mv tmp file1 &&
  74     git update-index file0 file1'
  75
  76test_expect_success \
  77    'run diff with -B' \
  78    'git diff-index -B "$tree" >current'
  79
  80cat >expected <<\EOF
  81:100644 100644 f5deac7be59e7eeab8657fd9ae706fd6a57daed2 6ff87c4664981e4397625791c8ea3bbb5f2279a3 M100   file0
  82:100644 100644 6ff87c4664981e4397625791c8ea3bbb5f2279a3 f5deac7be59e7eeab8657fd9ae706fd6a57daed2 M100   file1
  83EOF
  84
  85test_expect_success \
  86    'validate result of -B (#3)' \
  87    'compare_diff_raw expected current'
  88
  89test_expect_success \
  90    'run diff with -B and -M' \
  91    'git diff-index -B -M "$tree" >current'
  92
  93cat >expected <<\EOF
  94:100644 100644 6ff87c4664981e4397625791c8ea3bbb5f2279a3 6ff87c4664981e4397625791c8ea3bbb5f2279a3 R100   file1   file0
  95:100644 100644 f5deac7be59e7eeab8657fd9ae706fd6a57daed2 f5deac7be59e7eeab8657fd9ae706fd6a57daed2 R100   file0   file1
  96EOF
  97
  98test_expect_success \
  99    'validate result of -B -M (#4)' \
 100    'compare_diff_raw expected current'
 101
 102test_expect_success \
 103    'make file0 into something completely different' \
 104    'rm -f file0 &&
 105     test_ln_s_add frotz file0 &&
 106     git update-index file1'
 107
 108test_expect_success \
 109    'run diff with -B' \
 110    'git diff-index -B "$tree" >current'
 111
 112cat >expected <<\EOF
 113:100644 120000 f5deac7be59e7eeab8657fd9ae706fd6a57daed2 67be421f88824578857624f7b3dc75e99a8a1481 T      file0
 114:100644 100644 6ff87c4664981e4397625791c8ea3bbb5f2279a3 f5deac7be59e7eeab8657fd9ae706fd6a57daed2 M100   file1
 115EOF
 116
 117test_expect_success \
 118    'validate result of -B (#5)' \
 119    'compare_diff_raw expected current'
 120
 121test_expect_success \
 122    'run diff with -B -M' \
 123    'git diff-index -B -M "$tree" >current'
 124
 125# file0 changed from regular to symlink.  file1 is very close to the preimage of file0.
 126# because we break file0, file1 can become a rename of it.
 127cat >expected <<\EOF
 128:100644 120000 f5deac7be59e7eeab8657fd9ae706fd6a57daed2 67be421f88824578857624f7b3dc75e99a8a1481 T      file0
 129:100644 100644 6ff87c4664981e4397625791c8ea3bbb5f2279a3 f5deac7be59e7eeab8657fd9ae706fd6a57daed2 R      file0   file1
 130EOF
 131
 132test_expect_success \
 133    'validate result of -B -M (#6)' \
 134    'compare_diff_raw expected current'
 135
 136test_expect_success \
 137    'run diff with -M' \
 138    'git diff-index -M "$tree" >current'
 139
 140# This should not mistake file0 as the copy source of new file1
 141# due to type differences.
 142cat >expected <<\EOF
 143:100644 120000 f5deac7be59e7eeab8657fd9ae706fd6a57daed2 67be421f88824578857624f7b3dc75e99a8a1481 T      file0
 144:100644 100644 6ff87c4664981e4397625791c8ea3bbb5f2279a3 f5deac7be59e7eeab8657fd9ae706fd6a57daed2 M      file1
 145EOF
 146
 147test_expect_success \
 148    'validate result of -M (#7)' \
 149    'compare_diff_raw expected current'
 150
 151test_expect_success \
 152    'file1 edited to look like file0 and file0 rename-edited to file2' \
 153    'rm -f file0 file1 &&
 154     git read-tree -m $tree &&
 155     git checkout-index -f -u -a &&
 156     sed -e "s/git/GIT/" file0 >file1 &&
 157     sed -e "s/git/GET/" file0 >file2 &&
 158     rm -f file0 &&
 159     git update-index --add --remove file0 file1 file2'
 160
 161test_expect_success \
 162    'run diff with -B' \
 163    'git diff-index -B "$tree" >current'
 164
 165cat >expected <<\EOF
 166:100644 000000 f5deac7be59e7eeab8657fd9ae706fd6a57daed2 0000000000000000000000000000000000000000 D      file0
 167:100644 100644 6ff87c4664981e4397625791c8ea3bbb5f2279a3 08bb2fb671deff4c03a4d4a0a1315dff98d5732c M100   file1
 168:000000 100644 0000000000000000000000000000000000000000 f5deac7be59e7eeab8657fd9ae706fd6a57daed2 A      file2
 169EOF
 170
 171test_expect_success \
 172    'validate result of -B (#8)' \
 173    'compare_diff_raw expected current'
 174
 175test_expect_success \
 176    'run diff with -B -C' \
 177    'git diff-index -B -C "$tree" >current'
 178
 179cat >expected <<\EOF
 180:100644 100644 f5deac7be59e7eeab8657fd9ae706fd6a57daed2 08bb2fb671deff4c03a4d4a0a1315dff98d5732c C095   file0   file1
 181:100644 100644 f5deac7be59e7eeab8657fd9ae706fd6a57daed2 59f832e5c8b3f7e486be15ad0cd3e95ba9af8998 R095   file0   file2
 182EOF
 183
 184test_expect_success \
 185    'validate result of -B -M (#9)' \
 186    'compare_diff_raw expected current'
 187
 188test_done