prjm/derived/ProjectManagerBundle.m3


MODULE ProjectManagerBundle;
Generated by m3bundle; see its manpage.

IMPORT Bundle, BundleRep, Text;
IMPORT Thread, Wr, TextWr;

TYPE T = Bundle.T OBJECT OVERRIDES
           get      := LookUp;
           getNames := GetNames;
         END;

TYPE Texts = REF ARRAY OF TEXT;

VAR
  bundle: T     := NIL;
  names : Texts := NIL;

PROCEDURE Get(): Bundle.T =
  BEGIN
    IF (bundle = NIL) THEN bundle := NEW (T) END;
    RETURN bundle;
  END Get;

PROCEDURE GetNames (<*UNUSED*> self: T): Texts =
  BEGIN
    IF names = NIL THEN
      names := NEW (Texts, NUMBER (Names));
      names^ := Names;
    END;
    RETURN names;
  END GetNames;

PROCEDURE LookUp (<*UNUSED*> self: T;  element: TEXT): TEXT =
  BEGIN
    FOR i := 0 TO LAST (Names)-1 DO
      IF Text.Equal (Names[i], element) THEN
        IF Elements[i] = NIL THEN Elements[i] := GetElt (i) END;
        RETURN Elements[i];
      END;
    END;
    RETURN NIL;
  END LookUp;

CONST Names = ARRAY [0..3] OF TEXT {
  "compactrc",
  "ShortUsageHelp",
  "UsageHelp",
  NIL
};

VAR Elements := ARRAY [0..3] OF TEXT {
  E0,
  NIL (* E1 .. E1_0 *),
  NIL (* E2 .. E2_19 *),
  NIL
};

PROCEDURE GetElt (n: INTEGER): TEXT =
  <*FATAL Thread.Alerted, Wr.Failure *>
  VAR wr := TextWr.New ();
  BEGIN
    CASE n OF
    | 1 =>
        Wr.PutText (wr, E1);
        Wr.PutText (wr, E1_0);
    | 2 =>
        Wr.PutText (wr, E2);
        Wr.PutText (wr, E2_0);
        Wr.PutText (wr, E2_1);
        Wr.PutText (wr, E2_2);
        Wr.PutText (wr, E2_3);
        Wr.PutText (wr, E2_4);
        Wr.PutText (wr, E2_5);
        Wr.PutText (wr, E2_6);
        Wr.PutText (wr, E2_7);
        Wr.PutText (wr, E2_8);
        Wr.PutText (wr, E2_9);
        Wr.PutText (wr, E2_10);
        Wr.PutText (wr, E2_11);
        Wr.PutText (wr, E2_12);
        Wr.PutText (wr, E2_13);
        Wr.PutText (wr, E2_14);
        Wr.PutText (wr, E2_15);
        Wr.PutText (wr, E2_16);
        Wr.PutText (wr, E2_17);
        Wr.PutText (wr, E2_18);
        Wr.PutText (wr, E2_19);
    ELSE (*skip*)
    END;
    RETURN TextWr.ToText (wr);
  END GetElt;

CONST E0 =
   "\n# default settings for prjm (ComPact Project Manager)\n\ncvspath\t\t\""
 & "cvs\"\t\t\nrepository\t\"/usr/cvs\"\neditor\t\t\"emacsclient\"\n";

CONST E1 =
   "NAME\n\n  prjm  --  The Elego ComPact Project Manager\n\nSHORT DESCRIPT"
 & "ION\n\n  Prjm applies one or more commands to sets of packages called\n"
 & "  `projects\'. Projects are defined in the project description file\n  "
 & "`PrjDesc\'.\n\nUSE\n\n  prjm <option> <action> [ <pkgname>* ]\n\n  <act"
 & "ion> ::= -buildlocal       | -buildproject    | -buildglobal \n        "
 & "    |  -check            | -clean           | -realclean\n            |"
 & "  -diff             | -cdiff           | -udiff\n            |  -showmo"
 & "dified     | -showoutofdate   | -showconflicts\n            |  -checkou"
 & "t         | -get             | -update\n            |  -commit <t>     "
 & "  | -commitrelease <t>\n            |  -commitlocal <t>  | -builtokay\n"
 & "            |  -makesnapshot <n> | -makerelease <n> | -newrelease <n>\n"
 & "            |  -showstatecache   | -showpackages    | -showpackagekinds"
 & "\n            |  -showpackagepaths \n            |  -showreleases     |"
 & " -showsnapshots\n            |  -shortstatus      | -longstatus\n      "
 & "      |  -showchangesets   | -changesetlog   \n            |  -snapshot"
 & "log      | -releaselog\n            |  -editchangeset    | -mergechange"
 & "set\n            |  -editsnapshot <n> | -editrelease <n>\n            |"
 & "  -export <name> <fn>\n            |  -import <fn> <name>\n            "
 & "|  -apply <cmd>      | -ordapply <cmd>\n            |  -selectby <cmd> "
 & "  | -ordselectby <cmd>\n            |  -updatesequence   | -dependencie"
 & "s\n            |  -purgebuildinfo   | -purgeunsureversioninfo\n        "
 & "    |  -saveimports <n>\n            |  -showsnapshot [-l] <n>*\n      "
 & "      |  -showrelease [-l] <n>* \n            |  -makestablerelease <n>"
 & " [<n>] \n\n  <option> ::= [-v] [-q] [-qc] [-d] [-k] [-f] [-quietcache]\n"
 & "               [-m   | -md | -modifieddeps]\n               [-o   | -od"
 & " | -outofdatedeps]\n               [-nd  | -nodep] [-noc | -nocache]\n "
 & "              [-noivc | -nointernalvc | -nointernalversioncontrol]\n   "
 & "            [-novc  | -noversioncontrol]     \n               [-fr    |"
 & " -forcerelease]\n               [-lazy] [-dep] [-p <PrjDescFi";

CONST E1_0 =
   "le>] \n               [-sd <snapshot dir>] [-snapdir <snapshot dir>] \n"
 & "               [-D name=value ]*\n               [ (-message | -msg) <c"
 & "ommit message>]\n               [-file <commit message file>]\n        "
 & "       [-t <tag1> [-t <tag2>]]\n               [-changeset <changeset> "
 & "| -cs <changeset>]\n               [-relevancelevel <i> | -importlevel "
 & "<i> | -irl <i>]\n               [-nosort  | -byname  | -bydate ]\n     "
 & "          [-reverse | -down ]\n\n  <t> ::= [ patch | minor | major ]\n "
 & " <n> ::= ``name of release or command\'\'\n  <i> ::= 0 | 1 | 2 | 3\n  <"
 & "cmd> ::= <token> | <string> \n  Use `prjm -man\' for a complete descrip"
 & "tion.\n\nFILES AND RESOURCES\n\n  ~/.compactrc, ~/compact/compactrc  --"
 & " global configuration\n  PrjDesc                            -- project "
 & "description file\n  PkgBase.DefaultData                -- package kind/"
 & "structure definition\n  snaps                              -- snapshot "
 & "and change set directory\n  snaps/snaps.idx                    -- snaps"
 & "hot and change set index\n";

CONST E2 =
   "\nSYNOPSIS\n\n  prjm <option> <action> [ <pkgname>* ]\n\n  <option> ::="
 & " [-v] [-q] [-qc] [-d] [-k] [-f] [-quietcache]\n               [-m   | -"
 & "md | -modifieddeps]\n               [-o   | -od | -outofdatedeps]\n    "
 & "           [-nd  | -nodep]\n               [-noc | -nocache]\n         "
 & "      [-novr]\n               [-noivc | -nointernalvc | -nointernalvers"
 & "ioncontrol]\n               [-novc  | -noversioncontrol]     \n        "
 & "       [-fr    | -forcerelease]\n               [-lazy]\n              "
 & " [-dep]\n               [-p <PrjDescFile>] \n               [-sd <snaps"
 & "hot dir>] \n               [-snapdir <snapshot dir>] \n               ["
 & "-D name=value ]*\n               [ (-message | -msg) <commit message>]\n"
 & "               [-file <commit message file>]\n               [-t <tag1>"
 & " [-t <tag2>]]\n               [-changeset <changeset> | -cs <changeset>"
 & "]\n               [-relevancelevel <i> | -importlevel <i> | -irl <i>]\n"
 & "               [-nosort  | -byname  | -bydate ]\n               [-rever"
 & "se | -down ]\n               [-saveprereleases | -saveall]\n\n  <action"
 & "> ::= -buildlocal              | -localbuild\n            |  -buildproj"
 & "ect            | -projectbuild\n            |  -buildglobal            "
 & " | -globalbuild\n            |  -shiplocal               | -localship\n"
 & "            |  -shipproject             | -projectship\n            |  "
 & "-shipglobal              | -globalship\n            |  -clean      \n  "
 & "          |  -realclean\n            |  -saveimports <n>         | -sav"
 & "eimps <n>     | -pkgovr <n>\n            |  -diff\n            |  -cdif"
 & "f\n            |  -udiff\n            |  -check\n            |  -check "
 & "-label <regex> <n>*\n            |  -newstatecache           | -newcach"
 & "e\n            |  -purgeunsureversioninfo  | -purgeunsureinfo  | -pui\n"
 & "            |  -purgebuildinfo          | -purgebi          | -pbi\n   "
 & "         |  -showpackages            | -showpkgs\n            |  -showp"
 & "ackagekinds        | -showkinds        | -kinds\n            |  -showsn"
 & "apshots           | -showsnaps        | -snaps\n            ";

CONST E2_0 =
   "|  -showreleases            | -showrels         | -rels\n            | "
 & " -showsnapshot [-l] <n>*  | -showsnap <n>*    | -ssnap <n>*\n          "
 & "  |  -editsnapshot <n>        | -editsnap <n>     | -esnap <n>\n       "
 & "     |  -snapshotlog [-mtime]    | -snaplog          | -ssl\n          "
 & "  |  -showrelease [-l] <n>*   | -showrel <n>*     | -srel <n>*\n       "
 & "     |  -editrelease <n>         | -editrel <n>      | -erel <n>\n     "
 & "       |  -releaselog  [-mtime]    | -rellog           | -rl\n         "
 & "   |  -export <name> <fn>      | -exp <name> <fn>\n            |  -impo"
 & "rt <fn> <name>      | -imp <fn> <name>\n            |  -showpackagepath"
 & "s        | -showpkgpaths     | -spp\n            |  -showstatecache    "
 & "      | -showcache        | -sc\n            |  -showshortstatus       "
 & "  | -shortstatus      | -sstat\n            |  -showlongstatus         "
 & " | -longstatus       | -lstat\n            |  -showchangesets          "
 & "| -showcs           | -scs\n            |  -changesetlog            | -"
 & "cslog            | -csl\n            |  -editchangeset           | -edi"
 & "tcs           | -ecs\n            |  -mergechangeset          | -mergec"
 & "s          | -mcs\n            |  -dependencies            | -showdeps "
 & "        | -deps\n            |  -updatesequence          | -upseq      "
 & "      | -tsort\n            |  -builtokay               | -builtok     "
 & "     | -bok\n            |  -isrelease               | -isrel          "
 & "  | -rel\n            |  -ismodified              | -ismod            |"
 & " -mod\n            |  -showmodified            | -showmod          | -s"
 & "mod\n            |  -isoutofdate             | -isood            | -ood"
 & "\n            |  -showoutofdate           | -showood          | -sood\n"
 & "            |  -hasconflicts            | -hascfl           | -cfl\n   "
 & "         |  -showconflicts           | -showcfl          | -scfl\n     "
 & "       |  -checkout                | -get              | -co\n         "
 & "   |  -update                  | -upd              | -up\n            |"
 & "  -commit <t>              | -ci <t>\n    ";

CONST E2_1 =
   "        |  -commitrelease <t>       | -commitrel <t>    | -cirel\n     "
 & "       |  -commitlocal <t>         | -ciloc <t>        | -cil <t>\n    "
 & "        |  -makesnapshot <n>        | -snapshot <n>     | -snap <n>\n  "
 & "          |  -makerelease <n>         | -makerel <n>      | -release <n"
 & ">\n            |  -newrelease <t> <n>      | -newrel <t> <n>\n         "
 & "   |  -applyaction <a>+        | -action <a>\n            |  -orderedap"
 & "plyaction <a>+ | -ordaction <a>\n            |  -apply <cmd>           "
 & "  | -app <cmd>\n            |  -ordapply <cmd>          | -oapp <cmd>\n"
 & "            |  -selectby <cmd>          | -sel <cmd>\n            |  -o"
 & "rdselectby <cmd>       | -osel <cmd>\n            |  -stablerelease <n>"
 & " [<n>] | -makestable <n> [<n>] \n            |  -makestablerelease <n> "
 & "[<n>] \n            |  -listpkgkinds            | -listkinds\n         "
 & "   |  -dumppkgkinds            | -dumpkinds\n\n  <t> ::= [ patch | mino"
 & "r | major ]\n     type of commit: patch should be used if only bugs or "
 & "misfeatures\n     are corrected, minor if minor additions and extension"
 & "s are committed,\n     and major if any interface change or semantical "
 & "change in exported\n     functionality occured\n\n  <n> ::= <token>\n  "
 & "   name of release or snapshot\n\n  <a> ::= <token> | <string>\n     on"
 & "e symbolic action name from the backend configuration file\n\n  <cmd> :"
 & ":= <token> | <string> \n     one or more commands understood by the int"
 & "ernal command interpreter\n     or the external shell that is used\n\n "
 & " -v  :    be verbose\n  -q  :    be quiet\n  -qc :    quiet cache (no `"
 & "scanning...\' messages)\n  -k  :    do not stop on errors\n  -f  :    d"
 & "o not stop on failures of external programs\n  -m  :    use only locall"
 & "y modified packages\n  -md :    use only locally modified packages and "
 & "those depending\n           on them (needed for selective builds)\n  -o"
 & "  :    use only out-of-date (elsewhere modified) packages\n  -od :    u"
 & "se only out-of-date (elsewhere modified) packages and those\n          "
 & " depending on them (needed for selective builds)\n  -nd ";

