- 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
- 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
