Merge branch 'master' into lqc-trunk
[redakcja.git] / lib / wlrepo / mercurial_backend / library.py
old mode 100644 (file)
new mode 100755 (executable)
index 042fda2..5e9b06e
@@ -1,5 +1,8 @@
 # -*- encoding: utf-8 -*-
 
 # -*- encoding: utf-8 -*-
 
+import logging
+log = logging.getLogger('ral.mercurial')
+
 __author__= "Łukasz Rekucki"
 __date__ = "$2009-09-25 09:33:02$"
 __doc__ = "Module documentation."
 __author__= "Łukasz Rekucki"
 __date__ = "$2009-09-25 09:33:02$"
 __doc__ = "Module documentation."
@@ -10,7 +13,7 @@ from mercurial import ui as hgui
 from mercurial import error
 import wlrepo
 
 from mercurial import error
 import wlrepo
 
-from wlrepo.mercurial_backend import MercurialRevision
+from wlrepo.mercurial_backend.revision import MercurialRevision
 from wlrepo.mercurial_backend.document import MercurialDocument
 
 class MergeStatus(object):
 from wlrepo.mercurial_backend.document import MercurialDocument
 
 class MergeStatus(object):
@@ -70,19 +73,18 @@ class MercurialLibrary(wlrepo.Library):
 
 
     def documents(self):
 
 
     def documents(self):
-        return [ key[5:] for key in \
+        return [ key[5:].decode('utf-8') for key in \
             self._hgrepo.branchmap() if key.startswith("$doc:") ]
 
     @property
     def ospath(self):
         return self._ospath.decode('utf-8')
 
             self._hgrepo.branchmap() if key.startswith("$doc:") ]
 
     @property
     def ospath(self):
         return self._ospath.decode('utf-8')
 
-    def document_for_rev(self, revision):
+    def document_for_revision(self, revision):
         if revision is None:
             raise ValueError("Revision can't be None.")
         
         if revision is None:
             raise ValueError("Revision can't be None.")
         
-        if not isinstance(revision, MercurialRevision):
-            revision = self._sanitize_string(unicode(revision))
+        if not isinstance(revision, MercurialRevision):            
             rev = self.get_revision(revision)
         else:
             rev = revision       
             rev = self.get_revision(revision)
         else:
             rev = revision       
@@ -93,23 +95,38 @@ class MercurialLibrary(wlrepo.Library):
         # every revision is a document
         return self._doccache[str(rev)]
 
         # every revision is a document
         return self._doccache[str(rev)]
 
-    def document(self, docid, user=None):       
-        return self.document_for_rev(self.fulldocid(docid, user))
+    def document(self, docid, user=None, rev=u'latest'):
+        rev = self._sanitize_string(rev)
+        
+        if rev != u'latest':
+            doc = self.document_for_revision(rev)
+
+            if doc.id != docid or (doc.owner != user):
+                raise wlrepo.RevisionMismatch(self.fulldocid(docid, user)+u'@'+unicode(rev))
+            
+            return doc
+        else:
+            return self.document_for_revision(self.fulldocid(docid, user))
 
     def get_revision(self, revid):
         revid = self._sanitize_string(revid)
 
 
     def get_revision(self, revid):
         revid = self._sanitize_string(revid)
 
-        try:
-            ctx = self._changectx(revid)
+        log.info("Looking up rev %r (%s)" %(revid, type(revid)) )
+
+        try:           
+            ctx = self._changectx( revid )
         except mercurial.error.RepoError, e:
             raise wlrepo.RevisionNotFound(revid)
 
         if ctx is None:
             raise wlrepo.RevisionNotFound(revid)
 
         except mercurial.error.RepoError, e:
             raise wlrepo.RevisionNotFound(revid)
 
         if ctx is None:
             raise wlrepo.RevisionNotFound(revid)
 
+        return self._revision(ctx)       
+
+    def _revision(self, ctx):
         if self._revcache.has_key(ctx):
             return self._revcache[ctx]
         if self._revcache.has_key(ctx):
             return self._revcache[ctx]
-
+        
         return MercurialRevision(self, ctx)
 
     def fulldocid(self, docid, user=None):                
         return MercurialRevision(self, ctx)
 
     def fulldocid(self, docid, user=None):                
@@ -119,16 +136,16 @@ class MercurialLibrary(wlrepo.Library):
         fulldocid += u'$doc:' + docid
         return fulldocid
 
         fulldocid += u'$doc:' + docid
         return fulldocid
 
-
     def has_revision(self, revid):
     def has_revision(self, revid):
+        revid = self._sanitize_string(revid)
+        
         try:
             self._hgrepo[revid]
             return True
         except mercurial.error.RepoError:
             return False
 
         try:
             self._hgrepo[revid]
             return True
         except mercurial.error.RepoError:
             return False
 
-    def document_create(self, docid):
-        
+    def document_create(self, docid):       
         
         # check if it already exists
         fullid = self.fulldocid(docid)
         
         # check if it already exists
         fullid = self.fulldocid(docid)
@@ -138,7 +155,7 @@ class MercurialLibrary(wlrepo.Library):
 
         # doesn't exist
         self._create_branch(self._sanitize_string(fullid))
 
         # doesn't exist
         self._create_branch(self._sanitize_string(fullid))
-        return self.document_for_rev(fullid)
+        return self.document_for_revision(fullid)
 
     #
     # Private methods
 
     #
     # Private methods
@@ -220,7 +237,7 @@ class MercurialLibrary(wlrepo.Library):
         name = self._sanitize_string(name)
         return self._hgrepo.branchtags()[name]    
 
         name = self._sanitize_string(name)
         return self._hgrepo.branchtags()[name]    
 
-    def _create_branch(self, name, parent=None, before_commit=None):
+    def _create_branch(self, name, parent=None, before_commit=None, message=None):
         name = self._sanitize_string(name)
 
         if self._has_branch(name): return # just exit
         name = self._sanitize_string(name)
 
         if self._has_branch(name): return # just exit
@@ -231,11 +248,16 @@ class MercurialLibrary(wlrepo.Library):
             parentrev = parent.hgrev()
 
         self._checkout(parentrev)
             parentrev = parent.hgrev()
 
         self._checkout(parentrev)
-        self._hgrepo.dirstate.setbranch(name)
+        self._set_branchname(name)
 
         if before_commit: before_commit(self)
 
 
         if before_commit: before_commit(self)
 
-        self._commit("$ADMN$ Initial commit for branch '%s'." % name, user='$library')        
+        message = message or "$ADMN$ Initial commit for branch '%s'." % name
+        self._commit(message, user='$library')
+
+    def _set_branchname(self, name):
+        name = self._sanitize_string(name)
+        self._hgrepo.dirstate.setbranch(name)
 
     def _switch_to_branch(self, branchname):
         current = self._hgrepo[None].branch()
 
     def _switch_to_branch(self, branchname):
         current = self._hgrepo[None].branch()