changeset 23893:f21a0d6d6efd

largefiles: don't rehash largefiles in updatelfiles if standin hash changed Standins are read before and after an update/merge, and all the standins that changes are handed to updatelfiles for getting their corresponding largefiles updated. updatelfiles would then hash the largefile and see if it already matched the new expected hash. If so, it would skip the update. If different, the largefile would be updated. It would happen very rarely that the largefile happened to match the new hash (and thus not the old one) and the hashing would thus be pointless ... and hashing is not cheap. Instead, when it is known that the standin hash changed (from an update), just update the standin unconditionally. If the largefile was "unsure" before the update, it was hashed at that point, so we know there is nothing to preserve. (Also, the hashing in updatelfiles was not used to preserve changes, but only to be lazy about updating the largefile, so nothing is lost by not doing this extra hashing.) There might be rare situations where we now will update largefiles that didn't have to be updated, but in all relevant cases (?) this will improve performance. Updates on a repo with some big largefiles has been seen to go from 9.19 s to 6.8 s - that is 26% less painful.
author Mads Kiilerich <madski@unity3d.com>
date Fri, 09 Jan 2015 19:10:09 +0100
parents f2b6f37d537b
children f388ceae2250
files hgext/largefiles/lfcommands.py hgext/largefiles/overrides.py
diffstat 2 files changed, 4 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/hgext/largefiles/lfcommands.py	Fri Jan 16 19:51:25 2015 +0100
+++ b/hgext/largefiles/lfcommands.py	Fri Jan 09 19:10:09 2015 +0100
@@ -437,7 +437,7 @@
     return totalsuccess, totalmissing
 
 def updatelfiles(ui, repo, filelist=None, printmessage=None,
-                 normallookup=False):
+                 normallookup=False, checked=False):
     '''Update largefiles according to standins in the working directory
 
     If ``printmessage`` is other than ``None``, it means "print (or
@@ -465,7 +465,8 @@
                     util.unlinkpath(absstandin + '.orig')
                 expecthash = lfutil.readstandin(repo, lfile)
                 if (expecthash != '' and
-                    (not os.path.exists(abslfile) or
+                    (checked or
+                     not os.path.exists(abslfile) or
                      expecthash != lfutil.hashfile(abslfile))):
                     if lfile not in repo[None]: # not switched to normal file
                         util.unlinkpath(abslfile, ignoremissing=True)
--- a/hgext/largefiles/overrides.py	Fri Jan 16 19:51:25 2015 +0100
+++ b/hgext/largefiles/overrides.py	Fri Jan 09 19:10:09 2015 +0100
@@ -1324,7 +1324,7 @@
             filelist = lfutil.getlfilestoupdate(oldstandins, newstandins)
 
         lfcommands.updatelfiles(repo.ui, repo, filelist=filelist,
-                                normallookup=partial)
+                                normallookup=partial, checked=linearmerge)
 
         return result
     finally: