[PATCH hglib] client: for loop over client (issue4511)
Axel Hecht
axel at mozilla.com
Wed Apr 6 13:50:54 UTC 2016
# HG changeset patch
# User Axel Hecht <axel at pike.org>
# Date 1442330828 -7200
# Tue Sep 15 17:27:08 2015 +0200
# Node ID 3478adf2394ad27a4b501c91bbdae8157f06dd10
# Parent 674bd25c2339aa4b2be714b8d763c93c8eb07b36
client: for loop over client (issue4511)
By mapping ValueError to IndexError in __getitem__, one can do
for changeset in repo:
pass
diff --git a/hglib/client.py b/hglib/client.py
--- a/hglib/client.py
+++ b/hglib/client.py
@@ -1,4 +1,4 @@
-import subprocess, os, struct, re, datetime
+import subprocess, os, struct, sys, re, datetime
import hglib
from hglib import error, util, templates, merge, context
@@ -1631,7 +1631,10 @@
return self._version
def __getitem__(self, changeid):
- return context.changectx(self, changeid)
+ try:
+ return context.changectx(self, changeid)
+ except ValueError as e:
+ raise IndexError(*e.args)
def __contains__(self, changeid):
"""
@@ -1643,3 +1646,12 @@
return True
except ValueError:
return False
+
+ def __iter__(self):
+ changeid = 0
+ while True:
+ try:
+ yield self[changeid]
+ except IndexError:
+ break
+ changeid += 1
diff --git a/tests/test-log.py b/tests/test-log.py
--- a/tests/test-log.py
+++ b/tests/test-log.py
@@ -20,6 +20,19 @@
self.assertEquals(self.client.log(), self.client.log(hidden=True))
+ def test_iterate(self):
+ self.append('a', 'a')
+ rev0, node0 = self.client.commit('first', addremove=True)
+ self.append('a', 'a')
+ rev1, node1 = self.client.commit('second')
+
+ revs = [commit for commit in self.client]
+
+ self.assertTrue(len(revs) == 2)
+ self.assertEquals(revs[1].node(), node1)
+
+ self.assertEquals(revs[0].node(), node0)
+
# def test_errors(self):
# self.assertRaisesRegexp(CommandError, 'abort: unknown revision',
# self.client.log, 'foo')
More information about the Mercurial-devel
mailing list