hgmerge
author Vadim Gelfer <vadim.gelfer@gmail.com>
Fri, 24 Mar 2006 09:08:12 -0800
changeset 1998 65cc17ae9649
parent 1885 c4d577262d00
child 2051 6a03cff2b0f5
permissions -rwxr-xr-x
fix race in localrepo.addchangegroup. localrepo.addchangegroup writes to changelog, then manifest, then normal files. this breaks access ordering. if reader reads changelog while manifest is being written, can find pointers into places in manifest that are not yet written. same can happen for manifest and normal files. fix is to make almost no change to localrepo.addchangegroup. it must to write changelog and manifest data early because it has to read them while writing other files. instead, write changelog and manifest data to temp file that reader cannot see, then append temp data to manifest after all normal files written, finally append temp data to changelog. temp file code is in new appendfile module. can be used in other places with small changes. much smaller race still left. we write all new data in one write call, but reader can maybe see partial update because python or os or filesystem cannot always make write really atomic. file locking no help: slow, not portable, not reliable over nfs. only real safe other plan is write to temp file every time and rename, but performance bad when manifest or changelog is big.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
544
3d4d5f2aba9a Remove bashisms and use /bin/sh instead of /bin/bash.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 306
diff changeset
     1
#!/bin/sh
240
737c66b68290 Replace tkmerge with hgmerge
mpm@selenic.com
parents:
diff changeset
     2
#
737c66b68290 Replace tkmerge with hgmerge
mpm@selenic.com
parents:
diff changeset
     3
# hgmerge - default merge helper for Mercurial
737c66b68290 Replace tkmerge with hgmerge
mpm@selenic.com
parents:
diff changeset
     4
#
737c66b68290 Replace tkmerge with hgmerge
mpm@selenic.com
parents:
diff changeset
     5
# This tries to find a way to do three-way merge on the current system.
1885
c4d577262d00 run merge program in repo root.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1884
diff changeset
     6
# The result ought to end up in $1.  Script is run in root directory of
c4d577262d00 run merge program in repo root.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1884
diff changeset
     7
# repository.
1883
b98160cfb2f3 give more info to hgmerge script.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1880
diff changeset
     8
#
b98160cfb2f3 give more info to hgmerge script.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1880
diff changeset
     9
# Environment variables set by Mercurial:
b98160cfb2f3 give more info to hgmerge script.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1880
diff changeset
    10
# HG_FILE            name of file within repo
b98160cfb2f3 give more info to hgmerge script.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1880
diff changeset
    11
# HG_MY_NODE         revision being merged
b98160cfb2f3 give more info to hgmerge script.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1880
diff changeset
    12
# HG_OTHER_NODE      revision being merged
240
737c66b68290 Replace tkmerge with hgmerge
mpm@selenic.com
parents:
diff changeset
    13
737c66b68290 Replace tkmerge with hgmerge
mpm@selenic.com
parents:
diff changeset
    14
set -e # bail out quickly on failure
737c66b68290 Replace tkmerge with hgmerge
mpm@selenic.com
parents:
diff changeset
    15
795
cd0ad12d9e42 Remove usage of ${par:-word}, which and mktemp. Quote filenames.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 547
diff changeset
    16
LOCAL="$1"
cd0ad12d9e42 Remove usage of ${par:-word}, which and mktemp. Quote filenames.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 547
diff changeset
    17
BASE="$2"
cd0ad12d9e42 Remove usage of ${par:-word}, which and mktemp. Quote filenames.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 547
diff changeset
    18
OTHER="$3"
240
737c66b68290 Replace tkmerge with hgmerge
mpm@selenic.com
parents:
diff changeset
    19
795
cd0ad12d9e42 Remove usage of ${par:-word}, which and mktemp. Quote filenames.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 547
diff changeset
    20
if [ -z "$EDITOR" ]; then
cd0ad12d9e42 Remove usage of ${par:-word}, which and mktemp. Quote filenames.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 547
diff changeset
    21
    EDITOR="vi"
