self.invoke_and_commit(take_action, \
lambda d: ("$AUTO$ File checkout.", user) )
- return self._library.document_for_rev(fullid)
+ return self._library.document_for_revision(fullid)
def up_to_date(self):
if self.ismain():
shared = self.shared()
- if shared.parentof(self):
+ if shared.ancestorof(self):
return True
if shared.has_parent_from(self):
raise wlrepo.UpdateException("Revision %s has children." % self.revision)
shared = self.shared()
-
- # the shared version comes from our version
- if self.parentof(self.shared()):
- return self
-
- # no changes since last update
+ # *
+ # /|
+ # * |
+ # | |
+ #
+ # we carry the latest version
if shared.ancestorof(self):
- return self
+ return self
- # last share was from this branch
- if shared.has_parent_from(self):
+ # *
+ # |\
+ # | *
+ # | |
+ #
+ # We just shared
+ if self.parentof(shared):
return self
- if self._revision.merge_with(sv._revision, user=user,\
+ # s s S
+ # | | |
+ # *<-S *<-*
+ # | | | .
+ #
+ # This is ok (s - shared, S - self)
+
+ if self._revision.merge_with(shared._revision, user=user,\
message="$AUTO$ Personal branch update."):
return self.latest()
else:
raise wlrepo.UpdateException("Merge failed.")
finally:
- lock.release()
+ lock.release()
- def share(self, message):
- lock = self.library.lock()
- try:
- # nothing to do
- if self.ismain():
- return self
+ def would_share(self):
+ if self.ismain():
+ return False, "Main version is always shared"
- shared = self.shared()
+ shared = self.shared()
- # we just did this - move on
- if self.parentof(shared):
- return shared
+ # we just did this - move on
+ if self.parentof(shared):
+ return False, "Document has been recetly shared - no changes"
+
+ # *
+ # /|
+ # * *
+ # |\|
+ # | *
+ # | |
+ # Situation above is ok - what we don't want, is:
+ # *
+ # /|
+ # * |
+ # |\|
+ # | *
+ # | |
+ # We want to prevent stuff like this.
+ if self.parent().parentof(shared):
+ return False, "Preventing zig-zag"
+
+ return True, "OK"
- # No changes since update
- if shared.parentof(self):
- return shared
+ def share(self, message):
+ lock = self.library.lock()
+ try:
+ result, info = self.would_share()
+
+ if not result:
+ return self.shared()
+
# The good situation
#
# * local
# / |
# main * *
# | |
+ shared = self.shared()
+
if shared.ancestorof(self):
success = shared._revision.merge_with(self._revision, user=self.owner, message=message)