def test_sync_merge(self): (doc, rev1, rev2) = self.createMerge("org.hotchpotch.dict", {'HPSD' : struct.dumps({"a":1}) }, {'HPSD' : struct.dumps({"a":1, "b":2}) }, {'HPSD' : struct.dumps({"a":1, "c":3}) }) l = self.performSync(doc, 'merge') rev = l.revs()[0] s = Connector().stat(rev) self.assertEqual(len(s.parents()), 2) self.assertTrue(rev1 in s.parents()) self.assertTrue(rev2 in s.parents()) # all revs on all stores? l = Connector().lookup_rev(rev1) self.assertTrue(self.store1 in l) self.assertTrue(self.store2 in l) l = Connector().lookup_rev(rev2) self.assertTrue(self.store1 in l) self.assertTrue(self.store2 in l) # see if merge was ok with Connector().peek(rev) as r: hpsd = struct.loads(r.readAll('HPSD')) self.assertEqual(hpsd, {"a":1, "b":2, "c":3})
def test_sync_merge(self): (doc, rev1, rev2) = self.createMerge("org.hotchpotch.dict", {'HPSD': struct.dumps({"a": 1})}, {'HPSD': struct.dumps({ "a": 1, "b": 2 })}, {'HPSD': struct.dumps({ "a": 1, "c": 3 })}) l = self.performSync(doc, 'merge') rev = l.revs()[0] s = Connector().stat(rev) self.assertEqual(len(s.parents()), 2) self.assertTrue(rev1 in s.parents()) self.assertTrue(rev2 in s.parents()) # all revs on all stores? l = Connector().lookup_rev(rev1) self.assertTrue(self.store1 in l) self.assertTrue(self.store2 in l) l = Connector().lookup_rev(rev2) self.assertTrue(self.store1 in l) self.assertTrue(self.store2 in l) # see if merge was ok with Connector().peek(rev) as r: hpsd = struct.loads(r.readAll('HPSD')) self.assertEqual(hpsd, {"a": 1, "b": 2, "c": 3})
def test_transitive_keep(self): with Connector().create("test.format.foo", "test.foo", [self.store1]) as w1: with Connector().create("test.format.bar", "test.foo", [self.store1]) as w2: w2.write('FILE', 'test') w2.commit() doc2 = w2.getDoc() rev2 = w2.getRev() # create a reference from w1 to w2 w1.write('HPSD', struct.dumps([struct.DocLink(doc2)])) w1.commit() doc1 = w1.getDoc() rev1 = w1.getRev() # w2 is closed now, w1 still open, should prevent gc self.gc(self.store1) l = Connector().lookup_doc(doc1) self.assertEqual(l.revs(), [rev1]) self.assertEqual(l.preRevs(), []) self.assertEqual(Connector().lookup_rev(rev1), [self.store1]) l = Connector().lookup_doc(doc2) self.assertEqual(l.revs(), [rev2]) self.assertEqual(l.preRevs(), []) self.assertEqual(Connector().lookup_rev(rev2), [self.store1])
def docMergePerform(self, writer, baseReader, mergeReaders, changedParts): conflicts = super(CollectionWidget, self).docMergePerform(writer, baseReader, mergeReaders, changedParts) if 'HPSD' in changedParts: baseHpsd = struct.loads(baseReader.readAll('HPSD')) mergeHpsd = [] for r in mergeReaders: mergeHpsd.append(struct.loads(r.readAll('HPSD'))) (newHpsd, newConflict) = struct.merge(baseHpsd, mergeHpsd) conflicts = conflicts or newConflict writer.writeAll('HPSD', struct.dumps(newHpsd)) return conflicts
def __syncToHotchpotch(self): # will also be triggered by _syncToFilesystem # apply hash to check if really changed from outside newFileHash = self._hashFile() if newFileHash != self.__fileHash: with open(self._path, "rb") as f: with Connector().update(self.__doc, self._rev) as w: meta = struct.loads(w.readAll('META')) if not "org.hotchpotch.annotation" in meta: meta["org.hotchpotch.annotation"] = {} meta["org.hotchpotch.annotation"]["comment"] = "<<Changed by external app>>" w.writeAll('META', struct.dumps(meta)) w.writeAll('FILE', f.read()) w.commit() self._rev = w.getRev() self.__fileHash = newFileHash
def __save(self): rev = self.revs[0] self.buttonBox.button(QtGui.QDialogButtonBox.Save).setEnabled(False) with Connector().peek(rev) as r: metaData = struct.loads(r.readAll("META")) setMetaData(metaData, ["org.hotchpotch.annotation", "title"], str(self.annoTab.titleEdit.text())) setMetaData(metaData, ["org.hotchpotch.annotation", "description"], str(self.annoTab.descEdit.text())) if self.annoTab.tagsEdit.hasAcceptableInput(): tagString = self.annoTab.tagsEdit.text() tagSet = set([tag.strip() for tag in str(tagString).split(",")]) tagList = list(tagSet) setMetaData(metaData, ["org.hotchpotch.annotation", "tags"], tagList) with Connector().update(self.doc, rev) as writer: writer.writeAll("META", struct.dumps(metaData)) writer.commit() self.revs[0] = writer.getRev()
def __save(self): rev = self.revs[0] self.buttonBox.button(QtGui.QDialogButtonBox.Save).setEnabled(False) with Connector().peek(rev) as r: metaData = struct.loads(r.readAll('META')) setMetaData(metaData, ["org.hotchpotch.annotation", "title"], str(self.annoTab.titleEdit.text())) setMetaData(metaData, ["org.hotchpotch.annotation", "description"], str(self.annoTab.descEdit.text())) if self.annoTab.tagsEdit.hasAcceptableInput(): tagString = self.annoTab.tagsEdit.text() tagSet = set([tag.strip() for tag in str(tagString).split(',')]) tagList = list(tagSet) setMetaData(metaData, ["org.hotchpotch.annotation", "tags"], tagList) with Connector().update(self.doc, rev) as writer: writer.writeAll('META', struct.dumps(metaData)) writer.commit() self.revs[0] = writer.getRev()
def doSave(self, handle): data = self.encode() handle.writeAll('HPSD', struct.dumps(data)) self.__changedContent = False
<hp-obj-spec> = [FOUR:<content>]+ <content> = local file | json data """ sys.exit(1) # === main if len(sys.argv) < 4: usage() # parse command line objPath = sys.argv[1] objUti = sys.argv[2] objSpec = [] for spec in sys.argv[3:]: if spec[4] != ':': usage() fourCC = spec[:4] content = spec[5:] if os.path.isfile(content): with open(content, "rb") as file: part = file.read() else: part = struct.dumps(struct.loadJSON(content)) objSpec.append((fourCC, part)) # let's do it if not importObjectByPath(objPath, objUti, objSpec): print "Import failed"
<content> = local file | json data """ sys.exit(1) # === main if len(sys.argv) < 4: usage() # parse command line objPath = sys.argv[1] objUti = sys.argv[2] objSpec = [] for spec in sys.argv[3:]: if spec[4] != ':': usage() fourCC = spec[:4] content = spec[5:] if os.path.isfile(content): with open(content, "rb") as file: part = file.read() else: part = struct.dumps(struct.loadJSON(content)) objSpec.append((fourCC, part)) # let's do it if not importObjectByPath(objPath, objUti, objSpec): print "Import failed"
def save(self): with Connector().update(self.syncDoc, self.syncRev) as w: w.writeAll('HPSD', struct.dumps(self.rules)) w.commit() self.rev = w.getRev()