35 |
35 |
36 type $FILEMERGE >/dev/null 2>&1 || FILEMERGE= |
36 type $FILEMERGE >/dev/null 2>&1 || FILEMERGE= |
37 type $KDIFF3 >/dev/null 2>&1 || KDIFF3= |
37 type $KDIFF3 >/dev/null 2>&1 || KDIFF3= |
38 type $TKDIFF >/dev/null 2>&1 || TKDIFF= |
38 type $TKDIFF >/dev/null 2>&1 || TKDIFF= |
39 |
39 |
|
40 # random part of names |
|
41 RAND="$RANDOM.$RANDOM.$RANDOM.$$" |
|
42 |
40 # temporary directory for diff+patch merge |
43 # temporary directory for diff+patch merge |
41 HGTMP="${TMPDIR-/tmp}/hgmerge.$RANDOM.$RANDOM.$RANDOM.$$" |
44 HGTMP="${TMPDIR-/tmp}/hgmerge.$RAND" |
|
45 |
|
46 # backup file |
|
47 BACKUP="$LOCAL.orig.$RAND" |
|
48 |
|
49 # file used to test for file change |
|
50 CHGTEST="$LOCAL.chg.$RAND" |
42 |
51 |
43 # put all your required cleanup here |
52 # put all your required cleanup here |
44 cleanup() { |
53 cleanup() { |
45 rm -f "$LOCAL.orig" |
54 rm -f "$BACKUP" "$CHGTEST" |
46 rm -rf "$HGTMP" |
55 rm -rf "$HGTMP" |
47 } |
56 } |
48 |
57 |
49 # functions concerning program exit |
58 # functions concerning program exit |
50 success() { |
59 success() { |
52 exit 0 |
61 exit 0 |
53 } |
62 } |
54 |
63 |
55 failure() { |
64 failure() { |
56 echo "merge failed" 1>&2 |
65 echo "merge failed" 1>&2 |
57 cp "$LOCAL.orig" "$LOCAL" |
66 mv "$BACKUP" "$LOCAL" |
58 cleanup |
67 cleanup |
59 exit 1 |
68 exit 1 |
60 } |
69 } |
61 |
70 |
62 # Clean up when interrupted |
71 # Clean up when interrupted |
63 trap "failure" 1 2 3 6 15 # HUP INT QUIT ABRT TERM |
72 trap "failure" 1 2 3 6 15 # HUP INT QUIT ABRT TERM |
64 |
73 |
65 # Back up our file |
74 # Back up our file (and try hard to keep the mtime unchanged) |
66 cp "$LOCAL" "$LOCAL.orig" |
75 mv "$LOCAL" "$BACKUP" |
|
76 cp "$BACKUP" "$LOCAL" |
67 |
77 |
68 # Attempt to do a non-interactive merge |
78 # Attempt to do a non-interactive merge |
69 if [ -n "$MERGE" ]; then |
79 if [ -n "$MERGE" ]; then |
70 $MERGE "$LOCAL" "$BASE" "$OTHER" 2> /dev/null && success |
80 $MERGE "$LOCAL" "$BASE" "$OTHER" 2> /dev/null && success |
71 cp "$LOCAL.orig" "$LOCAL" |
81 cp "$BACKUP" "$LOCAL" |
72 elif [ -n "$DIFF3" ]; then |
82 elif [ -n "$DIFF3" ]; then |
73 echo $DIFF3 -m "$LOCAL.orig" "$BASE" "$OTHER" |
83 echo $DIFF3 -m "$BACKUP" "$BASE" "$OTHER" |
74 $DIFF3 -m "$LOCAL.orig" "$BASE" "$OTHER" > "$LOCAL" && success |
84 $DIFF3 -m "$BACKUP" "$BASE" "$OTHER" > "$LOCAL" && success |
75 if [ $? -eq 2 ]; then |
85 if [ $? -eq 2 ]; then |
76 echo "$DIFF3 failed! Exiting." 1>&2 |
86 echo "$DIFF3 failed! Exiting." 1>&2 |
77 cp "$LOCAL.orig" "$LOCAL" |
87 cp "$BACKUP" "$LOCAL" |
78 failure |
88 failure |
79 fi |
89 fi |
80 cp "$LOCAL.orig" "$LOCAL" |
90 cp "$BACKUP" "$LOCAL" |
81 fi |
91 fi |
82 |
92 |
83 # on MacOS X try FileMerge.app, shipped with Apple's developer tools |
93 # on MacOS X try FileMerge.app, shipped with Apple's developer tools |
84 # TODO: make proper temp files. foo.orig and foo.link are dangerous |
|
85 |
|
86 if [ -n "$FILEMERGE" ]; then |
94 if [ -n "$FILEMERGE" ]; then |
87 cp "$LOCAL.orig" "$LOCAL" |
95 cp "$BACKUP" "$LOCAL" |
88 ln "$LOCAL" "$LOCAL.link" |
96 cp "$BACKUP" "$CHGTEST" |
89 # filemerge prefers the right by default |
97 # filemerge prefers the right by default |
90 if ! "$FILEMERGE" -left "$OTHER" -right "$LOCAL" -ancestor "$BASE" -merge "$LOCAL" |
98 $FILEMERGE -left "$OTHER" -right "$LOCAL" -ancestor "$BASE" -merge "$LOCAL" |
|
99 [ $? -ne 0 ] && echo "FileMerge failed to launch" && failure |
|
100 if test "$LOCAL" -nt "$CHGTEST" |
91 then |
101 then |
92 echo "FileMerge failed to launch" |
|
93 failure |
|
94 fi |
|
95 if ! test "$LOCAL" -ef "$LOCAL.link" |
|
96 then |
|
97 rm "$LOCAL.orig" "$LOCAL.link" |
|
98 success |
102 success |
99 else |
103 else |
100 rm "$LOCAL.link" |
104 echo "$LOCAL seems unchanged. Was the merge successful?" |
101 echo "$LOCAL is unchanged. Was the merge successful?" |
|
102 select answer in yes no |
105 select answer in yes no |
103 do |
106 do |
104 if test "$answer" == "yes" |
107 test "$answer" == "yes" && success || failure |
105 then |
|
106 rm "$LOCAL.orig" |
|
107 success |
|
108 else |
|
109 failure |
|
110 fi |
|
111 done |
108 done |
112 failure |
|
113 fi |
109 fi |
|
110 failure |
114 fi |
111 fi |
115 |
112 |
116 if [ -n "$DISPLAY" ]; then |
113 if [ -n "$DISPLAY" ]; then |
117 # try using kdiff3, which is fairly nice |
114 # try using kdiff3, which is fairly nice |
118 if [ -n "$KDIFF3" ]; then |
115 if [ -n "$KDIFF3" ]; then |