|
|
1.1 ! root 1: .nr PS 12 ! 2: .NH ! 3: Advanced Use ! 4: .nr PS 10 ! 5: .XS ! 6: \*(SN Advanced Use ! 7: .XE ! 8: .PP ! 9: This section summarizes the rest of the facilities offered by SPMS ! 10: for handling large software projects. Techniques for searching and ! 11: editing text files, program testing, and documentation are explained. ! 12: .NH 2 ! 13: Project Hierarchies ! 14: .XS ! 15: \*(SN Project Hierarchies ! 16: .XE ! 17: .PP ! 18: To facilitate the management of large projects, such projects can be ! 19: subdivided into smaller projects. These subprojects can be nested ! 20: to any level to form a project hierarchy which is very similar to the ! 21: .UX ! 22: directory hierarchy. For example, as project `vs' grows, it might be ! 23: convenient to convert each of the `hash' and `list' program libraries ! 24: into subprojects (see fig. 6). ! 25: .KF ! 26: .sp 22 ! 27: .SM ! 28: .ce ! 29: \fIFigure 6. \fRProject `vs' with subprojects ! 30: ! 31: .NL ! 32: .KE ! 33: To show how this conversion is done, the following set of ! 34: commands converts project directory `libhash' into a subproject. ! 35: .ID ! 36: \fIConvert the project directory into a subproject\fR . . . ! 37: ! 38: % \fBpd src\fR ! 39: % \fBprmdir \-u libhash\fR ! 40: % \fBmkproject libhash\fR ! 41: libhash: description? (1 line): \fBVS Hash Table Operations\fR ! 42: ! 43: \&. . . \fIcreate the project directories\fR . . . ! 44: ! 45: % \fBchproject libhash\fR ! 46: % \fBpmkdir src test work\fR ! 47: src: description? (1 line): \fBhash table library source code\fR ! 48: test: description? (1 line): \fBhash table library test programs\fR ! 49: work: description? (1 line): \fBhash table library workbench\fR ! 50: ! 51: \&. . . \fIreattach the type labels\fR . . . ! 52: ! 53: % \fBpmkdir +T\|libsrc,install.1,print.3 src ! 54: ! 55: \&. . . \fIand rearrange the library\fR ! 56: ! 57: % \fBpmv Makefile \(**.c \(**.o src\fR ! 58: % \fBpd src\fR ! 59: % \fBmkmf DEST=../../../lib\fR ! 60: .DE ! 61: .NH 3 ! 62: \fIThe \fBroot\fI project\fR ! 63: .XS ! 64: \*(SN The root project ! 65: .XE ! 66: .PP ! 67: The project at the top of each user's project hierarchy is called the ! 68: .I ! 69: root project ! 70: .R ! 71: and is given the special name `^'. When the SPMS system was initially ! 72: set up (see \(sc2.1), the command ! 73: .ID ! 74: % \fBmkproject \-d ^\fR ! 75: .DE ! 76: created the root project and made the user's home directory into the project ! 77: root directory for `^'. ! 78: .NH 3 ! 79: Project Pathnames ! 80: .XS ! 81: \*(SN Project Pathnames ! 82: .XE ! 83: .PP ! 84: .I ! 85: Project pathnames ! 86: .R ! 87: provide a convenient way for accessing a particular directory or file ! 88: within a project hierarchy\**. ! 89: .FS ! 90: Project pathnames are recognized only by SPMS commands. ! 91: .FE ! 92: A project pathname is formed ! 93: by a succession of project names separated by `^' characters\**, ! 94: .FS ! 95: Since the Bourne shell, (\fIsh\fR), recognizes the `^' character as ! 96: an alternative pipe symbol, Bourne shell users must type `\\\\^' instead. ! 97: .FE ! 98: followed by the name of the directory or file. For instance, the pathname ! 99: .ID ! 100: ^vs^libhash^src ! 101: .DE ! 102: represents the path from the root project to the `src' directory ! 103: located in subproject `libhash', and the pathname ! 104: .ID ! 105: ^vs^libhash^src/hthash.c ! 106: .DE ! 107: locates the file `hthash.c' in that directory. ! 108: .PP ! 109: A project pathname can be ! 110: .I absolute ! 111: or ! 112: .I relative. ! 113: An ! 114: .I ! 115: absolute project pathname ! 116: .R ! 117: specifies the path from the root project and begins with the ! 118: character `^'. However, a project pathname not beginning with ! 119: `^' is interpreted with respect to the current working project and is ! 120: therefore called a ! 121: .I ! 122: relative project pathname. ! 123: .R ! 124: For example, the pathname ! 125: .ID ! 126: libhash^src ! 127: .DE ! 128: specifies the location of `src' relative to project `vs', assuming ! 129: that `vs' is the working project. ! 130: .PP ! 131: Since relative project pathnames are interpreted relative to the ! 132: current working ! 133: .B project ! 134: rather than the current working directory, this means that project directories ! 135: and files can be accessed from ! 136: .B any ! 137: working directory. For example, the command ! 138: .ID ! 139: % \fBpmv src/libhash.a work\fR ! 140: .DE ! 141: moves the hash table library from the `src' directory in the working project ! 142: `libhash' to the `work' directory in the same project, regardless of ! 143: the location of the current working directory. ! 144: .PP ! 145: The parent of the working project is called `....' and may be used ! 146: in a project pathname to go up one level in a project hierarchy. Thus, ! 147: the command ! 148: .ID ! 149: % \fBchproject ....\fR ! 150: .DE ! 151: makes the parent project of the current project into the new working project. ! 152: If the current project happens to be `libhash', then the command ! 153: .ID ! 154: % \fBchproject ....^liblist\fR ! 155: .DE ! 156: will change to project `liblist'. For completeness, `...' is an ! 157: alternative name for the current working project. Table 1 summarizes ! 158: the conventions used in project pathnames together with the equivalent ! 159: conventions for regular pathnames. ! 160: .KF ! 161: ! 162: .SM ! 163: .ce ! 164: \fITable 1.\fR Pathname conventions ! 165: .NL ! 166: ! 167: .so pathname.tbl ! 168: .KE ! 169: .PP ! 170: Project pathnames can be modified in two ways. The first way allows ! 171: a user to refer to a project belonging to someone else by prepending ! 172: ~\fIuser\fR to the pathname. For example, if `root' has a copy of the project ! 173: `vs', the command ! 174: .ID ! 175: % \fBppd ~root^vs\fR ! 176: .DE ! 177: will print the directories in that project. The other way allows a ! 178: regular pathname to follow a project pathname, separated by a `/' ! 179: character. This enables access to directories which are not part of ! 180: a project. To illustrate, if `junk' is a regular directory in the ! 181: `work' directory of the project `vs', the command ! 182: .ID ! 183: % \fBpd ^vs^work/junk\fR ! 184: .DE ! 185: changes to that directory. ! 186: .NH 2 ! 187: Project Environment ! 188: .XS ! 189: \*(SN Project Environment ! 190: .XE ! 191: .PP ! 192: It is possible to tailor the environment for the current project by ! 193: adding commands to the `.projectrc' startup file located in the root ! 194: directory of the project. When the project is activated by the ! 195: .I chproject ! 196: command, this file is executed. For instance, if a user wishes to be ! 197: reminded of tasks that still need attention on a project, a reminder ! 198: service can be set up by putting the reminders in a file, (e.g. ! 199: `.reminder') and adding the line ! 200: .ID ! 201: cat .reminder ! 202: .DE ! 203: to the `.projectrc' file. ! 204: .PP ! 205: It is also a good idea to include the ! 206: .B \-d ! 207: option in the alias for the ! 208: .I chproject ! 209: command (see \(sc\|2.1) so that when ! 210: .I chproject ! 211: is invoked, it will print the name of the new working project, as in ! 212: .DS ! 213: % \fBchproject ^vs\fR ! 214: Visual Spreadsheet ! 215: % ! 216: .DE ! 217: .NH 2 ! 218: Global Operations ! 219: .XS ! 220: \*(SN Global Operations ! 221: .XE ! 222: .PP ! 223: Even if a project is divided into subprojects, commands can ! 224: still be executed globally over the entire software package by the ! 225: .I pexec ! 226: command. ! 227: .I Pexec ! 228: has two modes of execution, depending on the method chosen for selecting ! 229: directories. If type labels are not used for selecting a particular ! 230: set of directories, ! 231: .I pexec ! 232: descends recursively through the project hierarchy and executes ! 233: the command argument in the project directories at each level. The ! 234: command ! 235: .ID ! 236: % \fBpexec ls\fR ! 237: .DE ! 238: demonstrates this mode of operation by listing the contents of the ! 239: directories in the project `vs' in the order shown in figure 7. ! 240: .KF ! 241: .sp 26 ! 242: .SM ! 243: .ce ! 244: \fIFigure 7. \fRDirectory ordering for `pexec ls' ! 245: ! 246: .NL ! 247: .KE ! 248: .PP ! 249: The other mode of operation, involving the use of type labels, causes ! 250: .I pexec ! 251: to search the project hierarchy for directories with appropriate type ! 252: labels, sort the directories according to their priorities, and then ! 253: execute the command argument in each directory. As an example of this ! 254: mode of execution, figure 8 indicates the order in which the command ! 255: .ID ! 256: % \fBpexec \-T\|print \'pr \(**.h \(**.c\' | lpr\fR ! 257: .DE ! 258: prints the project `vs'. ! 259: .KF ! 260: .sp 24 ! 261: .SM ! 262: .ce ! 263: \fIFigure 8. \fRDirectory ordering for `pexec \-T\|print ...' ! 264: ! 265: .NL ! 266: .KE ! 267: .PP ! 268: With both modes of operation, ! 269: .I pexec ! 270: resets the current working project to the project in which the directory ! 271: resides. For each of the `src' directories in project `vs' the ! 272: corresponding working projects are ! 273: .so cwp.tbl ! 274: .NH 3 ! 275: \fIBoolean type label expressions\fR ! 276: .XS ! 277: \*(SN Boolean type label expressions ! 278: .XE ! 279: .PP ! 280: Global commands can be made even more precise by using boolean expressions\** ! 281: .FS ! 282: The formal definition of a boolean type label expression is ! 283: .CD ! 284: \fIE\fR \(-> \fIE\fB or \fIE\fR | \fIE\fB and \fIE\fR | \fBnot\fI E\fR | ( E ) | \fBid\fR ! 285: .DE ! 286: where ! 287: .I E ! 288: is a boolean expression; \fBand\fR, \fBor\fR, and \fBnot\fR are ! 289: boolean operators; and ! 290: .B id ! 291: is a type label. As is customary, it is assumed that ! 292: .B or ! 293: and ! 294: .B and ! 295: are left-associative, and that ! 296: .B or ! 297: has the lowest precedence, then \fBand\fR, then ! 298: .B not. ! 299: .FE ! 300: on type labels to select project directories. To show how boolean ! 301: expressions are used, let the source code directories in project `vs' ! 302: have the type labels shown below. ! 303: .KS ! 304: .so src.tbl ! 305: .KE ! 306: .LP ! 307: In terms of entering the boolean expression on the command line, `\fBor\fR' ! 308: is represented by the character `|', `\fBand\fR' by the character `&', and ! 309: `\fBnot\fR' by `!'. Since these characters, together with `(' and `)', ! 310: are meaningful ! 311: to the command shell, it is good idea to enclose the whole expression ! 312: in quotes\**. ! 313: .FS ! 314: Even if this is done, the `!' character must still be escaped by a ! 315: backslash `\\\\' if it precedes a type label to prevent it from being ! 316: interpreted by the ! 317: .I csh ! 318: history mechanism. ! 319: .FE ! 320: Then, the command ! 321: .ID ! 322: % \fBpexec "\-T\|print\|&\|(libsrc\||\|cmdsrc)" \'pr \(**.h \(**.c\' | lpr\fR ! 323: .DE ! 324: prints the source code in both the program and library source code directories, ! 325: but not the directory containing header files. Alternatively, ! 326: .ID ! 327: % \fBpexec "\-T\|print\|&\|\\!include" \'pr \(**.h \(**.c\' | lpr\fR ! 328: .DE ! 329: achieves the same result. ! 330: .NH 3 ! 331: \fISearching and editing\fR ! 332: .XS ! 333: \*(SN Searching and editing ! 334: .XE ! 335: .PP ! 336: Whenever it becomes necessary to alter something like the number of arguments ! 337: in a call to a function, the ! 338: .I pgrep ! 339: command can be used to bring up the text editor on all the files in the software ! 340: package that contain that function call. Suppose, for example, that the ! 341: number of arguments to the ! 342: .UX ! 343: system call `open' for opening files has changed. The command ! 344: .ID ! 345: % \fBpgrep \-C\|vi \-T\|src \-m \'open(\'\fR ! 346: .DE ! 347: will edit all the source code files containing that call, using the ! 348: .I vi ! 349: text editor. ! 350: .NH 2 ! 351: Testing ! 352: .XS ! 353: \*(SN Testing ! 354: .XE ! 355: .PP ! 356: After a program is released for general use, it will require ! 357: maintenance. It may have to be modified to speed it up, fix bugs, or add ! 358: new features. Each time the program is altered, the parts that are ! 359: affected should be checked against previous test results by doing ! 360: .I regression ! 361: testing. The ! 362: .I ptest ! 363: program mechanizes this process. ! 364: .PP ! 365: .I Ptest ! 366: tests each function by running a test program and comparing the output ! 367: with previously prepared results. For example, the test for the `htinstall' ! 368: function in the hash table library produces ! 369: .DS ! 370: % \fBptest htinstall\fR ! 371: htinstall: extracting archive ... compiling test ... executing test ... done ! 372: % ! 373: .DE ! 374: if the test succeeds. However, if the test fails, ! 375: .I ptest ! 376: reports this fact by ! 377: .ID ! 378: htinstall: extracting archive ... compiling test ... executing test ... failed ! 379: .DE ! 380: and saves the error diagnostics in a file named `Ehtinstall'. ! 381: .PP ! 382: The test program and data files for each test case are stored in an archive file ! 383: named \fItest\fR.a where ! 384: .I test ! 385: is the name of the test case, located in the `test' directory. In the ! 386: case of `htinstall', the test archive is called `htinstall.a' and contains ! 387: the test program source file, Thtinstall.c, the input data file, Ihtinstall, ! 388: and the validated output data file, Ohtinstall. The details on how to set ! 389: up a test archive are explained more fully in section ptest(1P) of the ! 390: .UX ! 391: programmer's manual. ! 392: .NH 2 ! 393: Documentation ! 394: .XS ! 395: \*(SN Documentation ! 396: .XE ! 397: .NH 3 ! 398: \fIThe project log\fR ! 399: .XS ! 400: \*(SN The project log ! 401: .XE ! 402: .PP ! 403: The ! 404: .I plog ! 405: project log command provides an electronic notebook system by which to record ! 406: transactions such as incoming and outgoing mail, progress reports, ! 407: minutes of project staff meetings, etc. ! 408: .I Plog ! 409: records messages in a file called `projectlog' located in the project root ! 410: directory, by invoking the ! 411: .UX ! 412: .I Mail ! 413: program\|[9]. After the ! 414: .I Mail ! 415: program starts up, the user types in the message, followed by a period `.' ! 416: or CNTL-D at the beginning of a line. Since the ! 417: .I Mail ! 418: program processes the message, the user can take advantage of all the mailing ! 419: facilities offered by the system. For instance, the following announcement ! 420: on the `vs' project can be mailed to a group of users labeled `vsusers'\** ! 421: .FS ! 422: By the ! 423: .I alias ! 424: mechanism of ! 425: .I Mail. ! 426: .FE ! 427: using the `~c' `carbon copy' facility of the ! 428: .I Mail ! 429: program: ! 430: .DS ! 431: % \fBplog\fR ! 432: Subject: \fB`vs' release 2 ! 433: ~c vsusers ! 434: Release 2 of the `vs' visual spreadsheet package is now available for ! 435: distribution. It has the following features:\fR ! 436: . ! 437: . ! 438: . ! 439: % ! 440: .DE ! 441: .PP ! 442: .I Plog ! 443: can be used to produce reports by printing sections of the project log ! 444: with subject headings. For example, if the above announcement is message 20 ! 445: in the project log for the `vs' project, the following command will print ! 446: message 20 plus any subsequent messages. ! 447: .ID ! 448: % \fBplog \-p20\fR ! 449: \l'\n(.lu-\n(.iu\&-' ! 450: .ce ! 451: `vs' release 2 ! 452: \l'\n(.lu-\n(.iu\&-' ! 453: From pjn Wed Aug 10 11:02:44 1983 ! 454: To: /usr/pjn/vs/projectlog ! 455: Subject: `vs' release 2 ! 456: Cc: vsusers ! 457: ! 458: Release 2 of the `vs' visual spreadsheet package is now available for ! 459: distribution. It has the following features: ! 460: . ! 461: . ! 462: . ! 463: % ! 464: .DE ! 465: .PP ! 466: .I Plog ! 467: can also be used to collect incoming mail, edit the project log, and ! 468: sort it into chronological order. These options are explained ! 469: more fully in section plog(1P) of the ! 470: .UX ! 471: programmer's manual. ! 472: .NH 3 ! 473: \fIReference manual\fR ! 474: .XS ! 475: \*(SN Reference manual ! 476: .XE ! 477: .PP ! 478: The ! 479: .I pman ! 480: command supports a project reference manual in the same ! 481: way that the ! 482: .I man ! 483: command provides information from the ! 484: .UX ! 485: programmer's manual. For example, to print information about the `vs' ! 486: visual spreadsheet program, type ! 487: .ID ! 488: % \fBpman vs\fR ! 489: .DE ! 490: and to find out about the `vstutor' program, type ! 491: .ID ! 492: % \fBpman vstutor\fR ! 493: .DE ! 494: .PP ! 495: The directories that contain the manual entries must ! 496: be set up in the same way as the programmer's manual as shown in figure 9. ! 497: .KF ! 498: .sp 18 ! 499: .SM ! 500: .ce ! 501: \fIFigure 9. \fRLayout of the `vs' project manual ! 502: ! 503: .NL ! 504: .KE ! 505: By convention, manual pages for commands have `.1' suffixes and are ! 506: kept in the `man1' directory, manual pages for libraries have `.3' ! 507: suffixes and are kept in `man3', and file formats have `.5' suffixes ! 508: and are kept in `man5'. The ! 509: .I pman ! 510: command searchs through each of the `man1', `man3', and `man5' ! 511: directories in turn until it finds the topic. ! 512: .NH 3 ! 513: \fIOn-line help\fR ! 514: .XS ! 515: \*(SN On-line help ! 516: .XE ! 517: .PP ! 518: On-line help for a project is provided by the ! 519: .I phelp ! 520: command. After ! 521: .I phelp ! 522: is typed, it prints some introductory information, a list of available ! 523: topics, and then the prompt `???', indicating that it is ready for a ! 524: command. The following commands are recognized ! 525: .DS C ! 526: .so help.tbl ! 527: .DE ! 528: If a topic name is typed in reply, ! 529: .I phelp ! 530: will print a page of information and then wait until a space is typed before ! 531: it continues. ! 532: .PP ! 533: In project `vs' there are three topics available \- ! 534: `install' explains how to install `vs'; `progress' lists recent developments; ! 535: and `schedule' outlines the development plan. In the following session, ! 536: .I phelp ! 537: is used to examine some of these topics. ! 538: .ID ! 539: % \fBphelp\fR ! 540: (\fIprints an introduction to phelp\fR) ! 541: ! 542: Help topics available: install progress schedule ! 543: ! 544: ??? \fBschedule\fR ! 545: (\fIprints `schedule' topic\fR) ! 546: ??? \fBprogress\fR ! 547: (\fIprints `progress' and goes down one level to `progress' subtopics\fR) ! 548: ! 549: progress subtopics: bugfixes ! 550: ! 551: progress-->??? \fBbugfixes\fR ! 552: (\fIprints `bugfixes' topic\fR) ! 553: progress-->??? \fBq\fR ! 554: (\fIexits from phelp\fR) ! 555: % ! 556: .DE ! 557: .PP ! 558: Help topics are contained in files which reside in the `help' directory ! 559: located in the project root directory. Figure 10 shows how these ! 560: topics are set up for project `vs'. ! 561: .KF ! 562: .sp 20 ! 563: .SM ! 564: .ce ! 565: \fIFigure 10. \fRHelp topics for project `vs' ! 566: ! 567: .NL ! 568: .KE ! 569: The circles represent topic files, and the rectangles represent ! 570: directories. Subtopics are contained in subdirectories named according ! 571: to the topics they represent, but with a `.d' suffix. Consequently, ! 572: `bugfixes' is in the subdirectory `progress.d' since it is a subtopic of ! 573: `progress'. ! 574: ! 575:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.