view hgmerge @ 373:67081329d49a

Change the size of the short hash representation -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Change the size of the short hash representation First note that this number doesn't really matter, as we always check for ambiguous short hash ids. Here's the math on collision probability: >>> import math >>> def p(f, n): return 1 - (1 / math.exp(n**2/(2*f))) ... >>> p(2**32, 30000.0) 0.09947179164613551 # with 30000 changesets (BKCVS), we have a 9% chance >>> p(2**32, 65000.0) 0.38850881217977273 # and with a full import from BK, we'd have a 39% chance >>> p(2**40, 1e6) 0.36539171908447321 # we'd like to be "safe" for 1M csets, so 40 isn't enough >>> p(2**48, 1e6) 0.001774780051374103 # But 48 looks good >>> p(2**48, 1e7) 0.16275260939624481 >>> p(2**48, 5e6) 0.043437281083569146 >>> p(2**48, 2e6) 0.0070802434913129764 >>> p(2**48, 3e6) 0.01586009440574343 manifest hash: 24d9f928a463f46708b0e11fb781d5a241851424 -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.0 (GNU/Linux) iD8DBQFCsQoMywK+sNU5EO8RAoBBAJwII9GV6dT9QUOYAk3gZGw9z0JvjACfSI4q IFnTu1F7P5OuLelO1GsM8Bs= =CNWk -----END PGP SIGNATURE-----
author mpm@selenic.com
date Wed, 15 Jun 2005 21:11:40 -0800
parents f06a4a3b86a7
children 3d4d5f2aba9a 4fc63e22b1fe
line wrap: on
line source

#!/bin/bash
#
# hgmerge - default merge helper for Mercurial
#
# This tries to find a way to do three-way merge on the current system.
# The result ought to end up in $1.

set -e # bail out quickly on failure

LOCAL=$1
BASE=$2
OTHER=$3

EDITOR="${EDITOR:-vi}"

# Back up our file
cp $LOCAL $LOCAL.orig

# Attempt to do a non-interactive merge
if which merge > /dev/null ; then
    if merge $LOCAL $BASE $OTHER 2> /dev/null; then
	# success!
	exit 0
    fi
    cp $LOCAL.orig $LOCAL
elif which diff3 > /dev/null ; then
    if diff3 -m $LOCAL.orig $BASE $OTHER > $LOCAL ; then
	# success
	exit 0
    fi
    cp $LOCAL.orig $LOCAL
fi

if [ -n "$DISPLAY" ]; then
    # try using kdiff3, which is fairly nice
    if which kdiff3 > /dev/null ; then
	if kdiff3 --auto $BASE $LOCAL $OTHER -o $LOCAL ; then
	    exit 0
	else
	    exit 1
	fi
    fi

    # try using tkdiff, which is a bit less sophisticated
    if which tkdiff > /dev/null ; then
	if tkdiff $LOCAL $OTHER -a $BASE -o $LOCAL ; then
	    exit 0
	else
	    exit 1
	fi
    fi
fi

# Attempt to do a merge with $EDITOR
if which merge > /dev/null ; then
    echo "conflicts detected in $LOCAL"
    merge $LOCAL $BASE $OTHER 2>/dev/null || $EDITOR $LOCAL
    exit 0
fi

if which diff3 > /dev/null ; then
    echo "conflicts detected in $LOCAL"
    diff3 -m $LOCAL.orig $BASE $OTHER > $LOCAL || $EDITOR $LOCAL
    exit 0
fi

# attempt to manually merge with diff and patch
if which diff > /dev/null ; then
    if which patch > /dev/null ; then
	T=`mktemp`
	diff -u $BASE $OTHER > $T
	if patch $LOCAL < $T ; then
	    exit 0
	else
	    $EDITOR $LOCAL $LOCAL.rej
	fi
	rm $T
	exit 1
    fi
fi

echo "hgmerge: unable to find merge, tkdiff, kdiff3, or diff+patch!"
exit 1