hgmerge
author Thomas Arendsen Hein <thomas@intevation.de>
Sat, 02 Feb 2008 21:01:43 +0100
changeset 6000 8e7d64989bb8
parent 5660 3c80ecdc1bcd
permissions -rwxr-xr-x
test-serve: wait before killing to always hide the "killed!" message. Without the sleeps slower systems never display never display "killed!" while faster systems sometimes or nearly always display it.
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
5660
3c80ecdc1bcd Use VISUAL in addition to EDITOR when choosing the editor to use.
Osku Salerma <osku@iki.fi>
parents: 5172
diff changeset
    20
if [ -n "$VISUAL" ]; then
3c80ecdc1bcd Use VISUAL in addition to EDITOR when choosing the editor to use.
Osku Salerma <osku@iki.fi>
parents: 5172
diff changeset
    21
    EDIT_PROG="$VISUAL"
3c80ecdc1bcd Use VISUAL in addition to EDITOR when choosing the editor to use.
Osku Salerma <osku@iki.fi>
parents: 5172
diff changeset
    22
elif [ -n "$EDITOR" ]; then
3c80ecdc1bcd Use VISUAL in addition to EDITOR when choosing the editor to use.
Osku Salerma <osku@iki.fi>
parents: 5172
diff changeset
    23
    EDIT_PROG="$EDITOR"
3c80ecdc1bcd Use VISUAL in addition to EDITOR when choosing the editor to use.
Osku Salerma <osku@iki.fi>
parents: 5172
diff changeset
    24
else
3c80ecdc1bcd Use VISUAL in addition to EDITOR when choosing the editor to use.
Osku Salerma <osku@iki.fi>
parents: 5172
diff changeset
    25
    EDIT_PROG="vi"
795
cd0ad12d9e42 Remove usage of ${par:-word}, which and mktemp. Quote filenames.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 547
diff changeset
    26
fi
304
38fb7d23b78d Use vi if $EDITOR is unset.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 303
diff changeset
    27
1434
696851b1bba9 Fix use of diff(1) triggered by set -e.
levon@movementarian.org
parents: 839
diff changeset
    28
# 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
    29
# need to
1770
4eea6a747c27 hgmerge: fix diff+patch detection; cleanups
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1701
diff changeset
    30
MERGE="merge"
4eea6a747c27 hgmerge: fix diff+patch detection; cleanups
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1701
diff changeset
    31
DIFF3="gdiff3"
4eea6a747c27 hgmerge: fix diff+patch detection; cleanups
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1701
diff changeset
    32
DIFF="gdiff"
4eea6a747c27 hgmerge: fix diff+patch detection; cleanups
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1701
diff changeset
    33
PATCH="gpatch"
1434
696851b1bba9 Fix use of diff(1) triggered by set -e.
levon@movementarian.org
parents: 839
diff changeset
    34
1770
4eea6a747c27 hgmerge: fix diff+patch detection; cleanups
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1701
diff changeset
    35
type "$MERGE" >/dev/null 2>&1 || MERGE=
4eea6a747c27 hgmerge: fix diff+patch detection; cleanups
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1701
diff changeset
    36
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
    37
$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
    38
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
    39
type "$DIFF"  >/dev/null 2>&1 || DIFF=
4eea6a747c27 hgmerge: fix diff+patch detection; cleanups
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1701
diff changeset
    40
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
    41
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
    42
1699
83e8cd97b9f9 hgmerge: add and use more tool variables
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1664
diff changeset
    43
# find optional visual utilities
1770
4eea6a747c27 hgmerge: fix diff+patch detection; cleanups
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1701
diff changeset
    44
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
    45
KDIFF3="kdiff3"
4eea6a747c27 hgmerge: fix diff+patch detection; cleanups
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1701
diff changeset
    46
TKDIFF="tkdiff"
1774
ac7b91bcbd8d hgmerge: add meld support
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1773
diff changeset
    47
MELD="meld"
1699
83e8cd97b9f9 hgmerge: add and use more tool variables
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1664
diff changeset
    48
1770
4eea6a747c27 hgmerge: fix diff+patch detection; cleanups
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1701
diff changeset
    49
type "$FILEMERGE" >/dev/null 2>&1 || FILEMERGE=
4eea6a747c27 hgmerge: fix diff+patch detection; cleanups
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1701
diff changeset
    50
type "$KDIFF3"    >/dev/null 2>&1 || KDIFF3=
4eea6a747c27 hgmerge: fix diff+patch detection; cleanups
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1701
diff changeset
    51
type "$TKDIFF"    >/dev/null 2>&1 || TKDIFF=
1774
ac7b91bcbd8d hgmerge: add meld support
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1773
diff changeset
    52
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
    53
2051
6a03cff2b0f5 Try to use /usr/bin/test or /bin/test to work around missing features.
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1885
diff changeset
    54
# Hack for Solaris
6a03cff2b0f5 Try to use /usr/bin/test or /bin/test to work around missing features.
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1885
diff changeset
    55
TEST="/usr/bin/test"
6a03cff2b0f5 Try to use /usr/bin/test or /bin/test to work around missing features.
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1885
diff changeset
    56
type "$TEST" >/dev/null 2>&1 || TEST="/bin/test"
6a03cff2b0f5 Try to use /usr/bin/test or /bin/test to work around missing features.
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1885
diff changeset
    57
type "$TEST" >/dev/null 2>&1 || TEST="test"
6a03cff2b0f5 Try to use /usr/bin/test or /bin/test to work around missing features.
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1885
diff changeset
    58
1701
4ba8fe499df2 hgmerge: various cleanups
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1700
diff changeset
    59
# random part of names
1770
4eea6a747c27 hgmerge: fix diff+patch detection; cleanups
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1701
diff changeset
    60
RAND="$RANDOM$RANDOM"
1701
4ba8fe499df2 hgmerge: various cleanups
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1700
diff changeset
    61
1700
e2f91e0acbb8 hgmerge: add cleanup functions
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1699
diff changeset
    62
# 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
    63
HGTMP="${TMPDIR-/tmp}/hgmerge.$RAND"
1701
4ba8fe499df2 hgmerge: various cleanups
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1700
diff changeset
    64
4ba8fe499df2 hgmerge: various cleanups
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1700
diff changeset
    65
# backup file
4ba8fe499df2 hgmerge: various cleanups
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1700
diff changeset
    66
BACKUP="$LOCAL.orig.$RAND"
4ba8fe499df2 hgmerge: various cleanups
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1700
diff changeset
    67
4ba8fe499df2 hgmerge: various cleanups
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1700
diff changeset
    68
# file used to test for file change
4ba8fe499df2 hgmerge: various cleanups
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1700
diff changeset
    69
CHGTEST="$LOCAL.chg.$RAND"
1700
e2f91e0acbb8 hgmerge: add cleanup functions
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1699
diff changeset
    70
e2f91e0acbb8 hgmerge: add cleanup functions
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1699
diff changeset
    71
# put all your required cleanup here
e2f91e0acbb8 hgmerge: add cleanup functions
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1699
diff changeset
    72
cleanup() {
1701
4ba8fe499df2 hgmerge: various cleanups
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1700
diff changeset
    73
    rm -f "$BACKUP" "$CHGTEST"
1700
e2f91e0acbb8 hgmerge: add cleanup functions
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1699
diff changeset
    74
    rm -rf "$HGTMP"
e2f91e0acbb8 hgmerge: add cleanup functions
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1699
diff changeset
    75
}
e2f91e0acbb8 hgmerge: add cleanup functions
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1699
diff changeset
    76
e2f91e0acbb8 hgmerge: add cleanup functions
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1699
diff changeset
    77
# functions concerning program exit
e2f91e0acbb8 hgmerge: add cleanup functions
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1699
diff changeset
    78
success() {
e2f91e0acbb8 hgmerge: add cleanup functions
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1699
diff changeset
    79
    cleanup
e2f91e0acbb8 hgmerge: add cleanup functions
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1699
diff changeset
    80
    exit 0
e2f91e0acbb8 hgmerge: add cleanup functions
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1699
diff changeset
    81
}
e2f91e0acbb8 hgmerge: add cleanup functions
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1699
diff changeset
    82
