Title: [commits] (vajda) [11270] - fixed bug not handling other-view-deleted/local-view-changed merge conflict
Revision
11270
Author
vajda
Date
2006-07-27 08:53:06 -0700 (Thu, 27 Jul 2006)

Log Message

- fixed bug not handling other-view-deleted/local-view-changed merge conflict
- maybe fixed bug 6266
- added TestMerge.testMergeChangeDelete unit test

Modified Paths

Diff

Modified: trunk/chandler/repository/item/RefCollections.py (11269 => 11270)

--- trunk/chandler/repository/item/RefCollections.py	2006-07-26 23:13:44 UTC (rev 11269)
+++ trunk/chandler/repository/item/RefCollections.py	2006-07-27 15:53:06 UTC (rev 11270)
@@ -287,7 +287,7 @@
         self[key] = link
 
         if self._indexes:
-            for name, index in self._indexes.iteritems():
+            for index in self._indexes.itervalues():
                 index.insertKey(key, link._previousKey)
 
         self._setDirty(not fireChanges)

Modified: trunk/chandler/repository/persistence/DBRepositoryView.py (11269 => 11270)

--- trunk/chandler/repository/persistence/DBRepositoryView.py	2006-07-26 23:13:44 UTC (rev 11269)
+++ trunk/chandler/repository/persistence/DBRepositoryView.py	2006-07-27 15:53:06 UTC (rev 11270)
@@ -405,16 +405,31 @@
 
     def _refreshForwards(self, mergeFn, newVersion, notify):
 
-        history = []
-        schema_history = []
-        refreshes = set()
-        deletes = set()
-        merges = {}
-        unloads = {}
-        dangling = []
+        scan = True
+        while scan:
+            history = []
+            schema_history = []
+            refreshes = set()
+            deletes = set()
+            merges = {}
+            unloads = {}
+            dangling = []
 
-        self._scanHistory(self.itsVersion, newVersion, history, schema_history,
-                          refreshes, merges, unloads, deletes)
+            self._scanHistory(self.itsVersion,
+                              newVersion, history, schema_history,
+                              refreshes, merges, unloads, deletes)
+            scan = False
+
+            if merges:
+                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)
+                        item.delete(True)
+                        scan = True
+
         oldVersion = self._version
         self._version = newVersion
 
@@ -738,7 +753,7 @@
                 elif item.itsVersion < version:
                     unloads[uItem] = item
 
-            elif uItem in self._deletedRegistry:
+            elif uItem in self._deletedRegistry and uItem not in deletes:
                 kind = self.find(uKind, False)
                 if kind is None:
                     self._e_1_delete(uItem, uKind, oldVersion, version)
@@ -867,6 +882,10 @@
 
         raise MergeError, ('delete', uItem, 'item %s was deleted in this version (%d) but has later changes in version (%d) where it is of kind %s' %(uItem, oldVersion, newVersion, uKind), MergeError.CHANGE)
 
+    def _e_2_delete(self, item, version):
+
+        raise MergeError, ('delete', item, 'item %s was changed in this view but was deleted in version (%d)' %(item._repr_(), version), MergeError.DELETE)
+
     def _e_1_name(self, list, key, newName, name):
         raise MergeError, ('name', type(self).__name__, 'element %s renamed to %s and %s' %(key, newName, name), MergeError.RENAME)
 

Modified: trunk/chandler/repository/persistence/RepositoryError.py (11269 => 11270)

--- trunk/chandler/repository/persistence/RepositoryError.py	2006-07-26 23:13:44 UTC (rev 11269)
+++ trunk/chandler/repository/persistence/RepositoryError.py	2006-07-27 15:53:06 UTC (rev 11270)
@@ -103,6 +103,7 @@
     REF    = 5
     KIND   = 6
     CHANGE = 7
+    DELETE = 8
     
     codeNames = { BUG: 'BUG',
                   RENAME: 'RENAME',
@@ -111,7 +112,8 @@
                   VALUE: 'VALUE',
                   REF: 'REF',
                   KIND: 'KIND',
-                  CHANGE: 'CHANGE' }
+                  CHANGE: 'CHANGE',
+                  DELETE: 'DELETE' }
 
 
 class LoadError(RepositoryError):

Modified: trunk/chandler/repository/tests/TestMerge.py (11269 => 11270)

--- trunk/chandler/repository/tests/TestMerge.py	2006-07-26 23:13:44 UTC (rev 11269)
+++ trunk/chandler/repository/tests/TestMerge.py	2006-07-27 15:53:06 UTC (rev 11270)
@@ -1002,7 +1002,46 @@
 
             self.assert_(False, 'main view did not check out')
 
+    def testMergeChangeDelete(self):
 
+        def mergeFn(code, item, attribute, newValue):
+            if code == MergeError.DELETE:
+                return True
+            return newValue
+
+        main = self.rep.view
+        cineguidePack = os.path.join(self.testdir, 'data', 'packs',
+                                     'cineguide.pack')
+        main.loadPack(cineguidePack)
+        main.commit()
+
+        view = self.rep.createView('view')
+        main = self.rep.setCurrentView(view)
+
+        k = view.findPath('//CineGuide/KHepburn')
+        c = k.itsParent
+        m1 = k.movies.first()
+        m1.delete()
+        view.commit()
+        
+        view = self.rep.setCurrentView(main)
+        k = main.findPath('//CineGuide/KHepburn')
+        m1 = k.movies.first()
+        m1.title = 'Foo'
+        m1.director = k.movies.next(m1).director
+
+        try:
+            main.commit(None)
+        except MergeError, e:
+            self.assert_(e.getReasonCode() == MergeError.DELETE)
+        else:
+            self.assert_(False, "MergeError not caught")
+
+        main.commit(mergeFn)
+        self.assert_(m1.isDeleted())
+        self.assert_(main.check(), 'main view did not check out')
+
+
 if __name__ == "__main__":
 #    import hotshot
 #    profiler = hotshot.Profile('/tmp/TestItems.hotshot')




_______________________________________________
Commits mailing list
[email protected]
http://lists.osafoundation.org/mailman/listinfo/commits

Reply via email to