Avoid extra filelogs entries.
Right now, there are some situations in which localrepo.filecommit can
create filelog entries even though they're not needed. For example:
- permissions for a file have changed;
- qrefresh can create a filelog entry identical to its parent (see the
added test);
- convert-repo creates extra filelog entries in every merge where the
first parent has added files (for example, changeset
ebebe9577a1a of
the kernel repo added extra filelog entries to files in the
arch/blackfin directory, even though the merge should only touch the
drivers/ata directory). This makes "hg log file" in a converted repo
less useful than it could be, since it may mention many merges that
don't actually touch that specific file.
They all come from the same basic problem: localrepo.commit (through
filecommit) creates new filelog entries for all files passed to it
(except for some cases during a merge).
Patch and test case provided by Benoit.
This should fix
issue351.
#!/bin/sh
echo "[extensions]" >> $HGRCPATH
echo "mq=" >> $HGRCPATH
hg init
hg qinit
echo x > x
hg ci -Ama
hg qnew a.patch
echo a > a
hg add a
hg qrefresh
hg qnew b.patch
echo b > b
hg add b
hg qrefresh
hg qnew c.patch
echo c > c
hg add c
hg qrefresh
hg qpop -a
echo % should fail
hg qguard does-not-exist.patch +bleh
echo % should fail
hg qguard +fail
hg qpush
echo % should guard a.patch
hg qguard +a
echo % should print +a
hg qguard
hg qpop
hg qguard a.patch
echo % should push b.patch
hg qpush
hg qpop
hg qselect a
echo % should push a.patch
hg qpush
hg qguard c.patch -a
echo % should print -a
hg qguard c.patch
echo % should skip c.patch
hg qpush -a
echo % should display b.patch
hg qtop
hg qguard -n c.patch
echo % should push c.patch
hg qpush -a
hg qpop -a
hg qselect -n
echo % should push all
hg qpush -a
hg qpop -a
hg qguard a.patch +1
hg qguard b.patch +2
hg qselect 1
echo % should push a.patch, not b.patch
hg qpush
hg qpush
hg qpop -a
hg qselect 2
echo % should push b.patch
hg qpush
hg qpush -a
# Used to be an issue with holes in the patch sequence
# So, put one hole on the base and ask for topmost patch.
hg qtop
hg qpop -a
hg qselect 1 2
echo % should push a.patch, b.patch
hg qpush
hg qpush
hg qpop -a
hg qguard a.patch +1 +2 -3
hg qselect 1 2 3
echo % list patches and guards
hg qguard -l
echo % list series
hg qseries -v
echo % list guards
hg qselect
echo % should push b.patch
hg qpush
hg qpush -a
hg qselect -n --reapply
echo % guards in series file: +1 +2 -3
hg qselect -s
echo % should show c.patch
hg qapplied
hg qrename a.patch new.patch
echo % should show :
echo % new.patch: +1 +2 -3
echo % b.patch: +2
echo % c.patch: unguarded
hg qguard -l
hg qnew d.patch
hg qpop
echo % should show new.patch and b.patch as Guarded, c.patch as Applied
echo % and d.patch as Unapplied
hg qseries -v
hg qguard d.patch +2
echo % new.patch, b.patch: Guarded. c.patch: Applied. d.patch: Guarded.
hg qseries -v
qappunappv()
(
for command in qapplied "qapplied -v" qunapplied "qunapplied -v"; do
echo % hg $command
hg $command
done
)
hg qpop -a
hg qguard -l
qappunappv
hg qselect 1
qappunappv
hg qpush -a
qappunappv
hg qselect 2
qappunappv
for patch in `hg qseries`; do
echo % hg qapplied $patch
hg qapplied $patch
echo % hg qunapplied $patch
hg qunapplied $patch
done
echo % hg qseries -m: only b.patch should be shown
echo the guards file was not ignored in the past
hg qdelete -k b.patch
hg qseries -m