|
| 1 | +module Unison.Codebase.Editor.HandleInput.SyncV2 |
| 2 | + ( handleSyncToFile, |
| 3 | + handleSyncFromFile, |
| 4 | + handleSyncFromCodebase, |
| 5 | + ) |
| 6 | +where |
| 7 | + |
| 8 | +import Control.Lens |
| 9 | +import Control.Monad.Reader (MonadReader (..)) |
| 10 | +import U.Codebase.Sqlite.Queries qualified as Q |
| 11 | +import Unison.Cli.Monad (Cli) |
| 12 | +import Unison.Cli.Monad qualified as Cli |
| 13 | +import Unison.Cli.MonadUtils qualified as Cli |
| 14 | +import Unison.Cli.ProjectUtils qualified as Project |
| 15 | +import Unison.Codebase (CodebasePath) |
| 16 | +import Unison.Codebase qualified as Codebase |
| 17 | +import Unison.Codebase.Editor.Output qualified as Output |
| 18 | +import Unison.Codebase.Init qualified as Init |
| 19 | +import Unison.Codebase.SqliteCodebase qualified as SqliteCodebase |
| 20 | +import Unison.Prelude |
| 21 | +import Unison.Project (ProjectAndBranch (..), ProjectBranchName, ProjectName) |
| 22 | +import Unison.Share.SyncV2 qualified as SyncV2 |
| 23 | +import Unison.SyncV2.Types (BranchRef) |
| 24 | + |
| 25 | +handleSyncToFile :: FilePath -> ProjectAndBranch (Maybe ProjectName) (Maybe ProjectBranchName) -> Cli () |
| 26 | +handleSyncToFile destSyncFile branchToSync = do |
| 27 | + pp <- Cli.getCurrentProjectPath |
| 28 | + projectBranch <- Project.resolveProjectBranchInProject (pp ^. #project) branchToSync |
| 29 | + causalHash <- Cli.runTransaction $ Project.getProjectBranchCausalHash (projectBranch ^. #branch) |
| 30 | + let branchRef = into @BranchRef $ ProjectAndBranch (projectBranch ^. #project . #name) (projectBranch ^. #branch . #name) |
| 31 | + Cli.Env {codebase} <- ask |
| 32 | + liftIO (SyncV2.syncToFile codebase causalHash (Just branchRef) destSyncFile) >>= \case |
| 33 | + Left err -> Cli.respond (Output.SyncPullError err) |
| 34 | + Right _ -> pure () |
| 35 | + |
| 36 | +handleSyncFromFile :: Text -> FilePath -> ProjectAndBranch (Maybe ProjectName) ProjectBranchName -> Cli () |
| 37 | +handleSyncFromFile description srcSyncFile branchToSync = do |
| 38 | + pp <- Cli.getCurrentProjectPath |
| 39 | + projectBranch <- Project.resolveProjectBranchInProject (pp ^. #project) (over #branch Just branchToSync) |
| 40 | + let shouldValidate = True |
| 41 | + SyncV2.syncFromFile shouldValidate srcSyncFile >>= \case |
| 42 | + Left err -> Cli.respond (Output.SyncPullError err) |
| 43 | + Right causalHash -> do |
| 44 | + Cli.setProjectBranchRootToCausalHash (projectBranch ^. #branch) description causalHash |
| 45 | + |
| 46 | +handleSyncFromCodebase :: Text -> CodebasePath -> ProjectAndBranch ProjectName ProjectBranchName -> ProjectAndBranch (Maybe ProjectName) ProjectBranchName -> Cli () |
| 47 | +handleSyncFromCodebase description srcCodebasePath srcBranch destBranch = do |
| 48 | + Cli.Env {codebase} <- ask |
| 49 | + pp <- Cli.getCurrentProjectPath |
| 50 | + projectBranch <- Project.resolveProjectBranchInProject (pp ^. #project) (over #branch Just destBranch) |
| 51 | + r <- liftIO $ Init.withOpenCodebase SqliteCodebase.init "sync-src" srcCodebasePath Init.DontLock (Init.MigrateAfterPrompt Init.Backup Init.Vacuum) \srcCodebase -> do |
| 52 | + Codebase.withConnection srcCodebase \srcConn -> do |
| 53 | + maySrcCausalHash <- Codebase.runTransaction srcCodebase $ do |
| 54 | + let ProjectAndBranch srcProjName srcBranchName = srcBranch |
| 55 | + runMaybeT do |
| 56 | + project <- MaybeT (Q.loadProjectByName srcProjName) |
| 57 | + branch <- MaybeT (Q.loadProjectBranchByName (project ^. #projectId) srcBranchName) |
| 58 | + lift $ Project.getProjectBranchCausalHash branch |
| 59 | + case maySrcCausalHash of |
| 60 | + Nothing -> pure $ Left (error "Todo proper error") |
| 61 | + Just srcCausalHash -> do |
| 62 | + let shouldValidate = True |
| 63 | + fmap (const srcCausalHash) <$> liftIO (SyncV2.syncFromCodebase shouldValidate srcConn codebase srcCausalHash) |
| 64 | + |
| 65 | + case r of |
| 66 | + Left _err -> pure $ error "Todo proper error" |
| 67 | + Right (Left syncErr) -> Cli.respond (Output.SyncPullError syncErr) |
| 68 | + Right (Right causalHash) -> do |
| 69 | + Cli.setProjectBranchRootToCausalHash (projectBranch ^. #branch) description causalHash |
0 commit comments