(CommandList
  children: [
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:test_description)
          op: Equal
          rhs: {(SQ <"Test diff-highlight">)}
          spids: [4]
        )
      ]
      spids: [4]
    )
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:CURR_DIR)
          op: Equal
          rhs: 
            {
              (CommandSubPart
                command_list: (CommandList children:[(C {(pwd)})])
                left_token: <Left_CommandSub "$(">
                spids: [11 13]
              )
            }
          spids: [10]
        )
      ]
      spids: [10]
    )
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:TEST_OUTPUT_DIRECTORY)
          op: Equal
          rhs: 
            {
              (CommandSubPart
                command_list: (CommandList children:[(C {(pwd)})])
                left_token: <Left_CommandSub "$(">
                spids: [16 18]
              )
            }
          spids: [15]
        )
      ]
      spids: [15]
    )
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:TEST_DIRECTORY)
          op: Equal
          rhs: {(DQ ($ VSub_Name "$CURR_DIR")) (/../../../t)}
          spids: [20]
        )
      ]
      spids: [20]
    )
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:DIFF_HIGHLIGHT)
          op: Equal
          rhs: {(DQ ($ VSub_Name "$CURR_DIR")) (/../diff-highlight)}
          spids: [26]
        )
      ]
      spids: [26]
    )
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:CW)
          op: Equal
          rhs: 
            {
              (DQ 
                (CommandSubPart
                  command_list: 
                    (CommandList
                      children: [
                        (C {(printf)} 
                          {(DQ (EscapedLiteralPart token:<Lit_EscapedChar "\\0">) ("33[7m"))}
                        )
                      ]
                    )
                  left_token: <Left_CommandSub "$(">
                  spids: [35 42]
                )
              )
            }
          spids: [33]
        )
      ]
      spids: [33]
    )
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:CR)
          op: Equal
          rhs: 
            {
              (DQ 
                (CommandSubPart
                  command_list: 
                    (CommandList
                      children: [
                        (C {(printf)} 
                          {(DQ (EscapedLiteralPart token:<Lit_EscapedChar "\\0">) ("33[27m"))}
                        )
                      ]
                    )
                  left_token: <Left_CommandSub "$(">
                  spids: [50 57]
                )
              )
            }
          spids: [48]
        )
      ]
      spids: [48]
    )
    (C {(.)} {(DQ ($ VSub_Name "$TEST_DIRECTORY")) (/test-lib.sh)})
    (If
      arms: [
        (if_arm
          cond: [(Pipeline children:[(C {(test_have_prereq)} {(PERL)})] negated:True)]
          action: [
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:skip_all)
                  op: Equal
                  rhs: {(SQ <"skipping diff-highlight tests; perl not available">)}
                  spids: [83]
                )
              ]
              spids: [83]
            )
            (C {(test_done)})
          ]
          spids: [-1 80]
        )
      ]
      spids: [-1 91]
    )
    (FuncDef
      name: dh_test
      body: 
        (BraceGroup
          children: [
            (AndOr
              children: [
                (Assignment
                  keyword: Assign_None
                  pairs: [
                    (assign_pair
                      lhs: (LhsName name:a)
                      op: Equal
                      rhs: {(DQ ($ VSub_Number "$1"))}
                      spids: [117]
                    )
                    (assign_pair
                      lhs: (LhsName name:b)
                      op: Equal
                      rhs: {(DQ ($ VSub_Number "$2"))}
                      spids: [122]
                    )
                  ]
                  spids: [117]
                )
                (AndOr
                  children: [
                    (SimpleCommand
                      words: [{(cat)}]
                      redirects: [(Redir op_id:Redir_Great fd:-1 arg_word:{(patch.exp)} spids:[133])]
                    )
                    (AndOr
                      children: [
                        (BraceGroup
                          children: [
                            (AndOr
                              children: [
                                (SimpleCommand
                                  words: [{(cat)} {(DQ ($ VSub_Name "$a"))}]
                                  redirects: [
                                    (Redir
                                      op_id: Redir_Great
                                      fd: -1
                                      arg_word: {(file)}
                                      spids: [149]
                                    )
                                  ]
                                )
                                (AndOr
                                  children: [
                                    (C {(git)} {(add)} {(file)})
                                    (AndOr
                                      children: [
                                        (C {(git)} {(commit)} {(-m)} {(DQ ("Add a file"))})
                                        (AndOr
                                          children: [
                                            (SimpleCommand
                                              words: [{(cat)} {(DQ ($ VSub_Name "$b"))}]
                                              redirects: [
                                                (Redir
                                                  op_id: Redir_Great
                                                  fd: -1
                                                  arg_word: {(file)}
                                                  spids: [184]
                                                )
                                              ]
                                            )
                                            (AndOr
                                              children: [
                                                (SimpleCommand
                                                  words: [{(git)} {(diff)} {(file)}]
                                                  redirects: [
                                                    (Redir
                                                      op_id: Redir_Great
                                                      fd: -1
                                                      arg_word: {(diff.raw)}
                                                      spids: [196]
                                                    )
                                                  ]
                                                )
                                                (AndOr
                                                  children: [
                                                    (C {(git)} {(commit)} {(-a)} {(-m)} 
                                                      {(DQ ("Update a file"))}
                                                    )
                                                    (SimpleCommand
                                                      words: [{(git)} {(show)}]
                                                      redirects: [
                                                        (Redir
                                                          op_id: Redir_Great
                                                          fd: -1
                                                          arg_word: {(commit.raw)}
                                                          spids: [221]
                                                        )
                                                      ]
                                                    )
                                                  ]
                                                  op_id: Op_DAmp
                                                )
                                              ]
                                              op_id: Op_DAmp
                                            )
                                          ]
                                          op_id: Op_DAmp
                                        )
                                      ]
                                      op_id: Op_DAmp
                                    )
                                  ]
                                  op_id: Op_DAmp
                                )
                              ]
                              op_id: Op_DAmp
                            )
                          ]
                          redirects: [
                            (Redir
                              op_id: Redir_Great
                              fd: -1
                              arg_word: {(/dev/null)}
                              spids: [227]
                            )
                          ]
                          spids: [140]
                        )
                        (AndOr
                          children: [
                            (Pipeline
                              children: [
                                (SimpleCommand
                                  words: [{(DQ ($ VSub_Name "$DIFF_HIGHLIGHT"))}]
                                  redirects: [
                                    (Redir
                                      op_id: Redir_Less
                                      fd: -1
                                      arg_word: {(diff.raw)}
                                      spids: [238]
                                    )
                                  ]
                                )
                                (SimpleCommand
                                  words: [{(test_strip_patch_header)}]
                                  redirects: [
                                    (Redir
                                      op_id: Redir_Great
                                      fd: -1
                                      arg_word: {(diff.act)}
                                      spids: [245]
                                    )
                                  ]
                                )
                              ]
                              negated: False
                            )
                            (AndOr
                              children: [
                                (Pipeline
                                  children: [
                                    (SimpleCommand
                                      words: [{(DQ ($ VSub_Name "$DIFF_HIGHLIGHT"))}]
                                      redirects: [
                                        (Redir
                                          op_id: Redir_Less
                                          fd: -1
                                          arg_word: {(commit.raw)}
                                          spids: [255]
                                        )
                                      ]
                                    )
                                    (SimpleCommand
                                      words: [{(test_strip_patch_header)}]
                                      redirects: [
                                        (Redir
                                          op_id: Redir_Great
                                          fd: -1
                                          arg_word: {(commit.act)}
                                          spids: [262]
                                        )
                                      ]
                                    )
                                  ]
                                  negated: False
                                )
                                (AndOr
                                  children: [
                                    (C {(test_cmp)} {(patch.exp)} {(diff.act)})
                                    (C {(test_cmp)} {(patch.exp)} {(commit.act)})
                                  ]
                                  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: [114]
        )
      spids: [109 113]
    )
    (FuncDef
      name: test_strip_patch_header
      body: 
        (BraceGroup
          children: [(C {(sed)} {(-n)} {(SQ <"/^@@/,$p">)} {($ VSub_Star "$*")})]
          spids: [291]
        )
      spids: [286 290]
    )
    (FuncDef
      name: dh_test_setup_history
      body: 
        (BraceGroup
          children: [
            (AndOr
              children: [
                (SimpleCommand
                  words: [{(echo)} {(DQ (file1))}]
                  redirects: [(Redir op_id:Redir_Great fd:-1 arg_word:{(file1)} spids:[375])]
                )
                (AndOr
                  children: [
                    (SimpleCommand
                      words: [{(echo)} {(DQ (file2))}]
                      redirects: [(Redir op_id:Redir_Great fd:-1 arg_word:{(file2)} spids:[387])]
                    )
                    (AndOr
                      children: [
                        (SimpleCommand
                          words: [{(echo)} {(DQ (file3))}]
                          redirects: [(Redir op_id:Redir_Great fd:-1 arg_word:{(file3)} spids:[399])]
                        )
                        (AndOr
                          children: [
                            (SimpleCommand
                              words: [{(cat)} {(file1)}]
                              redirects: [
                                (Redir
                                  op_id: Redir_Great
                                  fd: -1
                                  arg_word: {(file)}
                                  spids: [410]
                                )
                              ]
                            )
                            (AndOr
                              children: [
                                (C {(git)} {(add)} {(file)})
                                (AndOr
                                  children: [
                                    (C {(git)} {(commit)} {(-m)} {(DQ (D))})
                                    (AndOr
                                      children: [
                                        (C {(git)} {(checkout)} {(-b)} {(branch)})
                                        (AndOr
                                          children: [
                                            (SimpleCommand
                                              words: [{(cat)} {(file2)}]
                                              redirects: [
                                                (Redir
                                                  op_id: Redir_Great
                                                  fd: -1
                                                  arg_word: {(file)}
                                                  spids: [454]
                                                )
                                              ]
                                            )
                                            (AndOr
                                              children: [
                                                (C {(git)} {(commit)} {(-a)} {(-m)} {(DQ (A))})
                                                (AndOr
                                                  children: [
                                                    (C {(git)} {(checkout)} {(master)})
                                                    (AndOr
                                                      children: [
                                                        (SimpleCommand
                                                          words: [{(cat)} {(file2)}]
                                                          redirects: [
                                                            (Redir
                                                              op_id: Redir_Great
                                                              fd: -1
                                                              arg_word: {(file)}
                                                              spids: [489]
                                                            )
                                                          ]
                                                        )
                                                        (AndOr
                                                          children: [
                                                            (C {(git)} {(commit)} {(-a)} {(-m)} {(DQ (E))})
                                                            (AndOr
                                                              children: [
                                                                (SimpleCommand
                                                                  words: [{(cat)} {(file3)}]
                                                                  redirects: [
                                                                    (Redir
                                                                      op_id: Redir_Great
                                                                      fd: -1
                                                                      arg_word: {(file)}
                                                                      spids: [515]
                                                                    )
                                                                  ]
                                                                )
                                                                (C {(git)} {(commit)} {(-a)} {(-m)} 
                                                                  {(DQ (F))}
                                                                )
                                                              ]
                                                              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: [366]
        )
      spids: [361 365]
    )
    (FuncDef
      name: left_trim
      body: 
        (BraceGroup
          children: [(C {(DQ ($ VSub_Name "$PERL_PATH"))} {(-pe)} {(SQ <"s/^\\s+//">)})]
          spids: [541]
        )
      spids: [536 540]
    )
    (FuncDef
      name: trim_graph
      body: 
        (BraceGroup
          children: [
            (C {(DQ ($ VSub_Name "$PERL_PATH"))} {(-pe)} {(SQ <"s@^((\\*|\\|)( |/|\\\\))+@@">)})
          ]
          spids: [562]
        )
      spids: [557 561]
    )
    (C {(test_expect_success)} {(SQ <"diff-highlight highlights the beginning of a line">)} 
      {
        (SQ <"\n"> <"\tcat >a <<-\\EOF &&\n"> <"\t\taaa\n"> <"\t\tbbb\n"> <"\t\tccc\n"> <"\tEOF\n"> <"\n"> 
          <"\tcat >b <<-\\EOF &&\n"> <"\t\taaa\n"> <"\t\t0bb\n"> <"\t\tccc\n"> <"\tEOF\n"> <"\n"> <"\tdh_test a b <<-EOF\n"> 
          <"\t\t@@ -1,3 +1,3 @@\n"> <"\t\t aaa\n"> <"\t\t-${CW}b${CR}bb\n"> <"\t\t+${CW}0${CR}bb\n"> <"\t\t ccc\n"> <"\tEOF\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"diff-highlight highlights the end of a line">)} 
      {
        (SQ <"\n"> <"\tcat >a <<-\\EOF &&\n"> <"\t\taaa\n"> <"\t\tbbb\n"> <"\t\tccc\n"> <"\tEOF\n"> <"\n"> 
          <"\tcat >b <<-\\EOF &&\n"> <"\t\taaa\n"> <"\t\tbb0\n"> <"\t\tccc\n"> <"\tEOF\n"> <"\n"> <"\tdh_test a b <<-EOF\n"> 
          <"\t\t@@ -1,3 +1,3 @@\n"> <"\t\t aaa\n"> <"\t\t-bb${CW}b${CR}\n"> <"\t\t+bb${CW}0${CR}\n"> <"\t\t ccc\n"> <"\tEOF\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"diff-highlight highlights the middle of a line">)} 
      {
        (SQ <"\n"> <"\tcat >a <<-\\EOF &&\n"> <"\t\taaa\n"> <"\t\tbbb\n"> <"\t\tccc\n"> <"\tEOF\n"> <"\n"> 
          <"\tcat >b <<-\\EOF &&\n"> <"\t\taaa\n"> <"\t\tb0b\n"> <"\t\tccc\n"> <"\tEOF\n"> <"\n"> <"\tdh_test a b <<-EOF\n"> 
          <"\t\t@@ -1,3 +1,3 @@\n"> <"\t\t aaa\n"> <"\t\t-b${CW}b${CR}b\n"> <"\t\t+b${CW}0${CR}b\n"> <"\t\t ccc\n"> <"\tEOF\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"diff-highlight does not highlight whole line">)} 
      {
        (SQ <"\n"> <"\tcat >a <<-\\EOF &&\n"> <"\t\taaa\n"> <"\t\tbbb\n"> <"\t\tccc\n"> <"\tEOF\n"> <"\n"> 
          <"\tcat >b <<-\\EOF &&\n"> <"\t\taaa\n"> <"\t\t000\n"> <"\t\tccc\n"> <"\tEOF\n"> <"\n"> <"\tdh_test a b <<-EOF\n"> 
          <"\t\t@@ -1,3 +1,3 @@\n"> <"\t\t aaa\n"> <"\t\t-bbb\n"> <"\t\t+000\n"> <"\t\t ccc\n"> <"\tEOF\n">
        )
      }
    )
    (C {(test_expect_failure)} {(SQ <"diff-highlight highlights mismatched hunk size">)} 
      {
        (SQ <"\n"> <"\tcat >a <<-\\EOF &&\n"> <"\t\taaa\n"> <"\t\tbbb\n"> <"\tEOF\n"> <"\n"> 
          <"\tcat >b <<-\\EOF &&\n"> <"\t\taaa\n"> <"\t\tb0b\n"> <"\t\tccc\n"> <"\tEOF\n"> <"\n"> <"\tdh_test a b <<-EOF\n"> 
          <"\t\t@@ -1,3 +1,3 @@\n"> <"\t\t aaa\n"> <"\t\t-b${CW}b${CR}b\n"> <"\t\t+b${CW}0${CR}b\n"> <"\t\t+ccc\n"> <"\tEOF\n">
        )
      }
    )
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:o_accent)
          op: Equal
          rhs: 
            {
              (CommandSubPart
                command_list: (CommandList children:[(C {(printf)} {(SQ <"\\303\\263">)})])
                left_token: <Left_CommandSub "$(">
                spids: [748 754]
              )
            }
          spids: [747]
        )
      ]
      spids: [747]
    )
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:o_stroke)
          op: Equal
          rhs: 
            {
              (CommandSubPart
                command_list: (CommandList children:[(C {(printf)} {(SQ <"\\303\\270">)})])
                left_token: <Left_CommandSub "$(">
                spids: [760 766]
              )
            }
          spids: [759]
        )
      ]
      spids: [759]
    )
    (C {(test_expect_success)} {(SQ <"diff-highlight treats multibyte utf-8 as a unit">)} 
      {
        (SQ <"\n"> <"\techo \"unic${o_accent}de\" >a &&\n"> <"\techo \"unic${o_stroke}de\" >b &&\n"> 
          <"\tdh_test a b <<-EOF\n"> <"\t\t@@ -1 +1 @@\n"> <"\t\t-unic${CW}${o_accent}${CR}de\n"> <"\t\t+unic${CW}${o_stroke}${CR}de\n"> 
          <"\tEOF\n">
        )
      }
    )
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:combine_accent)
          op: Equal
          rhs: 
            {
              (CommandSubPart
                command_list: (CommandList children:[(C {(printf)} {(SQ <"\\314\\201">)})])
                left_token: <Left_CommandSub "$(">
                spids: [800 806]
              )
            }
          spids: [799]
        )
      ]
      spids: [799]
    )
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:combine_circum)
          op: Equal
          rhs: 
            {
              (CommandSubPart
                command_list: (CommandList children:[(C {(printf)} {(SQ <"\\314\\202">)})])
                left_token: <Left_CommandSub "$(">
                spids: [812 818]
              )
            }
          spids: [811]
        )
      ]
      spids: [811]
    )
    (C {(test_expect_failure)} {(SQ <"diff-highlight treats combining code points as a unit">)} 
      {
        (SQ <"\n"> <"\techo \"unico${combine_accent}de\" >a &&\n"> 
          <"\techo \"unico${combine_circum}de\" >b &&\n"> <"\tdh_test a b <<-EOF\n"> <"\t\t@@ -1 +1 @@\n"> <"\t\t-unic${CW}o${combine_accent}${CR}de\n"> 
          <"\t\t+unic${CW}o${combine_circum}${CR}de\n"> <"\tEOF\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"diff-highlight works with the --graph option">)} 
      {
        (SQ <"\n"> <"\tdh_test_setup_history &&\n"> <"\n"> 
          <"\t# topo-order so that the order of the commits is the same as with --graph\n"> <"\t# trim graph elements so we can do a diff\n"> 
          <"\t# trim leading space because our trim_graph is not perfect\n"> <"\tgit log --branches -p --topo-order |\n"> <"\t\t\"$DIFF_HIGHLIGHT\" | left_trim >graph.exp &&\n"> 
          <"\tgit log --branches -p --graph |\n"> <"\t\t\"$DIFF_HIGHLIGHT\" | trim_graph | left_trim >graph.act &&\n"> 
          <"\ttest_cmp graph.exp graph.act\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"diff-highlight ignores combined diffs">)} 
      {
        (SQ <"\n"> <"\techo \"content\" >file &&\n"> <"\tgit add file &&\n"> 
          <"\tgit commit -m base &&\n"> <"\n"> <"\t>file &&\n"> <"\tgit commit -am master &&\n"> <"\n"> <"\tgit checkout -b other HEAD^ &&\n"> 
          <"\techo \"modified content\" >file &&\n"> <"\tgit commit -am other &&\n"> <"\n"> <"\ttest_must_fail git merge master &&\n"> 
          <"\techo \"resolved content\" >file &&\n"> <"\tgit commit -am resolved &&\n"> <"\n"> <"\tcat >expect <<-\\EOF &&\n"> <"\t--- a/file\n"> 
          <"\t+++ b/file\n"> <"\t@@@ -1,1 -1,0 +1,1 @@@\n"> <"\t- modified content\n"> <"\t++resolved content\n"> <"\tEOF\n"> <"\n"> 
          <"\tgit show -c | \"$DIFF_HIGHLIGHT\" >actual.raw &&\n"> <"\tsed -n \"/^---/,\\$p\" <actual.raw >actual &&\n"> <"\ttest_cmp expect actual\n">
        )
      }
    )
    (C {(test_done)})
  ]
)