Skip to content
Snippets Groups Projects
Commit 3e1efb458e8b authored by Na'Tosha Bard's avatar Na'Tosha Bard
Browse files

largefiles: only cache largefiles in new heads

This fixes a serious performance regression in largefiles introduced in
Mercurial 2.1.  Caching new largefiles on pull is necessary, because
otherwise largefiles will be missing (and unable to be downloaded) when
the user tries to merge or rebase a new head with an old one.  But this
is an expensive operation and should only be done for heads that are new
from the pull, rather than on all heads in the repository.
parent 20ad8f0512a2
No related branches found
No related tags found
No related merge requests found
......@@ -449,3 +449,11 @@
class storeprotonotcapable(Exception):
def __init__(self, storetypes):
self.storetypes = storetypes
def getcurrentheads(repo):
branches = repo.branchmap()
heads = []
for branch in branches:
newheads = repo.branchheads(branch)
heads = heads + newheads
return heads
......@@ -660,6 +660,7 @@
repo.lfpullsource = source
if not source:
source = 'default'
oldheads = lfutil.getcurrentheads(repo)
result = orig(ui, repo, source, **opts)
# If we do not have the new largefiles for any new heads we pulled, we
# will run into a problem later if we try to merge or rebase with one of
......@@ -667,12 +668,11 @@
# cache.
ui.status(_("caching new largefiles\n"))
numcached = 0
branches = repo.branchmap()
for branch in branches:
heads = repo.branchheads(branch)
for head in heads:
(cached, missing) = lfcommands.cachelfiles(ui, repo, head)
numcached += len(cached)
heads = lfutil.getcurrentheads(repo)
newheads = set(heads).difference(set(oldheads))
for head in newheads:
(cached, missing) = lfcommands.cachelfiles(ui, repo, head)
numcached += len(cached)
ui.status(_("%d largefiles cached\n" % numcached))
return result
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment