diff --git a/app/Foliage/CmdBuild.hs b/app/Foliage/CmdBuild.hs index 067895a..e7088c1 100644 --- a/app/Foliage/CmdBuild.hs +++ b/app/Foliage/CmdBuild.hs @@ -1,4 +1,5 @@ {-# LANGUAGE DerivingVia #-} +{-# LANGUAGE ImportQualifiedPost #-} {-# LANGUAGE OverloadedStrings #-} module Foliage.CmdBuild (cmdBuild) where @@ -6,10 +7,10 @@ module Foliage.CmdBuild (cmdBuild) where import Codec.Archive.Tar qualified as Tar import Codec.Archive.Tar.Entry qualified as Tar import Codec.Compression.GZip qualified as GZip -import Control.Monad (unless, void, when) +import Control.Monad (foldM, unless, void, when) import Data.Aeson qualified as Aeson -import Data.ByteString qualified as BS -import Data.ByteString.Lazy qualified as BL +import Data.ByteString.Char8 qualified as BS +import Data.ByteString.Lazy.Char8 qualified as BL import Data.List (sortOn) import Data.Maybe (fromMaybe) import Data.Text qualified as T @@ -101,9 +102,10 @@ buildAction void $ forP packageVersions $ makePackageVersionPage outputDir - void $ forP packageVersions $ \PreparedPackageVersion {pkgId, cabalFilePath} -> do - let PackageIdentifier {pkgName, pkgVersion} = pkgId - copyFileChanged cabalFilePath (outputDir "index" prettyShow pkgName prettyShow pkgVersion prettyShow pkgName <.> "cabal") + void $ + forP packageVersions $ \PreparedPackageVersion {pkgId, cabalFilePath} -> do + let PackageIdentifier {pkgName, pkgVersion} = pkgId + copyFileChanged cabalFilePath (outputDir "index" prettyShow pkgName prettyShow pkgVersion prettyShow pkgName <.> "cabal") cabalEntries <- foldMap @@ -113,9 +115,22 @@ buildAction cf <- prepareIndexPkgCabal pkgId cabalFileTimestamp originalCabalFilePath -- all revised cabal files, with their timestamp - revcf <- for cabalFileRevisions $ uncurry (prepareIndexPkgCabal pkgId) - - return $ cf : revcf + revcf <- + foldM + ( \(lastRevisionPath, cabalFiles) (ts, revisionPath) -> do + if takeExtension originalCabalFilePath `elem` [".diff", ".patch"] + then do + patchedRevisionPath <- applyPatch lastRevisionPath revisionPath + preparedCabal <- prepareIndexPkgCabal pkgId ts patchedRevisionPath + return (patchedRevisionPath, cabalFiles ++ [preparedCabal]) + else do + preparedCabal <- prepareIndexPkgCabal pkgId ts revisionPath + return (revisionPath, cabalFiles ++ [preparedCabal]) + ) + (originalCabalFilePath, []) + (sortOn fst cabalFileRevisions) + + return $ cf : snd revcf ) packageVersions @@ -312,3 +327,9 @@ mkTarEntry contents indexFile timestamp = anchorPath :: Path Absolute -> (RepoLayout -> RepoPath) -> FilePath anchorPath outputDirRoot p = toFilePath $ anchorRepoPathLocally outputDirRoot $ p hackageRepoLayout + +applyPatch :: FilePath -> FilePath -> Action FilePath +applyPatch originalFilePath patchFilePath = do + withTempFile $ \outputFilePath -> do + cmd_ ["patch", "-i", patchFilePath, "-o", outputFilePath, originalFilePath] + return outputFilePath