From 10f53151f41bb05c08b30d22caf7ba2ec77c2861 Mon Sep 17 00:00:00 2001 From: Jun Wu Date: Thu, 16 Jul 2020 23:13:47 -0700 Subject: [PATCH] remotenames: normalize 'default-push' to 'default' Summary: We have seen cases where `default-push` remote name gets written during pull. Teach `paths.getname` (new code path) and `remotenames.activepath` (old code path) to optionally normalize `default-push` to `default` to avoid that. Reviewed By: DurhamG Differential Revision: D22395521 fbshipit-source-id: ed16dc30150fc1369f7037296cf77f7f0fc83fee --- eden/scm/edenscm/mercurial/bookmarks.py | 5 +++++ eden/scm/edenscm/mercurial/clone.py | 2 +- eden/scm/edenscm/mercurial/commands/__init__.py | 4 +++- eden/scm/edenscm/mercurial/commands/doctor.py | 2 +- eden/scm/edenscm/mercurial/exchange.py | 4 +++- eden/scm/edenscm/mercurial/localrepo.py | 4 ++-- eden/scm/edenscm/mercurial/ui.py | 12 +++++++++++- 7 files changed, 26 insertions(+), 7 deletions(-) diff --git a/eden/scm/edenscm/mercurial/bookmarks.py b/eden/scm/edenscm/mercurial/bookmarks.py index 2d37cb94fc..fc19c6ea15 100644 --- a/eden/scm/edenscm/mercurial/bookmarks.py +++ b/eden/scm/edenscm/mercurial/bookmarks.py @@ -1369,6 +1369,11 @@ def splitremotename(remote): return remote, name +def remotenameforurl(ui, url): + """Convert an URL to a remote name""" + return ui.paths.getname(url, forremotenames=True) + + def _trackaccessedbookmarks(ui): return ui.configbool("remotenames", "selectivepullaccessedbookmarks") diff --git a/eden/scm/edenscm/mercurial/clone.py b/eden/scm/edenscm/mercurial/clone.py index c3bb9855b7..5af11eafbe 100644 --- a/eden/scm/edenscm/mercurial/clone.py +++ b/eden/scm/edenscm/mercurial/clone.py @@ -49,7 +49,7 @@ def shallowclone(source, repo): # Fetch selected remote bookmarks. repo.ui.status(_("fetching selected remote bookmarks\n")) - remote = repo.ui.paths.getname(repo.ui.paths.getpath(source).rawloc) + remote = bookmod.remotenameforurl(repo.ui, repo.ui.paths.getpath(source).rawloc) assert remote is not None repo.pull( source, bookmarknames=bookmod.selectivepullbookmarknames(repo, remote) diff --git a/eden/scm/edenscm/mercurial/commands/__init__.py b/eden/scm/edenscm/mercurial/commands/__init__.py index 029e92dda9..d5e66ac32b 100644 --- a/eden/scm/edenscm/mercurial/commands/__init__.py +++ b/eden/scm/edenscm/mercurial/commands/__init__.py @@ -4769,7 +4769,9 @@ def pull(ui, repo, source="default", **opts): # pull is unaffected (pulls everything instead of just # selectivepull bookmarks) if revs: - remotename = ui.paths.getname(other.url()) # ex. 'default' or 'remote' + remotename = bookmarks.remotenameforurl( + ui, other.url() + ) # ex. 'default' or 'remote' # Include selective pull bookmarks automatically. implicitbookmarks.update( bookmarks.selectivepullbookmarknames(repo, remotename) diff --git a/eden/scm/edenscm/mercurial/commands/doctor.py b/eden/scm/edenscm/mercurial/commands/doctor.py index d9a94c1282..82e2326c2a 100644 --- a/eden/scm/edenscm/mercurial/commands/doctor.py +++ b/eden/scm/edenscm/mercurial/commands/doctor.py @@ -405,7 +405,7 @@ def checktoomanynames(repo, source="default"): threshold += len(selected) if count < threshold: return - defaultname = ui.paths.getname(ui.paths.getpath(source).rawloc) + defaultname = bookmod.remotenameforurl(ui, ui.paths.getpath(source).rawloc) if not defaultname: return ui.write(_("repo has too many (%s) remote bookmarks\n") % count) diff --git a/eden/scm/edenscm/mercurial/exchange.py b/eden/scm/edenscm/mercurial/exchange.py index 915c52c063..2b267c8f20 100644 --- a/eden/scm/edenscm/mercurial/exchange.py +++ b/eden/scm/edenscm/mercurial/exchange.py @@ -1723,7 +1723,9 @@ def _pullbookmarks(pullop): # Update important remotenames (ex. remote/master) listed by selectivepull # unconditionally. - remotename = ui.paths.getname(pullop.remote.url()) # ex. 'default' or 'remote' + remotename = bookmod.remotenameforurl( + ui, pullop.remote.url() + ) # ex. 'default' or 'remote' if remotename is not None: importantnames = bookmod.selectivepullbookmarknames(repo, remotename) remotebookmarks = pullop.remotebookmarks diff --git a/eden/scm/edenscm/mercurial/localrepo.py b/eden/scm/edenscm/mercurial/localrepo.py index 42d685815a..5368a58066 100644 --- a/eden/scm/edenscm/mercurial/localrepo.py +++ b/eden/scm/edenscm/mercurial/localrepo.py @@ -950,8 +950,8 @@ class localrepository(object): # Update remotenames. if remotenamechanges: - remotename = self.ui.paths.getname( - remote.url() + remotename = bookmarks.remotenameforurl( + self.ui, remote.url() ) # ex. 'default' or 'remote' bookmarks.saveremotenames( self, {remotename: remotenamechanges}, override=False diff --git a/eden/scm/edenscm/mercurial/ui.py b/eden/scm/edenscm/mercurial/ui.py index 5d8b405006..2666f8427c 100644 --- a/eden/scm/edenscm/mercurial/ui.py +++ b/eden/scm/edenscm/mercurial/ui.py @@ -1863,7 +1863,7 @@ class paths(util.sortdict): except ValueError: raise error.RepoError(_("repository %s does not exist") % name) - def getname(self, rawloc): + def getname(self, rawloc, forremotenames=False): # type: (str) -> Optional[str] """Return name from a raw location. @@ -1871,6 +1871,11 @@ class paths(util.sortdict): 'remotenames.rename.$name' config exists, return the value of that config instead. + If 'forremotenames' is True, normalize 'default-push' to 'default'. + This is only used by 'bookmarks.remotenameforurl' so we never write + 'default-push' as a remote name. If you're setting this flag, consider + using 'bookmarks.remotenameforurl' instead. + Return `None` if path is unknown. """ @@ -1893,6 +1898,11 @@ class paths(util.sortdict): if result in {"infinitepush", "infinitepushbookmark"}: result = "default" + # Do not use 'default-push' as a remote name. Normalize it to + # 'default'. + if forremotenames and result == "default-push": + result = "default" + if result: renamed = self._uiconfig.config("remotenames", "rename.%s" % result) if renamed: