Mercurial > hg
diff hgext/largefiles/lfutil.py @ 15794:0d91211dd12f
largefiles: fix inappropriate locking (issue3182)
Don't lock/write on operations that should be readonly (status).
Always lock when writing the lfdirstate (rollback).
Don't write lfdirstate until after committing; state isn't actually changed
until the commit is complete.
author | Levi Bard <levi@unity3d.com> |
---|---|
date | Sat, 07 Jan 2012 19:05:59 +0100 |
parents | 3ef07ecdb0d5 |
children | 3e5b6045ccfc |
line wrap: on
line diff
--- a/hgext/largefiles/lfutil.py Sat Jan 07 18:43:34 2012 +0100 +++ b/hgext/largefiles/lfutil.py Sat Jan 07 19:05:59 2012 +0100 @@ -154,11 +154,7 @@ # If the largefiles dirstate does not exist, populate and create # it. This ensures that we create it on the first meaningful - # largefiles operation in a new clone. It also gives us an easy - # way to forcibly rebuild largefiles state: - # rm .hg/largefiles/dirstate && hg status - # Or even, if things are really messed up: - # rm -rf .hg/largefiles && hg status + # largefiles operation in a new clone. if not os.path.exists(os.path.join(admin, 'dirstate')): util.makedirs(admin) matcher = getstandinmatcher(repo) @@ -172,27 +168,19 @@ except OSError, err: if err.errno != errno.ENOENT: raise - - lfdirstate.write() - return lfdirstate def lfdirstate_status(lfdirstate, repo, rev): - wlock = repo.wlock() - try: - match = match_.always(repo.root, repo.getcwd()) - s = lfdirstate.status(match, [], False, False, False) - unsure, modified, added, removed, missing, unknown, ignored, clean = s - for lfile in unsure: - if repo[rev][standin(lfile)].data().strip() != \ - hashfile(repo.wjoin(lfile)): - modified.append(lfile) - else: - clean.append(lfile) - lfdirstate.normal(lfile) - lfdirstate.write() - finally: - wlock.release() + match = match_.always(repo.root, repo.getcwd()) + s = lfdirstate.status(match, [], False, False, False) + unsure, modified, added, removed, missing, unknown, ignored, clean = s + for lfile in unsure: + if repo[rev][standin(lfile)].data().strip() != \ + hashfile(repo.wjoin(lfile)): + modified.append(lfile) + else: + clean.append(lfile) + lfdirstate.normal(lfile) return (modified, added, removed, missing, unknown, ignored, clean) def listlfiles(repo, rev=None, matcher=None):