Legend:
Library
Module
Module type
Parameter
Class
Class type
Representation of paths
The aim of this module is to provide a solid basis to reason about file and directory paths inside the Dune code base. What it is not is a complete API for paths management that handles all the aspects of file system paths. It simply exposes a high-level and portable API that covers the needs of Dune.
Model of the file system
Local paths
Dune sees the file system as two parts. The first part is composed of the source tree and the build directory. In this part, Dune doesn't know about symlinks and has a fully expanded view of the file system. This means that if the user has a symlink `src/foo` pointing to `bar`, then `src/foo/x` and `bar/x` are seen as two different paths.
A path in this world is called a local path and is simply a sequence of path components. A path component being a string other than "." or ".." and not containing the path separator character ('/').
Such a path can be rooted at the source tree root, the build directory or an unspecified root. All these paths are represented by values of type 'a Path.Local_gen.t where 'a denotes the root of the path.
External paths
The second part is the "external world". It is all the paths that live outside of the workspace and build directory. To be on the safe side Dune makes no assumption does nothing clever with these paths.
External paths are presented as Path.External.t values.contents
The Path.t type
The Path.t type represents all possible paths, i.e. both local and extenral paths.
Reach a given path from a directory. For example, let p be a path to the file some/dir/file and d be a path to the directory some/another/dir. Then reach p ~from:d evaluates to ../../dir/file.
val extract_build_context : t->(string * Source.t) option
Extract the build context from a path. For instance, representing paths as strings:
extract_build_context "_build/blah/foo/bar" = Some ("blah", "foo/bar")
It doesn't work correctly (doesn't return a sensible source path) for build directories that are not build contexts, e.g. "_build/install" and "_build/.aliases".
val extract_build_context_exn : t-> string * Source.t
val extract_build_dir_first_component : t->(string * Local.t) option
val extract_build_context_dir : t->(t * Source.t) option
Same as extract_build_context but return the build context as a path:
extract_build_context "_build/blah/foo/bar"
= Some ("_build/blah", "foo/bar")
val extract_build_context_dir_maybe_sandboxed : t->(t * Source.t) option
val extract_build_context_dir_exn : t->t * Source.t
Return the "local part" of a path. For local paths (in build directory or source tree), this returns the path itself. For external paths, it returns a path that is relative to the current directory. For example, the local part of /a/b is ./a/b.
Rename a file. rename oldpath newpath renames the file called oldpath, giving it newpath as its new name, moving it between directories if needed. If newpath already exists, its contents will be replaced with those of oldpath.
val chmod :
mode:int ->?stats:Unix.stats option->?op:[ `Add | `Remove| `Set ]->t->
unit
Set permissions on the designed files. op is `Set by default, which sets the permissions exactly to mode, while `Add will add the given mode to the current permissions and `Remove remove them. path will be stat'd in the `Add and `Remove case to determine the current permission, unless the already computed stats are passed as stats to save a system call.