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.