.\" Automatically generated by Pod::Man 4.07 (Pod::Simple 3.32) .\" .\" Standard preamble: .\" ======================================================================== .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Vb \" Begin verbatim text .ft CW .nf .ne \\$1 .. .de Ve \" End verbatim text .ft R .fi .. .\" Set up some character translations and predefined strings. \*(-- will .\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left .\" double quote, and \*(R" will give a right double quote. \*(C+ will .\" give a nicer C++. Capital omega is used to do unbreakable dashes and .\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff, .\" nothing in troff, for use with C<>. .tr \(*W- .ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' .ie n \{\ . ds -- \(*W- . ds PI pi . if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch . if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch . ds L" "" . ds R" "" . ds C` "" . ds C' "" 'br\} .el\{\ . ds -- \|\(em\| . ds PI \(*p . ds L" `` . ds R" '' . ds C` . ds C' 'br\} .\" .\" Escape single quotes in literal strings from groff's Unicode transform. .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" .\" If the F register is >0, we'll generate index entries on stderr for .\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index .\" entries marked with X<> in POD. Of course, you'll have to process the .\" output yourself in some meaningful fashion. .\" .\" Avoid warning from groff about undefined register 'F'. .de IX .. .if !\nF .nr F 0 .if \nF>0 \{\ . de IX . tm Index:\\$1\t\\n%\t"\\$2" .. . if !\nF==2 \{\ . nr % 0 . nr F 2 . \} .\} .\" .\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2). .\" Fear. Run. Save yourself. No user-serviceable parts. . \" fudge factors for nroff and troff .if n \{\ . ds #H 0 . ds #V .8m . ds #F .3m . ds #[ \f1 . ds #] \fP .\} .if t \{\ . ds #H ((1u-(\\\\n(.fu%2u))*.13m) . ds #V .6m . ds #F 0 . ds #[ \& . ds #] \& .\} . \" simple accents for nroff and troff .if n \{\ . ds ' \& . ds ` \& . ds ^ \& . ds , \& . ds ~ ~ . ds / .\} .if t \{\ . ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" . ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' . ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' . ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' . ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' . ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' .\} . \" troff and (daisy-wheel) nroff accents .ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V' .ds 8 \h'\*(#H'\(*b\h'-\*(#H' .ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#] .ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H' .ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u' .ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#] .ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#] .ds ae a\h'-(\w'a'u*4/10)'e .ds Ae A\h'-(\w'A'u*4/10)'E . \" corrections for vroff .if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u' .if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u' . \" for low resolution devices (crt and lpr) .if \n(.H>23 .if \n(.V>19 \ \{\ . ds : e . ds 8 ss . ds o a . ds d- d\h'-1'\(ga . ds D- D\h'-1'\(hy . ds th \o'bp' . ds Th \o'LP' . ds ae ae . ds Ae AE .\} .rm #[ #] #H #V #F C .\" ======================================================================== .\" .IX Title "CVS2CL 1" .TH CVS2CL 1 "2016-12-19" "perl v5.24.1" "User Contributed Perl Documentation" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l .nh .SH "NAME" cvs2cl \- convert cvs log messages to changelogs .SH "SYNOPSIS" .IX Header "SYNOPSIS" \&\fBcvs2cl\fR [\fIoptions\fR] [\fI\s-1FILE1\s0\fR [\fI\s-1FILE2\s0\fR ...]] .SH "DESCRIPTION" .IX Header "DESCRIPTION" cvs2cl produces a GNU-style ChangeLog for CVS-controlled sources by running \*(L"cvs log\*(R" and parsing the output. Duplicate log messages get unified in the Right Way. .PP 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 \*(L"utags\*(R". That stands for \&\*(L"universal tags\*(R" \*(-- a universal tag is one held by all the files in a given change entry. .PP If you need output that's easy for a program to parse, use the \fB\-\-xml\fR option. Note that with \s-1XML\s0 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. .PP If filenames are given as arguments cvs2cl only shows log information for the named files. .SH "OPTIONS" .IX Header "OPTIONS" .IP "\fB\-h\fR, \fB\-help\fR, \fB\-\-help\fR, \fB\-?\fR" 4 .IX Item "-h, -help, --help, -?" Show a short help and exit. .IP "\fB\-\-version\fR" 4 .IX Item "--version" Show version and exit. .IP "\fB\-r\fR, \fB\-\-revisions\fR" 4 .IX Item "-r, --revisions" Show revision numbers in output. .IP "\fB\-b\fR, \fB\-\-branches\fR" 4 .IX Item "-b, --branches" Show branch names in revisions when possible. .IP "\fB\-t\fR, \fB\-\-tags\fR" 4 .IX Item "-t, --tags" Show tags (symbolic names) in output. .IP "\fB\-T\fR, \fB\-\-tagdates\fR" 4 .IX Item "-T, --tagdates" Show tags in output on their first occurance. .IP "\fB\-\-show\-dead\fR" 4 .IX Item "--show-dead" Show dead files. .IP "\fB\-\-stdin\fR" 4 .IX Item "--stdin" Read from stdin, don't run cvs log. .IP "\fB\-\-stdout\fR" 4 .IX Item "--stdout" Output to stdout not to ChangeLog. .IP "\fB\-d\fR, \fB\-\-distributed\fR" 4 .IX Item "-d, --distributed" Put ChangeLogs in subdirs. .IP "\fB\-f\fR \fI\s-1FILE\s0\fR, \fB\-\-file\fR \fI\s-1FILE\s0\fR" 4 .IX Item "-f FILE, --file FILE" Write to \fI\s-1FILE\s0\fR instead of ChangeLog. .IP "\fB\-\-fsf\fR" 4 .IX Item "--fsf" Use this if log data is in \s-1FSF\s0 ChangeLog style. .IP "\fB\-\-FSF\fR" 4 .IX Item "--FSF" Attempt strict FSF-standard compatible output (incompatible with \fB\-\-accum\fR). .IP "\fB\-W\fR \fI\s-1SECS\s0\fR, \fB\-\-window\fR \fI\s-1SECS\s0\fR" 4 .IX Item "-W SECS, --window SECS" Window of time within which log entries unify. .IP "\-\fBU\fR \fI\s-1UFILE\s0\fR, \fB\-\-usermap\fR \fI\s-1UFILE\s0\fR" 4 .IX Item "-U UFILE, --usermap UFILE" Expand usernames to email addresses from \fI\s-1UFILE\s0\fR. .IP "\fB\-\-passwd\fR \fI\s-1PASSWORDFILE\s0\fR" 4 .IX Item "--passwd PASSWORDFILE" Use system passwd file for user name expansion. If no mail domain is provided (via \fB\-\-domain\fR), it tries to read one from \fB/etc/mailname\fR, output of \fBhostname \&\-d\fR, \fBdnsdomainname\fR, or \fBdomain-name\fR. cvs2cl exits with an error if none of those options is successful. Use a domain of '' to prevent the addition of a mail domain. .IP "\fB\-\-domain\fR \fI\s-1DOMAIN\s0\fR" 4 .IX Item "--domain DOMAIN" Domain to build email addresses from. .IP "\fB\-\-gecos\fR" 4 .IX Item "--gecos" Get user information from \s-1GECOS\s0 data. .IP "\fB\-R\fR \fI\s-1REGEXP\s0\fR, \fB\-\-regexp\fR \fI\s-1REGEXP\s0\fR" 4 .IX Item "-R REGEXP, --regexp REGEXP" Include only entries that match \fI\s-1REGEXP\s0\fR. This option may be used multiple times. .IP "\fB\-I\fR \fI\s-1REGEXP\s0\fR, \fB\-\-ignore\fR \fI\s-1REGEXP\s0\fR" 4 .IX Item "-I REGEXP, --ignore REGEXP" Ignore files whose names match \fI\s-1REGEXP\s0\fR. 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. .IP "\fB\-C\fR, \fB\-\-case\-insensitive\fR" 4 .IX Item "-C, --case-insensitive" Any regexp matching is done case-insensitively. .IP "\fB\-F\fR \fI\s-1BRANCH\s0\fR, \fB\-\-follow\fR \fI\s-1BRANCH\s0\fR" 4 .IX Item "-F BRANCH, --follow BRANCH" Show only revisions on or ancestral to \fI\s-1BRANCH\s0\fR. .IP "\fB\-\-follow\-only\fR \fI\s-1BRANCH\s0\fR" 4 .IX Item "--follow-only BRANCH" Like \-\-follow, but sub-branches are not followed. .IP "\fB\-\-no\-ancestors\fR" 4 .IX Item "--no-ancestors" When using \fB\-F\fR, only track changes since the \fI\s-1BRANCH\s0\fR started. .IP "\fB\-\-no\-hide\-branch\-additions\fR" 4 .IX Item "--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. .IP "\fB\-S\fR, \fB\-\-separate\-header\fR" 4 .IX Item "-S, --separate-header" Blank line between each header and log message. .IP "\fB\-\-group\-within\-date\fR" 4 .IX Item "--group-within-date" Group ChangeLog entries on the same date together, instead of having a separate entry for each commit on that date. .IP "\fB\-\-summary\fR" 4 .IX Item "--summary" Add \s-1CVS\s0 change summary information. .IP "\fB\-\-no\-wrap\fR" 4 .IX Item "--no-wrap" Don't auto-wrap log message (recommend \fB\-S\fR also). .IP "\fB\-\-no\-indent\fR" 4 .IX Item "--no-indent" Don't indent log message .IP "\fB\-\-gmt\fR, \fB\-\-utc\fR" 4 .IX Item "--gmt, --utc" Show times in \s-1GMT/UTC\s0 instead of local time. .IP "\fB\-\-accum\fR" 4 .IX Item "--accum" Add to an existing ChangeLog (incompatible with \fB\-\-xml\fR and \fB\-\-FSF\fR). .IP "\fB\-w\fR, \fB\-\-day\-of\-week\fR" 4 .IX Item "-w, --day-of-week" Show day of week. .IP "\fB\-\-no\-times\fR" 4 .IX Item "--no-times" Don't show times in output. .IP "\fB\-\-chrono\fR" 4 .IX Item "--chrono" Output log in chronological order (default is reverse chronological order). .IP "\fB\-\-header\fR \fI\s-1FILE\s0\fR" 4 .IX Item "--header FILE" Get ChangeLog header from \fI\s-1FILE\s0\fR ("\fB\-\fR" means stdin). .IP "\fB\-\-xml\fR" 4 .IX Item "--xml" Output \s-1XML\s0 instead of ChangeLog format (incompatible with \fB\-\-accum\fR). .IP "\fB\-\-xml\-encoding\fR \fI\s-1ENCODING\s0\fR" 4 .IX Item "--xml-encoding ENCODING" Insert encoding clause in \s-1XML\s0 header. .IP "\fB\-\-xml\-stylesheet\fR \fI\s-1FILE\s0\fR" 4 .IX Item "--xml-stylesheet FILE" Insert xml-stylesheet processing instruction with \fI\s-1FILE\s0\fR formatting stylesheet file path in \s-1XML\s0 header. .IP "\fB\-\-noxmlns\fR" 4 .IX Item "--noxmlns" Don't include xmlns= attribute in root element. .IP "\fB\-\-hide\-filenames\fR" 4 .IX Item "--hide-filenames" Don't show filenames (ignored for \s-1XML\s0 output). .IP "\fB\-\-no\-common\-dir\fR" 4 .IX Item "--no-common-dir" Don't shorten directory names from filenames. .IP "\fB\-\-rcs\fR \fI\s-1CVSROOT\s0\fR" 4 .IX Item "--rcs CVSROOT" Handle filenames from raw \s-1RCS,\s0 for instance those produced by \*(L"cvs rlog\*(R" output, stripping the prefix \fI\s-1CVSROOT\s0\fR. .IP "\fB\-P\fR, \fB\-\-prune\fR" 4 .IX Item "-P, --prune" Don't show empty log messages. .IP "\fB\-\-lines\-modified\fR" 4 .IX Item "--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 \&\s-1XML\s0 output mode. .IP "\fB\-\-ignore\-tag\fR \fI\s-1TAG\s0\fR" 4 .IX Item "--ignore-tag TAG" 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. .IP "\fB\-\-show\-tag\fR \fI\s-1TAG\s0\fR" 4 .IX Item "--show-tag TAG" 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. .IP "\fB\-\-delta\fR \fI\s-1FROM_TAG\s0\fR\fB:\fR\fI\s-1TO_TAG\s0\fR" 4 .IX Item "--delta FROM_TAG:TO_TAG" Attempt a delta between two tags (since \fI\s-1FROM_TAG\s0\fR up to and including \fI\s-1TO_TAG\s0\fR). The algorithm is a simple date-based one (this is a hard problem) so results are imperfect. .IP "\fB\-g\fR \fI\s-1OPTS\s0\fR, \fB\-\-global\-opts\fR \fI\s-1OPTS\s0\fR" 4 .IX Item "-g OPTS, --global-opts OPTS" Pass \fI\s-1OPTS\s0\fR to cvs like in "cvs \fI\s-1OPTS\s0\fR log ...". .IP "\fB\-l\fR \fI\s-1OPTS\s0\fR, \fB\-\-log\-opts\fR \fI\s-1OPTS\s0\fR" 4 .IX Item "-l OPTS, --log-opts OPTS" Pass \fI\s-1OPTS\s0\fR to cvs log like in "cvs ... log \fI\s-1OPTS\s0\fR". .PP Notes about the options and arguments: .IP "\(bu" 4 The \fB\-I\fR and \fB\-F\fR options may appear multiple times. .IP "\(bu" 4 To follow trunk revisions, use "\fB\-F trunk\fR\*(L" (\*(R"\fB\-F \s-1TRUNK\s0\fR\*(L" also works). This is okay because no would ever, ever be crazy enough to name a branch \*(R"trunk", right? Right. .IP "\(bu" 4 For the \fB\-U\fR option, the \fI\s-1UFILE\s0\fR should be formatted like CVSROOT/users. That is, each line of \fI\s-1UFILE\s0\fR looks like this: .Sp .Vb 1 \& jrandom:jrandom@red\-bean.com .Ve .Sp or maybe even like this .Sp .Vb 1 \& jrandom:\*(AqJesse Q. Random \*(Aq .Ve .Sp Don't forget to quote the portion after the colon if necessary. .IP "\(bu" 4 Many people want to filter by date. To do so, invoke cvs2cl like this: .Sp .Vb 1 \& cvs2cl \-l "\-d\*(AqDATESPEC\*(Aq" .Ve .Sp where \s-1DATESPEC\s0 is any date specification valid for \*(L"cvs log \-d\*(R". (Note that \&\s-1CVS 1.10.7\s0 and below requires there be no space between \-d and its argument). .IP "\(bu" 4 Dates/times are interpreted in the local time zone. .IP "\(bu" 4 Remember to quote the argument to `\fB\-l\fR' so that your shell doesn't interpret spaces as argument separators. .IP "\(bu" 4 See the 'Common Options' section of the cvs manual ('info cvs' on UNIX-like systems) for more information. .IP "\(bu" 4 Note that the rules for quoting under windows shells are different. .IP "\(bu" 4 To run in an automated environment such as \s-1CGI\s0 or \s-1PHP,\s0 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 \&\s-1PATH\s0 variable. .SH "EXAMPLES" .IX Header "EXAMPLES" Some examples (working on \s-1UNIX\s0 shells): .PP .Vb 7 \& # logs after 6th March, 2003 (inclusive) \& cvs2cl \-l "\-d\*(Aq>2003\-03\-06\*(Aq" \& # logs after 4:34PM 6th March, 2003 (inclusive) \& cvs2cl \-l "\-d\*(Aq>2003\-03\-06 16:34\*(Aq" \& # logs between 4:46PM 6th March, 2003 (exclusive) and \& # 4:34PM 6th March, 2003 (inclusive) \& cvs2cl \-l "\-d\*(Aq2003\-03\-06 16:46>2003\-03\-06 16:34\*(Aq" .Ve .PP Some examples (on non-UNIX shells): .PP .Vb 2 \& # Reported to work on windows xp/2000 \& cvs2cl \-l "\-d"">2003\-10\-18;today<""" .Ve .SH "AUTHORS" .IX Header "AUTHORS" .IP "Karl Fogel" 4 .IX Item "Karl Fogel" .PD 0 .IP "Melissa O'Neill" 4 .IX Item "Melissa O'Neill" .IP "Martyn J. Pearce" 4 .IX Item "Martyn J. Pearce" .PD .PP Contributions from .IP "Mike Ayers" 4 .IX Item "Mike Ayers" .PD 0 .IP "Tim Bradshaw" 4 .IX Item "Tim Bradshaw" .IP "Richard Broberg" 4 .IX Item "Richard Broberg" .IP "Nathan Bryant" 4 .IX Item "Nathan Bryant" .IP "Oswald Buddenhagen" 4 .IX Item "Oswald Buddenhagen" .IP "Neil Conway" 4 .IX Item "Neil Conway" .IP "Arthur de Jong" 4 .IX Item "Arthur de Jong" .IP "Mark W. Eichin" 4 .IX Item "Mark W. Eichin" .IP "Dave Elcock" 4 .IX Item "Dave Elcock" .IP "Reid Ellis" 4 .IX Item "Reid Ellis" .IP "Simon Josefsson" 4 .IX Item "Simon Josefsson" .IP "Robin Hugh Johnson" 4 .IX Item "Robin Hugh Johnson" .IP "Terry Kane" 4 .IX Item "Terry Kane" .IP "Pete Kempf" 4 .IX Item "Pete Kempf" .IP "Akos Kiss" 4 .IX Item "Akos Kiss" .IP "Claus Klein" 4 .IX Item "Claus Klein" .IP "Eddie Kohler" 4 .IX Item "Eddie Kohler" .IP "Richard Laager" 4 .IX Item "Richard Laager" .IP "Kevin Lilly" 4 .IX Item "Kevin Lilly" .IP "Karl-Heinz Marbaise" 4 .IX Item "Karl-Heinz Marbaise" .IP "Mitsuaki Masuhara" 4 .IX Item "Mitsuaki Masuhara" .IP "Henrik Nordstrom" 4 .IX Item "Henrik Nordstrom" .IP "Joe Orton" 4 .IX Item "Joe Orton" .IP "Peter Palfrader" 4 .IX Item "Peter Palfrader" .IP "Thomas Parmelan" 4 .IX Item "Thomas Parmelan" .IP "Jordan Russell" 4 .IX Item "Jordan Russell" .IP "Jacek Sliwerski" 4 .IX Item "Jacek Sliwerski" .IP "Johannes Stezenbach" 4 .IX Item "Johannes Stezenbach" .IP "Joseph Walton" 4 .IX Item "Joseph Walton" .IP "Ernie Zapata" 4 .IX Item "Ernie Zapata" .PD .SH "BUGS" .IX Header "BUGS" Please report bugs to \f(CW\*(C`cvs2cl\-reports {_AT_} red\-bean.com\*(C'\fR. .SH "PREREQUISITES" .IX Header "PREREQUISITES" This script requires \f(CW\*(C`Text::Wrap\*(C'\fR, \f(CW\*(C`Time::Local\*(C'\fR, and \f(CW\*(C`File::Basename\*(C'\fR. It also seems to require \f(CW\*(C`Perl 5.004_04\*(C'\fR or higher. .SH "OPERATING SYSTEM COMPATIBILITY" .IX Header "OPERATING SYSTEM COMPATIBILITY" Should work on any \s-1OS.\s0 .SH "SCRIPT CATEGORIES" .IX Header "SCRIPT CATEGORIES" Version_Control/CVS .SH "COPYRIGHT" .IX Header "COPYRIGHT" (C) 2001,2002,2003,2004 Martyn J. Pearce, under the \s-1GNU GPL.\s0 .PP (C) 1999 Karl Fogel, under the \s-1GNU GPL.\s0 .PP cvs2cl is free software; you can redistribute it and/or modify it under the terms of the \s-1GNU\s0 General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. .PP cvs2cl is distributed in the hope that it will be useful, but \s-1WITHOUT ANY WARRANTY\s0; without even the implied warranty of \&\s-1MERCHANTABILITY\s0 or \s-1FITNESS FOR A PARTICULAR PURPOSE. \s0 See the \&\s-1GNU\s0 General Public License for more details. .PP You may have received a copy of the \s-1GNU\s0 General Public License along with cvs2cl; see the file \s-1COPYING. \s0 If not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, \s-1MA 02110\-1301 USA.\s0 .PP [The postal address above has been updated by the Debian package maintainer to reflect the \s-1FSF\s0's current address.] .SH "SEE ALSO" .IX Header "SEE ALSO" \&\fIcvs\fR\|(1)