def __addReplicateActions(self, menu, link): c = Connector() try: allVolumes = set(c.lookupRev(self.rev())) if isinstance(link, struct.DocLink): lookup = c.lookupDoc(link.doc()) curVolumes = set(lookup.stores()) try: for rev in lookup.revs(): curVolumes = curVolumes & set(c.lookupRev(rev, curVolumes)) except IOError: curVolumes = set() else: curVolumes = set(c.lookupRev(link.rev())) except IOError: return if not curVolumes: return srcVol = list(curVolumes)[0] repVolumes = allVolumes - curVolumes for store in repVolumes: try: rev = c.lookupDoc(store).rev(store) with c.peek(rev) as r: metaData = struct.loads(r.readAll('META')) try: name = metaData["org.peerdrive.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(srcVol, l, s)) except: pass