CONST E2_2 =
   ":    do not recompute dependencies, if possible; use old\n           de"
 & "pendency graph dump\n  -dep:    consider all dependend packages, too\n "
 & " -p  :    explicitly specify a project description file (default: PrjDe"
 & "sc)\n  -sd :    explicitly specify a snapshot directory (default: snaps"
 & ")\n  -noc:    don\'t use any state cached in checkpoint files \n       "
 & "    (default: .checkpoint)\n  -noivc:  don\'t use internal access to ve"
 & "rsion control backend, exlusively\n           rely on external programs"
 & " defined in PkgBase.DefaultData\n  -novc:   don\'t use version control "
 & "for project and snapshot files\n  -msg:    specify local commit message"
 & "\n  -file:   read local commit message from file\n  -fr:     force rele"
 & "ase for all packages in -newrelease command\n  -irl:    set the relevan"
 & "ce level for generated import directives in\n           PkgOvr files (0"
 & "-3, deault: 2)\n  -nosort: do not sort lists of snapshots, releases, or"
 & " change sets\n  -byname: sort lists of snapshots, releases, or change s"
 & "ets by name\n  -bydate: sort lists of snapshots, releases, or change se"
 & "ts by date\n  -down:   reverese the sort order of snapshots, releases, "
 & "or change sets\n\n  -snapdir       = -sd\n  -nodep         = -nd\n  -mo"
 & "difieddeps  = -md\n  -outofdatedeps = -od\n  -nocache       = -noc\n  -"
 & "nointernalvc  = -noivc\n  -message       = -msg\n  -forcerelease  = -fr"
 & "\n  -importlevel   = -irl\n  -reverse       = -down\n\n  -D name=value:"
 & " define the value of the named variable. These values are\n            "
 & "     passed on to the execution of actions from \n                 PkgB"
 & "ase.DefaultData and are substituted if matching names\n                "
 & " are found.\n\nSEMANTICS\n\n  Prjm is the project management tool of Co"
 & "mPact, a set of\n  Comprehensive Package Management Tools, that are des"
 & "igned to\n  facilitate the tasks of software development and software\n"
 & "  configuration management.\n\n  Projects in ComPact are sets of `packa"
 & "ges\' that are contained in\n  `collections\' and may individually be b"
 & "uilt, shipped to different\n  `pools\' of packages, from where ";

CONST E2_3 =
   "others may use (import) them,\n  cleaned, committed to a version reposi"
 & "tory, and released. The task of\n  complete package management for C/C+"
 & "+/Java is taken care of by `pkgm\'. \n  The program `pkgvm\' is a stand"
 & "alone version manager for C, C++, Modula-3,\n  and other kinds of packa"
 & "ges. Both pkgm and pkgvm work locally on one \n  package (like m3build "
 & "and m3ship of the M3 build system). \n\n  Prjm is the program that appl"
 & "ies actions to whole or partial\n  projects. It is not concerned direct"
 & "ly with any building, cleaning, or\n  version control action, it rather"
 & " relies on other tools to perform\n  these tasks. Prjm controls the bui"
 & "lding, releasing, and\n  reconstructing of potentially big sets of pack"
 & "ages. To be able to\n  perform these tasks, it has a configurable `fron"
 & "t end\' and `back\n  end\'. The `front end\' is a `project description "
 & "file\', usually\n  called PrjDesc, which contains simple declarations o"
 & "f the\n  collections and packages of the project. The `back end\' is a "
 & "mapping\n  from symbolic actions that prjm issues to concrete program\n"
 & "  invocations like the checkout of a package by pkgvm or building of a\n"
 & "  package via m3build or pkgm -build.\n\n  Obviously, the project descr"
 & "iption file must be written and\n  maintained by the user (the project "
 & "manager), while the back end\n  only needs to be extended or adapted to"
 & " special uses if the default\n  definitions are not sufficient. We will"
 & " look at the front end, the\n  back end, and the actions performed by p"
 & "rjm in turn.\n\n\n  THE PROJECT DESCRIPTION FILE\n\n  Here is the curre"
 & "nt project description file of prjm itself, which \n  is a program that"
 & " consists of some Modula-3 packages:\n\n    # The root where collection"
 & "s of packages are kept\n    collectionroot ${PRJ_ROOT}\n    # We use th"
 & "e variable PRJ_ROOT to keep the project description\n    # flexible, so"
 & " that every user can keep his package collections\n    # whereever she/"
 & "he likes.\n\n    # Two package collections definitions, each consisting"
 & " of a\n    # symbolic name (e.g. libs) and a pathname (e.";

CONST E2_4 =
   "g. m3libs) under\n    # which the collection can be found in the file s"
 & "ystem and the\n    # version control repository:\n    collection libs a"
 & "t m3libs\n    collection progs at m3progs\n\n    # Seventeen package de"
 & "finitions describe the complete project:\n    package  pkg_base        "
 & "   in libs\n    package  pkgversions        in libs\n    package  prjba"
 & "se            in libs\n    package  miscutils          in libs\n    pac"
 & "kage  depgraph           in libs\n    package  m3tkutils          in li"
 & "bs\n    package  fileinfo           in libs\n    package  pkgconf      "
 & "      in libs\n    package  regex              in libs\n    package  tu"
 & "ple              in libs\n    package  compactrc          in libs\n    "
 & "package  compact-copyright  in libs\n    package  m3fix              in"
 & " libs\n    package  filepool           in libs\n    package  miniscan  "
 & "         in libs\n    package  pkg_vc             in libs\n    package "
 & " prjm               in progs\n\n  Please notice that each collection ha"
 & "s a name and a location which\n  is relative to the collection root, wh"
 & "ile each package has a name\n  and a location that is relative to a col"
 & "lection.\n  The declaration of collectionroot may contain the environme"
 & "nt\n  variables HOME, USER, and PRJ_ROOT, which are expanded according "
 & "to\n  their current value in the environment when prjm is run.\n\n  A p"
 & "roject description file may also contain `snapshot\' and `release\'\n  "
 & "declarations. Here are two examples:\n  \n    snapshot snap_prjm_0_5_Fi"
 & "rstCompleteVersionWithProjectStateCache\n      prjbase devel_prjbase_d1"
 & "1_0_0\n      regex devel_regex_d2_0_0\n      miscutils devel_miscutils_"
 & "d16_0_0\n      depgraph devel_depgraph_d2_0_2\n      tuple devel_tuple_"
 & "d0_1_2\n      pkgversions devel_pkgversions_d4_0_0\n      compactrc dev"
 & "el_compactrc_d8_1_1\n      m3fix devel_m3fix_d3_0_2\n      prjm devel_p"
 & "rjm_d9_1_1\n      pkgconf devel_pkgconf_d16_2_0\n      pkg_base devel_p"
 & "kg=base_d21_0_0\n      fileinfo devel_fileinfo_d2_0_0\n      pkg_vc dev"
 & "el_pkg=vc_d25_0_12\n      filepool devel_filepool_d1_0_3\n      ";

