forked from gentoo-haskell/hackport
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Merge.hs
141 lines (130 loc) · 4.92 KB
/
Merge.hs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
module Merge where
import Control.Monad.Error
import Control.Exception
import Data.Char
import Data.Maybe
import Data.List
import Data.Version
import Distribution.Package
import Distribution.Compiler (CompilerId(..), CompilerFlavor(GHC))
import Distribution.PackageDescription ( PackageDescription(..) )
import Distribution.PackageDescription.Configuration
( finalizePackageDescription )
import Distribution.Simple.PackageIndex (PackageIndex)
import Distribution.Text (display)
import System.Directory ( getCurrentDirectory , setCurrentDirectory )
import System.IO
import System.Cmd (system)
import System.FilePath ((</>), splitPath, joinPath, takeFileName)
import qualified Data.Map as Map
import qualified Cabal2Ebuild as E
import Cache
import Error
import GenerateEbuild
import qualified Portage.PackageId as Portage
import Overlays
import P2
-- import Index (pName)
import Distribution.System (buildOS, buildArch)
import Distribution.Verbosity
import Distribution.Simple.Utils
import Network.URI
import Network.HTTP
import Cabal2Ebuild
a <-> b = a ++ '-':b
a <.> b = a ++ '.':b
{-
Requested features:
* Create an ebuild for the cabal package
- Copy the old keywords and ~arch them
* Download the tarball and digest
* Add files to darcs?
* Print diff with the next latest version?
-}
merge :: Verbosity -> URI -> String -> IO ()
merge = undefined
{-
merge verbosity serverURI pstr = do
(m_category, Portage.PN pname, m_version) <- case Portage.parseFriendlyPackage pstr of
Just v -> return v
Nothing -> throwEx (ArgumentError ("Could not parse [category/]package[-version]: " ++ show pstr))
overlayPath <- getOverlayPath verbosity
overlay <- readPortageTree overlayPath
cache <- readCache verbosity overlayPath serverURI
let (indexTree,clashes) = indexToPortage cache overlay
mapM_ putStrLn clashes
info verbosity $ "Searching for: "++ pstr
let pkgs =
Map.elems
. Map.filterWithKey (\(P _ pname') _ -> map toLower pname' == map toLower pname)
$ indexTree
return ()
pkg <- case pkgs of
[] -> throwEx (PackageNotFound pname)
[xs] -> case m_version of
Nothing -> return (maximum xs) -- highest version
Just v -> do
let ebuilds = filter (\e -> eVersion e == v) xs
case ebuilds of
[] -> throwEx (PackageNotFound (pname ++ '-':show v))
[e] -> return e
_ -> fail "the impossible happened"
_ -> fail "the impossible happened"
category <- do
case m_category of
Just (Portage.Category cat) -> return cat
Nothing -> do
case pCategory (ePackage pkg) of
"hackage" -> return "dev-haskell"
c -> return c
let Just genericDesc = ePkgDesc pkg
Right (desc, _) = finalizePackageDescription []
(Nothing :: Maybe (PackageIndex PackageIdentifier))
buildOS buildArch
(CompilerId GHC (Version [6,8,2] []))
[] genericDesc
let ebuild = fixSrc serverURI (packageId desc) (E.cabal2ebuild desc)
ebuildName = category </> pname <-> display (pkgVersion (packageId desc))
putStrLn $ "Merging " ++ ebuildName
putStrLn $ "Destination: " ++ overlayPath
mergeEbuild overlayPath category ebuild
let
package_name = pName $ pkgName (package desc)
package_version = showVersion (pkgVersion (package desc))
url = "http://hackage.haskell.org/packages/archive/"
</> package_name </> package_version </> package_name <-> package_version <.> "tar.gz"
Just uri = parseURI url
tarballName = package_name <-> package_version <.> "tar.gz"
-- example:
-- http://hackage.haskell.org/packages/archive/Cabal/1.4.0.2/Cabal-1.4.0.2.tar.gz
fetchAndDigest
verbosity
(overlayPath </> category </> pname)
tarballName
uri
fetchAndDigest :: Verbosity
-> FilePath -- ^ directory of ebuild
-> String -- ^ tarball name
-> URI -- ^ tarball uri
-> IO ()
fetchAndDigest verbosity ebuildDir tarballName tarballURI = do
withWorkingDirectory ebuildDir $ do
notice verbosity $ "Fetching " ++ show tarballURI
response <- simpleHTTP (Request tarballURI GET [] "")
case response of
Left err -> print err
Right response -> do
let tarDestination = "/usr/portage/distfiles" </> tarballName
notice verbosity $ "Saving to " ++ tarDestination
writeFile tarDestination (rspBody response)
notice verbosity $ "Recalculating digests..."
system "repoman manifest"
return ()
withWorkingDirectory :: FilePath -> IO a -> IO a
withWorkingDirectory newDir action = do
oldDir <- getCurrentDirectory
bracket
(setCurrentDirectory newDir)
(\_ -> setCurrentDirectory oldDir)
(\_ -> action)
-}