# 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