@@ -5,6 +5,7 @@ module Unison.Share.SyncV2
5
5
( syncFromFile ,
6
6
syncToFile ,
7
7
syncFromCodebase ,
8
+ syncFromCodeserver ,
8
9
)
9
10
where
10
11
@@ -16,28 +17,36 @@ import Control.Monad.Except
16
17
import Control.Monad.Reader (ask )
17
18
import Control.Monad.ST (ST , stToIO )
18
19
import Control.Monad.State
19
- import Data.Attoparsec.ByteString qualified as A
20
- import Data.Attoparsec.ByteString.Char8 qualified as A8
21
20
import Data.ByteString qualified as BS
22
21
import Data.ByteString.Lazy qualified as BL
23
- import Data.Conduit.Attoparsec qualified as C
24
22
import Data.Conduit.List qualified as C
25
23
import Data.Conduit.Zlib qualified as C
26
24
import Data.Graph qualified as Graph
27
25
import Data.Map qualified as Map
26
+ import Data.Proxy
28
27
import Data.Set qualified as Set
29
28
import Data.Text.IO qualified as Text
29
+ import Data.Text.Lazy qualified as Text.Lazy
30
+ import Data.Text.Lazy.Encoding qualified as Text.Lazy
31
+ import Network.HTTP.Client qualified as Http.Client
32
+ import Network.HTTP.Types qualified as HTTP
33
+ import Servant.API qualified as Servant
34
+ import Servant.Client.Streaming qualified as Servant
30
35
import Servant.Conduit ()
36
+ import Servant.Types.SourceT qualified as Servant
31
37
import System.Console.Regions qualified as Console.Regions
32
38
import U.Codebase.HashTags (CausalHash )
33
39
import U.Codebase.Sqlite.Queries qualified as Q
34
40
import U.Codebase.Sqlite.TempEntity (TempEntity )
35
41
import U.Codebase.Sqlite.V2.HashHandle (v2HashHandle )
42
+ import Unison.Auth.HTTPClient qualified as Auth
36
43
import Unison.Cli.Monad (Cli )
37
44
import Unison.Cli.Monad qualified as Cli
38
45
import Unison.Codebase qualified as Codebase
46
+ import Unison.Debug qualified as Debug
39
47
import Unison.Hash32 (Hash32 )
40
48
import Unison.Prelude
49
+ import Unison.Share.API.Hash qualified as Share
41
50
import Unison.Share.ExpectedHashMismatches (expectedCausalHashMismatches , expectedComponentHashMismatches )
42
51
import Unison.Share.Sync.Types
43
52
import Unison.Sqlite qualified as Sqlite
@@ -117,6 +126,36 @@ syncFromCodebase shouldValidate srcConn destCodebase causalHash = do
117
126
streamIntoCodebase shouldValidate destCodebase header rest
118
127
mapExceptT liftIO (afterSyncChecks destCodebase (causalHashToHash32 causalHash))
119
128
129
+ syncFromCodeserver ::
130
+ Bool ->
131
+ -- | The Unison Share URL.
132
+ Servant. BaseUrl ->
133
+ -- | The branch to download from.
134
+ SyncV2. BranchRef ->
135
+ -- | The hash to download.
136
+ Share. HashJWT ->
137
+ Set Hash32 ->
138
+ -- | Callback that's given a number of entities we just downloaded.
139
+ (Int -> IO () ) ->
140
+ Cli (Either (SyncError SyncV2. PullError ) () )
141
+ syncFromCodeserver shouldValidate unisonShareUrl branchRef hashJwt knownHashes _downloadedCallback = do
142
+ Cli. Env {authHTTPClient, codebase} <- ask
143
+ runExceptT do
144
+ let hash = Share. hashJWTHash hashJwt
145
+ ExceptT $ do
146
+ (Cli. runTransaction (Q. entityLocation hash)) >>= \ case
147
+ Just Q. EntityInMainStorage -> pure $ Right ()
148
+ _ -> do
149
+ Debug. debugLogM Debug. Temp $ " Kicking off sync request"
150
+ Timing. time " Entity Download" $ do
151
+ liftIO . C. runResourceT . runExceptT $ httpStreamEntities
152
+ authHTTPClient
153
+ unisonShareUrl
154
+ SyncV2. DownloadEntitiesRequest {branchRef, causalHash = hashJwt, knownHashes}
155
+ \ header stream -> do
156
+ streamIntoCodebase shouldValidate codebase header stream
157
+ mapExceptT liftIO (afterSyncChecks codebase hash)
158
+
120
159
------------------------------------------------------------------------------------------------------------------------
121
160
-- Helpers
122
161
------------------------------------------------------------------------------------------------------------------------
0 commit comments