Mercurial > hg
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: |