Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Newer
Older
100644 379 lines (326 sloc) 14.268 kb
deff889 @trofi Some fixes for -Wall (name colisions, redundant imports)
trofi authored
1 {-# OPTIONS -XPatternGuards #-}
a1730ad @kolmodin Switch to using Cabal's CLI API
kolmodin authored
2 module Merge where
3
4 import Control.Monad.Error
8135c0c @kolmodin Implement fetching and creation of digests for new ebuilds
kolmodin authored
5 import Control.Exception
a1730ad @kolmodin Switch to using Cabal's CLI API
kolmodin authored
6 import Data.Char
7 import Data.Maybe
8 import Data.List
9 import Data.Version
10 import Distribution.Package
11 import Distribution.Compiler (CompilerId(..), CompilerFlavor(GHC))
cb4a7bb @kolmodin Start on translating extra-libraries into ebuild deps
kolmodin authored
12 import Distribution.PackageDescription ( PackageDescription(..)
deff889 @trofi Some fixes for -Wall (name colisions, redundant imports)
trofi authored
13 -- , FlagName(..)
cb4a7bb @kolmodin Start on translating extra-libraries into ebuild deps
kolmodin authored
14 , libBuildInfo
15 , buildInfo
1de8047 @kolmodin Add build-tools deps as well, using a static table
kolmodin authored
16 , extraLibs
17 , buildTools )
a1730ad @kolmodin Switch to using Cabal's CLI API
kolmodin authored
18 import Distribution.PackageDescription.Configuration
19 ( finalizePackageDescription )
f309365 @kolmodin Reimplement 'hackport merge'
kolmodin authored
20 -- import Distribution.PackageDescription.Parse ( showPackageDescription )
a1730ad @kolmodin Switch to using Cabal's CLI API
kolmodin authored
21 import Distribution.Simple.PackageIndex (PackageIndex)
22 import Distribution.Text (display)
23
f309365 @kolmodin Reimplement 'hackport merge'
kolmodin authored
24 import System.Directory ( getCurrentDirectory
25 , setCurrentDirectory
26 , createDirectoryIfMissing
27 )
a1730ad @kolmodin Switch to using Cabal's CLI API
kolmodin authored
28 import System.IO
8135c0c @kolmodin Implement fetching and creation of digests for new ebuilds
kolmodin authored
29 import System.Cmd (system)
deff889 @trofi Some fixes for -Wall (name colisions, redundant imports)
trofi authored
30 import System.FilePath ((</>))
a1730ad @kolmodin Switch to using Cabal's CLI API
kolmodin authored
31 import qualified Data.Map as Map
32
33 import qualified Cabal2Ebuild as E
f309365 @kolmodin Reimplement 'hackport merge'
kolmodin authored
34 import Error as E
a1730ad @kolmodin Switch to using Cabal's CLI API
kolmodin authored
35 import Overlays
f309365 @kolmodin Reimplement 'hackport merge'
kolmodin authored
36
37 import qualified Distribution.Package as Cabal
38 import qualified Distribution.Version as Cabal
a1730ad @kolmodin Switch to using Cabal's CLI API
kolmodin authored
39
8135c0c @kolmodin Implement fetching and creation of digests for new ebuilds
kolmodin authored
40 import Distribution.System (buildOS, buildArch)
a1730ad @kolmodin Switch to using Cabal's CLI API
kolmodin authored
41 import Distribution.Verbosity
42 import Distribution.Simple.Utils
43
44 import Network.URI
8135c0c @kolmodin Implement fetching and creation of digests for new ebuilds
kolmodin authored
45 import Network.HTTP
a1730ad @kolmodin Switch to using Cabal's CLI API
kolmodin authored
46
47 import Cabal2Ebuild
48
f309365 @kolmodin Reimplement 'hackport merge'
kolmodin authored
49 import Distribution.Client.IndexUtils ( getAvailablePackages )
50 import qualified Distribution.Simple.PackageIndex as Index
51 import Distribution.Client.Types
52
53 import qualified Portage.PackageId as Portage
54 import qualified Portage.Version as Portage
55 import qualified Portage.Overlay as Overlay
56
57 import Cabal2Ebuild
58
1c11ba1 @kolmodin Handle colliding package names better when looking for extra-libs
kolmodin authored
59 import Debug.Trace
60
f309365 @kolmodin Reimplement 'hackport merge'
kolmodin authored
61 -- This is just a hack to simplify version ranges.
62 -- Backported from Cabal HEAD to work with Cabal 1.6.
63 -- Replace this module once it's included in a cabal release.
64 import CabalDistributionVersion (simplifyVersionRange)
65
deff889 @trofi Some fixes for -Wall (name colisions, redundant imports)
trofi authored
66 (<->) :: String -> String -> String
f56d508 @kolmodin Cleanup in merge
kolmodin authored
67 a <-> b = a ++ '-':b
deff889 @trofi Some fixes for -Wall (name colisions, redundant imports)
trofi authored
68
69 (<.>) :: String -> String -> String
f56d508 @kolmodin Cleanup in merge
kolmodin authored
70 a <.> b = a ++ '.':b
71
22e0fbc @kolmodin Add requests for 'hackport merge'
kolmodin authored
72 {-
73 Requested features:
c2b8367 @kolmodin Update TODOs
kolmodin authored
74 * Copy the old keywords and ~arch them
22e0fbc @kolmodin Add requests for 'hackport merge'
kolmodin authored
75 * Add files to darcs?
76 * Print diff with the next latest version?
96a6477 @kolmodin Add some todos
kolmodin authored
77 BUGS:
78 * Dependencies are always expected to be in dev-haskell
22e0fbc @kolmodin Add requests for 'hackport merge'
kolmodin authored
79 -}
80
f309365 @kolmodin Reimplement 'hackport merge'
kolmodin authored
81 readPackageString :: [String]
82 -> Either HackPortError ( Maybe Portage.Category
83 , Cabal.PackageName
84 , Maybe Portage.Version
85 )
86 readPackageString args = do
87 packageString <-
88 case args of
7ab62d5 @kolmodin Tried hlint, nice.
kolmodin authored
89 [] -> Left (ArgumentError "Need an argument, [category/]package[-version]")
f309365 @kolmodin Reimplement 'hackport merge'
kolmodin authored
90 [pkg] -> return pkg
91 _ -> Left (ArgumentError ("Too many arguments: " ++ unwords args))
92 case Portage.parseFriendlyPackage packageString of
93 Just v@(_,_,Nothing) -> return v
94 -- we only allow versions we can convert into cabal versions
95 Just v@(_,_,Just (Portage.Version _ Nothing [] 0)) -> return v
96 _ -> Left (ArgumentError ("Could not parse [category/]package[-version]: " ++ packageString))
97
98 -- | If a package already exist in the overlay, find which category it has.
99 -- If it does not exist, we default to \'dev-haskell\'.
100 resolveCategory :: Verbosity -> Overlay.Overlay -> Cabal.PackageName -> IO Portage.Category
101 resolveCategory verbosity overlay pn = do
7ab62d5 @kolmodin Tried hlint, nice.
kolmodin authored
102 info verbosity "Searching for which category to use..."
f309365 @kolmodin Reimplement 'hackport merge'
kolmodin authored
103 case resolveCategories overlay pn of
104 [] -> do
105 info verbosity "No previous version of this package, defaulting category to dev-haskell."
106 return devhaskell
107 [cat] -> do
108 info verbosity $ "Exact match of already existing package, using category: "
109 ++ display cat
110 return cat
111 cats -> do
112 warn verbosity $ "Multiple matches of categories: " ++ unwords (map display cats)
113 if devhaskell `elem` cats
114 then do notice verbosity "Defaulting to dev-haskell"
115 return devhaskell
116 else do warn verbosity "Multiple matches and no known default. Override by specifying "
117 warn verbosity "package category like so 'hackport merge categoryname/package[-version]."
118 throwEx (ArgumentError "Specify package category and try again.")
119 where
120 devhaskell = Portage.Category "dev-haskell"
121
122 resolveCategories :: Overlay.Overlay -> Cabal.PackageName -> [Portage.Category]
123 resolveCategories overlay pn =
124 [ cat
125 | (Portage.PackageName cat pn') <- Map.keys om
126 , pn == Portage.normalizeCabalPackageName pn'
127 ]
128 where
129 om = Overlay.overlayMap overlay
130
823b6ef @kolmodin Look into portage dir when resolving extra-libraries
kolmodin authored
131 resolveFullPortageName :: Overlay.Overlay -> Cabal.PackageName -> Maybe Portage.PackageName
132 resolveFullPortageName overlay pn =
133 case resolveCategories overlay pn of
134 [] -> Nothing
1c11ba1 @kolmodin Handle colliding package names better when looking for extra-libs
kolmodin authored
135 [cat] -> ret cat
136 cats | (cat:_) <- (filter (`elem` cats) priority) -> ret cat
137 | otherwise -> trace ("Ambiguous package name: " ++ show pn ++ ", hits: " ++ show cats) Nothing
823b6ef @kolmodin Look into portage dir when resolving extra-libraries
kolmodin authored
138 where
1c11ba1 @kolmodin Handle colliding package names better when looking for extra-libs
kolmodin authored
139 ret c = return (Portage.PackageName c pn)
140 mkC = Portage.Category
141 -- if any of these categories show up in the result list, the match isn't
142 -- ambiguous, pick the first match in the list
143 priority = [ mkC "dev-haskell"
144 , mkC "sys-libs"
145 , mkC "dev-libs"
146 , mkC "x11-libs"
147 , mkC "media-libs"
148 , mkC "net-libs"
149 , mkC "sci-libs"
150 ]
823b6ef @kolmodin Look into portage dir when resolving extra-libraries
kolmodin authored
151
152
f309365 @kolmodin Reimplement 'hackport merge'
kolmodin authored
153 -- | Given a list of available packages, and maybe a preferred version,
154 -- return the available package with that version. Latest version is chosen
155 -- if no preference.
156 resolveVersion :: [AvailablePackage] -> Maybe Cabal.Version -> Maybe AvailablePackage
157 resolveVersion avails Nothing = Just $ maximumBy (comparing packageInfoId) avails
158 resolveVersion avails (Just ver) = listToMaybe (filter match avails)
159 where
7ab62d5 @kolmodin Tried hlint, nice.
kolmodin authored
160 match avail = ver == pkgVersion (packageInfoId avail)
f309365 @kolmodin Reimplement 'hackport merge'
kolmodin authored
161
162 merge :: Verbosity -> Repo -> URI -> [String] -> IO ()
163 merge verbosity repo serverURI args = do
164 (m_category, user_pName, m_version) <-
165 case readPackageString args of
166 Left err -> throwEx err
167 Right (c,p,m_v) ->
168 case m_v of
169 Nothing -> return (c,p,Nothing)
170 Just v -> case Portage.toCabalVersion v of
171 Nothing -> throwEx (ArgumentError "illegal version")
172 Just ver -> return (c,p,Just ver)
173
174 debug verbosity $ "Category: " ++ show m_category
175 debug verbosity $ "Package: " ++ show user_pName
176 debug verbosity $ "Version: " ++ show m_version
177
178 let (Cabal.PackageName user_pname_str) = user_pName
179
180 overlayPath <- getOverlayPath verbosity
181 overlay <- Overlay.loadLazy overlayPath
823b6ef @kolmodin Look into portage dir when resolving extra-libraries
kolmodin authored
182 portage <- Overlay.loadLazy "/usr/portage"
f309365 @kolmodin Reimplement 'hackport merge'
kolmodin authored
183 index <- fmap packageIndex $ getAvailablePackages verbosity [ repo ]
184
185 -- find all packages that maches the user specified package name
186 availablePkgs <-
187 case Index.searchByName index user_pname_str of
188 Index.None -> throwEx (PackageNotFound user_pname_str)
189 Index.Ambiguous pkgs -> throwEx (ArgumentError ("Ambiguous name: " ++ unwords (map show pkgs)))
190 Index.Unambiguous pkg -> return pkg
191
192 -- select a single package taking into account the user specified version
193 selectedPkg <-
194 case resolveVersion availablePkgs m_version of
195 Nothing -> do
196 putStrLn "No such version for that package, available versions:"
7ab62d5 @kolmodin Tried hlint, nice.
kolmodin authored
197 forM_ availablePkgs $ \ avail ->
f309365 @kolmodin Reimplement 'hackport merge'
kolmodin authored
198 putStrLn (display . packageInfoId $ avail)
199 throwEx (ArgumentError "no such version for that package")
200 Just avail -> return avail
201
202 -- print some info
203 info verbosity "Selecting package:"
204 forM_ availablePkgs $ \ avail -> do
205 let match_text | packageInfoId avail == packageInfoId selectedPkg = "* "
206 | otherwise = "- "
207 info verbosity $ match_text ++ (display . packageInfoId $ avail)
208
209 let cabal_pkgId = packageInfoId selectedPkg
210 norm_pkgId = Portage.normalizeCabalPackageId cabal_pkgId
211 norm_pkgName = packageName norm_pkgId
deff889 @trofi Some fixes for -Wall (name colisions, redundant imports)
trofi authored
212 cat <- resolveCategory verbosity overlay norm_pkgName
f309365 @kolmodin Reimplement 'hackport merge'
kolmodin authored
213
214 let pkgGenericDesc = packageDescription selectedPkg
215 Right (pkgDesc0, flags) =
216 finalizePackageDescription
217 [ -- XXX: common things we should enable/disable?
218 -- (FlagName "small_base", True) -- try to use small base
219 ]
220 (Nothing :: Maybe (PackageIndex PackageIdentifier))
221 buildOS buildArch
222 (CompilerId GHC (Version [6,10,1] []))
223 [] pkgGenericDesc
224 pkgDesc = let deps = [ Dependency pn (simplifyVersionRange vr)
225 | Dependency pn vr <- buildDepends pkgDesc0
226 ]
227 in pkgDesc0 { buildDepends = deps }
1de8047 @kolmodin Add build-tools deps as well, using a static table
kolmodin authored
228
229 bt = [ Cabal.Dependency (Cabal.PackageName pkg') range
230 | Cabal.Dependency (Cabal.PackageName pkg ) range <- buildToolsDeps pkgDesc
231 , Just pkg' <- return (lookup pkg buildToolsTable)
232 ]
233
823b6ef @kolmodin Look into portage dir when resolving extra-libraries
kolmodin authored
234 packageNameResolver s = do
deff889 @trofi Some fixes for -Wall (name colisions, redundant imports)
trofi authored
235 (Portage.PackageName (Portage.Category p_cat) (Cabal.PackageName pn))
823b6ef @kolmodin Look into portage dir when resolving extra-libraries
kolmodin authored
236 <- resolveFullPortageName portage (Cabal.PackageName s)
deff889 @trofi Some fixes for -Wall (name colisions, redundant imports)
trofi authored
237 return $ E.AnyVersionOf (p_cat </> pn)
823b6ef @kolmodin Look into portage dir when resolving extra-libraries
kolmodin authored
238
239 extra <- findCLibs verbosity packageNameResolver pkgDesc
f309365 @kolmodin Reimplement 'hackport merge'
kolmodin authored
240
241 debug verbosity ("Selected flags: " ++ show flags)
cb4a7bb @kolmodin Start on translating extra-libraries into ebuild deps
kolmodin authored
242 debug verbosity ("extra-libs: ")
243 mapM_ (debug verbosity . show) extra
1de8047 @kolmodin Add build-tools deps as well, using a static table
kolmodin authored
244
245 debug verbosity ("build-tools:")
246 mapM_ (debug verbosity . show) bt
247
f309365 @kolmodin Reimplement 'hackport merge'
kolmodin authored
248 -- debug verbosity ("Finalized package:\n" ++ showPackageDescription pkgDesc)
249
250 -- TODO: more fixes
96a6477 @kolmodin Add some todos
kolmodin authored
251 -- * inherit keywords from previous ebuilds
cb4a7bb @kolmodin Start on translating extra-libraries into ebuild deps
kolmodin authored
252 let ebuild = fixSrc serverURI (packageId pkgDesc)
253 . addDeps extra
1de8047 @kolmodin Add build-tools deps as well, using a static table
kolmodin authored
254 . addDeps (convertDependencies bt)
cb4a7bb @kolmodin Start on translating extra-libraries into ebuild deps
kolmodin authored
255 $ E.cabal2ebuild pkgDesc
deff889 @trofi Some fixes for -Wall (name colisions, redundant imports)
trofi authored
256 -- ebuildName = display category </> display norm_pkgId
f309365 @kolmodin Reimplement 'hackport merge'
kolmodin authored
257
deff889 @trofi Some fixes for -Wall (name colisions, redundant imports)
trofi authored
258 mergeEbuild verbosity overlayPath (Portage.unCategory cat) ebuild
f309365 @kolmodin Reimplement 'hackport merge'
kolmodin authored
259 fetchAndDigest
260 verbosity
deff889 @trofi Some fixes for -Wall (name colisions, redundant imports)
trofi authored
261 (overlayPath </> display cat </> display norm_pkgName)
f309365 @kolmodin Reimplement 'hackport merge'
kolmodin authored
262 (display cabal_pkgId <.> "tar.gz")
263 (mkUri cabal_pkgId)
264
cb4a7bb @kolmodin Start on translating extra-libraries into ebuild deps
kolmodin authored
265 addDeps :: [E.Dependency] -> EBuild -> EBuild
266 addDeps d e = e { depend = depend e ++ d }
267
36431fe @kolmodin Further cleanup
kolmodin authored
268 findCLibs :: Verbosity -> (String -> Maybe E.Dependency) -> PackageDescription -> IO [E.Dependency]
269 findCLibs verbosity portageResolver (PackageDescription { library = lib, executables = exes }) = do
823b6ef @kolmodin Look into portage dir when resolving extra-libraries
kolmodin authored
270 debug verbosity "Mapping extra-libraries into portage packages..."
cb4a7bb @kolmodin Start on translating extra-libraries into ebuild deps
kolmodin authored
271 -- for extra libs we don't find, maybe look into into installed packages?
823b6ef @kolmodin Look into portage dir when resolving extra-libraries
kolmodin authored
272 when (not . null $ notFound) $
87489f1 @kolmodin Clean up the extra-libraries resolving a bit
kolmodin authored
273 warn verbosity ("Could not find portage packages for extra-libraries: " ++ unwords notFound)
823b6ef @kolmodin Look into portage dir when resolving extra-libraries
kolmodin authored
274 when (not . null $ found) $
275 debug verbosity ("Found c-libraries deps: " ++ show found)
276 return found
cb4a7bb @kolmodin Start on translating extra-libraries into ebuild deps
kolmodin authored
277 where
87489f1 @kolmodin Clean up the extra-libraries resolving a bit
kolmodin authored
278 resolvers = [ staticTranslateExtraLib, portageResolver ]
279
280 resolved = [ chain p resolvers
281 | p <- libE ++ exeE
282 ] :: [Either String E.Dependency]
283
284 notFound = [ p | Left p <- resolved ]
285 found = [ p | Right p <- resolved ]
286
287 chain v [] = Left v
288 chain v (f:fs) = case f v of
289 Nothing -> chain v fs
290 Just x -> Right x
291
cb4a7bb @kolmodin Start on translating extra-libraries into ebuild deps
kolmodin authored
292 libE = maybe [] (extraLibs.libBuildInfo) lib
293 exeE = concatMap (extraLibs.buildInfo) exes
294
87489f1 @kolmodin Clean up the extra-libraries resolving a bit
kolmodin authored
295 staticTranslateExtraLib :: String -> Maybe E.Dependency
296 staticTranslateExtraLib lib = lookup lib m
cb4a7bb @kolmodin Start on translating extra-libraries into ebuild deps
kolmodin authored
297 where
298 m = [ ("z", E.AnyVersionOf "sys-libs/zlib")
299 , ("bz2", E.AnyVersionOf "sys-libs/bzlib")
300 ]
301
1de8047 @kolmodin Add build-tools deps as well, using a static table
kolmodin authored
302 buildToolsDeps :: PackageDescription -> [Cabal.Dependency]
303 buildToolsDeps (PackageDescription { library = lib, executables = exes }) = cabalDeps
304 where
305 cabalDeps = depL ++ depE
306 depL = maybe [] (buildTools.libBuildInfo) lib
307 depE = concatMap (buildTools.buildInfo) exes
308
309 buildToolsTable :: [(String, String)]
310 buildToolsTable =
311 [ ("happy", "dev-haskell/happy")
312 , ("alex", "dev-haskell/alex")
313 , ("c2hs", "dev-haskell/c2hs")
314 ]
315
f309365 @kolmodin Reimplement 'hackport merge'
kolmodin authored
316 mkUri :: Cabal.PackageIdentifier -> URI
317 mkUri pid =
318 -- example:
319 -- http://hackage.haskell.org/packages/archive/Cabal/1.4.0.2/Cabal-1.4.0.2.tar.gz
320 fromJust $ parseURI $
321 "http://hackage.haskell.org/packages/archive/"
deff889 @trofi Some fixes for -Wall (name colisions, redundant imports)
trofi authored
322 </> p_name </> p_ver </> p_name <-> p_ver <.> "tar.gz"
f309365 @kolmodin Reimplement 'hackport merge'
kolmodin authored
323 where
deff889 @trofi Some fixes for -Wall (name colisions, redundant imports)
trofi authored
324 p_ver = display (packageVersion pid)
325 p_name = display (packageName pid)
8135c0c @kolmodin Implement fetching and creation of digests for new ebuilds
kolmodin authored
326
327 fetchAndDigest :: Verbosity
328 -> FilePath -- ^ directory of ebuild
329 -> String -- ^ tarball name
330 -> URI -- ^ tarball uri
6ec3592 Hackport now uses Cabal-1.6
Ivan.Miljenovic@gmail.com authored
331 -> IO ()
7ab62d5 @kolmodin Tried hlint, nice.
kolmodin authored
332 fetchAndDigest verbosity ebuildDir tarballName tarballURI =
8135c0c @kolmodin Implement fetching and creation of digests for new ebuilds
kolmodin authored
333 withWorkingDirectory ebuildDir $ do
f56d508 @kolmodin Cleanup in merge
kolmodin authored
334 notice verbosity $ "Fetching " ++ show tarballURI
deff889 @trofi Some fixes for -Wall (name colisions, redundant imports)
trofi authored
335 e_response <- simpleHTTP (Request tarballURI GET [] "")
336 case e_response of
f309365 @kolmodin Reimplement 'hackport merge'
kolmodin authored
337 Left err -> throwEx (E.DownloadFailed (show tarballURI) (show err))
8135c0c @kolmodin Implement fetching and creation of digests for new ebuilds
kolmodin authored
338 Right response -> do
339 let tarDestination = "/usr/portage/distfiles" </> tarballName
f56d508 @kolmodin Cleanup in merge
kolmodin authored
340 notice verbosity $ "Saving to " ++ tarDestination
8135c0c @kolmodin Implement fetching and creation of digests for new ebuilds
kolmodin authored
341 writeFile tarDestination (rspBody response)
7ab62d5 @kolmodin Tried hlint, nice.
kolmodin authored
342 notice verbosity "Recalculating digests..."
8135c0c @kolmodin Implement fetching and creation of digests for new ebuilds
kolmodin authored
343 system "repoman manifest"
344 return ()
345
346 withWorkingDirectory :: FilePath -> IO a -> IO a
347 withWorkingDirectory newDir action = do
348 oldDir <- getCurrentDirectory
349 bracket
350 (setCurrentDirectory newDir)
351 (\_ -> setCurrentDirectory oldDir)
352 (\_ -> action)
f309365 @kolmodin Reimplement 'hackport merge'
kolmodin authored
353
354 mergeEbuild :: Verbosity -> FilePath -> String -> EBuild -> IO ()
deff889 @trofi Some fixes for -Wall (name colisions, redundant imports)
trofi authored
355 mergeEbuild verbosity target cat ebuild = do
356 let edir = target </> cat </> name ebuild
f309365 @kolmodin Reimplement 'hackport merge'
kolmodin authored
357 elocal = name ebuild ++"-"++ version ebuild <.> "ebuild"
358 epath = edir </> elocal
359 createDirectoryIfMissing True edir
360 info verbosity $ "Writing " ++ elocal
361 writeFile epath (showEBuild ebuild)
362
363 fixSrc :: URI -> PackageIdentifier -> EBuild -> EBuild
364 fixSrc serverURI p ebuild =
365 ebuild {
366 src_uri = show $ serverURI {
367 uriPath =
7ab62d5 @kolmodin Tried hlint, nice.
kolmodin authored
368 uriPath serverURI
f309365 @kolmodin Reimplement 'hackport merge'
kolmodin authored
369 </> display (pkgName p)
370 </> display (pkgVersion p)
371 </> display (pkgName p) ++ "-" ++ display (pkgVersion p)
372 <.> "tar.gz"
175e753 @kolmodin Set a default homepage to hackport if none is set
kolmodin authored
373 },
374 E.homepage = case E.homepage ebuild of
375 "" -> "http://hackage.haskell.org/cgi-bin/hackage-scripts/package/"
376 ++ display (pkgName p)
377 x -> x
f309365 @kolmodin Reimplement 'hackport merge'
kolmodin authored
378 }
Something went wrong with that request. Please try again.