- Revision
- 11274
- Author
- vajda
- Date
- 2006-07-28 06:38:16 -0700 (Fri, 28 Jul 2006)
Log Message
- improved 6266 potential bug fix to support defer-deleted items
Modified Paths
Diff
Modified: trunk/chandler/repository/item/Item.py (11273 => 11274)
--- trunk/chandler/repository/item/Item.py 2006-07-28 00:13:45 UTC (rev 11273) +++ trunk/chandler/repository/item/Item.py 2006-07-28 13:38:16 UTC (rev 11274) @@ -1486,57 +1486,65 @@ self._status &= ~Item.DEFERRING else: - refs = self._references - values = self._values - others = set() + self._delete(view, recursive, deletePolicy, _noMonitors, False) - self.setDirty(Item.NDIRTY) - self._status |= Item.DELETING + def _delete(self, view, recursive, deletePolicy, _noMonitors, _keepRoot): - if hasattr(type(self), 'onItemDelete'): - self.onItemDelete(view, False) + refs = self._references + values = self._values + others = set() - for child in self.iterChildren(): - child.delete(True, deletePolicy) + self.setDirty(Item.NDIRTY) + self._status |= Item.DELETING - if self.isWatched(): - view._notifyChange(self._itemChanged, 'remove', - ('itsKind',)) - self._status &= ~Item.WATCHED + if hasattr(type(self), 'onItemDelete'): + self.onItemDelete(view, False) - if 'watches' in refs: - for watch in self.watches: - watch.delete(True, None, None, True) - view._unregisterWatches(self) + for child in self.iterChildren(): + child.delete(True, deletePolicy) - if 'monitors' in refs: - for monitor in self.monitors: - monitor.delete(True, None, None, True) + if self.isWatched(): + view._notifyChange(self._itemChanged, 'remove', + ('itsKind',)) + self._status &= ~Item.WATCHED - for name in refs.keys(): - policy = (deletePolicy or - self.getAttributeAspect(name, 'deletePolicy', - False, None, 'remove')) - if policy == 'cascade': - value = refs._getRef(name) - if value is not None: - if value._isRefs(): - others.update(value.iterItems()) - else: - others.add(value) + if 'watches' in refs: + for watch in self.watches: + watch.delete(True, None, None, True) + view._unregisterWatches(self) - for other in others: - if other.refCount(True) == 0: - other.delete(recursive, deletePolicy) + if 'monitors' in refs: + for monitor in self.monitors: + monitor.delete(True, None, None, True) - self._setKind(None, _noMonitors) + for name in refs.keys(): + policy = (deletePolicy or + self.getAttributeAspect(name, 'deletePolicy', + False, None, 'remove')) + if policy == 'cascade': + value = refs._getRef(name) + if value is not None: + if value._isRefs(): + others.update(value.iterItems()) + else: + others.add(value) - self.itsParent._removeItem(self) - self._setRoot(None, view) + for other in others: + if other.refCount(True) == 0: + other.delete(recursive, deletePolicy) - self._status |= Item.DELETED | Item.STALE - self._status &= ~(Item.DELETING | Item.DEFERRED) + self._setKind(None, _noMonitors) + self.itsParent._removeItem(self) + if _keepRoot: # during merge (to delete deferred children) + view._unregisterItem(self, False) + self._status |= Item.DELETED + else: + self._setRoot(None, view) + self._status |= Item.DELETED | Item.STALE + + self._status &= ~(Item.DELETING | Item.DEFERRED) + def _copyExport(self, view, cloudAlias, matches): uuid = self._uuid
Modified: trunk/chandler/repository/persistence/DBRepositoryView.py (11273 => 11274)
--- trunk/chandler/repository/persistence/DBRepositoryView.py 2006-07-28 00:13:45 UTC (rev 11273) +++ trunk/chandler/repository/persistence/DBRepositoryView.py 2006-07-28 13:38:16 UTC (rev 11274) @@ -421,14 +421,20 @@ scan = False if merges: + # if item is deleted in other view, resolve conflict by + # deleting item locally (with mergeFn approval) for uItem in deletes: if uItem in merges: item = self[uItem] - if (mergeFn is None or - not mergeFn(MergeError.DELETE, item, None, None)): - self._e_2_delete(item, newVersion) + if not item.isDeferred(): + if (mergeFn is None or + not mergeFn(MergeError.DELETE, item, + None, None)): + self._e_2_delete(item, newVersion) if not item.isDeleted(): item.delete(True) + if item.isDeferred(): + item._delete(self, True, None, False, True) scan = True oldVersion = self._version
Modified: trunk/chandler/repository/tests/TestMerge.py (11273 => 11274)
--- trunk/chandler/repository/tests/TestMerge.py 2006-07-28 00:13:45 UTC (rev 11273) +++ trunk/chandler/repository/tests/TestMerge.py 2006-07-28 13:38:16 UTC (rev 11274) @@ -1025,6 +1025,7 @@ view.commit() view = self.rep.setCurrentView(main) + main.deferDelete() k = main.findPath('//CineGuide/KHepburn') m1 = k.movies.first() m1.title = 'Foo' @@ -1035,7 +1036,8 @@ except MergeError, e: self.assert_(e.getReasonCode() == MergeError.DELETE) else: - self.assert_(False, "MergeError not caught") + if not m1.isDeleted(): + self.assert_(False, "MergeError not caught") main.commit(mergeFn) self.assert_(m1.isDeleted())
_______________________________________________ Commits mailing list [email protected] http://lists.osafoundation.org/mailman/listinfo/commits
