CVS2CL(1)

πŸ“¦
version 2.73 Β· 2 versions
, in fedora 43

✨ CVS2CL(1) β€” cvs2cl, aka the cvs-log-message-to-ChangeLog conversion script ✨

okay bestie, buckle up, we're talking about cvs2cl from section 1 of the manual πŸ’…

πŸ¦‹ NAME πŸ¦‹

cvs2cl β€” convert cvs log messages to changelogs. that's it, that's the girl πŸŽ€


🌸 SYNOPSIS 🌸

cvs2cl [options] [FILE1 [FILE2 ...]]

πŸ’– DESCRIPTION πŸ’–

cvs2cl makes a GNU-style ChangeLog for your CVS-controlled sources by literally running cvs log and parsing whatever comes back. duplicate log messages get unified the Right Way, no cap 🫢

the default output is designed to be compact and formally unambiguous, but still easy for actual humans to read. it's giving self-explanatory, mostly. the one abbreviation that might trip you up is utags β€” that stands for "universal tags", and a universal tag is one held by all the files in a given change entry. iconic behavior tbh ⭐

if you need output that's easy for a program to parse, use the --xml option. heads up tho: with XML output, just about all available information gets included with each change entry, whether you asked for it or not β€” the theory being your parser can just ignore anything it's not looking for. main character energy from the XML, honestly πŸ’€

if filenames are given as arguments, cvs2cl only shows log information for the named files. simple as πŸ“


πŸ‘‘ OPTIONS πŸ‘‘

  • -h, -help, --help, -? β€” show a short help and dip out.
  • --version β€” show version and exit.
  • -r, --revisions β€” show revision numbers in the output.
  • -b, --branches β€” show branch names in revisions when possible.
  • -t, --tags β€” show tags (symbolic names) in the output.
  • -T, --tagdates β€” show tags in output on their first occurance.
  • --show-dead β€” show dead files πŸ’€
  • --stdin β€” read from stdin, don't run cvs log.
  • --stdout β€” output to stdout, not to ChangeLog.
  • -d, --distributed β€” put ChangeLogs in subdirs.
  • -f FILE, --file FILE β€” write to FILE instead of ChangeLog.
  • --fsf β€” use this if your log data is in FSF ChangeLog style.
  • --FSF β€” attempt strict FSF-standard compatible output (incompatible with --accum).
  • -W SECS, --window SECS β€” window of time within which log entries unify.
  • -U UFILE, --usermap UFILE β€” expand usernames to email addresses from UFILE.
  • --passwd PASSWORDFILE β€” use the 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 DOMAIN β€” domain to build email addresses from.
  • --gecos β€” get user information from GECOS data.
  • -R REGEXP, --regexp REGEXP β€” include only entries that match REGEXP. this option may be used multiple times.
  • -I REGEXP, --ignore REGEXP β€” 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.
  • -C, --case-insensitive β€” any regexp matching is done case-insensitively.
  • -F BRANCH, --follow BRANCH β€” show only revisions on or ancestral to BRANCH.
  • --follow-only BRANCH β€” like --follow, but sub-branches are not followed.
  • --no-ancestors β€” when using -F, only track changes since the BRANCH started.
  • --no-hide-branch-additions β€” 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.
  • -S, --separate-header β€” blank line between each header and log message.
  • --group-within-date β€” group ChangeLog entries on the same date together, instead of having a separate entry for each commit on that date.
  • --summary β€” add CVS change summary information.
  • --no-wrap β€” don't auto-wrap log message (recommend -S also).
  • --no-indent β€” don't indent log message
  • --gmt, --utc β€” show times in GMT/UTC instead of local time.
  • --accum β€” add to an existing ChangeLog (incompatible with --xml and --FSF).
  • -w, --day-of-week β€” show day of week.
  • --no-times β€” don't show times in output.
  • --chrono β€” output log in chronological order (default is reverse chronological order).
  • --header FILE β€” get ChangeLog header from FILE ("-" means stdin).
  • --xml β€” output XML instead of ChangeLog format (incompatible with --accum).
  • --xml-encoding ENCODING β€” insert encoding clause in XML header.
  • --xml-stylesheet FILE β€” insert xml-stylesheet processing instruction with FILE formatting stylesheet file path in XML header.
  • --noxmlns β€” don't include xmlns= attribute in root element.
  • --hide-filenames β€” don't show filenames (ignored for XML output).
  • --no-common-dir β€” don't shorten directory names from filenames.
  • --rcs CVSROOT β€” handle filenames from raw RCS, for instance those produced by cvs rlog output, stripping the prefix CVSROOT.
  • -P, --prune β€” don't show empty log messages.
  • --lines-modified β€” 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-tag TAG β€” ignore individual changes that are associated with a given tag. may be repeated, and if so, changes that are associated with any of the given tags are ignored.
  • --show-tag TAG β€” log only individual changes that are associated with a given tag. may be repeated, and if so, changes that are associated with any of the given tags are logged.
  • --delta FROM_TAG:TO_TAG β€” 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. 🫠
  • -g OPTS, --global-opts OPTS β€” pass OPTS to cvs like in cvs OPTS log ....
  • -l OPTS, --log-opts OPTS β€” pass OPTS to cvs log like in cvs ... log OPTS.

🧚 Notes about the options and arguments 🧚

  • the -I and -F options may appear multiple times.
  • to follow trunk revisions, use -F trunk (-F TRUNK also works). this is okay because no one would ever, ever be crazy enough to name a branch trunk, right? Right. πŸ™ˆ
  • for the -U option, the UFILE should be formatted like CVSROOT/users. that is, each line of UFILE looks like this:
jrandom:jrandom@red-bean.com

or maybe even like this

jrandom:'Jesse Q. Random <jrandom@red-bean.com>'

don't forget to quote the portion after the colon if necessary.

  • many people want to filter by date. to do so, invoke cvs2cl like this:
cvs2cl -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).

  • dates/times are interpreted in the local time zone.
  • remember to quote the argument to -l so that your shell doesn't interpret spaces as argument separators.
  • see the 'Common Options' section of the cvs manual (info cvs on UNIX-like systems) for more information.
  • note that the rules for quoting under windows shells are different.
  • to run in an automated environment such as CGI or PHP, suidperl may be needed in order to execute as the correct user to enable /cvsroot read lock files to be written for the cvs log command. this is likely just a case of changing the /usr/bin/perl command to /usr/bin/suidperl, and explicitly declaring the PATH variable.

πŸ”₯ EXAMPLES πŸ”₯

some examples (working on UNIX shells):

# logs after 6th March, 2003 (inclusive)
cvs2cl -l "-d'>2003-03-06'"
# logs after 4:34PM 6th March, 2003 (inclusive)
cvs2cl -l "-d'>2003-03-06 16:34'"
# logs between 4:46PM 6th March, 2003 (exclusive) and
# 4:34PM 6th March, 2003 (inclusive)
cvs2cl -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 -l  "-d"">2003-10-18;today<"""

πŸ’œ AUTHORS πŸ’œ

  • Karl Fogel
  • Melissa O'Neill
  • Martyn J. Pearce

contributions from:

  • Mike Ayers
  • Tim Bradshaw
  • Richard Broberg
  • Nathan Bryant
  • Oswald Buddenhagen
  • Neil Conway
  • Arthur de Jong
  • Mark W. Eichin
  • Dave Elcock
  • Reid Ellis
  • Simon Josefsson
  • Robin Hugh Johnson
  • Terry Kane
  • Pete Kempf
  • Akos Kiss
  • Claus Klein
  • Eddie Kohler
  • Richard Laager
  • Kevin Lilly
  • Karl-Heinz Marbaise
  • Mitsuaki Masuhara
  • Henrik Nordstrom
  • Joe Orton
  • Peter Palfrader
  • Thomas Parmelan
  • Jordan Russell
  • Jacek Sliwerski
  • Johannes Stezenbach
  • Joseph Walton
  • Ernie Zapata

πŸ’€ BUGS πŸ’€

please report bugs to "cvs2cl-reports {_AT_} red-bean.com". 🫢

🌈 PREREQUISITES 🌈

this script requires "Text::Wrap", "Time::Local", and "File::Basename". it also seems to require "Perl 5.004_04" or higher.

πŸ¦‹ OPERATING SYSTEM COMPATIBILITY πŸ¦‹

should work on any OS. no gatekeeping ✨

πŸŽ€ SCRIPT CATEGORIES πŸŽ€

Version_Control/CVS

(C) 2001,2002,2003,2004 Martyn J. Pearce, under the GNU GPL.

(C) 1999 Karl Fogel, under the GNU GPL.

cvs2cl 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 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; see the file COPYING. if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.

⭐ SEE ALSO ⭐

cvs(1)


and that's the whole page bestie, version 2.73 dated 2025-07-23 β€” go forth and make ChangeLogs, you absolute legend πŸ«ΆπŸ’…βœ¨

πŸ“¦ where this page comes from