(command.CommandList children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:test_description) op: assign_op.Equal rhs: { (SQ (Token id: Id.Lit_Chars val: 'utf-8 decomposed (nfd) converted to precomposed (nfc)' span_id: 15 ) ) } spids: [13] ) ] ) (C {(.)} {(./test-lib.sh)}) (command.If arms: [ (if_arm cond: [(command.Pipeline children:[(C {(test_have_prereq)} {(UTF8_NFD_TO_NFC)})] negated:T)] action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:skip_all) op: assign_op.Equal rhs: {(DQ ('filesystem does not corrupt utf-8'))} spids: [35] ) ] ) (C {(test_done)}) ] spids: [24 32] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:Adiarnfc) op: assign_op.Equal rhs: { (command_sub left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:50) command_list: (command.CommandList children: [(C {(printf)} {(SQ (Token id:Id.Lit_Chars val:'\\303\\204' span_id:54))})] ) ) } spids: [49] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:Adiarnfd) op: assign_op.Equal rhs: { (command_sub left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:59) command_list: (command.CommandList children: [ (C {(printf)} {(SQ (Token id:Id.Lit_Chars val:'A\\314\\210' span_id:63))}) ] ) ) } spids: [58] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:Odiarnfc) op: assign_op.Equal rhs: { (command_sub left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:69) command_list: (command.CommandList children: [(C {(printf)} {(SQ (Token id:Id.Lit_Chars val:'\\303\\226' span_id:73))})] ) ) } spids: [68] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:Odiarnfd) op: assign_op.Equal rhs: { (command_sub left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:78) command_list: (command.CommandList children: [ (C {(printf)} {(SQ (Token id:Id.Lit_Chars val:'O\\314\\210' span_id:82))}) ] ) ) } spids: [77] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:AEligatu) op: assign_op.Equal rhs: { (command_sub left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:87) command_list: (command.CommandList children: [(C {(printf)} {(SQ (Token id:Id.Lit_Chars val:'\\303\\206' span_id:91))})] ) ) } spids: [86] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:Invalidu) op: assign_op.Equal rhs: { (command_sub left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:96) command_list: (command.CommandList children: [ (C {(printf)} {(SQ (Token id:Id.Lit_Chars val:'\\303\\377' span_id:100))}) ] ) ) } spids: [95] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:Alongd) op: assign_op.Equal rhs: {($ Id.VSub_DollarName '$Adiarnfd') ($ Id.VSub_DollarName '$Adiarnfd') ($ Id.VSub_DollarName '$Adiarnfd') ($ Id.VSub_DollarName '$Adiarnfd') ($ Id.VSub_DollarName '$Adiarnfd') ($ Id.VSub_DollarName '$Adiarnfd') ($ Id.VSub_DollarName '$Adiarnfd') } spids: [109] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:Alongd) op: assign_op.Equal rhs: {($ Id.VSub_DollarName '$Alongd') ($ Id.VSub_DollarName '$Alongd') ($ Id.VSub_DollarName '$Alongd') } spids: [121] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:Alongd) op: assign_op.Equal rhs: {($ Id.VSub_DollarName '$Alongd') ($ Id.VSub_DollarName '$Alongd') ($ Id.VSub_DollarName '$Alongd') ($ Id.VSub_DollarName '$Alongd') ($ Id.VSub_DollarName '$Adiarnfd') } spids: [129] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:Alongc) op: assign_op.Equal rhs: {($ Id.VSub_DollarName '$AEligatu') ($ Id.VSub_DollarName '$AEligatu') ($ Id.VSub_DollarName '$AEligatu') ($ Id.VSub_DollarName '$AEligatu') ($ Id.VSub_DollarName '$AEligatu') } spids: [143] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:Alongc) op: assign_op.Equal rhs: {($ Id.VSub_DollarName '$Alongc') ($ Id.VSub_DollarName '$Alongc') ($ Id.VSub_DollarName '$Alongc') ($ Id.VSub_DollarName '$Alongc') ($ Id.VSub_DollarName '$Alongc') } spids: [153] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:Alongc) op: assign_op.Equal rhs: {($ Id.VSub_DollarName '$Alongc') ($ Id.VSub_DollarName '$Alongc') ($ Id.VSub_DollarName '$Alongc') ($ Id.VSub_DollarName '$Alongc') ($ Id.VSub_DollarName '$Alongc') } spids: [163] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:Alongc) op: assign_op.Equal rhs: {($ Id.VSub_DollarName '$Alongc') ($ Id.VSub_DollarName '$AEligatu') ($ Id.VSub_DollarName '$AEligatu') } spids: [173] ) ] ) (C {(test_expect_success)} {(DQ ('detect if nfd needed'))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:189) (Token id: Id.Lit_Chars val: '\tprecomposeunicode=$(git config core.precomposeunicode) &&\n' span_id: 190 ) (Token id:Id.Lit_Chars val:'\ttest "$precomposeunicode" = true &&\n' span_id:191) (Token id: Id.Lit_Chars val: '\tgit config core.precomposeunicode true\n' span_id: 192 ) ) } ) (C {(test_expect_success)} {(DQ (setup))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:202) (Token id:Id.Lit_Chars val:'\t>x &&\n' span_id:203) (Token id:Id.Lit_Chars val:'\tgit add x &&\n' span_id:204) (Token id:Id.Lit_Chars val:'\tgit commit -m "1st commit" &&\n' span_id:205) (Token id:Id.Lit_Chars val:'\tgit rm x &&\n' span_id:206) (Token id:Id.Lit_Chars val:'\tgit commit -m "rm x"\n' span_id:207) ) } ) (C {(test_expect_success)} {(DQ ('setup case mac'))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:217) (Token id:Id.Lit_Chars val:'\tgit checkout -b mac_os\n' span_id:218) ) } ) (C {(test_expect_success)} {(DQ ('git diff f.Adiar'))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:231) (Token id:Id.Lit_Chars val:'\ttouch f.$Adiarnfc &&\n' span_id:232) (Token id:Id.Lit_Chars val:'\tgit add f.$Adiarnfc &&\n' span_id:233) (Token id:Id.Lit_Chars val:'\techo f.Adiarnfc >f.$Adiarnfc &&\n' span_id:234) (Token id:Id.Lit_Chars val:'\tgit diff f.$Adiarnfd >expect &&\n' span_id:235) (Token id:Id.Lit_Chars val:'\tgit diff f.$Adiarnfc >actual &&\n' span_id:236) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual &&\n' span_id:237) (Token id:Id.Lit_Chars val:'\tgit reset HEAD f.Adiarnfc &&\n' span_id:238) (Token id:Id.Lit_Chars val:'\trm f.$Adiarnfc expect actual\n' span_id:239) ) } ) (C {(test_expect_success)} {(DQ ('git diff-files f.Adiar'))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:252) (Token id:Id.Lit_Chars val:'\ttouch f.$Adiarnfc &&\n' span_id:253) (Token id:Id.Lit_Chars val:'\tgit add f.$Adiarnfc &&\n' span_id:254) (Token id:Id.Lit_Chars val:'\techo f.Adiarnfc >f.$Adiarnfc &&\n' span_id:255) (Token id:Id.Lit_Chars val:'\tgit diff-files f.$Adiarnfd >expect &&\n' span_id:256) (Token id: Id.Lit_Chars val: '\tgit diff-files f.$Adiarnfc >actual &&\n' span_id: 257 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual &&\n' span_id:258) (Token id:Id.Lit_Chars val:'\tgit reset HEAD f.Adiarnfc &&\n' span_id:259) (Token id:Id.Lit_Chars val:'\trm f.$Adiarnfc expect actual\n' span_id:260) ) } ) (C {(test_expect_success)} {(DQ ('git diff-index f.Adiar'))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:273) (Token id:Id.Lit_Chars val:'\ttouch f.$Adiarnfc &&\n' span_id:274) (Token id:Id.Lit_Chars val:'\tgit add f.$Adiarnfc &&\n' span_id:275) (Token id:Id.Lit_Chars val:'\techo f.Adiarnfc >f.$Adiarnfc &&\n' span_id:276) (Token id:Id.Lit_Chars val:'\tgit diff-index HEAD f.$Adiarnfd >expect &&\n' span_id:277) (Token id: Id.Lit_Chars val: '\tgit diff-index HEAD f.$Adiarnfc >actual &&\n' span_id: 278 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual &&\n' span_id:279) (Token id:Id.Lit_Chars val:'\tgit reset HEAD f.Adiarnfc &&\n' span_id:280) (Token id:Id.Lit_Chars val:'\trm f.$Adiarnfc expect actual\n' span_id:281) ) } ) (C {(test_expect_success)} {(DQ ('add file Adiarnfc'))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:294) (Token id:Id.Lit_Chars val:'\techo f.Adiarnfc >f.$Adiarnfc &&\n' span_id:295) (Token id:Id.Lit_Chars val:'\tgit add f.$Adiarnfc &&\n' span_id:296) (Token id:Id.Lit_Chars val:'\tgit commit -m "add f.$Adiarnfc"\n' span_id:297) ) } ) (C {(test_expect_success)} {(DQ ('git diff-tree f.Adiar'))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:310) (Token id:Id.Lit_Chars val:'\techo f.Adiarnfc >>f.$Adiarnfc &&\n' span_id:311) (Token id:Id.Lit_Chars val:'\tgit diff-tree HEAD f.$Adiarnfd >expect &&\n' span_id:312) (Token id: Id.Lit_Chars val: '\tgit diff-tree HEAD f.$Adiarnfc >actual &&\n' span_id: 313 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual &&\n' span_id:314) (Token id:Id.Lit_Chars val:'\tgit checkout f.$Adiarnfc &&\n' span_id:315) (Token id:Id.Lit_Chars val:'\trm expect actual\n' span_id:316) ) } ) (C {(test_expect_success)} {(DQ ('stage file d.Adiarnfd/f.Adiarnfd'))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:329) (Token id:Id.Lit_Chars val:'\tmkdir d.$Adiarnfd &&\n' span_id:330) (Token id: Id.Lit_Chars val: '\techo d.$Adiarnfd/f.$Adiarnfd >d.$Adiarnfd/f.$Adiarnfd &&\n' span_id: 331 ) (Token id:Id.Lit_Chars val:'\tgit stage d.$Adiarnfd/f.$Adiarnfd &&\n' span_id:332) (Token id: Id.Lit_Chars val: '\tgit commit -m "add d.$Adiarnfd/f.$Adiarnfd"\n' span_id: 333 ) ) } ) (C {(test_expect_success)} {(DQ ('add link Adiarnfc'))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:343) (Token id: Id.Lit_Chars val: '\tln -s d.$Adiarnfd/f.$Adiarnfd l.$Adiarnfc &&\n' span_id: 344 ) (Token id:Id.Lit_Chars val:'\tgit add l.$Adiarnfc &&\n' span_id:345) (Token id:Id.Lit_Chars val:'\tgit commit -m "add l.Adiarnfc"\n' span_id:346) ) } ) (C {(test_expect_success)} {(DQ ('git log f.Adiar'))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:359) (Token id: Id.Lit_Chars val: '\tgit log f.$Adiarnfc > f.Adiarnfc.log &&\n' span_id: 360 ) (Token id:Id.Lit_Chars val:'\tgit log f.$Adiarnfd > f.Adiarnfd.log &&\n' span_id:361) (Token id:Id.Lit_Chars val:'\ttest -s f.Adiarnfc.log &&\n' span_id:362) (Token id:Id.Lit_Chars val:'\ttest -s f.Adiarnfd.log &&\n' span_id:363) (Token id: Id.Lit_Chars val: '\ttest_cmp f.Adiarnfc.log f.Adiarnfd.log &&\n' span_id: 364 ) (Token id:Id.Lit_Chars val:'\trm f.Adiarnfc.log f.Adiarnfd.log\n' span_id:365) ) } ) (C {(test_expect_success)} {(DQ ('git lsfiles f.Adiar'))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:378) (Token id: Id.Lit_Chars val: '\tgit ls-files f.$Adiarnfc > f.Adiarnfc.log &&\n' span_id: 379 ) (Token id:Id.Lit_Chars val:'\tgit ls-files f.$Adiarnfd > f.Adiarnfd.log &&\n' span_id:380) (Token id:Id.Lit_Chars val:'\ttest -s f.Adiarnfc.log &&\n' span_id:381) (Token id:Id.Lit_Chars val:'\ttest -s f.Adiarnfd.log &&\n' span_id:382) (Token id: Id.Lit_Chars val: '\ttest_cmp f.Adiarnfc.log f.Adiarnfd.log &&\n' span_id: 383 ) (Token id:Id.Lit_Chars val:'\trm f.Adiarnfc.log f.Adiarnfd.log\n' span_id:384) ) } ) (C {(test_expect_success)} {(DQ ('git mv'))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:397) (Token id:Id.Lit_Chars val:'\tgit mv f.$Adiarnfd f.$Odiarnfc &&\n' span_id:398) (Token id:Id.Lit_Chars val:'\tgit mv d.$Adiarnfd d.$Odiarnfc &&\n' span_id:399) (Token id:Id.Lit_Chars val:'\tgit mv l.$Adiarnfd l.$Odiarnfc &&\n' span_id:400) (Token id:Id.Lit_Chars val:'\tgit commit -m "mv Adiarnfd Odiarnfc"\n' span_id:401) ) } ) (C {(test_expect_success)} {(DQ ('git checkout nfc'))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:417) (Token id:Id.Lit_Chars val:'\trm f.$Odiarnfc &&\n' span_id:418) (Token id:Id.Lit_Chars val:'\tgit checkout f.$Odiarnfc\n' span_id:419) ) } ) (C {(test_expect_success)} {(DQ ('git checkout file nfd'))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:432) (Token id:Id.Lit_Chars val:'\trm -f f.* &&\n' span_id:433) (Token id:Id.Lit_Chars val:'\tgit checkout f.$Odiarnfd\n' span_id:434) ) } ) (C {(test_expect_success)} {(DQ ('git checkout link nfd'))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:447) (Token id:Id.Lit_Chars val:'\trm l.* &&\n' span_id:448) (Token id:Id.Lit_Chars val:'\tgit checkout l.$Odiarnfd\n' span_id:449) ) } ) (C {(test_expect_success)} {(DQ ('setup case mac2'))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:459) (Token id:Id.Lit_Chars val:'\tgit checkout master &&\n' span_id:460) (Token id:Id.Lit_Chars val:'\tgit reset --hard &&\n' span_id:461) (Token id:Id.Lit_Chars val:'\tgit checkout -b mac_os_2\n' span_id:462) ) } ) (C {(test_expect_success)} {(DQ ('commit file d2.Adiarnfd/f.Adiarnfd'))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:475) (Token id:Id.Lit_Chars val:'\tmkdir d2.$Adiarnfd &&\n' span_id:476) (Token id: Id.Lit_Chars val: '\techo d2.$Adiarnfd/f.$Adiarnfd >d2.$Adiarnfd/f.$Adiarnfd &&\n' span_id: 477 ) (Token id:Id.Lit_Chars val:'\tgit add d2.$Adiarnfd/f.$Adiarnfd &&\n' span_id:478) (Token id: Id.Lit_Chars val: '\tgit commit -m "add d2.$Adiarnfd/f.$Adiarnfd" -- d2.$Adiarnfd/f.$Adiarnfd\n' span_id: 479 ) ) } ) (C {(test_expect_success)} {(DQ ('setup for long decomposed filename'))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:489) (Token id:Id.Lit_Chars val:'\tgit checkout master &&\n' span_id:490) (Token id:Id.Lit_Chars val:'\tgit reset --hard &&\n' span_id:491) (Token id:Id.Lit_Chars val:'\tgit checkout -b mac_os_long_nfd_fn\n' span_id:492) ) } ) (C {(test_expect_success)} {(DQ ('Add long decomposed filename'))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:502) (Token id:Id.Lit_Chars val:'\techo longd >$Alongd &&\n' span_id:503) (Token id:Id.Lit_Chars val:'\tgit add * &&\n' span_id:504) (Token id:Id.Lit_Chars val:'\tgit commit -m "Long filename"\n' span_id:505) ) } ) (C {(test_expect_success)} {(DQ ('setup for long precomposed filename'))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:515) (Token id:Id.Lit_Chars val:'\tgit checkout master &&\n' span_id:516) (Token id:Id.Lit_Chars val:'\tgit reset --hard &&\n' span_id:517) (Token id:Id.Lit_Chars val:'\tgit checkout -b mac_os_long_nfc_fn\n' span_id:518) ) } ) (C {(test_expect_success)} {(DQ ('Add long precomposed filename'))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:528) (Token id:Id.Lit_Chars val:'\techo longc >$Alongc &&\n' span_id:529) (Token id:Id.Lit_Chars val:'\tgit add * &&\n' span_id:530) (Token id:Id.Lit_Chars val:'\tgit commit -m "Long filename"\n' span_id:531) ) } ) (C {(test_expect_failure)} {(SQ (Token id:Id.Lit_Chars val:'handle existing decomposed filenames' span_id:538))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:542) (Token id: Id.Lit_Chars val: '\techo content >"verbatim.$Adiarnfd" &&\n' span_id: 543 ) (Token id: Id.Lit_Chars val: '\tgit -c core.precomposeunicode=false add "verbatim.$Adiarnfd" &&\n' span_id: 544 ) (Token id:Id.Lit_Chars val:'\tgit commit -m "existing decomposed file" &&\n' span_id:545) (Token id:Id.Lit_Chars val:'\t>expect &&\n' span_id:546) (Token id: Id.Lit_Chars val: '\tgit ls-files --exclude-standard -o "verbatim*" >untracked &&\n' span_id: 547 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect untracked\n' span_id:548) ) } ) (C {(test_expect_success)} {(DQ ('respect git config --global core.precomposeunicode'))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:565) (Token id: Id.Lit_Chars val: '\tgit config --global core.precomposeunicode true &&\n' span_id: 566 ) (Token id:Id.Lit_Chars val:'\trm -rf .git &&\n' span_id:567) (Token id:Id.Lit_Chars val:'\tgit init &&\n' span_id:568) (Token id: Id.Lit_Chars val: '\tprecomposeunicode=$(git config core.precomposeunicode) &&\n' span_id: 569 ) (Token id:Id.Lit_Chars val:'\ttest "$precomposeunicode" = "true"\n' span_id:570) ) } ) (C {(test_done)}) ] )