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.
% no diff if hardlink
% init
adding foo to series file
applying foo
now at: foo
adding bar to series file
applying bar
now at: bar
430ed4828a74fa4047bc816a25500f7472ab4bfe:foo
4e7abb4840c46a910f6d7b4d3c3fc7e5209e684c:bar
%
foo
bar
%%%
430ed4828a74fa4047bc816a25500f7472ab4bfe:foo
%
foo
patch foo finalized without changeset message
patch bar finalized without changeset message
%%%
4e7abb4840c46a910f6d7b4d3c3fc7e5209e684c foo
430ed4828a74fa4047bc816a25500f7472ab4bfe bar
%
4e7abb4840c46a910f6d7b4d3c3fc7e5209e684c lfoo
430ed4828a74fa4047bc816a25500f7472ab4bfe lbar
%%%
4e7abb4840c46a910f6d7b4d3c3fc7e5209e684c foo
%
4e7abb4840c46a910f6d7b4d3c3fc7e5209e684c lfoo