1
0
Fork 0
mirror of https://code.sup39.dev/repos/Wqawg synced 2024-12-27 18:04:53 +09:00

Send raw pack as git-upload-pack-result

This commit is contained in:
fr33domlover 2016-04-29 04:32:32 +00:00
parent 66bc49df15
commit 144918cd9f
4 changed files with 35 additions and 2 deletions

View file

@ -28,6 +28,8 @@ import Network.Git.Put (serializeService)
import Network.Git.Transport.HTTP.Fetch.RefDiscovery import Network.Git.Transport.HTTP.Fetch.RefDiscovery
import Yesod.Core.Content import Yesod.Core.Content
import qualified Data.ByteString.Lazy as BL (ByteString)
newtype GitRefDiscovery = GitRefDiscovery { unGRD :: RefDiscover } newtype GitRefDiscovery = GitRefDiscovery { unGRD :: RefDiscover }
instance ToContent GitRefDiscovery where instance ToContent GitRefDiscovery where
@ -40,7 +42,7 @@ instance ToTypedContent GitRefDiscovery where
c = toContent grd c = toContent grd
in TypedContent t c in TypedContent t c
newtype GitUploadPackResult = GitUploadPackResult { unGUPR :: () } newtype GitUploadPackResult = GitUploadPackResult { unGUPR :: BL.ByteString }
instance ToContent GitUploadPackResult where instance ToContent GitUploadPackResult where
toContent = toContent . unGUPR toContent = toContent . unGUPR

View file

@ -22,6 +22,9 @@ where
import Prelude import Prelude
import Control.Monad.IO.Class (liftIO) import Control.Monad.IO.Class (liftIO)
import Data.Git.Harder (ObjId (..))
import Data.Git.Harder.Pack
import Data.Git.Repository (getCommit)
import Data.Git.Storage (isRepo, withRepo) import Data.Git.Storage (isRepo, withRepo)
import Data.String (fromString) import Data.String (fromString)
import Data.Text (Text) import Data.Text (Text)
@ -66,5 +69,29 @@ postGitUploadRequestR sharer repo = do
ereq <- decodeRequestBody getUploadRequest ereq <- decodeRequestBody getUploadRequest
case ereq of case ereq of
Left _ -> invalidArgs ["UploadRequest"] Left _ -> invalidArgs ["UploadRequest"]
Right ur -> return $ GitUploadPackResult () Right ur -> do
-- We need to handle /have/ lines and verify the /want/ed
-- refs appear in the ref discovery we sent. But we for now
-- ignore these things. Suppose the client didn't send an
-- /have/s, what's next? It seems we now need to build and
-- send a pack.
--
-- We just send a full pack with all the ancestors of the
-- wants.
--
-- IDEA: abstract away the HTTP request part by:
--
-- (1) Read the request body in chunks and use Get to read
-- (2) Use a Put to create the response, possibly send in
-- chunks, or instead first make LBS and then send?
-- TODO currently the code assumes all of these are commits
-- but they can also be tags (are there other options?)
let oids = urWants ur
lbs <- liftIO $ withRepo pathG $ \ git -> do
let getC oid = (oid,) <$> getCommit git (unObjId oid)
pairs <- traverse getC oids
oidset <- collectObjIds git pairs
serializePack git oidset
return $ GitUploadPackResult lbs
else notFound else notFound

View file

@ -10,6 +10,7 @@ packages:
- '.' - '.'
- '../../../other-work/ssh' - '../../../other-work/ssh'
- '../hit-graph' - '../hit-graph'
- '../hit-harder'
- '../hit-network' - '../hit-network'
# Packages to be pulled from upstream that are not in the resolver (e.g., # Packages to be pulled from upstream that are not in the resolver (e.g.,
@ -17,7 +18,9 @@ packages:
extra-deps: extra-deps:
- highlighter2-0.2.5 - highlighter2-0.2.5
- hit-graph-0.1 - hit-graph-0.1
- hit-harder-0.1
- hit-network-0.1 - hit-network-0.1
- monad-hash-0.1
- SimpleAES-0.4.2 - SimpleAES-0.4.2
# - ssh-0.3.2 # - ssh-0.3.2
# Required for M.alter used in hit-graph # Required for M.alter used in hit-graph

View file

@ -118,6 +118,7 @@ library
, highlighting-kate , highlighting-kate
, hit , hit
, hit-graph >= 0.1 , hit-graph >= 0.1
, hit-harder >= 0.1
, hit-network >= 0.1 , hit-network >= 0.1
, hjsmin , hjsmin
, hourglass , hourglass