purge: abort with missing files avoiding problems with name-mangling fs
In a name mangling filesystem (e.g. a case insensitive one)
dirstate.walk() can yield filenames different from the ones
stored in the dirstate. This already confuses the status and
add commands, but with purge this may cause data loss.
To prevent this purge refuses to work if there are missing
files and has a 'force' option if the user knows it is safe.
Even with the force option purge checks if any of the missing
files is still available in the working dir: if so there
may be some problem with the underlying filesystem, so it
unconditionally aborts.
#!/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
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 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