graphmod: allow edges to end early
Rather than draw an edge all the way to the bottom of the graph, make it
possible to end an edge to parents that are not part of the graph early on.
This results in a far cleaner graph.
Any edge type can be set to end early; set the ui.graphstyle.<edgetype>
parameter to the empty string to enable this.
For example, setting the following configuration:
[ui]
graphstyle.grandparent = :
graphstyle.missing =
would result in a graph like this:
o changeset: 32:
d06dffa21a31
|\ parent: 27:
886ed638191b
| : parent: 31:
621d83e11f67
| :
o : changeset: 31:
621d83e11f67
|\: parent: 21:
d42a756af44d
| : parent: 30:
6e11cd4b648f
| :
o : changeset: 30:
6e11cd4b648f
|\ \ parent: 28:
44ecd0b9ae99
| ~ : parent: 29:
cd9bb2be7593
| /
o : changeset: 28:
44ecd0b9ae99
|\ \ parent: 1:
6db2ef61d156
| ~ : parent: 26:
7f25b6c2f0b9
| /
o : changeset: 26:
7f25b6c2f0b9
|\ \ parent: 18:
1aa84d96232a
| | : parent: 25:
91da8ed57247
| | :
| o : changeset: 25:
91da8ed57247
| |\: parent: 21:
d42a756af44d
| | : parent: 24:
a9c19a3d96b7
| | :
| o : changeset: 24:
a9c19a3d96b7
| |\ \ parent: 0:
e6eb3150255d
| | ~ : parent: 23:
a01cddf0766d
| | /
| o : changeset: 23:
a01cddf0766d
| |\ \ parent: 1:
6db2ef61d156
| | ~ : parent: 22:
e0d9cccacb5d
| | /
| o : changeset: 22:
e0d9cccacb5d
|/:/ parent: 18:
1aa84d96232a
| : parent: 21:
d42a756af44d
| :
| o changeset: 21:
d42a756af44d
| |\ parent: 19:
31ddc2c1573b
| | | parent: 20:
d30ed6450e32
| | |
+---o changeset: 20:
d30ed6450e32
| | | parent: 0:
e6eb3150255d
| | ~ parent: 18:
1aa84d96232a
| |
| o changeset: 19:
31ddc2c1573b
| |\ parent: 15:
1dda3f72782d
| ~ ~ parent: 17:
44765d7c06e0
|
o changeset: 18:
1aa84d96232a
parent: 1:
6db2ef61d156
parent: 15:
1dda3f72782d
The default configuration leaves all 3 types set to |.
This is part of the work towards moving smartlog upstream; currently smartlog
injects extra nodes into the graph to indicate grandparent relationships (nodes
elided).
#!/bin/sh
#
# This is an example of using HGEDITOR to create of diff to review the
# changes while committing.
# If you want to pass your favourite editor some other parameters
# only for Mercurial, modify this:
case "${EDITOR}" in
"")
EDITOR="vi"
;;
emacs)
EDITOR="$EDITOR -nw"
;;
gvim|vim)
EDITOR="$EDITOR -f -o"
;;
esac
HGTMP=""
cleanup_exit() {
rm -rf "$HGTMP"
}
# Remove temporary files even if we get interrupted
trap "cleanup_exit" 0 # normal exit
trap "exit 255" HUP INT QUIT ABRT TERM
HGTMP=$(mktemp -d ${TMPDIR-/tmp}/hgeditor.XXXXXX)
[ x$HGTMP != x -a -d $HGTMP ] || {
echo "Could not create temporary directory! Exiting." 1>&2
exit 1
}
(
grep '^HG: changed' "$1" | cut -b 13- | while read changed; do
"$HG" diff "$changed" >> "$HGTMP/diff"
done
)
cat "$1" > "$HGTMP/msg"
MD5=$(which md5sum 2>/dev/null) || \
MD5=$(which md5 2>/dev/null)
[ -x "${MD5}" ] && CHECKSUM=`${MD5} "$HGTMP/msg"`
if [ -s "$HGTMP/diff" ]; then
$EDITOR "$HGTMP/msg" "$HGTMP/diff" || exit $?
else
$EDITOR "$HGTMP/msg" || exit $?
fi
[ -x "${MD5}" ] && (echo "$CHECKSUM" | ${MD5} -c >/dev/null 2>&1 && exit 13)
mv "$HGTMP/msg" "$1"
exit $?