Where The Streets Have No Name

CVS keyword 본문

Developement/형상관리

CVS keyword

highheat 2007. 10. 24. 09:45
출처 : http://blog.naver.com/sttng/140016519455

화일에다 삽입하면 자동으로 정보를 갱신해준단다.

Keyword substitution

As long as you edit source files inside your working copy of a module you can always find out the state of your files via `cvs status' and `cvs log'. But as soon as you export the files from your development environment it becomes harder to identify which revisions they are.

CVS can use a mechanism known as keyword substitution (or keyword expansion) to help identifying the files. Embedded strings of the form $keyword$ and $keyword:...$ in a file are replaced with strings of the form $keyword:value$ whenever you obtain a new revision of the file.

Keyword List

This is a list of the keywords:

$Author$
The login name of the user who checked in the revision.
$Date$
The date and time (UTC) the revision was checked in.
$Header$
A standard header containing the full pathname of the RCSfile, the revision number, the date (UTC), the author, the state, andthe locker (if locked). Files will normally never be locked when youuse CVS.
$Id$
Same as $Header$, except that the RCS filename is without a path.
$Name$
Tag name used to check out this file.
$Locker$
The login name of the user who locked the revision (empty ifnot locked, and thus almost always useless when you are using CVS).
$Log$
The log message supplied during commit, preceded by a headercontaining the RCS filename, the revision number, the author, and thedate (UTC). Existing log messages are not replaced. Instead, the new log message is inserted after $Log:...$. Each new line is prefixed with the same string which precedes the $Log keyword. For example, if the file contains
  /* Here is what people have been up to:
*
* $Log: frob.c,v $
* Revision 1.1 1997/01/03 14:23:51 joe
* Add the superfrobnicate option
*
*/
then additional lines which are added when expanding the $Log keyword will be preceded by ` * '. Unlike previous versions of CVS and RCS, the comment leader from the RCS file is not used. The $Logkeyword is useful for accumulating a complete change log in a sourcefile, but for several reasons it can be problematic. See section Problems with the $Log$ keyword..
$RCSfile$
The name of the RCS file without a path.
$Revision$
The revision number assigned to the revision.
$Source$
The full pathname of the RCS file.
$State$
The state assigned to the revision. States can be assigned with cvs admin -s---see section admin options.

Using keywords

To include a keyword string you simply include the relevant text string, such as $Id$, inside the file, and commit the file. CVS will automatically expand the string as part of the commit operation.

It is common to embed the $Id$string in the source files so that it gets passed through to generatedfiles. For example, if you are managing computer program source code,you might include a variable which is initialized to contain thatstring. Or some C compilers may provide a #pragma ident directive. Or a document management system might provide a way to pass a string through to generated files.

The identcommand (which is part of the RCS package) can be used to extractkeywords and their values from a file. This can be handy for textfiles, but it is even more useful for extracting keywords from binaryfiles.

$ ident samp.c
samp.c:
$Id: samp.c,v 1.5 1993/10/19 14:57:32 ceder Exp $
$ gcc samp.c
$ ident a.out
a.out:
$Id: samp.c,v 1.5 1993/10/19 14:57:32 ceder Exp $

SCCS is another popular revision control system. It has a command, what, which is very similar to ident and used for the same purpose. Many sites without RCS have SCCS. Since what looks for the character sequence @(#)it is easy to include keywords that are detected by either command.Simply prefix the RCS keyword with the magic SCCS phrase, like this:

static char *id="@(#) $Id: ab.c,v 1.5 1993/10/19 14:57:32 ceder Exp $";

Avoiding substitution

Keyword substitution has its disadvantages. Sometimes you might want the literal text string `$'Author$ to appear inside a file without CVS interpreting it as a keyword and expanding it into something like `$'Author: ceder $.

There is unfortunately no way to selectively turn off keyword substitution. You can use `-ko' (see section Substitution modes) to turn off keyword substitution entirely.

In many cases you can avoid using keywords in the source, eventhough they appear in the final product. For example, the source forthis manual contains `$@asis{}Author$' whenever the text `$'Author$ should appear. In nroff and troff you can embed the null-character \& inside the keyword for a similar effect.

Substitution modes

Each file has a stored default substitution mode, and each workingdirectory copy of a file also has a substitution mode. The former isset by the `-k' option to cvs add and cvs admin; the latter is set by the `-k' or `-A' options to cvs checkout or cvs update. cvs diff also has a `-k' option. For some examples, see section Handling binary files.

The modes available are:

`-kkv'
Generate keyword strings using the default form, e.g. $Revision: 5.7 $ for the Revision keyword.
`-kkvl'
Like `-kkv', except thata locker's name is always inserted if the given revision is currentlylocked. This option is normally not useful when CVS is used.
`-kk'
Generate only keyword names in keyword strings; omit their values. For example, for the Revision keyword, generate the string $Revision$ instead of $Revision:5.7 $. This option is useful to ignore differences due to keywordsubstitution when comparing different revisions of a file.
`-ko'
Generate the old keyword string, present in the working file just before it was checked in. For example, for the Revision keyword, generate the string $Revision: 1.1 $ instead of $Revision: 5.7 $ if that is how the string appeared when the file was checked in.
`-kb'
Like `-ko', but alsoinhibit conversion of line endings between the canonical form in whichthey are stored in the repository (linefeed only), and the formappropriate to the operating system in use on the client. For systems,like unix, which use linefeed only to terminate lines, this is the sameas `-ko'. For more information on binary files, see section Handling binary files.
`-kv'
Generate only keyword values for keyword strings. For example, for the Revision keyword, generate the string 5.7 instead of $Revision: 5.7 $. This can help generate files in programming languages where it is hard to strip keyword delimiters like $Revision:$ from a string. However, further keyword substitution cannot beperformed once the keyword names are removed, so this option should beused with care. One often would like to use `-kv' with cvs export---see section export--Export sources from CVS, similar to checkout. But be aware that doesn't handle an export containing binary files correctly.

Problems with the $Log$ keyword.

The $Log$ keyword is somewhatcontroversial. As long as you are working on your development systemthe information is easily accessible even if you do not use the $Log$ keyword--just do a cvs log. Once you export the file the history information might be useless anyhow.

A more serious concern is that CVS is not good at handling $Log$ entries when a branch is merged onto the main trunk. Conflicts often result from the merging operation.

People also tend to "fix" the log entries in the file (correctingspelling mistakes and maybe even factual errors). If that is done theinformation from cvs log will not be consistent with the information inside the file. This may or may not be a problem in real life.

It has been suggested that the $Log$ keyword should be inserted lastin the file, and not in the files header, if it is to be used at all.That way the long list of change messages will not interfere witheveryday source file browsing.