rust-changelog: introducing an intermediate `ChangelogEntry`
Before this change, client code needing to extract, e.g, the Node ID and the
description from a changeset had no other choice than calling both
`entry_for_rev()` and `data_for_rev()`. This duplicates some (limited) computation, and
more importantly imposes bad hygiene for client code: at some point of developement,
the client code would have to pass over both entry and data in its internal layers,
which at some point of development would raise the question whether they are consistent.
We introduce the intermediate `ChangelogEntry` from which both conversion to the generic
`RevlogEntry` and extraction of `ChangelogRevisionData` are possible.
It might grow some convenience methods in the future.
We keep the `data_for_rev()` method of `Changelog` for compatibility, pointing users at the more
powerful alternative.
#!/bin/rc
# 9diff - Mercurial extdiff wrapper for diff(1)
rfork e
fn getfiles {
cd $1 &&
for(f in `{du -as | awk '{print $2}'})
test -f $f && echo `{cleanname $f}
}
fn usage {
echo >[1=2] usage: 9diff [diff options] parent child root
exit usage
}
opts=()
while(~ $1 -*){
opts=($opts $1)
shift
}
if(! ~ $#* 3)
usage
# extdiff will set the parent and child to a single file if there is
# only one change. If there are multiple changes, directories will be
# set. diff(1) does not cope particularly with directories; instead we
# do the recursion ourselves and diff each file individually.
if(test -f $1)
diff $opts $1 $2
if not{
# extdiff will create a snapshot of the working copy to prevent
# conflicts during the diff. We circumvent this behavior by
# diffing against the repository root to produce plumbable
# output. This is antisocial.
for(f in `{sort -u <{getfiles $1} <{getfiles $2}}){
file1=$1/$f; test -f $file1 || file1=/dev/null
file2=$3/$f; test -f $file2 || file2=/dev/null
diff $opts $file1 $file2
}
}
exit ''