comparison hgext/largefiles/lfutil.py @ 23276:4be754832829

largefiles: move "copyalltostore" invocation into "markcommitted" Before this patch, while "hg convert", largefiles avoids copying largefiles in the working directory into the store area by combination of setting "repo._isconverting" in "mercurialsink{before|after}" and checking it in "copytostoreabsolute". This avoiding is needed while "hg convert", because converting doesn't update largefiles in the working directory. But this implementation is not efficient, because: - invocation in "markcommitted" can easily ensure updating largefiles in the working directory "markcommitted" is invoked only when new revision is committed via "commit" of "localrepository" (= with files in the working directory). On the other hand, "commitctx" may be invoked directly for in-memory committing. - committing without updating the working directory (e.g. "import --bypass") also needs this kind of avoiding For efficiency of this kind of avoiding, this patch does: - move "copyalltostore" invocation into "markcommitted" - remove meaningless procedures below: - hooking "mercurialsink{before|after}" to (un)set "repo._isconverting" - checking "repo._isconverting" in "copytostoreabsolute" This patch invokes "copyalltostore" also in "_commitcontext", because "_commitcontext" expects that largefiles in the working directory are copied into store area after "commitctx". In this case, the working directory is used as a kind of temporary area to write largefiles out, even though converted revisions are committed via "commitctx" (without updating normal files).
author FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
date Sat, 08 Nov 2014 00:48:41 +0900
parents 0ec2e124fcc0
children 4dd8a6a1240d
comparison
equal deleted inserted replaced
23275:fae708cb32d1 23276:4be754832829
202 202
203 203
204 def copytostoreabsolute(repo, file, hash): 204 def copytostoreabsolute(repo, file, hash):
205 if inusercache(repo.ui, hash): 205 if inusercache(repo.ui, hash):
206 link(usercachepath(repo.ui, hash), storepath(repo, hash)) 206 link(usercachepath(repo.ui, hash), storepath(repo, hash))
207 elif not getattr(repo, "_isconverting", False): 207 else:
208 util.makedirs(os.path.dirname(storepath(repo, hash))) 208 util.makedirs(os.path.dirname(storepath(repo, hash)))
209 dst = util.atomictempfile(storepath(repo, hash), 209 dst = util.atomictempfile(storepath(repo, hash),
210 createmode=repo.store.createmode) 210 createmode=repo.store.createmode)
211 for chunk in util.filechunkiter(open(file, 'rb')): 211 for chunk in util.filechunkiter(open(file, 'rb')):
212 dst.write(chunk) 212 dst.write(chunk)
405 for f in ctx.files(): 405 for f in ctx.files():
406 if isstandin(f): 406 if isstandin(f):
407 lfile = splitstandin(f) 407 lfile = splitstandin(f)
408 synclfdirstate(repo, lfdirstate, lfile, False) 408 synclfdirstate(repo, lfdirstate, lfile, False)
409 lfdirstate.write() 409 lfdirstate.write()
410
411 # As part of committing, copy all of the largefiles into the cache.
412 copyalltostore(repo, node)
410 413
411 def getlfilestoupdate(oldstandins, newstandins): 414 def getlfilestoupdate(oldstandins, newstandins):
412 changedstandins = set(oldstandins).symmetric_difference(set(newstandins)) 415 changedstandins = set(oldstandins).symmetric_difference(set(newstandins))
413 filelist = [] 416 filelist = []
414 for f in changedstandins: 417 for f in changedstandins: