# HG changeset patch # User Dan Villiom Podlaski Christiansen <dan@magenta.dk> # Date 1600206997 -7200 # Tue Sep 15 23:56:37 2020 +0200 # Node ID ce8cb86c4724447d822727ccc9f59d23e9faa710 # Parent 3096772e8e317c40fa3f54d41ad0f4aaed474f6e pull: delete stale git remotes This is adjusted by a new option, git.prune-remotes, which is true by default. diff --git a/README.rst b/README.rst --- a/README.rst +++ b/README.rst @@ -293,6 +293,16 @@ therefore converted to Mercurial in the 'public' phase. This is only used if ``hggit.usephases`` is set. +``git.pull-prune-remote-branches`` +-------------- + +Before fetching, remove any remote-tracking references, or +pseudo-tags, that no longer exist on the remote. This is equivalent to +the ``--prune`` option to ``git fetch``, and means that pseudo-tags +for remotes — such as ``default/master`` — always actually reflect +what's on the remote. + +This option is enabled by default. ``git.renamelimit`` ------------------- diff --git a/hggit/config.py b/hggit/config.py --- a/hggit/config.py +++ b/hggit/config.py @@ -15,6 +15,7 @@ b'public': list, b'renamelimit': 400, b'similarity': 0, + b'pull-prune-remote-branches': True, }, b'hggit': { b'mapsavefrequency': 0, diff --git a/hggit/git_handler.py b/hggit/git_handler.py --- a/hggit/git_handler.py +++ b/hggit/git_handler.py @@ -1555,12 +1555,17 @@ def update_remote_branches(self, remote_name, refs): remote_refs = self.remote_refs - # since we re-write all refs for this remote each time, prune - # all entries matching this remote from our refs list now so - # that we avoid any stale refs hanging around forever - for t in list(remote_refs): - if t.startswith(remote_name + b'/'): - del remote_refs[t] + if self.ui.configbool(b'git', b'pull-prune-remote-branches'): + # since we re-write all refs for this remote each time, + # prune all entries matching this remote from our refs + # list now so that we avoid any stale refs hanging around + # forever + for t in list(remote_refs): + if t.startswith(remote_name + b'/'): + del remote_refs[t] + if b'refs/heads/' + t[len(remote_name) + 1:] not in refs: + del self.git.refs[b'refs/remotes/' + t] + for ref_name, sha in refs.items(): if ref_name.startswith(b'refs/heads'): hgsha = self.map_hg_get(sha) diff --git a/tests/test-pull.t b/tests/test-pull.t --- a/tests/test-pull.t +++ b/tests/test-pull.t @@ -136,10 +136,19 @@ $ cd .. pull the merge - $ hg -R hgrepo pull + $ hg -R hgrepo tags | grep default/beta + default/beta 1:7fe02317c63d + $ hg -R hgrepo pull --config git.pull-prune-remote-branches=false pulling from $TESTTMP/gitrepo importing git objects into hg (run 'hg update' to get a working copy) + $ hg -R hgrepo tags | grep default/beta + default/beta 1:7fe02317c63d + $ hg -R hgrepo pull + pulling from $TESTTMP/gitrepo + no changes found + $ hg -R hgrepo tags | grep default/beta + [1] $ hg -R hgrepo log --graph o changeset: 4:a02330f767a4 |\ bookmark: master @@ -167,7 +176,6 @@ | | o | changeset: 1:7fe02317c63d |/ bookmark: beta - | tag: default/beta | tag: t_beta | user: test <test@example.org> | date: Mon Jan 01 00:00:11 2007 +0000 @@ -244,7 +252,6 @@ | | o | changeset: 1:7fe02317c63d |/ bookmark: beta - | tag: default/beta | tag: t_beta | user: test <test@example.org> | date: Mon Jan 01 00:00:11 2007 +0000