Title: [commits] (vajda) [11274] - improved 6266 potential bug fix to support defer-deleted items
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

Reply via email to