t / t9814-git-p4-rename.shon commit pack-objects: document about thread synchronization (ffbd51c)
   1#!/bin/sh
   2
   3test_description='git p4 rename'
   4
   5. ./lib-git-p4.sh
   6
   7test_expect_success 'start p4d' '
   8        start_p4d
   9'
  10
  11# We rely on this behavior to detect for p4 move availability.
  12test_expect_success 'p4 help unknown returns 1' '
  13        (
  14                cd "$cli" &&
  15                (
  16                        p4 help client >errs 2>&1
  17                        echo $? >retval
  18                )
  19                echo 0 >expected &&
  20                test_cmp expected retval &&
  21                rm retval &&
  22                (
  23                        p4 help nosuchcommand >errs 2>&1
  24                        echo $? >retval
  25                )
  26                echo 1 >expected &&
  27                test_cmp expected retval &&
  28                rm retval
  29        )
  30'
  31
  32test_expect_success 'create files' '
  33        (
  34                cd "$cli" &&
  35                p4 client -o | sed "/LineEnd/s/:.*/:unix/" | p4 client -i &&
  36                cat >file1 <<-EOF &&
  37                A large block of text
  38                in file1 that will generate
  39                enough context so that rename
  40                and copy detection will find
  41                something interesting to do.
  42                EOF
  43                cat >file2 <<-EOF &&
  44                /*
  45                 * This blob looks a bit
  46                 * different.
  47                 */
  48                int main(int argc, char **argv)
  49                {
  50                        char text[200];
  51
  52                        strcpy(text, "copy/rename this");
  53                        printf("text is %s\n", text);
  54                        return 0;
  55                }
  56                EOF
  57                p4 add file1 file2 &&
  58                p4 submit -d "add files"
  59        )
  60'
  61
  62# Rename a file and confirm that rename is not detected in P4.
  63# Rename the new file again with detectRenames option enabled and confirm that
  64# this is detected in P4.
  65# Rename the new file again adding an extra line, configure a big threshold in
  66# detectRenames and confirm that rename is not detected in P4.
  67# Repeat, this time with a smaller threshold and confirm that the rename is
  68# detected in P4.
  69test_expect_success 'detect renames' '
  70        git p4 clone --dest="$git" //depot@all &&
  71        test_when_finished cleanup_git &&
  72        (
  73                cd "$git" &&
  74                git config git-p4.skipSubmitEdit true &&
  75
  76                git mv file1 file4 &&
  77                git commit -a -m "Rename file1 to file4" &&
  78                git diff-tree -r -M HEAD &&
  79                git p4 submit &&
  80                p4 filelog //depot/file4 >filelog &&
  81                ! grep " from //depot" filelog &&
  82
  83                git mv file4 file5 &&
  84                git commit -a -m "Rename file4 to file5" &&
  85                git diff-tree -r -M HEAD &&
  86                git config git-p4.detectRenames true &&
  87                git p4 submit &&
  88                p4 filelog //depot/file5 >filelog &&
  89                grep " from //depot/file4" filelog &&
  90
  91                git mv file5 file6 &&
  92                echo update >>file6 &&
  93                git add file6 &&
  94                git commit -a -m "Rename file5 to file6 with changes" &&
  95                git diff-tree -r -M HEAD &&
  96                level=$(git diff-tree -r -M HEAD | sed 1d | cut -f1 | cut -d" " -f5 | sed "s/R0*//") &&
  97                test -n "$level" && test "$level" -gt 0 && test "$level" -lt 98 &&
  98                git config git-p4.detectRenames $(($level + 2)) &&
  99                git p4 submit &&
 100                p4 filelog //depot/file6 >filelog &&
 101                ! grep " from //depot" filelog &&
 102
 103                git mv file6 file7 &&
 104                echo update >>file7 &&
 105                git add file7 &&
 106                git commit -a -m "Rename file6 to file7 with changes" &&
 107                git diff-tree -r -M HEAD &&
 108                level=$(git diff-tree -r -M HEAD | sed 1d | cut -f1 | cut -d" " -f5 | sed "s/R0*//") &&
 109                test -n "$level" && test "$level" -gt 2 && test "$level" -lt 100 &&
 110                git config git-p4.detectRenames $(($level - 2)) &&
 111                git p4 submit &&
 112                p4 filelog //depot/file7 >filelog &&
 113                grep " from //depot/file6" filelog
 114        )
 115'
 116
 117# Copy a file and confirm that copy is not detected in P4.
 118# Copy a file with detectCopies option enabled and confirm that copy is not
 119# detected in P4.
 120# Modify and copy a file with detectCopies option enabled and confirm that copy
 121# is detected in P4.
 122# Copy a file with detectCopies and detectCopiesHarder options enabled and
 123# confirm that copy is detected in P4.
 124# Modify and copy a file, configure a bigger threshold in detectCopies and
 125# confirm that copy is not detected in P4.
 126# Modify and copy a file, configure a smaller threshold in detectCopies and
 127# confirm that copy is detected in P4.
 128test_expect_success 'detect copies' '
 129        git p4 clone --dest="$git" //depot@all &&
 130        test_when_finished cleanup_git &&
 131        (
 132                cd "$git" &&
 133                git config git-p4.skipSubmitEdit true &&
 134
 135                echo "file8" >>file2 &&
 136                git commit -a -m "Differentiate file2" &&
 137                git p4 submit &&
 138                cp file2 file8 &&
 139                git add file8 &&
 140                git commit -a -m "Copy file2 to file8" &&
 141                git diff-tree -r -C HEAD &&
 142                git p4 submit &&
 143                p4 filelog //depot/file8 &&
 144                ! p4 filelog //depot/file8 | grep -q "branch from" &&
 145
 146                echo "file9" >>file2 &&
 147                git commit -a -m "Differentiate file2" &&
 148                git p4 submit &&
 149
 150                cp file2 file9 &&
 151                git add file9 &&
 152                git commit -a -m "Copy file2 to file9" &&
 153                git diff-tree -r -C HEAD &&
 154                git config git-p4.detectCopies true &&
 155                git p4 submit &&
 156                p4 filelog //depot/file9 &&
 157                ! p4 filelog //depot/file9 | grep -q "branch from" &&
 158
 159                echo "file10" >>file2 &&
 160                git commit -a -m "Differentiate file2" &&
 161                git p4 submit &&
 162
 163                echo "file2" >>file2 &&
 164                cp file2 file10 &&
 165                git add file2 file10 &&
 166                git commit -a -m "Modify and copy file2 to file10" &&
 167                git diff-tree -r -C HEAD &&
 168                src=$(git diff-tree -r -C HEAD | sed 1d | sed 2d | cut -f2) &&
 169                test "$src" = file2 &&
 170                git p4 submit &&
 171                p4 filelog //depot/file10 &&
 172                p4 filelog //depot/file10 | grep -q "branch from //depot/file2" &&
 173
 174                echo "file11" >>file2 &&
 175                git commit -a -m "Differentiate file2" &&
 176                git p4 submit &&
 177
 178                cp file2 file11 &&
 179                git add file11 &&
 180                git commit -a -m "Copy file2 to file11" &&
 181                git diff-tree -r -C --find-copies-harder HEAD &&
 182                src=$(git diff-tree -r -C --find-copies-harder HEAD | sed 1d | cut -f2) &&
 183                test "$src" = file2 &&
 184                git config git-p4.detectCopiesHarder true &&
 185                git p4 submit &&
 186                p4 filelog //depot/file11 &&
 187                p4 filelog //depot/file11 | grep -q "branch from //depot/file2" &&
 188
 189                echo "file12" >>file2 &&
 190                git commit -a -m "Differentiate file2" &&
 191                git p4 submit &&
 192
 193                cp file2 file12 &&
 194                echo "some text" >>file12 &&
 195                git add file12 &&
 196                git commit -a -m "Copy file2 to file12 with changes" &&
 197                git diff-tree -r -C --find-copies-harder HEAD &&
 198                level=$(git diff-tree -r -C --find-copies-harder HEAD | sed 1d | cut -f1 | cut -d" " -f5 | sed "s/C0*//") &&
 199                test -n "$level" && test "$level" -gt 0 && test "$level" -lt 98 &&
 200                src=$(git diff-tree -r -C --find-copies-harder HEAD | sed 1d | cut -f2) &&
 201                test "$src" = file2 &&
 202                git config git-p4.detectCopies $(($level + 2)) &&
 203                git p4 submit &&
 204                p4 filelog //depot/file12 &&
 205                ! p4 filelog //depot/file12 | grep -q "branch from" &&
 206
 207                echo "file13" >>file2 &&
 208                git commit -a -m "Differentiate file2" &&
 209                git p4 submit &&
 210
 211                cp file2 file13 &&
 212                echo "different text" >>file13 &&
 213                git add file13 &&
 214                git commit -a -m "Copy file2 to file13 with changes" &&
 215                git diff-tree -r -C --find-copies-harder HEAD &&
 216                level=$(git diff-tree -r -C --find-copies-harder HEAD | sed 1d | cut -f1 | cut -d" " -f5 | sed "s/C0*//") &&
 217                test -n "$level" && test "$level" -gt 2 && test "$level" -lt 100 &&
 218                src=$(git diff-tree -r -C --find-copies-harder HEAD | sed 1d | cut -f2) &&
 219                test "$src" = file2 &&
 220                git config git-p4.detectCopies $(($level - 2)) &&
 221                git p4 submit &&
 222                p4 filelog //depot/file13 &&
 223                p4 filelog //depot/file13 | grep -q "branch from //depot/file2"
 224        )
 225'
 226
 227# See if configurables can be set, and in particular if the run.move.allow
 228# variable exists, which allows admins to disable the "p4 move" command.
 229test_lazy_prereq P4D_HAVE_CONFIGURABLE_RUN_MOVE_ALLOW '
 230        p4 configure show run.move.allow >out &&
 231        egrep ^run.move.allow: out
 232'
 233
 234# If move can be disabled, turn it off and test p4 move handling
 235test_expect_success P4D_HAVE_CONFIGURABLE_RUN_MOVE_ALLOW \
 236                    'do not use p4 move when administratively disabled' '
 237        test_when_finished "p4 configure set run.move.allow=1" &&
 238        p4 configure set run.move.allow=0 &&
 239        (
 240                cd "$cli" &&
 241                echo move-disallow-file >move-disallow-file &&
 242                p4 add move-disallow-file &&
 243                p4 submit -d "add move-disallow-file"
 244        ) &&
 245        test_when_finished cleanup_git &&
 246        git p4 clone --dest="$git" //depot &&
 247        (
 248                cd "$git" &&
 249                git config git-p4.skipSubmitEdit true &&
 250                git config git-p4.detectRenames true &&
 251                git mv move-disallow-file move-disallow-file-moved &&
 252                git commit -m "move move-disallow-file" &&
 253                git p4 submit
 254        )
 255'
 256
 257test_expect_success 'kill p4d' '
 258        kill_p4d
 259'
 260
 261test_done