#!/bin/sh # # Copyright (c) 2005 Junio C Hamano # # Resolve two or more trees. # source git-sh-setup setvar LF = '' '' # The first parameters up to -- are merge bases; the rest are heads. setvar bases = '', head = '', remotes = '', sep_seen = ''for arg in @ARGV { match ",$sep_seen,$head,$arg," { with *,--, setvar sep_seen = 'yes' with ,yes,,* setvar head = "$arg" with ,yes,* setvar remotes = ""$remotes$arg "" with * setvar 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 } setvar MRC = $(git rev-parse --verify -q $head) setvar MRT = $(git write-tree) setvar NON_FF_MERGE = '0' setvar 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 { setvar SHA1_UP = "$(echo "$SHA1" | tr a-z A-Z)" eval pretty_name='$'{GITHEAD_$SHA1_UP:-$pretty_name} } setvar 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 setvar MRC = "$SHA1", MRT = $(git write-tree) continue } setvar NON_FF_MERGE = '1' eval_gettextln "Trying simple merge with \$pretty_name" git read-tree -u -m --aggressive $common $MRT $SHA1 || exit 2 setvar 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 || setvar OCTOPUS_FAILURE = '1' setvar next = $(git write-tree 2>/dev/null) } setvar MRC = ""$MRC $SHA1"" setvar MRT = "$next" } exit "$OCTOPUS_FAILURE"