[PATCH 3 of 9 V2] largefiles: factor out procedures to update lfdirstate for post-committing
FUJIWARA Katsunori
foozy at lares.dti.ne.jp
Wed Nov 5 08:34:12 CST 2014
# HG changeset patch
# User FUJIWARA Katsunori <foozy at lares.dti.ne.jp>
# Date 1415197487 -32400
# Wed Nov 05 23:24:47 2014 +0900
# Node ID 3100d1cbce32d353cf604aece8c32d59f3821f2d
# Parent 51c9196a6bd089a17ebd933c55dfbbe8792bd937
largefiles: factor out procedures to update lfdirstate for post-committing
Before this patch, procedures to update lfdirstate for post-committing
are scattered in "lfilesrepo.commit". In the case of "hg commit" with
patterns for target files ("Case 2"), lfdirstate is updated BEFORE
real committing.
This patch factors out procedures to update lfdirstate for
post-committing into "lfutil.markcommitted", and makes it callable via
"markcommitted" of the context passed to "lfilesrepo.commitctx".
"markcommitted" of the context is called, only when it is committed
successfully.
Passing original "markcommitted" of the context is meaningless in this
patch, but required in subsequent one to prepare something before
invocation of it.
diff --git a/hgext/largefiles/lfutil.py b/hgext/largefiles/lfutil.py
--- a/hgext/largefiles/lfutil.py
+++ b/hgext/largefiles/lfutil.py
@@ -386,6 +386,18 @@
elif state == '?':
lfdirstate.drop(lfile)
+def markcommitted(orig, ctx, node):
+ repo = ctx._repo
+
+ orig(node)
+
+ lfdirstate = openlfdirstate(repo.ui, repo)
+ for f in ctx.files():
+ if isstandin(f):
+ lfile = splitstandin(f)
+ synclfdirstate(repo, lfdirstate, lfile, False)
+ lfdirstate.write()
+
def getlfilestoupdate(oldstandins, newstandins):
changedstandins = set(oldstandins).symmetric_difference(set(newstandins))
filelist = []
diff --git a/hgext/largefiles/reposetup.py b/hgext/largefiles/reposetup.py
--- a/hgext/largefiles/reposetup.py
+++ b/hgext/largefiles/reposetup.py
@@ -243,9 +243,14 @@
# As part of committing, copy all of the largefiles into the
# cache.
- def commitctx(self, *args, **kwargs):
- node = super(lfilesrepo, self).commitctx(*args, **kwargs)
+ def commitctx(self, ctx, *args, **kwargs):
+ node = super(lfilesrepo, self).commitctx(ctx, *args, **kwargs)
lfutil.copyalltostore(self, node)
+ class lfilesctx(ctx.__class__):
+ def markcommitted(self, node):
+ orig = super(lfilesctx, self).markcommitted
+ return lfutil.markcommitted(orig, self, node)
+ ctx.__class__ = lfilesctx
return node
# Before commit, largefile standins have not had their
@@ -270,16 +275,6 @@
getattr(self, "_istransplanting", False):
result = orig(text=text, user=user, date=date, match=match,
force=force, editor=editor, extra=extra)
-
- if result:
- lfdirstate = lfutil.openlfdirstate(ui, self)
- for f in self[result].files():
- if lfutil.isstandin(f):
- lfile = lfutil.splitstandin(f)
- lfutil.synclfdirstate(self, lfdirstate, lfile,
- False)
- lfdirstate.write()
-
return result
# Case 1: user calls commit with no specific files or
# include/exclude patterns: refresh and commit all files that
@@ -308,22 +303,10 @@
if os.path.exists(self.wjoin(lfile)):
lfutil.updatestandin(self,
lfutil.standin(lfile))
- lfdirstate.normal(lfile)
result = orig(text=text, user=user, date=date, match=match,
force=force, editor=editor, extra=extra)
- if result is not None:
- for lfile in lfdirstate:
- if lfile in modifiedfiles:
- if (not os.path.exists(self.wjoin(
- lfutil.standin(lfile)))) or \
- (not os.path.exists(self.wjoin(lfile))):
- lfdirstate.drop(lfile)
-
- # This needs to be after commit; otherwise precommit hooks
- # get the wrong status
- lfdirstate.write()
return result
lfiles = lfutil.listlfiles(self)
@@ -350,9 +333,6 @@
lfile = lfutil.splitstandin(standin)
if lfdirstate[lfile] != 'r':
lfutil.updatestandin(self, standin)
- lfdirstate.normal(lfile)
- else:
- lfdirstate.drop(lfile)
# Cook up a new matcher that only matches regular files or
# standins corresponding to the big files requested by the
@@ -386,9 +366,6 @@
match.matchfn = matchfn
result = orig(text=text, user=user, date=date, match=match,
force=force, editor=editor, extra=extra)
- # This needs to be after commit; otherwise precommit hooks
- # get the wrong status
- lfdirstate.write()
return result
finally:
wlock.release()
More information about the Mercurial-devel
mailing list