CONST E2_5 =
   "miniscan devel_miniscan_d2_0_1\n      compact-copyright devel_compact-c"
 & "opyright_d1_1_1\n      m3tkutils devel_m3tkutils_d0_0_2\n    end\n\n   "
 & " release FirstWorkingPrjmRelease\n      prjbase    release_prjbase_2_0_"
 & "0\n      miscutils  release_miscutils_3_4_0\n      depgraph   release_d"
 & "epgraph_1_2_0\n      pkg_config release_pkg=config_3_0_6\n      prjm   "
 & "    release_prjm_2_4_1\n      pkg_base   release_pkg=base_1_8_5\n      "
 & "fileinfo   release_fileinfo_0_0_0\n      pkg_vc     release_pkg=vc_4_0_"
 & "3\n      m3tkutils  release_m3tkutils_0_0_0\n    end\n\n  Each snapshot"
 & " and release delcaration contains a complete mapping\n  from package na"
 & "mes to `tags\' which are like labels stuck to certain\n  versions of pa"
 & "ckages and can be used to reconstruct the state of the\n  package at a "
 & "certain state of development. The release `FirstWorking-\n  PrjmRelease"
 & "\' was done at an early time during the development and\n  thus contain"
 & "s only nine packages.\n\n  Usually snapshot and release delcarations ar"
 & "e not entered manually\n  into the project desription file PrjDesc, but"
 & " are automatically\n  generated by prjm. To be able to differentiate be"
 & "tween user defined\n  and generated declarations, there is a sub direct"
 & "ory `snaps\', in \n  which complete project descriptions with automatic"
 & "ally generated\n  snapshots reside.\n  This sub directory is automagica"
 & "lly updated by prjm each time a\n  new snapshot or release is created. "
 & "The project description file\n  PrjDesc itself is never touched by prjm"
 & ".\n\n\n  BACK END CONFIGURATION\n\n  The project manager reads the same"
 & " global `compactrc\' configuration\n  resources as the package manager "
 & "`pkgm\', which are located using the\n  bundled resources, the ComPact "
 & "remote resource service, and local\n  file resources. To learn more abo"
 & "ut the process of locating and\n  evaluating these resources, type `pkg"
 & "m -man\'. \n\n  The most important resource for the project manager is "
 & "called\n  `PkgBase.DefaultData\'. Like most other resources, first the "
 & "bundled\n  version is evaluated, then the project manager tries ";

CONST E2_6 =
   "to retrieve a\n  more recent version from the ComPact remote resource s"
 & "ervice, and\n  last of all it is searched in the local file system usin"
 & "g the\n  directories defined in the `configpath\'.\n\n  The configurati"
 & "on consists of a list of `package kind\' declarations\n  which describe"
 & " the structure of a software package and the actions\n  associated with"
 & " it. Here is the declaration that was used in release\n  1.1 for DEC SR"
 & "C Modula-3 packages:\n\n  # DEC SRC Modula-3 packages\n  pkgkind DEC_SR"
 & "C_M3\n    ostype \"bsd|unix|linux\" has file \"src/m3makefile\" and dir"
 & " \"src\"\n    action build       \"m3build {?OPT} {?M3BUILDOPT} 2> .err"
 & "ors && m3err .errors\"\n    action buildlocal  \"m3build {?OPT} {?M3BUI"
 & "LDOPT} -O  2> .errors && m3err .errors\"\n    action shipglobal  \"m3sh"
 & "ip {?OPT} {?M3SHIPOPT} 2> .errors && m3err .errors\"\n    action shippr"
 & "oject \"m3ship {?OPT} {?M3SHIPOPT} 2> .errors && m3err .errors\"\n    a"
 & "ction shiplocal   \"echo no shipping needed\"\n    action clean       \""
 & "m3build {?OPT} {?M3BUILDOPT} clean 2> .errors && m3err .errors\"\n    a"
 & "ction realclean   \"rm {?OPT} {?RMOPT} -f PkgDep PkgCDT PkgCRT .errors "
 & "; m3build clean\"\n    action mkdep       \"m3dep {?OPT} > PkgDep ; m3o"
 & "vr -v {:LOCATIONS} > src/m3overrides 2> /dev/null\"\n    action isrelea"
 & "se   \"pkgvm {?OPT} {?PKGVMOPT} -isrelease > /dev/null\"\n    action co"
 & "nflicts   \"pkgvm {?OPT} {?PKGVMOPT} -conflicts > /dev/null\"\n    acti"
 & "on uptodate    \"pkgvm {?OPT} {?PKGVMOPT} -uptodate > /dev/null\"\n    "
 & "action modified    \"pkgvm {?OPT} {?PKGVMOPT} -modified > /dev/null\"\n"
 & "\n    action checkrelease         \"pkgvm {?OPT} {?PKGVMOPT} -isrelease"
 & "\"\n    action checkconflicts       \"pkgvm {?OPT} {?PKGVMOPT} -conflic"
 & "ts\"\n    action checkuptodate        \"pkgvm {?OPT} {?PKGVMOPT} -uptod"
 & "ate\"\n    action checkmodified        \"pkgvm {?OPT} {?PKGVMOPT} -modi"
 & "fied\"\n    action currentdeveltag      \"pkgvm {?OPT} {?PKGVMOPT} -cdt"
 & " > PkgCDT\"\n    action currentreleasetag    \"pkgvm {?OPT} {?PKGVMOPT}"
 & " -crt > PkgCRT\"\n    action currenttag           \"pkgvm {?OPT} {?PKGV"
 & "MOPT} -ct > PkgCT";