e2f91e0acbb8 hgmerge: add cleanup functions
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1699
diff changeset
    83
failure() {
e2f91e0acbb8 hgmerge: add cleanup functions
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1699
diff changeset
    84
    echo "merge failed" 1>&2
1701
4ba8fe499df2 hgmerge: various cleanups
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1700
diff changeset
    85
    mv "$BACKUP" "$LOCAL"
1700
e2f91e0acbb8 hgmerge: add cleanup functions
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1699
diff changeset
    86
    cleanup
e2f91e0acbb8 hgmerge: add cleanup functions
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1699
diff changeset
    87
    exit 1
e2f91e0acbb8 hgmerge: add cleanup functions
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1699
diff changeset
    88
}
e2f91e0acbb8 hgmerge: add cleanup functions
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1699
diff changeset
    89
1771
e22bbca2e82b hgmerge: add and use ask_if_merged function
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1770
diff changeset
    90
# 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
    91
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
    92
    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
    93
        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
    94
        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
    95
        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
    96
        case "$answer" in
1771
e22bbca2e82b hgmerge: add and use ask_if_merged function
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1770
diff changeset
    97
            y*|Y*) success;;
e22bbca2e82b hgmerge: add and use ask_if_merged function
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1770
diff changeset
    98
            n*|N*) failure;;
e22bbca2e82b hgmerge: add and use ask_if_merged function
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1770
diff changeset
    99
        esac
e22bbca2e82b hgmerge: add and use ask_if_merged function
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1770
diff changeset
   100
    done
e22bbca2e82b hgmerge: add and use ask_if_merged function
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1770
diff changeset
   101
}
e22bbca2e82b hgmerge: add and use ask_if_merged function
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1770
diff changeset
   102
4855
e4480f2b61e9 Check for conflict markers in hgmerge (issue471)
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2051
diff changeset
   103
# Check if conflict markers are present and ask if the merge was successful
e4480f2b61e9 Check for conflict markers in hgmerge (issue471)
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2051
diff changeset
   104
conflicts_or_success() {
e4480f2b61e9 Check for conflict markers in hgmerge (issue471)
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2051
diff changeset
   105
    while egrep '^(<<<<<<< .*|=======|>>>>>>> .*)$' "$LOCAL" >/dev/null; do
e4480f2b61e9 Check for conflict markers in hgmerge (issue471)
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2051
diff changeset
   106
        echo "$LOCAL contains conflict markers."
e4480f2b61e9 Check for conflict markers in hgmerge (issue471)
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2051
diff changeset
   107
        echo "Keep this version? [y/n]"
e4480f2b61e9 Check for conflict markers in hgmerge (issue471)
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2051
diff changeset
   108
        read answer
e4480f2b61e9 Check for conflict markers in hgmerge (issue471)
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2051
diff changeset
   109
        case "$answer" in
e4480f2b61e9 Check for conflict markers in hgmerge (issue471)
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2051
diff changeset
   110
            y*|Y*) success;;
e4480f2b61e9 Check for conflict markers in hgmerge (issue471)
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2051
diff changeset
   111
            n*|N*) failure;;
e4480f2b61e9 Check for conflict markers in hgmerge (issue471)
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2051
diff changeset
   112
        esac
e4480f2b61e9 Check for conflict markers in hgmerge (issue471)
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2051
diff changeset
   113
    done
e4480f2b61e9 Check for conflict markers in hgmerge (issue471)
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2051
diff changeset
   114
    success
e4480f2b61e9 Check for conflict markers in hgmerge (issue471)
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2051
diff changeset
   115
}
e4480f2b61e9 Check for conflict markers in hgmerge (issue471)
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2051
diff changeset
   116
1700
e2f91e0acbb8 hgmerge: add cleanup functions
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1699
diff changeset
   117
# Clean up when interrupted
e2f91e0acbb8 hgmerge: add cleanup functions
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1699
diff changeset
   118
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
   119
1701
4ba8fe499df2 hgmerge: various cleanups
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1700
diff changeset
   120
# 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
   121
mv "$LOCAL" "$BACKUP"
4ba8fe499df2 hgmerge: various cleanups
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1700
diff changeset
   122
