# HG changeset patch # User Steve Losh # Date 1247622256 14400 # Node ID d7e61ff5ecedca6d359998f57463ac759932440c # Parent 08dbee2124eeb46f40d3844b3706ae1c7e388ad7 Refactor {incoming} to use a cache. diff -r 08dbee2124ee -r d7e61ff5eced prompt.py --- a/prompt.py Tue Jul 14 20:28:50 2009 -0400 +++ b/prompt.py Tue Jul 14 21:44:16 2009 -0400 @@ -9,16 +9,20 @@ ''' import re +import os +import subprocess from os import path from mercurial import extensions, hg, cmdutil +CACHE_PATH = ".hg/prompt/cache" + def _with_groups(g, out): if any(g) and not all(g): print 'ERROR' return ("%s" + out + "%s") % (g[0][:-1] if g[0] else '', g[1][1:] if g[1] else '') -def prompt(ui, repo, fs): +def prompt(ui, repo, fs='', **opts): '''get repository information for use in a shell prompt Take a string and output it for use in a shell prompt. You can use @@ -92,41 +96,38 @@ return _with_groups(m.groups(), path.basename(repo.root)) if repo.root else '' def _incoming(m): - source = "default" - ui.quiet = True - - source, revs, checkout = hg.parseurl(ui.expandpath(source)) - other = hg.repository(cmdutil.remoteui(repo, {}), source) - o = other.changelog.nodesbetween(repo.findincoming(other), revs)[0] - count = len(o) if o else 0 - - ui.quiet = False g = m.groups() out_g = (g[0],) + (g[-1],) - if g[1]: - output = _with_groups(out_g, str(count)) if count else '' + + cache = path.join(repo.root, CACHE_PATH, 'incoming') + cache_out = cache + '.out' + + subprocess.Popen(['hg', 'prompt', '--cache-incoming']) + + if path.isfile(cache): + with open(cache) as c: + count = len(c.readlines()) + if g[1]: + return _with_groups(out_g, str(count)) if count else '' + else: + return _with_groups(out_g, '') if count else '' else: - output = _with_groups(out_g, '') if count else '' - return output + return '' def _outgoing(m): - dest = "default" - ui.quiet = True - - dest, revs, checkout = hg.parseurl( - ui.expandpath(dest or 'default-push', dest or 'default')) - other = hg.repository(cmdutil.remoteui(repo, {}), dest) - o = repo.changelog.nodesbetween(repo.findoutgoing(other), revs)[0] - count = len(o) if o else 0 - - ui.quiet = False g = m.groups() out_g = (g[0],) + (g[-1],) - if g[1]: - output = _with_groups(out_g, str(count)) if count else '' + + cache = path.join(repo.root, CACHE_PATH, 'outgoing') + if path.isfile(cache): + with open(cache) as c: + count = c.readline().strip() + if g[1]: + return _with_groups(out_g, count) if int(count) else '' + else: + return _with_groups(out_g, '') if int(count) else '' else: - output = _with_groups(out_g, '') if count else '' - return output + return '' tag_start = r'\{([^{}]*?\{)?' tag_end = r'(\}[^{}]*?)?\}' @@ -140,10 +141,22 @@ 'outgoing(\|count)?': _outgoing, } + if opts.get("cache_incoming"): + cache = path.join(repo.root, CACHE_PATH, 'incoming') + c_tmp = cache + '.temp' + subprocess.call(['hg', 'incoming', '--quiet'], stdout=file(c_tmp, 'w')) + os.rename(c_tmp, cache) + return + for tag, repl in patterns.items(): fs = re.sub(tag_start + tag + tag_end, repl, fs) ui.status(fs) cmdtable = { - "prompt": (prompt, [], 'hg prompt STRING') + "prompt": + (prompt, [ + ('', 'cache-incoming', None, 'used internally by hg-prompt'), + ('', 'cache-outgoing', None, 'used internally by hg-prompt'), + ], + 'hg prompt STRING') } \ No newline at end of file