1 # -*- encoding: utf-8 -*-
 
   3 __author__ = "Ćukasz Rekucki"
 
   4 __date__ = "$2009-09-25 09:35:06$"
 
   5 __doc__ = "Module documentation."
 
   9 class MercurialDocument(wlrepo.Document):
 
  11     def data(self, entry):
 
  12         path = self._revision._docname + '.' + entry            
 
  13         return self._library._filectx(path, \
 
  14             self._revision.hgrev()).data()   
 
  16     def quickwrite(self, entry, data, msg, user=None):
 
  17         user = user or self.owner
 
  19             raise ValueError("Can't determine user.")
 
  22             f = l._fileopen(r(entry), "w+")
 
  27         return self.invoke_and_commit(write, lambda d: (msg, user))
 
  29     def invoke_and_commit(self, ops,
 
  30             before_commit, rollback=False):
 
  31         lock = self._library.lock()
 
  33             self._library._checkout(self._revision.hgrev())
 
  35             def entry_path(entry):
 
  36                 return self.id + '.' + entry
 
  38             ops(self._library, entry_path)
 
  39             message, user = before_commit(self)            
 
  40             self._library._commit(message, user)
 
  41             return self._library.document(docid=self.id, user=self.owner)       
 
  45     # def commit(self, message, user):
 
  46     #    """Make a new commit."""
 
  47     #    self.invoke_and_commit(message, user, lambda *a: True)
 
  50         return self._revision.user_name() is None
 
  56         return self._library.document(docid=self.id)
 
  59         return self._library.document(docid=self.id, user=self.owner)
 
  62         fullid = self._library.fulldocid(self.id, user)
 
  64         def take_action(library, resolve):
 
  66             library._create_branch(fullid, parent=self._revision)            
 
  68         if not self._library.has_revision(fullid):
 
  69             self.invoke_and_commit(take_action, \
 
  70                 lambda d: ("$AUTO$ File checkout.", user) )
 
  72         return self._library.document_for_rev(fullid)
 
  74     def update(self, user):
 
  75         """Update parts of the document."""
 
  76         lock = self.library.lock()
 
  79                 # main revision of the document
 
  82             if self._revision.has_children():
 
  83                 # can't update non-latest revision
 
  88             if not sv.ancestorof(self) and not self.parentof(sv):
 
  89                 return self._revision.merge_with(sv._revision, user=user)
 
  95     def share(self, message):
 
  96         lock = self.library.lock()
 
  99                 return (True, False) # always shared
 
 101             user = self._revision.user_name()
 
 102             main = self.shared()._revision
 
 103             local = self._revision            
 
 108             #         * <- can also be here!
 
 113             # The local branch has been recently updated,
 
 114             # so we don't need to update yet again, but we need to
 
 115             # merge down to default branch, even if there was
 
 116             # no commit's since last update
 
 118             if main.ancestorof(local):
 
 120                 success, changed = main.merge_with(local, user=user, message=message)                
 
 129             # Default has no changes, to update from this branch
 
 130             # since the last merge of local to default.
 
 131             elif local.has_common_ancestor(main):
 
 133                 if not local.parentof(main):
 
 134                     success, changed = main.merge_with(local, user=user, message=message)
 
 139             #      * <- this case overlaps with previos one
 
 145             # There was a recent merge to the defaul branch and
 
 146             # no changes to local branch recently.
 
 148             # Use the fact, that user is prepared to see changes, to
 
 149             # update his branch if there are any
 
 150             elif local.ancestorof(main):
 
 152                 if not local.parentof(main):
 
 153                     success, changed = local.merge_with(main, user=user, \
 
 154                         message='$AUTO$ Local branch update during share.')
 
 158                 success, changed = local.merge_with(main, user=user, \
 
 159                         message='$AUTO$ Local branch update during share.')
 
 165                     local = local.latest()
 
 167                 success, changed = main.merge_with(local, user=user,\
 
 170             return success, changed
 
 175         return u"Document(%s:%s)" % (self.name, self.owner)
 
 177     def __eq__(self, other):
 
 178         return (self._revision == other._revision) and (self.name == other.name)