(command.CommandList children: [ (command.FuncDef name: create_lib_submodule_repo body: (command.BraceGroup children: [ (command.AndOr ops: [Op_DAmp] children: [ (C {(git)} {(init)} {(submodule_update_repo)}) (command.Subshell command_list: (command.CommandList children: [ (command.AndOr ops: [ Op_DAmp Op_DAmp Op_DAmp Op_DAmp Op_DAmp Op_DAmp Op_DAmp Op_DAmp Op_DAmp Op_DAmp Op_DAmp Op_DAmp Op_DAmp Op_DAmp Op_DAmp Op_DAmp Op_DAmp Op_DAmp Op_DAmp Op_DAmp Op_DAmp Op_DAmp Op_DAmp Op_DAmp Op_DAmp Op_DAmp Op_DAmp Op_DAmp Op_DAmp Op_DAmp Op_DAmp Op_DAmp Op_DAmp Op_DAmp Op_DAmp Op_DAmp Op_DAmp Op_DAmp Op_DAmp Op_DAmp Op_DAmp Op_DAmp Op_DAmp ] children: [ (C {(cd)} {(submodule_update_repo)}) (command.SimpleCommand words: [{(echo)} {(DQ (expect))}] redirects: [ (redir.Redir op: <Redir_DGreat '>>'> fd: 16777215 arg_word: {(.gitignore)} ) ] ) (command.SimpleCommand words: [{(echo)} {(DQ (actual))}] redirects: [ (redir.Redir op: <Redir_DGreat '>>'> fd: 16777215 arg_word: {(.gitignore)} ) ] ) (command.SimpleCommand words: [{(echo)} {(DQ (x))}] redirects: [ (redir.Redir op: <Redir_Great '>'> fd: 16777215 arg_word: {(file1)} ) ] ) (command.SimpleCommand words: [{(echo)} {(DQ (y))}] redirects: [ (redir.Redir op: <Redir_Great '>'> fd: 16777215 arg_word: {(file2)} ) ] ) (C {(git)} {(add)} {(.gitignore)} {(file1)} {(file2)}) (C {(git)} {(commit)} {(-m)} {(DQ (Base))}) (C {(git)} {(branch)} {(DQ (no_submodule))}) (C {(git)} {(checkout)} {(-b)} {(DQ (add_sub1))}) (C {(git)} {(submodule)} {(add)} {(./.)} {(sub1)}) (C {(git)} {(config)} {(-f)} {(.gitmodules)} {(submodule.sub1.ignore)} {(all)}) (C {(git)} {(config)} {(submodule.sub1.ignore)} {(all)}) (C {(git)} {(add)} {(.gitmodules)}) (C {(git)} {(commit)} {(-m)} {(DQ ('Add sub1'))}) (C {(git)} {(checkout)} {(-b)} {(remove_sub1)}) (C {(git)} {(revert)} {(HEAD)}) (C {(git)} {(checkout)} {(-b)} {(DQ (modify_sub1))} {(DQ (add_sub1))}) (C {(git)} {(submodule)} {(update)}) (command.Subshell command_list: (command.CommandList children: [ (command.AndOr ops: [Op_DAmp Op_DAmp Op_DAmp Op_DAmp Op_DAmp Op_DAmp Op_DAmp] children: [ (C {(cd)} {(sub1)}) (C {(git)} {(fetch)}) (C {(git)} {(checkout)} {(-b)} {(DQ (modifications))}) (command.SimpleCommand words: [{(echo)} {(DQ (z))}] redirects: [ (redir.Redir op: <Redir_Great '>'> fd: 16777215 arg_word: {(file2)} ) ] ) (command.SimpleCommand words: [{(echo)} {(DQ (x))}] redirects: [ (redir.Redir op: <Redir_Great '>'> fd: 16777215 arg_word: {(file3)} ) ] ) (C {(git)} {(add)} {(file2)} {(file3)}) (C {(git)} {(commit)} {(-m)} {(DQ ('modified file2 and added file3'))} ) (C {(git)} {(push)} {(origin)} {(modifications)}) ] ) ] ) ) (C {(git)} {(add)} {(sub1)}) (C {(git)} {(commit)} {(-m)} {(DQ ('Modify sub1'))}) (C {(git)} {(checkout)} {(-b)} {(DQ (replace_sub1_with_directory))} {(DQ (add_sub1))} ) (C {(git)} {(submodule)} {(update)}) (command.Subshell command_list: (command.CommandList children: [ (command.AndOr ops: [Op_DAmp] children: [ (C {(cd)} {(sub1)}) (C {(git)} {(checkout)} {(modifications)}) ] ) ] ) ) (C {(git)} {(rm)} {(--cached)} {(sub1)}) (C {(rm)} {(sub1/.git) (Lit_Other '*')}) (C {(git)} {(config)} {(-f)} {(.gitmodules)} {(--remove-section)} {(DQ (submodule.sub1))} ) (C {(git)} {(add)} {(.gitmodules)} {(sub1/) (Lit_Other '*')}) (C {(git)} {(commit)} {(-m)} {(DQ ('Replace sub1 with directory'))}) (C {(git)} {(checkout)} {(-b)} {(replace_directory_with_sub1)}) (C {(git)} {(revert)} {(HEAD)}) (C {(git)} {(checkout)} {(-b)} {(DQ (replace_sub1_with_file))} {(DQ (add_sub1))} ) (C {(git)} {(rm)} {(sub1)}) (command.SimpleCommand words: [{(echo)} {(DQ (content))}] redirects: [ (redir.Redir op: <Redir_Great '>'> fd: 16777215 arg_word: {(sub1)} ) ] ) (C {(git)} {(add)} {(sub1)}) (C {(git)} {(commit)} {(-m)} {(DQ ('Replace sub1 with file'))}) (C {(git)} {(checkout)} {(-b)} {(replace_file_with_sub1)}) (C {(git)} {(revert)} {(HEAD)}) (C {(git)} {(checkout)} {(-b)} {(DQ (invalid_sub1))} {(DQ (add_sub1))}) (C {(git)} {(update-index)} {(--cacheinfo)} {(160000)} {(0123456789012345678901234567890123456789)} {(sub1)} ) (C {(git)} {(commit)} {(-m)} {(DQ ('Invalid sub1 commit'))}) (C {(git)} {(checkout)} {(-b)} {(valid_sub1)}) (C {(git)} {(revert)} {(HEAD)}) (C {(git)} {(checkout)} {(master)}) ] ) ] ) ) ] ) ] ) ) (command.FuncDef name: replace_gitfile_with_git_dir body: (command.BraceGroup children: [ (command.Subshell command_list: (command.CommandList children: [ (command.AndOr ops: [Op_DAmp Op_DAmp Op_DAmp Op_DAmp] children: [ (C {(cd)} {(DQ ($ VSub_Number '$1'))}) (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:git_dir) op: Equal rhs: { (DQ (word_part.CommandSubPart command_list: (command.CommandList children: [(C {(git)} {(rev-parse)} {(--git-dir)})] ) left_token: <Left_CommandSub '$('> ) ) } ) ] ) (C {(rm)} {(-f)} {(.git)}) (C {(cp)} {(-R)} {(DQ ($ VSub_DollarName '$git_dir'))} {(.git)}) (command.SimpleCommand words: [{(git)} {(config)} {(--unset)} {(core.worktree)}] more_env: [(env_pair name:GIT_WORK_TREE val:{(.)})] ) ] ) ] ) ) ] ) ) (command.FuncDef name: test_git_directory_is_unchanged body: (command.BraceGroup children: [ (command.AndOr ops: [Op_DAmp Op_DAmp] children: [ (command.Subshell command_list: (command.CommandList children: [ (command.AndOr ops: [Op_DAmp Op_DAmp] children: [ (C {(cd)} {(DQ (.git/modules/) ($ VSub_Number '$1'))}) (C {(test)} { (DQ (word_part.CommandSubPart command_list: (command.CommandList children: [(C {(git)} {(config)} {(core.worktree)})] ) left_token: <Left_CommandSub '$('> ) ) } {(Lit_Other '=')} {(DQ (../../../) ($ VSub_Number '$1'))} ) (C {(git)} {(config)} {(--unset)} {(core.worktree)}) ] ) ] ) ) (C {(diff)} {(-r)} {(DQ (.git/modules/) ($ VSub_Number '$1'))} {(DQ ($ VSub_Number '$1') (/.git))} ) (command.Subshell command_list: (command.CommandList children: [ (command.AndOr ops: [Op_DAmp] children: [ (C {(cd)} {(DQ (.git/modules/) ($ VSub_Number '$1'))}) (C {(git)} {(config)} {(core.worktree)} {(DQ (../../../) ($ VSub_Number '$1'))} ) ] ) ] ) ) ] ) ] ) ) (command.FuncDef name: prolog body: (command.BraceGroup children: [ (command.AndOr ops: [Op_DAmp Op_DAmp] children: [ (command.Subshell command_list: (command.CommandList children: [ (command.AndOr ops: [Op_DPipe] children: [ (C {(test)} {(-d)} {(submodule_update_repo)}) (C {(create_lib_submodule_repo)}) ] ) ] ) ) (C {(test_config_global)} {(diff.ignoreSubmodules)} {(all)}) (C {(test_config)} {(diff.ignoreSubmodules)} {(all)}) ] ) ] ) ) (command.FuncDef name: reset_work_tree_to body: (command.BraceGroup children: [ (command.AndOr ops: [Op_DAmp Op_DAmp] children: [ (C {(rm)} {(-rf)} {(submodule_update)}) (C {(git)} {(clone)} {(submodule_update_repo)} {(submodule_update)}) (command.Subshell command_list: (command.CommandList children: [ (command.AndOr ops: [Op_DAmp Op_DAmp Op_DAmp Op_DAmp Op_DAmp Op_DAmp] children: [ (C {(cd)} {(submodule_update)}) (C {(rm)} {(-rf)} {(sub1)}) (C {(git)} {(checkout)} {(-f)} {(DQ ($ VSub_Number '$1'))}) (command.SimpleCommand words: [{(git)} {(status)} {(-u)} {(-s)}] redirects: [ (redir.Redir op: <Redir_Great '>'> fd: 16777215 arg_word: {(actual)} ) ] ) (C {(test_must_be_empty)} {(actual)}) (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:sha1) op: Equal rhs: { (word_part.CommandSubPart command_list: (command.CommandList children: [ (C {(git)} {(rev-parse)} {(--revs-only)} {(HEAD) (Lit_Other ':') (sub1)} ) ] ) left_token: <Left_CommandSub '$('> ) } ) ] ) (command.If arms: [ (if_arm cond: [ (command.AndOr ops: [Op_DAmp] children: [ (C {(test)} {(-n)} {(DQ ($ VSub_DollarName '$sha1'))}) (C {(test)} { (word_part.CommandSubPart command_list: (command.CommandList children: [ (command.AndOr ops: [Op_DAmp] children: [ (C {(cd)} {(DQ (sub1))}) (C {(git)} {(rev-parse)} {(--verify)} { (DQ ($ VSub_DollarName '$sha1') ('^{commit}') ) } ) ] ) ] ) left_token: <Left_CommandSub '$('> ) } ) ] ) ] action: [ (C {(git)} {(submodule)} {(update)} {(--init)} {(--recursive)} {(DQ (sub1))} ) ] ) ] ) ] ) ] ) ) ] ) ] ) ) (command.FuncDef name: test_superproject_content body: (command.BraceGroup children: [ (command.AndOr ops: [Op_DAmp Op_DAmp Op_DAmp] children: [ (command.SimpleCommand words: [{(git)} {(diff-index)} {(--cached)} {(DQ ($ VSub_Number '$1'))}] redirects: [(redir.Redir op:<Redir_Great '>'> fd:16777215 arg_word:{(actual)})] ) (C {(test_must_be_empty)} {(actual)}) (command.SimpleCommand words: [{(git)} {(diff-files)} {(--ignore-submodules)}] redirects: [(redir.Redir op:<Redir_Great '>'> fd:16777215 arg_word:{(actual)})] ) (C {(test_must_be_empty)} {(actual)}) ] ) ] ) ) (command.FuncDef name: test_submodule_content body: (command.BraceGroup children: [ (command.AndOr ops: [Op_DAmp Op_DAmp Op_DAmp Op_DAmp Op_DAmp Op_DAmp Op_DAmp] children: [ (command.If arms: [ (if_arm cond: [(C {(test)} {($ VSub_Pound '$#')} {(KW_Bang '!') (Lit_Other '=')} {(2)})] action: [ (C {(echo)} {(DQ ('test_submodule_content needs two arguments'))}) (command.ControlFlow token: <ControlFlow_Return return> arg_word: {(1)} ) ] ) ] ) (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:submodule) op: Equal rhs: {(DQ ($ VSub_Number '$1'))} ) ] ) (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:commit) op: Equal rhs: {(DQ ($ VSub_Number '$2'))} ) ] ) (C {(test)} {(-d)} {(DQ ($ VSub_DollarName '$submodule')) (/)}) (command.If arms: [ (if_arm cond: [ (command.AndOr ops: [Op_DAmp] children: [ (command.Pipeline children: [ (C {(test)} {(-f)} {(DQ ($ VSub_DollarName '$submodule')) (/.git)}) ] negated: T ) (command.Pipeline children: [ (C {(test)} {(-d)} {(DQ ($ VSub_DollarName '$submodule')) (/.git)}) ] negated: T ) ] ) ] action: [ (C {(echo)} {(DQ ('Submodule ') ($ VSub_DollarName '$submodule') (' is not populated'))} ) (command.ControlFlow token: <ControlFlow_Return return> arg_word: {(1)} ) ] ) ] ) (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:sha1) op: Equal rhs: { (word_part.CommandSubPart command_list: (command.CommandList children: [ (C {(git)} {(rev-parse)} {(--verify)} { (DQ ($ VSub_DollarName '$commit') (':') ($ VSub_DollarName '$submodule') ) } ) ] ) left_token: <Left_CommandSub '$('> ) } ) ] ) (command.If arms: [ (if_arm cond: [(C {(test)} {(-z)} {(DQ ($ VSub_DollarName '$sha1'))})] action: [ (C {(echo)} { (DQ ("Couldn't retrieve SHA-1 of ") ($ VSub_DollarName '$submodule') (' for ') ($ VSub_DollarName '$commit') ) } ) (command.ControlFlow token: <ControlFlow_Return return> arg_word: {(1)} ) ] ) ] ) (command.Subshell command_list: (command.CommandList children: [ (command.AndOr ops: [Op_DAmp Op_DAmp Op_DAmp Op_DAmp] children: [ (C {(cd)} {(DQ ($ VSub_DollarName '$submodule'))}) (command.SimpleCommand words: [{(git)} {(status)} {(-u)} {(-s)}] redirects: [ (redir.Redir op: <Redir_Great '>'> fd: 16777215 arg_word: {(actual)} ) ] ) (C {(test_must_be_empty)} {(actual)}) (command.SimpleCommand words: [{(git)} {(diff)} {(DQ ($ VSub_DollarName '$sha1'))}] redirects: [ (redir.Redir op: <Redir_Great '>'> fd: 16777215 arg_word: {(actual)} ) ] ) (C {(test_must_be_empty)} {(actual)}) ] ) ] ) ) ] ) ] ) ) (command.FuncDef name: test_submodule_switch body: (command.BraceGroup children: [ (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:command) op: Equal rhs: {(DQ ($ VSub_Number '$1'))} ) ] ) (command.If arms: [ (if_arm cond: [ (C {(test)} {(DQ ($ VSub_DollarName '$KNOWN_FAILURE_STASH_DOES_IGNORE_SUBMODULE_CHANGES'))} {(Lit_Other '=')} {(1)} ) ] action: [ (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:RESULT) op: Equal rhs: {(DQ (failure))} ) ] ) ] ) ] else_action: [ (command.Assignment keyword: Assign_None pairs: [(assign_pair lhs:(lhs_expr.LhsName name:RESULT) op:Equal rhs:{(DQ (success))})] ) ] ) (C {(test_expect_) ($ VSub_DollarName '$RESULT')} {(DQ ($ VSub_DollarName '$command') (': added submodule creates empty directory'))} { (SQ <'\n'> <'\t\tprolog &&\n'> <'\t\treset_work_tree_to no_submodule &&\n'> <'\t\t(\n'> <'\t\t\tcd submodule_update &&\n'> <'\t\t\tgit branch -t add_sub1 origin/add_sub1 &&\n'> <'\t\t\t$command add_sub1 &&\n'> <'\t\t\ttest_superproject_content origin/add_sub1 &&\n'> <'\t\t\ttest_dir_is_empty sub1 &&\n'> <'\t\t\tgit submodule update --init --recursive &&\n'> <'\t\t\ttest_submodule_content sub1 origin/add_sub1\n'> <'\t\t)\n'> <'\t'> ) } ) (C {(test_expect_) ($ VSub_DollarName '$RESULT')} { (DQ ($ VSub_DollarName '$command') (': added submodule leaves existing empty directory alone') ) } { (SQ <'\n'> <'\t\tprolog &&\n'> <'\t\treset_work_tree_to no_submodule &&\n'> <'\t\t(\n'> <'\t\t\tcd submodule_update &&\n'> <'\t\t\tmkdir sub1 &&\n'> <'\t\t\tgit branch -t add_sub1 origin/add_sub1 &&\n'> <'\t\t\t$command add_sub1 &&\n'> <'\t\t\ttest_superproject_content origin/add_sub1 &&\n'> <'\t\t\ttest_dir_is_empty sub1 &&\n'> <'\t\t\tgit submodule update --init --recursive &&\n'> <'\t\t\ttest_submodule_content sub1 origin/add_sub1\n'> <'\t\t)\n'> <'\t'> ) } ) (C {(test_expect_success)} { (DQ ($ VSub_DollarName '$command') (": added submodule doesn't remove untracked unignored file with same name") ) } { (SQ <'\n'> <'\t\tprolog &&\n'> <'\t\treset_work_tree_to no_submodule &&\n'> <'\t\t(\n'> <'\t\t\tcd submodule_update &&\n'> <'\t\t\tgit branch -t add_sub1 origin/add_sub1 &&\n'> <'\t\t\t>sub1 &&\n'> <'\t\t\ttest_must_fail $command add_sub1 &&\n'> <'\t\t\ttest_superproject_content origin/no_submodule &&\n'> <'\t\t\ttest_must_be_empty sub1\n'> <'\t\t)\n'> <'\t'> ) } ) (C {(test_expect_) ($ VSub_DollarName '$RESULT')} { (DQ ($ VSub_DollarName '$command') (': replace tracked file with submodule creates empty directory') ) } { (SQ <'\n'> <'\t\tprolog &&\n'> <'\t\treset_work_tree_to replace_sub1_with_file &&\n'> <'\t\t(\n'> <'\t\t\tcd submodule_update &&\n'> <'\t\t\tgit branch -t replace_file_with_sub1 origin/replace_file_with_sub1 &&\n'> <'\t\t\t$command replace_file_with_sub1 &&\n'> <'\t\t\ttest_superproject_content origin/replace_file_with_sub1 &&\n'> <'\t\t\ttest_dir_is_empty sub1 &&\n'> <'\t\t\tgit submodule update --init --recursive &&\n'> <'\t\t\ttest_submodule_content sub1 origin/replace_file_with_sub1\n'> <'\t\t)\n'> <'\t'> ) } ) (command.If arms: [ (if_arm cond: [ (C {(test)} { (DQ ($ VSub_DollarName '$KNOWN_FAILURE_NOFF_MERGE_DOESNT_CREATE_EMPTY_SUBMODULE_DIR' ) ) } {(Lit_Other '=')} {(1)} ) ] action: [ (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:RESULT) op: Equal rhs: {(DQ (failure))} ) ] ) ] ) ] else_action: [ (command.Assignment keyword: Assign_None pairs: [(assign_pair lhs:(lhs_expr.LhsName name:RESULT) op:Equal rhs:{(DQ (success))})] ) ] ) (C {(test_expect_) ($ VSub_DollarName '$RESULT')} {(DQ ($ VSub_DollarName '$command') (': replace directory with submodule'))} { (SQ <'\n'> <'\t\tprolog &&\n'> <'\t\treset_work_tree_to replace_sub1_with_directory &&\n'> <'\t\t(\n'> <'\t\t\tcd submodule_update &&\n'> < '\t\t\tgit branch -t replace_directory_with_sub1 origin/replace_directory_with_sub1 &&\n' > <'\t\t\t$command replace_directory_with_sub1 &&\n'> <'\t\t\ttest_superproject_content origin/replace_directory_with_sub1 &&\n'> <'\t\t\ttest_dir_is_empty sub1 &&\n'> <'\t\t\tgit submodule update --init --recursive &&\n'> <'\t\t\ttest_submodule_content sub1 origin/replace_directory_with_sub1\n'> <'\t\t)\n'> <'\t'> ) } ) (command.If arms: [ (if_arm cond: [ (C {(test)} {(DQ ($ VSub_DollarName '$KNOWN_FAILURE_STASH_DOES_IGNORE_SUBMODULE_CHANGES'))} {(Lit_Other '=')} {(1)} ) ] action: [ (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:RESULT) op: Equal rhs: {(DQ (failure))} ) ] ) ] ) ] else_action: [ (command.Assignment keyword: Assign_None pairs: [(assign_pair lhs:(lhs_expr.LhsName name:RESULT) op:Equal rhs:{(DQ (success))})] ) ] ) (C {(test_expect_) ($ VSub_DollarName '$RESULT')} { (DQ ($ VSub_DollarName '$command') (': removed submodule leaves submodule directory and its contents in place') ) } { (SQ <'\n'> <'\t\tprolog &&\n'> <'\t\treset_work_tree_to add_sub1 &&\n'> <'\t\t(\n'> <'\t\t\tcd submodule_update &&\n'> <'\t\t\tgit branch -t remove_sub1 origin/remove_sub1 &&\n'> <'\t\t\t$command remove_sub1 &&\n'> <'\t\t\ttest_superproject_content origin/remove_sub1 &&\n'> <'\t\t\ttest_submodule_content sub1 origin/add_sub1\n'> <'\t\t)\n'> <'\t'> ) } ) (C {(test_expect_) ($ VSub_DollarName '$RESULT')} { (DQ ($ VSub_DollarName '$command') (': removed submodule leaves submodule containing a .git directory alone') ) } { (SQ <'\n'> <'\t\tprolog &&\n'> <'\t\treset_work_tree_to add_sub1 &&\n'> <'\t\t(\n'> <'\t\t\tcd submodule_update &&\n'> <'\t\t\tgit branch -t remove_sub1 origin/remove_sub1 &&\n'> <'\t\t\treplace_gitfile_with_git_dir sub1 &&\n'> <'\t\t\t$command remove_sub1 &&\n'> <'\t\t\ttest_superproject_content origin/remove_sub1 &&\n'> <'\t\t\ttest_git_directory_is_unchanged sub1 &&\n'> <'\t\t\ttest_submodule_content sub1 origin/add_sub1\n'> <'\t\t)\n'> <'\t'> ) } ) (command.If arms: [ (if_arm cond: [ (C {(test)} { (DQ ($ VSub_DollarName '$KNOWN_FAILURE_NOFF_MERGE_ATTEMPTS_TO_MERGE_REMOVED_SUBMODULE_FILES' ) ) } {(Lit_Other '=')} {(1)} ) ] action: [ (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:RESULT) op: Equal rhs: {(DQ (failure))} ) ] ) ] ) ] else_action: [ (command.Assignment keyword: Assign_None pairs: [(assign_pair lhs:(lhs_expr.LhsName name:RESULT) op:Equal rhs:{(DQ (success))})] ) ] ) (C {(test_expect_) ($ VSub_DollarName '$RESULT')} {(DQ ($ VSub_DollarName '$command') (': replace submodule with a directory must fail'))} { (SQ <'\n'> <'\t\tprolog &&\n'> <'\t\treset_work_tree_to add_sub1 &&\n'> <'\t\t(\n'> <'\t\t\tcd submodule_update &&\n'> <'\t\t\tgit branch -t replace_sub1_with_directory origin/replace_sub1_with_directory &&\n'> <'\t\t\ttest_must_fail $command replace_sub1_with_directory &&\n'> <'\t\t\ttest_superproject_content origin/add_sub1 &&\n'> <'\t\t\ttest_submodule_content sub1 origin/add_sub1\n'> <'\t\t)\n'> <'\t'> ) } ) (C {(test_expect_) ($ VSub_DollarName '$RESULT')} { (DQ ($ VSub_DollarName '$command') (': replace submodule containing a .git directory with a directory must fail') ) } { (SQ <'\n'> <'\t\tprolog &&\n'> <'\t\treset_work_tree_to add_sub1 &&\n'> <'\t\t(\n'> <'\t\t\tcd submodule_update &&\n'> <'\t\t\tgit branch -t replace_sub1_with_directory origin/replace_sub1_with_directory &&\n'> <'\t\t\treplace_gitfile_with_git_dir sub1 &&\n'> <'\t\t\ttest_must_fail $command replace_sub1_with_directory &&\n'> <'\t\t\ttest_superproject_content origin/add_sub1 &&\n'> <'\t\t\ttest_git_directory_is_unchanged sub1 &&\n'> <'\t\t\ttest_submodule_content sub1 origin/add_sub1\n'> <'\t\t)\n'> <'\t'> ) } ) (C {(test_expect_failure)} {(DQ ($ VSub_DollarName '$command') (': replace submodule with a file must fail'))} { (SQ <'\n'> <'\t\tprolog &&\n'> <'\t\treset_work_tree_to add_sub1 &&\n'> <'\t\t(\n'> <'\t\t\tcd submodule_update &&\n'> <'\t\t\tgit branch -t replace_sub1_with_file origin/replace_sub1_with_file &&\n'> <'\t\t\ttest_must_fail $command replace_sub1_with_file &&\n'> <'\t\t\ttest_superproject_content origin/add_sub1 &&\n'> <'\t\t\ttest_submodule_content sub1 origin/add_sub1\n'> <'\t\t)\n'> <'\t'> ) } ) (C {(test_expect_failure)} { (DQ ($ VSub_DollarName '$command') (': replace submodule containing a .git directory with a file must fail') ) } { (SQ <'\n'> <'\t\tprolog &&\n'> <'\t\treset_work_tree_to add_sub1 &&\n'> <'\t\t(\n'> <'\t\t\tcd submodule_update &&\n'> <'\t\t\tgit branch -t replace_sub1_with_file origin/replace_sub1_with_file &&\n'> <'\t\t\treplace_gitfile_with_git_dir sub1 &&\n'> <'\t\t\ttest_must_fail $command replace_sub1_with_file &&\n'> <'\t\t\ttest_superproject_content origin/add_sub1 &&\n'> <'\t\t\ttest_git_directory_is_unchanged sub1 &&\n'> <'\t\t\ttest_submodule_content sub1 origin/add_sub1\n'> <'\t\t)\n'> <'\t'> ) } ) (command.If arms: [ (if_arm cond: [ (C {(test)} {(DQ ($ VSub_DollarName '$KNOWN_FAILURE_CHERRY_PICK_SEES_EMPTY_COMMIT'))} {(Lit_Other '=')} {(1)} ) ] action: [ (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:RESULT) op: Equal rhs: {(DQ (failure))} ) ] ) ] ) ] else_action: [ (command.Assignment keyword: Assign_None pairs: [(assign_pair lhs:(lhs_expr.LhsName name:RESULT) op:Equal rhs:{(DQ (success))})] ) ] ) (C {(test_expect_) ($ VSub_DollarName '$RESULT')} { (DQ ($ VSub_DollarName '$command') (': modified submodule does not update submodule work tree') ) } { (SQ <'\n'> <'\t\tprolog &&\n'> <'\t\treset_work_tree_to add_sub1 &&\n'> <'\t\t(\n'> <'\t\t\tcd submodule_update &&\n'> <'\t\t\tgit branch -t modify_sub1 origin/modify_sub1 &&\n'> <'\t\t\t$command modify_sub1 &&\n'> <'\t\t\ttest_superproject_content origin/modify_sub1 &&\n'> <'\t\t\ttest_submodule_content sub1 origin/add_sub1 &&\n'> <'\t\t\tgit submodule update &&\n'> <'\t\t\ttest_submodule_content sub1 origin/modify_sub1\n'> <'\t\t)\n'> <'\t'> ) } ) (C {(test_expect_) ($ VSub_DollarName '$RESULT')} { (DQ ($ VSub_DollarName '$command') (': modified submodule does not update submodule work tree to invalid commit') ) } { (SQ <'\n'> <'\t\tprolog &&\n'> <'\t\treset_work_tree_to add_sub1 &&\n'> <'\t\t(\n'> <'\t\t\tcd submodule_update &&\n'> <'\t\t\tgit branch -t invalid_sub1 origin/invalid_sub1 &&\n'> <'\t\t\t$command invalid_sub1 &&\n'> <'\t\t\ttest_superproject_content origin/invalid_sub1 &&\n'> <'\t\t\ttest_submodule_content sub1 origin/add_sub1 &&\n'> <'\t\t\ttest_must_fail git submodule update &&\n'> <'\t\t\ttest_submodule_content sub1 origin/add_sub1\n'> <'\t\t)\n'> <'\t'> ) } ) (C {(test_expect_) ($ VSub_DollarName '$RESULT')} { (DQ ($ VSub_DollarName '$command') (': modified submodule does not update submodule work tree from invalid commit') ) } { (SQ <'\n'> <'\t\tprolog &&\n'> <'\t\treset_work_tree_to invalid_sub1 &&\n'> <'\t\t(\n'> <'\t\t\tcd submodule_update &&\n'> <'\t\t\tgit branch -t valid_sub1 origin/valid_sub1 &&\n'> <'\t\t\t$command valid_sub1 &&\n'> <'\t\t\ttest_superproject_content origin/valid_sub1 &&\n'> <'\t\t\ttest_dir_is_empty sub1 &&\n'> <'\t\t\tgit submodule update --init --recursive &&\n'> <'\t\t\ttest_submodule_content sub1 origin/valid_sub1\n'> <'\t\t)\n'> <'\t'> ) } ) ] ) ) (command.FuncDef name: test_submodule_forced_switch body: (command.BraceGroup children: [ (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:command) op: Equal rhs: {(DQ ($ VSub_Number '$1'))} ) ] ) (C {(test_expect_success)} {(DQ ($ VSub_DollarName '$command') (': added submodule creates empty directory'))} { (SQ <'\n'> <'\t\tprolog &&\n'> <'\t\treset_work_tree_to no_submodule &&\n'> <'\t\t(\n'> <'\t\t\tcd submodule_update &&\n'> <'\t\t\tgit branch -t add_sub1 origin/add_sub1 &&\n'> <'\t\t\t$command add_sub1 &&\n'> <'\t\t\ttest_superproject_content origin/add_sub1 &&\n'> <'\t\t\ttest_dir_is_empty sub1 &&\n'> <'\t\t\tgit submodule update --init --recursive &&\n'> <'\t\t\ttest_submodule_content sub1 origin/add_sub1\n'> <'\t\t)\n'> <'\t'> ) } ) (C {(test_expect_success)} { (DQ ($ VSub_DollarName '$command') (': added submodule leaves existing empty directory alone') ) } { (SQ <'\n'> <'\t\tprolog &&\n'> <'\t\treset_work_tree_to no_submodule &&\n'> <'\t\t(\n'> <'\t\t\tcd submodule_update &&\n'> <'\t\t\tgit branch -t add_sub1 origin/add_sub1 &&\n'> <'\t\t\tmkdir sub1 &&\n'> <'\t\t\t$command add_sub1 &&\n'> <'\t\t\ttest_superproject_content origin/add_sub1 &&\n'> <'\t\t\ttest_dir_is_empty sub1 &&\n'> <'\t\t\tgit submodule update --init --recursive &&\n'> <'\t\t\ttest_submodule_content sub1 origin/add_sub1\n'> <'\t\t)\n'> <'\t'> ) } ) (C {(test_expect_success)} { (DQ ($ VSub_DollarName '$command') ( ': added submodule does remove untracked unignored file with same name when forced' ) ) } { (SQ <'\n'> <'\t\tprolog &&\n'> <'\t\treset_work_tree_to no_submodule &&\n'> <'\t\t(\n'> <'\t\t\tcd submodule_update &&\n'> <'\t\t\tgit branch -t add_sub1 origin/add_sub1 &&\n'> <'\t\t\t>sub1 &&\n'> <'\t\t\t$command add_sub1 &&\n'> <'\t\t\ttest_superproject_content origin/add_sub1 &&\n'> <'\t\t\ttest_dir_is_empty sub1\n'> <'\t\t)\n'> <'\t'> ) } ) (C {(test_expect_success)} { (DQ ($ VSub_DollarName '$command') (': replace tracked file with submodule creates empty directory') ) } { (SQ <'\n'> <'\t\tprolog &&\n'> <'\t\treset_work_tree_to replace_sub1_with_file &&\n'> <'\t\t(\n'> <'\t\t\tcd submodule_update &&\n'> <'\t\t\tgit branch -t replace_file_with_sub1 origin/replace_file_with_sub1 &&\n'> <'\t\t\t$command replace_file_with_sub1 &&\n'> <'\t\t\ttest_superproject_content origin/replace_file_with_sub1 &&\n'> <'\t\t\ttest_dir_is_empty sub1 &&\n'> <'\t\t\tgit submodule update --init --recursive &&\n'> <'\t\t\ttest_submodule_content sub1 origin/replace_file_with_sub1\n'> <'\t\t)\n'> <'\t'> ) } ) (C {(test_expect_success)} {(DQ ($ VSub_DollarName '$command') (': replace directory with submodule'))} { (SQ <'\n'> <'\t\tprolog &&\n'> <'\t\treset_work_tree_to replace_sub1_with_directory &&\n'> <'\t\t(\n'> <'\t\t\tcd submodule_update &&\n'> < '\t\t\tgit branch -t replace_directory_with_sub1 origin/replace_directory_with_sub1 &&\n' > <'\t\t\t$command replace_directory_with_sub1 &&\n'> <'\t\t\ttest_superproject_content origin/replace_directory_with_sub1 &&\n'> <'\t\t\ttest_dir_is_empty sub1 &&\n'> <'\t\t\tgit submodule update --init --recursive &&\n'> <'\t\t\ttest_submodule_content sub1 origin/replace_directory_with_sub1\n'> <'\t\t)\n'> <'\t'> ) } ) (C {(test_expect_success)} { (DQ ($ VSub_DollarName '$command') (': removed submodule leaves submodule directory and its contents in place') ) } { (SQ <'\n'> <'\t\tprolog &&\n'> <'\t\treset_work_tree_to add_sub1 &&\n'> <'\t\t(\n'> <'\t\t\tcd submodule_update &&\n'> <'\t\t\tgit branch -t remove_sub1 origin/remove_sub1 &&\n'> <'\t\t\t$command remove_sub1 &&\n'> <'\t\t\ttest_superproject_content origin/remove_sub1 &&\n'> <'\t\t\ttest_submodule_content sub1 origin/add_sub1\n'> <'\t\t)\n'> <'\t'> ) } ) (C {(test_expect_success)} { (DQ ($ VSub_DollarName '$command') (': removed submodule leaves submodule containing a .git directory alone') ) } { (SQ <'\n'> <'\t\tprolog &&\n'> <'\t\treset_work_tree_to add_sub1 &&\n'> <'\t\t(\n'> <'\t\t\tcd submodule_update &&\n'> <'\t\t\tgit branch -t remove_sub1 origin/remove_sub1 &&\n'> <'\t\t\treplace_gitfile_with_git_dir sub1 &&\n'> <'\t\t\t$command remove_sub1 &&\n'> <'\t\t\ttest_superproject_content origin/remove_sub1 &&\n'> <'\t\t\ttest_git_directory_is_unchanged sub1 &&\n'> <'\t\t\ttest_submodule_content sub1 origin/add_sub1\n'> <'\t\t)\n'> <'\t'> ) } ) (C {(test_expect_failure)} {(DQ ($ VSub_DollarName '$command') (': replace submodule with a directory must fail'))} { (SQ <'\n'> <'\t\tprolog &&\n'> <'\t\treset_work_tree_to add_sub1 &&\n'> <'\t\t(\n'> <'\t\t\tcd submodule_update &&\n'> <'\t\t\tgit branch -t replace_sub1_with_directory origin/replace_sub1_with_directory &&\n'> <'\t\t\ttest_must_fail $command replace_sub1_with_directory &&\n'> <'\t\t\ttest_superproject_content origin/add_sub1 &&\n'> <'\t\t\ttest_submodule_content sub1 origin/add_sub1\n'> <'\t\t)\n'> <'\t'> ) } ) (C {(test_expect_failure)} { (DQ ($ VSub_DollarName '$command') (': replace submodule containing a .git directory with a directory must fail') ) } { (SQ <'\n'> <'\t\tprolog &&\n'> <'\t\treset_work_tree_to add_sub1 &&\n'> <'\t\t(\n'> <'\t\t\tcd submodule_update &&\n'> <'\t\t\tgit branch -t replace_sub1_with_directory origin/replace_sub1_with_directory &&\n'> <'\t\t\treplace_gitfile_with_git_dir sub1 &&\n'> <'\t\t\ttest_must_fail $command replace_sub1_with_directory &&\n'> <'\t\t\ttest_superproject_content origin/add_sub1 &&\n'> <'\t\t\ttest_git_directory_is_unchanged sub1 &&\n'> <'\t\t\ttest_submodule_content sub1 origin/add_sub1\n'> <'\t\t)\n'> <'\t'> ) } ) (C {(test_expect_failure)} {(DQ ($ VSub_DollarName '$command') (': replace submodule with a file must fail'))} { (SQ <'\n'> <'\t\tprolog &&\n'> <'\t\treset_work_tree_to add_sub1 &&\n'> <'\t\t(\n'> <'\t\t\tcd submodule_update &&\n'> <'\t\t\tgit branch -t replace_sub1_with_file origin/replace_sub1_with_file &&\n'> <'\t\t\ttest_must_fail $command replace_sub1_with_file &&\n'> <'\t\t\ttest_superproject_content origin/add_sub1 &&\n'> <'\t\t\ttest_submodule_content sub1 origin/add_sub1\n'> <'\t\t)\n'> <'\t'> ) } ) (C {(test_expect_failure)} { (DQ ($ VSub_DollarName '$command') (': replace submodule containing a .git directory with a file must fail') ) } { (SQ <'\n'> <'\t\tprolog &&\n'> <'\t\treset_work_tree_to add_sub1 &&\n'> <'\t\t(\n'> <'\t\t\tcd submodule_update &&\n'> <'\t\t\tgit branch -t replace_sub1_with_file origin/replace_sub1_with_file &&\n'> <'\t\t\treplace_gitfile_with_git_dir sub1 &&\n'> <'\t\t\ttest_must_fail $command replace_sub1_with_file &&\n'> <'\t\t\ttest_superproject_content origin/add_sub1 &&\n'> <'\t\t\ttest_git_directory_is_unchanged sub1 &&\n'> <'\t\t\ttest_submodule_content sub1 origin/add_sub1\n'> <'\t\t)\n'> <'\t'> ) } ) (C {(test_expect_success)} { (DQ ($ VSub_DollarName '$command') (': modified submodule does not update submodule work tree') ) } { (SQ <'\n'> <'\t\tprolog &&\n'> <'\t\treset_work_tree_to add_sub1 &&\n'> <'\t\t(\n'> <'\t\t\tcd submodule_update &&\n'> <'\t\t\tgit branch -t modify_sub1 origin/modify_sub1 &&\n'> <'\t\t\t$command modify_sub1 &&\n'> <'\t\t\ttest_superproject_content origin/modify_sub1 &&\n'> <'\t\t\ttest_submodule_content sub1 origin/add_sub1 &&\n'> <'\t\t\tgit submodule update &&\n'> <'\t\t\ttest_submodule_content sub1 origin/modify_sub1\n'> <'\t\t)\n'> <'\t'> ) } ) (C {(test_expect_success)} { (DQ ($ VSub_DollarName '$command') (': modified submodule does not update submodule work tree to invalid commit') ) } { (SQ <'\n'> <'\t\tprolog &&\n'> <'\t\treset_work_tree_to add_sub1 &&\n'> <'\t\t(\n'> <'\t\t\tcd submodule_update &&\n'> <'\t\t\tgit branch -t invalid_sub1 origin/invalid_sub1 &&\n'> <'\t\t\t$command invalid_sub1 &&\n'> <'\t\t\ttest_superproject_content origin/invalid_sub1 &&\n'> <'\t\t\ttest_submodule_content sub1 origin/add_sub1 &&\n'> <'\t\t\ttest_must_fail git submodule update &&\n'> <'\t\t\ttest_submodule_content sub1 origin/add_sub1\n'> <'\t\t)\n'> <'\t'> ) } ) (C {(test_expect_success)} { (DQ ($ VSub_DollarName '$command') (': modified submodule does not update submodule work tree from invalid commit') ) } { (SQ <'\n'> <'\t\tprolog &&\n'> <'\t\treset_work_tree_to invalid_sub1 &&\n'> <'\t\t(\n'> <'\t\t\tcd submodule_update &&\n'> <'\t\t\tgit branch -t valid_sub1 origin/valid_sub1 &&\n'> <'\t\t\t$command valid_sub1 &&\n'> <'\t\t\ttest_superproject_content origin/valid_sub1 &&\n'> <'\t\t\ttest_dir_is_empty sub1 &&\n'> <'\t\t\tgit submodule update --init --recursive &&\n'> <'\t\t\ttest_submodule_content sub1 origin/valid_sub1\n'> <'\t\t)\n'> <'\t'> ) } ) ] ) ) ] )