diff --git a/hgext/largefiles/lfcommands.py b/hgext/largefiles/lfcommands.py --- a/hgext/largefiles/lfcommands.py +++ b/hgext/largefiles/lfcommands.py @@ -375,7 +375,15 @@ def cachelfiles(ui, repo, node): toget = [] for lfile in lfiles: - expectedhash = repo[node][lfutil.standin(lfile)].data().strip() + # If we are mid-merge, then we have to trust the standin that is in the + # working copy to have the correct hashvalue. This is because the + # original hg.merge() already updated the standin as part of the normal + # merge process -- we just have to udpate the largefile to match. + if getattr(repo, "_ismerging", False): + expectedhash = lfutil.readstandin(repo, lfile) + else: + expectedhash = repo[node][lfutil.standin(lfile)].data().strip() + # if it exists and its hash matches, it might have been locally # modified before updating and the user chose 'local'. in this case, # it will not be in any store, so don't look for it. diff --git a/hgext/largefiles/overrides.py b/hgext/largefiles/overrides.py --- a/hgext/largefiles/overrides.py +++ b/hgext/largefiles/overrides.py @@ -612,8 +612,15 @@ def hg_clean(orig, repo, node, show_stat return result def hg_merge(orig, repo, node, force=None, remind=True): - result = orig(repo, node, force, remind) - lfcommands.updatelfiles(repo.ui, repo) + # Mark the repo as being in the middle of a merge, so that + # updatelfiles() will know that it needs to trust the standins in + # the working copy, not in the standins in the current node + repo._ismerging = True + try: + result = orig(repo, node, force, remind) + lfcommands.updatelfiles(repo.ui, repo) + finally: + repo._ismerging = False return result # When we rebase a repository with remotely changed largefiles, we need to