--- a/hgext/keyword.py Wed Jul 06 13:43:29 2011 -0500
+++ b/hgext/keyword.py Wed Jul 06 19:25:53 2011 -0500
@@ -322,11 +322,11 @@
text = self.kwt.shrink(self.path, text)
return super(kwfilelog, self).cmp(node, text)
-def _status(ui, repo, kwt, *pats, **opts):
+def _status(ui, repo, wctx, kwt, *pats, **opts):
'''Bails out if [keyword] configuration is not active.
Returns status of working directory.'''
if kwt:
- return repo.status(match=scmutil.match(repo[None], pats, opts), clean=True,
+ return repo.status(match=scmutil.match(wctx, pats, opts), clean=True,
unknown=opts.get('unknown') or opts.get('all'))
if ui.configitems('keyword'):
raise util.Abort(_('[keyword] patterns cannot match'))
@@ -340,7 +340,7 @@
kwt = kwtools['templater']
wlock = repo.wlock()
try:
- status = _status(ui, repo, kwt, *pats, **opts)
+ status = _status(ui, repo, wctx, kwt, *pats, **opts)
modified, added, removed, deleted, unknown, ignored, clean = status
if modified or added or removed or deleted:
raise util.Abort(_('outstanding uncommitted changes'))
@@ -475,13 +475,13 @@
i = ignored (not tracked)
'''
kwt = kwtools['templater']
- status = _status(ui, repo, kwt, *pats, **opts)
+ wctx = repo[None]
+ status = _status(ui, repo, wctx, kwt, *pats, **opts)
cwd = pats and repo.getcwd() or ''
modified, added, removed, deleted, unknown, ignored, clean = status
files = []
if not opts.get('unknown') or opts.get('all'):
files = sorted(modified + added + clean)
- wctx = repo[None]
kwfiles = kwt.iskwfile(files, wctx)
kwdeleted = kwt.iskwfile(deleted, wctx)
kwunknown = kwt.iskwfile(unknown, wctx)
--- a/hgext/progress.py Wed Jul 06 13:43:29 2011 -0500
+++ b/hgext/progress.py Wed Jul 06 19:25:53 2011 -0500
@@ -27,6 +27,9 @@
[progress]
delay = 3 # number of seconds (float) before showing the progress bar
+ changedelay = 1 # changedelay: minimum delay before showing a new topic.
+ # If set to less than 3 * refresh, that value will
+ # be used instead.
refresh = 0.1 # time in seconds between refreshes of the progress bar
format = topic bar number estimate # format of the progress bar
width = <none> # if set, the maximum width of the progress information
@@ -53,7 +56,7 @@
return ' '.join(s for s in args if s)
def shouldprint(ui):
- return (util.isatty(sys.stderr) or ui.configbool('progress', 'assume-tty'))
+ return util.isatty(sys.stderr) or ui.configbool('progress', 'assume-tty')
def fmtremaining(seconds):
if seconds < 60:
@@ -105,9 +108,13 @@
self.printed = False
self.lastprint = time.time() + float(self.ui.config(
'progress', 'delay', default=3))
+ self.lasttopic = None
self.indetcount = 0
self.refresh = float(self.ui.config(
'progress', 'refresh', default=0.1))
+ self.changedelay = max(3 * self.refresh,
+ float(self.ui.config(
+ 'progress', 'changedelay', default=1)))
self.order = self.ui.configlist(
'progress', 'format',
default=['topic', 'bar', 'number', 'estimate'])
@@ -184,6 +191,7 @@
else:
out = spacejoin(head, tail)
sys.stderr.write('\r' + out[:termwidth])
+ self.lasttopic = topic
sys.stderr.flush()
def clear(self):
@@ -248,10 +256,18 @@
self.topics.append(topic)
self.topicstates[topic] = pos, item, unit, total
if now - self.lastprint >= self.refresh and self.topics:
- self.lastprint = now
- self.show(now, topic, *self.topicstates[topic])
+ if (self.lasttopic is None # first time we printed
+ # not a topic change
+ or topic == self.lasttopic
+ # it's been long enough we should print anyway
+ or now - self.lastprint >= self.changedelay):
+ self.lastprint = now
+ self.show(now, topic, *self.topicstates[topic])
+
+_singleton = None
def uisetup(ui):
+ global _singleton
class progressui(ui.__class__):
_progbar = None
@@ -278,7 +294,9 @@
# we instantiate one globally shared progress bar to avoid
# competing progress bars when multiple UI objects get created
if not progressui._progbar:
- progressui._progbar = progbar(ui)
+ if _singleton is None:
+ _singleton = progbar(ui)
+ progressui._progbar = _singleton
def reposetup(ui, repo):
uisetup(repo.ui)
--- a/mercurial/commands.py Wed Jul 06 13:43:29 2011 -0500
+++ b/mercurial/commands.py Wed Jul 06 19:25:53 2011 -0500
@@ -3587,7 +3587,7 @@
try:
# ui.forcemerge is an internal variable, do not document
- ui.setconfig('ui', 'forcemerge', opts.get('tool', ''))
+ repo.ui.setconfig('ui', 'forcemerge', opts.get('tool', ''))
return hg.merge(repo, node, force=opts.get('force'))
finally:
ui.setconfig('ui', 'forcemerge', '')
--- a/mercurial/hg.py Wed Jul 06 13:43:29 2011 -0500
+++ b/mercurial/hg.py Wed Jul 06 19:25:53 2011 -0500
@@ -98,9 +98,9 @@
hook(ui, repo)
return repo
-def peer(ui, opts, path, create=False):
+def peer(uiorrepo, opts, path, create=False):
'''return a repository peer for the specified path'''
- rui = remoteui(ui, opts)
+ rui = remoteui(uiorrepo, opts)
return repository(rui, path, create)
def defaultdest(source):
--- a/tests/test-convert-svn-move.t Wed Jul 06 13:43:29 2011 -0500
+++ b/tests/test-convert-svn-move.t Wed Jul 06 19:25:53 2011 -0500
@@ -167,6 +167,7 @@
> [progress]
> assume-tty = 1
> delay = 0
+ > changedelay = 0
> format = topic bar number
> refresh = 0
> width = 60
--- a/tests/test-progress.t Wed Jul 06 13:43:29 2011 -0500
+++ b/tests/test-progress.t Wed Jul 06 19:25:53 2011 -0500
@@ -9,16 +9,28 @@
> total = loops
> if opts.get('total', None):
> total = int(opts.get('total'))
+ > nested = False
+ > if opts.get('nested', None):
+ > nested = True
> loops = abs(loops)
>
> for i in range(loops):
> ui.progress('loop', i, 'loop.%d' % i, 'loopnum', total)
+ > if opts.get('parallel'):
+ > ui.progress('other', i, 'other.%d' % i, 'othernum', total)
+ > if nested:
+ > for j in range(2):
+ > ui.progress('nested', j, 'nested.%d' % j, 'nestnum', 2)
+ > ui.progress('nested', None, 'nested.done', 'nestnum', 2)
> ui.progress('loop', None, 'loop.done', 'loopnum', total)
>
> commands.norepo += " loop"
>
> cmdtable = {
- > "loop": (loop, [('', 'total', '', 'override for total')],
+ > "loop": (loop, [('', 'total', '', 'override for total'),
+ > ('', 'nested', False, 'show nested results'),
+ > ('', 'parallel', False, 'show parallel sets of results'),
+ > ],
> 'hg loop LOOPS'),
> }
> EOF
@@ -47,6 +59,42 @@
loop [===============================> ] 2/3
\r (esc)
+
+test nested short-lived topics (which shouldn't display with nestdelay):
+
+ $ hg -y loop 3 --nested 2>&1 | \
+ > python $TESTDIR/filtercr.py
+
+ loop [ ] 0/3
+ loop [===============> ] 1/3
+ loop [===============================> ] 2/3
+ \r (esc)
+
+
+ $ hg --config progress.changedelay=0 -y loop 3 --nested 2>&1 | \
+ > python $TESTDIR/filtercr.py
+
+ loop [ ] 0/3
+ nested [ ] 0/2
+ nested [======================> ] 1/2
+ loop [===============> ] 1/3
+ nested [ ] 0/2
+ nested [======================> ] 1/2
+ loop [===============================> ] 2/3
+ nested [ ] 0/2
+ nested [======================> ] 1/2
+ \r (esc)
+
+
+test two topics being printed in parallel (as when we're doing a local
+--pull clone, where you get the unbundle and bundle progress at the
+same time):
+ $ hg loop 3 --parallel 2>&1 | python $TESTDIR/filtercr.py
+
+ loop [ ] 0/3
+ loop [===============> ] 1/3
+ loop [===============================> ] 2/3
+ \r (esc)
test refresh is taken in account
$ hg -y --config progress.refresh=100 loop 3 2>&1 | $TESTDIR/filtercr.py