CONST E2_7 =
   "\"\n    action commitdevelmajor     \"pkgvm {?OPT} {?PKGVMOPT} -commit "
 & "major\"\n    action commitdevelminor     \"pkgvm {?OPT} {?PKGVMOPT} -co"
 & "mmit minor\"\n    action commitdevelpatch     \"pkgvm {?OPT} {?PKGVMOPT"
 & "} -commit patch\"\n    action commitreleasemajor   \"pkgvm {?OPT} {?PKG"
 & "VMOPT} -release major\"\n    action commitreleaseminor   \"pkgvm {?OPT}"
 & " {?PKGVMOPT} -release minor\"\n    action commitreleasepatch   \"pkgvm "
 & "{?OPT} {?PKGVMOPT} -release patch\"\n    action update               \""
 & "pkgvm {?OPT} {?PKGVMOPT} -update {:TAG}\"\n    action checkout         "
 & "    \"pkgvm {?OPT} {?PKGVMOPT} -c {!LOCATION} -checkout {!TAG} {!PKG}\""
 & "\n    action getlabel             \"pkgvm {?OPT} {?PKGVMOPT} -getlabel "
 & "{:TAG} > .label\"\n    action currentlabel         \"pkgvm {?OPT} {?PKG"
 & "VMOPT} -getlabel > .label\"\n    action setlabel             \"pkgvm {?"
 & "OPT} {?PKGVMOPT} -setlabel {!TAG} {!LABEL}\"\n    action listlabels    "
 & "       \"pkgvm {?OPT} {?PKGVMOPT} -listlabels > .labels\"\n\n\n  This d"
 & "eclaration introduces the package kind `DEC_SRC_M3\', which can\n  be i"
 & "dentified by having a directory `src\' that contains the file\n  `m3mak"
 & "efile\'. It then lists actions that may be applied to a package\n  of t"
 & "his kind. Each action declaration must include a symbolic name\n  and a"
 & " list of commands that are appropriate to perform the\n  action. Some a"
 & "ctions may need parameters, which are enclosed in\n  braces. Of course,"
 & " the symbolic names of actions and parameters\n  are those that are use"
 & "d by prjm and are hard-coded into its\n  implementation. The correspond"
 & "ing command list can be configured as\n  needed though. If no special s"
 & "hell is named for its execution (via\n  the -sh option), prjm uses a si"
 & "mple internal command interpreter\n  that just knows about redirection "
 & "and serialization.\n\n  Since early in the development of ComPact relea"
 & "se 1.2, package kind\n  definitions also support inheritance of predica"
 & "tes (single\n  inheritance) and actions (multiple inheritance). This is"
 & "\n  accomplished with the keywords `inherit predicates\' and `inherit\n"
 & "  ";

CONST E2_8 =
   "actions\' as in the following examples:\n\n    pkgkind ComPacT_CC_UNIX\n"
 & "      ostype \"bsd|unix|linux|sunos5\" has dir \"src\" and dir \"inc\" "
 & "and \n      dir \"doc\" and file \"PkgDesc\"\n      inherit actions COM"
 & "PACT_VC_UNIX_OVERRIDES\n      inherit actions COMPACT_VC\n      inherit"
 & " actions COMPACT_BUILD\n\n    pkgkind COMPACT_SIMPLE_UNIX\n      ostype"
 & " \"bsd|unix|linux|sunos5\"\n      inherit predicates COMPACT_SIMPLE\n  "
 & "    inherit actions COMPACT_VC_UNIX_OVERRIDES\n      inherit actions CO"
 & "MPACT_SIMPLE\n\n  Go on and list all the package kinds defined in the\n"
 & "  PkgBase.DefaultData resource by using the `-listkinds\' command\n  op"
 & "tion.\n\n  You should also have a look at the complete resource. Just t"
 & "ype \n  `prjm -dumpkinds\'. You will easily understand the package kind"
 & "\n  definitions and be able to construct your own. You can start by\n  "
 & "copying an existing definitions into a PkgBase.DefaultData file in\n  t"
 & "he local resource path (`configpath\'), renaming it and trying some\n  "
 & "changes. The project manager will pick up local file resources last\n  "
 & "and their definitions will override those contained in bundled or\n  re"
 & "mote resources.\n\n  There\'s just one more peculiarity that should be "
 & "mentioned here: If\n  you want to add a comment line, make sure it star"
 & "ts with a `#\' and a\n  blank ` \'. Otherwise the parser won\'t recogni"
 & "ze it as a comment.\n\n  ACTIONS OF PROJECT MANAGEMENT\n\n  Prjm can be"
 & " used to check the current state of all packages that are\n  part of a "
 & "project, to freeze the current development state as a\n  snapshot, to u"
 & "se the current development state for a release of the\n  software, to b"
 & "uild the complete project by building and shipping\n  every package in "
 & "the correct order defined by the import-relation of\n  packages (which "
 & "of course must not be cyclic), to checkout and\n  rebuild a snapshot or"
 & " release from the PrjDesc or the snapshot set, to\n  apply user defined"
 & " command sequences to all or some packages of a\n  project, and to sele"
 & "ct packages of the project by internal or user\n  defined command seque"
 & "nce";

CONST E2_9 =
   "s.\n\n  For some of these tasks, prjm needs to know about the dependenc"
 & "ies\n  of the packages and maintain a dependency graph (which is, once\n"
 & "  computed, saved in the file PrjDepGraph and may be reused), for\n  ot"
 & "her actions (like checkout or update) the order is irrelevant.\n\n  -- "
 & "CHECKING PROJECTS --\n\n  Let\'s have a closer look at some of the acti"
 & "ons:\n\n  Once the project description file is written, you can check t"
 & "he\n  existence, completeness, and homogeneity of the project by runnin"
 & "g\n  `prjm -check\'. This will tell you if all the packages are found, "
 & "are\n  of the same package kind, try to construct a dependency graph an"
 & "d\n  finally report all packages that are used and found, and those tha"
 & "t \n  are used (imported) but not listed in the project. (This may be\n"
 & "  completely okay, since they may be globally installed and never chang"
 & "ed\n  libraries and so outside the realm of ComPact\'s configuration\n "
 & " management. Or, you may just have forgotten some :-)\n\n  There are tw"
 & "o more useful options: `prjm -showpackages\' lists\n  all the packages "
 & "and the locations where they were found.\n\n  `prjm -dependencies pkg_1"
 & " .. pkg_n\' lists all the packages \n   that depend on packages pkg_1 t"
 & "o pkg_n.\n  `prjm -dependencies\' lists all packages and their dependen"
 & "cies.\n  `prjm -updatesequence\' lists the order by which the packages\n"
 & "   are processed (packages topologically sorted by dependencies).\n\n  "
 & "-- BUILDING --\n\n  If everything is okay, you may then proceed to `bui"
 & "ld\' your\n  project. ComPact uses a three level hierarchy of compiled "
 & "and\n  installed packages: a `global pool\', a `project pool\', and a `"
 & "local\n  pool\'. Packages installed in the global pool are for use by\n"
 & "  everybody, project pools are dedicated to certain projects, and each\n"
 & "  developer has her/his own private pool. The DEC SRC Modula-3 build\n "
 & " system on the other hand uses only one global pool (though more\n  sop"
 & "histicated build systems are available). ComPact uses versioned\n  inst"
 & "allations of packages, that is, any pool may contain differe";

