[PATCH 3 of 3 STABLE] largefiles: prevent committing a missing largefile
Yuya Nishihara
yuya at tcha.org
Tue Jan 26 08:48:16 CST 2016
On Mon, 25 Jan 2016 22:38:07 -0500, Matt Harbison wrote:
> On Mon, 25 Jan 2016 10:34:50 -0500, Yuya Nishihara <yuya at tcha.org> wrote:
>
> > 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?
>
> Yep, that's a better idea, thanks. I'll wait until 1 and 2 are upstream
> before resending.
Pushed the first two to the clowncopter, thanks.
> > I'm afraid of a side effect of removing missing standins.
>
> Can you elaborate? It looks like `hg rm standin` is silently ignored, and
> I didn't notice any breakage with `rm standin`.
I don't have a particular concern in mind. I was just afraid of touching
match._files which would be passed around.
More information about the Mercurial-devel
mailing list