darcs-2.16.1: a distributed, interactive, smart revision control system

Safe HaskellNone
LanguageHaskell2010

Darcs.Util.Path

Contents

Synopsis

Documentation

encodeWhite :: FilePath -> String Source #

encodeWhite translates whitespace in filenames to a darcs-specific format (numerical representation according to ord surrounded by backslashes). Note that backslashes are also escaped since they are used in the encoding.

encodeWhite "hello there" == "hello\32\there"
encodeWhite "hello\there" == "hello\92\there"

decodeWhite :: String -> FilePath Source #

decodeWhite interprets the Darcs-specific "encoded" filenames produced by encodeWhite

decodeWhite "hello\32\there"  == "hello there"
decodeWhite "hello\92\there"  == "hello\there"
decodeWhite "hello\there"   == error "malformed filename"

AbsolutePath

makeAbsolute :: AbsolutePath -> FilePath -> AbsolutePath Source #

Take an absolute path and a string representing a (possibly relative) path and combine them into an absolute path. If the second argument is already absolute, then the first argument gets ignored. This function also takes care that the result is converted to Posix convention and normalized. Also, parent directories ("..") at the front of the string argument get canceled out against trailing directory parts of the absolute path argument.

Regarding the last point, someone more familiar with how these functions are used should verify that this is indeed necessary or at least useful.

ioAbsolute :: FilePath -> IO AbsolutePath Source #

Interpret a possibly relative path wrt the current working directory.

AbsolutePathOrStd

data AbsolutePathOrStd Source #

This is for situations where a string (e.g. a command line argument) may take the value "-" to mean stdin or stdout (which one depends on context) instead of a normal file path.

useAbsoluteOrStd :: (AbsolutePath -> a) -> a -> AbsolutePathOrStd -> a Source #

Execute either the first or the second argument action, depending on whether the given path is an AbsolutePath or stdin/stdout.

AbsoluteOrRemotePath

SubPath

data SubPath Source #

Paths which are relative to the local darcs repository and normalized. Note: These are understood not to have the dot in front.

Instances
Eq SubPath Source # 
Instance details

Defined in Darcs.Util.Path

Methods

(==) :: SubPath -> SubPath -> Bool #

(/=) :: SubPath -> SubPath -> Bool #

Ord SubPath Source # 
Instance details

Defined in Darcs.Util.Path

Show SubPath Source # 
Instance details

Defined in Darcs.Util.Path

FilePathLike SubPath Source # 
Instance details

Defined in Darcs.Util.Path

FilePathOrURL SubPath Source # 
Instance details

Defined in Darcs.Util.Path

makeSubPathOf :: AbsolutePath -> AbsolutePath -> Maybe SubPath Source #

Make the second path relative to the first, if possible

floatSubPath :: SubPath -> AnchoredPath Source #

Transform a SubPath into an AnchoredPath.

Miscellaneous

class FilePathOrURL a where Source #

Methods

toPath :: a -> String Source #

Instances
FilePathOrURL AbsoluteOrRemotePath Source # 
Instance details

Defined in Darcs.Util.Path

FilePathOrURL AbsolutePath Source # 
Instance details

Defined in Darcs.Util.Path

FilePathOrURL SubPath Source # 
Instance details

Defined in Darcs.Util.Path

CharLike c => FilePathOrURL [c] Source # 
Instance details

Defined in Darcs.Util.Path

Methods

toPath :: [c] -> String Source #

class FilePathOrURL a => FilePathLike a where Source #

Methods

toFilePath :: a -> FilePath Source #

Instances
FilePathLike AbsolutePath Source # 
Instance details

Defined in Darcs.Util.Path

FilePathLike SubPath Source # 
Instance details

Defined in Darcs.Util.Path

CharLike c => FilePathLike [c] Source # 
Instance details

Defined in Darcs.Util.Path

Methods

toFilePath :: [c] -> FilePath Source #

getUniquePathName :: Bool -> (FilePath -> String) -> (Int -> FilePath) -> IO FilePath Source #

Iteratively tries find first non-existing path generated by buildName, it feeds to buildName the number starting with -1. When it generates non-existing path and it isn't first, it displays the message created with buildMsg. Usually used for generation of the name like path_number when path already exist (e.g. darcs.net_0).

Check for malicious paths

isMaliciousSubPath :: String -> Bool Source #

What is a malicious path?

A spoofed path is a malicious path.

  1. Darcs only creates explicitly relative paths (beginning with "./"), so any not explicitly relative path is surely spoofed.
  2. Darcs normalizes paths so they never contain "/../", so paths with "/../" are surely spoofed.

A path to a darcs repository's meta data can modify "trusted" patches or change safety defaults in that repository, so we check for paths containing "/_darcs/" which is the entry to darcs meta data.

To do?

  • How about get repositories?
  • Would it be worth adding a --semi-safe-paths option for allowing changes to certain preference files (_darcs/prefs/) in sub repositories'?

TODO: Properly review the way we handle paths on Windows - it's not enough to just use the OS native concept of path separator. Windows often accepts both path separators, and repositories always use the UNIX separator anyway.

Tree filtering.

filterPaths :: [AnchoredPath] -> AnchoredPath -> t -> Bool Source #

Construct a filter from a list of AnchoredPaths, that will accept any path that is either a parent or a child of any of the listed paths, and discard everything else.

AnchoredPaths: relative paths within a Tree. All paths are

data Name Source #

Instances
Eq Name Source # 
Instance details

Defined in Darcs.Util.Path

Methods

(==) :: Name -> Name -> Bool #

(/=) :: Name -> Name -> Bool #

Ord Name Source # 
Instance details

Defined in Darcs.Util.Path

Methods

compare :: Name -> Name -> Ordering #

(<) :: Name -> Name -> Bool #

(<=) :: Name -> Name -> Bool #

(>) :: Name -> Name -> Bool #

(>=) :: Name -> Name -> Bool #

max :: Name -> Name -> Name #

min :: Name -> Name -> Name #

Show Name Source # 
Instance details

Defined in Darcs.Util.Path

Methods

showsPrec :: Int -> Name -> ShowS #

show :: Name -> String #

showList :: [Name] -> ShowS #

Binary Name Source # 
Instance details

Defined in Darcs.Util.Path

Methods

put :: Name -> Put #

get :: Get Name #

putList :: [Name] -> Put #

makeName :: String -> Either String Name Source #

Make a Name from a String. If the input String is invalid, that is, "", ".", "..", or contains a /, return Left with an error message.

newtype AnchoredPath Source #

This is a type of "sane" file paths. These are always canonic in the sense that there are no stray slashes, no ".." components and similar. They are usually used to refer to a location within a Tree, but a relative filesystem path works just as well. These are either constructed from individual name components (using "appendPath", "catPaths" and "makeName"), or converted from a FilePath ("floatPath" -- but take care when doing that).

Constructors

AnchoredPath [Name] 
Instances
Eq AnchoredPath Source # 
Instance details

Defined in Darcs.Util.Path

Ord AnchoredPath Source # 
Instance details

Defined in Darcs.Util.Path

Show AnchoredPath Source # 
Instance details

Defined in Darcs.Util.Path

Binary AnchoredPath Source # 
Instance details

Defined in Darcs.Util.Path

Monad m => ApplyMonad Tree (TreeMonad m) Source # 
Instance details

Defined in Darcs.Patch.ApplyMonad

Associated Types

type ApplyMonadBase (TreeMonad m) :: Type -> Type Source #

Monad m => TreeRW (TreeMonad m) Source # 
Instance details

Defined in Darcs.Util.Tree.Monad

Monad m => TreeRO (TreeMonad m) Source # 
Instance details

Defined in Darcs.Util.Tree.Monad

Monad m => MonadProgress (TreeMonad m) Source # 
Instance details

Defined in Darcs.Patch.MonadProgress

Monad m => ApplyMonadTree (TreeMonad m) Source # 
Instance details

Defined in Darcs.Patch.ApplyMonad

type ApplyMonadBase (TreeMonad m) Source # 
Instance details

Defined in Darcs.Patch.ApplyMonad

appendPath :: AnchoredPath -> Name -> AnchoredPath Source #

Append an element to the end of a path.

anchorPath :: FilePath -> AnchoredPath -> FilePath Source #

Take a "root" directory and an anchored path and produce a full FilePath. Moreover, you can use anchorPath "" to get a relative FilePath.

isPrefix :: AnchoredPath -> AnchoredPath -> Bool Source #

Check whether a path is a prefix of another path.

breakOnDir :: AnchoredPath -> Either Name (Name, AnchoredPath) Source #

If the patch is under a directory, split into Right of the first component (which must be a directory name) and the rest of teh path. Otherwise return Left of the single component. This function is *undefined* on the root path (which has no components).

movedirfilename :: AnchoredPath -> AnchoredPath -> AnchoredPath -> AnchoredPath Source #

The effect of renaming on paths. The first argument is the old path, the second is the new path, and the third is the possibly affected path we are interested in.

parent :: AnchoredPath -> Maybe AnchoredPath Source #

Get parent (path) of a given path. foobarbaz -> foo/bar

parents :: AnchoredPath -> [AnchoredPath] Source #

List all parents of a given path. foobarbaz -> [.,foo, foo/bar]

replaceParent :: AnchoredPath -> AnchoredPath -> Maybe AnchoredPath Source #

Replace the second arg's parent with the first arg.

catPaths :: AnchoredPath -> AnchoredPath -> AnchoredPath Source #

Catenate two paths together. Not very safe, but sometimes useful (e.g. when you are representing paths relative to a different point than a Tree root).

inDarcsdir :: AnchoredPath -> Bool Source #

Is the given path in (or equal to) the _darcs metadata directory?

displayPath :: AnchoredPath -> FilePath Source #

For displaying paths to the user. It should never be used for on-disk patch storage. This adds the "./" for consistency with how repo paths are displayed by showPatch and friends, except for the root path which is displayed as plain ".".

realPath :: AnchoredPath -> FilePath Source #

Interpret an AnchoredPath as relative the current working directory. Intended for IO operations in the file system. Use with care!

Unsafe AnchoredPath functions.

floatPath :: FilePath -> AnchoredPath Source #

Take a relative FilePath and turn it into an AnchoredPath. This is a partial function. Basically, by using floatPath, you are testifying that the argument is a path relative to some common root -- i.e. the root of the associated Tree object. In particular, the input path may not contain any ocurrences of "." or ".." after normalising. You should sanitize any FilePaths before you declare them "good" by converting into AnchoredPath (using this function), especially if the FilePath come from any external source (command line, file, environment, network, etc)