cvs2cl.pl - convert cvs log messages to changelogs
cvs2cl [options] [FILE1 [FILE2 ...]]
cvs2cl produces a GNU-style ChangeLog for CVS-controlled sources by running "cvs log" and parsing the output. Duplicate log messages get unified in the Right Way.
The default output of cvs2cl is designed to be compact, formally unambiguous, but still easy for humans to read. It should be largely self-explanatory; the one abbreviation that might not be obvious is "utags". That stands for "universal tags" -- a universal tag is one held by all the files in a given change entry.
If you need output that's easy for a program to parse, use the --xml option. Note that with XML output, just about all available information is included with each change entry, whether you asked for it or not, on the theory that your parser can ignore anything it's not looking for.
If filenames are given as arguments cvs2cl only shows log information for the named files.
Show a short help and exit.
Show version and exit.
Show revision numbers in output.
Show branch names in revisions when possible.
Show tags (symbolic names) in output.
Show tags in output on their first occurance.
Show dead files.
Read from stdin, don't run cvs log.
Output to stdout not to ChangeLog.
Put ChangeLogs in subdirs.
Write to FILE instead of ChangeLog.
Use this if log data is in FSF ChangeLog style.
Attempt strict FSF-standard compatible output (incompatible with --accum).
Window of time within which log entries unify.
Expand usernames to email addresses from UFILE.
Use system passwd file for user name expansion. If no mail domain is provided (via --domain), it tries to read one from /etc/mailname, output of hostname -d, dnsdomainname, or domain-name. cvs2cl exits with an error if none of those options is successful. Use a domain of '' to prevent the addition of a mail domain.
Domain to build email addresses from.
Get user information from GECOS data.
Include only entries that match REGEXP. This option may be used multiple times.
Ignore files whose names match REGEXP. This option may be used multiple times. The regexp is a perl regular expression. It is matched as is; you may want to prefix with a ^ or suffix with a $ to anchor the match.
Any regexp matching is done case-insensitively.
Show only revisions on or ancestral to BRANCH.
Like --follow, but sub-branches are not followed.
When using -F, only track changes since the BRANCH started.
By default, entries generated by cvs for a file added on a branch (a dead 1.1 entry) are not shown. This flag reverses that action.
Blank line between each header and log message.
Group ChangeLog entries on the same date together, instead of having a separate entry for each commit on that date.
Add CVS change summary information.
Don't auto-wrap log message (recommend -S also).
Don't indent log message
Show times in GMT/UTC instead of local time.
Add to an existing ChangeLog (incompatible with --xml and --FSF).
Show day of week.
Don't show times in output.
Output log in chronological order (default is reverse chronological order).
Get ChangeLog header from FILE ("-" means stdin).
Output XML instead of ChangeLog format (incompatible with --accum).
Insert encoding clause in XML header.
Don't include xmlns= attribute in root element.
Don't show filenames (ignored for XML output).
Don't shorten directory names from filenames.
Handle filenames from raw RCS, for instance those produced by "cvs rlog" output, stripping the prefix CVSROOT.
Don't show empty log messages.
Output the number of lines added and the number of lines removed for each checkin (if applicable). At the moment, this only affects the XML output mode.
Ignore individual changes that are associated with a given tag. May be repeated, if so, changes that are associated with any of the given tags are ignored.
Log only individual changes that are associated with a given tag. May be repeated, if so, changes that are associated with any of the given tags are logged.
Attempt a delta between two tags (since FROM_TAG up to and including TO_TAG). The algorithm is a simple date-based one (this is a hard problem) so results are imperfect.
Pass OPTS to cvs like in "cvs OPTS log ...".
Pass OPTS to cvs log like in "cvs ... log OPTS".
Notes about the options and arguments:
or maybe even like this
jrandom:'Jesse Q. Random <firstname.lastname@example.org>'
Don't forget to quote the portion after the colon if necessary.
cvs2cl.pl -l "-d'DATESPEC'"
where DATESPEC is any date specification valid for "cvs log -d". (Note that CVS 1.10.7 and below requires there be no space between -d and its argument).
Some examples (working on UNIX shells):
# logs after 6th March, 2003 (inclusive) cvs2cl.pl -l "-d'>2003-03-06'" # logs after 4:34PM 6th March, 2003 (inclusive) cvs2cl.pl -l "-d'>2003-03-06 16:34'" # logs between 4:46PM 6th March, 2003 (exclusive) and # 4:34PM 6th March, 2003 (inclusive) cvs2cl.pl -l "-d'2003-03-06 16:46>2003-03-06 16:34'"
Some examples (on non-UNIX shells):
# Reported to work on windows xp/2000 cvs2cl.pl -l "-d"">2003-10-18;today<"""
Please report bugs to
This script requires
File::Basename. It also seems to require
Perl 5.004_04 or higher.
Should work on any OS.
(C) 2001,2002,2003,2004 Martyn J. Pearce <email@example.com>, under the GNU GPL.
(C) 1999 Karl Fogel <firstname.lastname@example.org>, under the GNU GPL.
cvs2cl.pl is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version.
cvs2cl.pl is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You may have received a copy of the GNU General Public License along with cvs2cl.pl; see the file COPYING. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.