# HG changeset patch # User Patrick Mezard # Date 1306525810 -7200 # Node ID e763012a55e5680a91d7e3e7bd9a3c2a19cc4cfa # Parent 9cb57d78b54f742336dd576a119ad9488aa8239d 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 ] diff -r 9cb57d78b54f -r e763012a55e5 hgkw/keyword.py --- a/hgkw/keyword.py Fri May 27 21:50:09 2011 +0200 +++ b/hgkw/keyword.py Fri May 27 21:50:10 2011 +0200 @@ -595,11 +595,12 @@ wlock.release() # monkeypatches - def kwpatchfile_init(orig, self, ui, fname, backend, mode, create, remove, - missing=False, eolmode=None): + def kwpatchfile_init(orig, self, ui, fname, backend, store, mode, create, + remove, eolmode=None, copysource=None): '''Monkeypatch/wrap patch.patchfile.__init__ to avoid rejects or conflicts due to expanded keywords in working dir.''' - orig(self, ui, fname, backend, mode, create, remove, missing, eolmode) + orig(self, ui, fname, backend, store, mode, create, remove, + eolmode, copysource) # shrink keywords read from working dir self.lines = kwt.shrinklines(self.fname, self.lines)