(CommandList
  children: [
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:test_description)
          op: Equal
          rhs: {(SQ <"Clone repositories and store files in Git LFS">)}
          spids: [4]
        )
      ]
      spids: [4]
    )
    (C {(.)} {(./lib-git-p4.sh)})
    (AndOr
      children: [
        (SimpleCommand
          words: [{(git)} {(lfs)} {(help)}]
          redirects: [
            (Redir op_id:Redir_Great fd:-1 arg_word:{(/dev/null)} spids:[21])
            (Redir op_id:Redir_GreatAnd fd:2 arg_word:{(1)} spids:[24])
          ]
        )
        (BraceGroup
          children: [
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:skip_all)
                  op: Equal
                  rhs: {(SQ <"skipping git p4 Git LFS tests; Git LFS not found">)}
                  spids: [32]
                )
              ]
              spids: [32]
            )
            (C {(test_done)})
          ]
          spids: [29]
        )
      ]
      op_id: Op_DPipe
    )
    (FuncDef
      name: test_file_in_lfs
      body: 
        (BraceGroup
          children: [
            (AndOr
              children: [
                (Assignment
                  keyword: Assign_None
                  pairs: [
                    (assign_pair
                      lhs: (LhsName name:FILE)
                      op: Equal
                      rhs: {(DQ ($ VSub_Number "$1"))}
                      spids: [51]
                    )
                  ]
                  spids: [51]
                )
                (AndOr
                  children: [
                    (Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (LhsName name:SIZE)
                          op: Equal
                          rhs: {(DQ ($ VSub_Number "$2"))}
                          spids: [59]
                        )
                      ]
                      spids: [59]
                    )
                    (AndOr
                      children: [
                        (Assignment
                          keyword: Assign_None
                          pairs: [
                            (assign_pair
                              lhs: (LhsName name:EXPECTED_CONTENT)
                              op: Equal
                              rhs: {(DQ ($ VSub_Number "$3"))}
                              spids: [67]
                            )
                          ]
                          spids: [67]
                        )
                        (AndOr
                          children: [
                            (Pipeline
                              children: [
                                (C {(sed)} {(-n)} {(SQ <"1,1 p">)} {(DQ ($ VSub_Name "$FILE"))})
                                (C {(grep)} {(DQ ("^version "))})
                              ]
                              negated: False
                            )
                            (AndOr
                              children: [
                                (Pipeline
                                  children: [
                                    (C {(sed)} {(-n)} {(SQ <"2,2 p">)} {(DQ ($ VSub_Name "$FILE"))})
                                    (C {(grep)} {(DQ ("^oid "))})
                                  ]
                                  negated: False
                                )
                                (AndOr
                                  children: [
                                    (Pipeline
                                      children: [
                                        (C {(sed)} {(-n)} {(SQ <"3,3 p">)} {(DQ ($ VSub_Name "$FILE"))})
                                        (C {(grep)} {(DQ ("^size "))})
                                      ]
                                      negated: False
                                    )
                                    (AndOr
                                      children: [
                                        (C {(test_line_count)} {(Lit_Other "=")} {(3)} 
                                          {(DQ ($ VSub_Name "$FILE"))}
                                        )
                                        (AndOr
                                          children: [
                                            (Pipeline
                                              children: [
                                                (C {(cat)} {(DQ ($ VSub_Name "$FILE"))})
                                                (C {(grep)} {(DQ ("size ") ($ VSub_Name "$SIZE"))})
                                              ]
                                              negated: False
                                            )
                                            (AndOr
                                              children: [
                                                (Assignment
                                                  keyword: Assign_None
                                                  pairs: [
                                                    (assign_pair
                                                      lhs: (LhsName name:HASH)
                                                      op: Equal
                                                      rhs: 
                                                        {
                                                          (CommandSubPart
                                                            command_list: 
                                                              (CommandList
                                                                children: [
                                                                  (Pipeline
                                                                    children: [
                                                                      (C {(cat)} 
                                                                        {(DQ ($ VSub_Name "$FILE"))}
                                                                      )
                                                                      (C {(grep)} {(DQ ("oid sha256:"))})
                                                                      (C {(sed)} {(-e)} 
                                                                        {(DQ ("s/oid sha256://g"))}
                                                                      )
                                                                    ]
                                                                    negated: False
                                                                  )
                                                                ]
                                                              )
                                                            left_token: <Left_CommandSub "$(">
                                                            spids: [176 200]
                                                          )
                                                        }
                                                      spids: [175]
                                                    )
                                                  ]
                                                  spids: [175]
                                                )
                                                (AndOr
                                                  children: [
                                                    (Assignment
                                                      keyword: Assign_None
                                                      pairs: [
                                                        (assign_pair
                                                          lhs: (LhsName name:LFS_FILE)
                                                          op: Equal
                                                          rhs: 
                                                            {
                                                              (DQ (.git/lfs/objects/) 
                                                                (CommandSubPart
                                                                  command_list: 
                                                                    (CommandList
                                                                      children: [
                                                                        (Pipeline
                                                                          children: [
                                                                            (C {(echo)} 
                                                                              {
                                                                                (DQ 
                                                                                  ($ VSub_Name 
"$HASH"
                                                                                  )
                                                                                )
                                                                              }
                                                                            )
                                                                            (C {(cut)} {(-c1-2)})
                                                                          ]
                                                                          negated: False
                                                                        )
                                                                      ]
                                                                    )
                                                                  left_token: <Left_CommandSub "$(">
                                                                  spids: [208 220]
                                                                ) (/) 
                                                                (CommandSubPart
                                                                  command_list: 
                                                                    (CommandList
                                                                      children: [
                                                                        (Pipeline
                                                                          children: [
                                                                            (C {(echo)} 
                                                                              {
                                                                                (DQ 
                                                                                  ($ VSub_Name 
"$HASH"
                                                                                  )
                                                                                )
                                                                              }
                                                                            )
                                                                            (C {(cut)} {(-c3-4)})
                                                                          ]
                                                                          negated: False
                                                                        )
                                                                      ]
                                                                    )
                                                                  left_token: <Left_CommandSub "$(">
                                                                  spids: [222 234]
                                                                ) (/) ($ VSub_Name "$HASH")
                                                              )
                                                            }
                                                          spids: [205]
                                                        )
                                                      ]
                                                      spids: [205]
                                                    )
                                                    (AndOr
                                                      children: [
                                                        (SimpleCommand
                                                          words: [
                                                            {(echo)}
                                                            {($ VSub_Name "$EXPECTED_CONTENT")}
                                                          ]
                                                          redirects: [
                                                            (Redir
                                                              op_id: Redir_Great
                                                              fd: -1
                                                              arg_word: {(expect)}
                                                              spids: [246]
                                                            )
                                                          ]
                                                        )
                                                        (AndOr
                                                          children: [
                                                            (C {(test_path_is_file)} 
                                                              {(DQ ($ VSub_Name "$FILE"))}
                                                            )
                                                            (AndOr
                                                              children: [
                                                                (C {(test_path_is_file)} 
                                                                  {(DQ ($ VSub_Name "$LFS_FILE"))}
                                                                )
                                                                (C {(test_cmp)} {(expect)} 
                                                                  {(DQ ($ VSub_Name "$LFS_FILE"))}
                                                                )
                                                              ]
                                                              op_id: Op_DAmp
                                                            )
                                                          ]
                                                          op_id: Op_DAmp
                                                        )
                                                      ]
                                                      op_id: Op_DAmp
                                                    )
                                                  ]
                                                  op_id: Op_DAmp
                                                )
                                              ]
                                              op_id: Op_DAmp
                                            )
                                          ]
                                          op_id: Op_DAmp
                                        )
                                      ]
                                      op_id: Op_DAmp
                                    )
                                  ]
                                  op_id: Op_DAmp
                                )
                              ]
                              op_id: Op_DAmp
                            )
                          ]
                          op_id: Op_DAmp
                        )
                      ]
                      op_id: Op_DAmp
                    )
                  ]
                  op_id: Op_DAmp
                )
              ]
              op_id: Op_DAmp
            )
          ]
          spids: [48]
        )
      spids: [43 47]
    )
    (FuncDef
      name: test_file_count_in_dir
      body: 
        (BraceGroup
          children: [
            (AndOr
              children: [
                (Assignment
                  keyword: Assign_None
                  pairs: [
                    (assign_pair
                      lhs: (LhsName name:DIR)
                      op: Equal
                      rhs: {(DQ ($ VSub_Number "$1"))}
                      spids: [289]
                    )
                  ]
                  spids: [289]
                )
                (AndOr
                  children: [
                    (Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (LhsName name:EXPECTED_COUNT)
                          op: Equal
                          rhs: {(DQ ($ VSub_Number "$2"))}
                          spids: [297]
                        )
                      ]
                      spids: [297]
                    )
                    (AndOr
                      children: [
                        (SimpleCommand
                          words: [{(find)} {(DQ ($ VSub_Name "$DIR"))} {(-type)} {(f)}]
                          redirects: [(Redir op_id:Redir_Great fd:-1 arg_word:{(actual)} spids:[315])]
                        )
                        (C {(test_line_count)} {(Lit_Other "=")} {($ VSub_Name "$EXPECTED_COUNT")} 
                          {(actual)}
                        )
                      ]
                      op_id: Op_DAmp
                    )
                  ]
                  op_id: Op_DAmp
                )
              ]
              op_id: Op_DAmp
            )
          ]
          spids: [286]
        )
      spids: [281 285]
    )
    (C {(test_expect_success)} {(SQ <"start p4d">)} {(SQ <"\n"> <"\tstart_p4d\n">)})
    (C {(test_expect_success)} {(SQ <"Create repo with binary files">)} 
      {
        (SQ <"\n"> <"\tclient_view \"//depot/... //client/...\" &&\n"> <"\t(\n"> 
          <"\t\tcd \"$cli\" &&\n"> <"\n"> <"\t\techo \"content 1 txt 23 bytes\" >file1.txt &&\n"> <"\t\tp4 add file1.txt &&\n"> 
          <"\t\techo \"content 2-3 bin 25 bytes\" >file2.dat &&\n"> <"\t\tp4 add file2.dat &&\n"> <"\t\tp4 submit -d \"Add text and binary file\" &&\n"> <"\n"> 
          <"\t\tmkdir \"path with spaces\" &&\n"> <"\t\techo \"content 2-3 bin 25 bytes\" >\"path with spaces/file3.bin\" &&\n"> 
          <"\t\tp4 add \"path with spaces/file3.bin\" &&\n"> <"\t\tp4 submit -d \"Add another binary file with same content and spaces in path\" &&\n"> <"\n"> 
          <"\t\techo \"content 4 bin 26 bytes XX\" >file4.bin &&\n"> <"\t\tp4 add file4.bin &&\n"> 
          <"\t\tp4 submit -d \"Add another binary file with different content\"\n"> <"\t)\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"Store files in LFS based on size (>24 bytes)">)} 
      {
        (SQ <"\n"> <"\tclient_view \"//depot/... //client/...\" &&\n"> 
          <"\ttest_when_finished cleanup_git &&\n"> <"\t(\n"> <"\t\tcd \"$git\" &&\n"> <"\t\tgit init . &&\n"> 
          <"\t\tgit config git-p4.useClientSpec true &&\n"> <"\t\tgit config git-p4.largeFileSystem GitLFS &&\n"> 
          <"\t\tgit config git-p4.largeFileThreshold 24 &&\n"> <"\t\tgit p4 clone --destination=\"$git\" //depot@all &&\n"> <"\n"> 
          <"\t\ttest_file_in_lfs file2.dat 25 \"content 2-3 bin 25 bytes\" &&\n"> <"\t\ttest_file_in_lfs \"path with spaces/file3.bin\" 25 \"content 2-3 bin 25 bytes\" &&\n"> 
          <"\t\ttest_file_in_lfs file4.bin 26 \"content 4 bin 26 bytes XX\" &&\n"> <"\n"> <"\t\ttest_file_count_in_dir \".git/lfs/objects\" 2 &&\n"> <"\n"> 
          <"\t\tcat >expect <<-\\EOF &&\n"> <"\n"> <"\t\t#\n"> <"\t\t# Git LFS (see https://git-lfs.github.com/)\n"> <"\t\t#\n"> 
          <"\t\t/file2.dat filter=lfs -text\n"> <"\t\t/file4.bin filter=lfs -text\n"> 
          <"\t\t/path[[:space:]]with[[:space:]]spaces/file3.bin filter=lfs -text\n"> <"\t\tEOF\n"> <"\t\ttest_path_is_file .gitattributes &&\n"> <"\t\ttest_cmp expect .gitattributes\n"> 
          <"\t)\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"Store files in LFS based on size (>25 bytes)">)} 
      {
        (SQ <"\n"> <"\tclient_view \"//depot/... //client/...\" &&\n"> 
          <"\ttest_when_finished cleanup_git &&\n"> <"\t(\n"> <"\t\tcd \"$git\" &&\n"> <"\t\tgit init . &&\n"> 
          <"\t\tgit config git-p4.useClientSpec true &&\n"> <"\t\tgit config git-p4.largeFileSystem GitLFS &&\n"> 
          <"\t\tgit config git-p4.largeFileThreshold 25 &&\n"> <"\t\tgit p4 clone --destination=\"$git\" //depot@all &&\n"> <"\n"> 
          <"\t\ttest_file_in_lfs file4.bin 26 \"content 4 bin 26 bytes XX\" &&\n"> <"\t\ttest_file_count_in_dir \".git/lfs/objects\" 1 &&\n"> <"\n"> <"\t\tcat >expect <<-\\EOF &&\n"> 
          <"\n"> <"\t\t#\n"> <"\t\t# Git LFS (see https://git-lfs.github.com/)\n"> <"\t\t#\n"> 
          <"\t\t/file4.bin filter=lfs -text\n"> <"\t\tEOF\n"> <"\t\ttest_path_is_file .gitattributes &&\n"> <"\t\ttest_cmp expect .gitattributes\n"> 
          <"\t)\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"Store files in LFS based on extension (dat)">)} 
      {
        (SQ <"\n"> <"\tclient_view \"//depot/... //client/...\" &&\n"> 
          <"\ttest_when_finished cleanup_git &&\n"> <"\t(\n"> <"\t\tcd \"$git\" &&\n"> <"\t\tgit init . &&\n"> 
          <"\t\tgit config git-p4.useClientSpec true &&\n"> <"\t\tgit config git-p4.largeFileSystem GitLFS &&\n"> 
          <"\t\tgit config git-p4.largeFileExtensions dat &&\n"> <"\t\tgit p4 clone --destination=\"$git\" //depot@all &&\n"> <"\n"> 
          <"\t\ttest_file_in_lfs file2.dat 25 \"content 2-3 bin 25 bytes\" &&\n"> <"\t\ttest_file_count_in_dir \".git/lfs/objects\" 1 &&\n"> <"\n"> <"\t\tcat >expect <<-\\EOF &&\n"> 
          <"\n"> <"\t\t#\n"> <"\t\t# Git LFS (see https://git-lfs.github.com/)\n"> <"\t\t#\n"> 
          <"\t\t*.dat filter=lfs -text\n"> <"\t\tEOF\n"> <"\t\ttest_path_is_file .gitattributes &&\n"> <"\t\ttest_cmp expect .gitattributes\n"> 
          <"\t)\n">
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ <"Store files in LFS based on size (>25 bytes) and extension (dat)">)} 
      {
        (SQ <"\n"> <"\tclient_view \"//depot/... //client/...\" &&\n"> 
          <"\ttest_when_finished cleanup_git &&\n"> <"\t(\n"> <"\t\tcd \"$git\" &&\n"> <"\t\tgit init . &&\n"> 
          <"\t\tgit config git-p4.useClientSpec true &&\n"> <"\t\tgit config git-p4.largeFileSystem GitLFS &&\n"> 
          <"\t\tgit config git-p4.largeFileExtensions dat &&\n"> <"\t\tgit config git-p4.largeFileThreshold 25 &&\n"> 
          <"\t\tgit p4 clone --destination=\"$git\" //depot@all &&\n"> <"\n"> <"\t\ttest_file_in_lfs file2.dat 25 \"content 2-3 bin 25 bytes\" &&\n"> 
          <"\t\ttest_file_in_lfs file4.bin 26 \"content 4 bin 26 bytes XX\" &&\n"> <"\t\ttest_file_count_in_dir \".git/lfs/objects\" 2 &&\n"> <"\n"> <"\t\tcat >expect <<-\\EOF &&\n"> 
          <"\n"> <"\t\t#\n"> <"\t\t# Git LFS (see https://git-lfs.github.com/)\n"> <"\t\t#\n"> 
          <"\t\t*.dat filter=lfs -text\n"> <"\t\t/file4.bin filter=lfs -text\n"> <"\t\tEOF\n"> <"\t\ttest_path_is_file .gitattributes &&\n"> 
          <"\t\ttest_cmp expect .gitattributes\n"> <"\t)\n">
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ <"Remove file from repo and store files in LFS based on size (>24 bytes)">)} 
      {
        (SQ <"\n"> <"\tclient_view \"//depot/... //client/...\" &&\n"> <"\t(\n"> 
          <"\t\tcd \"$cli\" &&\n"> <"\t\tp4 delete file4.bin &&\n"> <"\t\tp4 submit -d \"Remove file\"\n"> <"\t) &&\n"> <"\n"> 
          <"\tclient_view \"//depot/... //client/...\" &&\n"> <"\ttest_when_finished cleanup_git &&\n"> <"\t(\n"> <"\t\tcd \"$git\" &&\n"> <"\t\tgit init . &&\n"> 
          <"\t\tgit config git-p4.useClientSpec true &&\n"> <"\t\tgit config git-p4.largeFileSystem GitLFS &&\n"> 
          <"\t\tgit config git-p4.largeFileThreshold 24 &&\n"> <"\t\tgit p4 clone --destination=\"$git\" //depot@all &&\n"> <"\n"> 
          <"\t\ttest_file_in_lfs file2.dat 25 \"content 2-3 bin 25 bytes\" &&\n"> <"\t\ttest_file_in_lfs \"path with spaces/file3.bin\" 25 \"content 2-3 bin 25 bytes\" &&\n"> 
          <"\t\ttest_path_is_missing file4.bin &&\n"> <"\t\ttest_file_count_in_dir \".git/lfs/objects\" 2 &&\n"> <"\n"> <"\t\tcat >expect <<-\\EOF &&\n"> 
          <"\n"> <"\t\t#\n"> <"\t\t# Git LFS (see https://git-lfs.github.com/)\n"> <"\t\t#\n"> 
          <"\t\t/file2.dat filter=lfs -text\n"> <"\t\t/path[[:space:]]with[[:space:]]spaces/file3.bin filter=lfs -text\n"> <"\t\tEOF\n"> 
          <"\t\ttest_path_is_file .gitattributes &&\n"> <"\t\ttest_cmp expect .gitattributes\n"> <"\t)\n">
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ <"Add .gitattributes and store files in LFS based on size (>24 bytes)">)} 
      {
        (SQ <"\n"> <"\tclient_view \"//depot/... //client/...\" &&\n"> <"\t(\n"> 
          <"\t\tcd \"$cli\" &&\n"> <"\t\techo \"*.txt text\" >.gitattributes &&\n"> <"\t\tp4 add .gitattributes &&\n"> 
          <"\t\tp4 submit -d \"Add .gitattributes\"\n"> <"\t) &&\n"> <"\n"> <"\tclient_view \"//depot/... //client/...\" &&\n"> 
          <"\ttest_when_finished cleanup_git &&\n"> <"\t(\n"> <"\t\tcd \"$git\" &&\n"> <"\t\tgit init . &&\n"> 
          <"\t\tgit config git-p4.useClientSpec true &&\n"> <"\t\tgit config git-p4.largeFileSystem GitLFS &&\n"> 
          <"\t\tgit config git-p4.largeFileThreshold 24 &&\n"> <"\t\tgit p4 clone --destination=\"$git\" //depot@all &&\n"> <"\n"> 
          <"\t\ttest_file_in_lfs file2.dat 25 \"content 2-3 bin 25 bytes\" &&\n"> <"\t\ttest_file_in_lfs \"path with spaces/file3.bin\" 25 \"content 2-3 bin 25 bytes\" &&\n"> 
          <"\t\ttest_path_is_missing file4.bin &&\n"> <"\t\ttest_file_count_in_dir \".git/lfs/objects\" 2 &&\n"> <"\n"> <"\t\tcat >expect <<-\\EOF &&\n"> 
          <"\t\t*.txt text\n"> <"\n"> <"\t\t#\n"> <"\t\t# Git LFS (see https://git-lfs.github.com/)\n"> <"\t\t#\n"> 
          <"\t\t/file2.dat filter=lfs -text\n"> <"\t\t/path[[:space:]]with[[:space:]]spaces/file3.bin filter=lfs -text\n"> <"\t\tEOF\n"> 
          <"\t\ttest_path_is_file .gitattributes &&\n"> <"\t\ttest_cmp expect .gitattributes\n"> <"\t)\n">
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ <"Add big files to repo and store files in LFS based on compressed size (>28 bytes)">)} 
      {
        (SQ <"\n"> <"\tclient_view \"//depot/... //client/...\" &&\n"> <"\t(\n"> 
          <"\t\tcd \"$cli\" &&\n"> <"\t\techo \"content 5 bin 40 bytes XXXXXXXXXXXXXXXX\" >file5.bin &&\n"> <"\t\tp4 add file5.bin &&\n"> 
          <"\t\tp4 submit -d \"Add file with small footprint after compression\" &&\n"> <"\n"> <"\t\techo \"content 6 bin 39 bytes XXXXXYYYYYZZZZZ\" >file6.bin &&\n"> 
          <"\t\tp4 add file6.bin &&\n"> <"\t\tp4 submit -d \"Add file with large footprint after compression\"\n"> <"\t) &&\n"> <"\n"> 
          <"\tclient_view \"//depot/... //client/...\" &&\n"> <"\ttest_when_finished cleanup_git &&\n"> <"\t(\n"> <"\t\tcd \"$git\" &&\n"> <"\t\tgit init . &&\n"> 
          <"\t\tgit config git-p4.useClientSpec true &&\n"> <"\t\tgit config git-p4.largeFileSystem GitLFS &&\n"> 
          <"\t\tgit config git-p4.largeFileCompressedThreshold 28 &&\n"> <"\t\t# We only import HEAD here (\"@all\" is missing!)\n"> 
          <"\t\tgit p4 clone --destination=\"$git\" //depot &&\n"> <"\n"> <"\t\ttest_file_in_lfs file6.bin 39 \"content 6 bin 39 bytes XXXXXYYYYYZZZZZ\" &&\n"> 
          <"\t\ttest_file_count_in_dir \".git/lfs/objects\" 1 &&\n"> <"\n"> <"\t\tcat >expect <<-\\EOF &&\n"> <"\t\t*.txt text\n"> <"\n"> <"\t\t#\n"> 
          <"\t\t# Git LFS (see https://git-lfs.github.com/)\n"> <"\t\t#\n"> <"\t\t/file6.bin filter=lfs -text\n"> <"\t\tEOF\n"> 
          <"\t\ttest_path_is_file .gitattributes &&\n"> <"\t\ttest_cmp expect .gitattributes\n"> <"\t)\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"kill p4d">)} {(SQ <"\n"> <"\tkill_p4d\n">)})
    (C {(test_done)})
  ]
)