@@ -1,10 +1,13 @@
1module Stackage.LoadDatabase where
1module Stackage.LoadDatabase where
3import qualified Codec.Archive.Tar as Tar
3import qualified Codec.Archive.Tar as Tar
4+import Control.Monad (guard)
4import qualified Data.ByteString.Lazy as L
5import qualified Data.ByteString.Lazy as L
5import qualified Data.ByteString.Lazy.Char8 as L8
6import qualified Data.ByteString.Lazy.Char8 as L8
7+import Data.List (stripPrefix)
6import qualified Data.Map as Map
8import qualified Data.Map as Map
7−import Data.Maybe (mapMaybe)
9+import Data.Maybe (catMaybes, listToMaybe,
8import Data.Monoid (Monoid (..))
11import Data.Monoid (Monoid (..))
9import Data.Set (member)
12import Data.Set (member)
10import qualified Data.Set as Set
13import qualified Data.Set as Set
@@ -12,6 +15,9 @@ import Distribution.Compiler (CompilerFlavor (GHC))
12import Distribution.Package (Dependency (Dependency))
15import Distribution.Package (Dependency (Dependency))
13import Distribution.PackageDescription (Condition (..),
16import Distribution.PackageDescription (Condition (..),
14 ConfVar (..),
17 ConfVar (..),
15 benchmarkBuildInfo,
21 benchmarkBuildInfo,
16 buildInfo, buildTools,
22 buildInfo, buildTools,
17 condBenchmarks,
23 condBenchmarks,
@@ -23,13 +29,15 @@ import Distribution.PackageDescription (Condition (..),
23 condTreeData,
29 condTreeData,
24 flagDefault, flagName,
30 flagDefault, flagName,
25 genPackageFlags,
31 genPackageFlags,
26− libBuildInfo,
32+ homepage, libBuildInfo,
27− testBuildInfo,
35+ testBuildInfo)
29import Distribution.PackageDescription.Parse (ParseResult (ParseOk),
36import Distribution.PackageDescription.Parse (ParseResult (ParseOk),
30 parsePackageDescription)
37 parsePackageDescription)
31import Distribution.System (buildArch, buildOS)
38import Distribution.System (buildArch, buildOS)
32−import Distribution.Version (withinRange, unionVersionRanges)
39+import Distribution.Version (unionVersionRanges,
33import Stackage.Config
41import Stackage.Config
34import Stackage.Types
42import Stackage.Types
35import Stackage.Util
43import Stackage.Util
@@ -71,7 +79,7 @@ loadPackageDB settings core deps = do
72 case Tar.entryContent e of
80 case Tar.entryContent e of
73 Tar.NormalFile bs _ -> do
81 Tar.NormalFile bs _ -> do
74− let (deps', hasTests, buildTools', mgpd, execs) = parseDeps bs
82+ let (deps', hasTests, buildTools', mgpd, execs, mgithub) = parseDeps bs
75 return $ mappend pdb $ PackageDB $ Map.singleton p PackageInfo
83 return $ mappend pdb $ PackageDB $ Map.singleton p PackageInfo
76 { piVersion = v
84 { piVersion = v
77 , piDeps = deps'
85 , piDeps = deps'
@@ -79,6 +87,7 @@ loadPackageDB settings core deps = do
79 , piBuildTools = buildTools'
87 , piBuildTools = buildTools'
80 , piGPD = mgpd
88 , piGPD = mgpd
81 , piExecs = execs
89 , piExecs = execs
90+ , piGithubUser = mgithub
83 _ -> return pdb
92 _ -> return pdb
@@ -93,8 +102,11 @@ loadPackageDB settings core deps = do
93 , Set.fromList $ map depName $ allBuildInfo gpd
102 , Set.fromList $ map depName $ allBuildInfo gpd
94 , Just gpd
103 , Just gpd
95 , Set.fromList $ map (Executable . fst) $ condExecutables gpd
104 , Set.fromList $ map (Executable . fst) $ condExecutables gpd
105+ , listToMaybe $ catMaybes
106+ $ parseGithubUserHP (homepage $ packageDescription gpd)
107+ : map parseGithubUserSR (sourceRepos $ packageDescription gpd)
97− _ -> (mempty, defaultHasTestSuites, Set.empty, Nothing, Set.empty)
109+ _ -> (mempty, defaultHasTestSuites, Set.empty, Nothing, Set.empty, Nothing)
99 allBuildInfo gpd = concat
111 allBuildInfo gpd = concat
100 [ maybe mempty (goBI libBuildInfo) $ condLibrary gpd
112 [ maybe mempty (goBI libBuildInfo) $ condLibrary gpd
@@ -126,3 +138,21 @@ loadPackageDB settings core deps = do
127 flags' = map flagName (filter flagDefault $ genPackageFlags gpd) ++
139 flags' = map flagName (filter flagDefault $ genPackageFlags gpd) ++
128 (map FlagName $ Set.toList $ Stackage.Types.flags settings)
140 (map FlagName $ Set.toList $ Stackage.Types.flags settings)
142+-- | Attempt to grab the Github username from a homepage.
143+parseGithubUserHP :: String -> Maybe String
144+parseGithubUserHP url1 = do
145+ url2 <- listToMaybe $ mapMaybe (flip stripPrefix url1)
146+ [ "http://github.com/"
147+ , "https://github.com/"
149+ let x = takeWhile (/= '/') url2
150+ guard $ not $ null x
153+-- | Attempt to grab the Github username from a source repo.
154+parseGithubUserSR :: SourceRepo -> Maybe String
155+parseGithubUserSR sr =
156+ case (repoType sr, repoLocation sr) of
157+ (Just Git, Just s) -> parseGithubUserHP s