[PATCH RFC] ui: provide official way to reset internal state per command

Yuya Nishihara yuya at tcha.org
Sun Jun 12 01:31:15 EDT 2016

# HG changeset patch
# User Yuya Nishihara <yuya at tcha.org>
# Date 1465708046 -32400
#      Sun Jun 12 14:07:26 2016 +0900
# Node ID 58d3b0dd7f03e318fb534103b39bf93aeb4c03b1
# Parent  c27dc3c31222c7f74331221a3d25566146feecac
ui: provide official way to reset internal state per command

This will allow us to clear in-memory password storage per runcommand().

I've updated commandserver to call resetstate() of both ui and repo.ui because
they may have different states in theory.

diff --git a/mercurial/commandserver.py b/mercurial/commandserver.py
--- a/mercurial/commandserver.py
+++ b/mercurial/commandserver.py
@@ -229,12 +229,8 @@ class server(object):
             self.repo.ui = self.repo.dirstate._ui = repoui
-        # reset last-print time of progress bar per command
-        # (progbar is singleton, we don't have to do for all uis)
-        if copiedui._progbar:
-            copiedui._progbar.resetstate()
         for ui in uis:
+            ui.resetstate()
             # any kind of interaction must use server channels, but chg may
             # replace channels by fully functional tty files. so nontty is
             # enforced only if cin is a channel.
diff --git a/mercurial/ui.py b/mercurial/ui.py
--- a/mercurial/ui.py
+++ b/mercurial/ui.py
@@ -138,6 +138,11 @@ class ui(object):
     def copy(self):
         return self.__class__(self)
+    def resetstate(self):
+        """Clear internal state that shouldn't persist across commands"""
+        if self._progbar:
+            self._progbar.resetstate()  # reset last-print time of progress bar
     def formatter(self, topic, opts):
         return formatter.formatter(self, topic, opts)

More information about the Mercurial-devel mailing list