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 if isinstance(data, unicode):
20 data = data.encode('utf-8')
22 user = self._library._sanitize_string(user)
23 msg = self._library._sanitize_string(msg)
24 entry = self._library._sanitize_string(entry)
27 raise ValueError("Can't determine user.")
30 f = l._fileopen(r(entry), "w+")
35 return self.invoke_and_commit(write, lambda d: (msg, self.owner))
37 def invoke_and_commit(self, ops,
38 before_commit, rollback=False):
39 lock = self._library.lock()
41 self._library._checkout(self._revision.hgrev())
43 def entry_path(entry):
44 return self.id + '.' + entry
46 ops(self._library, entry_path)
47 message, user = before_commit(self)
48 self._library._commit(message, user)
50 return self._library.document(docid=self.id, user=user)
52 # rollback the last commit
53 self._library._rollback()
58 # def commit(self, message, user):
59 # """Make a new commit."""
60 # self.invoke_and_commit(message, user, lambda *a: True)
63 return self._revision.user_name() is None
69 return self._library.document(docid=self.id)
72 return self._library.document(docid=self.id, user=self.owner)
75 fullid = self._library.fulldocid(self.id, user)
77 def take_action(library, resolve):
79 library._create_branch(fullid, parent=self._revision)
81 if not self._library.has_revision(fullid):
82 self.invoke_and_commit(take_action, \
83 lambda d: ("$AUTO$ File checkout.", user) )
85 return self._library.document_for_rev(fullid)
87 def update(self, user):
88 """Update parts of the document."""
89 lock = self.library.lock()
92 # main revision of the document
95 if self._revision.has_children():
96 # can't update non-latest revision
101 if not sv.ancestorof(self) and not self.parentof(sv):
102 return self._revision.merge_with(sv._revision, user=user)
104 return (False, False)
108 def share(self, message):
109 lock = self.library.lock()
112 return (True, False) # always shared
114 user = self._revision.user_name()
115 main = self.shared()._revision
116 local = self._revision
121 # * <- can also be here!
126 # The local branch has been recently updated,
127 # so we don't need to update yet again, but we need to
128 # merge down to default branch, even if there was
129 # no commit's since last update
131 if main.ancestorof(local):
133 success, changed = main.merge_with(local, user=user, message=message)
142 # Default has no changes, to update from this branch
143 # since the last merge of local to default.
144 elif local.has_common_ancestor(main):
146 if not local.parentof(main):
147 success, changed = main.merge_with(local, user=user, message=message)
152 # * <- this case overlaps with previos one
158 # There was a recent merge to the defaul branch and
159 # no changes to local branch recently.
161 # Use the fact, that user is prepared to see changes, to
162 # update his branch if there are any
163 elif local.ancestorof(main):
165 if not local.parentof(main):
166 success, changed = local.merge_with(main, user=user, \
167 message='$AUTO$ Local branch update during share.')
171 success, changed = local.merge_with(main, user=user, \
172 message='$AUTO$ Local branch update during share.')
178 local = local.latest()
180 success, changed = main.merge_with(local, user=user,\
183 return success, changed
188 return u"Document(%s:%s)" % (self.name, self.owner)
190 def __eq__(self, other):
191 return (self._revision == other._revision) and (self.name == other.name)