module Manual(putManual) where
import System.Exit (exitWith)
import Utils (putOrPageStrLn)
putManual :: IO ()
putManual = putOrPageStrLn internalManual >>= exitWith
internalManual :: String
internalManual =
"backstop(1) User Commands backstop(1)\n"++
"\n"++
"NAME\n"++
" backstop - Backstop a target directory by source directories\n"++
"\n"++
"SYNOPSIS\n"++
" backstop [-nprt] [-a|-d] trgdir srcdir [srcdir ...]\n"++
" backstop -h\n"++
" backstop -l\n"++
" backstop -m\n"++
" backstop -v\n"++
" backstop -y\n"++
"\n"++
"AVAILABILITY\n"++
" Marcus D. Gabriel (c)1999-2017. All rights reserved.\n"++
"\n"++
" marcus@gabriel.name\n"++
"\n"++
" License terms: GNU GPL version 3 or later (backstop -l)\n"++
"\n"++
"DESCRIPTION\n"++
" Backstop a target directory by source directories thereby\n"++
" creating a backing chain using relative symbolic links by default\n"++
" or absolute symbolic links by option. If more than one source\n"++
" directory is given, backstop the target directory with each\n"++
" source directory in turn starting from left to right on the\n"++
" command line.\n"++
"\n"++
" Intuitively, backstop fills in the missing objects or holes that\n"++
" exist in the target directory relative to the source directories\n"++
" thereby creating a merged view of the target and source\n"++
" directories.\n"++
"\n"++
" De-backstop a target directory by its source directories. In\n"++
" this case, the source directories no longer need to exist. If\n"++
" more than one source directory is given, de-backstop the target\n"++
" directory by the source directories.\n"++
"\n"++
" Symbolic links are never followed. However, the target and\n"++
" source directories are canonicalized (realpath(3)) internally by\n"++
" the command backstop before backstopping and de-backstoppoing.\n"++
"\n"++
" By default no output is displayed except possibly to STDERR.\n"++
"\n"++
"ALGORITHM\n"++
" There must be at least two arguments or operands. The first\n"++
" operand is the target directory, and the second operand and\n"++
" beyond are source directories. The target and source directory\n"++
" must be parallel directories, that is, neither canonicalized\n"++
" (realpath(3)) directory path may be a sub-directory of the other.\n"++
" If the above is not true, a usage error occurs.\n"++
"\n"++
" Nevertheless, pathnames are internally in reduced form such that\n"++
" symbolic link names are treated literally when finding directory\n"++
" names. See \"cd -L\" of ksh(1). In other words, components in the\n"++
" pathname that are not directories but symbolic links to\n"++
" directories are not resolved to their corresponding directories.\n"++
"\n"++
" A list of objects or names is collected under the root of the\n"++
" source directory excluding the directory dot (.) and the\n"++
" directory double-dot (..). If the list is empty, the algorithm\n"++
" is done, otherwise the objects divide into two classes, objects\n"++
" that are not directories and objects that are directories. There\n"++
" are five possibilities:\n"++
"\n"++
" 1. The object is either dot (.) or double-dot (..) whereupon no\n"++
" action is taken.\n"++
"\n"++
" 2. If an object of the same name as the name of the object under\n"++
" the root of the source directory does not exists under the\n"++
" root of the target directory, then a symbolic link, relative\n"++
" or absolute as required, is created under the root of the\n"++
" target directory to the object under the root of the source\n"++
" directory. If populating (-p) and the object under the root\n"++
" of the source directory is a directory, then a sub-directory\n"++
" is created instead.\n"++
"\n"++
" 3. If an object of the same name as the name of the object under\n"++
" the root of the source directory does exists under the root of\n"++
" the target directory and is a file, no action is taken,\n"++
" regardless of whether or not the object under the root of the\n"++
" source directory is a file or a directory.\n"++
"\n"++
" 4. If an object of the same name as the name of the object under\n"++
" the root of the source directory does exists under the root of\n"++
" the target directory and is a directory, and if the object of\n"++
" the same name under the root of the source directory is a\n"++
" file, no action is taken.\n"++
"\n"++
" 5. If an object of the same name as the name of the object under\n"++
" the root of the source directory does exists under the root of\n"++
" the target directory and is a directory, and if the object of\n"++
" the same name under the root of the source directory is also a\n"++
" directory, then recursion occurs with the objects of the same\n"++
" name under the roots of the target and source directories as\n"++
" new root target and source directories, respectively.\n"++
"\n"++
" When de-backstopping a target directory by source directories,\n"++
" the sources no longer need to exist. Symbolic links under the\n"++
" target are removed if and only if they point to a pahtname under\n"++
" one of the source directories. This can be determined even if\n"++
" the source directory no longer exists because symbolic links\n"++
" within directory pathnames are taken literally. See \"cd -L\" of\n"++
" ksh(1).\n"++
"\n"++
" When de-populating while de-backstopping (-pd), a directory is\n"++
" removed if all objects within the directory are symbolic links\n"++
" that have been remove while de-backstopping. An empty directory\n"++
" is removed if and only if there exists a corresponding directory\n"++
" path under one of the source directories as under the target\n"++
" directory. This can only be determined if the source directory\n"++
" and correponding sub-directory still exist. If not, then no\n"++
" action is taken.\n"++
"\n"++
"OPTIONS\n"++
" The following options are supported:\n"++
"\n"++
" -a Create symbolic links which are absolute paths.\n"++
"\n"++
" -d De-backstop the target directory by its source directories.\n"++
" The -a option has no affect on the -d option.\n"++
"\n"++
" -h Display a short command summary.\n"++
"\n"++
" -l Display the backstop license terms.\n"++
"\n"++
" -m Display this internal manual page.\n"++
"\n"++
" -n Take no action but trace possible program execution. The -n\n"++
" option implies the -t option.\n"++
"\n"++
" -p Populate the target by making equivalent sub-directories of\n"++
" the source sub-directories instead of symbolic links for these\n"++
" sub-directories that point back into the sources. For\n"++
" example, if the target directory is empty, then for a set of\n"++
" source directories, from left to right on the command line,\n"++
" this creates a combined directory structure of the sources\n"++
" under the target directory in which all non-directories are\n"++
" symbolic links pointing back into the source directories.\n"++
" This is similar to the lndir(1) command of the X consortium.\n"++
"\n"++
" With the -d option, all sub-directories emptied of symbolic\n"++
" links under the target directory are removed, and all empty\n"++
" directories are removed if and only if the correspoding\n"++
" sub-directory under the source directory exists.\n"++
"\n"++
" -r Report the number of symbolic links and directories created,\n"++
" the number of calls and maximum depth of backstop, the\n"++
" maximum breadth observed by backstop, and the number of non-\n"++
" fatal errors encountered. With the -d option, show the\n"++
" number of symbolic links and directories removed.\n"++
"\n"++
" -t Show the trace of program execution. The output is a list\n"++
" of executable commands.\n"++
"\n"++
" -v The version of backstop.\n"++
"\n"++
" -y A synopsis of the internal manual page.\n"++
"\n"++
"OPERANDS\n"++
" trgdir\n"++
" The directory that will be backed by other directories. The\n"++
" target directory can be backed by multiple source directories\n"++
" where each source directory could be backed by yet another\n"++
" directory or multiple directories thereby creating an\n"++
" extensible backing chain.\n"++
"\n"++
" srcdir\n"++
" The directory which backs a target directory. The source\n"++
" directory can be backed by multiple additional directories\n"++
" where each additional directory could be backed by yet another\n"++
" directory or multiple directories thereby creating an\n"++
" extensible backing chain.\n"++
"\n"++
"USAGE NOTES\n"++
" Evolved with ghc 6.10, 6.12, 7.0, 7.4, 7.10, 8.0.2, and 8.4.1.\n"++
" Tested with 8.4.1.\n"++
"\n"++
"EXAMPLES\n"++
" To display a summary of usage, use\n"++
"\n"++
" backstop -h\n"++
"\n"++
" To display a synopsis of this internal manual page, use\n"++
"\n"++
" backstop -y\n"++
"\n"++
" To display this internal manual page, use\n"++
"\n"++
" backstop -m\n"++
"\n"++
" To trace program execution, use\n"++
"\n"++
" backstop -t /export/install/sparc/devlopment/modules \\\n"++
" /export/install/sparc/modules\n"++
"\n"++
" To trace program execution taking no action, use\n"++
"\n"++
" backstop -n /export/install/sparc/devlopment/modules \\\n"++
" /export/install/sparc/modules\n"++
"\n"++
" To back /export/install/sparc/devlopment/modules with\n"++
" /export/install/sparc/modules using relative symbolic links, use\n"++
"\n"++
" backstop /export/install/sparc/devlopment/modules \\\n"++
" /export/install/sparc/modules\n"++
"\n"++
" To back /export/install/sparc/devlopment/modules with\n"++
" /export/install/sparc/modules using absolute symbolic links, use\n"++
"\n"++
" backstop -a /export/install/sparc/devlopment/modules \\\n"++
" /export/install/sparc/modules\n"++
"\n"++
" To stop backing /export/install/sparc/devlopment/modules with\n"++
" /export/install/sparc/modules, use\n"++
"\n"++
" backstop -d /export/install/sparc/devlopment/modules \\\n"++
" /export/install/sparc/modules\n"++
"\n"++
"ENVIRONMENT VARIABLES\n"++
" PAGER Page the internal manual page or license terms\n"++
" using \"${PAGER}\", otherwise print it.\n"++
"\n"++
"EXIT STATUS\n"++
" An exit status of 0 is returned if successful, otherwise non-zero\n"++
" is returned. The following error exit codes are used by\n"++
" backstop:\n"++
"\n"++
" EXIT CODE MEANING\n"++
" 251 Less than two operands.\n"++
" 252 Not a directory, that is, trgdir or one or more\n"++
" of the srcdir are not a directory.\n"++
" 253 Not parallel directories, that is, a srcdir is\n"++
" a sub-directory of trgdir or vice versa, or one\n"++
" of the srcdir is a sub-directory of another\n"++
" srcdir.\n"++
" 254 Not yet implemented.\n"++
" 255 Non-fatal errors occurred. Error messages are\n"++
" sent to STDERR for each non-fatal error that\n"++
" occurred with return code equal to the number of\n"++
" non-falal errors if less than 251, otherwise the\n"++
" return code is 255, that is, \"infinity\".\n"++
"\n"++
"FILES\n"++
" N/A.\n"++
"\n"++
"SEE ALSO\n"++
" ln(1), mkdir(1), rm(1), rmdir(1), ksh(1), lndir(1), realpath(3)\n"++
"\n"++
" \"Source Control to Project Control: Applying RCS and SCCS\" by Don\n"++
" Bolinger and Tan Bronson. ISBN 1-56592-117-8.\n"++
"\n"++
"NOTES\n"++
" Please send bug reports to marcus@gabriel.name.\n"++
"\n"++
"BUGS\n"++
" No known bugs to date.\n"