Mercurial > hg
comparison tests/test-import.t @ 14452:ee574cfd0c32
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.
author | Patrick Mezard <pmezard@gmail.com> |
---|---|
date | Fri, 27 May 2011 21:50:10 +0200 |
parents | 2852843947da |
children | 0705f2ac79d6 |
comparison
equal
deleted
inserted
replaced
14451:c78d41db6f88 | 14452:ee574cfd0c32 |
---|---|
615 > diff --git a/a b/b | 615 > diff --git a/a b/b |
616 > rename from ../outside/foo | 616 > rename from ../outside/foo |
617 > rename to bar | 617 > rename to bar |
618 > EOF | 618 > EOF |
619 applying patch from stdin | 619 applying patch from stdin |
620 abort: ../outside/foo not under root | 620 abort: path contains illegal component: ../outside/foo |
621 [255] | 621 [255] |
622 $ cd .. | 622 $ cd .. |
623 | 623 |
624 | 624 |
625 test import with similarity and git and strip (issue295 et al.) | 625 test import with similarity and git and strip (issue295 et al.) |