cp "$BACKUP" "$LOCAL"
240
737c66b68290 Replace tkmerge with hgmerge
mpm@selenic.com
parents:
diff changeset
   123
737c66b68290 Replace tkmerge with hgmerge
mpm@selenic.com
parents:
diff changeset
   124
# 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
   125
if [ -n "$MERGE" -o -n "$DIFF3" ]; then
4eea6a747c27 hgmerge: fix diff+patch detection; cleanups
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1701
diff changeset
   126
    if [ -n "$MERGE" ]; then
4eea6a747c27 hgmerge: fix diff+patch detection; cleanups
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1701
diff changeset
   127
        $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
   128
    elif [ -n "$DIFF3" ]; then
4eea6a747c27 hgmerge: fix diff+patch detection; cleanups
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1701
diff changeset
   129
        $DIFF3 -m "$BACKUP" "$BASE" "$OTHER" > "$LOCAL" && success
4eea6a747c27 hgmerge: fix diff+patch detection; cleanups
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1701
diff changeset
   130
    fi
4eea6a747c27 hgmerge: fix diff+patch detection; cleanups
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1701
diff changeset
   131
    if [ $? -gt 1 ]; then
4eea6a747c27 hgmerge: fix diff+patch detection; cleanups
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1701
diff changeset
   132
        echo "automatic merge failed! Exiting." 1>&2
1700
e2f91e0acbb8 hgmerge: add cleanup functions
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1699
diff changeset
   133
        failure
1434
696851b1bba9 Fix use of diff(1) triggered by set -e.
levon@movementarian.org
parents: 839
diff changeset
   134
    fi
240
737c66b68290 Replace tkmerge with hgmerge
mpm@selenic.com
parents:
diff changeset
   135
fi
737c66b68290 Replace tkmerge with hgmerge
mpm@selenic.com
parents:
diff changeset
   136
1664
4338e33c973b Safer version of FileMerge merge
Brendan Cully <brendan@kublai.com>
parents: 1647
diff changeset
   137
# 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
   138
if [ -n "$FILEMERGE" ]; then
1701
4ba8fe499df2 hgmerge: various cleanups
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1700
diff changeset
   139
    cp "$BACKUP" "$LOCAL"
4ba8fe499df2 hgmerge: various cleanups
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1700
diff changeset
   140
    cp "$BACKUP" "$CHGTEST"
1664
4338e33c973b Safer version of FileMerge merge
Brendan Cully <brendan@kublai.com>
parents: 1647
diff changeset
   141
    # filemerge prefers the right by default
1701
4ba8fe499df2 hgmerge: various cleanups
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1700
diff changeset
   142
    $FILEMERGE -left "$OTHER" -right "$LOCAL" -ancestor "$BASE" -merge "$LOCAL"
4ba8fe499df2 hgmerge: various cleanups
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1700
diff changeset
   143
    [ $? -ne 0 ] && echo "FileMerge failed to launch" && failure
4855
e4480f2b61e9 Check for conflict markers in hgmerge (issue471)
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2051
diff changeset
   144
    $TEST "$LOCAL" -nt "$CHGTEST" && conflicts_or_success || ask_if_merged
1647
64a1169c927d Use of opendiff as merge program on MacOS X
Christian Ebert <blacktrash@gmx.net>
parents: 1434
diff changeset
   145
fi
64a1169c927d Use of opendiff as merge program on MacOS X
Christian Ebert <blacktrash@gmx.net>
parents: 1434
diff changeset
   146
303
15a9e55e7ea5 Check if $DISPLAY is set before using tkdiff or kdiff3.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 280
diff changeset
   147
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
   148
    # 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
   149
    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
   150
        $KDIFF3 --auto "$BASE" "$BACKUP" "$OTHER" -o "$LOCAL" || failure
4855
e4480f2b61e9 Check for conflict markers in hgmerge (issue471)
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2051
diff changeset
   151
        conflicts_or_success
240
737c66b68290 Replace tkmerge with hgmerge
mpm@selenic.com
parents:
diff changeset
   152
    fi
737c66b68290 Replace tkmerge with hgmerge
mpm@selenic.com
parents:
diff changeset
   153
303
15a9e55e7ea5 Check if $DISPLAY is set before using tkdiff or kdiff3.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 280
diff changeset
   154
    # 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
   155
    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
   156
        $TKDIFF "$BACKUP" "$OTHER" -a "$BASE" -o "$LOCAL" || failure
4855
e4480f2b61e9 Check for conflict markers in hgmerge (issue471)
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2051
diff changeset
   157
        conflicts_or_success
240
737c66b68290 Replace tkmerge with hgmerge
mpm@selenic.com
parents:
diff changeset
   158
    fi
1774
ac7b91bcbd8d hgmerge: add meld support
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1773
diff changeset
   159
ac7b91bcbd8d hgmerge: add meld support
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1773
diff changeset
   160
    if [ -n "$MELD" ]; then
ac7b91bcbd8d hgmerge: add meld support
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1773
diff changeset
   161
        cp "$BACKUP" "$CHGTEST"
ac7b91bcbd8d hgmerge: add meld support
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1773
diff changeset
   162
        # 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
   163
        cp "$BACKUP" "$LOCAL.tmp.$RAND"
ac7b91bcbd8d hgmerge: add meld support
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1773
diff changeset
   164
        # 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
   165
        # use the file with conflicts
ac7b91bcbd8d hgmerge: add meld support
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1773
diff changeset
   166
        $MELD "$LOCAL.tmp.$RAND" "$LOCAL" "$OTHER" || failure
ac7b91bcbd8d hgmerge: add meld support
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1773
diff changeset
   167
        # Also it doesn't return good error code
4855
e4480f2b61e9 Check for conflict markers in hgmerge (issue471)
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2051
diff changeset
   168
        $TEST "$LOCAL" -nt "$CHGTEST" && conflicts_or_success || ask_if_merged
1774
ac7b91bcbd8d hgmerge: add meld support
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1773
diff changeset
   169
    fi
240
737c66b68290 Replace tkmerge with hgmerge
mpm@selenic.com
parents:
diff changeset
   170
fi
737c66b68290 Replace tkmerge with hgmerge
mpm@selenic.com
parents:
diff changeset
   171
5660
3c80ecdc1bcd Use VISUAL in addition to EDITOR when choosing the editor to use.
Osku Salerma <osku@iki.fi>
parents: 5172
diff changeset
   172
# Attempt to do a merge with $EDIT_PROG
1772
b1a7fd503a29 hgmerge: logic changes
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1771
diff changeset
   173
if [ -n "$MERGE" -o -n "$DIFF3" ]; then
242
a2edb4481f19 hgmerge: use diff3 if available
mpm@selenic.com
parents: 240
diff changeset
   174
    echo "conflicts detected in $LOCAL"
1772
b1a7fd503a29 hgmerge: logic changes
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1771
diff changeset
   175
    cp "$BACKUP" "$CHGTEST"
5660
3c80ecdc1bcd Use VISUAL in addition to EDITOR when choosing the editor to use.
Osku Salerma <osku@iki.fi>
parents: 5172
diff changeset
   176
    case "$EDIT_PROG" in
5172
f53d97d651f4 Use smerge minor mode in emacs to resolve conflicts.
Sascha Wilde <wilde@sha-bang.de>
parents: 4855
diff changeset
   177
        "emacs")
5660
3c80ecdc1bcd Use VISUAL in addition to EDITOR when choosing the editor to use.
Osku Salerma <osku@iki.fi>
parents: 5172
diff changeset
   178
            $EDIT_PROG "$LOCAL" --eval '(condition-case nil (smerge-mode 1) (error nil))' || failure
5172
f53d97d651f4 Use smerge minor mode in emacs to resolve conflicts.
Sascha Wilde <wilde@sha-bang.de>
parents: 4855
diff changeset
   179
            ;;
f53d97d651f4 Use smerge minor mode in emacs to resolve conflicts.
Sascha Wilde <wilde@sha-bang.de>
parents: 4855
diff changeset
   180
        *)