CONST E2_10 =
   "nt\n  compiled versions at the same time which may be referenced by the"
 & "ir\n  version in the `import\'-statement, while the default DEC SRC poo"
 & "l\n  can just contain one version at a time. Luckily, prjm may abstract"
 & "\n  from these differences and do its jobs (with some simplifications)\n"
 & "  for DEC SRC Modula-3 packages, ComPact\'s C and C++ (and soon Java)\n"
 & "  packages and probably for many more package kinds. For those who use\n"
 & "  the default SRC build system for Modula-3 (m3build and m3ship),\n  Co"
 & "mPact\'s global and project pools are mapped to the system package\n  p"
 & "ool (usually /usr/local/lib/m3/pkg), and the local pool is just the\n  "
 & "developers work space (no shipping needed). \n\n  According to the thre"
 & "e level hierarchy, prjm knows the actions\n  `buildlocal\', `buildproje"
 & "ct\', and `buildglobal\', which means compile\n  all the packages local"
 & "ly and ship them to the local, project, or\n  global package pool respe"
 & "ctively. (For local builds with Modula-3,\n  you need to write `m3overr"
 & "ide\' files for each package.) If you build\n  a project, you can use t"
 & "he following options to vary the behaviour: \n\n   -k   keeps prjm goin"
 & "g if any build action exited with an error\n        (exit code # 0)\n  "
 & " -f   keeps prjm going even if serious exceptions are encountered\n   -"
 & "v   lets prjm run more verbosely (it tells you exactly what it is\n    "
 & "    doing)\n   -m   directs prjm to consider only packages that are loc"
 & "ally modified\n   -md  tells prjm to consider all locally modified pack"
 & "ages and those\n        that depend on them (which may be quite a few m"
 & "ore than you\n        thought) \n   -o   directs prjm to consider only "
 & "packages that are elsewhere modified,\n        e.g. out-of-date after a"
 & "n appropriate update\n   -od  tells prjm to consider all out-of-date pa"
 & "ckages and those\n        that depend on them (which may be quite a few"
 & " more than you\n        thought) after an appropriate update\n   -nd  t"
 & "ells prjm to use a previously saved dependency graph and not\n        t"
 & "o recompute the package dependencies at each run (w";

CONST E2_11 =
   "hich is the\n        default)\n   -dep consider the packages named on t"
 & "he command line and those\n        dependend on them for the build\n   "
 & "-noc don\'t use the state cached in checkpoint files\n\n  You may also "
 & "explicitly state the packages that are to be considered\n  for the buil"
 & "d on the command line, as you may do with every other\n  action. \n\n  "
 & "If prjm is used together with the ComPact Package Manager pkgm,\n  it w"
 & "ill be useful to not that the commands\n\n    prjm -saveimports <snapsh"
 & "otname> <pkgs>*\n    prjm -pkgovr <snapshotname> <pkgs>*\n\n  will crea"
 & "te PkgOvr files in the root of all (or all explicitly\n  named) package"
 & "s with import directives corresponding to the given\n  snapshot or rele"
 & "ase name. These files include a statement of the\n  form\n\n    import("
 & "pkg, version)\n\n  for every package dependency. Version is a ComPact v"
 & "ersion range\n  denotation (allowing `x\' for undefined elements) with "
 & "three\n  levels. How wide the range is is defined by the import relevan"
 & "ce\n  level, which can be set with the option -irl 0|1|2|3, and default"
 & "s\n  to 2, which means that major and minor version number parts are\n "
 & " relevant, but not patch levels.\n\n  To be able to check if a previous"
 & " built run has been successful, the\n  following command has been intro"
 & "duced:\n\n    prjm -builtokay\n\n  -- CLEANING --\n\n  To delete all de"
 & "rived files in your local workspace, use `prjm\n  -clean\'. To delete e"
 & "ven more, use `prjm -realclean\'.\n\n  -- STATUS INFORMATION --\n\n  Yo"
 & "u may want some information about the version control state of\n  each "
 & "package. To check what packages are locally modified, use `prjm\n  -ism"
 & "odified\' which lists the modified packages. To check which\n  packages"
 & " are checked out as release, try `prjm -isrelease\'. To show\n  the loc"
 & "ally modified files of each package, type `prjm\n  -showmodified\'. You"
 & " may of course use the abbreviations listed in\n  the synopsis section "
 & "above for each command.\n\n  To list all modifications of all the packa"
 & "ges in your workspace as a\n  (context or unified context) diff listin";

CONST E2_12 =
   "g, use one of the following\n  commands: \n\n    prjm -k -diff \n    pr"
 & "jm -k -cdiff \n    prjm -k -udiff \n\n  To list differences between the"
 & " current version and some other\n  named snapshot or release, you may u"
 & "se the -t option:\n\n    prjm -k -diff  -t <snapshot1>\n    prjm -k -cd"
 & "iff -t <snapshot1>\n    prjm -k -udiff -t <snapshot1>\n\n  To list diff"
 & "erences between two named snapshots or releases, just\n  specify two -t"
 & " options:\n\n    prjm -k -diff  -t <snapshot1> -t <snapshot2>\n    prjm"
 & " -k -cdiff -t <snapshot1> -t <snapshot2>\n    prjm -k -udiff -t <snapsh"
 & "ot1> -t <snapshot2>\n\n  You must be aware of the fact that different s"
 & "napshots and releases\n  may contain different sets of packages, and th"
 & "at the set of packages\n  compared is always based of the contents of t"
 & "he current workspace.\n  All packages that are not either in the curren"
 & "t workspace or in one\n  of the snapshots stated on the command line ar"
 & "e not compared;\n  instead prjm issues a message that some diffs may be"
 & " missing.\n\n  If you want to generate a diff listing of all the change"
 & "s\n  contained in a named change set, use one of the following commands"
 & ":\n\n    prjm -k -diff  -cs <changeset>\n    prjm -k -cdiff -cs <change"
 & "set>\n    prjm -k -udiff -cs <changeset>\n\n  You may also obtain infor"
 & "mation about all snapshots or releases of a\n  project by the commands\n"
 & "\n    prjm -showsnapshots\n    prjm -showsrleases\n\n  which list the n"
 & "ames of all defined snapshots and releases. If you\n  want you have a l"
 & "ook at the actual configuration of a snapshot or a\n  release, use\n\n "
 & "   prjm -showsnapshot snapshotname [ snapshotname2 [ ... ] ]\n    prjm "
 & "-showsrlease  releasename  [ releasename2  [ ... ] ]\n\n  If you also s"
 & "pecify the -l option, you will get yet more information\n  from these c"
 & "ommands.\n  \n  To view a complete log of all available information of "
 & "snapshots or\n  releases, use\n\n    prjm -snapshotlog\n    prjm -relea"
 & "selog\n\n  -- CHANGING CONFIGURATIONS, IMPORT AND EXPORT --\n\n  It is "
 & "also possible to change a snapshot or release description\n  after its ";

