Mercurial > python-hglib
changeset 51:c52383a550fb
client: add summary command
author | Idan Kamara <idankk86@gmail.com> |
---|---|
date | Thu, 18 Aug 2011 16:23:43 +0300 |
parents | bd7dfd94b0d9 |
children | 18f72b255553 |
files | hglib/client.py tests/test-summary.py |
diffstat | 2 files changed, 187 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/hglib/client.py Thu Aug 18 16:20:23 2011 +0300 +++ b/hglib/client.py Thu Aug 18 16:23:43 2011 +0300 @@ -640,6 +640,86 @@ t.append((name.rstrip(), int(rev), node, taglocal)) return t + def summary(self, remote=False): + """ + Return a dictionary with a brief summary of the working directory state, + including parents, branch, commit status, and available updates. + + 'parent' : a list of (rev, node, tags, message) + 'branch' : the current branch + 'commit' : True if the working directory is clean, False otherwise + 'update' : number of available updates, + ['remote' : (in, in bookmarks, out, out bookmarks),] + ['mq': (applied, unapplied) mq patches,] + + unparsed entries will be of them form key : value + """ + args = cmdbuilder('summary', remote=remote) + + out = self.rawcommand(args).splitlines() + + d = {} + while out: + line = out.pop(0) + name, value = line.split(': ', 1) + + if name == 'parent': + parent, tags = value.split(' ', 1) + rev, node = parent.split(':') + + if tags: + tags = tags.replace(' (empty repository)', '') + else: + tags = None + + value = d.get(name, []) + + if rev == '-1': + value.append((int(rev), node, tags, None)) + else: + message = out.pop(0)[1:] + value.append((int(rev), node, tags, message)) + elif name == 'branch': + pass + elif name == 'commit': + value = value == '(clean)' + elif name == 'update': + if value == '(current)': + value = 0 + else: + value = int(value.split(' ', 1)[0]) + elif remote and name == 'remote': + if value == '(synced)': + value = 0, 0, 0, 0 + else: + inc = incb = out_ = outb = 0 + + for v in value.split(', '): + count, v = v.split(' ', 1) + if v == 'outgoing': + out_ = int(count) + elif v.endswith('incoming'): + inc = int(count) + elif v == 'incoming bookmarks': + incb = int(count) + elif v == 'outgoing bookmarks': + outb = int(count) + + value = inc, incb, out_, outb + elif name == 'mq': + applied = unapplied = 0 + for v in value.split(', '): + count, v = v.split(' ', 1) + if v == 'applied': + applied = int(count) + elif v == 'unapplied': + unapplied = int(count) + value = applied, unapplied + + d[name] = value + + return d + def tip(self): args = cmdbuilder('tip', template=templates.changeset) out = self.rawcommand(args)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/test-summary.py Thu Aug 18 16:23:43 2011 +0300 @@ -0,0 +1,107 @@ +import common +import hglib + +class test_summary(common.basetest): + def test_empty(self): + d = {'parent' : [(-1, '000000000000', 'tip', None)], + 'branch' : 'default', + 'commit' : True, + 'update' : 0} + + self.assertEquals(self.client.summary(), d) + + def test_basic(self): + self.append('a', 'a') + rev, node = self.client.commit('first', addremove=True) + + d = {'parent' : [(0, node[:12], 'tip', 'first')], + 'branch' : 'default', + 'commit' : True, + 'update' : 0} + + self.assertEquals(self.client.summary(), d) + + def test_commit_dirty(self): + self.append('a', 'a') + rev, node = self.client.commit('first', addremove=True) + self.append('a', 'a') + + d = {'parent' : [(0, node[:12], 'tip', 'first')], + 'branch' : 'default', + 'commit' : False, + 'update' : 0} + + self.assertEquals(self.client.summary(), d) + + def test_update(self): + self.append('a', 'a') + rev, node = self.client.commit('first', addremove=True) + self.append('a', 'a') + self.client.commit('second') + self.client.update(0) + + d = {'parent' : [(0, node[:12], None, 'first')], + 'branch' : 'default', + 'commit' : True, + 'update' : 1} + + self.assertEquals(self.client.summary(), d) + + def test_remote(self): + self.append('a', 'a') + rev, node = self.client.commit('first', addremove=True) + + self.client.clone(dest='other') + other = hglib.open('other') + + d = {'parent' : [(0, node[:12], 'tip', 'first')], + 'branch' : 'default', + 'commit' : True, + 'update' : 0, + 'remote' : (0, 0, 0, 0)} + + self.assertEquals(other.summary(remote=True), d) + + self.append('a', 'a') + self.client.commit('second') + + d['remote'] = (1, 0, 0, 0) + self.assertEquals(other.summary(remote=True), d) + + self.client.bookmark('bm') + d['remote'] = (1, 1, 0, 0) + self.assertEquals(other.summary(remote=True), d) + + other.bookmark('bmother') + d['remote'] = (1, 1, 0, 1) + d['parent'] = [(0, node[:12], 'tip bmother', 'first')] + self.assertEquals(other.summary(remote=True), d) + + self.append('other/a', 'a') + rev, node = other.commit('second in other') + + d['remote'] = (1, 1, 1, 1) + d['parent'] = [(1, node[:12], 'tip bmother', 'second in other')] + + self.assertEquals(other.summary(remote=True), d) + + def test_two_parents(self): + self.append('a', 'a') + rev0, node = self.client.commit('first', addremove=True) + + self.append('a', 'a') + rev1, node1 = self.client.commit('second') + + self.client.update(rev0) + self.append('b', 'a') + rev2, node2 = self.client.commit('third', addremove=True) + + self.client.merge(rev1) + + d = {'parent' : [(2, node2[:12], 'tip', 'third'), + (1, node1[:12], None, 'second')], + 'branch' : 'default', + 'commit' : False, + 'update' : 0} + + self.assertEquals(self.client.summary(), d)