diff options
| author | Eugen Wissner <belka@caraus.de> | 2023-08-25 10:30:24 +0200 |
|---|---|---|
| committer | Eugen Wissner <belka@caraus.de> | 2023-08-25 10:30:24 +0200 |
| commit | 2126488066713719e26a1049adb080e68ec124f1 (patch) | |
| tree | c3bdae9dd7a71f4e06666bf125e834f120453794 /app/SlackBuilder | |
| parent | 6983304b9d11e78ebf5fd21c835dd04c776102f5 (diff) | |
| download | slackbuilder-2126488066713719e26a1049adb080e68ec124f1.tar.gz | |
Implement clone command in the binary
Diffstat (limited to 'app/SlackBuilder')
| -rw-r--r-- | app/SlackBuilder/CommandLine.hs | 6 | ||||
| -rw-r--r-- | app/SlackBuilder/Download.hs | 29 |
2 files changed, 30 insertions, 5 deletions
diff --git a/app/SlackBuilder/CommandLine.hs b/app/SlackBuilder/CommandLine.hs index f486b5a..1b0d7ed 100644 --- a/app/SlackBuilder/CommandLine.hs +++ b/app/SlackBuilder/CommandLine.hs @@ -28,6 +28,7 @@ data SlackBuilderCommand | ExistsCommand Text | ArchiveCommand Text Text String Text | DownloadCommand Text String + | CloneCommand Text Text Text deriving (Eq, Show) data PackagistArguments = PackagistArguments @@ -71,6 +72,7 @@ slackBuilderCommand = subparser <> command "exists" (info existsCommand mempty) <> command "archive" (info archiveCommand mempty) <> command "download" (info downloadCommand mempty) + <> command "clone" (info cloneCommand mempty) where slackBuildCommand = SlackBuildCommand <$> argument str (metavar "PATH") @@ -87,3 +89,7 @@ slackBuilderCommand = subparser downloadCommand = DownloadCommand <$> argument str (metavar "URI") <*> argument str (metavar "TARGET") + cloneCommand = CloneCommand + <$> argument str (metavar "REPO") + <*> argument str (metavar "TARBALL") + <*> argument str (metavar "TAG_PREFIX") diff --git a/app/SlackBuilder/Download.hs b/app/SlackBuilder/Download.hs index 842f4ae..c6516d4 100644 --- a/app/SlackBuilder/Download.hs +++ b/app/SlackBuilder/Download.hs @@ -1,5 +1,6 @@ module SlackBuilder.Download - ( cloneAndArchive + ( clone + , cloneAndArchive , commit , download , hostedSources @@ -17,7 +18,7 @@ import SlackBuilder.Trans import Control.Monad.Trans.Reader (asks) import Control.Monad.IO.Class (MonadIO(liftIO)) import System.IO (IOMode(..), withFile) -import System.FilePath ((</>), (<.>)) +import System.FilePath ((</>), (<.>), takeBaseName, splitPath, joinPath) import System.Process ( CreateProcess(..) , StdStream(..) @@ -51,6 +52,7 @@ import Conduit , (.|) , ZipSink(..) , await + , sourceFile ) import Crypto.Hash (Digest, MD5, hashInit, hashFinalize, hashUpdate) import Data.Void (Void) @@ -159,12 +161,29 @@ sinkHash = sink hashInit sink ctx = await >>= maybe (pure $ hashFinalize ctx) (sink . hashUpdate ctx) -download :: Text -> FilePath -> SlackBuilderT (Maybe (Digest MD5)) -download uri target = SlackBuilderT (liftIO $ mkURI uri) - >>= traverse (runReq defaultHttpConfig . go . fst) . useHttpsURI +download :: URI -> FilePath -> SlackBuilderT (Maybe (Digest MD5)) +download uri target = traverse (runReq defaultHttpConfig . go . fst) + $ useHttpsURI uri where go uri' = reqBr GET uri' NoReqBody mempty readResponse readResponse :: Response BodyReader -> IO (Digest MD5) readResponse response = runConduitRes $ responseBodySource response .| getZipSink (ZipSink (sinkFile target) *> ZipSink sinkHash) + +clone :: Text -> Text -> Text -> SlackBuilderT (Maybe (Digest MD5)) +clone repo tarball tagPrefix = do + let tarballPath = Text.unpack tarball + nameVersion = Text.pack $ takeBaseName tarballPath + remotePath = Text.pack $ joinPath $ ("/" :) $ drop 1 $ splitPath tarballPath + localPath = "slackbuilds" </> tarballPath + remoteFileExists' <- remoteFileExists remotePath + + if remoteFileExists' + then + hostedSources remotePath >>= flip download localPath + else + let go = sourceFile localPath .| sinkHash + in cloneAndArchive repo nameVersion tarballPath tagPrefix + >> uploadCommand tarball remotePath + >> liftIO (runConduitRes go) <&> Just |
