(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)})
  ]
)