patch: support diff data loss detection and upgrade
In worst case, generating diff in upgrade mode can be two times more expensive
than generating it in git mode directly: we may have to regenerate the whole
diff again whenever a git feature is detected. Also, the first diff attempt is
completely buffered instead of being streamed. That said, even without having
profiled it yet, I am convinced we can fast-path the upgrade mode if necessary
were it to be used in regular diff commands, and not only in mq where avoiding
data loss is worth the price.
#!/bin/sh
echo "[extensions]" >> $HGRCPATH
echo "mq=" >> $HGRCPATH
hg init a
cd a
echo 'base' > base
hg ci -Ambase -d '1 0'
hg qnew -d '1 0' a
hg qnew -d '1 0' b
hg qnew -d '1 0' c
hg qdel
hg qdel c
hg qpop
hg qdel c
hg qseries
ls .hg/patches
hg qpop
hg qdel -k b
ls .hg/patches
hg qdel -r a
hg qapplied
hg log --template '{rev} {desc}\n'
hg qnew d
hg qnew e
hg qnew f
hg qdel -r e
hg qdel -r qbase:e
hg qapplied
hg log --template '{rev} {desc}\n'
cd ..
hg init b
cd b
echo 'base' > base
hg ci -Ambase -d '1 0'
hg qfinish
hg qfinish -a
hg qnew -d '1 0' a
hg qnew -d '1 0' b
hg qnew c # XXX fails to apply by /usr/bin/patch if we put a date
hg qfinish 0
hg qfinish b
hg qpop
hg qfinish -a c
hg qpush
hg qfinish qbase:b
hg qapplied
hg log --template '{rev} {desc}\n'
hg qfinish -a c
hg qapplied
hg log --template '{rev} {desc}\n'
ls .hg/patches