t / t4151-am-abort.shon commit t4208: abstract away SHA-1-specific constants (0b2c4af)
   1#!/bin/sh
   2
   3test_description='am --abort'
   4
   5. ./test-lib.sh
   6
   7test_expect_success setup '
   8        for i in a b c d e f g
   9        do
  10                echo $i
  11        done >file-1 &&
  12        cp file-1 file-2 &&
  13        test_tick &&
  14        git add file-1 file-2 &&
  15        git commit -m initial &&
  16        git tag initial &&
  17        git format-patch --stdout --root initial >initial.patch &&
  18        for i in 2 3 4 5 6
  19        do
  20                echo $i >>file-1 &&
  21                echo $i >otherfile-$i &&
  22                git add otherfile-$i &&
  23                test_tick &&
  24                git commit -a -m $i || return 1
  25        done &&
  26        git format-patch --no-numbered initial &&
  27        git checkout -b side initial &&
  28        echo local change >file-2-expect
  29'
  30
  31for with3 in '' ' -3'
  32do
  33        test_expect_success "am$with3 stops at a patch that does not apply" '
  34
  35                git reset --hard initial &&
  36                cp file-2-expect file-2 &&
  37
  38                test_must_fail git am$with3 000[1245]-*.patch &&
  39                git log --pretty=tformat:%s >actual &&
  40                for i in 3 2 initial
  41                do
  42                        echo $i
  43                done >expect &&
  44                test_cmp expect actual
  45        '
  46
  47        test_expect_success "am$with3 --skip continue after failed am$with3" '
  48                test_must_fail git am$with3 --skip >output &&
  49                test_i18ngrep "^Applying: 6$" output &&
  50                test_cmp file-2-expect file-2 &&
  51                test ! -f .git/MERGE_RR
  52        '
  53
  54        test_expect_success "am --abort goes back after failed am$with3" '
  55                git am --abort &&
  56                git rev-parse HEAD >actual &&
  57                git rev-parse initial >expect &&
  58                test_cmp expect actual &&
  59                test_cmp file-2-expect file-2 &&
  60                git diff-index --exit-code --cached HEAD &&
  61                test ! -f .git/MERGE_RR
  62        '
  63
  64done
  65
  66test_expect_success 'am -3 --skip removes otherfile-4' '
  67        git reset --hard initial &&
  68        test_must_fail git am -3 0003-*.patch &&
  69        test 3 -eq $(git ls-files -u | wc -l) &&
  70        test 4 = "$(cat otherfile-4)" &&
  71        git am --skip &&
  72        test_cmp_rev initial HEAD &&
  73        test -z "$(git ls-files -u)" &&
  74        test_path_is_missing otherfile-4
  75'
  76
  77test_expect_success 'am -3 --abort removes otherfile-4' '
  78        git reset --hard initial &&
  79        test_must_fail git am -3 0003-*.patch &&
  80        test 3 -eq $(git ls-files -u | wc -l) &&
  81        test 4 = "$(cat otherfile-4)" &&
  82        git am --abort &&
  83        test_cmp_rev initial HEAD &&
  84        test -z "$(git ls-files -u)" &&
  85        test_path_is_missing otherfile-4
  86'
  87
  88test_expect_success 'am --abort will keep the local commits intact' '
  89        test_must_fail git am 0004-*.patch &&
  90        test_commit unrelated &&
  91        git rev-parse HEAD >expect &&
  92        git am --abort &&
  93        git rev-parse HEAD >actual &&
  94        test_cmp expect actual
  95'
  96
  97test_expect_success 'am --abort will keep dirty index intact' '
  98        git reset --hard initial &&
  99        echo dirtyfile >dirtyfile &&
 100        cp dirtyfile dirtyfile.expected &&
 101        git add dirtyfile &&
 102        test_must_fail git am 0001-*.patch &&
 103        test_cmp_rev initial HEAD &&
 104        test_path_is_file dirtyfile &&
 105        test_cmp dirtyfile.expected dirtyfile &&
 106        git am --abort &&
 107        test_cmp_rev initial HEAD &&
 108        test_path_is_file dirtyfile &&
 109        test_cmp dirtyfile.expected dirtyfile
 110'
 111
 112test_expect_success 'am -3 stops on conflict on unborn branch' '
 113        git checkout -f --orphan orphan &&
 114        git reset &&
 115        rm -f otherfile-4 &&
 116        test_must_fail git am -3 0003-*.patch &&
 117        test 2 -eq $(git ls-files -u | wc -l) &&
 118        test 4 = "$(cat otherfile-4)"
 119'
 120
 121test_expect_success 'am -3 --skip clears index on unborn branch' '
 122        test_path_is_dir .git/rebase-apply &&
 123        echo tmpfile >tmpfile &&
 124        git add tmpfile &&
 125        git am --skip &&
 126        test -z "$(git ls-files)" &&
 127        test_path_is_missing otherfile-4 &&
 128        test_path_is_missing tmpfile
 129'
 130
 131test_expect_success 'am -3 --abort removes otherfile-4 on unborn branch' '
 132        git checkout -f --orphan orphan &&
 133        git reset &&
 134        rm -f otherfile-4 file-1 &&
 135        test_must_fail git am -3 0003-*.patch &&
 136        test 2 -eq $(git ls-files -u | wc -l) &&
 137        test 4 = "$(cat otherfile-4)" &&
 138        git am --abort &&
 139        test -z "$(git ls-files -u)" &&
 140        test_path_is_missing otherfile-4
 141'
 142
 143test_expect_success 'am -3 --abort on unborn branch removes applied commits' '
 144        git checkout -f --orphan orphan &&
 145        git reset &&
 146        rm -f otherfile-4 otherfile-2 file-1 file-2 &&
 147        test_must_fail git am -3 initial.patch 0003-*.patch &&
 148        test 3 -eq $(git ls-files -u | wc -l) &&
 149        test 4 = "$(cat otherfile-4)" &&
 150        git am --abort &&
 151        test -z "$(git ls-files -u)" &&
 152        test_path_is_missing otherfile-4 &&
 153        test_path_is_missing file-1 &&
 154        test_path_is_missing file-2 &&
 155        test 0 -eq $(git log --oneline 2>/dev/null | wc -l) &&
 156        test refs/heads/orphan = "$(git symbolic-ref HEAD)"
 157'
 158
 159test_expect_success 'am --abort on unborn branch will keep local commits intact' '
 160        git checkout -f --orphan orphan &&
 161        git reset &&
 162        test_must_fail git am 0004-*.patch &&
 163        test_commit unrelated2 &&
 164        git rev-parse HEAD >expect &&
 165        git am --abort &&
 166        git rev-parse HEAD >actual &&
 167        test_cmp expect actual
 168'
 169
 170test_expect_success 'am --skip leaves index stat info alone' '
 171        git checkout -f --orphan skip-stat-info &&
 172        git reset &&
 173        test_commit skip-should-be-untouched &&
 174        test-tool chmtime =0 skip-should-be-untouched.t &&
 175        git update-index --refresh &&
 176        git diff-files --exit-code --quiet &&
 177        test_must_fail git am 0001-*.patch &&
 178        git am --skip &&
 179        git diff-files --exit-code --quiet
 180'
 181
 182test_expect_success 'am --abort leaves index stat info alone' '
 183        git checkout -f --orphan abort-stat-info &&
 184        git reset &&
 185        test_commit abort-should-be-untouched &&
 186        test-tool chmtime =0 abort-should-be-untouched.t &&
 187        git update-index --refresh &&
 188        git diff-files --exit-code --quiet &&
 189        test_must_fail git am 0001-*.patch &&
 190        git am --abort &&
 191        git diff-files --exit-code --quiet
 192'
 193
 194test_done