CONST E2_13 =
   "creation, though you should generally avoid this and\n  rather create a"
 & " new configuration, since the old information will be\n  lost. Anyway, "
 & "if you feel to extend the description of one of your\n  snapshots or re"
 & "leases, you may use\n\n    prjm -editsnapshot snapshotname\n    prjm -e"
 & "ditrelease  releasename\n\n  Currently snapshot and release description"
 & "s are stored in the\n  `snaps\' subdirectory of the project package in "
 & "files with random\n  names. Future versions will probably store all con"
 & "figuration meta\n  information in a relational database. Anyway, snapsh"
 & "ot descriptions\n  can be exported into an oridnary text file with \n\n"
 & "    prjm -export snapshot-or-release-name filename\n\n  and imported fr"
 & "om an ordinary text file with\n\n    prjm -import filename snapshot-or-"
 & "release-project-configuration\n\n  -- SAVING LOCAL CHANGES --\n\n  Curr"
 & "ently the project directory with its snaps sub-directory\n  is treated "
 & "by ComPact as a special kind of package in order to\n  save the changes"
 & " made to the project description file and all\n  snapshots. This inform"
 & "ation is version-control meta-data;\n  there is only one ongoing line o"
 & "f development without any\n  branches. The current version always conta"
 & "ins all the information\n  to create all former snapshots and releases."
 & "\n\n  To commit local changes made to the project description file\n  o"
 & "r other files that you may have chosen to keep next to your\n  project "
 & "description, use the command\n\n    prjm -commitlocal major|minor|patch"
 & "\n\n  of course choosing only one of major, minor, or patch as the\n  a"
 & "rgument.\n\n  -- GENERAL COMMAND APPLICATION --\n\n  You may even want "
 & "to apply some more complicated actions to the\n  packages of your proje"
 & "ct, which may be done by `prjm -apply\n  <action>\', `prjm -ordapply <a"
 & "ction>\', `prjm -selectby <predicate\n  action>\', and `prjm -ordselect"
 & "by <predicate action>\'. The\n  `apply\'-commands are used if you are i"
 & "nterested in the effects of\n  your action to the packages, the `select"
 & "\'-options are used if you\n  want prjm to apply some commands in ";

CONST E2_14 =
   "order to select and list a\n  number of packages. Here is an example:\n"
 & "\n    prjm -m -k -nodep -apply \"cvs diff -bc\"\n\n  gives you a comple"
 & "te context diff of the changes you have made\n  locally to your package"
 & "s (if CVS is the version control back end,\n  which currently is the on"
 & "ly supported option for pkgvm and pkgm :-)\n\n  To get some statistics "
 & "about your project, you might want to use\n  something like\n\n    prjm"
 & " -sh /bin/sh -k -apply \"wc src/*.m3 src/*.i3\"\n\n  If you want to exp"
 & "licitly apply some of the actions defined in \n  the backend configurat"
 & "ion file by their symbolic names, you can\n  do this with the options `"
 & "prjm -applyaction <symbolic name>\' and\n  `prjm -orderedapplyaction <s"
 & "ymbolic name>\'.\n\n  -- COMMITTING CHANGES, CHANGE SETS --\n\n  To com"
 & "mit all local modifications to your project to the version\n  control r"
 & "epository, use \n\n    prjm -commit <commit type>\n\n  where commit typ"
 & "e can be `major\', `minor\', or `patch\'. Usually, you\n  would issue t"
 & "his action from inside a package while you are\n  developing. All modif"
 & "ications will be checked in and automatically\n  tagged, so your change"
 & "s can be reproduced as a whole every time.\n\n  To commit all your chan"
 & "ges and mark the state as release, use \n\n    prjm -commitrelease <com"
 & "mit type>\n\n  This changes the kind of tags that are supplied to relea"
 & "se tags and\n  automatically creates a `release branch\' for every pack"
 & "age. The\n  release branches are used to maintain released code that is"
 & " already\n  shipped to vendors and to add patches to old revisions of y"
 & "our\n  product.  Be careful with this option; it is likely that what yo"
 & "u\n  wanted to do was creating new releases for some packages and using"
 & "\n  old release branches for others.\n\n  After `commitrelase\' all the"
 & " affected packages are updated to the\n  corresponding release branch.\n"
 & "\n  With every commit action you may create a named `change set\'. This"
 & "\n  is initiated by simply adding the intended change set name to the\n"
 & "  command after the -cs option:\n\n    prjm -cs feature-foo -m -commit "
 & "<c";

CONST E2_15 =
   "ommit type>\n\n  This would check-in all modified packages and create a"
 & " change set\n  named `feature-foo\'. A change set is defined as a set o"
 & "f packages\n  with the state labels from before and after the change, t"
 & "ogether\n  with an (optional) log message and a date. A named change se"
 & "t can be\n  applied to other branches or states of a project. Change se"
 & "ts can be\n  merged into the current workspace with the command\n\n    "
 & "prjm -mergechangeset <changeset>\n\n  Change sets live in the snapshot "
 & "directory next to snapshot and\n  release definitions. They may also be"
 & " edited manually with the\n  command \n\n    prjm -editchangeset <chang"
 & "eset>\n\n  To list all available change sets use\n\n    prjm -showchang"
 & "esets\n\n  To view a complete log of all change sets use\n\n    prjm -c"
 & "hangesetlog\n\n  Change set descriptions can be exported into an oridna"
 & "ry text file with \n\n    prjm -export change-set-name filename\n\n  an"
 & "d imported from an ordinary text file with\n\n    prjm -import filename"
 & " change-set-name\n\n  -- CREATING SNAPSHOTS AND RELEASES --\n\n  If you"
 & " want to freeze the current development state of your project\n  into a"
 & " snapshot, you can do so by issuing the command\n\n    prjm -snapshot <"
 & "snapshot name>\n\n  Prjm will check if any package is locally modified "
 & "(which must not\n  be as all changes need to be checked in to be reprod"
 & "ucible) and then\n  record all the packages and the associated versions"
 & " as a snapshot\n  declaration in the `snaps\' directory.\n\n  Likewise,"
 & " releases are produced by \n\n    prjm -release <release name>\n\n  The"
 & " difference to a snapshot is that every package must be checked\n  out "
 & "as a released version as a necessary precondition.\n\n  If you want a r"
 & "elease and haven\'t got released all of your packages,\n  you can combi"
 & "ne the -commitrelease and -release options by using\n  \n    prjm -newr"
 & "elease <commit type> <release name>\n\n  This command will by default c"
 & "reate release branches for all packages\n  that are not checked out on "
 & "a release branch, and use existing release\n  branches for others.\n\n "
 & " If y";

