diff -r cb7a0ae053c6 -r 75520786ad2f mercurial/upgrade.py --- a/mercurial/upgrade.py Thu Dec 07 20:50:24 2017 +0100 +++ b/mercurial/upgrade.py Thu Dec 07 18:55:35 2017 +0100 @@ -830,9 +830,22 @@ try: ui.write(_('creating temporary repository to stage migrated ' 'data: %s\n') % tmppath) - dstrepo = localrepo.localrepository(repo.baseui, - path=tmppath, - create=True) + + # repo.ui is protected against copy: + # + # running `repo.ui.copy` actually call `repo.baseui.copy`. Here, we + # -really- wants to copy the actual `repo.ui` object (since we + # create a copy of the repository). + # + # We have to work around the protection. + oldcopy = repo.ui.copy + try: + repo.ui.__dict__.pop('copy', None) + dstrepo = localrepo.localrepository(repo.ui, + path=tmppath, + create=True) + finally: + repo.ui.copy = oldcopy with dstrepo.wlock(), dstrepo.lock(): backuppath = _upgraderepo(ui, repo, dstrepo, newreqs,