- = do pkg_details <- readIORef v_Package_details
- case lookupPkg package pkg_details of
- Nothing -> throwDyn (CmdLineError ("unknown package name: " ++ package))
- Just details -> do
- ps <- readIORef v_Packages
- unless (package `elem` ps) $ do
- mapM_ addPackage (package_deps details)
- ps <- readIORef v_Packages
- writeIORef v_Packages (package:ps)
+ = do { pkg_details <- getPackageConfigMap
+ ; ps <- readIORef v_Packages
+ ; ps' <- add_package pkg_details ps (mkPackageName package)
+ -- Throws an exception if it fails
+ ; writeIORef v_Packages ps' }
+
+add_package :: PackageConfigMap -> [PackageName]
+ -> PackageName -> IO [PackageName]
+add_package pkg_details ps p
+ | p `elem` ps -- Check if we've already added this package
+ = return ps
+ | Just details <- lookupPkg pkg_details p
+ = do { -- Add the package's dependents first
+ ps' <- foldM (add_package pkg_details) ps
+ (packageDependents details)
+ ; return (p : ps') }
+
+ | otherwise
+ = throwDyn (CmdLineError ("unknown package name: " ++ packageNameString p))