1 | .de Id |
---|
2 | .ds Rv \\$3 |
---|
3 | .ds Dt \\$4 |
---|
4 | .. |
---|
5 | .Id $Id: ci.1,v 1.1.1.1 1996-10-04 05:52:41 ghudson Exp $ |
---|
6 | .ds i \&\s-1ISO\s0 |
---|
7 | .ds r \&\s-1RCS\s0 |
---|
8 | .ds u \&\s-1UTC\s0 |
---|
9 | .if n .ds - \%-- |
---|
10 | .if t .ds - \(em |
---|
11 | .TH CI 1 \*(Dt GNU |
---|
12 | .SH NAME |
---|
13 | ci \- check in RCS revisions |
---|
14 | .SH SYNOPSIS |
---|
15 | .B ci |
---|
16 | .RI [ options ] " file " .\|.\|. |
---|
17 | .SH DESCRIPTION |
---|
18 | .B ci |
---|
19 | stores new revisions into \*r files. |
---|
20 | Each pathname matching an \*r suffix |
---|
21 | is taken to be an \*r file. |
---|
22 | All others |
---|
23 | are assumed to be working files containing new revisions. |
---|
24 | .B ci |
---|
25 | deposits the contents of each working file |
---|
26 | into the corresponding \*r file. |
---|
27 | If only a working file is given, |
---|
28 | .B ci |
---|
29 | tries to find the corresponding \*r file in an \*r subdirectory |
---|
30 | and then in the working file's directory. |
---|
31 | For more details, see |
---|
32 | .SM "FILE NAMING" |
---|
33 | below. |
---|
34 | .PP |
---|
35 | For |
---|
36 | .B ci |
---|
37 | to work, the caller's login must be on the access list, |
---|
38 | except if the access list is empty or the caller is the superuser or the |
---|
39 | owner of the file. |
---|
40 | To append a new revision to an existing branch, the tip revision on |
---|
41 | that branch must be locked by the caller. Otherwise, only a |
---|
42 | new branch can be created. This restriction is not enforced |
---|
43 | for the owner of the file if non-strict locking is used |
---|
44 | (see |
---|
45 | .BR rcs (1)). |
---|
46 | A lock held by someone else can be broken with the |
---|
47 | .B rcs |
---|
48 | command. |
---|
49 | .PP |
---|
50 | Unless the |
---|
51 | .B \-f |
---|
52 | option is given, |
---|
53 | .B ci |
---|
54 | checks whether the revision to be deposited differs from the preceding one. |
---|
55 | If not, instead of creating a new revision |
---|
56 | .B ci |
---|
57 | reverts to the preceding one. |
---|
58 | To revert, ordinary |
---|
59 | .B ci |
---|
60 | removes the working file and any lock; |
---|
61 | .B "ci\ \-l" |
---|
62 | keeps and |
---|
63 | .B "ci\ \-u" |
---|
64 | removes any lock, and then they both generate a new working file much as if |
---|
65 | .B "co\ \-l" |
---|
66 | or |
---|
67 | .B "co\ \-u" |
---|
68 | had been applied to the preceding revision. |
---|
69 | When reverting, any |
---|
70 | .B \-n |
---|
71 | and |
---|
72 | .B \-s |
---|
73 | options apply to the preceding revision. |
---|
74 | .PP |
---|
75 | For each revision deposited, |
---|
76 | .B ci |
---|
77 | prompts for a log message. |
---|
78 | The log message should summarize the change and must be terminated by |
---|
79 | end-of-file or by a line containing |
---|
80 | .BR \&. "\ by" |
---|
81 | itself. |
---|
82 | If several files are checked in |
---|
83 | .B ci |
---|
84 | asks whether to reuse the |
---|
85 | previous log message. |
---|
86 | If the standard input is not a terminal, |
---|
87 | .B ci |
---|
88 | suppresses the prompt |
---|
89 | and uses the same log message for all files. |
---|
90 | See also |
---|
91 | .BR \-m . |
---|
92 | .PP |
---|
93 | If the \*r file does not exist, |
---|
94 | .B ci |
---|
95 | creates it and |
---|
96 | deposits the contents of the working file as the initial revision |
---|
97 | (default number: |
---|
98 | .BR 1.1 ). |
---|
99 | The access list is initialized to empty. |
---|
100 | Instead of the log message, |
---|
101 | .B ci |
---|
102 | requests descriptive text (see |
---|
103 | .B \-t |
---|
104 | below). |
---|
105 | .PP |
---|
106 | The number |
---|
107 | .I rev |
---|
108 | of the deposited revision can be given by any of the options |
---|
109 | .BR \-f , |
---|
110 | .BR \-i , |
---|
111 | .BR \-I , |
---|
112 | .BR \-j , |
---|
113 | .BR \-k , |
---|
114 | .BR \-l , |
---|
115 | .BR \-M , |
---|
116 | .BR \-q , |
---|
117 | .BR \-r , |
---|
118 | or |
---|
119 | .BR \-u . |
---|
120 | .I rev |
---|
121 | can be symbolic, numeric, or mixed. |
---|
122 | Symbolic names in |
---|
123 | .I rev |
---|
124 | must already be defined; |
---|
125 | see the |
---|
126 | .B \-n |
---|
127 | and |
---|
128 | .B \-N |
---|
129 | options for assigning names during checkin. |
---|
130 | If |
---|
131 | .I rev |
---|
132 | is |
---|
133 | .BR $ , |
---|
134 | .B ci |
---|
135 | determines the revision number from keyword values in the working file. |
---|
136 | .PP |
---|
137 | If |
---|
138 | .I rev |
---|
139 | begins with a period, |
---|
140 | then the default branch (normally the trunk) is prepended to it. |
---|
141 | If |
---|
142 | .I rev |
---|
143 | is a branch number followed by a period, |
---|
144 | then the latest revision on that branch is used. |
---|
145 | .PP |
---|
146 | If |
---|
147 | .I rev |
---|
148 | is a revision number, it must be higher than the latest |
---|
149 | one on the branch to which |
---|
150 | .I rev |
---|
151 | belongs, or must start a new branch. |
---|
152 | .PP |
---|
153 | If |
---|
154 | .I rev |
---|
155 | is a branch rather than a revision number, |
---|
156 | the new revision is appended to that branch. The level number is obtained |
---|
157 | by incrementing the tip revision number of that branch. |
---|
158 | If |
---|
159 | .I rev |
---|
160 | indicates a non-existing branch, |
---|
161 | that branch is created with the initial revision numbered |
---|
162 | .IB rev .1\f1.\fP |
---|
163 | .br |
---|
164 | .ne 8 |
---|
165 | .PP |
---|
166 | If |
---|
167 | .I rev |
---|
168 | is omitted, |
---|
169 | .B ci |
---|
170 | tries to derive the new revision number from |
---|
171 | the caller's last lock. If the caller has locked the tip revision of a branch, |
---|
172 | the new revision is appended to that branch. |
---|
173 | The new revision number is obtained |
---|
174 | by incrementing the tip revision number. |
---|
175 | If the caller locked a non-tip revision, a new branch is started at |
---|
176 | that revision by incrementing the highest branch number at that revision. |
---|
177 | The default initial branch and level numbers are |
---|
178 | .BR 1 . |
---|
179 | .PP |
---|
180 | If |
---|
181 | .I rev |
---|
182 | is omitted and the caller has no lock, but owns |
---|
183 | the file and locking |
---|
184 | is not set to |
---|
185 | .IR strict , |
---|
186 | then the revision is appended to the |
---|
187 | default branch (normally the trunk; see the |
---|
188 | .B \-b |
---|
189 | option of |
---|
190 | .BR rcs (1)). |
---|
191 | .PP |
---|
192 | Exception: On the trunk, revisions can be appended to the end, but |
---|
193 | not inserted. |
---|
194 | .SH OPTIONS |
---|
195 | .TP |
---|
196 | .BI \-r rev |
---|
197 | Check in revision |
---|
198 | .IR rev . |
---|
199 | .TP |
---|
200 | .BR \-r |
---|
201 | The bare |
---|
202 | .B \-r |
---|
203 | option (without any revision) has an unusual meaning in |
---|
204 | .BR ci . |
---|
205 | With other \*r commands, a bare |
---|
206 | .B \-r |
---|
207 | option specifies the most recent revision on the default branch, |
---|
208 | but with |
---|
209 | .BR ci , |
---|
210 | a bare |
---|
211 | .B \-r |
---|
212 | option reestablishes the default behavior of releasing a lock and |
---|
213 | removing the working file, and is used to override any default |
---|
214 | .B \-l |
---|
215 | or |
---|
216 | .B \-u |
---|
217 | options established by shell aliases or scripts. |
---|
218 | .TP |
---|
219 | .BR \-l [\f2rev\fP] |
---|
220 | works like |
---|
221 | .BR \-r , |
---|
222 | except it performs an additional |
---|
223 | .B "co\ \-l" |
---|
224 | for the |
---|
225 | deposited revision. Thus, the deposited revision is immediately |
---|
226 | checked out again and locked. |
---|
227 | This is useful for saving a revision although one wants to continue |
---|
228 | editing it after the checkin. |
---|
229 | .TP |
---|
230 | .BR \-u [\f2rev\fP] |
---|
231 | works like |
---|
232 | .BR \-l , |
---|
233 | except that the deposited revision is not locked. |
---|
234 | This lets one read the working file |
---|
235 | immediately after checkin. |
---|
236 | .RS |
---|
237 | .PP |
---|
238 | The |
---|
239 | .BR \-l , |
---|
240 | bare |
---|
241 | .BR \-r , |
---|
242 | and |
---|
243 | .B \-u |
---|
244 | options are mutually exclusive and silently override each other. |
---|
245 | For example, |
---|
246 | .B "ci\ \-u\ \-r" |
---|
247 | is equivalent to |
---|
248 | .B "ci\ \-r" |
---|
249 | because bare |
---|
250 | .B \-r |
---|
251 | overrides |
---|
252 | .BR \-u . |
---|
253 | .RE |
---|
254 | .TP |
---|
255 | .BR \-f [\f2rev\fP] |
---|
256 | forces a deposit; the new revision is deposited even it is not different |
---|
257 | from the preceding one. |
---|
258 | .TP |
---|
259 | .BR \-k [\f2rev\fP] |
---|
260 | searches the working file for keyword values to determine its revision number, |
---|
261 | creation date, state, and author (see |
---|
262 | .BR co (1)), |
---|
263 | and assigns these |
---|
264 | values to the deposited revision, rather than computing them locally. |
---|
265 | It also generates a default login message noting the login of the caller |
---|
266 | and the actual checkin date. |
---|
267 | This option is useful for software distribution. A revision that is sent to |
---|
268 | several sites should be checked in with the |
---|
269 | .B \-k |
---|
270 | option at these sites to |
---|
271 | preserve the original number, date, author, and state. |
---|
272 | The extracted keyword values and the default log message can be overridden |
---|
273 | with the options |
---|
274 | .BR \-d , |
---|
275 | .BR \-m , |
---|
276 | .BR \-s , |
---|
277 | .BR \-w , |
---|
278 | and any option that carries a revision number. |
---|
279 | .TP |
---|
280 | .BR \-q [\f2rev\fP] |
---|
281 | quiet mode; diagnostic output is not printed. |
---|
282 | A revision that is not different from the preceding one is not deposited, |
---|
283 | unless |
---|
284 | .B \-f |
---|
285 | is given. |
---|
286 | .TP |
---|
287 | .BR \-i [\f2rev\fP] |
---|
288 | initial checkin; report an error if the \*r file already exists. |
---|
289 | This avoids race conditions in certain applications. |
---|
290 | .TP |
---|
291 | .BR \-j [\f2rev\fP] |
---|
292 | just checkin and do not initialize; |
---|
293 | report an error if the \*r file does not already exist. |
---|
294 | .TP |
---|
295 | .BR \-I [\f2rev\fP] |
---|
296 | interactive mode; |
---|
297 | the user is prompted and questioned |
---|
298 | even if the standard input is not a terminal. |
---|
299 | .TP |
---|
300 | .BR \-d "[\f2date\fP]" |
---|
301 | uses |
---|
302 | .I date |
---|
303 | for the checkin date and time. |
---|
304 | The |
---|
305 | .I date |
---|
306 | is specified in free format as explained in |
---|
307 | .BR co (1). |
---|
308 | This is useful for lying about the checkin date, and for |
---|
309 | .B \-k |
---|
310 | if no date is available. |
---|
311 | If |
---|
312 | .I date |
---|
313 | is empty, the working file's time of last modification is used. |
---|
314 | .TP |
---|
315 | .BR \-M [\f2rev\fP] |
---|
316 | Set the modification time on any new working file |
---|
317 | to be the date of the retrieved revision. |
---|
318 | For example, |
---|
319 | .BI "ci\ \-d\ \-M\ \-u" "\ f" |
---|
320 | does not alter |
---|
321 | .IR f 's |
---|
322 | modification time, even if |
---|
323 | .IR f 's |
---|
324 | contents change due to keyword substitution. |
---|
325 | Use this option with care; it can confuse |
---|
326 | .BR make (1). |
---|
327 | .TP |
---|
328 | .BI \-m "msg" |
---|
329 | uses the string |
---|
330 | .I msg |
---|
331 | as the log message for all revisions checked in. |
---|
332 | By convention, log messages that start with |
---|
333 | .B # |
---|
334 | are comments and are ignored by programs like GNU Emacs's |
---|
335 | .B vc |
---|
336 | package. |
---|
337 | Also, log messages that start with |
---|
338 | .BI { clumpname } |
---|
339 | (followed by white space) are meant to be clumped together if possible, |
---|
340 | even if they are associated with different files; the |
---|
341 | .BI { clumpname } |
---|
342 | label is used only for clumping, |
---|
343 | and is not considered to be part of the log message itself. |
---|
344 | .TP |
---|
345 | .BI \-n "name" |
---|
346 | assigns the symbolic name |
---|
347 | .I name |
---|
348 | to the number of the checked-in revision. |
---|
349 | .B ci |
---|
350 | prints an error message if |
---|
351 | .I name |
---|
352 | is already assigned to another |
---|
353 | number. |
---|
354 | .TP |
---|
355 | .BI \-N "name" |
---|
356 | same as |
---|
357 | .BR \-n , |
---|
358 | except that it overrides a previous assignment of |
---|
359 | .IR name . |
---|
360 | .TP |
---|
361 | .BI \-s "state" |
---|
362 | sets the state of the checked-in revision to the identifier |
---|
363 | .IR state . |
---|
364 | The default state is |
---|
365 | .BR Exp . |
---|
366 | .TP |
---|
367 | .BI \-t file |
---|
368 | writes descriptive text from the contents of the named |
---|
369 | .I file |
---|
370 | into the \*r file, |
---|
371 | deleting the existing text. |
---|
372 | The |
---|
373 | .I file |
---|
374 | cannot begin with |
---|
375 | .BR \- . |
---|
376 | .TP |
---|
377 | .BI \-t\- string |
---|
378 | Write descriptive text from the |
---|
379 | .I string |
---|
380 | into the \*r file, deleting the existing text. |
---|
381 | .RS |
---|
382 | .PP |
---|
383 | The |
---|
384 | .B \-t |
---|
385 | option, in both its forms, has effect only during an initial checkin; |
---|
386 | it is silently ignored otherwise. |
---|
387 | .PP |
---|
388 | During the initial checkin, if |
---|
389 | .B \-t |
---|
390 | is not given, |
---|
391 | .B ci |
---|
392 | obtains the text from standard input, |
---|
393 | terminated by end-of-file or by a line containing |
---|
394 | .BR \&. "\ by" |
---|
395 | itself. |
---|
396 | The user is prompted for the text if interaction is possible; see |
---|
397 | .BR \-I . |
---|
398 | .PP |
---|
399 | For backward compatibility with older versions of \*r, a bare |
---|
400 | .B \-t |
---|
401 | option is ignored. |
---|
402 | .RE |
---|
403 | .TP |
---|
404 | .B \-T |
---|
405 | Set the \*r file's modification time to the new revision's time |
---|
406 | if the former precedes the latter and there is a new revision; |
---|
407 | preserve the \*r file's modification time otherwise. |
---|
408 | If you have locked a revision, |
---|
409 | .B ci |
---|
410 | usually updates the \*r file's modification time to the current time, |
---|
411 | because the lock is stored in the \*r file |
---|
412 | and removing the lock requires changing the \*r file. |
---|
413 | This can create an \*r file newer than the working file in one of two ways: |
---|
414 | first, |
---|
415 | .B "ci\ \-M" |
---|
416 | can create a working file with a date before the current time; |
---|
417 | second, when reverting to the previous revision |
---|
418 | the \*r file can change while the working file remains unchanged. |
---|
419 | These two cases can cause excessive recompilation caused by a |
---|
420 | .BR make (1) |
---|
421 | dependency of the working file on the \*r file. |
---|
422 | The |
---|
423 | .B \-T |
---|
424 | option inhibits this recompilation by lying about the \*r file's date. |
---|
425 | Use this option with care; it can suppress recompilation even when |
---|
426 | a checkin of one working file should affect |
---|
427 | another working file associated with the same \*r file. |
---|
428 | For example, suppose the \*r file's time is 01:00, |
---|
429 | the (changed) working file's time is 02:00, |
---|
430 | some other copy of the working file has a time of 03:00, |
---|
431 | and the current time is 04:00. |
---|
432 | Then |
---|
433 | .B "ci\ \-d\ \-T" |
---|
434 | sets the \*r file's time to 02:00 instead of the usual 04:00; |
---|
435 | this causes |
---|
436 | .BR make (1) |
---|
437 | to think (incorrectly) that the other copy is newer than the \*r file. |
---|
438 | .TP |
---|
439 | .BI \-w "login" |
---|
440 | uses |
---|
441 | .I login |
---|
442 | for the author field of the deposited revision. |
---|
443 | Useful for lying about the author, and for |
---|
444 | .B \-k |
---|
445 | if no author is available. |
---|
446 | .TP |
---|
447 | .BI \-V |
---|
448 | Print \*r's version number. |
---|
449 | .TP |
---|
450 | .BI \-V n |
---|
451 | Emulate \*r version |
---|
452 | .IR n . |
---|
453 | See |
---|
454 | .BR co (1) |
---|
455 | for details. |
---|
456 | .TP |
---|
457 | .BI \-x "suffixes" |
---|
458 | specifies the suffixes for \*r files. |
---|
459 | A nonempty suffix matches any pathname ending in the suffix. |
---|
460 | An empty suffix matches any pathname of the form |
---|
461 | .BI RCS/ path |
---|
462 | or |
---|
463 | .IB path1 /RCS/ path2. |
---|
464 | The |
---|
465 | .B \-x |
---|
466 | option can specify a list of suffixes |
---|
467 | separated by |
---|
468 | .BR / . |
---|
469 | For example, |
---|
470 | .B \-x,v/ |
---|
471 | specifies two suffixes: |
---|
472 | .B ,v |
---|
473 | and the empty suffix. |
---|
474 | If two or more suffixes are specified, |
---|
475 | they are tried in order when looking for an \*r file; |
---|
476 | the first one that works is used for that file. |
---|
477 | If no \*r file is found but an \*r file can be created, |
---|
478 | the suffixes are tried in order |
---|
479 | to determine the new \*r file's name. |
---|
480 | The default for |
---|
481 | .IR suffixes |
---|
482 | is installation-dependent; normally it is |
---|
483 | .B ,v/ |
---|
484 | for hosts like Unix that permit commas in filenames, |
---|
485 | and is empty (i.e. just the empty suffix) for other hosts. |
---|
486 | .TP |
---|
487 | .BI \-z zone |
---|
488 | specifies the date output format in keyword substitution, |
---|
489 | and specifies the default time zone for |
---|
490 | .I date |
---|
491 | in the |
---|
492 | .BI \-d date |
---|
493 | option. |
---|
494 | The |
---|
495 | .I zone |
---|
496 | should be empty, a numeric \*u offset, or the special string |
---|
497 | .B LT |
---|
498 | for local time. |
---|
499 | The default is an empty |
---|
500 | .IR zone , |
---|
501 | which uses the traditional \*r format of \*u without any time zone indication |
---|
502 | and with slashes separating the parts of the date; |
---|
503 | otherwise, times are output in \*i 8601 format with time zone indication. |
---|
504 | For example, if local time is January 11, 1990, 8pm Pacific Standard Time, |
---|
505 | eight hours west of \*u, |
---|
506 | then the time is output as follows: |
---|
507 | .RS |
---|
508 | .LP |
---|
509 | .RS |
---|
510 | .nf |
---|
511 | .ta \w'\f3\-z+05:30\fP 'u +\w'\f31990-01-11 09:30:00+05:30\fP 'u |
---|
512 | .ne 4 |
---|
513 | \f2option\fP \f2time output\fP |
---|
514 | \f3\-z\fP \f31990/01/12 04:00:00\fP \f2(default)\fP |
---|
515 | \f3\-zLT\fP \f31990-01-11 20:00:00\-08\fP |
---|
516 | \f3\-z+05:30\fP \f31990-01-12 09:30:00+05:30\fP |
---|
517 | .ta 4n +4n +4n +4n |
---|
518 | .fi |
---|
519 | .RE |
---|
520 | .LP |
---|
521 | The |
---|
522 | .B \-z |
---|
523 | option does not affect dates stored in \*r files, |
---|
524 | which are always \*u. |
---|
525 | .SH "FILE NAMING" |
---|
526 | Pairs of \*r files and working files can be specified in three ways |
---|
527 | (see also the |
---|
528 | example section). |
---|
529 | .PP |
---|
530 | 1) Both the \*r file and the working file are given. The \*r pathname is of |
---|
531 | the form |
---|
532 | .IB path1 / workfileX |
---|
533 | and the working pathname is of the form |
---|
534 | .IB path2 / workfile |
---|
535 | where |
---|
536 | .IB path1 / |
---|
537 | and |
---|
538 | .IB path2 / |
---|
539 | are (possibly different or empty) paths, |
---|
540 | .I workfile |
---|
541 | is a filename, and |
---|
542 | .I X |
---|
543 | is an \*r suffix. |
---|
544 | If |
---|
545 | .I X |
---|
546 | is empty, |
---|
547 | .IB path1 / |
---|
548 | must start with |
---|
549 | .B RCS/ |
---|
550 | or must contain |
---|
551 | .BR /RCS/ . |
---|
552 | .PP |
---|
553 | 2) Only the \*r file is given. Then the working file is created in the current |
---|
554 | directory and its name is derived from the name of the \*r file |
---|
555 | by removing |
---|
556 | .IB path1 / |
---|
557 | and the suffix |
---|
558 | .IR X . |
---|
559 | .PP |
---|
560 | 3) Only the working file is given. |
---|
561 | Then |
---|
562 | .B ci |
---|
563 | considers each \*r suffix |
---|
564 | .I X |
---|
565 | in turn, looking for an \*r file of the form |
---|
566 | .IB path2 /RCS/ workfileX |
---|
567 | or (if the former is not found and |
---|
568 | .I X |
---|
569 | is nonempty) |
---|
570 | .IB path2 / workfileX. |
---|
571 | .PP |
---|
572 | If the \*r file is specified without a path in 1) and 2), |
---|
573 | .B ci |
---|
574 | looks for the \*r file first in the directory |
---|
575 | .B ./RCS |
---|
576 | and then in the current |
---|
577 | directory. |
---|
578 | .PP |
---|
579 | .B ci |
---|
580 | reports an error if an attempt to open an \*r file fails for an unusual reason, |
---|
581 | even if the \*r file's pathname is just one of several possibilities. |
---|
582 | For example, to suppress use of \*r commands in a directory |
---|
583 | .IR d , |
---|
584 | create a regular file named |
---|
585 | .IB d /RCS |
---|
586 | so that casual attempts to use \*r commands in |
---|
587 | .I d |
---|
588 | fail because |
---|
589 | .IB d /RCS |
---|
590 | is not a directory. |
---|
591 | .SH EXAMPLES |
---|
592 | Suppose |
---|
593 | .B ,v |
---|
594 | is an \*r suffix and the current directory contains a subdirectory |
---|
595 | .B RCS |
---|
596 | with an \*r file |
---|
597 | .BR io.c,v . |
---|
598 | Then each of the following commands check in a copy of |
---|
599 | .B io.c |
---|
600 | into |
---|
601 | .B RCS/io.c,v |
---|
602 | as the latest revision, removing |
---|
603 | .BR io.c . |
---|
604 | .LP |
---|
605 | .RS |
---|
606 | .nf |
---|
607 | .ft 3 |
---|
608 | ci io.c; ci RCS/io.c,v; ci io.c,v; |
---|
609 | ci io.c RCS/io.c,v; ci io.c io.c,v; |
---|
610 | ci RCS/io.c,v io.c; ci io.c,v io.c; |
---|
611 | .ft |
---|
612 | .fi |
---|
613 | .RE |
---|
614 | .PP |
---|
615 | Suppose instead that the empty suffix |
---|
616 | is an \*r suffix and the current directory contains a subdirectory |
---|
617 | .B RCS |
---|
618 | with an \*r file |
---|
619 | .BR io.c . |
---|
620 | The each of the following commands checks in a new revision. |
---|
621 | .LP |
---|
622 | .RS |
---|
623 | .nf |
---|
624 | .ft 3 |
---|
625 | ci io.c; ci RCS/io.c; |
---|
626 | ci io.c RCS/io.c; |
---|
627 | ci RCS/io.c io.c; |
---|
628 | .ft |
---|
629 | .fi |
---|
630 | .RE |
---|
631 | .SH "FILE MODES" |
---|
632 | An \*r file created by |
---|
633 | .B ci |
---|
634 | inherits the read and execute permissions |
---|
635 | from the working file. If the \*r file exists already, |
---|
636 | .B ci |
---|
637 | preserves its read and execute permissions. |
---|
638 | .B ci |
---|
639 | always turns off all write permissions of \*r files. |
---|
640 | .SH FILES |
---|
641 | Temporary files are created in the directory containing |
---|
642 | the working file, and also in the temporary directory (see |
---|
643 | .B \s-1TMPDIR\s0 |
---|
644 | under |
---|
645 | .BR \s-1ENVIRONMENT\s0 ). |
---|
646 | A semaphore file or files are created in the directory containing the \*r file. |
---|
647 | With a nonempty suffix, the semaphore names begin with |
---|
648 | the first character of the suffix; therefore, do not specify an suffix |
---|
649 | whose first character could be that of a working filename. |
---|
650 | With an empty suffix, the semaphore names end with |
---|
651 | .B _ |
---|
652 | so working filenames should not end in |
---|
653 | .BR _ . |
---|
654 | .PP |
---|
655 | .B ci |
---|
656 | never changes an \*r or working file. |
---|
657 | Normally, |
---|
658 | .B ci |
---|
659 | unlinks the file and creates a new one; |
---|
660 | but instead of breaking a chain of one or more symbolic links to an \*r file, |
---|
661 | it unlinks the destination file instead. |
---|
662 | Therefore, |
---|
663 | .B ci |
---|
664 | breaks any hard or symbolic links to any working file it changes; |
---|
665 | and hard links to \*r files are ineffective, |
---|
666 | but symbolic links to \*r files are preserved. |
---|
667 | .PP |
---|
668 | The effective user must be able to |
---|
669 | search and write the directory containing the \*r file. |
---|
670 | Normally, the real user must be able to |
---|
671 | read the \*r and working files |
---|
672 | and to search and write the directory containing the working file; |
---|
673 | however, some older hosts |
---|
674 | cannot easily switch between real and effective users, |
---|
675 | so on these hosts the effective user is used for all accesses. |
---|
676 | The effective user is the same as the real user |
---|
677 | unless your copies of |
---|
678 | .B ci |
---|
679 | and |
---|
680 | .B co |
---|
681 | have setuid privileges. |
---|
682 | As described in the next section, |
---|
683 | these privileges yield extra security if |
---|
684 | the effective user owns all \*r files and directories, |
---|
685 | and if only the effective user can write \*r directories. |
---|
686 | .PP |
---|
687 | Users can control access to \*r files by setting the permissions |
---|
688 | of the directory containing the files; only users with write access |
---|
689 | to the directory can use \*r commands to change its \*r files. |
---|
690 | For example, in hosts that allow a user to belong to several groups, |
---|
691 | one can make a group's \*r directories writable to that group only. |
---|
692 | This approach suffices for informal projects, |
---|
693 | but it means that any group member can arbitrarily change the group's \*r files, |
---|
694 | and can even remove them entirely. |
---|
695 | Hence more formal projects sometimes distinguish between an \*r administrator, |
---|
696 | who can change the \*r files at will, and other project members, |
---|
697 | who can check in new revisions but cannot otherwise change the \*r files. |
---|
698 | .SH "SETUID USE" |
---|
699 | To prevent anybody but their \*r administrator from deleting revisions, |
---|
700 | a set of users can employ setuid privileges as follows. |
---|
701 | .nr n \w'\(bu'+2n-1/1n |
---|
702 | .ds n \nn |
---|
703 | .if \n(.g .if r an-tag-sep .ds n \w'\(bu'u+\n[an-tag-sep]u |
---|
704 | .IP \(bu \*n |
---|
705 | Check that the host supports \*r setuid use. |
---|
706 | Consult a trustworthy expert if there are any doubts. |
---|
707 | It is best if the |
---|
708 | .B seteuid |
---|
709 | system call works as described in Posix 1003.1a Draft 5, |
---|
710 | because \*r can switch back and forth easily |
---|
711 | between real and effective users, even if the real user is |
---|
712 | .BR root . |
---|
713 | If not, the second best is if the |
---|
714 | .B setuid |
---|
715 | system call supports saved setuid |
---|
716 | (the {\s-1_POSIX_SAVED_IDS\s0} behavior of Posix 1003.1-1990); |
---|
717 | this fails only if the real or effective user is |
---|
718 | .BR root . |
---|
719 | If \*r detects any failure in setuid, it quits immediately. |
---|
720 | .IP \(bu \nn |
---|
721 | Choose a user |
---|
722 | .I A |
---|
723 | to serve as \*r administrator for the set of users. |
---|
724 | Only |
---|
725 | .I A |
---|
726 | can invoke the |
---|
727 | .B rcs |
---|
728 | command on the users' \*r files. |
---|
729 | .I A |
---|
730 | should not be |
---|
731 | .B root |
---|
732 | or any other user with special powers. |
---|
733 | Mutually suspicious sets of users should use different administrators. |
---|
734 | .IP \(bu \nn |
---|
735 | Choose a pathname |
---|
736 | .I B |
---|
737 | to be a directory of files to be executed by the users. |
---|
738 | .IP \(bu \nn |
---|
739 | Have |
---|
740 | .I A |
---|
741 | set up |
---|
742 | .I B |
---|
743 | to contain copies of |
---|
744 | .B ci |
---|
745 | and |
---|
746 | .B co |
---|
747 | that are setuid to |
---|
748 | .I A |
---|
749 | by copying the commands from their standard installation directory |
---|
750 | .I D |
---|
751 | as follows: |
---|
752 | .LP |
---|
753 | .RS |
---|
754 | .nf |
---|
755 | .ne 3 |
---|
756 | \f3mkdir\fP \f2B\fP |
---|
757 | \f3cp\fP \f2D\fP\^\f3/c[io]\fP \f2B\fP |
---|
758 | \f3chmod go\-w,u+s\fP \f2B\fP\f3/c[io]\fP |
---|
759 | .fi |
---|
760 | .RE |
---|
761 | .IP \(bu \nn |
---|
762 | Have each user prepend |
---|
763 | .I B |
---|
764 | to their path as follows: |
---|
765 | .LP |
---|
766 | .RS |
---|
767 | .nf |
---|
768 | .ne 2 |
---|
769 | \f3PATH=\fP\f2B\fP\f3:$PATH; export PATH\fP # ordinary shell |
---|
770 | \f3set path=(\fP\f2B\fP \f3$path)\fP # C shell |
---|
771 | .fi |
---|
772 | .RE |
---|
773 | .IP \(bu \nn |
---|
774 | Have |
---|
775 | .I A |
---|
776 | create each \*r directory |
---|
777 | .I R |
---|
778 | with write access only to |
---|
779 | .I A |
---|
780 | as follows: |
---|
781 | .LP |
---|
782 | .RS |
---|
783 | .nf |
---|
784 | .ne 2 |
---|
785 | \f3mkdir\fP \f2R\fP |
---|
786 | \f3chmod go\-w\fP \f2R\fP |
---|
787 | .fi |
---|
788 | .RE |
---|
789 | .IP \(bu \nn |
---|
790 | If you want to let only certain users read the \*r files, |
---|
791 | put the users into a group |
---|
792 | .IR G , |
---|
793 | and have |
---|
794 | .I A |
---|
795 | further protect the \*r directory as follows: |
---|
796 | .LP |
---|
797 | .RS |
---|
798 | .nf |
---|
799 | .ne 2 |
---|
800 | \f3chgrp\fP \f2G R\fP |
---|
801 | \f3chmod g\-w,o\-rwx\fP \f2R\fP |
---|
802 | .fi |
---|
803 | .RE |
---|
804 | .IP \(bu \nn |
---|
805 | Have |
---|
806 | .I A |
---|
807 | copy old \*r files (if any) into |
---|
808 | .IR R , |
---|
809 | to ensure that |
---|
810 | .I A |
---|
811 | owns them. |
---|
812 | .IP \(bu \nn |
---|
813 | An \*r file's access list limits who can check in and lock revisions. |
---|
814 | The default access list is empty, |
---|
815 | which grants checkin access to anyone who can read the \*r file. |
---|
816 | If you want limit checkin access, |
---|
817 | have |
---|
818 | .I A |
---|
819 | invoke |
---|
820 | .B "rcs\ \-a" |
---|
821 | on the file; see |
---|
822 | .BR rcs (1). |
---|
823 | In particular, |
---|
824 | .BI "rcs\ \-e\ \-a" A |
---|
825 | limits access to just |
---|
826 | .IR A . |
---|
827 | .IP \(bu \nn |
---|
828 | Have |
---|
829 | .I A |
---|
830 | initialize any new \*r files with |
---|
831 | .B "rcs\ \-i" |
---|
832 | before initial checkin, adding the |
---|
833 | .B \-a |
---|
834 | option if you want to limit checkin access. |
---|
835 | .IP \(bu \nn |
---|
836 | Give setuid privileges only to |
---|
837 | .BR ci , |
---|
838 | .BR co , |
---|
839 | and |
---|
840 | .BR rcsclean ; |
---|
841 | do not give them to |
---|
842 | .B rcs |
---|
843 | or to any other command. |
---|
844 | .IP \(bu \nn |
---|
845 | Do not use other setuid commands to invoke \*r commands; |
---|
846 | setuid is trickier than you think! |
---|
847 | .SH ENVIRONMENT |
---|
848 | .TP |
---|
849 | .B \s-1RCSINIT\s0 |
---|
850 | options prepended to the argument list, separated by spaces. |
---|
851 | A backslash escapes spaces within an option. |
---|
852 | The |
---|
853 | .B \s-1RCSINIT\s0 |
---|
854 | options are prepended to the argument lists of most \*r commands. |
---|
855 | Useful |
---|
856 | .B \s-1RCSINIT\s0 |
---|
857 | options include |
---|
858 | .BR \-q , |
---|
859 | .BR \-V , |
---|
860 | .BR \-x , |
---|
861 | and |
---|
862 | .BR \-z . |
---|
863 | .TP |
---|
864 | .B \s-1TMPDIR\s0 |
---|
865 | Name of the temporary directory. |
---|
866 | If not set, the environment variables |
---|
867 | .B \s-1TMP\s0 |
---|
868 | and |
---|
869 | .B \s-1TEMP\s0 |
---|
870 | are inspected instead and the first value found is taken; |
---|
871 | if none of them are set, |
---|
872 | a host-dependent default is used, typically |
---|
873 | .BR /tmp . |
---|
874 | .SH DIAGNOSTICS |
---|
875 | For each revision, |
---|
876 | .B ci |
---|
877 | prints the \*r file, the working file, and the number |
---|
878 | of both the deposited and the preceding revision. |
---|
879 | The exit status is zero if and only if all operations were successful. |
---|
880 | .SH IDENTIFICATION |
---|
881 | Author: Walter F. Tichy. |
---|
882 | .br |
---|
883 | Manual Page Revision: \*(Rv; Release Date: \*(Dt. |
---|
884 | .br |
---|
885 | Copyright \(co 1982, 1988, 1989 Walter F. Tichy. |
---|
886 | .br |
---|
887 | Copyright \(co 1990, 1991, 1992, 1993, 1994, 1995 Paul Eggert. |
---|
888 | .SH "SEE ALSO" |
---|
889 | co(1), |
---|
890 | emacs(1), |
---|
891 | ident(1), make(1), rcs(1), rcsclean(1), rcsdiff(1), |
---|
892 | rcsintro(1), rcsmerge(1), rlog(1), setuid(2), rcsfile(5) |
---|
893 | .br |
---|
894 | Walter F. Tichy, |
---|
895 | \*r\*-A System for Version Control, |
---|
896 | .I "Software\*-Practice & Experience" |
---|
897 | .BR 15 , |
---|
898 | 7 (July 1985), 637-654. |
---|
899 | .br |
---|