X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=utils%2Fghc-pkg%2FMain.hs;h=8afde04e75162407b83de5d74102707e0244fefe;hb=ecf0782b93019747f3801e6b077ecf1482a5fb25;hp=8b33d7b1450dd9cd10ef6d6d72bfda4906f46f57;hpb=b769418ce58fd409f580e4625ef7dbb9b42dacbf;p=ghc-hetmet.git diff --git a/utils/ghc-pkg/Main.hs b/utils/ghc-pkg/Main.hs index 8b33d7b..8afde04 100644 --- a/utils/ghc-pkg/Main.hs +++ b/utils/ghc-pkg/Main.hs @@ -475,20 +475,23 @@ getPkgDatabases modify my_flags = do in return (flag_stack, to_modify) - db_stack <- mapM readParseDatabase final_stack + db_stack <- mapM (readParseDatabase mb_user_conf) final_stack return (db_stack, to_modify) -readParseDatabase :: PackageDBName -> IO (PackageDBName,PackageDB) -readParseDatabase filename = do - str <- readFile filename `catchIO` \_ -> return emptyPackageConfig - let packages = map convertPackageInfoIn $ read str - Exception.evaluate packages - `catchError` \e-> - die ("error while parsing " ++ filename ++ ": " ++ show e) - return (filename,packages) - -emptyPackageConfig :: String -emptyPackageConfig = "[]" +readParseDatabase :: Maybe (PackageDBName,Bool) + -> PackageDBName + -> IO (PackageDBName,PackageDB) +readParseDatabase mb_user_conf filename + -- the user database (only) is allowed to be non-existent + | Just (user_conf,False) <- mb_user_conf, filename == user_conf + = return (filename, []) + | otherwise + = do str <- readFile filename + let packages = map convertPackageInfoIn $ read str + Exception.evaluate packages + `catchError` \e-> + die ("error while parsing " ++ filename ++ ": " ++ show e) + return (filename,packages) -- ----------------------------------------------------------------------------- -- Registering @@ -519,6 +522,11 @@ registerPackage input my_flags auto_ghci_libs update force = do pkg <- parsePackageInfo expanded putStrLn "done." + let unversioned_deps = filter (not . realVersion) (depends pkg) + unless (null unversioned_deps) $ + die ("Unversioned dependencies found: " ++ + unwords (map display unversioned_deps)) + let truncated_stack = dropWhile ((/= to_modify).fst) db_stack -- truncate the stack for validation, because we don't allow -- packages lower in the stack to refer to those higher up. @@ -1140,12 +1148,12 @@ isInfixOf :: (Eq a) => [a] -> [a] -> Bool isInfixOf needle haystack = any (isPrefixOf needle) (tails haystack) #endif -catchIO :: IO a -> (Exception.IOException -> IO a) -> IO a -catchIO = Exception.catch - #if mingw32_HOST_OS || mingw32_TARGET_OS throwIOIO :: Exception.IOException -> IO a throwIOIO = Exception.throwIO + +catchIO :: IO a -> (Exception.IOException -> IO a) -> IO a +catchIO = Exception.catch #endif catchError :: IO a -> (String -> IO a) -> IO a