diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/Test.hs | 25 | 
1 files changed, 25 insertions, 0 deletions
| diff --git a/src/Test.hs b/src/Test.hs index b3c7345..694f16d 100644 --- a/src/Test.hs +++ b/src/Test.hs @@ -211,6 +211,8 @@ commands = map (T.pack *** id)      , ("stored-set-list", cmdStoredSetList)      , ("create-identity", cmdCreateIdentity)      , ("start-server", cmdStartServer) +    , ("shared-state-get", cmdSharedStateGet) +    , ("shared-state-wait", cmdSharedStateWait)      , ("watch-local-identity", cmdWatchLocalIdentity)      , ("watch-shared-identity", cmdWatchSharedIdentity)      , ("update-local-identity", cmdUpdateLocalIdentity) @@ -322,6 +324,29 @@ cmdStartServer = do      modify $ \s -> s { tsServer = Just server, tsPeers = Just peers } +cmdSharedStateGet :: Command +cmdSharedStateGet = do +    h <- maybe (fail "failed to reload head") return =<< maybe (fail "no current head") reloadHead =<< gets tsHead +    cmdOut $ unwords $ "shared-state-get" : map (show . refDigest . storedRef) (lsShared $ headObject h) + +cmdSharedStateWait :: Command +cmdSharedStateWait = do +    st <- asks tiStorage +    out <- asks tiOutput +    Just h <- gets tsHead +    trefs <- asks tiParams + +    liftIO $ do +        mvar <- newEmptyMVar +        w <- watchHeadWith h (lsShared . headObject) $ \cur -> do +            mbobjs <- mapM (readRef st . encodeUtf8) trefs +            case map wrappedLoad <$> sequence mbobjs of +                Just objs | filterAncestors (cur ++ objs) == cur -> do +                    outLine out $ unwords $ "shared-state-wait" : map T.unpack trefs +                    void $ forkIO $ unwatchHead =<< takeMVar mvar +                _ -> return () +        putMVar mvar w +  cmdWatchLocalIdentity :: Command  cmdWatchLocalIdentity = do      Just h <- gets tsHead |