def __addReplicateActions(self, menu, link): c = Connector() try: allVolumes = set(c.lookup_rev(self.rev())) if isinstance(link, struct.DocLink): lookup = c.lookup_doc(link.doc()) curVolumes = set(lookup.stores()) try: for rev in lookup.revs(): curVolumes = curVolumes & set(c.lookup_rev(rev, curVolumes)) except IOError: curVolumes = set() else: curVolumes = set(c.lookup_rev(link.rev())) except IOError: return repVolumes = allVolumes - curVolumes for store in repVolumes: try: rev = c.lookup_doc(store).rev(store) with c.peek(rev) as r: metaData = struct.loads(r.readAll('META')) try: name = metaData["org.hotchpotch.annotation"]["title"] except: name = "Unknown store" action = menu.addAction("Replicate item to '%s'" % name) action.triggered.connect( lambda x,l=link,s=store: self.__doReplicate(l, s)) except: pass
def __addReplicateActions(self, menu, link): c = Connector() try: allVolumes = set(c.lookup_rev(self.rev())) if isinstance(link, struct.DocLink): lookup = c.lookup_doc(link.doc()) curVolumes = set(lookup.stores()) try: for rev in lookup.revs(): curVolumes = curVolumes & set( c.lookup_rev(rev, curVolumes)) except IOError: curVolumes = set() else: curVolumes = set(c.lookup_rev(link.rev())) except IOError: return repVolumes = allVolumes - curVolumes for store in repVolumes: try: rev = c.lookup_doc(store).rev(store) with c.peek(rev) as r: metaData = struct.loads(r.readAll('META')) try: name = metaData["org.hotchpotch.annotation"]["title"] except: name = "Unknown store" action = menu.addAction("Replicate item to '%s'" % name) action.triggered.connect( lambda x, l=link, s=store: self.__doReplicate(l, s)) except: pass
def test_merge(self): c = Connector() stores = [self.store1, self.store2] w = self.create("public.data", "test.ignore", stores) w.commit() doc = w.getDoc() rev = w.getRev() with c.update(doc, rev, stores=[self.store1]) as w: w.write('FILE', 'first') w.commit() rev1 = w.getRev() with c.update(doc, rev, stores=[self.store2]) as w: w.write('FILE', 'second') w.commit() rev2 = w.getRev() with c.update(doc, rev1, stores=stores) as w: w.setParents([rev1, rev2]) w.commit() rev3 = w.getRev() self.assertTrue(c.sync(doc) == rev3) l = c.lookup_doc(doc) self.assertEqual(l.revs(), [rev3]) self.assertEqual(set(c.lookup_rev(rev)), set(stores)) self.assertEqual(set(c.lookup_rev(rev1)), set(stores)) self.assertEqual(set(c.lookup_rev(rev2)), set(stores)) self.assertEqual(set(c.lookup_rev(rev3)), set(stores))
def test_suspend_multi(self): c = Connector() (doc, rev1, rev_s1) = self.createSuspendDoc() with c.update(doc, rev1) as w: w.writeAll('FILE', 'forward') w.commit() rev2 = w.getRev() with c.update(doc, rev2) as w: w.writeAll('FILE', 'Hail to the king, baby!') w.suspend() rev_s2 = w.getRev() l = c.lookup_doc(doc) self.assertEqual(l.revs(), [rev2]) self.assertEqual(len(l.preRevs()), 2) self.assertTrue(rev_s1 in l.preRevs()) self.assertTrue(rev_s2 in l.preRevs()) s = c.stat(rev_s1) self.assertEqual(s.parents(), [rev1]) s = c.stat(rev_s2) self.assertEqual(s.parents(), [rev2]) self.assertRevContent(rev1, {'FILE': 'ok'}) self.assertRevContent(rev_s1, {'FILE': 'update'}) self.assertRevContent(rev2, {'FILE': 'forward'}) self.assertRevContent(rev_s2, {'FILE': 'Hail to the king, baby!'})
def test_bad(self): c = Connector() stores = [self.store1, self.store2] w = self.create("public.data", "test.ignore", stores) w.commit() doc = w.getDoc() rev = w.getRev() with c.update(doc, rev, stores=[self.store1]) as w: w.write('FILE', 'first') w.commit() rev1 = w.getRev() with c.update(doc, rev, stores=[self.store2]) as w: w.write('FILE', 'second') w.commit() rev2 = w.getRev() self.failIfEqual(rev, rev1) self.failIfEqual(rev, rev2) self.failIfEqual(rev1, rev2) self.assertRaises(IOError, c.sync, doc) l = c.lookup_doc(doc) self.assertEqual(len(l.revs()), 2) self.assertEqual(l.rev(self.store1), rev1) self.assertEqual(l.rev(self.store2), rev2)
def test_suspend_multi(self): c = Connector() (doc, rev1, rev_s1) = self.createSuspendDoc() with c.update(doc, rev1) as w: w.writeAll('FILE', 'forward') w.commit() rev2 = w.getRev() with c.update(doc, rev2) as w: w.writeAll('FILE', 'Hail to the king, baby!') w.suspend() rev_s2 = w.getRev() l = c.lookup_doc(doc) self.assertEqual(l.revs(), [rev2]) self.assertEqual(len(l.preRevs()), 2) self.assertTrue(rev_s1 in l.preRevs()) self.assertTrue(rev_s2 in l.preRevs()) s = c.stat(rev_s1) self.assertEqual(s.parents(), [rev1]) s = c.stat(rev_s2) self.assertEqual(s.parents(), [rev2]) self.assertRevContent(rev1, {'FILE' : 'ok'}) self.assertRevContent(rev_s1, {'FILE' : 'update'}) self.assertRevContent(rev2, {'FILE' : 'forward'}) self.assertRevContent(rev_s2, {'FILE' : 'Hail to the king, baby!'})
def test_suspend(self): c = Connector() (doc, rev1, rev2) = self.createSuspendDoc() l = c.lookup_doc(doc) self.assertEqual(l.revs(), [rev1]) self.assertEqual(l.preRevs(), [rev2]) self.assertRevContent(rev1, {'FILE': 'ok'}) self.assertRevContent(rev2, {'FILE': 'update'})
def test_suspend(self): c = Connector() (doc, rev1, rev2) = self.createSuspendDoc() l = c.lookup_doc(doc) self.assertEqual(l.revs(), [rev1]) self.assertEqual(l.preRevs(), [rev2]) self.assertRevContent(rev1, {'FILE' : 'ok'}) self.assertRevContent(rev2, {'FILE' : 'update'})
def test_resume_abort(self): c = Connector() (doc, rev1, rev2) = self.createSuspendDoc() with c.resume(doc, rev2) as w: w.writeAll('FILE', 'Hail to the king, baby!') l = c.lookup_doc(doc) self.assertEqual(l.revs(), [rev1]) self.assertEqual(l.preRevs(), [rev2]) w.close() l = c.lookup_doc(doc) self.assertEqual(l.revs(), [rev1]) self.assertEqual(l.preRevs(), [rev2]) self.assertRevContent(rev1, {'FILE' : 'ok'}) self.assertRevContent(rev2, {'FILE' : 'update'})
def test_resume_abort(self): c = Connector() (doc, rev1, rev2) = self.createSuspendDoc() with c.resume(doc, rev2) as w: w.writeAll('FILE', 'Hail to the king, baby!') l = c.lookup_doc(doc) self.assertEqual(l.revs(), [rev1]) self.assertEqual(l.preRevs(), [rev2]) w.close() l = c.lookup_doc(doc) self.assertEqual(l.revs(), [rev1]) self.assertEqual(l.preRevs(), [rev2]) self.assertRevContent(rev1, {'FILE': 'ok'}) self.assertRevContent(rev2, {'FILE': 'update'})
def test_resume_wrong(self): c = Connector() (doc, rev1, rev2) = self.createSuspendDoc() self.assertRaises(IOError, c.resume, doc, rev1) l = c.lookup_doc(doc) self.assertEqual(l.revs(), [rev1]) self.assertEqual(l.preRevs(), [rev2]) self.assertRevContent(rev1, {'FILE' : 'ok'}) self.assertRevContent(rev2, {'FILE' : 'update'})
def test_resume_wrong(self): c = Connector() (doc, rev1, rev2) = self.createSuspendDoc() self.assertRaises(IOError, c.resume, doc, rev1) l = c.lookup_doc(doc) self.assertEqual(l.revs(), [rev1]) self.assertEqual(l.preRevs(), [rev2]) self.assertRevContent(rev1, {'FILE': 'ok'}) self.assertRevContent(rev2, {'FILE': 'update'})
def test_collect(self): c = Connector() # deliberately close handle after creating! with c.create("public.data", "test.foo", [self.store1]) as w: w.commit() doc = w.getDoc() rev = w.getRev() # perform a GC cycle self.gc(self.store1) l = c.lookup_doc(doc) self.assertEqual(l.revs(), []) self.assertEqual(l.preRevs(), []) self.assertRaises(IOError, c.stat, rev)
def test_create_keep_handle(self): c = Connector() with c.create("public.data", "test.foo", [self.store1]) as w: w.commit() doc = w.getDoc() rev = w.getRev() # perform a GC cycle self.gc(self.store1) l = c.lookup_doc(doc) self.assertEqual(l.revs(), [rev]) self.assertEqual(l.preRevs(), []) c.stat(rev)
def test_resume_commit(self): c = Connector() (doc, rev1, rev2) = self.createSuspendDoc() with c.resume(doc, rev2) as w: w.writeAll('FILE', 'What are you waiting for, christmas?') w.commit() rev3 = w.getRev() l = c.lookup_doc(doc) self.assertEqual(l.revs(), [rev3]) self.assertEqual(len(l.preRevs()), 0) s = c.stat(rev3) self.assertEqual(s.parents(), [rev1]) self.assertRevContent(rev1, {'FILE' : 'ok'}) self.assertRevContent(rev3, {'FILE' : 'What are you waiting for, christmas?'})
def test_resume_suspend_orig(self): c = Connector() (doc, rev1, rev2) = self.createSuspendDoc() with c.resume(doc, rev2) as w: w.suspend() rev3 = w.getRev() l = c.lookup_doc(doc) self.assertEqual(l.revs(), [rev1]) self.assertEqual(l.preRevs(), [rev3]) s = c.stat(rev3) self.assertEqual(s.parents(), [rev1]) self.assertRevContent(rev1, {'FILE': 'ok'}) self.assertRevContent(rev3, {'FILE': 'update'})
def test_resume_suspend_orig(self): c = Connector() (doc, rev1, rev2) = self.createSuspendDoc() with c.resume(doc, rev2) as w: w.suspend() rev3 = w.getRev() l = c.lookup_doc(doc) self.assertEqual(l.revs(), [rev1]) self.assertEqual(l.preRevs(), [rev3]) s = c.stat(rev3) self.assertEqual(s.parents(), [rev1]) self.assertRevContent(rev1, {'FILE' : 'ok'}) self.assertRevContent(rev3, {'FILE' : 'update'})
def test_resume_commit(self): c = Connector() (doc, rev1, rev2) = self.createSuspendDoc() with c.resume(doc, rev2) as w: w.writeAll('FILE', 'What are you waiting for, christmas?') w.commit() rev3 = w.getRev() l = c.lookup_doc(doc) self.assertEqual(l.revs(), [rev3]) self.assertEqual(len(l.preRevs()), 0) s = c.stat(rev3) self.assertEqual(s.parents(), [rev1]) self.assertRevContent(rev1, {'FILE': 'ok'}) self.assertRevContent(rev3, {'FILE': 'What are you waiting for, christmas?'})
def test_good(self): c = Connector() stores = [self.store1, self.store2] w = self.create("public.data", "test.ignore", stores) w.commit() doc = w.getDoc() rev = w.getRev() with c.update(doc, rev, stores=[self.store1]) as w: w.write('FILE', 'update') w.commit() rev = w.getRev() self.assertTrue(c.sync(doc) == rev) l = c.lookup_doc(doc) self.assertEqual(len(l.revs()), 1) self.assertEqual(l.rev(self.store1), rev) self.assertEqual(l.rev(self.store2), rev)
def test_forget(self): c = Connector() (doc, rev1, rev_s1) = self.createSuspendDoc() with c.update(doc, rev1) as w: w.writeAll('FILE', 'forward') w.commit() rev2 = w.getRev() with c.update(doc, rev2) as w: w.writeAll('FILE', 'Hail to the king, baby!') w.suspend() rev_s2 = w.getRev() self.assertRaises(IOError, c.forget, doc, rev1) c.forget(doc, rev_s1) l = c.lookup_doc(doc) self.assertEqual(l.revs(), [rev2]) self.assertEqual(l.preRevs(), [rev_s2])
def test_fork_keep_handle(self): c = Connector() w = self.create("test.format.foo", "test.ignore", [self.store1]) self.assertEqual(w.getType(), "test.format.foo") w.commit() doc1 = w.getDoc() rev1 = w.getRev() with c.fork(rev1, "test.ignore") as w: w.write('FILE', 'update') w.commit() doc2 = w.getDoc() rev2 = w.getRev() # perform a GC cycle self.gc(self.store1) l = c.lookup_doc(doc2) self.assertEqual(l.revs(), [rev2]) self.assertEqual(l.preRevs(), []) c.stat(rev2)