|
|
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.