summaryrefslogtreecommitdiff
path: root/utils
diff options
context:
space:
mode:
authorIan Lynagh <igloo@earth.li>2011-06-10 18:40:05 +0100
committerIan Lynagh <igloo@earth.li>2011-06-10 18:40:05 +0100
commit091fceaeb313c2d2504c005ddc1067ad6f9c60c6 (patch)
treec4dfadfd08cd628e1082c30429d67a652b0f8fb9 /utils
parent77ffb1afd2eca3c338e7e7059827f6813ec81198 (diff)
downloadhaskell-091fceaeb313c2d2504c005ddc1067ad6f9c60c6.tar.gz
Fix parsing "$topdir" in package config
It was only working when followed by something, e.g. "$topdir/base".
Diffstat (limited to 'utils')
-rw-r--r--utils/ghc-pkg/Main.hs38
1 files changed, 20 insertions, 18 deletions
diff --git a/utils/ghc-pkg/Main.hs b/utils/ghc-pkg/Main.hs
index be59aa93c7..52b79146b7 100644
--- a/utils/ghc-pkg/Main.hs
+++ b/utils/ghc-pkg/Main.hs
@@ -661,6 +661,7 @@ mungePackageDBPaths top_dir db@PackageDB { packages = pkgs } =
-- files and "package.conf.d" dirs) the pkgroot is the parent directory
-- ${pkgroot}/package.conf or ${pkgroot}/package.conf.d/
+-- TODO: This code is duplicated in compiler/main/Packages.lhs
mungePackagePaths :: FilePath -> FilePath
-> InstalledPackageInfo -> InstalledPackageInfo
-- Perform path/URL variable substitution as per the Cabal ${pkgroot} spec
@@ -686,29 +687,30 @@ mungePackagePaths top_dir pkgroot pkg =
munge_urls = map munge_url
munge_path p
- | Just p' <- stripVarPrefix "${pkgroot}" sp = pkgroot </> p'
- | Just p' <- stripVarPrefix "$topdir" sp = top_dir </> p'
- | otherwise = p
- where
- sp = splitPath p
+ | Just p' <- stripVarPrefix "${pkgroot}" p = pkgroot ++ p'
+ | Just p' <- stripVarPrefix "$topdir" p = top_dir ++ p'
+ | otherwise = p
munge_url p
- | Just p' <- stripVarPrefix "${pkgrooturl}" sp = toUrlPath pkgroot p'
- | Just p' <- stripVarPrefix "$httptopdir" sp = toUrlPath top_dir p'
- | otherwise = p
- where
- sp = splitPath p
+ | Just p' <- stripVarPrefix "${pkgrooturl}" p = toUrlPath pkgroot p'
+ | Just p' <- stripVarPrefix "$httptopdir" p = toUrlPath top_dir p'
+ | otherwise = p
toUrlPath r p = "file:///"
-- URLs always use posix style '/' separators:
- ++ FilePath.Posix.joinPath (r : FilePath.splitDirectories p)
-
- stripVarPrefix var (root:path')
- | Just [sep] <- stripPrefix var root
- , isPathSeparator sep
- = Just (joinPath path')
-
- stripVarPrefix _ _ = Nothing
+ ++ FilePath.Posix.joinPath
+ (r : -- We need to drop a leading "/" or "\\"
+ -- if there is one:
+ dropWhile (all isPathSeparator)
+ (FilePath.splitDirectories p))
+
+ -- We could drop the separator here, and then use </> above. However,
+ -- by leaving it in and using ++ we keep the same path separator
+ -- rather than letting FilePath change it to use \ as the separator
+ stripVarPrefix var path = case stripPrefix var path of
+ Just [] -> Just []
+ Just cs@(c : _) | isPathSeparator c -> Just cs
+ _ -> Nothing
-- -----------------------------------------------------------------------------