cd0ad12d9e42 Remove usage of ${par:-word}, which and mktemp. Quote filenames.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 547
diff changeset
    22
fi
304
38fb7d23b78d Use vi if $EDITOR is unset.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 303
diff changeset
    23
1434
696851b1bba9 Fix use of diff(1) triggered by set -e.
levon@movementarian.org
parents: 839
diff changeset
    24
# find decent versions of our utilities, insisting on the GNU versions where we
696851b1bba9 Fix use of diff(1) triggered by set -e.
levon@movementarian.org
parents: 839
diff changeset
    25
# need to
1770
4eea6a747c27 hgmerge: fix diff+patch detection; cleanups
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1701
diff changeset
    26
MERGE="merge"
4eea6a747c27 hgmerge: fix diff+patch detection; cleanups
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1701
diff changeset
    27
DIFF3="gdiff3"
4eea6a747c27 hgmerge: fix diff+patch detection; cleanups
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1701
diff changeset
    28
DIFF="gdiff"
4eea6a747c27 hgmerge: fix diff+patch detection; cleanups
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1701
diff changeset
    29
PATCH="gpatch"
1434
696851b1bba9 Fix use of diff(1) triggered by set -e.
levon@movementarian.org
parents: 839
diff changeset
    30
1770
4eea6a747c27 hgmerge: fix diff+patch detection; cleanups
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1701
diff changeset
    31
type "$MERGE" >/dev/null 2>&1 || MERGE=
4eea6a747c27 hgmerge: fix diff+patch detection; cleanups
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1701
diff changeset
    32
type "$DIFF3" >/dev/null 2>&1 || DIFF3="diff3"
1434
696851b1bba9 Fix use of diff(1) triggered by set -e.
levon@movementarian.org
parents: 839
diff changeset
    33
$DIFF3 --version >/dev/null 2>&1 || DIFF3=
1770
4eea6a747c27 hgmerge: fix diff+patch detection; cleanups
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1701
diff changeset
    34
type "$DIFF"  >/dev/null 2>&1 || DIFF="diff"
4eea6a747c27 hgmerge: fix diff+patch detection; cleanups
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1701
diff changeset
    35
type "$DIFF"  >/dev/null 2>&1 || DIFF=
4eea6a747c27 hgmerge: fix diff+patch detection; cleanups
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1701
diff changeset
    36
type "$PATCH" >/dev/null 2>&1 || PATCH="patch"
4eea6a747c27 hgmerge: fix diff+patch detection; cleanups
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1701
diff changeset
    37
type "$PATCH" >/dev/null 2>&1 || PATCH=
1434
696851b1bba9 Fix use of diff(1) triggered by set -e.
levon@movementarian.org
parents: 839
diff changeset
    38
1699
83e8cd97b9f9 hgmerge: add and use more tool variables
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1664
diff changeset
    39
# find optional visual utilities
1770
4eea6a747c27 hgmerge: fix diff+patch detection; cleanups
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1701
diff changeset
    40
FILEMERGE="/Developer/Applications/Utilities/FileMerge.app/Contents/MacOS/FileMerge"
4eea6a747c27 hgmerge: fix diff+patch detection; cleanups
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1701
diff changeset
    41
KDIFF3="kdiff3"
4eea6a747c27 hgmerge: fix diff+patch detection; cleanups
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1701
diff changeset
    42
TKDIFF="tkdiff"
1774
ac7b91bcbd8d hgmerge: add meld support
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1773
diff changeset
    43
MELD="meld"
1699
83e8cd97b9f9 hgmerge: add and use more tool variables
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1664
diff changeset
    44
1770
4eea6a747c27 hgmerge: fix diff+patch detection; cleanups
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1701
diff changeset
    45
type "$FILEMERGE" >/dev/null 2>&1 || FILEMERGE=
4eea6a747c27 hgmerge: fix diff+patch detection; cleanups
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1701
diff changeset
    46
