[PATCH 1 of 3] progress: move from extension to core
Martin Geisler
mrtn.gslr at gmail.com
Sat May 12 09:39:46 CDT 2012
# HG changeset patch
# User Martin Geisler <martin at geisler.net>
# Date 1336829943 -7200
# Node ID bd17c94b246bb7b4b8cfec24e491310bd54e3f8b
# Parent 654b9e1966f76d38b11fbd1d518efce5d58caa88
progress: move from extension to core
The old progress extension is now ignored, so people can keep loading
it in their existing config.
This also somehow fixed a problem with doubled progress bars: two
progress bars would be printed, though they had the same information.
This was therefore not visible in normal usage, it only showed up in
the test suite.
diff --git a/mercurial/extensions.py b/mercurial/extensions.py
--- a/mercurial/extensions.py
+++ b/mercurial/extensions.py
@@ -11,7 +11,7 @@
_extensions = {}
_order = []
-_ignore = ['hbisect', 'bookmarks', 'parentrevspec']
+_ignore = ['hbisect', 'bookmarks', 'parentrevspec', 'progress']
def extensions():
for name in _order:
diff --git a/hgext/progress.py b/mercurial/progress.py
rename from hgext/progress.py
rename to mercurial/progress.py
--- a/hgext/progress.py
+++ b/mercurial/progress.py
@@ -38,14 +38,16 @@
import sys
import time
-from mercurial import util
-from mercurial.i18n import _
+import util
+from i18n import _
def spacejoin(*args):
return ' '.join(s for s in args if s)
def shouldprint(ui):
- return util.isatty(sys.stderr) or ui.configbool('progress', 'assume-tty')
+ return (not ui.configbool('progress', 'disabled')
+ and (util.isatty(sys.stderr)
+ or ui.configbool('progress', 'assume-tty')))
def fmtremaining(seconds):
if seconds < 60:
@@ -255,41 +257,9 @@
_singleton = None
-def uisetup(ui):
+def progressbar(ui):
+ """return the singleton progressbar"""
global _singleton
- class progressui(ui.__class__):
- _progbar = None
-
- def _quiet(self):
- return self.debugflag or self.quiet
-
- def progress(self, *args, **opts):
- if not self._quiet():
- self._progbar.progress(*args, **opts)
- return super(progressui, self).progress(*args, **opts)
-
- def write(self, *args, **opts):
- if not self._quiet() and self._progbar.printed:
- self._progbar.clear()
- return super(progressui, self).write(*args, **opts)
-
- def write_err(self, *args, **opts):
- if not self._quiet() and self._progbar.printed:
- self._progbar.clear()
- return super(progressui, self).write_err(*args, **opts)
-
- # Apps that derive a class from ui.ui() can use
- # setconfig('progress', 'disable', 'True') to disable this extension
- if ui.configbool('progress', 'disable'):
- return
- if shouldprint(ui) and not ui.debugflag and not ui.quiet:
- ui.__class__ = progressui
- # we instantiate one globally shared progress bar to avoid
- # competing progress bars when multiple UI objects get created
- if not progressui._progbar:
- if _singleton is None:
- _singleton = progbar(ui)
- progressui._progbar = _singleton
-
-def reposetup(ui, repo):
- uisetup(repo.ui)
+ if _singleton is None:
+ _singleton = progbar(ui)
+ return _singleton
diff --git a/mercurial/ui.py b/mercurial/ui.py
--- a/mercurial/ui.py
+++ b/mercurial/ui.py
@@ -7,7 +7,7 @@
from i18n import _
import errno, getpass, os, socket, sys, tempfile, traceback
-import config, scmutil, util, error, formatter
+import config, scmutil, util, error, formatter, progress
class ui(object):
def __init__(self, src=None):
@@ -19,6 +19,7 @@
self._ucfg = config.config() # untrusted
self._trustusers = set()
self._trustgroups = set()
+ self._progbar = progress.progressbar(self)
if src:
self.fout = src.fout
@@ -145,6 +146,9 @@
self._trustusers.update(self.configlist('trusted', 'users'))
self._trustgroups.update(self.configlist('trusted', 'groups'))
+ if section in (None, 'progress'):
+ self._progbar.resetstate()
+
def backupconfig(self, section, item):
return (self._ocfg.backup(section, item),
self._tcfg.backup(section, item),
@@ -466,6 +470,8 @@
"cmdname.type" is recommended. For example, status issues
a label of "status.modified" for modified files.
'''
+ if not self._quiet() and self._progbar.printed:
+ self._progbar.clear()
if self._buffers:
self._buffers[-1].extend([str(a) for a in args])
else:
@@ -473,6 +479,8 @@
self.fout.write(str(a))
def write_err(self, *args, **opts):
+ if not self._quiet() and self._progbar.printed:
+ self._progbar.clear()
try:
if not getattr(self.fout, 'closed', False):
self.fout.flush()
@@ -699,6 +707,9 @@
os.environ.get("VISUAL") or
os.environ.get("EDITOR", editor))
+ def _quiet(self):
+ return self.debugflag or self.quiet
+
def progress(self, topic, pos, item="", unit="", total=None):
'''show a progress message
@@ -715,6 +726,8 @@
All topics should be marked closed by setting pos to None at
termination.
'''
+ if not self._quiet():
+ self._progbar.progress(topic, pos, item, unit, total)
if pos is None or not self.debugflag:
return
diff --git a/tests/test-archive.t b/tests/test-archive.t
--- a/tests/test-archive.t
+++ b/tests/test-archive.t
@@ -224,14 +224,9 @@
$ hg archive ../with-progress 2>&1 | "$TESTDIR/filtercr.py"
archiving [ ] 0/4
- archiving [ ] 0/4
- archiving [=========> ] 1/4
archiving [=========> ] 1/4
archiving [====================> ] 2/4
- archiving [====================> ] 2/4
archiving [===============================> ] 3/4
- archiving [===============================> ] 3/4
- archiving [==========================================>] 4/4
archiving [==========================================>] 4/4
\r (esc)
diff --git a/tests/test-debugbuilddag.t b/tests/test-debugbuilddag.t
--- a/tests/test-debugbuilddag.t
+++ b/tests/test-debugbuilddag.t
@@ -13,37 +13,20 @@
building [ ] 0/12
building [ ] 0/12
- building [ ] 0/12
- building [ ] 0/12
- building [==> ] 1/12
- building [==> ] 1/12
building [==> ] 1/12
building [==> ] 1/12
building [======> ] 2/12
- building [======> ] 2/12
- building [=========> ] 3/12
building [=========> ] 3/12
building [=============> ] 4/12
building [=============> ] 4/12
building [=============> ] 4/12
- building [=============> ] 4/12
- building [=============> ] 4/12
- building [=============> ] 4/12
- building [================> ] 5/12
building [================> ] 5/12
building [====================> ] 6/12
- building [====================> ] 6/12
- building [=======================> ] 7/12
building [=======================> ] 7/12
building [===========================> ] 8/12
building [===========================> ] 8/12
- building [===========================> ] 8/12
- building [===========================> ] 8/12
- building [==============================> ] 9/12
building [==============================> ] 9/12
building [==================================> ] 10/12
- building [==================================> ] 10/12
- building [=====================================> ] 11/12
building [=====================================> ] 11/12
\r (esc)
diff --git a/tests/test-patchbomb.t b/tests/test-patchbomb.t
--- a/tests/test-patchbomb.t
+++ b/tests/test-patchbomb.t
@@ -162,14 +162,9 @@
sending [ ] 0/3
- sending [ ] 0/3
-
sending [==============> ] 1/3
- sending [==============> ] 1/3
-
- sending [=============================> ] 2/3
sending [=============================> ] 2/3
\r (esc)
Sending [PATCH 0 of 2] test ...
diff --git a/tests/test-progress.t b/tests/test-progress.t
--- a/tests/test-progress.t
+++ b/tests/test-progress.t
@@ -37,7 +37,6 @@
$ cp $HGRCPATH $HGRCPATH.orig
$ echo "[extensions]" >> $HGRCPATH
- $ echo "progress=" >> $HGRCPATH
$ echo "loop=`pwd`/loop.py" >> $HGRCPATH
$ echo "[progress]" >> $HGRCPATH
$ echo "format = topic bar number" >> $HGRCPATH
@@ -161,12 +160,14 @@
>
> def uisetup(ui):
> time.time = mocktime(int(os.environ.get('MOCKTIME', '11')))
+ > # The extension is loaded after time.time() is called by the
+ > # progessbar, so we need to reset it again.
+ > ui._progbar.resetstate()
> EOF
$ cp $HGRCPATH.orig $HGRCPATH
$ echo "[extensions]" >> $HGRCPATH
$ echo "mocktime=`pwd`/mocktime.py" >> $HGRCPATH
- $ echo "progress=" >> $HGRCPATH
$ echo "loop=`pwd`/loop.py" >> $HGRCPATH
$ echo "[progress]" >> $HGRCPATH
$ echo "assume-tty=1" >> $HGRCPATH
diff --git a/tests/test-subrepo-recursion.t b/tests/test-subrepo-recursion.t
--- a/tests/test-subrepo-recursion.t
+++ b/tests/test-subrepo-recursion.t
@@ -257,32 +257,21 @@
> width = 60
> EOF
-Test archiving to a directory tree (the doubled lines in the output
-only show up in the test output, not in real usage):
+Test archiving to a directory tree:
$ hg archive --subrepos ../archive 2>&1 | "$TESTDIR/filtercr.py"
archiving [ ] 0/3
- archiving [ ] 0/3
- archiving [=============> ] 1/3
archiving [=============> ] 1/3
archiving [===========================> ] 2/3
- archiving [===========================> ] 2/3
- archiving [==========================================>] 3/3
archiving [==========================================>] 3/3
archiving (foo) [ ] 0/3
- archiving (foo) [ ] 0/3
- archiving (foo) [===========> ] 1/3
archiving (foo) [===========> ] 1/3
archiving (foo) [=======================> ] 2/3
- archiving (foo) [=======================> ] 2/3
- archiving (foo) [====================================>] 3/3
archiving (foo) [====================================>] 3/3
archiving (foo/bar) [ ] 0/1 (glob)
- archiving (foo/bar) [ ] 0/1 (glob)
- archiving (foo/bar) [================================>] 1/1 (glob)
archiving (foo/bar) [================================>] 1/1 (glob)
\r (esc)
$ find ../archive | sort
@@ -303,26 +292,16 @@
$ hg archive --subrepos ../archive.zip 2>&1 | "$TESTDIR/filtercr.py"
archiving [ ] 0/3
- archiving [ ] 0/3
- archiving [=============> ] 1/3
archiving [=============> ] 1/3
archiving [===========================> ] 2/3
- archiving [===========================> ] 2/3
- archiving [==========================================>] 3/3
archiving [==========================================>] 3/3
archiving (foo) [ ] 0/3
- archiving (foo) [ ] 0/3
- archiving (foo) [===========> ] 1/3
archiving (foo) [===========> ] 1/3
archiving (foo) [=======================> ] 2/3
- archiving (foo) [=======================> ] 2/3
- archiving (foo) [====================================>] 3/3
archiving (foo) [====================================>] 3/3
archiving (foo/bar) [ ] 0/1 (glob)
- archiving (foo/bar) [ ] 0/1 (glob)
- archiving (foo/bar) [================================>] 1/1 (glob)
archiving (foo/bar) [================================>] 1/1 (glob)
\r (esc)
@@ -334,26 +313,16 @@
$ hg archive --subrepos -r tip ../archive.tar.gz 2>&1 | "$TESTDIR/filtercr.py"
archiving [ ] 0/3
- archiving [ ] 0/3
- archiving [=============> ] 1/3
archiving [=============> ] 1/3
archiving [===========================> ] 2/3
- archiving [===========================> ] 2/3
- archiving [==========================================>] 3/3
archiving [==========================================>] 3/3
archiving (foo) [ ] 0/3
- archiving (foo) [ ] 0/3
- archiving (foo) [===========> ] 1/3
archiving (foo) [===========> ] 1/3
archiving (foo) [=======================> ] 2/3
- archiving (foo) [=======================> ] 2/3
- archiving (foo) [====================================>] 3/3
archiving (foo) [====================================>] 3/3
archiving (foo/bar) [ ] 0/1 (glob)
- archiving (foo/bar) [ ] 0/1 (glob)
- archiving (foo/bar) [================================>] 1/1 (glob)
archiving (foo/bar) [================================>] 1/1 (glob)
cloning subrepo foo from $TESTTMP/repo/foo
More information about the Mercurial-devel
mailing list