Client message reporting refactor.
[redakcja.git] / lib / wlrepo / mercurial_backend / revision.py
diff --git a/lib/wlrepo/mercurial_backend/revision.py b/lib/wlrepo/mercurial_backend/revision.py
new file mode 100644 (file)
index 0000000..f05637d
--- /dev/null
@@ -0,0 +1,103 @@
+# -*- encoding: utf-8 -*-
+
+__author__= "Ɓukasz Rekucki"
+__date__ = "$2009-10-20 12:31:48$"
+__doc__ = "Module documentation."
+
+import wlrepo
+from mercurial.node import nullid
+
+class MercurialRevision(wlrepo.Revision):
+    def __init__(self, lib, changectx):
+        super(MercurialRevision, self).__init__(lib)
+        self._changectx = changectx
+
+        branchname = self._changectx.branch()
+        if branchname.startswith("$doc:"):
+            self._docname = branchname[5:]
+            self._username = None
+        elif branchname.startswith("$user:"):
+            idx = branchname.find("$doc:")
+            if(idx < 0):
+                raise ValueError("Revision %s is not a valid document revision." % changectx.hex());
+            self._username = branchname[6:idx]
+            self._docname = branchname[idx+5:]
+        else:
+            raise ValueError("Revision %s is not a valid document revision." % changectx.hex());
+
+    @property
+    def document_name(self):
+        return self._docname and self._docname.decode('utf-8')
+
+    @property
+    def user_name(self):
+        return self._username and self._username.decode('utf-8')
+
+    def hgrev(self):
+        return self._changectx.node()
+
+    def hgcontext(self):
+        return self._changectx
+
+    def hgbranch(self):
+        return self._changectx.branch()
+
+    @property
+    def timestamp(self):
+        return self._changectx.date()[0]
+
+    def __unicode__(self):
+        return u"%s" % self._changectx.hex()
+
+    def __str__(self):
+        return self.__unicode__().encode('utf-8')
+
+    def __repr__(self):
+        return "%s" % self._changectx.hex()
+
+    def ancestorof(self, other):
+        nodes = list(other._changectx._parents)
+        while nodes[0].node() != nullid:
+            v = nodes.pop(0)
+            if v == self._changectx:
+                return True
+            nodes.extend( v._parents )
+        return False
+
+    def parentof(self, other):
+        return self._changectx in other._changectx._parents
+
+    def has_common_ancestor(self, other):
+        a = self._changectx.ancestor(other._changectx)
+        return (a.branch() == self._changectx.branch())
+
+    def has_children(self, limit_branch=False):
+        for child in self._changectx.children():
+            cbranch = child.branch()
+            if (not limit_branch) or (cbranch == self.hgbranch()):
+                return True
+        return False
+
+    def has_parent_from(self, rev):
+        branch = rev.hgbranch()        
+        for parent in self._changectx.parents():
+            if parent.branch() == branch:
+                return True            
+        return False
+
+    def merge_with(self, other, user, message):
+        message = self._library._sanitize_string(message)
+        lock = self._library.lock(True)
+        try:
+            self._library._checkout(self._changectx.node())
+            status = self._library._merge(other._changectx.node())
+            if status.isclean():
+                self._library._commit(user=user, message=message)
+                return True
+            else:
+                return False
+        finally:
+            lock.release()
+
+    def __eq__(self, other):
+        return self._changectx.node() == other._changectx.node()