Example #1
0
	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})
Example #2
0
    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})
Example #3
0
	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])
Example #4
0
    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])
Example #5
0
	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
Example #6
0
    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
Example #7
0
	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
Example #8
0
 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()
Example #9
0
 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()
Example #10
0
 def doSave(self, handle):
     data = self.encode()
     handle.writeAll('HPSD', struct.dumps(data))
     self.__changedContent = False
Example #11
0
       <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"
Example #12
0
	def doSave(self, handle):
		data = self.encode()
		handle.writeAll('HPSD', struct.dumps(data))
		self.__changedContent = False
Example #13
0
       <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"

Example #14
0
	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()