type "$KDIFF3"    >/dev/null 2>&1 || KDIFF3=
4eea6a747c27 hgmerge: fix diff+patch detection; cleanups
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1701
diff changeset
    47
type "$TKDIFF"    >/dev/null 2>&1 || TKDIFF=
1774
ac7b91bcbd8d hgmerge: add meld support
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1773
diff changeset
    48
type "$MELD"      >/dev/null 2>&1 || MELD=
1699
83e8cd97b9f9 hgmerge: add and use more tool variables
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1664
diff changeset
    49
1701
4ba8fe499df2 hgmerge: various cleanups
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1700
diff changeset
    50
# random part of names
1770
4eea6a747c27 hgmerge: fix diff+patch detection; cleanups
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1701
diff changeset
    51
RAND="$RANDOM$RANDOM"
1701
4ba8fe499df2 hgmerge: various cleanups
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1700
diff changeset
    52
1700
e2f91e0acbb8 hgmerge: add cleanup functions
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1699
diff changeset
    53
# temporary directory for diff+patch merge
1797
42f75cd04bf4 Fix hgmerge: mkdir "'/tmp'/hgmerge..." and ask_if_merged() didn't work.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1774
diff changeset
    54
HGTMP="${TMPDIR-/tmp}/hgmerge.$RAND"
1701
4ba8fe499df2 hgmerge: various cleanups
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1700
diff changeset
    55
4ba8fe499df2 hgmerge: various cleanups
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1700
diff changeset
    56
# backup file
4ba8fe499df2 hgmerge: various cleanups
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1700
diff changeset
    57
BACKUP="$LOCAL.orig.$RAND"
4ba8fe499df2 hgmerge: various cleanups
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1700
diff changeset
    58
4ba8fe499df2 hgmerge: various cleanups
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1700
diff changeset
    59
# file used to test for file change
4ba8fe499df2 hgmerge: various cleanups
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1700
diff changeset
    60
CHGTEST="$LOCAL.chg.$RAND"
1700
e2f91e0acbb8 hgmerge: add cleanup functions
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1699
diff changeset
    61
e2f91e0acbb8 hgmerge: add cleanup functions
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1699
diff changeset
    62
# put all your required cleanup here
e2f91e0acbb8 hgmerge: add cleanup functions
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1699
diff changeset
    63
cleanup() {
1701
4ba8fe499df2 hgmerge: various cleanups
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1700
diff changeset
    64
    rm -f "$BACKUP" "$CHGTEST"
1700
e2f91e0acbb8 hgmerge: add cleanup functions
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1699
diff changeset
    65
    rm -rf "$HGTMP"
e2f91e0acbb8 hgmerge: add cleanup functions
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1699
diff changeset
    66
}
e2f91e0acbb8 hgmerge: add cleanup functions
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1699
diff changeset
    67
e2f91e0acbb8 hgmerge: add cleanup functions
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1699
diff changeset
    68
# functions concerning program exit
e2f91e0acbb8 hgmerge: add cleanup functions
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1699
diff changeset
    69
success() {
e2f91e0acbb8 hgmerge: add cleanup functions
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1699
diff changeset
    70
    cleanup
e2f91e0acbb8 hgmerge: add cleanup functions
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1699
diff changeset
    71
    exit 0
e2f91e0acbb8 hgmerge: add cleanup functions
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1699
diff changeset
    72
}
e2f91e0acbb8 hgmerge: add cleanup functions
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1699
diff changeset
    73
e2f91e0acbb8 hgmerge: add cleanup functions
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1699
diff changeset
    74
