Mercurial > public > mercurial-scm > hg
diff hgext/sparse.py @ 42456:87a34c767384
merge: fix race that could cause wrong size in dirstate
The problem is that hg merge/update/etc work the following way:
1. figure out what files to update
2. apply the update to disk
3. apply the update to in-memory dirstate
4. write dirstate
where step3 looks at the filesystem and assumes it sees the result of
step2. If a file is changed between step2 and step3, step3 will record
incorrect information in the dirstate.
I avoid this by passing the size step3 needs directly from step2, for
the common path (not implemented for change/delete conflicts for
instance).
I didn't fix the same race for the exec bit for now, because it's less
likely to be problematic and I had trouble due to the fact that the
dirstate stores the permissions differently from the manifest (st_mode
vs '' 'l' 'x'), in combination with tests that pretend that symlinks
are not supported.
However, I moved the lstat from step3 to step2, which should tighten
the race window markedly, both for the exec bit and for the mtime.
Differential Revision: https://phab.mercurial-scm.org/D6475
author | Valentin Gatien-Baron <valentin.gatienbaron@gmail.com> |
---|---|
date | Mon, 27 May 2019 16:55:46 -0400 |
parents | f9344d04909e |
children | 2372284d9457 |
line wrap: on
line diff
--- a/hgext/sparse.py Wed Jun 12 13:10:52 2019 -0400 +++ b/hgext/sparse.py Mon May 27 16:55:46 2019 -0400 @@ -228,7 +228,7 @@ hint = _('include file with `hg debugsparse --include <pattern>` or use ' + '`hg add -s <file>` to include file directory while adding') for func in editfuncs: - def _wrapper(orig, self, *args): + def _wrapper(orig, self, *args, **kwargs): sparsematch = self._sparsematcher if not sparsematch.always(): for f in args: @@ -237,7 +237,7 @@ raise error.Abort(_("cannot add '%s' - it is outside " "the sparse checkout") % f, hint=hint) - return orig(self, *args) + return orig(self, *args, **kwargs) extensions.wrapfunction(dirstate.dirstate, func, _wrapper) @command('debugsparse', [