(CommandList
  children: [
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:test_description)
          op: Equal
          rhs: 
            {
              (SQ <'merge-recursive space options\n'> <'\n'> <'* [master] Clarify\n'> 
                <' ! [remote] Remove cruft\n'> <'--\n'> <' + [remote] Remove cruft\n'> <'*  [master] Clarify\n'> <'*+ [remote^] Initial revision\n'> 
                <'*   ok 1: setup\n'>
              )
            }
          spids: [4]
        )
      ]
      spids: [4]
    )
    (C {(.)} {(./test-lib.sh)})
    (AndOr
      children: [
        (C {(test_have_prereq)} {(SED_STRIPS_CR)})
        (Assignment
          keyword: Assign_None
          pairs: [(assign_pair lhs:(LhsName name:SED_OPTIONS) op:Equal rhs:{(-b)} spids:[29])]
          spids: [29]
        )
      ]
      op_id: Op_DAmp
    )
    (If
      arms: [
        (if_arm
          cond: [(C {(test_have_prereq)} {(GREP_STRIPS_CR)})]
          action: [
            (Assignment
              keyword: Assign_None
              pairs: [(assign_pair lhs:(LhsName name:GREP_OPTIONS) op:Equal rhs:{(-U)} spids:[41])]
              spids: [41]
            )
            (C {(export)} {(GREP_OPTIONS)})
          ]
          spids: [-1 38]
        )
      ]
      spids: [-1 49]
    )
    (C {(test_expect_success)} {(SQ <setup>)} 
      {
        (SQ <'\n'> <'\tconflict_hunks () {\n'> <'\t\tsed $SED_OPTIONS -n -e "\n'> 
          <'\t\t\t/^<<<</ b conflict\n'> <'\t\t\tb\n'> <'\t\t\t: conflict\n'> <'\t\t\tp\n'> <'\t\t\t/^>>>>/ b\n'> <'\t\t\tn\n'> 
          <'\t\t\tb conflict\n'> <'\t\t" "$@"\n'> <'\t} &&\n'> <'\n'> <'\tcat <<-\\EOF >text.txt &&\n'> 
          <'\t    Hope, he says, cherishes the soul of him who lives in\n'> <'\t    justice and holiness and is the nurse of his age and the\n'> 
          <'\t    companion of his journey;--hope which is mightiest to sway\n'> <'\t    the restless soul of man.\n'> <'\n'> 
          <'\tHow admirable are his words!  And the great blessing of riches, I do\n'> <'\tnot say to every man, but to a good man, is, that he has had no\n'> 
          <'\toccasion to deceive or to defraud others, either intentionally or\n'> <'\tunintentionally; and when he departs to the world below he is not in\n'> 
          <'\tany apprehension about offerings due to the gods or debts which he owes\n'> <'\tto men.  Now to this peace of mind the possession of wealth greatly\n'> 
          <'\tcontributes; and therefore I say, that, setting one thing against\n'> <'\tanother, of the many advantages which wealth has to give, to a man of\n'> 
          <'\tsense this is in my opinion the greatest.\n'> <'\n'> <'\tWell said, Cephalus, I replied; but as concerning justice, what is\n'> 
          <'\tit?--to speak the truth and to pay your debts--no more than this?  And\n'> <'\teven to this are there not exceptions?  Suppose that a friend when in\n'> 
          <'\this right mind has deposited arms with me and he asks for them when he\n'> <'\tis not in his right mind, ought I to give them back to him?  No one\n'> 
          <'\twould say that I ought or that I should be right in doing so, any more\n'> <'\tthan they would say that I ought always to speak the truth to one who\n'> 
          <'\tis in his condition.\n'> <'\n'> <'\tYou are quite right, he replied.\n'> <'\n'> 
          <'\tBut then, I said, speaking the truth and paying your debts is not a\n'> <'\tcorrect definition of justice.\n'> <'\n'> <'\tCEPHALUS - SOCRATES - POLEMARCHUS\n'> <'\n'> 
          <'\tQuite correct, Socrates, if Simonides is to be believed, said\n'> <'\tPolemarchus interposing.\n'> <'\n'> 
          <'\tI fear, said Cephalus, that I must go now, for I have to look after the\n'> <'\tsacrifices, and I hand over the argument to Polemarchus and the company.\n'> <'\tEOF\n'> 
          <'\tgit add text.txt &&\n'> <'\ttest_tick &&\n'> <'\tgit commit -m "Initial revision" &&\n'> <'\n'> 
          <'\tgit checkout -b remote &&\n'> <'\tsed -e "\n'> <'\t\t\ts/\\.  /\\. /g\n'> <'\t\t\ts/[?]  /? /g\n'> <'\t\t\ts/    /\t/g\n'> 
          <'\t\t\ts/--/---/g\n'> <'\t\t\ts/but as concerning/but as con cerning/\n'> <'\t\t\t/CEPHALUS - SOCRATES - POLEMARCHUS/ d\n'> 
          <'\t\t" text.txt >text.txt+ &&\n'> <'\tmv text.txt+ text.txt &&\n'> <'\tgit commit -a -m "Remove cruft" &&\n'> <'\n'> 
          <'\tgit checkout master &&\n'> <'\tsed -e "\n'> <'\t\t\ts/\\(not in his right mind\\),\\(.*\\)/\\1;\\2Q/\n'> 
          <'\t\t\ts/Quite correct\\(.*\\)/It is too correct\\1Q/\n'> <'\t\t\ts/unintentionally/un intentionally/\n'> <'\t\t\t/un intentionally/ s/$/Q/\n'> 
          <'\t\t\ts/Polemarchus interposing./Polemarchus, interposing.Q/\n'> <'\t\t\t/justice and holiness/ s/$/Q/\n'> <'\t\t\t/pay your debts/ s/$/Q/\n'> 
          <'\t\t" text.txt | q_to_cr >text.txt+ &&\n'> <'\tmv text.txt+ text.txt &&\n'> <'\tgit commit -a -m "Clarify" &&\n'> <'\tgit show-branch --all\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'naive merge fails'>)} 
      {
        (SQ <'\n'> <'\tgit read-tree --reset -u HEAD &&\n'> 
          <'\ttest_must_fail git merge-recursive HEAD^ -- HEAD remote &&\n'> <'\ttest_must_fail git update-index --refresh &&\n'> <'\tgrep "<<<<<<" text.txt\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'--ignore-space-change makes merge succeed'>)} 
      {
        (SQ <'\n'> <'\tgit read-tree --reset -u HEAD &&\n'> 
          <'\tgit merge-recursive --ignore-space-change HEAD^ -- HEAD remote\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'naive cherry-pick fails'>)} 
      {
        (SQ <'\n'> <'\tgit read-tree --reset -u HEAD &&\n'> 
          <'\ttest_must_fail git cherry-pick --no-commit remote &&\n'> <'\tgit read-tree --reset -u HEAD &&\n'> <'\ttest_must_fail git cherry-pick remote &&\n'> 
          <'\ttest_must_fail git update-index --refresh &&\n'> <'\tgrep "<<<<<<" text.txt\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'-Xignore-space-change makes cherry-pick succeed'>)} 
      {
        (SQ <'\n'> <'\tgit read-tree --reset -u HEAD &&\n'> 
          <'\tgit cherry-pick --no-commit -Xignore-space-change remote\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'--ignore-space-change: our w/s-only change wins'>)} 
      {
        (SQ <'\n'> <'\tq_to_cr <<-\\EOF >expected &&\n'> 
          <'\t    justice and holiness and is the nurse of his age and theQ\n'> <'\tEOF\n'> <'\n'> <'\tgit read-tree --reset -u HEAD &&\n'> 
          <'\tgit merge-recursive --ignore-space-change HEAD^ -- HEAD remote &&\n'> <'\tgrep "justice and holiness" text.txt >actual &&\n'> <'\ttest_cmp expected actual\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'--ignore-space-change: their real change wins over w/s'>)} 
      {
        (SQ <'\n'> <'\tcat <<-\\EOF >expected &&\n'> 
          <'\tit?---to speak the truth and to pay your debts---no more than this? And\n'> <'\tEOF\n'> <'\n'> <'\tgit read-tree --reset -u HEAD &&\n'> 
          <'\tgit merge-recursive --ignore-space-change HEAD^ -- HEAD remote &&\n'> <'\tgrep "pay your debts" text.txt >actual &&\n'> <'\ttest_cmp expected actual\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'--ignore-space-change: does not ignore new spaces'>)} 
      {
        (SQ <'\n'> <'\tcat <<-\\EOF >expected1 &&\n'> 
          <'\tWell said, Cephalus, I replied; but as con cerning justice, what is\n'> <'\tEOF\n'> <'\tq_to_cr <<-\\EOF >expected2 &&\n'> 
          <'\tun intentionally; and when he departs to the world below he is not inQ\n'> <'\tEOF\n'> <'\n'> <'\tgit read-tree --reset -u HEAD &&\n'> 
          <'\tgit merge-recursive --ignore-space-change HEAD^ -- HEAD remote &&\n'> <'\tgrep "Well said" text.txt >actual1 &&\n'> <'\tgrep "when he departs" text.txt >actual2 &&\n'> 
          <'\ttest_cmp expected1 actual1 &&\n'> <'\ttest_cmp expected2 actual2\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'--ignore-all-space drops their new spaces'>)} 
      {
        (SQ <'\n'> <'\tcat <<-\\EOF >expected &&\n'> 
          <'\tWell said, Cephalus, I replied; but as concerning justice, what is\n'> <'\tEOF\n'> <'\n'> <'\tgit read-tree --reset -u HEAD &&\n'> 
          <'\tgit merge-recursive --ignore-all-space HEAD^ -- HEAD remote &&\n'> <'\tgrep "Well said" text.txt >actual &&\n'> <'\ttest_cmp expected actual\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'--ignore-all-space keeps our new spaces'>)} 
      {
        (SQ <'\n'> <'\tq_to_cr <<-\\EOF >expected &&\n'> 
          <'\tun intentionally; and when he departs to the world below he is not inQ\n'> <'\tEOF\n'> <'\n'> <'\tgit read-tree --reset -u HEAD &&\n'> 
          <'\tgit merge-recursive --ignore-all-space HEAD^ -- HEAD remote &&\n'> <'\tgrep "when he departs" text.txt >actual &&\n'> <'\ttest_cmp expected actual\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <--ignore-space-at-eol>)} 
      {
        (SQ <'\n'> <'\tq_to_cr <<-\\EOF >expected &&\n'> <'\t<<<<<<< HEAD\n'> 
          <'\tis not in his right mind; ought I to give them back to him?  No oneQ\n'> <'\t=======\n'> <'\tis not in his right mind, ought I to give them back to him? No one\n'> 
          <'\t>>>>>>> remote\n'> <'\tEOF\n'> <'\n'> <'\tgit read-tree --reset -u HEAD &&\n'> 
          <'\ttest_must_fail git merge-recursive --ignore-space-at-eol \\\n'> <'\t\t\t\t\t\t HEAD^ -- HEAD remote &&\n'> <'\tconflict_hunks text.txt >actual &&\n'> 
          <'\ttest_cmp expected actual\n'>
        )
      }
    )
    (C {(test_done)})
  ]
)