patch: use temporary files to handle intermediate copies
git patches may require copies to be handled out-of-order. For instance, take
the following sequence:
* modify a
* copy a into b
Here, we have to generate b from a before its modification. To do so,
applydiff() was scanning for copy metadata and performing the copies before
processing the other changes in-order. While smart and efficient, this approach
complicates things by handling file copies and file creations at different
places and times. While a new file must not exist before being patched a copied
file already exists before applying the first hunk.
Instead of copying the files at their final destination before patching, we
store them in a temporary file location and retrieve them when patching. The
filestore always stores file content in real files but nothing prevents adding
a cache layer. The filestore class was kept separate from fsbackend for at
least two reasons:
- This class is likely to be reused as a temporary result store for a future
repository patching call (entries just have to be extended to contain copy
sources).
- Delegating this role to backends might be more efficient in a repository
backend case: the source files are already available in the repository itself
and do not need to be copied again. It also means that third-parties backend
would have to implement two other methods. If we ever decide to merge the
filestore feature into backend, a minimalistic approach would be to compose
with filestore directly. Keep in mind this copy overhead only applies for
copy/rename sources, and may even be reduced to copy sources which have to
handled ahead of time.
[ original upstream message ]
536c1797202d57efb77bea098e10968ff01602ce universal_scheme
ba000e29ecf3b8df09e0fd363a78cabbe3c2a78f cvs_scheme
1fe48bf82d056f1ece05baccab888357c10c5ab8 r0.1
2e930f84224222ad6514a3c5dc6e00350e199e92 very_cvs
99dc49c5bcfba9d5b412c5fa6d0bf3ba20d68df1 hgkw_standalone_setup
15e8cd7f5295728b089fc8ba236c0f079572fb1d nohook
0c8b7e5c25a6b9a0d2782eaa3748eb546f5a254f archive
0000000000000000000000000000000000000000 universal_scheme
0000000000000000000000000000000000000000 cvs_scheme
0000000000000000000000000000000000000000 r0.1
0000000000000000000000000000000000000000 very_cvs
0000000000000000000000000000000000000000 hgkw_standalone_setup
0000000000000000000000000000000000000000 nohook
0000000000000000000000000000000000000000 archive