(List (If (Com {[LIT_CHARS test]} {[VarSub #]} {[LIT_CHARS -eq]} {[LIT_CHARS 0]}) (Com {[LIT_CHARS set]} {[LIT_CHARS --]} {[LIT_CHARS -h]}) ) (= scope= flags=0 words=[] bindings=[('OPTS_SPEC', {[DQ [LIT_CHARS "git subtree add --prefix= \n"][LIT_CHARS "git subtree add --prefix= \n"][LIT_CHARS "git subtree merge --prefix= \n"][LIT_CHARS "git subtree pull --prefix= \n"][LIT_CHARS "git subtree push --prefix= \n"][LIT_CHARS "git subtree split --prefix= \n"][LIT_CHARS "--\n"][LIT_CHARS "h,help show the help\n"][LIT_CHARS "q quiet\n"][LIT_CHARS "d show debug messages\n"][LIT_CHARS "P,prefix= the name of the subdir to split out\n"][LIT_CHARS "m,message= use the given message as the commit message for the merge commit\n"][LIT_CHARS " options for 'split'\n"][LIT_CHARS "annotate= add a prefix to commit message of new commits\n"][LIT_CHARS "b,branch= create a new branch from the split subtree\n"][LIT_CHARS "ignore-joins ignore prior --rejoin commits\n"][LIT_CHARS "onto= try connecting new tree to an existing one\n"][LIT_CHARS "rejoin merge the new branch back into HEAD\n"][LIT_CHARS " options for 'add', 'merge', and 'pull'\n"][LIT_CHARS "squash merge subtree changes as a single commit\n"]]})]) (Com {[LIT_CHARS eval]} {[DQ [ComSub (AndOr OP_OR_IF (Pipeline (Com {[LIT_CHARS echo]} {[DQ [VarSub OPTS_SPEC]]}) (Com {[LIT_CHARS git]} {[LIT_CHARS rev-parse]} {[LIT_CHARS --parseopt]} {[LIT_CHARS --]} {[DQ [VarSub @]]}) ) (Com {[LIT_CHARS echo]} {[LIT_CHARS exit]} {[VarSub ?]}) )]]}) (= scope= flags=0 words=[] bindings=[('PATH', {[VarSub PATH] [LIT_OTHER ":"] [ComSub (Com {[LIT_CHARS git]} {[LIT_CHARS --exec-path]})]})]) (Com {[LIT_CHARS .]} {[LIT_CHARS git-sh-setup]}) (Com {[LIT_CHARS require_work_tree]}) (= scope= flags=0 words=[] bindings=[('quiet', {[SQ ]})]) (= scope= flags=0 words=[] bindings=[('branch', {[SQ ]})]) (= scope= flags=0 words=[] bindings=[('debug', {[SQ ]})]) (= scope= flags=0 words=[] bindings=[('command', {[SQ ]})]) (= scope= flags=0 words=[] bindings=[('onto', {[SQ ]})]) (= scope= flags=0 words=[] bindings=[('rejoin', {[SQ ]})]) (= scope= flags=0 words=[] bindings=[('ignore_joins', {[SQ ]})]) (= scope= flags=0 words=[] bindings=[('annotate', {[SQ ]})]) (= scope= flags=0 words=[] bindings=[('squash', {[SQ ]})]) (= scope= flags=0 words=[] bindings=[('message', {[SQ ]})]) (= scope= flags=0 words=[] bindings=[('prefix', {[SQ ]})]) (FunctionDef debug [] (If (Com {[LIT_CHARS test]} {[LIT_CHARS -n]} {[DQ [VarSub debug]]}) (Com {[LIT_CHARS printf]} {[DQ [LIT_CHARS "%s"][\ LIT_ESCAPED_CHAR "\\n"]]} {[DQ [VarSub *]]} < (DescriptorRedirectNode target={[LIT_CHARS 2]} &"> 1), > ) ) ) (FunctionDef say [] (If (Com {[LIT_CHARS test]} {[LIT_CHARS -z]} {[DQ [VarSub quiet]]}) (Com {[LIT_CHARS printf]} {[DQ [LIT_CHARS "%s"][\ LIT_ESCAPED_CHAR "\\n"]]} {[DQ [VarSub *]]} < (DescriptorRedirectNode target={[LIT_CHARS 2]} &"> 1), > ) ) ) (FunctionDef progress [] (If (Com {[LIT_CHARS test]} {[LIT_CHARS -z]} {[DQ [VarSub quiet]]}) (Com {[LIT_CHARS printf]} {[DQ [LIT_CHARS "%s"][\ LIT_ESCAPED_CHAR "\\r"]]} {[DQ [VarSub *]]} < (DescriptorRedirectNode target={[LIT_CHARS 2]} &"> 1), > ) ) ) (FunctionDef assert [] (If (Pipeline! (Com {[DQ [VarSub @]]}) ) (Com {[LIT_CHARS die]} {[DQ [LIT_CHARS "assertion failed: "]]} {[DQ [VarSub @]]}) ) ) (While (Com {[LIT_CHARS test]} {[VarSub #]} {[LIT_CHARS -gt]} {[LIT_CHARS 0]}) (List (= scope= flags=0 words=[] bindings=[('opt', {[DQ [VarSub 1]]})]) (Com {[LIT_CHARS shift]}) (Case to_match={[DQ [VarSub opt]]}, pat_word_list=[[{[LIT_CHARS -q]}], [{[LIT_CHARS -d]}], [{[LIT_CHARS --annotate]}], [{[LIT_CHARS --no-annotate]}], [{[LIT_CHARS -b]}], [{[LIT_CHARS -P]}], [{[LIT_CHARS -m]}], [{[LIT_CHARS --no-prefix]}], [{[LIT_CHARS --onto]}], [{[LIT_CHARS --no-onto]}], [{[LIT_CHARS --rejoin]}], [{[LIT_CHARS --no-rejoin]}], [{[LIT_CHARS --ignore-joins]}], [{[LIT_CHARS --no-ignore-joins]}], [{[LIT_CHARS --squash]}], [{[LIT_CHARS --no-squash]}], [{[LIT_CHARS --]}], [{[LIT_OTHER "*"]}]] (= scope= flags=0 words=[] bindings=[('quiet', {[LIT_CHARS 1]})]) (= scope= flags=0 words=[] bindings=[('debug', {[LIT_CHARS 1]})]) (List (= scope= flags=0 words=[] bindings=[('annotate', {[DQ [VarSub 1]]})]) (Com {[LIT_CHARS shift]}) ) (= scope= flags=0 words=[] bindings=[('annotate', {[SQ ]})]) (List (= scope= flags=0 words=[] bindings=[('branch', {[DQ [VarSub 1]]})]) (Com {[LIT_CHARS shift]}) ) (List (= scope= flags=0 words=[] bindings=[('prefix', {[DQ [VarSub 1 transform_ops=[VS_UNARY_PERCENT {[LIT_SLASH /]}]]]})]) (Com {[LIT_CHARS shift]}) ) (List (= scope= flags=0 words=[] bindings=[('message', {[DQ [VarSub 1]]})]) (Com {[LIT_CHARS shift]}) ) (= scope= flags=0 words=[] bindings=[('prefix', {[SQ ]})]) (List (= scope= flags=0 words=[] bindings=[('onto', {[DQ [VarSub 1]]})]) (Com {[LIT_CHARS shift]}) ) (= scope= flags=0 words=[] bindings=[('onto', {[SQ ]})]) (= scope= flags=0 words=[] bindings=[('rejoin', {[LIT_CHARS 1]})]) (= scope= flags=0 words=[] bindings=[('rejoin', {[SQ ]})]) (= scope= flags=0 words=[] bindings=[('ignore_joins', {[LIT_CHARS 1]})]) (= scope= flags=0 words=[] bindings=[('ignore_joins', {[SQ ]})]) (= scope= flags=0 words=[] bindings=[('squash', {[LIT_CHARS 1]})]) (= scope= flags=0 words=[] bindings=[('squash', {[SQ ]})]) (Com {[LIT_CHARS break]}) (Com {[LIT_CHARS die]} {[DQ [LIT_CHARS "Unexpected option: "][VarSub opt]]}) ) ) ) (= scope= flags=0 words=[] bindings=[('command', {[DQ [VarSub 1]]})]) (Com {[LIT_CHARS shift]}) (Case to_match={[DQ [VarSub command]]}, pat_word_list=[[{[LIT_CHARS add]}, {[LIT_CHARS merge]}, {[LIT_CHARS pull]}], [{[LIT_CHARS split]}, {[LIT_CHARS push]}], [{[LIT_OTHER "*"]}]] (= scope= flags=0 words=[] bindings=[('default', {[SQ ]})]) (= scope= flags=0 words=[] bindings=[('default', {[DQ [LIT_CHARS "--default HEAD"]]})]) (Com {[LIT_CHARS die]} {[DQ [LIT_CHARS "Unknown command '"][VarSub command][LIT_CHARS "'"]]}) ) (If (Com {[LIT_CHARS test]} {[LIT_CHARS -z]} {[DQ [VarSub prefix]]}) (Com {[LIT_CHARS die]} {[DQ [LIT_CHARS "You must provide the --prefix option."]]}) ) (Case to_match={[DQ [VarSub command]]}, pat_word_list=[[{[LIT_CHARS add]}], [{[LIT_OTHER "*"]}]] (AndOr OP_AND_IF (Com {[LIT_CHARS test]} {[LIT_CHARS -e]} {[DQ [VarSub prefix]]}) (Com {[LIT_CHARS die]} {[DQ [LIT_CHARS "prefix '"][VarSub prefix][LIT_CHARS "' already exists."]]}) ) (AndOr OP_OR_IF (Com {[LIT_CHARS test]} {[LIT_CHARS -e]} {[DQ [VarSub prefix]]}) (Com {[LIT_CHARS die]} {[DQ [LIT_CHARS "'"][VarSub prefix][LIT_CHARS "' does not exist; use 'git subtree add'"]]}) ) ) (= scope= flags=0 words=[] bindings=[('dir', {[DQ [ComSub (Com {[LIT_CHARS dirname]} {[DQ [VarSub prefix][LIT_CHARS /.]]})]]})]) (If (AndOr OP_AND_IF (Com {[LIT_CHARS test]} {[DQ [VarSub command]]} {[LIT_OTHER "!"] [LIT_OTHER "="]} {[DQ [LIT_CHARS pull]]}) (AndOr OP_AND_IF (Com {[LIT_CHARS test]} {[DQ [VarSub command]]} {[LIT_OTHER "!"] [LIT_OTHER "="]} {[DQ [LIT_CHARS add]]}) (Com {[LIT_CHARS test]} {[DQ [VarSub command]]} {[LIT_OTHER "!"] [LIT_OTHER "="]} {[DQ [LIT_CHARS push]]}) ) ) (List (AndOr OP_OR_IF (= scope= flags=0 words=[] bindings=[('revs', {[ComSub (Com {[LIT_CHARS git]} {[LIT_CHARS rev-parse]} {[VarSub default]} {[LIT_CHARS --revs-only]} {[DQ [VarSub @]]})]})]) (Com {[LIT_CHARS exit]} {[VarSub ?]}) ) (AndOr OP_OR_IF (= scope= flags=0 words=[] bindings=[('dirs', {[ComSub (Com {[LIT_CHARS git]} {[LIT_CHARS rev-parse]} {[LIT_CHARS --no-revs]} {[LIT_CHARS --no-flags]} {[DQ [VarSub @]]})]})]) (Com {[LIT_CHARS exit]} {[VarSub ?]}) ) (If (Com {[LIT_CHARS test]} {[LIT_CHARS -n]} {[DQ [VarSub dirs]]}) (Com {[LIT_CHARS die]} {[DQ [LIT_CHARS "Error: Use --prefix instead of bare filenames."]]}) ) ) ) (Com {[LIT_CHARS debug]} {[DQ [LIT_CHARS "command: {"][VarSub command][LIT_CHARS "}"]]}) (Com {[LIT_CHARS debug]} {[DQ [LIT_CHARS "quiet: {"][VarSub quiet][LIT_CHARS "}"]]}) (Com {[LIT_CHARS debug]} {[DQ [LIT_CHARS "revs: {"][VarSub revs][LIT_CHARS "}"]]}) (Com {[LIT_CHARS debug]} {[DQ [LIT_CHARS "dir: {"][VarSub dir][LIT_CHARS "}"]]}) (Com {[LIT_CHARS debug]} {[DQ [LIT_CHARS "opts: {"][VarSub *][LIT_CHARS "}"]]}) (Com {[LIT_CHARS debug]}) (FunctionDef cache_setup [] (List (= scope= flags=0 words=[] bindings=[('cachedir', {[DQ [VarSub GIT_DIR][LIT_CHARS /subtree-cache/][VarSub $]]})]) (AndOr OP_OR_IF (Com {[LIT_CHARS rm]} {[LIT_CHARS -rf]} {[DQ [VarSub cachedir]]}) (Com {[LIT_CHARS die]} {[DQ [LIT_CHARS "Can't delete old cachedir: "][VarSub cachedir]]}) ) (AndOr OP_OR_IF (Com {[LIT_CHARS mkdir]} {[LIT_CHARS -p]} {[DQ [VarSub cachedir]]}) (Com {[LIT_CHARS die]} {[DQ [LIT_CHARS "Can't create new cachedir: "][VarSub cachedir]]}) ) (AndOr OP_OR_IF (Com {[LIT_CHARS mkdir]} {[LIT_CHARS -p]} {[DQ [VarSub cachedir][LIT_CHARS /notree]]}) (Com {[LIT_CHARS die]} {[DQ [LIT_CHARS "Can't create new cachedir: "][VarSub cachedir][LIT_CHARS /notree]]}) ) (Com {[LIT_CHARS debug]} {[DQ [LIT_CHARS "Using cachedir: "][VarSub cachedir]]} < (DescriptorRedirectNode target={[LIT_CHARS 2]} &"> 1), > ) ) ) (FunctionDef cache_get [] (For oldrev [{[DQ [VarSub @]]}]) (If (Com {[LIT_CHARS test]} {[LIT_CHARS -r]} {[DQ [VarSub cachedir][LIT_CHARS /][VarSub oldrev]]}) (List (Com {[LIT_CHARS read]} {[LIT_CHARS newrev]} < (FilenameRedirectNode filename={[DQ [VarSub cachedir][LIT_CHARS /][VarSub oldrev]]} 0), > ) (Com {[LIT_CHARS echo]} {[VarSub newrev]}) ) ) ) ) (FunctionDef cache_miss [] (For oldrev [{[DQ [VarSub @]]}]) (If (Pipeline! (Com {[LIT_CHARS test]} {[LIT_CHARS -r]} {[DQ [VarSub cachedir][LIT_CHARS /][VarSub oldrev]]}) ) (Com {[LIT_CHARS echo]} {[VarSub oldrev]}) ) ) ) (FunctionDef check_parents [] (List (= scope= flags=0 words=[] bindings=[('missed', {[ComSub (Com {[LIT_CHARS cache_miss]} {[DQ [VarSub @]]})]})]) (For miss [{[VarSub missed]}]) (If (Pipeline! (Com {[LIT_CHARS test]} {[LIT_CHARS -r]} {[DQ [VarSub cachedir][LIT_CHARS /notree/][VarSub miss]]}) ) (Com {[LIT_CHARS debug]} {[DQ [LIT_CHARS " incorrect order: "][VarSub miss]]}) ) ) ) ) (FunctionDef set_notree [] (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS 1]]} < (FilenameRedirectNode filename={[DQ [VarSub cachedir][LIT_CHARS /notree/][VarSub 1]]} "> 1), > ) ) (FunctionDef cache_set [] (List (= scope= flags=0 words=[] bindings=[('oldrev', {[DQ [VarSub 1]]})]) (= scope= flags=0 words=[] bindings=[('newrev', {[DQ [VarSub 2]]})]) (If (AndOr OP_AND_IF (Com {[LIT_CHARS test]} {[DQ [VarSub oldrev]]} {[LIT_OTHER "!"] [LIT_OTHER "="]} {[DQ [LIT_CHARS latest_old]]}) (AndOr OP_AND_IF (Com {[LIT_CHARS test]} {[DQ [VarSub oldrev]]} {[LIT_OTHER "!"] [LIT_OTHER "="]} {[DQ [LIT_CHARS latest_new]]}) (Com {[LIT_CHARS test]} {[LIT_CHARS -e]} {[DQ [VarSub cachedir][LIT_CHARS /][VarSub oldrev]]}) ) ) (Com {[LIT_CHARS die]} {[DQ [LIT_CHARS "cache for "][VarSub oldrev][LIT_CHARS " already exists!"]]}) ) (Com {[LIT_CHARS echo]} {[DQ [VarSub newrev]]} < (FilenameRedirectNode filename={[DQ [VarSub cachedir][LIT_CHARS /][VarSub oldrev]]} "> 1), > ) ) ) (FunctionDef rev_exists [] (If (Com {[LIT_CHARS git]} {[LIT_CHARS rev-parse]} {[DQ [VarSub 1]]} < (FilenameRedirectNode filename={[LIT_CHARS /dev/null]} "> 1), (DescriptorRedirectNode target={[LIT_CHARS 1]} &"> 2), > ) (Com {[LIT_CHARS return]} {[LIT_CHARS 0]}) (ElseTrue) (Com {[LIT_CHARS return]} {[LIT_CHARS 1]}) ) ) (FunctionDef rev_is_descendant_of_branch [] (List (= scope= flags=0 words=[] bindings=[('newrev', {[DQ [VarSub 1]]})]) (= scope= flags=0 words=[] bindings=[('branch', {[DQ [VarSub 2]]})]) (= scope= flags=0 words=[] bindings=[('branch_hash', {[ComSub (Com {[LIT_CHARS git]} {[LIT_CHARS rev-parse]} {[DQ [VarSub branch]]})]})]) (= scope= flags=0 words=[] bindings=[('match', {[ComSub (Com {[LIT_CHARS git]} {[LIT_CHARS rev-list]} {[LIT_CHARS -1]} {[DQ [VarSub branch_hash]]} {[DQ [LIT_CHARS "^"][VarSub newrev]]})]})]) (If (Com {[LIT_CHARS test]} {[LIT_CHARS -z]} {[DQ [VarSub match]]}) (Com {[LIT_CHARS return]} {[LIT_CHARS 0]}) (ElseTrue) (Com {[LIT_CHARS return]} {[LIT_CHARS 1]}) ) ) ) (FunctionDef try_remove_previous [] (If (Com {[LIT_CHARS rev_exists]} {[DQ [VarSub 1][LIT_CHARS "^"]]}) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "^"][VarSub 1][LIT_CHARS "^"]]}) ) ) (FunctionDef find_latest_squash [] (List (Com {[LIT_CHARS debug]} {[DQ [LIT_CHARS "Looking for latest squash ("][VarSub dir][LIT_CHARS ")..."]]}) (= scope= flags=0 words=[] bindings=[('dir', {[DQ [VarSub 1]]})]) (= scope= flags=0 words=[] bindings=[('sq', {[SQ ]})]) (= scope= flags=0 words=[] bindings=[('main', {[SQ ]})]) (= scope= flags=0 words=[] bindings=[('sub', {[SQ ]})]) (Pipeline (Com {[LIT_CHARS git]} {[LIT_CHARS log]} {[LIT_CHARS --grep] [LIT_OTHER "="] [DQ [LIT_CHARS "^git-subtree-dir: "][VarSub dir][LIT_CHARS "/*"][\ LIT_ESCAPED_CHAR "\\$"]]} {[LIT_CHARS --pretty] [LIT_OTHER "="] [LIT_CHARS format] [LIT_OTHER ":"] [SQ ]} {[LIT_CHARS HEAD]}) (While (Com {[LIT_CHARS read]} {[LIT_CHARS a]} {[LIT_CHARS b]} {[LIT_CHARS junk]}) (List (Com {[LIT_CHARS debug]} {[DQ [VarSub a][LIT_CHARS " "][VarSub b][LIT_CHARS " "][VarSub junk]]}) (Com {[LIT_CHARS debug]} {[DQ [LIT_CHARS "{{"][VarSub sq][LIT_CHARS /][VarSub main][LIT_CHARS /][VarSub sub][LIT_CHARS "}}"]]}) (Case to_match={[DQ [VarSub a]]}, pat_word_list=[[{[LIT_CHARS START]}], [{[LIT_CHARS git-subtree-mainline] [LIT_OTHER ":"]}], [{[LIT_CHARS git-subtree-split] [LIT_OTHER ":"]}], [{[LIT_CHARS END]}]] (= scope= flags=0 words=[] bindings=[('sq', {[DQ [VarSub b]]})]) (= scope= flags=0 words=[] bindings=[('main', {[DQ [VarSub b]]})]) (AndOr OP_OR_IF (= scope= flags=0 words=[] bindings=[('sub', {[DQ [ComSub (Com {[LIT_CHARS git]} {[LIT_CHARS rev-parse]} {[DQ [VarSub b][LIT_CHARS "^0"]]})]]})]) (Com {[LIT_CHARS die]} {[DQ [LIT_CHARS "could not rev-parse split hash "][VarSub b][LIT_CHARS " from commit "][VarSub sq]]}) ) (List (If (Com {[LIT_CHARS test]} {[LIT_CHARS -n]} {[DQ [VarSub sub]]}) (List (If (Com {[LIT_CHARS test]} {[LIT_CHARS -n]} {[DQ [VarSub main]]}) (= scope= flags=0 words=[] bindings=[('sq', {[DQ [VarSub sub]]})]) ) (Com {[LIT_CHARS debug]} {[DQ [LIT_CHARS "Squash found: "][VarSub sq][LIT_CHARS " "][VarSub sub]]}) (Com {[LIT_CHARS echo]} {[DQ [VarSub sq]]} {[DQ [VarSub sub]]}) (Com {[LIT_CHARS break]}) ) ) (= scope= flags=0 words=[] bindings=[('sq', {[SQ ]})]) (= scope= flags=0 words=[] bindings=[('main', {[SQ ]})]) (= scope= flags=0 words=[] bindings=[('sub', {[SQ ]})]) ) ) ) ) ) ) ) (FunctionDef find_existing_splits [] (List (Com {[LIT_CHARS debug]} {[DQ [LIT_CHARS "Looking for prior splits..."]]}) (= scope= flags=0 words=[] bindings=[('dir', {[DQ [VarSub 1]]})]) (= scope= flags=0 words=[] bindings=[('revs', {[DQ [VarSub 2]]})]) (= scope= flags=0 words=[] bindings=[('main', {[SQ ]})]) (= scope= flags=0 words=[] bindings=[('sub', {[SQ ]})]) (Pipeline (Com {[LIT_CHARS git]} {[LIT_CHARS log]} {[LIT_CHARS --grep] [LIT_OTHER "="] [DQ [LIT_CHARS "^git-subtree-dir: "][VarSub dir][LIT_CHARS "/*"][\ LIT_ESCAPED_CHAR "\\$"]]} {[LIT_CHARS --pretty] [LIT_OTHER "="] [LIT_CHARS format] [LIT_OTHER ":"] [SQ ]} {[VarSub revs]}) (While (Com {[LIT_CHARS read]} {[LIT_CHARS a]} {[LIT_CHARS b]} {[LIT_CHARS junk]}) (Case to_match={[DQ [VarSub a]]}, pat_word_list=[[{[LIT_CHARS START]}], [{[LIT_CHARS git-subtree-mainline] [LIT_OTHER ":"]}], [{[LIT_CHARS git-subtree-split] [LIT_OTHER ":"]}], [{[LIT_CHARS END]}]] (= scope= flags=0 words=[] bindings=[('sq', {[DQ [VarSub b]]})]) (= scope= flags=0 words=[] bindings=[('main', {[DQ [VarSub b]]})]) (AndOr OP_OR_IF (= scope= flags=0 words=[] bindings=[('sub', {[DQ [ComSub (Com {[LIT_CHARS git]} {[LIT_CHARS rev-parse]} {[DQ [VarSub b][LIT_CHARS "^0"]]})]]})]) (Com {[LIT_CHARS die]} {[DQ [LIT_CHARS "could not rev-parse split hash "][VarSub b][LIT_CHARS " from commit "][VarSub sq]]}) ) (List (Com {[LIT_CHARS debug]} {[DQ [LIT_CHARS " Main is: '"][VarSub main][LIT_CHARS "'"]]}) (If (Com {[LIT_CHARS test]} {[LIT_CHARS -z]} {[DQ [VarSub main]]} {[LIT_CHARS -a]} {[LIT_CHARS -n]} {[DQ [VarSub sub]]}) (List (Com {[LIT_CHARS debug]} {[DQ [LIT_CHARS " Squash: "][VarSub sq][LIT_CHARS " from "][VarSub sub]]}) (Com {[LIT_CHARS cache_set]} {[DQ [VarSub sq]]} {[DQ [VarSub sub]]}) ) ) (If (Com {[LIT_CHARS test]} {[LIT_CHARS -n]} {[DQ [VarSub main]]} {[LIT_CHARS -a]} {[LIT_CHARS -n]} {[DQ [VarSub sub]]}) (List (Com {[LIT_CHARS debug]} {[DQ [LIT_CHARS " Prior: "][VarSub main][LIT_CHARS " -> "][VarSub sub]]}) (Com {[LIT_CHARS cache_set]} {[VarSub main]} {[VarSub sub]}) (Com {[LIT_CHARS cache_set]} {[VarSub sub]} {[VarSub sub]}) (Com {[LIT_CHARS try_remove_previous]} {[DQ [VarSub main]]}) (Com {[LIT_CHARS try_remove_previous]} {[DQ [VarSub sub]]}) ) ) (= scope= flags=0 words=[] bindings=[('main', {[SQ ]})]) (= scope= flags=0 words=[] bindings=[('sub', {[SQ ]})]) ) ) ) ) ) ) (FunctionDef copy_commit [] (List (Com {[LIT_CHARS debug]} {[LIT_CHARS copy_commit]} {[DQ [LIT_CHARS "{"][VarSub 1][LIT_CHARS "}"]]} {[DQ [LIT_CHARS "{"][VarSub 2][LIT_CHARS "}"]]} {[DQ [LIT_CHARS "{"][VarSub 3][LIT_CHARS "}"]]}) (AndOr OP_OR_IF (Pipeline (Com {[LIT_CHARS git]} {[LIT_CHARS log]} {[LIT_CHARS -1]} {[LIT_CHARS --pretty] [LIT_OTHER "="] [LIT_CHARS format] [LIT_OTHER ":"] [SQ ]} {[DQ [VarSub 1]]}) (Subshell (List (Com {[LIT_CHARS read]} {[LIT_CHARS GIT_AUTHOR_NAME]}) (Com {[LIT_CHARS read]} {[LIT_CHARS GIT_AUTHOR_EMAIL]}) (Com {[LIT_CHARS read]} {[LIT_CHARS GIT_AUTHOR_DATE]}) (Com {[LIT_CHARS read]} {[LIT_CHARS GIT_COMMITTER_NAME]}) (Com {[LIT_CHARS read]} {[LIT_CHARS GIT_COMMITTER_EMAIL]}) (Com {[LIT_CHARS read]} {[LIT_CHARS GIT_COMMITTER_DATE]}) (= scope= flags=1 words=[{[LIT_CHARS GIT_AUTHOR_NAME]}, {[LIT_CHARS GIT_AUTHOR_EMAIL]}, {[LIT_CHARS GIT_AUTHOR_DATE]}, {[LIT_CHARS GIT_COMMITTER_NAME]}, {[LIT_CHARS GIT_COMMITTER_EMAIL]}, {[LIT_CHARS GIT_COMMITTER_DATE]}] bindings=[]) (Pipeline (Subshell (List (Com {[LIT_CHARS printf]} {[DQ [LIT_CHARS "%s"]]} {[DQ [VarSub annotate]]}) (Com {[LIT_CHARS cat]}) ) ) (Com {[LIT_CHARS git]} {[LIT_CHARS commit-tree]} {[DQ [VarSub 2]]} {[VarSub 3]}) ) ) ) ) (Com {[LIT_CHARS die]} {[DQ [LIT_CHARS "Can't copy commit "][VarSub 1]]}) ) ) ) (FunctionDef add_msg [] (List (= scope= flags=0 words=[] bindings=[('dir', {[DQ [VarSub 1]]})]) (= scope= flags=0 words=[] bindings=[('latest_old', {[DQ [VarSub 2]]})]) (= scope= flags=0 words=[] bindings=[('latest_new', {[DQ [VarSub 3]]})]) (If (Com {[LIT_CHARS test]} {[LIT_CHARS -n]} {[DQ [VarSub message]]}) (= scope= flags=0 words=[] bindings=[('commit_message', {[DQ [VarSub message]]})]) (ElseTrue) (= scope= flags=0 words=[] bindings=[('commit_message', {[DQ [LIT_CHARS "Add '"][VarSub dir][LIT_CHARS "/' from commit '"][VarSub latest_new][LIT_CHARS "'"]]})]) ) (Com {[LIT_CHARS cat]} < (HereDocRedirectNode here_end='EOF' do_expansion=True body_word={[DQ [VarSub commit_message][LIT_CHARS "\n"][LIT_CHARS "\n"][LIT_CHARS "git-subtree-dir: "][VarSub dir][LIT_CHARS "\n"][LIT_CHARS "git-subtree-mainline: "][VarSub latest_old][LIT_CHARS "\n"][LIT_CHARS "git-subtree-split: "][VarSub latest_new][LIT_CHARS "\n"]]} 0), > ) ) ) (FunctionDef add_squashed_msg [] (If (Com {[LIT_CHARS test]} {[LIT_CHARS -n]} {[DQ [VarSub message]]}) (Com {[LIT_CHARS echo]} {[DQ [VarSub message]]}) (ElseTrue) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "Merge commit '"][VarSub 1][LIT_CHARS "' as '"][VarSub 2][LIT_CHARS "'"]]}) ) ) (FunctionDef rejoin_msg [] (List (= scope= flags=0 words=[] bindings=[('dir', {[DQ [VarSub 1]]})]) (= scope= flags=0 words=[] bindings=[('latest_old', {[DQ [VarSub 2]]})]) (= scope= flags=0 words=[] bindings=[('latest_new', {[DQ [VarSub 3]]})]) (If (Com {[LIT_CHARS test]} {[LIT_CHARS -n]} {[DQ [VarSub message]]}) (= scope= flags=0 words=[] bindings=[('commit_message', {[DQ [VarSub message]]})]) (ElseTrue) (= scope= flags=0 words=[] bindings=[('commit_message', {[DQ [LIT_CHARS "Split '"][VarSub dir][LIT_CHARS "/' into commit '"][VarSub latest_new][LIT_CHARS "'"]]})]) ) (Com {[LIT_CHARS cat]} < (HereDocRedirectNode here_end='EOF' do_expansion=True body_word={[DQ [VarSub commit_message][LIT_CHARS "\n"][LIT_CHARS "\n"][LIT_CHARS "git-subtree-dir: "][VarSub dir][LIT_CHARS "\n"][LIT_CHARS "git-subtree-mainline: "][VarSub latest_old][LIT_CHARS "\n"][LIT_CHARS "git-subtree-split: "][VarSub latest_new][LIT_CHARS "\n"]]} 0), > ) ) ) (FunctionDef squash_msg [] (List (= scope= flags=0 words=[] bindings=[('dir', {[DQ [VarSub 1]]})]) (= scope= flags=0 words=[] bindings=[('oldsub', {[DQ [VarSub 2]]})]) (= scope= flags=0 words=[] bindings=[('newsub', {[DQ [VarSub 3]]})]) (= scope= flags=0 words=[] bindings=[('newsub_short', {[ComSub (Com {[LIT_CHARS git]} {[LIT_CHARS rev-parse]} {[LIT_CHARS --short]} {[DQ [VarSub newsub]]})]})]) (If (Com {[LIT_CHARS test]} {[LIT_CHARS -n]} {[DQ [VarSub oldsub]]}) (List (= scope= flags=0 words=[] bindings=[('oldsub_short', {[ComSub (Com {[LIT_CHARS git]} {[LIT_CHARS rev-parse]} {[LIT_CHARS --short]} {[DQ [VarSub oldsub]]})]})]) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "Squashed '"][VarSub dir][LIT_CHARS "/' changes from "][VarSub oldsub_short][LIT_CHARS ..][VarSub newsub_short]]}) (Com {[LIT_CHARS echo]}) (Com {[LIT_CHARS git]} {[LIT_CHARS log]} {[LIT_CHARS --pretty] [LIT_OTHER "="] [LIT_CHARS tformat] [LIT_OTHER ":"] [SQ ]} {[DQ [VarSub oldsub][LIT_CHARS ..][VarSub newsub]]}) (Com {[LIT_CHARS git]} {[LIT_CHARS log]} {[LIT_CHARS --pretty] [LIT_OTHER "="] [LIT_CHARS tformat] [LIT_OTHER ":"] [SQ ]} {[DQ [VarSub newsub][LIT_CHARS ..][VarSub oldsub]]}) ) (ElseTrue) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "Squashed '"][VarSub dir][LIT_CHARS "/' content from commit "][VarSub newsub_short]]}) ) (Com {[LIT_CHARS echo]}) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "git-subtree-dir: "][VarSub dir]]}) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "git-subtree-split: "][VarSub newsub]]}) ) ) (FunctionDef toptree_for_commit [] (List (= scope= flags=0 words=[] bindings=[('commit', {[DQ [VarSub 1]]})]) (AndOr OP_OR_IF (Com {[LIT_CHARS git]} {[LIT_CHARS log]} {[LIT_CHARS -1]} {[LIT_CHARS --pretty] [LIT_OTHER "="] [LIT_CHARS format] [LIT_OTHER ":"] [SQ ]} {[DQ [VarSub commit]]} {[LIT_CHARS --]}) (Com {[LIT_CHARS exit]} {[VarSub ?]}) ) ) ) (FunctionDef subtree_for_commit [] (List (= scope= flags=0 words=[] bindings=[('commit', {[DQ [VarSub 1]]})]) (= scope= flags=0 words=[] bindings=[('dir', {[DQ [VarSub 2]]})]) (Pipeline (Com {[LIT_CHARS git]} {[LIT_CHARS ls-tree]} {[DQ [VarSub commit]]} {[LIT_CHARS --]} {[DQ [VarSub dir]]}) (While (Com {[LIT_CHARS read]} {[LIT_CHARS mode]} {[LIT_CHARS type]} {[LIT_CHARS tree]} {[LIT_CHARS name]}) (List (Com {[LIT_CHARS assert]} {[LIT_CHARS test]} {[DQ [VarSub name]]} {[LIT_OTHER "="]} {[DQ [VarSub dir]]}) (Com {[LIT_CHARS assert]} {[LIT_CHARS test]} {[DQ [VarSub type]]} {[LIT_OTHER "="]} {[DQ [LIT_CHARS tree]]} {[LIT_CHARS -o]} {[DQ [VarSub type]]} {[LIT_OTHER "="]} {[DQ [LIT_CHARS commit]]}) (AndOr OP_AND_IF (Com {[LIT_CHARS test]} {[DQ [VarSub type]]} {[LIT_OTHER "="]} {[DQ [LIT_CHARS commit]]}) (Com {[LIT_CHARS continue]}) ) (Com {[LIT_CHARS echo]} {[VarSub tree]}) (Com {[LIT_CHARS break]}) ) ) ) ) ) (FunctionDef tree_changed [] (List (= scope= flags=0 words=[] bindings=[('tree', {[VarSub 1]})]) (Com {[LIT_CHARS shift]}) (If (Com {[LIT_CHARS test]} {[VarSub #]} {[LIT_CHARS -ne]} {[LIT_CHARS 1]}) (Com {[LIT_CHARS return]} {[LIT_CHARS 0]}) (ElseTrue) (List (= scope= flags=0 words=[] bindings=[('ptree', {[ComSub (Com {[LIT_CHARS toptree_for_commit]} {[VarSub 1]})]})]) (If (Com {[LIT_CHARS test]} {[DQ [VarSub ptree]]} {[LIT_OTHER "!"] [LIT_OTHER "="]} {[DQ [VarSub tree]]}) (Com {[LIT_CHARS return]} {[LIT_CHARS 0]}) (ElseTrue) (Com {[LIT_CHARS return]} {[LIT_CHARS 1]}) ) ) ) ) ) (FunctionDef new_squash_commit [] (List (= scope= flags=0 words=[] bindings=[('old', {[DQ [VarSub 1]]})]) (= scope= flags=0 words=[] bindings=[('oldsub', {[DQ [VarSub 2]]})]) (= scope= flags=0 words=[] bindings=[('newsub', {[DQ [VarSub 3]]})]) (AndOr OP_OR_IF (= scope= flags=0 words=[] bindings=[('tree', {[ComSub (Com {[LIT_CHARS toptree_for_commit]} {[VarSub newsub]})]})]) (Com {[LIT_CHARS exit]} {[VarSub ?]}) ) (If (Com {[LIT_CHARS test]} {[LIT_CHARS -n]} {[DQ [VarSub old]]}) (AndOr OP_OR_IF (Pipeline (Com {[LIT_CHARS squash_msg]} {[DQ [VarSub dir]]} {[DQ [VarSub oldsub]]} {[DQ [VarSub newsub]]}) (Com {[LIT_CHARS git]} {[LIT_CHARS commit-tree]} {[DQ [VarSub tree]]} {[LIT_CHARS -p]} {[DQ [VarSub old]]}) ) (Com {[LIT_CHARS exit]} {[VarSub ?]}) ) (ElseTrue) (AndOr OP_OR_IF (Pipeline (Com {[LIT_CHARS squash_msg]} {[DQ [VarSub dir]]} {[DQ ]} {[DQ [VarSub newsub]]}) (Com {[LIT_CHARS git]} {[LIT_CHARS commit-tree]} {[DQ [VarSub tree]]}) ) (Com {[LIT_CHARS exit]} {[VarSub ?]}) ) ) ) ) (FunctionDef copy_or_skip [] (List (= scope= flags=0 words=[] bindings=[('rev', {[DQ [VarSub 1]]})]) (= scope= flags=0 words=[] bindings=[('tree', {[DQ [VarSub 2]]})]) (= scope= flags=0 words=[] bindings=[('newparents', {[DQ [VarSub 3]]})]) (Com {[LIT_CHARS assert]} {[LIT_CHARS test]} {[LIT_CHARS -n]} {[DQ [VarSub tree]]}) (= scope= flags=0 words=[] bindings=[('identical', {[SQ ]})]) (= scope= flags=0 words=[] bindings=[('nonidentical', {[SQ ]})]) (= scope= flags=0 words=[] bindings=[('p', {[SQ ]})]) (= scope= flags=0 words=[] bindings=[('gotparents', {[SQ ]})]) (For parent [{[VarSub newparents]}]) (List (AndOr OP_OR_IF (= scope= flags=0 words=[] bindings=[('ptree', {[ComSub (Com {[LIT_CHARS toptree_for_commit]} {[VarSub parent]})]})]) (Com {[LIT_CHARS exit]} {[VarSub ?]}) ) (AndOr OP_AND_IF (Com {[LIT_CHARS test]} {[LIT_CHARS -z]} {[DQ [VarSub ptree]]}) (Com {[LIT_CHARS continue]}) ) (If (Com {[LIT_CHARS test]} {[DQ [VarSub ptree]]} {[LIT_OTHER "="]} {[DQ [VarSub tree]]}) (= scope= flags=0 words=[] bindings=[('identical', {[DQ [VarSub parent]]})]) (ElseTrue) (= scope= flags=0 words=[] bindings=[('nonidentical', {[DQ [VarSub parent]]})]) ) (= scope= flags=0 words=[] bindings=[('is_new', {[LIT_CHARS 1]})]) (For gp [{[VarSub gotparents]}]) (If (Com {[LIT_CHARS test]} {[DQ [VarSub gp]]} {[LIT_OTHER "="]} {[DQ [VarSub parent]]}) (List (= scope= flags=0 words=[] bindings=[('is_new', {[SQ ]})]) (Com {[LIT_CHARS break]}) ) ) ) (If (Com {[LIT_CHARS test]} {[LIT_CHARS -n]} {[DQ [VarSub is_new]]}) (List (= scope= flags=0 words=[] bindings=[('gotparents', {[DQ [VarSub gotparents][LIT_CHARS " "][VarSub parent]]})]) (= scope= flags=0 words=[] bindings=[('p', {[DQ [VarSub p][LIT_CHARS " -p "][VarSub parent]]})]) ) ) ) ) (= scope= flags=0 words=[] bindings=[('copycommit', {[SQ ]})]) (If (AndOr OP_AND_IF (Com {[LIT_CHARS test]} {[LIT_CHARS -n]} {[DQ [VarSub identical]]}) (Com {[LIT_CHARS test]} {[LIT_CHARS -n]} {[DQ [VarSub nonidentical]]}) ) (List (= scope= flags=0 words=[] bindings=[('extras', {[ComSub (Com {[LIT_CHARS git]} {[LIT_CHARS rev-list]} {[LIT_CHARS --count]} {[VarSub identical] [LIT_CHARS ..] [VarSub nonidentical]})]})]) (If (Com {[LIT_CHARS test]} {[DQ [VarSub extras]]} {[LIT_CHARS -ne]} {[LIT_CHARS 0]}) (= scope= flags=0 words=[] bindings=[('copycommit', {[LIT_CHARS 1]})]) ) ) ) (If (AndOr OP_AND_IF (Com {[LIT_CHARS test]} {[LIT_CHARS -n]} {[DQ [VarSub identical]]}) (Com {[LIT_CHARS test]} {[LIT_CHARS -z]} {[DQ [VarSub copycommit]]}) ) (Com {[LIT_CHARS echo]} {[VarSub identical]}) (ElseTrue) (AndOr OP_OR_IF (Com {[LIT_CHARS copy_commit]} {[DQ [VarSub rev]]} {[DQ [VarSub tree]]} {[DQ [VarSub p]]}) (Com {[LIT_CHARS exit]} {[VarSub ?]}) ) ) ) ) (FunctionDef ensure_clean [] (List (If (Pipeline! (Com {[LIT_CHARS git]} {[LIT_CHARS diff-index]} {[LIT_CHARS HEAD]} {[LIT_CHARS --exit-code]} {[LIT_CHARS --quiet]} < (DescriptorRedirectNode target={[LIT_CHARS 1]} &"> 2), > ) ) (Com {[LIT_CHARS die]} {[DQ [LIT_CHARS "Working tree has modifications. Cannot add."]]}) ) (If (Pipeline! (Com {[LIT_CHARS git]} {[LIT_CHARS diff-index]} {[LIT_CHARS --cached]} {[LIT_CHARS HEAD]} {[LIT_CHARS --exit-code]} {[LIT_CHARS --quiet]} < (DescriptorRedirectNode target={[LIT_CHARS 1]} &"> 2), > ) ) (Com {[LIT_CHARS die]} {[DQ [LIT_CHARS "Index has modifications. Cannot add."]]}) ) ) ) (FunctionDef ensure_valid_ref_format [] (AndOr OP_OR_IF (Com {[LIT_CHARS git]} {[LIT_CHARS check-ref-format]} {[DQ [LIT_CHARS refs/heads/][VarSub 1]]}) (Com {[LIT_CHARS die]} {[DQ [LIT_CHARS "'"][VarSub 1][LIT_CHARS "' does not look like a ref"]]}) ) ) (FunctionDef cmd_add [] (List (If (Com {[LIT_CHARS test]} {[LIT_CHARS -e]} {[DQ [VarSub dir]]}) (Com {[LIT_CHARS die]} {[DQ [LIT_CHARS "'"][VarSub dir][LIT_CHARS "' already exists. Cannot add."]]}) ) (Com {[LIT_CHARS ensure_clean]}) (If (Com {[LIT_CHARS test]} {[VarSub #]} {[LIT_CHARS -eq]} {[LIT_CHARS 1]}) (List (AndOr OP_OR_IF (Com {[LIT_CHARS git]} {[LIT_CHARS rev-parse]} {[LIT_CHARS -q]} {[LIT_CHARS --verify]} {[DQ [VarSub 1][LIT_CHARS "^{commit}"]]} < (FilenameRedirectNode filename={[LIT_CHARS /dev/null]} "> 1), > ) (Com {[LIT_CHARS die]} {[DQ [LIT_CHARS "'"][VarSub 1][LIT_CHARS "' does not refer to a commit"]]}) ) (Com {[LIT_CHARS cmd_add_commit]} {[DQ [VarSub @]]}) ) (Com {[LIT_CHARS test]} {[VarSub #]} {[LIT_CHARS -eq]} {[LIT_CHARS 2]}) (List (Com {[LIT_CHARS ensure_valid_ref_format]} {[DQ [VarSub 2]]}) (Com {[LIT_CHARS cmd_add_repository]} {[DQ [VarSub @]]}) ) (ElseTrue) (List (Com {[LIT_CHARS say]} {[DQ [LIT_CHARS "error: parameters were '"][VarSub @][LIT_CHARS "'"]]}) (Com {[LIT_CHARS die]} {[DQ [LIT_CHARS "Provide either a commit or a repository and commit."]]}) ) ) ) ) (FunctionDef cmd_add_repository [] (List (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "git fetch"]]} {[DQ [VarSub @]]}) (= scope= flags=0 words=[] bindings=[('repository', {[VarSub 1]})]) (= scope= flags=0 words=[] bindings=[('refspec', {[VarSub 2]})]) (AndOr OP_OR_IF (Com {[LIT_CHARS git]} {[LIT_CHARS fetch]} {[DQ [VarSub @]]}) (Com {[LIT_CHARS exit]} {[VarSub ?]}) ) (= scope= flags=0 words=[] bindings=[('revs', {[LIT_CHARS FETCH_HEAD]})]) (Com {[LIT_CHARS set]} {[LIT_CHARS --]} {[VarSub revs]}) (Com {[LIT_CHARS cmd_add_commit]} {[DQ [VarSub @]]}) ) ) (FunctionDef cmd_add_commit [] (List (AndOr OP_OR_IF (= scope= flags=0 words=[] bindings=[('revs', {[ComSub (Com {[LIT_CHARS git]} {[LIT_CHARS rev-parse]} {[VarSub default]} {[LIT_CHARS --revs-only]} {[DQ [VarSub @]]})]})]) (Com {[LIT_CHARS exit]} {[VarSub ?]}) ) (Com {[LIT_CHARS set]} {[LIT_CHARS --]} {[VarSub revs]}) (= scope= flags=0 words=[] bindings=[('rev', {[DQ [VarSub 1]]})]) (Com {[LIT_CHARS debug]} {[DQ [LIT_CHARS "Adding "][VarSub dir][LIT_CHARS " as '"][VarSub rev][LIT_CHARS "'..."]]}) (AndOr OP_OR_IF (Com {[LIT_CHARS git]} {[LIT_CHARS read-tree]} {[LIT_CHARS --prefix] [LIT_OTHER "="] [DQ [VarSub dir]]} {[VarSub rev]}) (Com {[LIT_CHARS exit]} {[VarSub ?]}) ) (AndOr OP_OR_IF (Com {[LIT_CHARS git]} {[LIT_CHARS checkout]} {[LIT_CHARS --]} {[DQ [VarSub dir]]}) (Com {[LIT_CHARS exit]} {[VarSub ?]}) ) (AndOr OP_OR_IF (= scope= flags=0 words=[] bindings=[('tree', {[ComSub (Com {[LIT_CHARS git]} {[LIT_CHARS write-tree]})]})]) (Com {[LIT_CHARS exit]} {[VarSub ?]}) ) (AndOr OP_OR_IF (= scope= flags=0 words=[] bindings=[('headrev', {[ComSub (Com {[LIT_CHARS git]} {[LIT_CHARS rev-parse]} {[LIT_CHARS HEAD]})]})]) (Com {[LIT_CHARS exit]} {[VarSub ?]}) ) (If (AndOr OP_AND_IF (Com {[LIT_CHARS test]} {[LIT_CHARS -n]} {[DQ [VarSub headrev]]}) (Com {[LIT_CHARS test]} {[DQ [VarSub headrev]]} {[LIT_OTHER "!"] [LIT_OTHER "="]} {[DQ [VarSub rev]]}) ) (= scope= flags=0 words=[] bindings=[('headp', {[DQ [LIT_CHARS "-p "][VarSub headrev]]})]) (ElseTrue) (= scope= flags=0 words=[] bindings=[('headp', {[SQ ]})]) ) (If (Com {[LIT_CHARS test]} {[LIT_CHARS -n]} {[DQ [VarSub squash]]}) (List (AndOr OP_OR_IF (= scope= flags=0 words=[] bindings=[('rev', {[ComSub (Com {[LIT_CHARS new_squash_commit]} {[DQ ]} {[DQ ]} {[DQ [VarSub rev]]})]})]) (Com {[LIT_CHARS exit]} {[VarSub ?]}) ) (AndOr OP_OR_IF (= scope= flags=0 words=[] bindings=[('commit', {[ComSub (Pipeline (Com {[LIT_CHARS add_squashed_msg]} {[DQ [VarSub rev]]} {[DQ [VarSub dir]]}) (Com {[LIT_CHARS git]} {[LIT_CHARS commit-tree]} {[DQ [VarSub tree]]} {[VarSub headp]} {[LIT_CHARS -p]} {[DQ [VarSub rev]]}) )]})]) (Com {[LIT_CHARS exit]} {[VarSub ?]}) ) ) (ElseTrue) (AndOr OP_AND_IF (= scope= flags=0 words=[] bindings=[('revp', {[ComSub (Com {[LIT_CHARS peel_committish]} {[DQ [VarSub rev]]})]})]) (AndOr OP_OR_IF (= scope= flags=0 words=[] bindings=[('commit', {[ComSub (Pipeline (Com {[LIT_CHARS add_msg]} {[DQ [VarSub dir]]} {[VarSub headrev]} {[DQ [VarSub rev]]}) (Com {[LIT_CHARS git]} {[LIT_CHARS commit-tree]} {[DQ [VarSub tree]]} {[VarSub headp]} {[LIT_CHARS -p]} {[DQ [VarSub revp]]}) )]})]) (Com {[LIT_CHARS exit]} {[VarSub ?]}) ) ) ) (AndOr OP_OR_IF (Com {[LIT_CHARS git]} {[LIT_CHARS reset]} {[DQ [VarSub commit]]}) (Com {[LIT_CHARS exit]} {[VarSub ?]}) ) (Com {[LIT_CHARS say]} {[DQ [LIT_CHARS "Added dir '"][VarSub dir][LIT_CHARS "'"]]}) ) ) (FunctionDef cmd_split [] (List (Com {[LIT_CHARS debug]} {[DQ [LIT_CHARS "Splitting "][VarSub dir][LIT_CHARS ...]]}) (AndOr OP_OR_IF (Com {[LIT_CHARS cache_setup]}) (Com {[LIT_CHARS exit]} {[VarSub ?]}) ) (If (Com {[LIT_CHARS test]} {[LIT_CHARS -n]} {[DQ [VarSub onto]]}) (List (Com {[LIT_CHARS debug]} {[DQ [LIT_CHARS "Reading history for --onto="][VarSub onto][LIT_CHARS ...]]}) (Pipeline (Com {[LIT_CHARS git]} {[LIT_CHARS rev-list]} {[VarSub onto]}) (While (Com {[LIT_CHARS read]} {[LIT_CHARS rev]}) (List (Com {[LIT_CHARS debug]} {[DQ [LIT_CHARS " cache: "][VarSub rev]]}) (Com {[LIT_CHARS cache_set]} {[DQ [VarSub rev]]} {[DQ [VarSub rev]]}) ) ) ) ) ) (If (Com {[LIT_CHARS test]} {[LIT_CHARS -n]} {[DQ [VarSub ignore_joins]]}) (= scope= flags=0 words=[] bindings=[('unrevs', {[SQ ]})]) (ElseTrue) (= scope= flags=0 words=[] bindings=[('unrevs', {[DQ [ComSub (Com {[LIT_CHARS find_existing_splits]} {[DQ [VarSub dir]]} {[DQ [VarSub revs]]})]]})]) ) (= scope= flags=0 words=[] bindings=[('grl', {[SQ ]})]) (= scope= flags=0 words=[] bindings=[('revmax', {[ComSub (Pipeline (Com {[LIT_CHARS eval]} {[DQ [VarSub grl]]}) (Com {[LIT_CHARS wc]} {[LIT_CHARS -l]}) )]})]) (= scope= flags=0 words=[] bindings=[('revcount', {[LIT_CHARS 0]})]) (= scope= flags=0 words=[] bindings=[('createcount', {[LIT_CHARS 0]})]) (AndOr OP_OR_IF (Pipeline (Com {[LIT_CHARS eval]} {[DQ [VarSub grl]]}) (While (Com {[LIT_CHARS read]} {[LIT_CHARS rev]} {[LIT_CHARS parents]}) (List (= scope= flags=0 words=[] bindings=[('revcount', {[ArithSub {A2 AS_OP_PLUS {A Atom NODE_ARITH_WORD {[VarSub revcount]}} {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 1]}}}]})]) (Com {[LIT_CHARS progress]} {[DQ [VarSub revcount][LIT_CHARS /][VarSub revmax][LIT_CHARS " ("][VarSub createcount][LIT_CHARS ")"]]}) (Com {[LIT_CHARS debug]} {[DQ [LIT_CHARS "Processing commit: "][VarSub rev]]}) (= scope= flags=0 words=[] bindings=[('exists', {[ComSub (Com {[LIT_CHARS cache_get]} {[DQ [VarSub rev]]})]})]) (If (Com {[LIT_CHARS test]} {[LIT_CHARS -n]} {[DQ [VarSub exists]]}) (List (Com {[LIT_CHARS debug]} {[DQ [LIT_CHARS " prior: "][VarSub exists]]}) (Com {[LIT_CHARS continue]}) ) ) (= scope= flags=0 words=[] bindings=[('createcount', {[ArithSub {A2 AS_OP_PLUS {A Atom NODE_ARITH_WORD {[VarSub createcount]}} {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 1]}}}]})]) (Com {[LIT_CHARS debug]} {[DQ [LIT_CHARS " parents: "][VarSub parents]]}) (= scope= flags=0 words=[] bindings=[('newparents', {[ComSub (Com {[LIT_CHARS cache_get]} {[VarSub parents]})]})]) (Com {[LIT_CHARS debug]} {[DQ [LIT_CHARS " newparents: "][VarSub newparents]]}) (= scope= flags=0 words=[] bindings=[('tree', {[ComSub (Com {[LIT_CHARS subtree_for_commit]} {[DQ [VarSub rev]]} {[DQ [VarSub dir]]})]})]) (Com {[LIT_CHARS debug]} {[DQ [LIT_CHARS " tree is: "][VarSub tree]]}) (Com {[LIT_CHARS check_parents]} {[VarSub parents]}) (If (Com {[LIT_CHARS test]} {[LIT_CHARS -z]} {[DQ [VarSub tree]]}) (List (Com {[LIT_CHARS set_notree]} {[DQ [VarSub rev]]}) (If (Com {[LIT_CHARS test]} {[LIT_CHARS -n]} {[DQ [VarSub newparents]]}) (Com {[LIT_CHARS cache_set]} {[DQ [VarSub rev]]} {[DQ [VarSub rev]]}) ) (Com {[LIT_CHARS continue]}) ) ) (AndOr OP_OR_IF (= scope= flags=0 words=[] bindings=[('newrev', {[ComSub (Com {[LIT_CHARS copy_or_skip]} {[DQ [VarSub rev]]} {[DQ [VarSub tree]]} {[DQ [VarSub newparents]]})]})]) (Com {[LIT_CHARS exit]} {[VarSub ?]}) ) (Com {[LIT_CHARS debug]} {[DQ [LIT_CHARS " newrev is: "][VarSub newrev]]}) (Com {[LIT_CHARS cache_set]} {[DQ [VarSub rev]]} {[DQ [VarSub newrev]]}) (Com {[LIT_CHARS cache_set]} {[LIT_CHARS latest_new]} {[DQ [VarSub newrev]]}) (Com {[LIT_CHARS cache_set]} {[LIT_CHARS latest_old]} {[DQ [VarSub rev]]}) ) ) ) (Com {[LIT_CHARS exit]} {[VarSub ?]}) ) (= scope= flags=0 words=[] bindings=[('latest_new', {[ComSub (Com {[LIT_CHARS cache_get]} {[LIT_CHARS latest_new]})]})]) (If (Com {[LIT_CHARS test]} {[LIT_CHARS -z]} {[DQ [VarSub latest_new]]}) (Com {[LIT_CHARS die]} {[DQ [LIT_CHARS "No new revisions were found"]]}) ) (If (Com {[LIT_CHARS test]} {[LIT_CHARS -n]} {[DQ [VarSub rejoin]]}) (List (Com {[LIT_CHARS debug]} {[DQ [LIT_CHARS "Merging split branch into HEAD..."]]}) (= scope= flags=0 words=[] bindings=[('latest_old', {[ComSub (Com {[LIT_CHARS cache_get]} {[LIT_CHARS latest_old]})]})]) (AndOr OP_OR_IF (Com {[LIT_CHARS git]} {[LIT_CHARS merge]} {[LIT_CHARS -s]} {[LIT_CHARS ours]} {[LIT_CHARS --allow-unrelated-histories]} {[LIT_CHARS -m]} {[DQ [ComSub (Com {[LIT_CHARS rejoin_msg]} {[DQ [VarSub dir]]} {[DQ [VarSub latest_old]]} {[DQ [VarSub latest_new]]})]]} {[DQ [VarSub latest_new]]} < (DescriptorRedirectNode target={[LIT_CHARS 2]} &"> 1), > ) (Com {[LIT_CHARS exit]} {[VarSub ?]}) ) ) ) (If (Com {[LIT_CHARS test]} {[LIT_CHARS -n]} {[DQ [VarSub branch]]}) (List (If (Com {[LIT_CHARS rev_exists]} {[DQ [LIT_CHARS refs/heads/][VarSub branch]]}) (List (If (Pipeline! (Com {[LIT_CHARS rev_is_descendant_of_branch]} {[DQ [VarSub latest_new]]} {[DQ [VarSub branch]]}) ) (Com {[LIT_CHARS die]} {[DQ [LIT_CHARS "Branch '"][VarSub branch][LIT_CHARS "' is not an ancestor of commit '"][VarSub latest_new][LIT_CHARS "'."]]}) ) (= scope= flags=0 words=[] bindings=[('action', {[SQ ]})]) ) (ElseTrue) (= scope= flags=0 words=[] bindings=[('action', {[SQ ]})]) ) (AndOr OP_OR_IF (Com {[LIT_CHARS git]} {[LIT_CHARS update-ref]} {[LIT_CHARS -m]} {[SQ ]} {[DQ [LIT_CHARS refs/heads/][VarSub branch]]} {[DQ [VarSub latest_new]]}) (Com {[LIT_CHARS exit]} {[VarSub ?]}) ) (Com {[LIT_CHARS say]} {[DQ [VarSub action][LIT_CHARS " branch '"][VarSub branch][LIT_CHARS "'"]]}) ) ) (Com {[LIT_CHARS echo]} {[DQ [VarSub latest_new]]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 0]}) ) ) (FunctionDef cmd_merge [] (List (AndOr OP_OR_IF (= scope= flags=0 words=[] bindings=[('revs', {[ComSub (Com {[LIT_CHARS git]} {[LIT_CHARS rev-parse]} {[VarSub default]} {[LIT_CHARS --revs-only]} {[DQ [VarSub @]]})]})]) (Com {[LIT_CHARS exit]} {[VarSub ?]}) ) (Com {[LIT_CHARS ensure_clean]}) (Com {[LIT_CHARS set]} {[LIT_CHARS --]} {[VarSub revs]}) (If (Com {[LIT_CHARS test]} {[VarSub #]} {[LIT_CHARS -ne]} {[LIT_CHARS 1]}) (Com {[LIT_CHARS die]} {[DQ [LIT_CHARS "You must provide exactly one revision. Got: '"][VarSub revs][LIT_CHARS "'"]]}) ) (= scope= flags=0 words=[] bindings=[('rev', {[DQ [VarSub 1]]})]) (If (Com {[LIT_CHARS test]} {[LIT_CHARS -n]} {[DQ [VarSub squash]]}) (List (= scope= flags=0 words=[] bindings=[('first_split', {[DQ [ComSub (Com {[LIT_CHARS find_latest_squash]} {[DQ [VarSub dir]]})]]})]) (If (Com {[LIT_CHARS test]} {[LIT_CHARS -z]} {[DQ [VarSub first_split]]}) (Com {[LIT_CHARS die]} {[DQ [LIT_CHARS "Can't squash-merge: '"][VarSub dir][LIT_CHARS "' was never added."]]}) ) (Com {[LIT_CHARS set]} {[VarSub first_split]}) (= scope= flags=0 words=[] bindings=[('old', {[VarSub 1]})]) (= scope= flags=0 words=[] bindings=[('sub', {[VarSub 2]})]) (If (Com {[LIT_CHARS test]} {[DQ [VarSub sub]]} {[LIT_OTHER "="]} {[DQ [VarSub rev]]}) (List (Com {[LIT_CHARS say]} {[DQ [LIT_CHARS "Subtree is already at commit "][VarSub rev][LIT_CHARS .]]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 0]}) ) ) (AndOr OP_OR_IF (= scope= flags=0 words=[] bindings=[('new', {[ComSub (Com {[LIT_CHARS new_squash_commit]} {[DQ [VarSub old]]} {[DQ [VarSub sub]]} {[DQ [VarSub rev]]})]})]) (Com {[LIT_CHARS exit]} {[VarSub ?]}) ) (Com {[LIT_CHARS debug]} {[DQ [LIT_CHARS "New squash commit: "][VarSub new]]}) (= scope= flags=0 words=[] bindings=[('rev', {[DQ [VarSub new]]})]) ) ) (= scope= flags=0 words=[] bindings=[('version', {[ComSub (Com {[LIT_CHARS git]} {[LIT_CHARS version]})]})]) (If (Com {[LIT_CHARS test]} {[DQ [VarSub version]]} {[\ LIT_ESCAPED_CHAR "\\<"]} {[DQ [LIT_CHARS "git version 1.7"]]}) (If (Com {[LIT_CHARS test]} {[LIT_CHARS -n]} {[DQ [VarSub message]]}) (Com {[LIT_CHARS git]} {[LIT_CHARS merge]} {[LIT_CHARS -s]} {[LIT_CHARS subtree]} {[LIT_CHARS --message] [LIT_OTHER "="] [DQ [VarSub message]]} {[DQ [VarSub rev]]}) (ElseTrue) (Com {[LIT_CHARS git]} {[LIT_CHARS merge]} {[LIT_CHARS -s]} {[LIT_CHARS subtree]} {[DQ [VarSub rev]]}) ) (ElseTrue) (If (Com {[LIT_CHARS test]} {[LIT_CHARS -n]} {[DQ [VarSub message]]}) (Com {[LIT_CHARS git]} {[LIT_CHARS merge]} {[LIT_CHARS -Xsubtree] [LIT_OTHER "="] [DQ [VarSub prefix]]} {[LIT_CHARS --message] [LIT_OTHER "="] [DQ [VarSub message]]} {[DQ [VarSub rev]]}) (ElseTrue) (Com {[LIT_CHARS git]} {[LIT_CHARS merge]} {[LIT_CHARS -Xsubtree] [LIT_OTHER "="] [DQ [VarSub prefix]]} {[VarSub rev]}) ) ) ) ) (FunctionDef cmd_pull [] (List (If (Com {[LIT_CHARS test]} {[VarSub #]} {[LIT_CHARS -ne]} {[LIT_CHARS 2]}) (Com {[LIT_CHARS die]} {[DQ [LIT_CHARS "You must provide "]]}) ) (Com {[LIT_CHARS ensure_clean]}) (Com {[LIT_CHARS ensure_valid_ref_format]} {[DQ [VarSub 2]]}) (AndOr OP_OR_IF (Com {[LIT_CHARS git]} {[LIT_CHARS fetch]} {[DQ [VarSub @]]}) (Com {[LIT_CHARS exit]} {[VarSub ?]}) ) (= scope= flags=0 words=[] bindings=[('revs', {[LIT_CHARS FETCH_HEAD]})]) (Com {[LIT_CHARS set]} {[LIT_CHARS --]} {[VarSub revs]}) (Com {[LIT_CHARS cmd_merge]} {[DQ [VarSub @]]}) ) ) (FunctionDef cmd_push [] (List (If (Com {[LIT_CHARS test]} {[VarSub #]} {[LIT_CHARS -ne]} {[LIT_CHARS 2]}) (Com {[LIT_CHARS die]} {[DQ [LIT_CHARS "You must provide "]]}) ) (Com {[LIT_CHARS ensure_valid_ref_format]} {[DQ [VarSub 2]]}) (If (Com {[LIT_CHARS test]} {[LIT_CHARS -e]} {[DQ [VarSub dir]]}) (List (= scope= flags=0 words=[] bindings=[('repository', {[VarSub 1]})]) (= scope= flags=0 words=[] bindings=[('refspec', {[VarSub 2]})]) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "git push using: "]]} {[DQ [VarSub repository]]} {[DQ [VarSub refspec]]}) (AndOr OP_OR_IF (= scope= flags=0 words=[] bindings=[('localrev', {[ComSub (Com {[LIT_CHARS git]} {[LIT_CHARS subtree]} {[LIT_CHARS split]} {[LIT_CHARS --prefix] [LIT_OTHER "="] [DQ [VarSub prefix]]})]})]) (Com {[LIT_CHARS die]}) ) (Com {[LIT_CHARS git]} {[LIT_CHARS push]} {[DQ [VarSub repository]]} {[DQ [VarSub localrev]] [LIT_OTHER ":"] [DQ [LIT_CHARS refs/heads/][VarSub refspec]]}) ) (ElseTrue) (Com {[LIT_CHARS die]} {[DQ [LIT_CHARS "'"][VarSub dir][LIT_CHARS "' must already exist. Try 'git subtree add'."]]}) ) ) ) (Com {[DQ [LIT_CHARS cmd_][VarSub command]]} {[DQ [VarSub @]]}) )