Guest User

Untitled

a guest
Jun 18th, 2018
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.56 KB | None | 0 0
  1. import Distribution.Package
  2. import Distribution.PackageDescription
  3. import Distribution.PackageDescription.Parse
  4. import Distribution.Verbosity
  5. import Distribution.Version
  6. import System.Environment
  7. import qualified Codec.Archive.Tar as Tar
  8. import qualified Data.ByteString.Lazy as L
  9. import qualified Data.Map as Map
  10. import qualified Data.Text.Lazy as T
  11. import qualified Data.Text.Lazy.Encoding as T
  12. import qualified Data.Text.Encoding.Error as T
  13. import Data.List (foldl', group, sort, isInfixOf)
  14. import Control.Applicative
  15. import Data.List.Split (splitOn)
  16. import Distribution.Text
  17. import Data.Maybe (mapMaybe)
  18. import Data.Char (toLower)
  19.  
  20. loadNewest :: FilePath -> IO Newest
  21. loadNewest db = foldl' addPackage Map.empty
  22. . entriesToList . Tar.read <$> L.readFile db
  23.  
  24. main :: IO ()
  25. main = do
  26. [cabal, db, needle] <- getArgs
  27. desc <- readPackageDescription normal cabal
  28. newest <- loadNewest db
  29. print $ checkDeps newest desc
  30. mapM_ (print . checkDeps newest) $ findMyPackages needle newest
  31.  
  32. findMyPackages :: String -> Newest -> [GenericPackageDescription]
  33. findMyPackages needle =
  34. mapMaybe go . Map.elems
  35. where
  36. needle' = map toLower needle
  37. go (_, Just desc) =
  38. let d = packageDescription desc
  39. a = author d
  40. m = maintainer d
  41. haystack = map toLower $ a ++ m
  42. in if needle' `isInfixOf` haystack
  43. then Just desc
  44. else Nothing
  45. go _ = Nothing
  46.  
  47. data CheckDeps = AllNewest
  48. | WontAccept [(String, String)]
  49. deriving Show
  50.  
  51. checkDeps :: Newest -> GenericPackageDescription -> (PackageName, CheckDeps)
  52. checkDeps newest desc =
  53. case mapMaybe (notNewest newest) $ getDeps desc of
  54. [] -> (name, AllNewest)
  55. x -> (name, WontAccept $ map head $ group $ sort x)
  56. where
  57. PackageIdentifier name _ = package $ packageDescription desc
  58.  
  59. notNewest :: Newest -> Dependency -> Maybe (String, String)
  60. notNewest newest (Dependency (PackageName s) range) =
  61. case Map.lookup s newest of
  62. Nothing -> Just (s, " no version found")
  63. Just (version, _) ->
  64. if withinRange version range
  65. then Nothing
  66. else Just (s, display version)
  67.  
  68. entriesToList :: Tar.Entries -> [Tar.Entry]
  69. entriesToList Tar.Done = []
  70. entriesToList (Tar.Fail s) = error s
  71. entriesToList (Tar.Next e es) = e : entriesToList es
  72.  
  73. type Newest = Map.Map String (Version, Maybe GenericPackageDescription)
  74.  
  75. addPackage :: Newest -> Tar.Entry -> Newest
  76. addPackage m entry =
  77. case splitOn "/" $ Tar.entryPath entry of
  78. [".", package', versionS, _] ->
  79. case simpleParse versionS of
  80. Just version ->
  81. case Map.lookup package' m of
  82. Nothing -> go package' version
  83. Just (oldv, _) ->
  84. if version > oldv
  85. then go package' version
  86. else m
  87. Nothing -> m
  88. _ -> m
  89. where
  90. go package' version =
  91. case Tar.entryContent entry of
  92. Tar.NormalFile bs _ ->
  93. let p =
  94. case parsePackageDescription $ T.unpack
  95. $ T.decodeUtf8With T.lenientDecode bs of
  96. ParseOk _ x -> Just x
  97. _ -> Nothing
  98. in Map.insert package' (version, p) m
  99. _ -> m
  100.  
  101. getDeps :: GenericPackageDescription -> [Dependency]
  102. getDeps x = concat
  103. $ maybe id ((:) . condTreeConstraints) (condLibrary x)
  104. $ map (condTreeConstraints . snd) (condExecutables x)
Add Comment
Please, Sign In to add comment