(CommandList
  children: [
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:test_description)
          op: Equal
          rhs: {(SQ <'Tests for "git reset" with "--merge" and "--keep" options'>)}
          spids: [13]
        )
      ]
      spids: [13]
    )
    (C {(.)} {(./test-lib.sh)})
    (C {(test_expect_success)} {(setup)} 
      {
        (SQ <'\n'> <'    for i in 1 2 3; do echo line $i; done >file1 &&\n'> 
          <'    cat file1 >file2 &&\n'> <'    git add file1 file2 &&\n'> <'    test_tick &&\n'> <'    git commit -m "Initial commit" &&\n'> 
          <'    git tag initial &&\n'> <'    echo line 4 >>file1 &&\n'> <'    cat file1 >file2 &&\n'> <'    test_tick &&\n'> 
          <'    git commit -m "add line 4 to file1" file1 &&\n'> <'    git tag second\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'reset --merge is ok with changes in file it does not touch'>)} 
      {
        (SQ <'\n'> <'    git reset --merge HEAD^ &&\n'> <'    ! grep 4 file1 &&\n'> 
          <'    grep 4 file2 &&\n'> <'    test "$(git rev-parse HEAD)" = "$(git rev-parse initial)" &&\n'> 
          <'    test -z "$(git diff --cached)"\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'reset --merge is ok when switching back'>)} 
      {
        (SQ <'\n'> <'    git reset --merge second &&\n'> <'    grep 4 file1 &&\n'> 
          <'    grep 4 file2 &&\n'> <'    test "$(git rev-parse HEAD)" = "$(git rev-parse second)" &&\n'> 
          <'    test -z "$(git diff --cached)"\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'reset --keep is ok with changes in file it does not touch'>)} 
      {
        (SQ <'\n'> <'    git reset --hard second &&\n'> <'    cat file1 >file2 &&\n'> 
          <'    git reset --keep HEAD^ &&\n'> <'    ! grep 4 file1 &&\n'> <'    grep 4 file2 &&\n'> 
          <'    test "$(git rev-parse HEAD)" = "$(git rev-parse initial)" &&\n'> <'    test -z "$(git diff --cached)"\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'reset --keep is ok when switching back'>)} 
      {
        (SQ <'\n'> <'    git reset --keep second &&\n'> <'    grep 4 file1 &&\n'> 
          <'    grep 4 file2 &&\n'> <'    test "$(git rev-parse HEAD)" = "$(git rev-parse second)" &&\n'> 
          <'    test -z "$(git diff --cached)"\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'reset --merge discards changes added to index (1)'>)} 
      {
        (SQ <'\n'> <'    git reset --hard second &&\n'> <'    cat file1 >file2 &&\n'> 
          <'    echo "line 5" >> file1 &&\n'> <'    git add file1 &&\n'> <'    git reset --merge HEAD^ &&\n'> <'    ! grep 4 file1 &&\n'> 
          <'    ! grep 5 file1 &&\n'> <'    grep 4 file2 &&\n'> <'    test "$(git rev-parse HEAD)" = "$(git rev-parse initial)" &&\n'> 
          <'    test -z "$(git diff --cached)"\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'reset --merge is ok again when switching back (1)'>)} 
      {
        (SQ <'\n'> <'    git reset --hard initial &&\n'> <'    echo "line 5" >> file2 &&\n'> 
          <'    git add file2 &&\n'> <'    git reset --merge second &&\n'> <'    ! grep 4 file2 &&\n'> <'    ! grep 5 file1 &&\n'> 
          <'    grep 4 file1 &&\n'> <'    test "$(git rev-parse HEAD)" = "$(git rev-parse second)" &&\n'> 
          <'    test -z "$(git diff --cached)"\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'reset --keep fails with changes in index in files it touches'>)} 
      {
        (SQ <'\n'> <'    git reset --hard second &&\n'> <'    echo "line 5" >> file1 &&\n'> 
          <'    git add file1 &&\n'> <'    test_must_fail git reset --keep HEAD^\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'reset --merge discards changes added to index (2)'>)} 
      {
        (SQ <'\n'> <'    git reset --hard second &&\n'> <'    echo "line 4" >> file2 &&\n'> 
          <'    git add file2 &&\n'> <'    git reset --merge HEAD^ &&\n'> <'    ! grep 4 file2 &&\n'> 
          <'    test "$(git rev-parse HEAD)" = "$(git rev-parse initial)" &&\n'> <'    test -z "$(git diff)" &&\n'> <'    test -z "$(git diff --cached)"\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'reset --merge is ok again when switching back (2)'>)} 
      {
        (SQ <'\n'> <'    git reset --hard initial &&\n'> <'    git reset --merge second &&\n'> 
          <'    ! grep 4 file2 &&\n'> <'    grep 4 file1 &&\n'> <'    test "$(git rev-parse HEAD)" = "$(git rev-parse second)" &&\n'> 
          <'    test -z "$(git diff --cached)"\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'reset --keep keeps changes it does not touch'>)} 
      {
        (SQ <'\n'> <'    git reset --hard second &&\n'> <'    echo "line 4" >> file2 &&\n'> 
          <'    git add file2 &&\n'> <'    git reset --keep HEAD^ &&\n'> <'    grep 4 file2 &&\n'> 
          <'    test "$(git rev-parse HEAD)" = "$(git rev-parse initial)" &&\n'> <'    test -z "$(git diff --cached)"\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'reset --keep keeps changes when switching back'>)} 
      {
        (SQ <'\n'> <'    git reset --keep second &&\n'> <'    grep 4 file2 &&\n'> 
          <'    grep 4 file1 &&\n'> <'    test "$(git rev-parse HEAD)" = "$(git rev-parse second)" &&\n'> 
          <'    test -z "$(git diff --cached)"\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'reset --merge fails with changes in file it touches'>)} 
      {
        (SQ <'\n'> <'    git reset --hard second &&\n'> <'    echo "line 5" >> file1 &&\n'> 
          <'    test_tick &&\n'> <'    git commit -m "add line 5" file1 &&\n'> 
          <'    sed -e "s/line 1/changed line 1/" <file1 >file3 &&\n'> <'    mv file3 file1 &&\n'> <'    test_must_fail git reset --merge HEAD^ 2>err.log &&\n'> 
          <'    grep file1 err.log | grep "not uptodate"\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'reset --keep fails with changes in file it touches'>)} 
      {
        (SQ <'\n'> <'    git reset --hard second &&\n'> <'    echo "line 5" >> file1 &&\n'> 
          <'    test_tick &&\n'> <'    git commit -m "add line 5" file1 &&\n'> 
          <'    sed -e "s/line 1/changed line 1/" <file1 >file3 &&\n'> <'    mv file3 file1 &&\n'> <'    test_must_fail git reset --keep HEAD^ 2>err.log &&\n'> 
          <'    grep file1 err.log | grep "not uptodate"\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'setup 3 different branches'>)} 
      {
        (SQ <'\n'> <'    git reset --hard second &&\n'> <'    git branch branch1 &&\n'> 
          <'    git branch branch2 &&\n'> <'    git branch branch3 &&\n'> <'    git checkout branch1 &&\n'> 
          <'    echo "line 5 in branch1" >> file1 &&\n'> <'    test_tick &&\n'> <'    git commit -a -m "change in branch1" &&\n'> 
          <'    git checkout branch2 &&\n'> <'    echo "line 5 in branch2" >> file1 &&\n'> <'    test_tick &&\n'> 
          <'    git commit -a -m "change in branch2" &&\n'> <'    git tag third &&\n'> <'    git checkout branch3 &&\n'> <'    echo a new file >file3 &&\n'> 
          <'    rm -f file1 &&\n'> <'    git add file3 &&\n'> <'    test_tick &&\n'> <'    git commit -a -m "change in branch3"\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'"reset --merge HEAD^" is ok with pending merge'>)} 
      {
        (SQ <'\n'> <'    git checkout third &&\n'> <'    test_must_fail git merge branch1 &&\n'> 
          <'    git reset --merge HEAD^ &&\n'> <'    test "$(git rev-parse HEAD)" = "$(git rev-parse second)" &&\n'> 
          <'    test -z "$(git diff --cached)" &&\n'> <'    test -z "$(git diff)"\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'"reset --keep HEAD^" fails with pending merge'>)} 
      {
        (SQ <'\n'> <'    git reset --hard third &&\n'> <'    test_must_fail git merge branch1 &&\n'> 
          <'    test_must_fail git reset --keep HEAD^ 2>err.log &&\n'> <'    test_i18ngrep "middle of a merge" err.log\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'"reset --merge HEAD" is ok with pending merge'>)} 
      {
        (SQ <'\n'> <'    git reset --hard third &&\n'> <'    test_must_fail git merge branch1 &&\n'> 
          <'    git reset --merge HEAD &&\n'> <'    test "$(git rev-parse HEAD)" = "$(git rev-parse third)" &&\n'> 
          <'    test -z "$(git diff --cached)" &&\n'> <'    test -z "$(git diff)"\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'"reset --keep HEAD" fails with pending merge'>)} 
      {
        (SQ <'\n'> <'    git reset --hard third &&\n'> <'    test_must_fail git merge branch1 &&\n'> 
          <'    test_must_fail git reset --keep HEAD 2>err.log &&\n'> <'    test_i18ngrep "middle of a merge" err.log\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'--merge is ok with added/deleted merge'>)} 
      {
        (SQ <'\n'> <'    git reset --hard third &&\n'> <'    rm -f file2 &&\n'> 
          <'    test_must_fail git merge branch3 &&\n'> <'    ! test -f file2 &&\n'> <'    test -f file3 &&\n'> <'    git diff --exit-code file3 &&\n'> 
          <'    git diff --exit-code branch3 file3 &&\n'> <'    git reset --merge HEAD &&\n'> <'    ! test -f file3 &&\n'> <'    ! test -f file2 &&\n'> 
          <'    git diff --exit-code --cached\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'--keep fails with added/deleted merge'>)} 
      {
        (SQ <'\n'> <'    git reset --hard third &&\n'> <'    rm -f file2 &&\n'> 
          <'    test_must_fail git merge branch3 &&\n'> <'    ! test -f file2 &&\n'> <'    test -f file3 &&\n'> <'    git diff --exit-code file3 &&\n'> 
          <'    git diff --exit-code branch3 file3 &&\n'> <'    test_must_fail git reset --keep HEAD 2>err.log &&\n'> 
          <'    test_i18ngrep "middle of a merge" err.log\n'>
        )
      }
    )
    (C {(test_done)})
  ]
)