diff --git a/mercurial/changelog.py b/mercurial/changelog.py --- a/mercurial/changelog.py +++ b/mercurial/changelog.py @@ -591,11 +591,11 @@ elif branch in (".", "null", "tip"): raise error.StorageError(_('the name \'%s\' is reserved') % branch) - if (p1copies or p2copies) and extra is None: + if (p1copies is not None or p2copies is not None) and extra is None: extra = {} - if p1copies: + if p1copies is not None: extra['p1copies'] = encodecopies(p1copies) - if p2copies: + if p2copies is not None: extra['p2copies'] = encodecopies(p2copies) if extra: diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py --- a/mercurial/localrepo.py +++ b/mercurial/localrepo.py @@ -2650,6 +2650,14 @@ mn = p1.manifestnode() files = [] + if writecopiesto == 'changeset-only': + # If writing only to changeset extras, use None to indicate that + # no entry should be written. If writing to both, write an empty + # entry to prevent the reader from falling back to reading + # filelogs. + p1copies = p1copies or None + p2copies = p2copies or None + # update changelog self.ui.note(_("committing changelog\n")) self.changelog.delayupdate(tr) diff --git a/tests/test-copies-in-changeset.t b/tests/test-copies-in-changeset.t --- a/tests/test-copies-in-changeset.t +++ b/tests/test-copies-in-changeset.t @@ -103,6 +103,7 @@ $ hg changesetcopies files: j p1copies: j\x00a (esc) + p2copies: $ hg debugdata j 0 \x01 (esc) copy: a @@ -115,6 +116,14 @@ a -> j $ hg showcopies --config experimental.copies.read-from=filelog-only a -> j +The entries should be written to extras even if they're empty (so the client +won't have to fall back to reading from filelogs) + $ echo x >> j + $ hg ci -m 'modify j' --config experimental.copies.write-to=compatibility + $ hg changesetcopies + files: j + p1copies: + p2copies: Test writing only to filelog