async def setLayers(self, layers): ''' Set the view layers from a list of idens. NOTE: view layers are stored "top down" (the write layer is self.layers[0]) ''' for view in self.core.views.values(): if view.parent is self: raise s_exc.ReadOnlyLayer( mesg='May not change layers that have been forked from') if self.parent is not None: raise s_exc.ReadOnlyLayer( mesg='May not change layers of forked view') layrs = [] for iden in layers: layr = self.core.layers.get(iden) if layr is None: raise s_exc.NoSuchLayer(iden=iden) if not layrs and layr.readonly: raise s_exc.ReadOnlyLayer( mesg=f'First layer {layr.iden} must not be read-only') layrs.append(layr) self.invalid = None self.layers = layrs await self.info.set('layers', layers)
async def mergeAllowed(self, user=None): ''' Check whether a user can merge a view into its parent. ''' fromlayr = self.layers[0] if self.parent is None: raise s_exc.CantMergeView(mesg=f'Cannot merge a view {self.iden} than has not been forked') parentlayr = self.parent.layers[0] if parentlayr.readonly: raise s_exc.ReadOnlyLayer(mesg="May not merge if the parent's write layer is read-only") for view in self.core.views.values(): if view.parent == self: raise s_exc.CantMergeView(mesg='Cannot merge a view that has children itself') if user is None or user.isAdmin() or user.isAdmin(gateiden=parentlayr.iden): return async with await self.parent.snap(user=user) as snap: splicecount = 0 async for nodeedit in fromlayr.iterLayerNodeEdits(): async for offs, splice in fromlayr.makeSplices(0, [nodeedit], None): check = self.permCheck.get(splice[0]) if check is None: raise s_exc.SynErr(mesg='Unknown splice type, cannot safely merge', splicetype=splice[0]) await check(user, snap, splice[1]) splicecount += 1 if splicecount % 1000 == 0: await asyncio.sleep(0)
async def _addLayer(self, layriden, indx=None): for view in self.core.views.values(): if view.parent is self: raise s_exc.ReadOnlyLayer(mesg='May not change layers that have been forked from') if self.parent is not None: raise s_exc.ReadOnlyLayer(mesg='May not change layers of forked view') layr = self.core.layers.get(layriden) if layr is None: raise s_exc.NoSuchLayer(iden=layriden) if layr in self.layers: return if indx is None: self.layers.append(layr) else: self.layers.insert(indx, layr) await self.info.set('layers', [lyr.iden for lyr in self.layers])
async def stor(self, sops, splices=None): raise s_exc.ReadOnlyLayer(mesg='Remote layer does not support writing')