@@ -30,14 +30,17 @@ module Distribution.Utils.Path
3030 , Tix
3131 , Tmp
3232 , Response
33+ , PkgConf
3334
3435 -- * Symbolic paths
3536 , RelativePath
3637 , SymbolicPath
38+ , AbsolutePath (.. )
3739 , SymbolicPathX -- NB: constructor not exposed, to retain type safety.
3840
3941 -- ** Symbolic path API
4042 , getSymbolicPath
43+ , getAbsolutePath
4144 , sameDirectory
4245 , makeRelativePathEx
4346 , makeSymbolicPath
@@ -47,6 +50,7 @@ module Distribution.Utils.Path
4750 , relativeSymbolicPath
4851 , symbolicPathRelative_maybe
4952 , interpretSymbolicPath
53+ , interpretSymbolicPathAbsolute
5054
5155 -- ** General filepath API
5256 , (</>)
@@ -59,7 +63,7 @@ module Distribution.Utils.Path
5963 -- ** Working directory handling
6064 , interpretSymbolicPathCWD
6165 , absoluteWorkingDir
62- , tryMakeRelativeToWorkingDir
66+ , tryMakeRelative
6367
6468 -- ** Module names
6569 , moduleNameSymbolicPath
@@ -214,6 +218,11 @@ type RelativePath = SymbolicPathX 'OnlyRelative
214218-- until we interpret them (using e.g. 'interpretSymbolicPath').
215219type SymbolicPath = SymbolicPathX 'AllowAbsolute
216220
221+ newtype AbsolutePath (to :: FileOrDir ) = AbsolutePath (forall from . SymbolicPath from to )
222+
223+ unsafeMakeAbsolutePath :: FilePath -> AbsolutePath to
224+ unsafeMakeAbsolutePath fp = AbsolutePath (makeSymbolicPath fp)
225+
217226instance Binary (SymbolicPathX allowAbsolute from to )
218227instance
219228 (Typeable allowAbsolute , Typeable from , Typeable to )
@@ -289,7 +298,7 @@ moduleNameSymbolicPath modNm = SymbolicPath $ ModuleName.toFilePath modNm
289298-- (because the program might expect certain paths to be relative).
290299--
291300-- See Note [Symbolic paths] in Distribution.Utils.Path.
292- interpretSymbolicPath :: Maybe (SymbolicPath CWD (Dir Pkg )) -> SymbolicPathX allowAbsolute Pkg to -> FilePath
301+ interpretSymbolicPath :: Maybe (SymbolicPath CWD (Dir from )) -> SymbolicPathX allowAbsolute from to -> FilePath
293302interpretSymbolicPath mbWorkDir (SymbolicPath p) =
294303 -- Note that this properly handles an absolute symbolic path,
295304 -- because if @q@ is absolute, then @p </> q = q@.
@@ -316,9 +325,15 @@ interpretSymbolicPath mbWorkDir (SymbolicPath p) =
316325-- appropriate to use 'interpretSymbolicPathCWD' to provide its arguments.
317326--
318327-- See Note [Symbolic paths] in Distribution.Utils.Path.
319- interpretSymbolicPathCWD :: SymbolicPathX allowAbsolute Pkg to -> FilePath
328+ interpretSymbolicPathCWD :: SymbolicPathX allowAbsolute from to -> FilePath
320329interpretSymbolicPathCWD (SymbolicPath p) = p
321330
331+ getAbsolutePath :: AbsolutePath to -> FilePath
332+ getAbsolutePath (AbsolutePath p) = getSymbolicPath p
333+
334+ interpretSymbolicPathAbsolute :: AbsolutePath (Dir Pkg ) -> SymbolicPathX allowAbsolute Pkg to -> FilePath
335+ interpretSymbolicPathAbsolute (AbsolutePath p) sym = interpretSymbolicPath (Just p) sym
336+
322337-- | Change what a symbolic path is pointing to.
323338coerceSymbolicPath :: SymbolicPathX allowAbsolute from to1 -> SymbolicPathX allowAbsolute from to2
324339coerceSymbolicPath = coerce
@@ -342,17 +357,19 @@ symbolicPathRelative_maybe (SymbolicPath fp) =
342357 else Just $ SymbolicPath fp
343358
344359-- | Absolute path to the current working directory.
345- absoluteWorkingDir :: Maybe (SymbolicPath CWD to ) -> IO FilePath
346- absoluteWorkingDir Nothing = Directory. getCurrentDirectory
347- absoluteWorkingDir (Just wd) = Directory. makeAbsolute $ getSymbolicPath wd
360+ absoluteWorkingDir :: Maybe (SymbolicPath CWD to ) -> IO ( AbsolutePath to )
361+ absoluteWorkingDir Nothing = unsafeMakeAbsolutePath <$> Directory. getCurrentDirectory
362+ absoluteWorkingDir (Just wd) = unsafeMakeAbsolutePath <$> Directory. makeAbsolute ( getSymbolicPath wd)
348363
349- -- | Try to make a path relative to the current working directory.
364+ -- | Try to make a symbolic path relative.
365+ --
366+ -- This function does nothing if the path is already relative.
350367--
351368-- NB: this function may fail to make the path relative.
352- tryMakeRelativeToWorkingDir :: Maybe (SymbolicPath CWD (Dir dir )) -> SymbolicPath dir to -> IO (SymbolicPath dir to )
353- tryMakeRelativeToWorkingDir mbWorkDir (SymbolicPath fp) = do
354- wd <- absoluteWorkingDir mbWorkDir
355- return $ SymbolicPath (FilePath. makeRelative wd fp)
369+ tryMakeRelative :: Maybe (SymbolicPath CWD (Dir dir )) -> SymbolicPath dir to -> IO (SymbolicPath dir to )
370+ tryMakeRelative mbWorkDir (SymbolicPath fp) = do
371+ AbsolutePath wd <- absoluteWorkingDir mbWorkDir
372+ return $ SymbolicPath (FilePath. makeRelative (getSymbolicPath wd) fp)
356373
357374-------------------------------------------------------------------------------
358375
@@ -422,6 +439,16 @@ instance
422439 where
423440 SymbolicPath p1 </> SymbolicPath p2 = SymbolicPath (p1 </> p2)
424441
442+ instance
443+ (b1 ~ 'Dir b2 , c2 ~ c3 , midAbsolute ~ OnlyRelative )
444+ => PathLike
445+ (AbsolutePath b1 )
446+ (SymbolicPathX midAbsolute b2 c2 )
447+ (AbsolutePath c3 )
448+ where
449+ AbsolutePath (SymbolicPath p1) </> SymbolicPath p2 =
450+ unsafeMakeAbsolutePath (p1 </> p2)
451+
425452--------------------------------------------------------------------------------
426453-- Abstract directory locations.
427454
@@ -499,3 +526,8 @@ data Tmp
499526--
500527-- See Note [Symbolic paths] in Distribution.Utils.Path.
501528data Response
529+
530+ -- | Abstract directory: directory for pkg-config files.
531+ --
532+ -- See Note [Symbolic paths] in Distribution.Utils.Path.
533+ data PkgConf
0 commit comments