(command.CommandList
  children: [
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:test_description)
          op: assign_op.Equal
          rhs: {(SQ <'git p4 locked file behavior'>)}
          spids: [4]
        )
      ]
    )
    (C {<.>} {<'./lib-git-p4.sh'>})
    (C {<test_expect_success>} {(SQ <'start p4d'>)} {(SQ <'\n'> <'\tstart_p4d\n'>)})
    (C {<test_expect_success>} {(SQ <'init depot'>)} 
      {
        (SQ <'\n'> <'\t(\n'> <'\t\tcd "$cli" &&\n'> 
          <'\t\techo "TypeMap: +l //depot/..." | p4 typemap -i &&\n'> <'\t\techo file1 >file1 &&\n'> <'\t\tp4 add file1 &&\n'> <'\t\tp4 submit -d "add file1"\n'> <'\t)\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'edit with lock not taken'>)} 
      {
        (SQ <'\n'> <'\ttest_when_finished cleanup_git &&\n'> 
          <'\tgit p4 clone --dest="$git" //depot &&\n'> <'\t(\n'> <'\t\tcd "$git" &&\n'> <'\t\techo line2 >>file1 &&\n'> <'\t\tgit add file1 &&\n'> 
          <'\t\tgit commit -m "line2 in file1" &&\n'> <'\t\tgit config git-p4.skipSubmitEdit true &&\n'> <'\t\tgit p4 submit\n'> <'\t)\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'add with lock not taken'>)} 
      {
        (SQ <'\n'> <'\ttest_when_finished cleanup_git &&\n'> 
          <'\tgit p4 clone --dest="$git" //depot &&\n'> <'\t(\n'> <'\t\tcd "$git" &&\n'> <'\t\techo line1 >>add-lock-not-taken &&\n'> 
          <'\t\tgit add add-lock-not-taken &&\n'> <'\t\tgit commit -m "add add-lock-not-taken" &&\n'> <'\t\tgit config git-p4.skipSubmitEdit true &&\n'> 
          <'\t\tgit p4 submit --verbose\n'> <'\t)\n'>
        )
      }
    )
    (command.ShFunction
      name: lock_in_another_client
      body: 
        (BraceGroup
          children: [
            (command.AndOr
              ops: [Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp]
              children: [
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:cli2)
                      op: assign_op.Equal
                      rhs: {(DQ ($ Id.VSub_DollarName '$TRASH_DIRECTORY') <'/cli2'>)}
                      spids: [110]
                    )
                  ]
                )
                (C {<mkdir>} {<-p>} {(DQ ($ Id.VSub_DollarName '$cli2'))})
                (C {<test_when_finished>} 
                  {
                    (DQ <'p4 client -f -d client2 && rm -rf '> 
                      (word_part.EscapedLiteral
                        token: <Id.Lit_EscapedChar '\\"'>
                      ) ($ Id.VSub_DollarName '$cli2') (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\"'>)
                    )
                  }
                )
                (command.Subshell
                  child: 
                    (command.AndOr
                      ops: [Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp]
                      children: [
                        (C {<cd>} {(DQ ($ Id.VSub_DollarName '$cli2'))})
                        (command.ShAssignment
                          pairs: [
                            (assign_pair
                              lhs: (sh_lhs_expr.Name name:P4CLIENT)
                              op: assign_op.Equal
                              rhs: {<client2>}
                              spids: [154]
                            )
                          ]
                        )
                        (command.ShAssignment
                          pairs: [
                            (assign_pair
                              lhs: (sh_lhs_expr.Name name:cli)
                              op: assign_op.Equal
                              rhs: {(DQ ($ Id.VSub_DollarName '$cli2'))}
                              spids: [160]
                            )
                          ]
                        )
                        (C {<client_view>} {(DQ <'//depot/... //client2/...'>)})
                        (C {<p4>} {<sync>})
                        (C {<p4>} {<open>} {<file1>})
                      ]
                    )
                )
              ]
            )
          ]
        )
    )
    (C {<test_expect_failure>} {(SQ <'edit with lock taken'>)} 
      {
        (SQ <'\n'> <'\tlock_in_another_client &&\n'> <'\ttest_when_finished cleanup_git &&\n'> 
          <'\ttest_when_finished "cd \\"$cli\\" && p4 sync -f file1" &&\n'> <'\tgit p4 clone --dest="$git" //depot &&\n'> <'\t(\n'> <'\t\tcd "$git" &&\n'> 
          <'\t\techo line3 >>file1 &&\n'> <'\t\tgit add file1 &&\n'> <'\t\tgit commit -m "line3 in file1" &&\n'> 
          <'\t\tgit config git-p4.skipSubmitEdit true &&\n'> <'\t\tgit p4 submit --verbose\n'> <'\t)\n'>
        )
      }
    )
    (C {<test_expect_failure>} {(SQ <'delete with lock taken'>)} 
      {
        (SQ <'\n'> <'\tlock_in_another_client &&\n'> <'\ttest_when_finished cleanup_git &&\n'> 
          <'\ttest_when_finished "cd \\"$cli\\" && p4 sync -f file1" &&\n'> <'\tgit p4 clone --dest="$git" //depot &&\n'> <'\t(\n'> <'\t\tcd "$git" &&\n'> <'\t\tgit rm file1 &&\n'> 
          <'\t\tgit commit -m "delete file1" &&\n'> <'\t\tgit config git-p4.skipSubmitEdit true &&\n'> <'\t\tgit p4 submit --verbose\n'> <'\t)\n'>
        )
      }
    )
    (C {<test_expect_failure>} {(SQ <'chmod with lock taken'>)} 
      {
        (SQ <'\n'> <'\tlock_in_another_client &&\n'> <'\ttest_when_finished cleanup_git &&\n'> 
          <'\ttest_when_finished "cd \\"$cli\\" && p4 sync -f file1" &&\n'> <'\tgit p4 clone --dest="$git" //depot &&\n'> <'\t(\n'> <'\t\tcd "$git" &&\n'> 
          <'\t\tchmod +x file1 &&\n'> <'\t\tgit add file1 &&\n'> <'\t\tgit commit -m "chmod +x file1" &&\n'> 
          <'\t\tgit config git-p4.skipSubmitEdit true &&\n'> <'\t\tgit p4 submit --verbose\n'> <'\t)\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'copy with lock taken'>)} 
      {
        (SQ <'\n'> <'\tlock_in_another_client &&\n'> <'\ttest_when_finished cleanup_git &&\n'> 
          <'\ttest_when_finished "cd \\"$cli\\" && p4 revert file2 && rm -f file2" &&\n'> <'\tgit p4 clone --dest="$git" //depot &&\n'> <'\t(\n'> <'\t\tcd "$git" &&\n'> 
          <'\t\tcp file1 file2 &&\n'> <'\t\tgit add file2 &&\n'> <'\t\tgit commit -m "cp file1 to file2" &&\n'> 
          <'\t\tgit config git-p4.skipSubmitEdit true &&\n'> <'\t\tgit config git-p4.detectCopies true &&\n'> <'\t\tgit p4 submit --verbose\n'> <'\t)\n'>
        )
      }
    )
    (C {<test_expect_failure>} {(SQ <'move with lock taken'>)} 
      {
        (SQ <'\n'> <'\tlock_in_another_client &&\n'> <'\ttest_when_finished cleanup_git &&\n'> 
          <'\ttest_when_finished "cd \\"$cli\\" && p4 sync file1 && rm -f file2" &&\n'> <'\tgit p4 clone --dest="$git" //depot &&\n'> <'\t(\n'> <'\t\tcd "$git" &&\n'> 
          <'\t\tgit mv file1 file3 &&\n'> <'\t\tgit commit -m "mv file1 to file3" &&\n'> <'\t\tgit config git-p4.skipSubmitEdit true &&\n'> 
          <'\t\tgit config git-p4.detectRenames true &&\n'> <'\t\tgit p4 submit --verbose\n'> <'\t)\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'kill p4d'>)} {(SQ <'\n'> <'\tkill_p4d\n'>)})
    (C {<test_done>})
  ]
)