failure() {
e2f91e0acbb8 hgmerge: add cleanup functions
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1699
diff changeset
    75
    echo "merge failed" 1>&2
1701
4ba8fe499df2 hgmerge: various cleanups
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1700
diff changeset
    76
    mv "$BACKUP" "$LOCAL"
1700
e2f91e0acbb8 hgmerge: add cleanup functions
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1699
diff changeset
    77
    cleanup
e2f91e0acbb8 hgmerge: add cleanup functions
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1699
diff changeset
    78
    exit 1
e2f91e0acbb8 hgmerge: add cleanup functions
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1699
diff changeset
    79
}
e2f91e0acbb8 hgmerge: add cleanup functions
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1699
diff changeset
    80
1771
e22bbca2e82b hgmerge: add and use ask_if_merged function
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1770
diff changeset
    81
# Ask if the merge was successful
e22bbca2e82b hgmerge: add and use ask_if_merged function
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1770
diff changeset
    82
ask_if_merged() {
1797
42f75cd04bf4 Fix hgmerge: mkdir "'/tmp'/hgmerge..." and ask_if_merged() didn't work.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1774
diff changeset
    83
    while true; do
42f75cd04bf4 Fix hgmerge: mkdir "'/tmp'/hgmerge..." and ask_if_merged() didn't work.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1774
diff changeset
    84
        echo "$LOCAL seems unchanged."
42f75cd04bf4 Fix hgmerge: mkdir "'/tmp'/hgmerge..." and ask_if_merged() didn't work.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1774
diff changeset
    85
        echo "Was the merge successful? [y/n]"
1771
e22bbca2e82b hgmerge: add and use ask_if_merged function
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1770
diff changeset
    86
        read answer
1797
42f75cd04bf4 Fix hgmerge: mkdir "'/tmp'/hgmerge..." and ask_if_merged() didn't work.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1774
diff changeset
    87
        case "$answer" in
1771
e22bbca2e82b hgmerge: add and use ask_if_merged function
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1770
diff changeset
    88
            y*|Y*) success;;
e22bbca2e82b hgmerge: add and use ask_if_merged function
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1770
diff changeset
    89
            n*|N*) failure;;
e22bbca2e82b hgmerge: add and use ask_if_merged function
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1770
diff changeset
    90
        esac
e22bbca2e82b hgmerge: add and use ask_if_merged function
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1770
diff changeset
    91
    done
e22bbca2e82b hgmerge: add and use ask_if_merged function
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1770
diff changeset
    92
}
e22bbca2e82b hgmerge: add and use ask_if_merged function
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1770
diff changeset
    93
1700
e2f91e0acbb8 hgmerge: add cleanup functions
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1699
diff changeset
    94
# Clean up when interrupted
e2f91e0acbb8 hgmerge: add cleanup functions
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1699
diff changeset
    95
trap "failure" 1 2 3 6 15 # HUP INT QUIT ABRT TERM
e2f91e0acbb8 hgmerge: add cleanup functions
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1699
diff changeset
    96
1701
4ba8fe499df2 hgmerge: various cleanups
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1700
diff changeset
    97
# Back up our file (and try hard to keep the mtime unchanged)
4ba8fe499df2 hgmerge: various cleanups
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1700
diff changeset
    98
mv "$LOCAL" "$BACKUP"
4ba8fe499df2 hgmerge: various cleanups
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1700
diff changeset
    99
cp "$BACKUP" "$LOCAL"
240
737c66b68290 Replace tkmerge with hgmerge
mpm@selenic.com
parents:
diff changeset
   100
737c66b68290 Replace tkmerge with hgmerge
mpm@selenic.com
parents:
diff changeset
   101
# Attempt to do a non-interactive merge
1770
4eea6a747c27 hgmerge: fix diff+patch detection; cleanups
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1701
diff changeset
   102
if [ -n "$MERGE" -o -n "$DIFF3" ]; then
4eea6a747c27 hgmerge: fix diff+patch detection; cleanups
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1701
diff changeset
   103
    if [ -n "$MERGE" ]; then
4eea6a747c27 hgmerge: fix diff+patch detection; cleanups
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1701
diff changeset
   104
        $MERGE "$LOCAL" "$BASE" "$OTHER" 2> /dev/null && success
