diff mercurial/repair.py @ 47437:7a430116f639

ui: add a context manager for silencing the ui (pushbuffer+popbuffer) We often silence the ui by calling `ui.pushbuffer()` followed (a later in the code) by `ui.popbuffer()`. These places can be identified by the fact that they ignore the output returned from `ui.popbuffer()`. Let's create a context manager for these cases, to avoid repetition, and to avoid accidentally leaving the ui silent on exceptions. I deliberately called the new function `silent()` instead of `buffered()`, because it's just an implementation detail that it uses `pushbuffer()` and `popbuffer()`. We could later optimize it to not buffer the output. Differential Revision: https://phab.mercurial-scm.org/D10884
author Martin von Zweigbergk <martinvonz@google.com>
date Fri, 18 Jun 2021 15:48:51 -0700
parents ffd3e823a7e5
children 0fb328bb2459
line wrap: on
line diff
--- a/mercurial/repair.py	Fri Jun 18 14:17:43 2021 -0700
+++ b/mercurial/repair.py	Fri Jun 18 15:48:51 2021 -0700
@@ -28,6 +28,7 @@
     pycompat,
     requirements,
     scmutil,
+    util,
 )
 from .utils import (
     hashutil,
@@ -239,19 +240,23 @@
                 ui.note(_(b"adding branch\n"))
                 f = vfs.open(tmpbundlefile, b"rb")
                 gen = exchange.readbundle(ui, f, tmpbundlefile, vfs)
-                if not repo.ui.verbose:
-                    # silence internal shuffling chatter
-                    repo.ui.pushbuffer()
-                tmpbundleurl = b'bundle:' + vfs.join(tmpbundlefile)
-                txnname = b'strip'
-                if not isinstance(gen, bundle2.unbundle20):
-                    txnname = b"strip\n%s" % urlutil.hidepassword(tmpbundleurl)
-                with repo.transaction(txnname) as tr:
-                    bundle2.applybundle(
-                        repo, gen, tr, source=b'strip', url=tmpbundleurl
-                    )
-                if not repo.ui.verbose:
-                    repo.ui.popbuffer()
+                # silence internal shuffling chatter
+                maybe_silent = (
+                    repo.ui.silent()
+                    if not repo.ui.verbose
+                    else util.nullcontextmanager()
+                )
+                with maybe_silent:
+                    tmpbundleurl = b'bundle:' + vfs.join(tmpbundlefile)
+                    txnname = b'strip'
+                    if not isinstance(gen, bundle2.unbundle20):
+                        txnname = b"strip\n%s" % urlutil.hidepassword(
+                            tmpbundleurl
+                        )
+                    with repo.transaction(txnname) as tr:
+                        bundle2.applybundle(
+                            repo, gen, tr, source=b'strip', url=tmpbundleurl
+                        )
                 f.close()
 
             with repo.transaction(b'repair') as tr: