[PATCH 2 of 9 hglib] hglib: introduce a changeset class instead of using namedtuple

Idan Kamara idankk86 at gmail.com
Thu Jul 28 14:58:55 CDT 2011


# HG changeset patch
# User Idan Kamara <idankk86 at gmail.com>
# Date 1311450939 -10800
# Node ID ed6263fadf3c457582278b89d7eed0bbcf7b6f43
# Parent  248d1121db656af449298303f2dcba16e71421dc
hglib: introduce a changeset class instead of using namedtuple

so we can easily extend it, for our own __str__, __eq__ etc.

diff -r 248d1121db65 -r ed6263fadf3c hglib/hglib.py
--- a/hglib/hglib.py	Sat Jul 23 22:55:39 2011 +0300
+++ b/hglib/hglib.py	Sat Jul 23 22:55:39 2011 +0300
@@ -3,9 +3,46 @@
 
 HGPATH = 'hg'
 
-changeset = collections.namedtuple('changeset', 'rev, node, tags, '
-                                               'branch, author, desc')
+class changeset(object):
+    def __init__(self, rev, node, tags, branch, author, desc):
+        self.rev = rev
+        self.node = node
+        self.tags = tags
+        self.branch = branch
+        self.author = author
+        self.desc = desc
 
+    def __repr__(self):
+        s = '%s:%s' % (self.rev, self.node[:10])
+        s += ', branch=' + repr(self.branch)
+        if self.tags:
+            s += ', tags=' + repr(self.tags)
+        s += ', author=' + repr(self.author)
+        s += ', desc=' + repr(cStringIO.StringIO(self.desc).readline())
+
+        return '<changeset %s>' % s
+
+    def __str__(self):
+        return self.node
+
+    def __eq__(self, other):
+        return self.node == other.node
+
+    def __ne__(self, other):
+        return not self == other
+
+    @staticmethod
+    def fromtemplate(splitted):
+        """
+        splitted is a list of fields according to templates.changeset
+
+        >>> exp = [changeset('0', '1', '2', '3', '4', '5'), \
+                   changeset('6', '7', '8', '9', '10', '11')]
+        >>> exp == changeset.fromtemplate(['0', '1', '2', '3', '4', '5', \
+                                           '6', '7', '8', '9', '10', '11'])
+        True
+        """
+        return [changeset(*rev) for rev in util.grouper(6, splitted)]
 
 def connect(path=None, encoding=None, configs=None):
     ''' starts a cmdserver for the given path (or for a repository found in the
@@ -67,10 +104,6 @@
         else:
             return channel, self.server.stdout.read(length)
 
-    def _parsechangesets(self, splitted):
-        '''splitted is a list of fields according to templates.changeset'''
-        return [changeset._make(rev) for rev in util.grouper(6, splitted)]
-
     def runcommand(self, args, inchannels, outchannels):
         def writeblock(data):
             self.server.stdin.write(struct.pack(self.inputfmt, len(data)))
@@ -166,7 +199,7 @@
         out = self.outputruncommand(args)[1]
         out = out.split('\0')[:-1]
 
-        return self._parsechangesets(out)
+        return changeset.fromtemplate(out)
 
     def incoming(self, revrange=[], path=None):
         args = util.commandlinebuilder('incoming')
@@ -177,7 +210,7 @@
         ret, out, err = self.outputruncommand(args, raiseonerror=False)
         if not ret:
             out = util.eatlines(out, 2).split('\0')[:-1]
-            return self._parsechangesets(out)
+            return changeset.fromtemplate(out)
         elif ret == 1:
             return []
         else:
@@ -192,7 +225,7 @@
         ret, out, err = self.outputruncommand(args, raiseonerror=False)
         if not ret:
             out = util.eatlines(out, 2).split('\0')[:-1]
-            return self._parsechangesets(out)
+            return changeset.fromtemplate(out)
         elif ret == 1:
             return []
         else:
@@ -243,7 +276,7 @@
         out = self.outputruncommand(['tip'] + templates.changeset)[1]
         out = out.split('\0')
 
-        return self._parsechangesets(out)[0]
+        return changeset.fromtemplate(out)[0]
 
     def branch(self, name=None):
         if not name:


More information about the Mercurial-devel mailing list