4eea6a747c27 hgmerge: fix diff+patch detection; cleanups
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1701
diff changeset
   105
    elif [ -n "$DIFF3" ]; then
4eea6a747c27 hgmerge: fix diff+patch detection; cleanups
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1701
diff changeset
   106
        $DIFF3 -m "$BACKUP" "$BASE" "$OTHER" > "$LOCAL" && success
4eea6a747c27 hgmerge: fix diff+patch detection; cleanups
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1701
diff changeset
   107
    fi
4eea6a747c27 hgmerge: fix diff+patch detection; cleanups
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1701
diff changeset
   108
    if [ $? -gt 1 ]; then
4eea6a747c27 hgmerge: fix diff+patch detection; cleanups
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1701
diff changeset
   109
        echo "automatic merge failed! Exiting." 1>&2
1700
e2f91e0acbb8 hgmerge: add cleanup functions
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1699
diff changeset
   110
        failure
1434
696851b1bba9 Fix use of diff(1) triggered by set -e.
levon@movementarian.org
parents: 839
diff changeset
   111
    fi
240
737c66b68290 Replace tkmerge with hgmerge
mpm@selenic.com
parents:
diff changeset
   112
fi
737c66b68290 Replace tkmerge with hgmerge
mpm@selenic.com
parents:
diff changeset
   113
1664
4338e33c973b Safer version of FileMerge merge
Brendan Cully <brendan@kublai.com>
parents: 1647
diff changeset
   114
# on MacOS X try FileMerge.app, shipped with Apple's developer tools
1699
83e8cd97b9f9 hgmerge: add and use more tool variables
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1664
diff changeset
   115
if [ -n "$FILEMERGE" ]; then
1701
4ba8fe499df2 hgmerge: various cleanups
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1700
diff changeset
   116
    cp "$BACKUP" "$LOCAL"
4ba8fe499df2 hgmerge: various cleanups
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1700
diff changeset
   117
    cp "$BACKUP" "$CHGTEST"
1664
4338e33c973b Safer version of FileMerge merge
Brendan Cully <brendan@kublai.com>
parents: 1647
diff changeset
   118
    # filemerge prefers the right by default
1701
4ba8fe499df2 hgmerge: various cleanups
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1700
diff changeset
   119
    $FILEMERGE -left "$OTHER" -right "$LOCAL" -ancestor "$BASE" -merge "$LOCAL"
4ba8fe499df2 hgmerge: various cleanups
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1700
diff changeset
   120
    [ $? -ne 0 ] && echo "FileMerge failed to launch" && failure
1771
e22bbca2e82b hgmerge: add and use ask_if_merged function
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1770
diff changeset
   121
    test "$LOCAL" -nt "$CHGTEST" && success || ask_if_merged
1647
64a1169c927d Use of opendiff as merge program on MacOS X
Christian Ebert <blacktrash@gmx.net>
parents: 1434
diff changeset
   122
fi
64a1169c927d Use of opendiff as merge program on MacOS X
Christian Ebert <blacktrash@gmx.net>
parents: 1434
diff changeset
   123
303
15a9e55e7ea5 Check if $DISPLAY is set before using tkdiff or kdiff3.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 280
diff changeset
   124
if [ -n "$DISPLAY" ]; then
15a9e55e7ea5 Check if $DISPLAY is set before using tkdiff or kdiff3.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 280
diff changeset
   125
    # try using kdiff3, which is fairly nice
1699
83e8cd97b9f9 hgmerge: add and use more tool variables
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1664
diff changeset
   126
    if [ -n "$KDIFF3" ]; then
1798
d610fe0e6893 hgmerge: do not use file with markers in tools merging themselves
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1797
diff changeset
   127
        $KDIFF3 --auto "$BASE" "$BACKUP" "$OTHER" -o "$LOCAL" || failure
1770
4eea6a747c27 hgmerge: fix diff+patch detection; cleanups
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1701
diff changeset
   128
        success
