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 @@ -2557,7 +2557,13 @@ writecopiesto = self.ui.config('experimental', 'copies.write-to') writefilecopymeta = writecopiesto != 'changeset-only' p1copies, p2copies = None, None - if writecopiesto in ('changeset-only', 'compatibility'): + # 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. + if writecopiesto == 'changeset-only': + p1copies = ctx.p1copies() or None + p2copies = ctx.p2copies() or None + elif writecopiesto == 'compatibility': p1copies = ctx.p1copies() p2copies = ctx.p2copies() with self.lock(), self.transaction("commit") as 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 @@ -101,6 +101,7 @@ $ hg changesetcopies files: j p1copies: j\x00a (esc) + p2copies: $ hg debugdata j 0 \x01 (esc) copy: a @@ -113,6 +114,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