5660
3c80ecdc1bcd Use VISUAL in addition to EDITOR when choosing the editor to use.
Osku Salerma <osku@iki.fi>
parents: 5172
diff changeset
   181
            $EDIT_PROG "$LOCAL" || failure
5172
f53d97d651f4 Use smerge minor mode in emacs to resolve conflicts.
Sascha Wilde <wilde@sha-bang.de>
parents: 4855
diff changeset
   182
            ;;
f53d97d651f4 Use smerge minor mode in emacs to resolve conflicts.
Sascha Wilde <wilde@sha-bang.de>
parents: 4855
diff changeset
   183
    esac
1772
b1a7fd503a29 hgmerge: logic changes
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1771
diff changeset
   184
    # Some editors do not return meaningful error codes
b1a7fd503a29 hgmerge: logic changes
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1771
diff changeset
   185
    # Do not take any chances
4855
e4480f2b61e9 Check for conflict markers in hgmerge (issue471)
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2051
diff changeset
   186
    $TEST "$LOCAL" -nt "$CHGTEST" && conflicts_or_success || ask_if_merged
240
737c66b68290 Replace tkmerge with hgmerge
mpm@selenic.com
parents:
diff changeset
   187
fi
737c66b68290 Replace tkmerge with hgmerge
mpm@selenic.com
parents:
diff changeset
   188
737c66b68290 Replace tkmerge with hgmerge
mpm@selenic.com
parents:
diff changeset
   189
# 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
   190
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
   191
829
764b0350acb8 Shortened hgmerge a little bit.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 828
diff changeset
   192
    (umask 077 && mkdir "$HGTMP") || {
1770
4eea6a747c27 hgmerge: fix diff+patch detection; cleanups
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1701
diff changeset
   193
        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
   194
        failure
829
764b0350acb8 Shortened hgmerge a little bit.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 828
diff changeset
   195
    }
795
cd0ad12d9e42 Remove usage of ${par:-word}, which and mktemp. Quote filenames.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 547
diff changeset
   196
1434
696851b1bba9 Fix use of diff(1) triggered by set -e.
levon@movementarian.org
parents: 839
diff changeset
   197
    $DIFF -u "$BASE" "$OTHER" > "$HGTMP/diff" || :
696851b1bba9 Fix use of diff(1) triggered by set -e.
levon@movementarian.org
parents: 839
diff changeset
   198
    if $PATCH "$LOCAL" < "$HGTMP/diff"; then
1770
4eea6a747c27 hgmerge: fix diff+patch detection; cleanups
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1701
diff changeset
   199
        success
829
764b0350acb8 Shortened hgmerge a little bit.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 828
diff changeset
   200
    else
1770
4eea6a747c27 hgmerge: fix diff+patch detection; cleanups
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1701
diff changeset
   201
        # If rejects are empty after using the editor, merge was ok
5660
3c80ecdc1bcd Use VISUAL in addition to EDITOR when choosing the editor to use.
Osku Salerma <osku@iki.fi>
parents: 5172
diff changeset
   202
        $EDIT_PROG "$LOCAL" "$LOCAL.rej" || failure
2051
6a03cff2b0f5 Try to use /usr/bin/test or /bin/test to work around missing features.
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1885
diff changeset
   203
        $TEST -s "$LOCAL.rej" || success
240
737c66b68290 Replace tkmerge with hgmerge
mpm@selenic.com
parents:
diff changeset
   204
    fi
1700
e2f91e0acbb8 hgmerge: add cleanup functions
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1699
diff changeset
   205
    failure
240
737c66b68290 Replace tkmerge with hgmerge
mpm@selenic.com
parents:
diff changeset
   206
fi
737c66b68290 Replace tkmerge with hgmerge
mpm@selenic.com
parents:
diff changeset
   207
1773
aae93c3bffb4 hgmerge: improve "apps not found" message
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1772
diff changeset
   208
echo
aae93c3bffb4 hgmerge: improve "apps not found" message
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1772
diff changeset
   209
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
   210
echo "supported programs:"
1774
ac7b91bcbd8d hgmerge: add meld support
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1773
diff changeset
   211
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
   212
echo
1700
e2f91e0acbb8 hgmerge: add cleanup functions
Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 1699
diff changeset
   213
failure