240
737c66b68290 Replace tkmerge with hgmerge
mpm@selenic.com
parents:
diff changeset
   129
    fi
737c66b68290 Replace tkmerge with hgmerge
mpm@selenic.com
parents:
diff changeset
   130
303
15a9e55e7ea5 Check if $DISPLAY is set before using tkdiff or kdiff3.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 280
diff changeset
   131
    # try using tkdiff, which is a bit less sophisticated
1699
83e8cd97b9f9 hgmerge: add and use more tool variables
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1664
diff changeset
   132
    if [ -n "$TKDIFF" ]; then
1798
d610fe0e6893 hgmerge: do not use file with markers in tools merging themselves
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1797
diff changeset
   133
        $TKDIFF "$BACKUP" "$OTHER" -a "$BASE" -o "$LOCAL" || failure
1770
4eea6a747c27 hgmerge: fix diff+patch detection; cleanups
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1701
diff changeset
   134
        success
240
737c66b68290 Replace tkmerge with hgmerge
mpm@selenic.com
parents:
diff changeset
   135
    fi
1774
ac7b91bcbd8d hgmerge: add meld support
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1773
diff changeset
   136
ac7b91bcbd8d hgmerge: add meld support
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1773
diff changeset
   137
    if [ -n "$MELD" ]; then
ac7b91bcbd8d hgmerge: add meld support
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1773
diff changeset
   138
        cp "$BACKUP" "$CHGTEST"
ac7b91bcbd8d hgmerge: add meld support
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1773
diff changeset
   139
        # protect our feet - meld allows us to save to the left file
ac7b91bcbd8d hgmerge: add meld support
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1773
diff changeset
   140
        cp "$BACKUP" "$LOCAL.tmp.$RAND"
ac7b91bcbd8d hgmerge: add meld support
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1773
diff changeset
   141
        # Meld doesn't have automatic merging, so to reduce intervention
ac7b91bcbd8d hgmerge: add meld support
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1773
diff changeset
   142
        # use the file with conflicts
ac7b91bcbd8d hgmerge: add meld support
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1773
diff changeset
   143
        $MELD "$LOCAL.tmp.$RAND" "$LOCAL" "$OTHER" || failure
ac7b91bcbd8d hgmerge: add meld support
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1773
diff changeset
   144
        # Also it doesn't return good error code
ac7b91bcbd8d hgmerge: add meld support
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1773
diff changeset
   145
        test "$LOCAL" -nt "$CHGTEST" && success || ask_if_merged
ac7b91bcbd8d hgmerge: add meld support
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1773
diff changeset
   146
    fi
240
737c66b68290 Replace tkmerge with hgmerge
mpm@selenic.com
parents:
diff changeset
   147
fi
737c66b68290 Replace tkmerge with hgmerge
mpm@selenic.com
parents:
diff changeset
   148
737c66b68290 Replace tkmerge with hgmerge
mpm@selenic.com
parents:
diff changeset
   149
# Attempt to do a merge with $EDITOR
1772
b1a7fd503a29 hgmerge: logic changes
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1771
diff changeset
   150
if [ -n "$MERGE" -o -n "$DIFF3" ]; then
242
a2edb4481f19 hgmerge: use diff3 if available
mpm@selenic.com
parents: 240
diff changeset
   151
    echo "conflicts detected in $LOCAL"
1772
b1a7fd503a29 hgmerge: logic changes
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1771
diff changeset
   152
    cp "$BACKUP" "$CHGTEST"
b1a7fd503a29 hgmerge: logic changes
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1771
diff changeset
   153
    $EDITOR "$LOCAL" || failure
b1a7fd503a29 hgmerge: logic changes
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1771
diff changeset
   154
    # Some editors do not return meaningful error codes
b1a7fd503a29 hgmerge: logic changes
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1771
diff changeset
   155
    # Do not take any chances
