##// END OF EJS Templates
Cleaned up trap handling:...
Thomas Arendsen Hein -
r831:232d0616 default
parent child Browse files
Show More
@@ -1,67 +1,67 b''
1 #!/bin/sh
1 #!/bin/sh
2 #
2 #
3 # This is an example of using HGEDITOR to automate the signing of
3 # This is an example of using HGEDITOR to automate the signing of
4 # commits and so on.
4 # commits and so on.
5
5
6 # change this to one to turn on GPG support
6 # change this to one to turn on GPG support
7 SIGN=0
7 SIGN=0
8
8
9 # If you want to pass your favourite editor some other parameters
9 # If you want to pass your favourite editor some other parameters
10 # only for Mercurial, modify this:
10 # only for Mercurial, modify this:
11 case "${EDITOR}" in
11 case "${EDITOR}" in
12 "")
12 "")
13 EDITOR="vi"
13 EDITOR="vi"
14 ;;
14 ;;
15 emacs)
15 emacs)
16 EDITOR="$EDITOR -nw"
16 EDITOR="$EDITOR -nw"
17 ;;
17 ;;
18 gvim|vim)
18 gvim|vim)
19 EDITOR="$EDITOR -f -o"
19 EDITOR="$EDITOR -f -o"
20 ;;
20 ;;
21 esac
21 esac
22
22
23
23
24 HGTMP=""
24 HGTMP=""
25 cleanup_exit() {
25 cleanup_exit() {
26 rm -rf "$HGTMP"
26 rm -rf "$HGTMP"
27 exit $1
28 }
27 }
29
28
30 # Remove temporary files even if we get interrupted
29 # Remove temporary files even if we get interrupted
31 trap "cleanup_exit 255" TERM KILL INT QUIT ABRT
30 trap "cleanup_exit" 0 # normal exit
31 trap "exit 255" 1 2 3 6 15 # HUP INT QUIT ABRT TERM
32
32
33 HGTMP="${TMPDIR-/tmp}/hgeditor.$RANDOM.$RANDOM.$RANDOM.$$"
33 HGTMP="${TMPDIR-/tmp}/hgeditor.$RANDOM.$RANDOM.$RANDOM.$$"
34 (umask 077 && mkdir "$HGTMP") || {
34 (umask 077 && mkdir "$HGTMP") || {
35 echo "Could not create temporary directory! Exiting." 1>&2
35 echo "Could not create temporary directory! Exiting." 1>&2
36 exit 1
36 exit 1
37 }
37 }
38
38
39 (
39 (
40 cd "`hg root`"
40 cd "`hg root`"
41 grep '^HG: changed' "$1" | cut -b 13- | while read changed; do
41 grep '^HG: changed' "$1" | cut -b 13- | while read changed; do
42 hg diff "$changed" >> "$HGTMP/diff"
42 hg diff "$changed" >> "$HGTMP/diff"
43 done
43 done
44 )
44 )
45
45
46 echo > "$HGTMP/msg"
46 echo > "$HGTMP/msg"
47 if [ "$SIGN" == "1" ]; then
47 if [ "$SIGN" == "1" ]; then
48 MANIFEST=`grep '^HG: manifest hash' "$1" | cut -b 19-`
48 MANIFEST=`grep '^HG: manifest hash' "$1" | cut -b 19-`
49 echo -e "\nmanifest hash: $MANIFEST" >> "$HGTMP/msg"
49 echo -e "\nmanifest hash: $MANIFEST" >> "$HGTMP/msg"
50 fi
50 fi
51 grep -vE '^(HG: manifest hash .*)?$' "$1" >> "$HGTMP/msg"
51 grep -vE '^(HG: manifest hash .*)?$' "$1" >> "$HGTMP/msg"
52
52
53 CHECKSUM=`md5sum "$HGTMP/msg"`
53 CHECKSUM=`md5sum "$HGTMP/msg"`
54 $EDITOR "$HGTMP/msg" "$HGTMP/diff" || cleanup_exit $?
54 $EDITOR "$HGTMP/msg" "$HGTMP/diff" || exit $?
55 echo "$CHECKSUM" | md5sum -c >/dev/null 2>&1 && cleanup_exit 13
55 echo "$CHECKSUM" | md5sum -c >/dev/null 2>&1 && exit 13
56
56
57 if [ "$SIGN" == "1" ]; then
57 if [ "$SIGN" == "1" ]; then
58 {
58 {
59 head -n 1 "$HGTMP/msg"
59 head -n 1 "$HGTMP/msg"
60 echo
60 echo
61 grep -v "^HG:" "$HGTMP/msg" | gpg -t -a -u "${HGUSER}" --clearsign
61 grep -v "^HG:" "$HGTMP/msg" | gpg -t -a -u "${HGUSER}" --clearsign
62 } > "$HGTMP/msg.gpg" && mv "$HGTMP/msg.gpg" "$1"
62 } > "$HGTMP/msg.gpg" && mv "$HGTMP/msg.gpg" "$1"
63 else
63 else
64 mv "$HGTMP/msg" "$1"
64 mv "$HGTMP/msg" "$1"
65 fi
65 fi
66
66
67 cleanup_exit $?
67 exit $?
@@ -1,85 +1,85 b''
1 #!/bin/sh
1 #!/bin/sh
2 #
2 #
3 # hgmerge - default merge helper for Mercurial
3 # hgmerge - default merge helper for Mercurial
4 #
4 #
5 # This tries to find a way to do three-way merge on the current system.
5 # This tries to find a way to do three-way merge on the current system.
6 # The result ought to end up in $1.
6 # The result ought to end up in $1.
7
7
8 set -e # bail out quickly on failure
8 set -e # bail out quickly on failure
9
9
10 LOCAL="$1"
10 LOCAL="$1"
11 BASE="$2"
11 BASE="$2"
12 OTHER="$3"
12 OTHER="$3"
13
13
14 if [ -z "$EDITOR" ]; then
14 if [ -z "$EDITOR" ]; then
15 EDITOR="vi"
15 EDITOR="vi"
16 fi
16 fi
17
17
18 # Back up our file
18 # Back up our file
19 cp "$LOCAL" "$LOCAL.orig"
19 cp "$LOCAL" "$LOCAL.orig"
20
20
21 # Attempt to do a non-interactive merge
21 # Attempt to do a non-interactive merge
22 if type merge > /dev/null 2>&1; then
22 if type merge > /dev/null 2>&1; then
23 merge "$LOCAL" "$BASE" "$OTHER" 2> /dev/null && exit 0
23 merge "$LOCAL" "$BASE" "$OTHER" 2> /dev/null && exit 0
24 cp "$LOCAL.orig" "$LOCAL"
24 cp "$LOCAL.orig" "$LOCAL"
25 elif type diff3 > /dev/null 2>&1; then
25 elif type diff3 > /dev/null 2>&1; then
26 diff3 -m "$LOCAL.orig" "$BASE" "$OTHER" > "$LOCAL" && exit 0
26 diff3 -m "$LOCAL.orig" "$BASE" "$OTHER" > "$LOCAL" && exit 0
27 cp "$LOCAL.orig" "$LOCAL"
27 cp "$LOCAL.orig" "$LOCAL"
28 fi
28 fi
29
29
30 if [ -n "$DISPLAY" ]; then
30 if [ -n "$DISPLAY" ]; then
31 # try using kdiff3, which is fairly nice
31 # try using kdiff3, which is fairly nice
32 if type kdiff3 > /dev/null 2>&1; then
32 if type kdiff3 > /dev/null 2>&1; then
33 kdiff3 --auto "$BASE" "$LOCAL" "$OTHER" -o "$LOCAL" || exit 1
33 kdiff3 --auto "$BASE" "$LOCAL" "$OTHER" -o "$LOCAL" || exit 1
34 exit 0
34 exit 0
35 fi
35 fi
36
36
37 # try using tkdiff, which is a bit less sophisticated
37 # try using tkdiff, which is a bit less sophisticated
38 if type tkdiff > /dev/null 2>&1; then
38 if type tkdiff > /dev/null 2>&1; then
39 tkdiff "$LOCAL" "$OTHER" -a "$BASE" -o "$LOCAL" || exit 1
39 tkdiff "$LOCAL" "$OTHER" -a "$BASE" -o "$LOCAL" || exit 1
40 exit 0
40 exit 0
41 fi
41 fi
42 fi
42 fi
43
43
44 # Attempt to do a merge with $EDITOR
44 # Attempt to do a merge with $EDITOR
45 if type merge > /dev/null 2>&1; then
45 if type merge > /dev/null 2>&1; then
46 echo "conflicts detected in $LOCAL"
46 echo "conflicts detected in $LOCAL"
47 merge "$LOCAL" "$BASE" "$OTHER" 2>/dev/null || $EDITOR "$LOCAL"
47 merge "$LOCAL" "$BASE" "$OTHER" 2>/dev/null || $EDITOR "$LOCAL"
48 exit 0
48 exit 0
49 fi
49 fi
50
50
51 if type diff3 > /dev/null 2>&1; then
51 if type diff3 > /dev/null 2>&1; then
52 echo "conflicts detected in $LOCAL"
52 echo "conflicts detected in $LOCAL"
53 diff3 -m "$LOCAL.orig" "$BASE" "$OTHER" > "$LOCAL" || $EDITOR "$LOCAL"
53 diff3 -m "$LOCAL.orig" "$BASE" "$OTHER" > "$LOCAL" || $EDITOR "$LOCAL"
54 exit 0
54 exit 0
55 fi
55 fi
56
56
57 HGTMP=""
57 HGTMP=""
58 cleanup_exit() {
58 cleanup_exit() {
59 rm -rf "$HGTMP"
59 rm -rf "$HGTMP"
60 exit $1
61 }
60 }
62
61
63 # attempt to manually merge with diff and patch
62 # attempt to manually merge with diff and patch
64 if type diff > /dev/null 2>&1 && type patch > /dev/null 2>&1; then
63 if type diff > /dev/null 2>&1 && type patch > /dev/null 2>&1; then
65 # Remove temporary files even if we get interrupted
64 # Remove temporary files even if we get interrupted
66 trap "cleanup_exit 1" TERM KILL INT QUIT ABRT
65 trap "cleanup_exit" 0 # normal exit
66 trap "exit 1" 1 2 3 6 15 # HUP INT QUIT ABRT TERM
67
67
68 HGTMP="${TMPDIR-/tmp}/hgmerge.$RANDOM.$RANDOM.$RANDOM.$$"
68 HGTMP="${TMPDIR-/tmp}/hgmerge.$RANDOM.$RANDOM.$RANDOM.$$"
69 (umask 077 && mkdir "$HGTMP") || {
69 (umask 077 && mkdir "$HGTMP") || {
70 echo "Could not create temporary directory! Exiting." 1>&2
70 echo "Could not create temporary directory! Exiting." 1>&2
71 exit 1
71 exit 1
72 }
72 }
73
73
74 diff -u "$BASE" "$OTHER" > "$HGTMP/diff"
74 diff -u "$BASE" "$OTHER" > "$HGTMP/diff"
75 if patch "$LOCAL" < "$HGTMP/diff"; then
75 if patch "$LOCAL" < "$HGTMP/diff"; then
76 cleanup_exit 0
76 exit 0
77 else
77 else
78 # If rejects are empty after using the editor, merge was ok
78 # If rejects are empty after using the editor, merge was ok
79 $EDITOR "$LOCAL" "$LOCAL.rej" && test -s "$LOCAL.rej" || cleanup_exit 0
79 $EDITOR "$LOCAL" "$LOCAL.rej" && test -s "$LOCAL.rej" || exit 0
80 fi
80 fi
81 cleanup_exit 1
81 exit 1
82 fi
82 fi
83
83
84 echo "hgmerge: unable to find merge, tkdiff, kdiff3, or diff+patch!"
84 echo "hgmerge: unable to find merge, tkdiff, kdiff3, or diff+patch!"
85 exit 1
85 exit 1
General Comments 0
You need to be logged in to leave comments. Login now