CONST E2_16 =
   "ou additionally specify the -forcerelease option, prjm will\n  create n"
 & "ew release branches for all your packages.  Be careful with\n  this opt"
 & "ion; it is likely that what you wanted to do was creating\n  new releas"
 & "es for some packages and using old release branches for\n  others.\n\n "
 & " Unless -novr is specified, in every package root directory a\n  PkgOvr"
 & " file is created, which lists all the package imports with the\n  corre"
 & "sponding versions. See the description of -saveimports above\n  for fur"
 & "ther details. These files are created and then\n  automatically added t"
 & "o version control and committed to the relevant\n  branches. If these c"
 & "ommits fail, no release configuration is saved.\n  (At this point, prjm"
 & " has already created an internal pre-release\n  configuration, which wi"
 & "ll only be written to disk if you also\n  specify -saveprereleases or -"
 & "saveall.)\n\n  The current version of prjm auto-commits all newly creat"
 & "ed\n  snapshots and releases, unless the -noversioncontrol option is\n "
 & " specified. That is, the project directory is considered as a\n  packag"
 & "e, the new snapshot description is added, and the changes\n  are commit"
 & "ted. \n\n  If you have a release you can create a named `stable release"
 & "\' based\n  on it, that is, a mapping from package names to stable bran"
 & "ch tags\n  based on the frozen release. As an example let us suppose th"
 & "at you\n  have created a release name my_release_1_0. You would now pro"
 & "ceed\n  with the command\n\n    prjm -stablerelease my_release_1_0\n\n "
 & " Prjm would now create a new release description named \n  my_release_1"
 & "_0_stable, which would contain all the packages and\n  tags from the ba"
 & "se release, except that all patch levels of\n  the release tags would b"
 & "e replaced by `stable\'. You can think of\n  stable releases as equival"
 & "ent to the `head\' tag: a stable release\n  enables you to check out th"
 & "e latest versions of all packages\n  of a project on stable branches.\n"
 & "\n  If you create a release, the project manager first checks if\n  eve"
 & "rything has been built successfully in your workspace.";

CONST E2_17 =
   " This is\n  done via the builtok command specified in PkgBase.DefaultDa"
 & "ta for\n  the corresponding package kind. If anything is found missing,"
 & " the\n  creation of the release is aborted. The check is not performed "
 & "if\n  the -force option is present.\n\n  -- REPRODUCING SNAPSHOTS AND R"
 & "ELEASES --\n\n  Every snapshot and release recorded in the PrjDesc file"
 & " or the\n  `snaps\' directory may be reproduced at any time. You first "
 & "need to \n  check out the complete snapshot or release from the vesion "
 & "repository by\n\n    prjm -checkout <release or snapshot name>\n    prj"
 & "m -checkout head\n\n  Prjm will try to create all the collections and p"
 & "ackages listed in\n  your project file and defined by the snapshot or r"
 & "elease\n  declaration. If any version of the packages already exists, p"
 & "rjm will\n  try to update it to the desired version. To test your relea"
 & "se, you\n  should of course start with an empty workspace (for exmaple "
 & "by\n  changing the `collectionroot\' definition in the project file or\n"
 & "  altering the PRJ_ROOT variable, if it is included). If the special \n"
 & "  name `head\' is given, the current development versions from the main"
 & "\n  trunk will be checked out.\n\n  If the checkout command is issued w"
 & "ith more than one parameter,\n  the first is considered to be version c"
 & "ontrol tag name (in contrast\n  to a snapshot name, which is a mapping "
 & "from packages to version\n  control tags), and all following parameters"
 & " are treated as package\n  names, which are then checked out with the g"
 & "iven tag.\n\n  You may then build the project for example by\n\n    prj"
 & "m -v -buildlocal\n\n  if the build tools are configured for local build"
 & "ing.\n\n  -- PROJECT STATE CACHES --\n\n  In order to speed up the buil"
 & "ding of projects and displaying\n  information about the version contro"
 & "l status of packages, prjm\n  keeps a state cache (usually in the file "
 & ".checkpoint). This\n  cache contains `fingerprints\' for all the packag"
 & "es (which are\n  used to determine if anything in the package directory"
 & " has\n  changed since the last inspection) and a set of att";

CONST E2_18 =
   "ributes\n  which (when set) may be used to omit several time-consuming "
 & "\n  operations. The setting of these attributes is carefully \n  contro"
 & "lled, and always chosen to be `on the safe side\' for all\n  attributes"
 & " except those indicating `up-to-date\' and\n  `no conflicts\'. To clean"
 & " these cached attributes, you can use\n\n    prjm -purgeunsureversionin"
 & "fo\n\n  This action will be executed by prjm anyway if you want to\n  c"
 & "heck for out-of-date and conflicting packages, unless the\n  `-lazy\' o"
 & "ption is specified, too. (This is different from\n  the behaviour of Co"
 & "mPactHTTPd.)\n\n  Nonetheless, if you don\'t trust the cached informati"
 & "on, you \n  can \n\n   o use the option -noc (-nocache) to forbid prjm "
 & "to use the \n     cache,\n   o execute\n\n       prjm -newcache\n\n    "
 & " to clear the cache, or\n   o just remove the .checkpoint file (prjm wi"
 & "ll create a fresh one).\n\n  If you want to see the cache contents, you"
 & " can either list or\n  edit the file directly (it is plain ASCII text),"
 & " or use the command\n\n    prjm -showcache\n\n  which also recomputes t"
 & "he saved fingerprints.\n\n  If you want to see the status of all packag"
 & "es in a format\n  that is easier to read, use\n\n    prjm -shortstatus\n"
 & "\n  which displays a short status description for every package, which\n"
 & "  is essentially the information from the cache. If you specify\n  the "
 & "option `-longstatus\', many more status attributes will be shown\n  for"
 & " every package.\n\n  If you do not specify the -noc or -nocache option,"
 & " the checkpoint\n  file is read and evaluated prior to every action of "
 & "prjm, and a new\n  checkpoint is written after the completion of the ac"
 & "tion.\n\n  You can use the options `-checkpointfile <fn>\' and `-cpf <f"
 & "n>\'\n  to specify a different name for the checkpoint file to be used."
 & "\n\n  In combination with the verbose option `-v\', prjm will tell\n  y"
 & "ou which actions are actually performed and which are ommitted\n  due t"
 & "o cached information.\n\nBUGS\n\n o Timestamps should be added to snaps"
 & "hots and releases as well as\n   textual descriptions.\n\n o The intern"
 & "al comm";

CONST E2_19 =
   "and interpreter does not know about pipes and\n   wildcard expansion. ("
 & "External shells may be used instead.)\n\n o Many more useful and intere"
 & "sting commands can be thought of.\n\n";

BEGIN
END ProjectManagerBundle.