b1a7fd503a29 hgmerge: logic changes
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1771
diff changeset
   156
    test "$LOCAL" -nt "$CHGTEST" && success || ask_if_merged
240
737c66b68290 Replace tkmerge with hgmerge
mpm@selenic.com
parents:
diff changeset
   157
fi
737c66b68290 Replace tkmerge with hgmerge
mpm@selenic.com
parents:
diff changeset
   158
737c66b68290 Replace tkmerge with hgmerge
mpm@selenic.com
parents:
diff changeset
   159
# attempt to manually merge with diff and patch
1434
696851b1bba9 Fix use of diff(1) triggered by set -e.
levon@movementarian.org
parents: 839
diff changeset
   160
if [ -n "$DIFF" -a -n "$PATCH" ]; then
795
cd0ad12d9e42 Remove usage of ${par:-word}, which and mktemp. Quote filenames.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 547
diff changeset
   161
829
764b0350acb8 Shortened hgmerge a little bit.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 828
diff changeset
   162
    (umask 077 && mkdir "$HGTMP") || {
1770
4eea6a747c27 hgmerge: fix diff+patch detection; cleanups
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1701
diff changeset
   163
        echo "Could not create temporary directory $HGTMP" 1>&2
4eea6a747c27 hgmerge: fix diff+patch detection; cleanups
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1701
diff changeset
   164
        failure
829
764b0350acb8 Shortened hgmerge a little bit.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 828
diff changeset
   165
    }
795
cd0ad12d9e42 Remove usage of ${par:-word}, which and mktemp. Quote filenames.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 547
diff changeset
   166
1434
696851b1bba9 Fix use of diff(1) triggered by set -e.
levon@movementarian.org
parents: 839
diff changeset
   167
    $DIFF -u "$BASE" "$OTHER" > "$HGTMP/diff" || :
696851b1bba9 Fix use of diff(1) triggered by set -e.
levon@movementarian.org
parents: 839
diff changeset
   168
    if $PATCH "$LOCAL" < "$HGTMP/diff"; then
1770
4eea6a747c27 hgmerge: fix diff+patch detection; cleanups
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1701
diff changeset
   169
        success
829
764b0350acb8 Shortened hgmerge a little bit.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 828
diff changeset
   170
    else
1770
4eea6a747c27 hgmerge: fix diff+patch detection; cleanups
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1701
diff changeset
   171
        # If rejects are empty after using the editor, merge was ok
1772
b1a7fd503a29 hgmerge: logic changes
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1771
diff changeset
   172
        $EDITOR "$LOCAL" "$LOCAL.rej" || failure
b1a7fd503a29 hgmerge: logic changes
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1771
diff changeset
   173
        test -s "$LOCAL.rej" || success
240
737c66b68290 Replace tkmerge with hgmerge
mpm@selenic.com
parents:
diff changeset
   174
    fi
1700
e2f91e0acbb8 hgmerge: add cleanup functions
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1699
diff changeset
   175
    failure
240
737c66b68290 Replace tkmerge with hgmerge
mpm@selenic.com
parents:
diff changeset
   176
fi
737c66b68290 Replace tkmerge with hgmerge
mpm@selenic.com
parents:
diff changeset
   177
1773
aae93c3bffb4 hgmerge: improve "apps not found" message
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1772
diff changeset
   178
echo
aae93c3bffb4 hgmerge: improve "apps not found" message
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1772
diff changeset
   179
echo "hgmerge: unable to find any merge utility!"
aae93c3bffb4 hgmerge: improve "apps not found" message
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1772
diff changeset
   180
echo "supported programs:"
1774
ac7b91bcbd8d hgmerge: add meld support
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1773
diff changeset
   181
echo "merge, FileMerge, tkdiff, kdiff3, meld, diff+patch"
1773
aae93c3bffb4 hgmerge: improve "apps not found" message
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1772
diff changeset
   182
echo
1700
e2f91e0acbb8 hgmerge: add cleanup functions
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1699
diff changeset
   183
failure