Patchwork D11400: narrow: fix commits of empty files

login
register
mail settings
Submitter phabricator
Date Sept. 10, 2021, 7:14 p.m.
Message ID <differential-rev-PHID-DREV-ukgvr54ifzuaxzv2ut2t-req@mercurial-scm.org>
Download mbox | patch
Permalink /patch/49716/
State Superseded
Headers show

Comments

phabricator - Sept. 10, 2021, 7:14 p.m.
valentin.gatienbaron created this revision.
Herald added a reviewer: durin42.
Herald added a reviewer: hg-reviewers.
Herald added a subscriber: mercurial-patches.

REVISION SUMMARY
  The problem is that when committing a new file with empty contents (or
  in general empty file with filelog p1 = -1), hg commit with narrow
  doesn't create a filelog revision at all, which causes failures in
  further commands.
  
  The problem seems to be that:
  
  - hg thinks that instead of creating a new filelog revision, it can use the filelog's p1 (the nullrev)
  - because it thinks the file contents is the same in that revision and in p1
  - because `narrowfilelog.cmp(nullrev, b'')` is True (unlike with `filelog.cmp`)
  
  It's not clear to me which `cmp` behaves better. But I think it makes
  sense to change the commit code to not to "reuse" the null rev when
  adding an empty file with filelog p1 == filelog p2 == -1. This is
  consistent with never writing the null rev in the manifest, which `hg
  verify` claims is an invariant:
  
    inside/c@4: manifest refers to unknown revision 000000000000

REPOSITORY
  rHG Mercurial

BRANCH
  default

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

AFFECTED FILES
  mercurial/commit.py
  tests/test-narrow-commit.t

CHANGE DETAILS




To: valentin.gatienbaron, durin42, #hg-reviewers
Cc: mercurial-patches, mercurial-devel

Patch

diff --git a/tests/test-narrow-commit.t b/tests/test-narrow-commit.t
--- a/tests/test-narrow-commit.t
+++ b/tests/test-narrow-commit.t
@@ -105,14 +105,6 @@ 
   $ hg debugdirstate --no-dates
   n 644         10 set                 inside/f1
 
-Can't commit empty files
+Can commit empty files
 
   $ touch inside/c; hg add inside/c; hg commit -qm _; hg verify -q
-   warning: revlog 'data/inside/c.i' not in fncache!
-   4: empty or missing inside/c
-   inside/c@4: manifest refers to unknown revision 000000000000
-  1 warnings encountered!
-  hint: run "hg debugrebuildfncache" to recover from corrupt fncache
-  2 integrity errors encountered!
-  (first damaged changeset appears to be 4)
-  [1]
diff --git a/mercurial/commit.py b/mercurial/commit.py
--- a/mercurial/commit.py
+++ b/mercurial/commit.py
@@ -389,6 +389,7 @@ 
     text = fctx.data()
     if (
         fparent2 != repo.nullid
+        or fparent1 == repo.nullid
         or meta
         or flog.cmp(fparent1, text)
         or force_new_node