Skip to content

Commit 8f8b481

Browse files
authored
Support extra repositories in hackage-to-nix (input-output-hk#84)
hackage-to-nix tool operates on hard-coded path to global Hackage database. This commit allows to optionally specify alternative Hackage 01-index.tar file, along with Hackage url. This url is then hardcoded into generated nix expressions, to make sure that their source can be fetched when building.
1 parent b1286d6 commit 8f8b481

File tree

2 files changed

+44
-22
lines changed

2 files changed

+44
-22
lines changed

hackage2nix/Main.hs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,12 @@ import System.FilePath ( (</>)
4646

4747
main :: IO ()
4848
main = do
49-
[out] <- getArgs
50-
db <- U.readTarball Nothing =<< hackageTarball
49+
out:rest <- getArgs
50+
(inp, src) <- case rest of
51+
[tarball, url] -> return (tarball, Just $ PrivateHackage url)
52+
[] -> hackageTarball >>= \tarball -> return (tarball, Nothing)
53+
54+
db <- U.readTarball Nothing inp
5155

5256
let (defaultJson, cabalFiles) =
5357
runState (fmap (object . toList . (Seq.sortOn fst)) $ foldMapWithKeyA package2json db) mempty
@@ -69,7 +73,7 @@ main = do
6973
createDirectoryIfMissing False (out </> "hackage")
7074

7175
for_ cabalFiles $ \(cabalFile, pname, path) -> do
72-
gpd <- cabal2nix False MinimalDetails Nothing $ InMemory Nothing pname $ BL.toStrict cabalFile
76+
gpd <- cabal2nix False MinimalDetails src $ InMemory Nothing pname $ BL.toStrict cabalFile
7377
writeFile (out </> path) $ show $ prettyNix gpd
7478

7579
type GPDWriter = State (Seq (BL.ByteString, String, FilePath))

lib/Cabal2Nix.hs

Lines changed: 37 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ import Distribution.Types.PkgconfigDependency
2424
import Distribution.Types.PkgconfigName
2525
import Distribution.Types.VersionRange
2626
import Distribution.Compiler
27-
import Distribution.Types.PackageName (PackageName, mkPackageName)
27+
import Distribution.Types.PackageName (PackageName, mkPackageName, unPackageName)
2828
import Distribution.Simple.BuildToolDepends (desugarBuildTool)
2929
import Distribution.ModuleName (ModuleName)
3030
import qualified Distribution.ModuleName as ModuleName
@@ -44,6 +44,7 @@ import Cabal2Nix.Util (quoted, selectOr, mkThrow)
4444

4545
data Src
4646
= Path FilePath
47+
| PrivateHackage String
4748
| Git String String (Maybe String) (Maybe String)
4849
deriving Show
4950

@@ -97,14 +98,18 @@ cabal2nix isLocal fileDetails src = \case
9798
(_, Right desc) -> pure desc
9899

99100
gpd2nix :: Bool -> CabalDetailLevel -> Maybe Src -> Maybe NExpr -> GenericPackageDescription -> NExpr
100-
gpd2nix isLocal fileDetails src extra gpd = mkLets errorFunctions $ mkFunction args $ toNixGenericPackageDescription isLocal fileDetails gpd $//? (toNix <$> src) $//? extra
101+
gpd2nix isLocal fileDetails src extra gpd =
102+
mkLets errorFunctions $ mkFunction args $ toNixGenericPackageDescription isLocal fileDetails gpd
103+
$//? (srcToNix (package $ packageDescription gpd) <$> src)
104+
$//? extra
101105
where args :: Params NExpr
102106
args = mkParamset [ ("system", Nothing)
103107
, ("compiler", Nothing)
104108
, ("flags", Nothing)
105109
, (pkgs, Nothing)
106110
, (hsPkgs, Nothing)
107-
, (pkgconfPkgs, Nothing)]
111+
, (pkgconfPkgs, Nothing)
112+
, ("config", Nothing)]
108113
True
109114

110115
errorFunctions :: [Binding NExpr]
@@ -216,22 +221,6 @@ class ToNixExpr a where
216221
class ToNixBinding a where
217222
toNixBinding :: a -> Binding NExpr
218223

219-
instance ToNixExpr Src where
220-
toNix (Path p) = mkRecSet [ "src" $= applyMkDefault (mkRelPath p) ]
221-
toNix (Git url rev mbSha256 mbPath)
222-
= mkNonRecSet $
223-
[ "src" $= applyMkDefault (mkSym pkgs @. "fetchgit" @@ mkNonRecSet
224-
[ "url" $= mkStr (fromString url)
225-
, "rev" $= mkStr (fromString rev)
226-
, "sha256" $= case mbSha256 of
227-
Just sha256 -> mkStr (fromString sha256)
228-
Nothing -> mkNull
229-
])
230-
] <>
231-
[ "postUnpack"
232-
$= mkStr (fromString $ "sourceRoot+=/" <> root <> "; echo source root reset to $sourceRoot")
233-
| Just root <- [mbPath] ]
234-
235224
applyMkDefault :: NExpr -> NExpr
236225
applyMkDefault expr = mkSym pkgs @. "lib" @. "mkDefault" @@ expr
237226

@@ -272,6 +261,35 @@ toNixPackageDescription isLocal detailLevel pd = mkNonRecSet $
272261
, "extraDocFiles" $= toNix (extraDocFiles pd)
273262
]
274263

264+
srcToNix :: PackageIdentifier -> Src -> NExpr
265+
srcToNix _ (Path p) = mkRecSet [ "src" $= applyMkDefault (mkRelPath p) ]
266+
srcToNix pi' (PrivateHackage url)
267+
= mkNonRecSet $
268+
[ "src" $= applyMkDefault (mkSym pkgs @. "fetchurl" @@ mkNonRecSet
269+
[ "url" $= mkStr (fromString $ mkPrivateHackageUrl url pi')
270+
, "sha256" $= (mkSym "config" @. "sha256")
271+
])
272+
]
273+
srcToNix _ (Git url rev mbSha256 mbPath)
274+
= mkNonRecSet $
275+
[ "src" $= applyMkDefault (mkSym pkgs @. "fetchgit" @@ mkNonRecSet
276+
[ "url" $= mkStr (fromString url)
277+
, "rev" $= mkStr (fromString rev)
278+
, "sha256" $= case mbSha256 of
279+
Just sha256 -> mkStr (fromString sha256)
280+
Nothing -> mkNull
281+
])
282+
] <>
283+
[ "postUnpack"
284+
$= mkStr (fromString $ "sourceRoot+=/" <> root <> "; echo source root reset to $sourceRoot")
285+
| Just root <- [mbPath] ]
286+
287+
mkPrivateHackageUrl :: String -> PackageIdentifier -> String
288+
mkPrivateHackageUrl hackageUrl pi' =
289+
hackageUrl <> "/package/" <> pkgNameVersion <> "/" <> pkgNameVersion <> ".tar.gz"
290+
where
291+
pkgNameVersion = unPackageName (pkgName pi') <> "-" <> show (disp (pkgVersion pi'))
292+
275293
newtype SysDependency = SysDependency { unSysDependency :: String } deriving (Show, Eq, Ord)
276294
newtype BuildToolDependency = BuildToolDependency { unBuildToolDependency :: PackageName } deriving (Show, Eq, Ord)
277295

0 commit comments

Comments
 (0)