Fix #2873: should fail if a package DB desn't exist
authorSimon Marlow <marlowsd@gmail.com>
Thu, 8 Jan 2009 09:56:28 +0000 (09:56 +0000)
committerSimon Marlow <marlowsd@gmail.com>
Thu, 8 Jan 2009 09:56:28 +0000 (09:56 +0000)
We allowed non-existence before because the user DB is allowed to not
exist, so now we have an explicit exception for that case.

utils/ghc-pkg/Main.hs

index 39f7eeb..2cbbc27 100644 (file)
@@ -475,20 +475,23 @@ getPkgDatabases modify my_flags = do
              in
                 return (flag_stack, to_modify)
 
              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)
 
   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
 
 -- -----------------------------------------------------------------------------
 -- Registering
@@ -1145,9 +1148,6 @@ isInfixOf               :: (Eq a) => [a] -> [a] -> Bool
 isInfixOf needle haystack = any (isPrefixOf needle) (tails haystack)
 #endif
 
 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
 #if mingw32_HOST_OS || mingw32_TARGET_OS
 throwIOIO :: Exception.IOException -> IO a
 throwIOIO = Exception.throwIO