Patchwork D6194: remotefilelog: fix crash on `hg addremove` of added-but-deleted file

login
register
mail settings
Submitter phabricator
Date April 4, 2019, 12:47 a.m.
Message ID <differential-rev-PHID-DREV-7p6v5cyd2k6xyytgnbm4-req@phab.mercurial-scm.org>
Download mbox | patch
Permalink /patch/39472/
State Superseded
Headers show

Comments

phabricator - April 4, 2019, 12:47 a.m.
martinvonz created this revision.
Herald added a subscriber: mercurial-devel.
Herald added a reviewer: hg-reviewers.

REVISION SUMMARY
  If you `hg add` a file and then delete it from disk, and then run `hg
  addremove`, the file ends up in the "removed" set that gets passed to
  the findrenames() override. We then crash because the file is not in
  the working copy parent. This patch fixes that.

REPOSITORY
  rHG Mercurial

REVISION DETAIL
  https://phab.mercurial-scm.org/D6194

AFFECTED FILES
  hgext/remotefilelog/__init__.py
  tests/test-remotefilelog-prefetch.t

CHANGE DETAILS




To: martinvonz, #hg-reviewers
Cc: mercurial-devel

Patch

diff --git a/tests/test-remotefilelog-prefetch.t b/tests/test-remotefilelog-prefetch.t
--- a/tests/test-remotefilelog-prefetch.t
+++ b/tests/test-remotefilelog-prefetch.t
@@ -197,6 +197,9 @@ 
   $ mv x x2
   $ mv y y2
   $ mv z z2
+  $ echo a > a
+  $ hg add a
+  $ rm a
   $ clearcache
   $ hg addremove -s 50 > /dev/null
   3 files fetched over 1 fetches - (3 misses, 0.00% hit ratio) over * (glob)
diff --git a/hgext/remotefilelog/__init__.py b/hgext/remotefilelog/__init__.py
--- a/hgext/remotefilelog/__init__.py
+++ b/hgext/remotefilelog/__init__.py
@@ -478,9 +478,10 @@ 
     def findrenames(orig, repo, matcher, added, removed, *args, **kwargs):
         if isenabled(repo):
             files = []
-            parentctx = repo['.']
+            pmf = repo['.'].manifest()
             for f in removed:
-                files.append((f, hex(parentctx.filenode(f))))
+                if f in pmf:
+                    files.append((f, hex(pmf[f])))
             # batch fetch the needed files from the server
             repo.fileservice.prefetch(files)
         return orig(repo, matcher, added, removed, *args, **kwargs)