# HG changeset patch # User Steve Losh # Date 1247617643 14400 # Node ID 894fbbeb6e6d2801360e5a7d03a794f81afcb155 # Parent 22b47bf907b84e7ceb33981f84cee2617a5b8264 Add {incoming} and {outgoing} keywords. These will be *slow*. diff -r 22b47bf907b8 -r 894fbbeb6e6d README --- a/README Tue Jul 14 07:41:39 2009 -0400 +++ b/README Tue Jul 14 20:27:23 2009 -0400 @@ -54,6 +54,10 @@ * **bookmark:** the current bookmark * **branch:** the current branch +* **incoming:** this keyword prints nothing on its own. If the default path contains incoming changesets the extra text will be expanded. For example: `{incoming changes{incoming}}` will expand to `incoming changes` if there are changes, or nothing otherwise. +* **incoming|count:** the number of incoming changesets if greater than 0 +* **outgoing:** this keyword prints nothing on its own. If the current repository contains outgoing changesets (to default) the extra text will be expanded. For example: `{outgoing changes{outgoing}}` will expand to `outgoing changes` if there are changes, or nothing otherwise. +* **outgoing|count:** the number of outgoing changesets if greater than 0 * **root:** the full path to the root of the current repository, without a trailing slash * **root|basename:** the directory name of the root of the current repository. For example, if the repository is in `/home/u/myrepo` then this keyword would expand to `myrepo`. * **status:** `!` if the repository has any changed/added/removed files, otherwise `?` if it has any untracked (but not ignored) files, otherwise nothing. diff -r 22b47bf907b8 -r 894fbbeb6e6d prompt.py --- a/prompt.py Tue Jul 14 07:41:39 2009 -0400 +++ b/prompt.py Tue Jul 14 20:27:23 2009 -0400 @@ -10,10 +10,9 @@ import re from os import path -from mercurial import extensions +from mercurial import extensions, hg, cmdutil -def _with_groups(m, out): - g = m.groups() +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 '', @@ -48,6 +47,18 @@ - bookmark: the current bookmark - branch: the current branch + - incoming: this keyword prints nothing on its own. If the default + path contains incoming changesets the extra text will be expanded. + For example: + '{incoming changes{incoming}}' will expand to + 'incoming changes' if there are changes, '' otherwise. + - incoming|count: the number of incoming changesets if greater than 0 + - outgoing: this keyword prints nothing on its own. If the current + repository contains outgoing changesets (to default) the extra text + will be expanded. For example: + '{outgoing changes{outgoing}}' will expand to + 'outgoing changes' if there are changes, '' otherwise. + - outgoing|count: the number of outgoing changesets if greater than 0 - root: the full path to the root of the current repository, without a trailing slash - root|basename: the directory name of the root of the current @@ -60,25 +71,62 @@ def _branch(m): branch = repo.dirstate.branch() - return _with_groups(m, branch) if branch else '' + return _with_groups(m.groups(), branch) if branch else '' def _status(m): st = repo.status(unknown=True)[:5] flag = '!' if any(st[:4]) else '?' if st[-1] else '' - return _with_groups(m, flag) if flag else '' + return _with_groups(m.groups(), flag) if flag else '' def _bookmark(m): try: book = extensions.find('bookmarks').current(repo) - return _with_groups(m, book) if book else '' + return _with_groups(m.groups(), book) if book else '' except KeyError: return '' def _root(m): - return _with_groups(m, repo.root) if repo.root else '' + return _with_groups(m.groups(), repo.root) if repo.root else '' def _basename(m): - return _with_groups(m, path.basename(repo.root)) if repo.root else '' + 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 '' + else: + output = _with_groups(out_g, '') if count else '' + return output + + 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 '' + else: + output = _with_groups(out_g, '') if count else '' + return output tag_start = r'\{([^{}]*?\{)?' tag_end = r'(\}[^{}]*?)?\}' @@ -88,6 +136,8 @@ 'bookmark': _bookmark, 'root': _root, 'root\|basename': _basename, + 'incoming(\|count)?': _incoming, + 'outgoing(\|count)?': _outgoing, } for tag, repl in patterns.items():