[PATCH 3 of 3 STABLE] largefiles: prevent committing a missing largefile
Yuya Nishihara
yuya at tcha.org
Mon Jan 25 09:34:50 CST 2016
On Sun, 24 Jan 2016 01:25:46 -0500, Matt Harbison wrote:
> # HG changeset patch
> # User Matt Harbison <matt_harbison at yahoo.com>
> # Date 1453612219 18000
> # Sun Jan 24 00:10:19 2016 -0500
> # Branch stable
> # Node ID 7df484912e12acea1fcb1fbe6bcf4efddead779c
> # Parent f20852b3f6c8f9ef04cdfb902dafb3e8923a4a20
> largefiles: prevent committing a missing largefile
>
> Previously, if the largefile was deleted at the time of a commit, the standin
> was silently not updated and its current state (possibly garbage) was recorded.
> The test makes it look like this is somewhat of an edge case, but the same thing
> happens when an `hg revert` followed by `rm` changes the standin.
>
> diff --git a/hgext/largefiles/lfutil.py b/hgext/largefiles/lfutil.py
> --- a/hgext/largefiles/lfutil.py
> +++ b/hgext/largefiles/lfutil.py
> @@ -319,6 +319,9 @@
> hash = hashfile(file)
> executable = getexecutable(file)
> writestandin(repo, standin, hash, executable)
> + return True
> +
> + return False
>
> def readstandin(repo, filename, node=None):
> '''read hex hash from standin for filename at given node, or working
> @@ -552,11 +555,15 @@
> # stay refreshed. No harm done: the user modified them and
> # asked to commit them, so sooner or later we're going to
> # refresh the standins. Might as well leave them refreshed.
> + missing = set()
> lfdirstate = openlfdirstate(ui, repo)
> for fstandin in standins:
> lfile = splitstandin(fstandin)
> if lfdirstate[lfile] != 'r':
> - updatestandin(repo, fstandin)
> + if not updatestandin(repo, fstandin):
> + missing.add(fstandin)
> +
> + standins = [s for s in standins if s not in missing]
>
> # Cook up a new matcher that only matches regular files or
> # standins corresponding to the big files requested by the
> diff --git a/tests/test-largefiles-cache.t b/tests/test-largefiles-cache.t
> --- a/tests/test-largefiles-cache.t
> +++ b/tests/test-largefiles-cache.t
> @@ -19,6 +19,12 @@
> $ hg rm large
> $ hg commit -m 'branchhead without largefile' large
> $ hg up -qr 0
> + $ rm large
> + $ echo "0000000000000000000000000000000000000000" > .hglf/large
> + $ hg commit -m 'commit missing file with corrupt standin' large
> + nothing changed (1 missing files, see 'hg status')
> + [1]
Can it abort? I'm afraid of a side effect of removing missing standins.
Also, "hg commit deleted-non-large" said "abort: ... file not found!".
More information about the Mercurial-devel
mailing list