#!/bin/sh # # Copyright (c) 2005 Junio C Hamano # # Resolve two or more trees. # source git-sh-setup setglobal LF = '' '' # The first parameters up to -- are merge bases; the rest are heads. setglobal bases = '', head = '', remotes = '', sep_seen = ''for arg in @Argv { match ",$sep_seen,$head,$arg," { with *,--, setglobal sep_seen = 'yes' with ,yes,,* setglobal head = $arg with ,yes,* setglobal remotes = ""$remotes$arg "" with * setglobal bases = ""$bases$arg "" } } # Reject if this is not an octopus -- resolve should be used instead. match $remotes { with ?*' '?* with * exit 2 } # MRC is the current "merge reference commit" # MRT is the current "merge result tree" if ! git diff-index --quiet --cached HEAD -- { gettextln "Error: Your local changes to the following files would be overwritten by merge" git diff-index --cached --name-only HEAD -- | sed -e 's/^/ /' exit 2 } setglobal MRC = $[git rev-parse --verify -q $head] setglobal MRT = $[git write-tree] setglobal NON_FF_MERGE = '0' setglobal OCTOPUS_FAILURE = '0' for SHA1 in [$remotes] { match $OCTOPUS_FAILURE { with 1 # We allow only last one to have a hand-resolvable # conflicts. Last round failed and we still had # a head to merge. gettextln "Automated merge did not work." gettextln "Should not be doing an octopus." exit 2 } eval pretty_name='$'{GITHEAD_$SHA1:-$SHA1} if test $SHA1 = $pretty_name { setglobal SHA1_UP = $[echo $SHA1 | tr a-z A-Z] eval pretty_name='$'{GITHEAD_$SHA1_UP:-$pretty_name} } setglobal common = $[git merge-base --all $SHA1 $MRC] || die $[eval_gettext "Unable to find common commit with \$pretty_name] match "$LF$common$LF" { with *"$LF$SHA1$LF"* eval_gettextln "Already up-to-date with \$pretty_name" continue } if test "$common,$NON_FF_MERGE" = "$MRC,0" { # The first head being merged was a fast-forward. # Advance MRC to the head being merged, and use that # tree as the intermediate result of the merge. # We still need to count this as part of the parent set. eval_gettextln "Fast-forwarding to: \$pretty_name" git read-tree -u -m $head $SHA1 || exit setglobal MRC = $SHA1, MRT = $[git write-tree] continue } setglobal NON_FF_MERGE = '1' eval_gettextln "Trying simple merge with \$pretty_name" git read-tree -u -m --aggressive $common $MRT $SHA1 || exit 2 setglobal next = $[git write-tree !2 >/dev/null] if test $Status -ne 0 { gettextln "Simple merge did not work, trying automatic merge." git-merge-index -o git-merge-one-file -a || setglobal OCTOPUS_FAILURE = '1' setglobal next = $[git write-tree !2 >/dev/null] } setglobal MRC = ""$MRC $SHA1"" setglobal MRT = $next } exit "$OCTOPUS_FAILURE"