cvs2cl-2.73/ 0002755 0001750 0001750 00000000000 11765402153 012171 5 ustar weasel weasel cvs2cl-2.73/TODO 0000644 0001750 0001750 00000001224 07163364121 012655 0 ustar weasel weasel Oh Most High and Puissant Emacs, pleased to be in -*- outline -*- mode!
This is my list of pending changes. I really, really will get to
these soon.
Each entry is marked with an asterisk at the beginning of the line.
Type C-c C-t to collapse all entries, C-c C-a to show them.
* Cumulative behavior?
Would be great if cvs2cl could read an existing ChangeLog and then
only get the amount of information required to bring it up to date.
I.e., it would find the front date in the ChangeLog and use that in a
"cvs log -d" invocation. Heh. Easy to do. So do it.
* Modify CVS to expand usernames based on CVSROOT/users
So that the -U option isn't needed.
cvs2cl-2.73/cvs2cl.pl 0000755 0001750 0001750 00000265551 11765402007 013737 0 ustar weasel weasel #!/bin/sh
exec perl -w -x "$0" ${1+"$@"} # -*- mode: perl; perl-indent-level: 2; -*-
#!perl -w
##############################################################
### ###
### cvs2cl.pl: produce ChangeLog(s) from `cvs log` output. ###
### ###
##############################################################
## $Revision: 2.73 $
## $Date: 2011/11/12 01:27:48 $
## $Author: kfogel $
##
use strict;
use File::Basename qw( fileparse );
use Getopt::Long qw( GetOptions );
use Text::Wrap qw( );
use Time::Local qw( timegm );
use User::pwent qw( getpwnam );
# The Plan:
#
# Read in the logs for multiple files, spit out a nice ChangeLog that
# mirrors the information entered during `cvs commit'.
#
# The problem presents some challenges. In an ideal world, we could
# detect files with the same author, log message, and checkin time --
# each would be a changelog entry.
# We'd sort them; and spit them out. Unfortunately, CVS is *not atomic*
# so checkins can span a range of times. Also, the directory structure
# could be hierarchical.
#
# Another question is whether we really want to have the ChangeLog
# exactly reflect commits. An author could issue two related commits,
# with different log entries, reflecting a single logical change to the
# source. GNU style ChangeLogs group these under a single author/date.
# We try to do the same.
#
# So, we parse the output of `cvs log', storing log messages in a
# multilevel hash that stores the mapping:
# directory => author => time => message => filelist
# As we go, we notice "nearby" commit times and store them together
# (i.e., under the same timestamp), so they appear in the same log
# entry.
#
# When we've read all the logs, we twist this mapping into
# a time => author => message => filelist mapping for each directory.
#
# If we're not using the `--distributed' flag, the directory is always
# considered to be `./', even as descend into subdirectories.
# Call Tree
# name number of lines (10.xii.03)
# parse_options 192
# derive_changelog 13
# +-maybe_grab_accumulation_date 38
# +-read_changelog 277
# +-maybe_read_user_map_file 94
# +-run_ext 9
# +-read_file_path 29
# +-read_symbolic_name 43
# +-read_revision 49
# +-read_date_author_and_state 25
# +-parse_date_author_and_state 20
# +-read_branches 36
# +-output_changelog 424
# +-pretty_file_list 290
# +-common_path_prefix 35
# +-preprocess_msg_text 30
# +-min 1
# +-mywrap 16
# +-last_line_len 5
# +-wrap_log_entry 177
#
# Utilities
#
# xml_escape 6
# slurp_file 11
# debug 5
# version 2
# usage 142
# -*- -*- -*- -*- -*- -*- -*- -*- -*- -*- -*- -*- -*- -*- -*- -*- -*- -*-
#
# Note about a bug-slash-opportunity:
# -----------------------------------
#
# There's a bug in Text::Wrap, which affects cvs2cl. This script
# reveals it:
#
# #!/usr/bin/perl -w
#
# use Text::Wrap;
#
# my $test_text =
# "This script demonstrates a bug in Text::Wrap. The very long line
# following this paragraph will be relocated relative to the surrounding
# text:
#
# ====================================================================
#
# See? When the bug happens, we'll get the line of equal signs below
# this paragraph, even though it should be above.";
#
#
# # Print out the test text with no wrapping:
# print "$test_text";
# print "\n";
# print "\n";
#
# # Now print it out wrapped, and see the bug:
# print wrap ("\t", " ", "$test_text");
# print "\n";
# print "\n";
#
# If the line of equal signs were one shorter, then the bug doesn't
# happen. Interesting.
#
# Anyway, rather than fix this in Text::Wrap, we might as well write a
# new wrap() which has the following much-needed features:
#
# * initial indentation, like current Text::Wrap()
# * subsequent line indentation, like current Text::Wrap()
# * user chooses among: force-break long words, leave them alone, or die()?
# * preserve existing indentation: chopped chunks from an indented line
# are indented by same (like this line, not counting the asterisk!)
# * optional list of things to preserve on line starts, default ">"
#
# Note that the last two are essentially the same concept, so unify in
# implementation and give a good interface to controlling them.
#
# And how about:
#
# Optionally, when encounter a line pre-indented by same as previous
# line, then strip the newline and refill, but indent by the same.
# Yeah...
# Globals --------------------------------------------------------------------
# In case we have to print it out:
my $VERSION = '$Revision: 2.73 $';
$VERSION =~ s/\S+\s+(\S+)\s+\S+/$1/;
## Vars set by options:
# Print debugging messages?
my $Debug = 0;
# Just show version and exit?
my $Print_Version = 0;
# Just print usage message and exit?
my $Print_Usage = 0;
# What file should we generate (defaults to "ChangeLog")?
my $Log_File_Name = "ChangeLog";
# Grab most recent entry date from existing ChangeLog file, just add
# to that ChangeLog.
my $Cumulative = 0;
# `cvs log -d`, this will repeat the last entry in the old log. This is OK,
# as it guarantees at least one entry in the update changelog, which means
# that there will always be a date to extract for the next update. The repeat
# entry can be removed in postprocessing, if necessary.
# MJP 2003-08-02
# I don't think this actually does anything useful
my $Update = 0;
# Expand usernames to email addresses based on a map file?
my $User_Map_File = '';
my $User_Passwd_File;
my $Mail_Domain;
# Output log in chronological order? [default is reverse chronological order]
my $Chronological_Order = 0;
# Grab user details via gecos
my $Gecos = 0;
# User domain for gecos email addresses
my $Domain;
# Output to a file or to stdout?
my $Output_To_Stdout = 0;
# Eliminate empty log messages?
my $Prune_Empty_Msgs = 0;
# Tags of which not to output
my %ignore_tags;
# Show only revisions with Tags
my %show_tags;
# Don't call Text::Wrap on the body of the message
my $No_Wrap = 0;
# Indentation of log messages
my $Indent = "\t";
# Don't do any pretty print processing
my $Summary = 0;
# Separates header from log message. Code assumes it is either " " or
# "\n\n", so if there's ever an option to set it to something else,
# make sure to go through all conditionals that use this var.
my $After_Header = " ";
# XML Encoding
my $XML_Encoding = '';
# XML Stylesheet file
my $XML_Stylesheet = '';
# Format more for programs than for humans.
my $XML_Output = 0;
my $No_XML_Namespace = 0;
my $No_XML_ISO_Date = 0;
# Do some special tweaks for log data that was written in FSF
# ChangeLog style.
my $FSF_Style = 0;
# Set iff output should be like an FSF-style ChangeLog.
my $FSF_Output = 0;
# Show times in UTC instead of local time
my $UTC_Times = 0;
# Show times in output?
my $Show_Times = 1;
# Show day of week in output?
my $Show_Day_Of_Week = 0;
# Show revision numbers in output?
my $Show_Revisions = 0;
# Show dead files in output?
my $Show_Dead = 0;
# Hide dead trunk files which were created as a result of additions on a
# branch?
my $Hide_Branch_Additions = 1;
# Show tags (symbolic names) in output?
my $Show_Tags = 0;
# Show tags separately in output?
my $Show_Tag_Dates = 0;
# Show branches by symbolic name in output?
my $Show_Branches = 0;
# Show only revisions on these branches or their ancestors.
my @Follow_Branches;
# Show only revisions on these branches or their ancestors; ignore descendent
# branches.
my @Follow_Only;
# Don't bother with files matching this regexp.
my @Ignore_Files;
# How exactly we match entries. We definitely want "o",
# and user might add "i" by using --case-insensitive option.
my $Case_Insensitive = 0;
# Maybe only show log messages matching a certain regular expression.
my $Regexp_Gate = '';
# Pass this global option string along to cvs, to the left of `log':
my $Global_Opts = '';
# Pass this option string along to the cvs log subcommand:
my $Command_Opts = '';
# Read log output from stdin instead of invoking cvs log?
my $Input_From_Stdin = 0;
# Don't show filenames in output.
my $Hide_Filenames = 0;
# Don't shorten directory names from filenames.
my $Common_Dir = 1;
# Max checkin duration. CVS checkin is not atomic, so we may have checkin
# times that span a range of time. We assume that checkins will last no
# longer than $Max_Checkin_Duration seconds, and that similarly, no
# checkins will happen from the same users with the same message less
# than $Max_Checkin_Duration seconds apart.
my $Max_Checkin_Duration = 180;
# What to put at the front of [each] ChangeLog.
my $ChangeLog_Header = '';
# Whether to enable 'delta' mode, and for what start/end tags.
my $Delta_Mode = 0;
my $Delta_From = '';
my $Delta_To = '';
my $TestCode;
# Whether to parse filenames from the RCS filename, and if so what
# prefix to strip.
my $RCS_Root;
# Whether to output information on the # of lines added and removed
# by each file modification.
my $Show_Lines_Modified = 0;
## end vars set by options.
# latest observed times for the start/end tags in delta mode
my $Delta_StartTime = 0;
my $Delta_EndTime = 0;
my $No_Ancestors = 0;
my $No_Extra_Indent = 0;
my $GroupWithinDate = 0;
# ----------------------------------------------------------------------------
package CVS::Utils::ChangeLog::EntrySet;
sub new {
my $class = shift;
my %self;
bless \%self, $class;
}
# -------------------------------------
sub output_changelog {
my $output_type = $XML_Output ? 'XML' : 'Text';
my $output_class = "CVS::Utils::ChangeLog::EntrySet::Output::${output_type}";
my $output = $output_class->new(follow_branches => \@Follow_Branches,
follow_only => \@Follow_Only,
ignore_tags => \%ignore_tags,
show_tags => \%show_tags,
);
$output->output_changelog(@_);
}
# -------------------------------------
sub add_fileentry {
my ($self, $file_full_path, $time, $revision, $state, $lines,
$branch_names, $branch_roots, $branch_numbers,
$symbolic_names, $author, $msg_txt) = @_;
my $qunk =
CVS::Utils::ChangeLog::FileEntry->new($file_full_path, $time, $revision,
$state, $lines,
$branch_names, $branch_roots,
$branch_numbers,
$symbolic_names);
# We might be including revision numbers and/or tags and/or
# branch names in the output. Most of the code from here to
# loop-end deals with organizing these in qunk.
unless ( $Hide_Branch_Additions
and
$msg_txt =~ /file .+ was initially added on branch \S+./ ) {
# Add this file to the list
# (We use many spoonfuls of autovivication magic. Hashes and arrays
# will spring into existence if they aren't there already.)
&main::debug ("(pushing log msg for ". $qunk->dir_key . $qunk->filename . ")\n");
# Store with the files in this commit. Later we'll loop through
# again, making sure that revisions with the same log message
# and nearby commit times are grouped together as one commit.
$self->{$qunk->dir_key}{$author}{$time}{$msg_txt} =
CVS::Utils::ChangeLog::Message->new($msg_txt)
unless exists $self->{$qunk->dir_key}{$author}{$time}{$msg_txt};
$self->{$qunk->dir_key}{$author}{$time}{$msg_txt}->add_fileentry($qunk);
}
}
# ----------------------------------------------------------------------------
package CVS::Utils::ChangeLog::EntrySet::Output::Text;
use base qw( CVS::Utils::ChangeLog::EntrySet::Output );
use File::Basename qw( fileparse );
sub new {
my $class = shift;
my $self = $class->SUPER::new(@_);
}
# -------------------------------------
sub wday {
my $self = shift; my $class = ref $self;
my ($wday) = @_;
return $Show_Day_Of_Week ? ' ' . $class->weekday_en($wday) : '';
}
# -------------------------------------
sub header_line {
my $self = shift;
my ($time, $author, $lastdate) = @_;
my $header_line = '';
my (undef,$min,$hour,$mday,$mon,$year,$wday)
= $UTC_Times ? gmtime($time) : localtime($time);
my $date = $self->fdatetime($time);
if ($Show_Times) {
$header_line =
sprintf "%s %s\n\n", $date, $author;
} else {
if ( ! defined $lastdate or $date ne $lastdate or ! $GroupWithinDate ) {
if ( $GroupWithinDate ) {
$header_line = "$date\n\n";
} else {
$header_line = "$date $author\n\n";
}
} else {
$header_line = '';
}
}
}
# -------------------------------------
sub preprocess_msg_text {
my $self = shift;
my ($text) = @_;
$text = $self->SUPER::preprocess_msg_text($text);
unless ( $No_Wrap ) {
# Strip off lone newlines, but only for lines that don't begin with
# whitespace or a mail-quoting character, since we want to preserve
# that kind of formatting. Also don't strip newlines that follow a
# period; we handle those specially next. And don't strip
# newlines that precede an open paren.
1 while $text =~ s/(^|\n)([^>\s].*[^.\n])\n([^>\n])/$1$2 $3/g;
# If a newline follows a period, make sure that when we bring up the
# bottom sentence, it begins with two spaces.
1 while $text =~ s/(^|\n)([^>\s].*)\n([^>\n])/$1$2 $3/g;
}
return $text;
}
# -------------------------------------
# Here we take a bunch of qunks and convert them into printed
# summary that will include all the information the user asked for.
sub pretty_file_list {
my $self = shift;
return ''
if $Hide_Filenames;
my $qunksref = shift;
my @filenames;
my $beauty = ''; # The accumulating header string for this entry.
my %non_unanimous_tags; # Tags found in a proper subset of qunks
my %unanimous_tags; # Tags found in all qunks
my %all_branches; # Branches found in any qunk
my $fbegun = 0; # Did we begin printing filenames yet?
my ($common_dir, $qunkrefs) =
$self->_pretty_file_list(\(%unanimous_tags, %non_unanimous_tags, %all_branches), $qunksref);
my @qunkrefs = @$qunkrefs;
# Not XML output, so complexly compactify for chordate consumption. At this
# point we have enough global information about all the qunks to organize
# them non-redundantly for output.
if ($common_dir) {
# Note that $common_dir still has its trailing slash
$beauty .= "$common_dir: ";
}
if ($Show_Branches)
{
# For trailing revision numbers.
my @brevisions;
foreach my $branch (keys (%all_branches))
{
foreach my $qunkref (@qunkrefs)
{
if ((defined ($qunkref->branch))
and ($qunkref->branch eq $branch))
{
if ($fbegun) {
# kff todo: comma-delimited in XML too? Sure.
$beauty .= ", ";
}
else {
$fbegun = 1;
}
my $fname = substr ($qunkref->filename, length ($common_dir));
$beauty .= $fname;
$qunkref->{'printed'} = 1; # Just setting a mark bit, basically
if ( $Show_Tags and defined $qunkref->tags ) {
my @tags = grep ($non_unanimous_tags{$_}, @{$qunkref->tags});
if (@tags) {
$beauty .= " (tags: ";
$beauty .= join (', ', @tags);
$beauty .= ")";
}
}
if ($Show_Revisions) {
# Collect the revision numbers' last components, but don't
# print them -- they'll get printed with the branch name
# later.
$qunkref->revision =~ /.+\.([\d]+)$/;
push (@brevisions, $1);
# todo: we're still collecting branch roots, but we're not
# showing them anywhere. If we do show them, it would be
# nifty to just call them revision "0" on a the branch.
# Yeah, that's the ticket.
}
}
}
$beauty .= " ($branch";
if (@brevisions) {
if ((scalar (@brevisions)) > 1) {
$beauty .= ".[";
$beauty .= (join (',', @brevisions));
$beauty .= "]";
}
else {
# Square brackets are spurious here, since there's no range to
# encapsulate
$beauty .= ".$brevisions[0]";
}
}
$beauty .= ")";
}
}
# Okay; any qunks that were done according to branch are taken care
# of, and marked as printed. Now print everyone else.
my %fileinfo_printed;
foreach my $qunkref (@qunkrefs)
{
next if (defined ($qunkref->{'printed'})); # skip if already printed
my $b = substr ($qunkref->filename, length ($common_dir));
# todo: Shlomo's change was this:
# $beauty .= substr ($qunkref->filename,
# (($common_dir eq "./") ? '' : length ($common_dir)));
$qunkref->{'printed'} = 1; # Set a mark bit.
if ($Show_Revisions || $Show_Tags || $Show_Dead)
{
my $started_addendum = 0;
if ($Show_Revisions) {
$started_addendum = 1;
$b .= " (";
$b .= $qunkref->revision;
}
if ($Show_Dead && $qunkref->state =~ /dead/)
{
# Deliberately not using $started_addendum. Keeping it simple.
$b .= "[DEAD]";
}
if ($Show_Tags && (defined $qunkref->tags)) {
my @tags = grep ($non_unanimous_tags{$_}, @{$qunkref->tags});
if ((scalar (@tags)) > 0) {
if ($started_addendum) {
$b .= ", ";
}
else {
$b .= " (tags: ";
}
$b .= join (', ', @tags);
$started_addendum = 1;
}
}
if ($started_addendum) {
$b .= ")";
}
}
unless ( exists $fileinfo_printed{$b} ) {
if ($fbegun) {
$beauty .= ", ";
} else {
$fbegun = 1;
}
$beauty .= $b, $fileinfo_printed{$b} = 1;
}
}
# Unanimous tags always come last.
if ($Show_Tags && %unanimous_tags)
{
$beauty .= " (utags: ";
$beauty .= join (', ', sort keys (%unanimous_tags));
$beauty .= ")";
}
# todo: still have to take care of branch_roots?
$beauty = "$beauty:";
return $beauty;
}
# -------------------------------------
sub output_tagdate {
my $self = shift;
my ($fh, $time, $tag) = @_;
my $fdatetime = $self->fdatetime($time);
print $fh "$fdatetime tag $tag\n\n";
return;
}
# -------------------------------------
sub format_body {
my $self = shift;
my ($msg, $files, $qunklist) = @_;
my $body;
if ( $No_Wrap and ! $Summary ) {
$msg = $self->preprocess_msg_text($msg);
$files = $self->mywrap("\t", "\t ", "* $files");
$msg =~ s/\n(.+)/\n$Indent$1/g;
unless ($After_Header eq " ") {
$msg =~ s/^(.+)/$Indent$1/g;
}
if ( $Hide_Filenames ) {
$body = $After_Header . $msg;
} else {
$body = $files . $After_Header . $msg;
}
} elsif ( $Summary ) {
my ($filelist, $qunk);
my (@DeletedQunks, @AddedQunks, @ChangedQunks);
$msg = $self->preprocess_msg_text($msg);
#
# Sort the files (qunks) according to the operation that was
# performed. Files which were added have no line change
# indicator, whereas deleted files have state dead.
#
foreach $qunk ( @$qunklist ) {
if ( "dead" eq $qunk->state) {
push @DeletedQunks, $qunk;
} elsif ( ! defined $qunk->lines ) {
push @AddedQunks, $qunk;
} else {
push @ChangedQunks, $qunk;
}
}
#
# The qunks list was originally in tree search order. Let's
# get that back. The lists, if they exist, will be reversed upon
# processing.
#
#
# Now write the three sections onto $filelist
#
if ( @DeletedQunks ) {
$filelist .= "\tDeleted:\n";
foreach $qunk ( @DeletedQunks ) {
$filelist .= "\t\t" . $qunk->filename;
$filelist .= " (" . $qunk->revision . ")";
$filelist .= "\n";
}
undef @DeletedQunks;
}
if ( @AddedQunks ) {
$filelist .= "\tAdded:\n";
foreach $qunk (@AddedQunks) {
$filelist .= "\t\t" . $qunk->filename;
$filelist .= " (" . $qunk->revision . ")";
$filelist .= "\n";
}
undef @AddedQunks ;
}
if ( @ChangedQunks ) {
$filelist .= "\tChanged:\n";
foreach $qunk (@ChangedQunks) {
$filelist .= "\t\t" . $qunk->filename;
$filelist .= " (" . $qunk->revision . ")";
$filelist .= ", \"" . $qunk->state . "\"";
$filelist .= ", lines: " . $qunk->lines;
$filelist .= "\n";
}
undef @ChangedQunks;
}
chomp $filelist;
if ( $Hide_Filenames ) {
$filelist = '';
}
$msg =~ s/\n(.*)/\n$Indent$1/g;
unless ( $After_Header eq " " or $FSF_Style ) {
$msg =~ s/^(.*)/$Indent$1/g;
}
unless ( $No_Wrap ) {
if ( $FSF_Style ) {
$msg = $self->wrap_log_entry($msg, '', 69, 69);
chomp($msg);
chomp($msg);
} else {
$msg = $self->mywrap('', $Indent, "$msg");
$msg =~ s/[ \t]+\n/\n/g;
}
}
$body = $filelist . $After_Header . $msg;
} else { # do wrapping, either FSF-style or regular
my $latter_wrap = $No_Extra_Indent ? $Indent : "$Indent ";
if ( $FSF_Style ) {
$files = $self->mywrap($Indent, $latter_wrap, "* $files");
my $files_last_line_len = 0;
if ( $After_Header eq " " ) {
$files_last_line_len = $self->last_line_len($files);
$files_last_line_len += 1; # for $After_Header
}
$msg = $self->wrap_log_entry($msg, $latter_wrap, 69-$files_last_line_len, 69);
$body = $files . $After_Header . $msg;
} else { # not FSF-style
$msg = $self->preprocess_msg_text($msg);
$body = $files . $After_Header . $msg;
$body = $self->mywrap($Indent, $latter_wrap, "* $body");
$body =~ s/[ \t]+\n/\n/g;
}
}
return $body;
}
# ----------------------------------------------------------------------------
package CVS::Utils::ChangeLog::EntrySet::Output::XML;
use base qw( CVS::Utils::ChangeLog::EntrySet::Output );
use File::Basename qw( fileparse );
sub new {
my $class = shift;
my $self = $class->SUPER::new(@_);
}
# -------------------------------------
sub header_line {
my $self = shift;
my ($time, $author, $lastdate) = @_;
my $header_line = '';
my $isoDate;
my ($y, $m, $d, $H, $M, $S) = (gmtime($time))[5,4,3,2,1,0];
# Ideally, this would honor $UTC_Times and use +HH:MM syntax
$isoDate = sprintf("%04d-%02d-%02dT%02d:%02d:%02dZ",
$y + 1900, $m + 1, $d, $H, $M, $S);
my (undef,$min,$hour,$mday,$mon,$year,$wday)
= $UTC_Times ? gmtime($time) : localtime($time);
my $date = $self->fdatetime($time);
$wday = $self->wday($wday);
$header_line =
sprintf ("%4u-%02u-%02u\n${wday}\n",
$year+1900, $mon+1, $mday, $hour, $min);
$header_line .= "$isoDate\n"
unless $No_XML_ISO_Date;
$header_line .= sprintf("%s\n" , $author);
}
# -------------------------------------
sub wday {
my $self = shift; my $class = ref $self;
my ($wday) = @_;
return '' . $class->weekday_en($wday) . "\n";
}
# -------------------------------------
sub escape {
my $self = shift;
my $txt = shift;
$txt =~ s/&/&/g;
$txt =~ s/</g;
$txt =~ s/>/>/g;
return $txt;
}
# -------------------------------------
sub output_header {
my $self = shift;
my ($fh) = @_;
my $encoding =
length $XML_Encoding ? qq'encoding="$XML_Encoding"' : '';
my $version = 'version="1.0"';
my $declaration =
sprintf '', join ' ', grep length, $version, $encoding;
my $stylesheet =
length $XML_Stylesheet ?
sprintf '', $XML_Stylesheet :
'';
my $root =
$No_XML_Namespace ?
'' :
'';
print $fh "$declaration\n$stylesheet\n\n$root\n\n";
}
# -------------------------------------
sub output_footer {
my $self = shift;
my ($fh) = @_;
print $fh "\n";
}
# -------------------------------------
sub preprocess_msg_text {
my $self = shift;
my ($text) = @_;
$text = $self->SUPER::preprocess_msg_text($text);
$text = $self->escape($text);
chomp $text;
$text = "${text}\n";
return $text;
}
# -------------------------------------
# Here we take a bunch of qunks and convert them into a printed
# summary that will include all the information the user asked for.
sub pretty_file_list {
my $self = shift;
my ($qunksref) = @_;
my $beauty = ''; # The accumulating header string for this entry.
my %non_unanimous_tags; # Tags found in a proper subset of qunks
my %unanimous_tags; # Tags found in all qunks
my %all_branches; # Branches found in any qunk
my $fbegun = 0; # Did we begin printing filenames yet?
my ($common_dir, $qunkrefs) =
$self->_pretty_file_list(\(%unanimous_tags, %non_unanimous_tags, %all_branches),
$qunksref);
my @qunkrefs = @$qunkrefs;
# If outputting XML, then our task is pretty simple, because we
# don't have to detect common dir, common tags, branch prefixing,
# etc. We just output exactly what we have, and don't worry about
# redundancy or readability.
foreach my $qunkref (@qunkrefs)
{
my $filename = $qunkref->filename;
my $state = $qunkref->state;
my $revision = $qunkref->revision;
my $tags = $qunkref->tags;
my $branch = $qunkref->branch;
my $branchroots = $qunkref->roots;
my $lines = $qunkref->lines;
$filename = $self->escape($filename); # probably paranoia
$revision = $self->escape($revision); # definitely paranoia
$beauty .= "\n";
$beauty .= "${filename}\n";
$beauty .= "${state}\n";
$beauty .= "${revision}\n";
if ($Show_Lines_Modified
&& $lines && $lines =~ m/\+(\d+)\s+-(\d+)/) {
$beauty .= "$1\n";
$beauty .= "$2\n";
}
if ($branch) {
$branch = $self->escape($branch); # more paranoia
$beauty .= "${branch}\n";
}
foreach my $tag (@$tags) {
$tag = $self->escape($tag); # by now you're used to the paranoia
$beauty .= "${tag}\n";
}
foreach my $root (@$branchroots) {
$root = $self->escape($root); # which is good, because it will continue
$beauty .= "${root}\n";
}
$beauty .= "\n";
}
# Theoretically, we could go home now. But as long as we're here,
# let's print out the common_dir and utags, as a convenience to
# the receiver (after all, earlier code calculated that stuff
# anyway, so we might as well take advantage of it).
if ((scalar (keys (%unanimous_tags))) > 1) {
foreach my $utag ((keys (%unanimous_tags))) {
$utag = $self->escape($utag); # the usual paranoia
$beauty .= "${utag}\n";
}
}
if ($common_dir) {
$common_dir = $self->escape($common_dir);
$beauty .= "${common_dir}\n";
}
# That's enough for XML, time to go home:
return $beauty;
}
# -------------------------------------
sub output_tagdate {
my $self = shift;
my ($fh, $time, $tag) = @_;
my ($y, $m, $d, $H, $M, $S) = (gmtime($time))[5,4,3,2,1,0];
# Ideally, this would honor $UTC_Times and use +HH:MM syntax
my $isoDate = sprintf("%04d-%02d-%02dT%02d:%02d:%02dZ",
$y + 1900, $m + 1, $d, $H, $M, $S);
print $fh "\n";
print $fh "$isoDate\n";
$tag = $self->escape($tag); # more paranoia
print $fh "$tag\n";
print $fh "\n\n";
return;
}
# -------------------------------------
sub output_entry {
my $self = shift;
my ($fh, $entry) = @_;
print $fh "\n$entry\n\n";
}
# -------------------------------------
sub format_body {
my $self = shift;
my ($msg, $files, $qunklist) = @_;
$msg = $self->preprocess_msg_text($msg);
return $files . $msg;
}
# ----------------------------------------------------------------------------
package CVS::Utils::ChangeLog::EntrySet::Output;
use Carp qw( croak );
use File::Basename qw( fileparse );
# Class Utility Functions -------------
{ # form closure
my @weekdays = (qw(Sunday Monday Tuesday Wednesday Thursday Friday Saturday));
sub weekday_en {
my $class = shift;
return $weekdays[$_[0]];
}
}
# -------------------------------------
sub new {
my ($proto, %args) = @_;
my $class = ref $proto || $proto;
my $follow_branches = delete $args{follow_branches};
my $follow_only = delete $args{follow_only};
my $ignore_tags = delete $args{ignore_tags};
my $show_tags = delete $args{show_tags};
die "Unrecognized arg to EntrySet::Output::new: '$_'\n"
for keys %args;
bless +{follow_branches => $follow_branches,
follow_only => $follow_only,
show_tags => $show_tags,
ignore_tags => $ignore_tags,
}, $class;
}
# Abstract Subrs ----------------------
sub wday { croak "Whoops. Abtract method call (wday).\n" }
sub pretty_file_list { croak "Whoops. Abtract method call (pretty_file_list).\n" }
sub output_tagdate { croak "Whoops. Abtract method call (output_tagdate).\n" }
sub header_line { croak "Whoops. Abtract method call (header_line).\n" }
# Instance Subrs ----------------------
sub output_header { }
# -------------------------------------
sub output_entry {
my $self = shift;
my ($fh, $entry) = @_;
print $fh "$entry\n";
}
# -------------------------------------
sub output_footer { }
# -------------------------------------
sub escape { return $_[1] }
# -------------------------------------
sub _revision_is_wanted {
my ($self, $qunk) = @_;
my ($revision, $branch_numbers) = @{$qunk}{qw( revision branch_numbers )};
my $follow_branches = $self->{follow_branches};
my $follow_only = $self->{follow_only};
for my $ignore_tag (keys %{$self->{ignore_tags}}) {
return
if defined $qunk->{tags} and grep $_ eq $ignore_tag, @{$qunk->{tags}};
}
if ( keys %{$self->{show_tags}} ) {
for my $show_tag (keys %{$self->{show_tags}}) {
return
if ! defined $qunk->{tags} or ! grep $_ eq $show_tag, @{$qunk->{tags}};
}
}
return 1
unless @$follow_branches + @$follow_only; # no follow is follow all
for my $x (map([$_, 1], @$follow_branches),
map([$_, 0], @$follow_only )) {
my ($branch, $followsub) = @$x;
# Special case for following trunk revisions
return 1
if $branch =~ /^trunk$/i and $revision =~ /^[0-9]+\.[0-9]+$/;
if ( my $branch_number = $branch_numbers->{$branch} ) {
# Are we on one of the follow branches or an ancestor of same?
# If this revision is a prefix of the branch number, or possibly is less
# in the minormost number, OR if this branch number is a prefix of the
# revision, then yes. Otherwise, no.
# So below, we determine if any of those conditions are met.
# Trivial case: is this revision on the branch? (Compare this way to
# avoid regexps that screw up Emacs indentation, argh.)
if ( substr($revision, 0, (length($branch_number) + 1))
eq
($branch_number . ".") ) {
if ( $followsub ) {
return 1;
# } elsif ( length($revision) == length($branch_number)+2 ) {
} elsif ( substr($revision, length($branch_number)+1) =~ /^\d+$/ ) {
return 1;
}
} elsif ( length($branch_number) > length($revision)
and
! $No_Ancestors ) {
# Non-trivial case: check if rev is ancestral to branch
# r_left still has the trailing "."
my ($r_left, $r_end) = ($revision =~ /^((?:\d+\.)+)(\d+)$/);
# b_left still has trailing "."
# b_mid has no trailing "."
my ($b_left, $b_mid) = ($branch_number =~ /^((?:\d+\.)+)(\d+)\.\d+$/);
return 1
if $r_left eq $b_left and $r_end <= $b_mid;
}
}
}
return;
}
# -------------------------------------
sub output_changelog {
my $self = shift; my $class = ref $self;
my ($grand_poobah) = @_;
### Process each ChangeLog
while (my ($dir,$authorhash) = each %$grand_poobah)
{
&main::debug ("DOING DIR: $dir\n");
# Here we twist our hash around, from being
# author => time => message => filelist
# in %$authorhash to
# time => author => message => filelist
# in %changelog.
#
# This is also where we merge entries. The algorithm proceeds
# through the timeline of the changelog with a sliding window of
# $Max_Checkin_Duration seconds; within that window, entries that
# have the same log message are merged.
#
# (To save space, we zap %$authorhash after we've copied
# everything out of it.)
my %changelog;
while (my ($author,$timehash) = each %$authorhash)
{
my %stamptime;
foreach my $time (sort {$a <=> $b} (keys %$timehash))
{
my $msghash = $timehash->{$time};
while (my ($msg,$qunklist) = each %$msghash)
{
my $stamptime = $stamptime{$msg};
if ((defined $stamptime)
and (($time - $stamptime) < $Max_Checkin_Duration)
and (defined $changelog{$stamptime}{$author}{$msg}))
{
push(@{$changelog{$stamptime}{$author}{$msg}}, $qunklist->files);
}
else {
$changelog{$time}{$author}{$msg} = $qunklist->files;
$stamptime{$msg} = $time;
}
}
}
}
undef (%$authorhash);
### Now we can write out the ChangeLog!
my ($logfile_here, $logfile_bak, $tmpfile);
my $lastdate;
if (! $Output_To_Stdout) {
$logfile_here = $dir . $Log_File_Name;
if (!$^O =~ /Win32/i) {
$logfile_here =~ s/^\.\/\//\//; # fix any leading ".//" problem
}
else {
$logfile_here =~ s/^\.\/+//; # remove any leading "./"
}
$tmpfile = "${logfile_here}.cvs2cl$$.tmp";
$logfile_bak = "${logfile_here}.bak";
open (LOG_OUT, ">$tmpfile") or die "Unable to open \"$tmpfile\"";
}
else {
open (LOG_OUT, ">-") or die "Unable to open stdout for writing";
}
print LOG_OUT $ChangeLog_Header;
my %tag_date_printed;
$self->output_header(\*LOG_OUT);
my @key_list = ();
if($Chronological_Order) {
@key_list = sort {$a <=> $b} (keys %changelog);
} else {
@key_list = sort {$b <=> $a} (keys %changelog);
}
foreach my $time (@key_list)
{
next if ($Delta_Mode &&
(($time <= $Delta_StartTime) ||
($time > $Delta_EndTime && $Delta_EndTime)));
# Set up the date/author line.
# kff todo: do some more XML munging here, on the header
# part of the entry:
my (undef,$min,$hour,$mday,$mon,$year,$wday)
= $UTC_Times ? gmtime($time) : localtime($time);
$wday = $self->wday($wday);
# XML output includes everything else, we might as well make
# it always include Day Of Week too, for consistency.
my $authorhash = $changelog{$time};
if ( $Show_Tag_Dates || $XML_Output ) {
my %tags;
while (my ($author,$mesghash) = each %$authorhash) {
while (my ($msg,$qunk) = each %$mesghash) {
for my $qunkref2 (@$qunk) {
if (defined ($qunkref2->tags)) {
for my $tag (@{$qunkref2->tags}) {
$tags{$tag} = 1;
}
}
}
}
}
# Sort here for determinism to ease testing
foreach my $tag (sort keys %tags) {
if ( ! defined $tag_date_printed{$tag} ) {
$tag_date_printed{$tag} = $time;
$self->output_tagdate(\*LOG_OUT, $time, $tag);
}
}
}
while (my ($author,$mesghash) = each %$authorhash)
{
# If XML, escape in outer loop to avoid compound quoting:
$author = $self->escape($author);
FOOBIE:
# We sort here to enable predictable ordering for the testing porpoises
for my $msg (sort keys %$mesghash)
{
my $qunklist = $mesghash->{$msg};
my @qunklist =
grep $self->_revision_is_wanted($_), @$qunklist;
next FOOBIE unless @qunklist;
my $files = $self->pretty_file_list(\@qunklist);
my $header_line; # date and author
my $wholething; # $header_line + $body
my $date = $self->fdatetime($time);
$header_line = $self->header_line($time, $author, $lastdate);
$lastdate = $date;
$Text::Wrap::huge = 'overflow'
if $Text::Wrap::VERSION >= 2001.0130;
# Reshape the body according to user preferences.
my $body = $self->format_body($msg, $files, \@qunklist);
$body =~ s/[ \t]+\n/\n/g;
$wholething = $header_line . $body;
# One last check: make sure it passes the regexp test, if the
# user asked for that. We have to do it here, so that the
# test can match against information in the header as well
# as in the text of the log message.
# How annoying to duplicate so much code just because I
# can't figure out a way to evaluate scalars on the trailing
# operator portion of a regular expression. Grrr.
if ($Case_Insensitive) {
unless ( $Regexp_Gate and ( $wholething !~ /$Regexp_Gate/oi ) ) {
$self->output_entry(\*LOG_OUT, $wholething);
}
}
else {
unless ( $Regexp_Gate and ( $wholething !~ /$Regexp_Gate/o ) ) {
$self->output_entry(\*LOG_OUT, $wholething);
}
}
}
}
}
$self->output_footer(\*LOG_OUT);
close (LOG_OUT);
if ( ! $Output_To_Stdout ) {
# If accumulating, append old data to new before renaming. But
# don't append the most recent entry, since it's already in the
# new log due to CVS's idiosyncratic interpretation of "log -d".
if ($Cumulative && -f $logfile_here) {
open NEW_LOG, ">>$tmpfile"
or die "trouble appending to $tmpfile ($!)";
open OLD_LOG, "<$logfile_here"
or die "trouble reading from $logfile_here ($!)";
my $started_first_entry = 0;
my $passed_first_entry = 0;
while () {
if ( ! $passed_first_entry ) {
if ( ( ! $started_first_entry )
and /^(\d\d\d\d-\d\d-\d\d\s+(\w+\s+)?\d\d:\d\d)/ ) {
$started_first_entry = 1;
} elsif ( /^(\d\d\d\d-\d\d-\d\d\s+(\w+\s+)?\d\d:\d\d)/ ) {
$passed_first_entry = 1;
print NEW_LOG $_;
}
} else {
print NEW_LOG $_;
}
}
close NEW_LOG;
close OLD_LOG;
}
if ( -f $logfile_here ) {
rename $logfile_here, $logfile_bak;
}
rename $tmpfile, $logfile_here;
}
}
}
# -------------------------------------
# Don't call this wrap, because with 5.5.3, that clashes with the
# (unconditional :-( ) export of wrap() from Text::Wrap
sub mywrap {
my $self = shift;
my ($indent1, $indent2, @text) = @_;
# If incoming text looks preformatted, don't get clever
my $text = Text::Wrap::wrap($indent1, $indent2, @text);
if ( grep /^\s+/m, @text ) {
return $text;
}
my @lines = split /\n/, $text;
$indent2 =~ s!^((?: {8})+)!"\t" x (length($1)/8)!e;
$lines[0] =~ s/^$indent1\s+/$indent1/;
s/^$indent2\s+/$indent2/
for @lines[1..$#lines];
my $newtext = join "\n", @lines;
$newtext .= "\n"
if substr($text, -1) eq "\n";
return $newtext;
}
# -------------------------------------
sub preprocess_msg_text {
my $self = shift;
my ($text) = @_;
# Strip out carriage returns (as they probably result from DOSsy editors).
$text =~ s/\r\n/\n/g;
# If it *looks* like two newlines, make it *be* two newlines:
$text =~ s/\n\s*\n/\n\n/g;
return $text;
}
# -------------------------------------
sub last_line_len {
my $self = shift;
my $files_list = shift;
my @lines = split (/\n/, $files_list);
my $last_line = pop (@lines);
return length ($last_line);
}
# -------------------------------------
# A custom wrap function, sensitive to some common constructs used in
# log entries.
sub wrap_log_entry {
my $self = shift;
my $text = shift; # The text to wrap.
my $left_pad_str = shift; # String to pad with on the left.
# These do NOT take left_pad_str into account:
my $length_remaining = shift; # Amount left on current line.
my $max_line_length = shift; # Amount left for a blank line.
my $wrapped_text = ''; # The accumulating wrapped entry.
my $user_indent = ''; # Inherited user_indent from prev line.
my $first_time = 1; # First iteration of the loop?
my $suppress_line_start_match = 0; # Set to disable line start checks.
my @lines = split (/\n/, $text);
while (@lines) # Don't use `foreach' here, it won't work.
{
my $this_line = shift (@lines);
chomp $this_line;
if ($this_line =~ /^(\s+)/) {
$user_indent = $1;
}
else {
$user_indent = '';
}
# If it matches any of the line-start regexps, print a newline now...
if ($suppress_line_start_match)
{
$suppress_line_start_match = 0;
}
elsif (($this_line =~ /^(\s*)\*\s+[a-zA-Z0-9]/)
|| ($this_line =~ /^(\s*)\* [a-zA-Z0-9_\.\/\+-]+/)
|| ($this_line =~ /^(\s*)\([a-zA-Z0-9_\.\/\+-]+(\)|,\s*)/)
|| ($this_line =~ /^(\s+)(\S+)/)
|| ($this_line =~ /^(\s*)- +/)
|| ($this_line =~ /^()\s*$/)
|| ($this_line =~ /^(\s*)\*\) +/)
|| ($this_line =~ /^(\s*)[a-zA-Z0-9](\)|\.|\:) +/))
{
# Make a line break immediately, unless header separator is set
# and this line is the first line in the entry, in which case
# we're getting the blank line for free already and shouldn't
# add an extra one.
unless (($After_Header ne " ") and ($first_time))
{
if ($this_line =~ /^()\s*$/) {
$suppress_line_start_match = 1;
$wrapped_text .= "\n${left_pad_str}";
}
$wrapped_text .= "\n${left_pad_str}";
}
$length_remaining = $max_line_length - (length ($user_indent));
}
# Now that any user_indent has been preserved, strip off leading
# whitespace, so up-folding has no ugly side-effects.
$this_line =~ s/^\s*//;
# Accumulate the line, and adjust parameters for next line.
my $this_len = length ($this_line);
if ($this_len == 0)
{
# Blank lines should cancel any user_indent level.
$user_indent = '';
$length_remaining = $max_line_length;
}
elsif ($this_len >= $length_remaining) # Line too long, try breaking it.
{
# Walk backwards from the end. At first acceptable spot, break
# a new line.
my $idx = $length_remaining - 1;
if ($idx < 0) { $idx = 0 };
while ($idx > 0)
{
if (substr ($this_line, $idx, 1) =~ /\s/)
{
my $line_now = substr ($this_line, 0, $idx);
my $next_line = substr ($this_line, $idx);
$this_line = $line_now;
# Clean whitespace off the end.
chomp $this_line;
# The current line is ready to be printed.
$this_line .= "\n${left_pad_str}";
# Make sure the next line is allowed full room.
$length_remaining = $max_line_length - (length ($user_indent));
# Strip next_line, but then preserve any user_indent.
$next_line =~ s/^\s*//;
# Sneak a peek at the user_indent of the upcoming line, so
# $next_line (which will now precede it) can inherit that
# indent level. Otherwise, use whatever user_indent level
# we currently have, which might be none.
my $next_next_line = shift (@lines);
if ((defined ($next_next_line)) && ($next_next_line =~ /^(\s+)/)) {
$next_line = $1 . $next_line if (defined ($1));
# $length_remaining = $max_line_length - (length ($1));
$next_next_line =~ s/^\s*//;
}
else {
$next_line = $user_indent . $next_line;
}
if (defined ($next_next_line)) {
unshift (@lines, $next_next_line);
}
unshift (@lines, $next_line);
# Our new next line might, coincidentally, begin with one of
# the line-start regexps, so we temporarily turn off
# sensitivity to that until we're past the line.
$suppress_line_start_match = 1;
last;
}
else
{
$idx--;
}
}
if ($idx == 0)
{
# We bottomed out because the line is longer than the
# available space. But that could be because the space is
# small, or because the line is longer than even the maximum
# possible space. Handle both cases below.
if ($length_remaining == ($max_line_length - (length ($user_indent))))
{
# The line is simply too long -- there is no hope of ever
# breaking it nicely, so just insert it verbatim, with
# appropriate padding.
$this_line = "\n${left_pad_str}${this_line}";
}
else
{
# Can't break it here, but may be able to on the next round...
unshift (@lines, $this_line);
$length_remaining = $max_line_length - (length ($user_indent));
$this_line = "\n${left_pad_str}";
}
}
}
else # $this_len < $length_remaining, so tack on what we can.
{
# Leave a note for the next iteration.
$length_remaining = $length_remaining - $this_len;
if ($this_line =~ /\.$/)
{
$this_line .= " ";
$length_remaining -= 2;
}
else # not a sentence end
{
$this_line .= " ";
$length_remaining -= 1;
}
}
# Unconditionally indicate that loop has run at least once.
$first_time = 0;
$wrapped_text .= "${user_indent}${this_line}";
}
# One last bit of padding.
$wrapped_text .= "\n";
return $wrapped_text;
}
# -------------------------------------
sub _pretty_file_list {
my $self = shift;
my ($unanimous_tags, $non_unanimous_tags, $all_branches, $qunksref) = @_;
my @qunkrefs =
grep +( ( ! $_->tags_exists
or
! grep exists $ignore_tags{$_}, @{$_->tags})
and
( ! keys %show_tags
or
( $_->tags_exists
and
grep exists $show_tags{$_}, @{$_->tags} )
)
),
@$qunksref;
my $common_dir; # Dir prefix common to all files ('' if none)
# First, loop over the qunks gathering all the tag/branch names.
# We'll put them all in non_unanimous_tags, and take out the
# unanimous ones later.
QUNKREF:
foreach my $qunkref (@qunkrefs)
{
# Keep track of whether all the files in this commit were in the
# same directory, and memorize it if so. We can make the output a
# little more compact by mentioning the directory only once.
if ($Common_Dir && (scalar (@qunkrefs)) > 1)
{
if (! (defined ($common_dir)))
{
my ($base, $dir);
($base, $dir, undef) = fileparse ($qunkref->filename);
if ((! (defined ($dir))) # this first case is sheer paranoia
or ($dir eq '')
or ($dir eq "./")
or ($dir eq ".\\"))
{
$common_dir = '';
}
else
{
$common_dir = $dir;
}
}
elsif ($common_dir ne '')
{
# Already have a common dir prefix, so how much of it can we preserve?
$common_dir = &main::common_path_prefix ($qunkref->filename, $common_dir);
}
}
else # only one file in this entry anyway, so common dir not an issue
{
$common_dir = '';
}
if (defined ($qunkref->branch)) {
$all_branches->{$qunkref->branch} = 1;
}
if (defined ($qunkref->tags)) {
foreach my $tag (@{$qunkref->tags}) {
$non_unanimous_tags->{$tag} = 1;
}
}
}
# Any tag held by all qunks will be printed specially... but only if
# there are multiple qunks in the first place!
if ((scalar (@qunkrefs)) > 1) {
foreach my $tag (keys (%$non_unanimous_tags)) {
my $everyone_has_this_tag = 1;
foreach my $qunkref (@qunkrefs) {
if ((! (defined ($qunkref->tags)))
or (! (grep ($_ eq $tag, @{$qunkref->tags})))) {
$everyone_has_this_tag = 0;
}
}
if ($everyone_has_this_tag) {
$unanimous_tags->{$tag} = 1;
delete $non_unanimous_tags->{$tag};
}
}
}
return $common_dir, \@qunkrefs;
}
# -------------------------------------
sub fdatetime {
my $self = shift;
my ($year, $mday, $mon, $wday, $hour, $min);
if ( @_ > 1 ) {
($year, $mday, $mon, $wday, $hour, $min) = @_;
} else {
my ($time) = @_;
(undef, $min, $hour, $mday, $mon, $year, $wday) =
$UTC_Times ? gmtime($time) : localtime($time);
$year += 1900;
$mon += 1;
$wday = $self->wday($wday);
}
my $fdate = $self->fdate($year, $mon, $mday, $wday);
if ($Show_Times) {
my $ftime = $self->ftime($hour, $min);
return "$fdate $ftime";
} else {
return $fdate;
}
}
# -------------------------------------
sub fdate {
my $self = shift;
my ($year, $mday, $mon, $wday);
if ( @_ > 1 ) {
($year, $mon, $mday, $wday) = @_;
} else {
my ($time) = @_;
(undef, undef, undef, $mday, $mon, $year, $wday) =
$UTC_Times ? gmtime($time) : localtime($time);
$year += 1900;
$mon += 1;
$wday = $self->wday($wday);
}
return sprintf '%4u-%02u-%02u%s', $year, $mon, $mday, $wday;
}
# -------------------------------------
sub ftime {
my $self = shift;
my ($hour, $min);
if ( @_ > 1 ) {
($hour, $min) = @_;
} else {
my ($time) = @_;
(undef, $min, $hour) = $UTC_Times ? gmtime($time) : localtime($time);
}
return sprintf '%02u:%02u', $hour, $min;
}
# ----------------------------------------------------------------------------
package CVS::Utils::ChangeLog::Message;
sub new {
my $class = shift;
my ($msg) = @_;
my %self = (msg => $msg, files => []);
bless \%self, $class;
}
sub add_fileentry {
my $self = shift;
my ($fileentry) = @_;
die "Not a fileentry: $fileentry"
unless $fileentry->isa('CVS::Utils::ChangeLog::FileEntry');
push @{$self->{files}}, $fileentry;
}
sub files { wantarray ? @{$_[0]->{files}} : $_[0]->{files} }
# ----------------------------------------------------------------------------
package CVS::Utils::ChangeLog::FileEntry;
use File::Basename qw( fileparse );
# Each revision of a file has a little data structure (a `qunk')
# associated with it. That data structure holds not only the
# file's name, but any additional information about the file
# that might be needed in the output, such as the revision
# number, tags, branches, etc. The reason to have these things
# arranged in a data structure, instead of just appending them
# textually to the file's name, is that we may want to do a
# little rearranging later as we write the output. For example,
# all the files on a given tag/branch will go together, followed
# by the tag in parentheses (so trunk or otherwise non-tagged
# files would go at the end of the file list for a given log
# message). This rearrangement is a lot easier to do if we
# don't have to reparse the text.
#
# A qunk looks like this:
#
# {
# filename => "hello.c",
# revision => "1.4.3.2",
# time => a timegm() return value (moment of commit)
# tags => [ "tag1", "tag2", ... ],
# branch => "branchname" # There should be only one, right?
# roots => [ "branchtag1", "branchtag2", ... ]
# lines => "+x -y" # or undefined; x and y are integers
# }
# Single top-level ChangeLog, or one per subdirectory?
my $distributed;
sub distributed { $#_ ? ($distributed = $_[1]) : $distributed; }
sub new {
my $class = shift;
my ($path, $time, $revision, $state, $lines,
$branch_names, $branch_roots, $branch_numbers, $symbolic_names) = @_;
my %self = (time => $time,
revision => $revision,
state => $state,
lines => $lines,
branch_numbers => $branch_numbers,
);
if ( $distributed ) {
@self{qw(filename dir_key)} = fileparse($path);
} else {
@self{qw(filename dir_key)} = ($path, './');
}
{ # Scope for $branch_prefix
(my ($branch_prefix) = ($revision =~ /((?:\d+\.)+)\d+/));
$branch_prefix =~ s/\.$//;
if ( $branch_names->{$branch_prefix} ) {
my $branch_name = $branch_names->{$branch_prefix};
$self{branch} = $branch_name;
$self{branches} = [$branch_name];
}
while ( $branch_prefix =~ s/^(\d+(?:\.\d+\.\d+)+)\.\d+\.\d+$/$1/ ) {
push @{$self{branches}}, $branch_names->{$branch_prefix}
if exists $branch_names->{$branch_prefix};
}
}
# If there's anything in the @branch_roots array, then this
# revision is the root of at least one branch. We'll display
# them as branch names instead of revision numbers, the
# substitution for which is done directly in the array:
$self{'roots'} = [ map { $branch_names->{$_} } @$branch_roots ]
if @$branch_roots;
if ( exists $symbolic_names->{$revision} ) {
$self{tags} = delete $symbolic_names->{$revision};
&main::delta_check($time, $self{tags});
}
bless \%self, $class;
}
sub filename { $_[0]->{filename} }
sub dir_key { $_[0]->{dir_key} }
sub revision { $_[0]->{revision} }
sub branch { $_[0]->{branch} }
sub state { $_[0]->{state} }
sub lines { $_[0]->{lines} }
sub roots { $_[0]->{roots} }
sub branch_numbers { $_[0]->{branch_numbers} }
sub tags { $_[0]->{tags} }
sub tags_exists {
exists $_[0]->{tags};
}
# This may someday be used in a more sophisticated calculation of what other
# files are involved in this commit. For now, we don't use it much except for
# delta mode, because the common-commit-detection algorithm is hypothesized to
# be "good enough" as it stands.
sub time { $_[0]->{time} }
# ----------------------------------------------------------------------------
package CVS::Utils::ChangeLog::EntrySetBuilder;
use File::Basename qw( fileparse );
use Time::Local qw( timegm );
use constant MAILNAME => "/etc/mailname";
# In 'cvs log' output, one long unbroken line of equal signs separates files:
use constant FILE_SEPARATOR => '=' x 77;# . "\n";
# In 'cvs log' output, a shorter line of dashes separates log messages within
# a file:
use constant REV_SEPARATOR => '-' x 28;# . "\n";
use constant EMPTY_LOG_MESSAGE => '*** empty log message ***';
# -------------------------------------
sub new {
my ($proto) = @_;
my $class = ref $proto || $proto;
my $poobah = CVS::Utils::ChangeLog::EntrySet->new;
my $self = bless +{ grand_poobah => $poobah }, $class;
$self->clear_file;
$self->maybe_read_user_map_file;
return $self;
}
# -------------------------------------
sub clear_msg {
my ($self) = @_;
# Make way for the next message
undef $self->{rev_msg};
undef $self->{rev_time};
undef $self->{rev_revision};
undef $self->{rev_author};
undef $self->{rev_state};
undef $self->{lines};
$self->{rev_branch_roots} = []; # For showing which files are branch
# ancestors.
$self->{collecting_symbolic_names} = 0;
}
# -------------------------------------
sub clear_file {
my ($self) = @_;
$self->clear_msg;
undef $self->{filename};
$self->{branch_names} = +{}; # We'll grab branch names while we're
# at it.
$self->{branch_numbers} = +{}; # Save some revisions for
# @Follow_Branches
$self->{symbolic_names} = +{}; # Where tag names get stored.
}
# -------------------------------------
sub grand_poobah { $_[0]->{grand_poobah} }
# -------------------------------------
sub read_changelog {
my ($self, $command) = @_;
local (*READER);
my $pid;
if (! $Input_From_Stdin) {
if ($^O =~ /Win32/i) {
open (READER, "@$command |")
or die "unable to run \"@$command\"";
}
else {
local (*WRITER);
pipe(READER, WRITER)
or die "Couldn't form pipe: $!\n";
$pid = fork;
if (! defined $pid) {
die "Couldn't fork: $!\n";
}
if ( ! $pid ) { # child
open STDOUT, '>&=' . fileno WRITER
or die "Couldn't dup stderr to ", fileno WRITER, "\n";
# strangely, some perls give spurious warnings about STDIN being opened
# for output only these close calls precede the STDOUT reopen above.
# I think they must be reusing fd 1.
close READER;
close STDIN;
exec @$command;
}
close WRITER;
}
&main::debug ("(run \"@$command\")\n");
}
else {
open READER, '-' or die "unable to open stdin for reading";
}
binmode READER;
XX_Log_Source:
while () {
chomp;
s!\r$!!;
# If on a new file and don't see filename, skip until we find it, and
# when we find it, grab it.
if ( ! defined $self->{filename} ) {
$self->read_file_path($_);
} elsif ( /^symbolic names:$/ ) {
$self->{collecting_symbolic_names} = 1;
} elsif ( $self->{collecting_symbolic_names} ) {
$self->read_symbolic_name($_);
} elsif ( $_ eq FILE_SEPARATOR and ! defined $self->{rev_revision} ) {
$self->clear_file;
} elsif ( ! defined $self->{rev_revision} ) {
# If have file name, but not revision, and see revision, then grab
# it. (We collect unconditionally, even though we may or may not
# ever use it.)
$self->read_revision($_);
} elsif ( ! defined $self->{rev_time} ) { # and /^date: /) {
$self->read_date_author_and_state($_);
} elsif ( /^branches:\s+(.*);$/ ) {
$self->read_branches($1);
} elsif ( ! ( $_ eq FILE_SEPARATOR or $_ eq REV_SEPARATOR ) ) {
# If have file name, time, and author, then we're just grabbing
# log message texts:
$self->{rev_msg} .= $_ . "\n"; # Normally, just accumulate the message...
} else {
my $noadd = 0;
if ( ! $self->{rev_msg}
or $self->{rev_msg} =~ /^\s*(\.\s*)?$/
or index($self->{rev_msg}, EMPTY_LOG_MESSAGE) > -1 ) {
# ... until a msg separator is encountered:
# Ensure the message contains something:
$self->clear_msg, $noadd = 1
if $Prune_Empty_Msgs;
$self->{rev_msg} = "[no log message]\n";
}
$self->add_file_entry
unless $noadd;
if ( $_ eq FILE_SEPARATOR ) {
$self->clear_file;
} else {
$self->clear_msg;
}
}
}
close READER
or die "Couldn't close pipe reader: $!\n";
if ( defined $pid ) {
my $rv;
waitpid $pid, 0;
0 == $?
or $!=1, die sprintf("Problem reading log input (pid/exit/signal/core: %d/%d/%d/%d)\n",
$pid, $? >> 8, $? & 127, $? & 128);
}
return;
}
# -------------------------------------
sub add_file_entry {
$_[0]->grand_poobah->add_fileentry(@{$_[0]}{qw(filename rev_time rev_revision
rev_state lines branch_names
rev_branch_roots
branch_numbers
symbolic_names
rev_author rev_msg)});
}
# -------------------------------------
sub maybe_read_user_map_file {
my ($self) = @_;
my %expansions;
my $User_Map_Input;
if ($User_Map_File)
{
if ( $User_Map_File =~ m{^([-\w\@+=.,\/]+):([-\w\@+=.,\/:]+)} and
!-f $User_Map_File )
{
my $rsh = (exists $ENV{'CVS_RSH'} ? $ENV{'CVS_RSH'} : 'ssh');
$User_Map_Input = "$rsh $1 'cat $2' |";
&main::debug ("(run \"${User_Map_Input}\")\n");
}
else
{
$User_Map_Input = "<$User_Map_File";
}
open (MAPFILE, $User_Map_Input)
or die ("Unable to open $User_Map_File ($!)");
while ()
{
next if /^\s*#/; # Skip comment lines.
next if not /:/; # Skip lines without colons.
# It is now safe to split on ':'.
my ($username, $expansion) = split ':';
chomp $expansion;
$expansion =~ s/^'(.*)'$/$1/;
$expansion =~ s/^"(.*)"$/$1/;
# If it looks like the expansion has a real name already, then
# we toss the username we got from CVS log. Otherwise, keep
# it to use in combination with the email address.
if ($expansion =~ /^\s*<{0,1}\S+@.*/) {
# Also, add angle brackets if none present
if (! ($expansion =~ /<\S+@\S+>/)) {
$expansions{$username} = "$username <$expansion>";
}
else {
$expansions{$username} = "$username $expansion";
}
}
else {
$expansions{$username} = $expansion;
}
} # fi ($User_Map_File)
close (MAPFILE);
}
if (defined $User_Passwd_File)
{
if ( ! defined $Domain ) {
if ( -e MAILNAME ) {
chomp($Domain = slurp_file(MAILNAME));
} else {
MAILDOMAIN_CMD:
for ([qw(hostname -d)], 'dnsdomainname', 'domainname') {
my ($text, $exit, $sig, $core) = run_ext($_);
if ( $exit == 0 && $sig == 0 && $core == 0 ) {
chomp $text;
if ( length $text ) {
$Domain = $text;
last MAILDOMAIN_CMD;
}
}
}
}
}
die "No mail domain found\n"
unless defined $Domain;
open (MAPFILE, "<$User_Passwd_File")
or die ("Unable to open $User_Passwd_File ($!)");
while ()
{
# all lines are valid
my ($username, $pw, $uid, $gid, $gecos, $homedir, $shell) = split ':';
my $expansion = '';
($expansion) = split (',', $gecos)
if defined $gecos && length $gecos;
my $mailname = $Domain eq '' ? $username : "$username\@$Domain";
$expansions{$username} = "$expansion <$mailname>";
}
close (MAPFILE);
}
$self->{usermap} = \%expansions;
}
# -------------------------------------
sub read_file_path {
my ($self, $line) = @_;
my $path;
if ( $line =~ /^Working file: (.*)/ ) {
$path = $1;
} elsif ( defined $RCS_Root
and
$line =~ m|^RCS file: $RCS_Root[/\\](.*),v$| ) {
$path = $1;
$path =~ s!Attic/!!;
} else {
return;
}
if ( @Ignore_Files ) {
my $base;
($base, undef, undef) = fileparse($path);
my $xpath = $Case_Insensitive ? lc($path) : $path;
return
if grep $path =~ /$_/, @Ignore_Files;
}
$self->{filename} = $path;
return;
}
# -------------------------------------
sub read_symbolic_name {
my ($self, $line) = @_;
# All tag names are listed with whitespace in front in cvs log
# output; so if see non-whitespace, then we're done collecting.
if ( /^\S/ ) {
$self->{collecting_symbolic_names} = 0;
return;
} else {
# we're looking at a tag name, so parse & store it
# According to the Cederqvist manual, in node "Tags", tag names must start
# with an uppercase or lowercase letter and can contain uppercase and
# lowercase letters, digits, `-', and `_'. However, it's not our place to
# enforce that, so we'll allow anything CVS hands us to be a tag:
my ($tag_name, $tag_rev) = ($line =~ /^\s+([^:]+): ([\d.]+)$/);
# A branch number either has an odd number of digit sections
# (and hence an even number of dots), or has ".0." as the
# second-to-last digit section. Test for these conditions.
my $real_branch_rev = '';
if ( $tag_rev =~ /^(\d+\.\d+\.)+\d+$/ # Even number of dots...
and
$tag_rev !~ /^(1\.)+1$/ ) { # ...but not "1.[1.]1"
$real_branch_rev = $tag_rev;
} elsif ($tag_rev =~ /(\d+\.(\d+\.)+)0.(\d+)/) { # Has ".0."
$real_branch_rev = $1 . $3;
}
# If we got a branch, record its number.
if ( $real_branch_rev ) {
$self->{branch_names}->{$real_branch_rev} = $tag_name;
$self->{branch_numbers}->{$tag_name} = $real_branch_rev;
} else {
# Else it's just a regular (non-branch) tag.
push @{$self->{symbolic_names}->{$tag_rev}}, $tag_name;
}
}
$self->{collecting_symbolic_names} = 1;
return;
}
# -------------------------------------
sub read_revision {
my ($self, $line) = @_;
my ($revision) = ( $line =~ /^revision (\d+\.[\d.]+)/ );
return
unless $revision;
$self->{rev_revision} = $revision;
return;
}
# -------------------------------------
{ # Closure over %gecos_warned
my %gecos_warned;
sub read_date_author_and_state {
my ($self, $line) = @_;
my ($time, $author, $state) = $self->parse_date_author_and_state($line);
if ( defined($self->{usermap}->{$author}) and $self->{usermap}->{$author} ) {
$author = $self->{usermap}->{$author};
} elsif ( defined $Domain or $Gecos == 1 ) {
my $email = $author;
$email = $author."@".$Domain
if defined $Domain && $Domain ne '';
my $pw = getpwnam($author);
my ($fullname, $office, $workphone, $homephone, $gcos);
if ( defined $pw ) {
$gcos = (getpwnam($author))[6];
($fullname, $office, $workphone, $homephone) =
split /\s*,\s*/, $gcos;
} else {
warn "Couldn't find gecos info for author '$author'\n"
unless $gecos_warned{$author}++;
$fullname = '';
}
for (grep defined, $fullname, $office, $workphone, $homephone) {
s/&/ucfirst(lc($pw))/ge;
}
$author = $fullname . " <" . $email . ">"
if defined $fullname && $fullname ne '';
}
$self->{rev_state} = $state;
$self->{rev_time} = $time;
$self->{rev_author} = $author;
return;
}
}
# -------------------------------------
sub read_branches {
# A "branches: ..." line here indicates that one or more branches
# are rooted at this revision. If we're showing branches, then we
# want to show that fact as well, so we collect all the branches
# that this is the latest ancestor of and store them in
# $self->[rev_branch_roots}. Just for reference, the format of the
# line we're seeing at this point is:
#
# branches: 1.5.2; 1.5.4; ...;
#
# Okay, here goes:
my ($self, $line) = @_;
# Ugh. This really bothers me. Suppose we see a log entry
# like this:
#
# ----------------------------
# revision 1.1
# date: 1999/10/17 03:07:38; author: jrandom; state: Exp;
# branches: 1.1.2;
# Intended first line of log message begins here.
# ----------------------------
#
# The question is, how we can tell the difference between that
# log message and a *two*-line log message whose first line is
#
# "branches: 1.1.2;"
#
# See the problem? The output of "cvs log" is inherently
# ambiguous.
#
# For now, we punt: we liberally assume that people don't
# write log messages like that, and just toss a "branches:"
# line if we see it but are not showing branches. I hope no
# one ever loses real log data because of this.
if ( $Show_Branches ) {
$line =~ s/(1\.)+1;|(1\.)+1$//; # ignore the trivial branch 1.1.1
$self->{rev_branch_roots} = [split /;\s+/, $line]
if length $line;
}
}
# -------------------------------------
sub parse_date_author_and_state {
my ($self, $line) = @_;
# Parses the date/time and author out of a line like:
#
# date: 1999/02/19 23:29:05; author: apharris; state: Exp;
#
# or, in CVS 1.12.9:
#
# date: 2004-06-05 16:10:32 +0000; author: somebody; state: Exp;
my ($year, $mon, $mday, $hours, $min, $secs, $utcOffset, $author, $state, $rest) =
$line =~
m!(\d+)[-/](\d+)[-/](\d+)\s+(\d+):(\d+):(\d+)(\s+[+-]\d{4})?;\s+
author:\s+([^;]+);\s+state:\s+([^;]+);(.*)!x
or die "Couldn't parse date ``$line''";
die "Bad date or Y2K issues"
unless $year > 1969 and $year < 2258;
# Kinda arbitrary, but useful as a sanity check
my $time = timegm($secs, $min, $hours, $mday, $mon-1, $year-1900);
if ( defined $utcOffset ) {
my ($plusminus, $hour, $minute) = ($utcOffset =~ m/([+-])(\d\d)(\d\d)/);
my $offset = (($hour * 60) + $minute) * 60 * ($plusminus eq '+' ? -1 : 1);
$time += $offset;
}
if ( $rest =~ m!\s+lines:\s+(.*)! ) {
$self->{lines} = $1;
}
return $time, $author, $state;
}
# Subrs ----------------------------------------------------------------------
package main;
sub delta_check {
my ($time, $tags) = @_;
# If we're in 'delta' mode, update the latest observed times for the
# beginning and ending tags, and when we get around to printing output, we
# will simply restrict ourselves to that timeframe...
return
unless $Delta_Mode;
$Delta_StartTime = $time
if $time > $Delta_StartTime and $Delta_From and grep { $_ eq $Delta_From } @$tags;
$Delta_EndTime = $time
if $time > $Delta_EndTime and $Delta_To and grep { $_ eq $Delta_To } @$tags;
}
sub run_ext {
my ($cmd) = @_;
$cmd = [$cmd]
unless ref $cmd;
local $" = ' ';
my $out = qx"@$cmd 2>&1";
my $rv = $?;
my ($sig, $core, $exit) = ($? & 127, $? & 128, $? >> 8);
return $out, $exit, $sig, $core;
}
# -------------------------------------
# If accumulating, grab the boundary date from pre-existing ChangeLog.
sub maybe_grab_accumulation_date {
if (! $Cumulative || $Update) {
return '';
}
# else
open (LOG, "$Log_File_Name")
or die ("trouble opening $Log_File_Name for reading ($!)");
my $boundary_date;
while ()
{
if (/^(\d\d\d\d-\d\d-\d\d\s+(\w+\s+)?\d\d:\d\d)/)
{
$boundary_date = "$1";
last;
}
}
close (LOG);
# convert time from utc to local timezone if the ChangeLog has
# dates/times in utc
if ($UTC_Times && $boundary_date)
{
# convert the utc time to a time value
my ($year,$mon,$mday,$hour,$min) = $boundary_date =~
m#(\d+)-(\d+)-(\d+)\s+(\d+):(\d+)#;
my $time = timegm(0,$min,$hour,$mday,$mon-1,$year-1900);
# print the timevalue in the local timezone
my ($ignore,$wday);
($ignore,$min,$hour,$mday,$mon,$year,$wday) = localtime($time);
$boundary_date=sprintf ("%4u-%02u-%02u %02u:%02u",
$year+1900,$mon+1,$mday,$hour,$min);
}
return $boundary_date;
}
# -------------------------------------
# Fills up a ChangeLog structure in the current directory.
sub derive_changelog {
my ($command) = @_;
# See "The Plan" above for a full explanation.
# Might be adding to an existing ChangeLog
my $accumulation_date = maybe_grab_accumulation_date;
if ($accumulation_date) {
# Insert -d immediately after 'cvs log'
my $Log_Date_Command = "-d>${accumulation_date}";
my ($log_index) = grep $command->[$_] eq 'log', 0..$#$command;
splice @$command, $log_index+1, 0, $Log_Date_Command;
&debug ("(adding log msg starting from $accumulation_date)\n");
}
# output_changelog(read_changelog($command));
my $builder = CVS::Utils::ChangeLog::EntrySetBuilder->new;
$builder->read_changelog($command);
$builder->grand_poobah->output_changelog;
}
# -------------------------------------
sub min { $_[0] < $_[1] ? $_[0] : $_[1] }
# -------------------------------------
sub common_path_prefix {
my ($path1, $path2) = @_;
# For compatibility (with older versions of cvs2cl.pl), we think in UN*X
# terms, and mould windoze filenames to match. Is this really appropriate?
# If a file is checked in under UN*X, and cvs log run on windoze, which way
# do the path separators slope? Can we use fileparse as per the local
# conventions? If so, we should probably have a user option to specify an
# OS to emulate to handle stdin-fed logs. If we did this, we could avoid
# the nasty \-/ transmogrification below.
my ($dir1, $dir2) = map +(fileparse($_))[1], $path1, $path2;
# Transmogrify Windows filenames to look like Unix.
# (It is far more likely that someone is running cvs2cl.pl under
# Windows than that they would genuinely have backslashes in their
# filenames.)
tr!\\!/!
for $dir1, $dir2;
my ($accum1, $accum2, $last_common_prefix) = ('') x 3;
my @path1 = grep length($_), split qr!/!, $dir1;
my @path2 = grep length($_), split qr!/!, $dir2;
my @common_path;
for (0..min($#path1,$#path2)) {
if ( $path1[$_] eq $path2[$_]) {
push @common_path, $path1[$_];
} else {
last;
}
}
return join '', map "$_/", @common_path;
}
# -------------------------------------
sub parse_options {
# Check this internally before setting the global variable.
my $output_file;
# If this gets set, we encountered unknown options and will exit at
# the end of this subroutine.
my $exit_with_admonishment = 0;
# command to generate the log
my @log_source_command = qw( cvs log );
my (@Global_Opts, @Local_Opts);
Getopt::Long::Configure(qw( bundling permute no_getopt_compat
pass_through no_ignore_case ));
GetOptions('help|usage|h' => \$Print_Usage,
'debug' => \$Debug, # unadvertised option, heh
'version' => \$Print_Version,
'file|f=s' => \$output_file,
'accum' => \$Cumulative,
'update' => \$Update,
'fsf' => \$FSF_Style,
'rcs=s' => \$RCS_Root,
'usermap|U=s' => \$User_Map_File,
'gecos' => \$Gecos,
'domain=s' => \$Domain,
'passwd=s' => \$User_Passwd_File,
'window|W=i' => \$Max_Checkin_Duration,
'chrono' => \$Chronological_Order,
'ignore|I=s' => \@Ignore_Files,
'case-insensitive|C' => \$Case_Insensitive,
'regexp|R=s' => \$Regexp_Gate,
'stdin' => \$Input_From_Stdin,
'stdout' => \$Output_To_Stdout,
'distributed|d' => sub { CVS::Utils::ChangeLog::FileEntry->distributed(1) },
'prune|P' => \$Prune_Empty_Msgs,
'no-wrap' => \$No_Wrap,
'gmt|utc' => \$UTC_Times,
'day-of-week|w' => \$Show_Day_Of_Week,
'revisions|r' => \$Show_Revisions,
'show-dead' => \$Show_Dead,
'tags|t' => \$Show_Tags,
'tagdates|T' => \$Show_Tag_Dates,
'branches|b' => \$Show_Branches,
'follow|F=s' => \@Follow_Branches,
'follow-only=s' => \@Follow_Only,
'xml-encoding=s' => \$XML_Encoding,
'xml-stylesheet=s' => \$XML_Stylesheet,
'xml' => \$XML_Output,
'noxmlns' => \$No_XML_Namespace,
'no-xml-iso-date' => \$No_XML_ISO_Date,
'no-ancestors' => \$No_Ancestors,
'lines-modified' => \$Show_Lines_Modified,
'no-indent' => sub {
$Indent = '';
},
'summary' => sub {
$Summary = 1;
$After_Header = "\n\n"; # Summary implies --separate-header
},
'no-times' => sub {
$Show_Times = 0;
},
'no-hide-branch-additions' => sub {
$Hide_Branch_Additions = 0;
},
'no-common-dir' => sub {
$Common_Dir = 0;
},
'ignore-tag=s' => sub {
$ignore_tags{$_[1]} = 1;
},
'show-tag=s' => sub {
$show_tags{$_[1]} = 1;
},
# Deliberately undocumented. This is not a public interface, and
# may change/disappear at any time.
'test-code=s' => \$TestCode,
'delta=s' => sub {
my $arg = $_[1];
if ( $arg =~
/^([A-Za-z][A-Za-z0-9_\-\]\[\.]*)?:([A-Za-z][A-Za-z0-9_\-\]\[\.]*)?$/ )
{
$Delta_From = $1;
$Delta_To = $2;
$Delta_Mode = 1;
} else {
die "--delta FROM_TAG:TO_TAG is what you meant to say.\n";
}
},
'FSF' => sub {
$FSF_Output = 1;
$Show_Times = 0;
$Common_Dir = 0;
$No_Extra_Indent = 1;
$Indent = "\t";
},
'header=s' => sub {
my $narg = $_[1];
$ChangeLog_Header = &slurp_file ($narg);
if (! defined ($ChangeLog_Header)) {
$ChangeLog_Header = '';
}
},
'global-opts|g=s' => sub {
my $narg = $_[1];
push @Global_Opts, $narg;
splice @log_source_command, 1, 0, $narg;
},
'log-opts|l=s' => sub {
my $narg = $_[1];
push @Local_Opts, $narg;
push @log_source_command, $narg;
},
'mailname=s' => sub {
my $narg = $_[1];
warn "--mailname is deprecated; please use --domain instead\n";
$Domain = $narg;
},
'separate-header|S' => sub {
$After_Header = "\n\n";
$No_Extra_Indent = 1;
},
'group-within-date' => sub {
$GroupWithinDate = 1;
$Show_Times = 0;
},
'hide-filenames' => sub {
$Hide_Filenames = 1;
$After_Header = '';
},
)
or die "options parsing failed\n";
push @log_source_command, map "$_", @ARGV;
## Check for contradictions...
if ($Output_To_Stdout && CVS::Utils::ChangeLog::FileEntry->distributed) {
print STDERR "cannot pass both --stdout and --distributed\n";
$exit_with_admonishment = 1;
}
if ($Output_To_Stdout && $output_file) {
print STDERR "cannot pass both --stdout and --file\n";
$exit_with_admonishment = 1;
}
if ($Input_From_Stdin && @Global_Opts) {
print STDERR "cannot pass both --stdin and -g\n";
$exit_with_admonishment = 1;
}
if ($Input_From_Stdin && @Local_Opts) {
print STDERR "cannot pass both --stdin and -l\n";
$exit_with_admonishment = 1;
}
if ($XML_Output && $Cumulative) {
print STDERR "cannot pass both --xml and --accum\n";
$exit_with_admonishment = 1;
}
if ($FSF_Output && $Cumulative) {
print STDERR "cannot pass both --FSF and --accum\n";
$exit_with_admonishment = 1;
}
# Other consistency checks and option-driven logic
# Bleargh. Compensate for a deficiency of custom wrapping.
if ( ($After_Header ne " ") and $FSF_Style ) {
$After_Header .= "\t";
}
@Ignore_Files = map lc, @Ignore_Files
if $Case_Insensitive;
# Or if any other error message has already been printed out, we
# just leave now:
if ($exit_with_admonishment) {
&usage ();
exit (1);
}
elsif ($Print_Usage) {
&usage ();
exit (0);
}
elsif ($Print_Version) {
&version ();
exit (0);
}
## Else no problems, so proceed.
if ($output_file) {
$Log_File_Name = $output_file;
}
return \@log_source_command;
}
# -------------------------------------
sub slurp_file {
my $filename = shift || die ("no filename passed to slurp_file()");
my $retstr;
open (SLURPEE, "<${filename}") or die ("unable to open $filename ($!)");
local $/ = undef;
$retstr = ;
close (SLURPEE);
return $retstr;
}
# -------------------------------------
sub debug {
if ($Debug) {
my $msg = shift;
print STDERR $msg;
}
}
# -------------------------------------
sub version {
print "cvs2cl.pl version ${VERSION}; distributed under the GNU GPL.\n";
}
# -------------------------------------
sub usage {
&version ();
eval "use Pod::Usage qw( pod2usage )";
if ( $@ ) {
print <<'END';
* Pod::Usage was not found. The formatting may be suboptimal. Consider
upgrading your Perl --- Pod::Usage is standard from 5.6 onwards, and
versions of perl prior to 5.6 are getting rather rusty, now. Alternatively,
install Pod::Usage direct from CPAN.
END
local $/ = undef;
my $message = ;
$message =~ s/^=(head1|item) //gm;
$message =~ s/^=(over|back).*\n//gm;
$message =~ s/\n{3,}/\n\n/g;
print $message;
} else {
print "\n";
pod2usage( -exitval => 'NOEXIT',
-verbose => 1,
-output => \*STDOUT,
);
}
return;
}
# Main -----------------------------------------------------------------------
my $log_source_command = parse_options;
if ( defined $TestCode ) {
eval $TestCode;
die "Eval failed: '$@'\n"
if $@;
} else {
derive_changelog($log_source_command);
}
__DATA__
=head1 NAME
cvs2cl.pl - convert cvs log messages to changelogs
=head1 SYNOPSIS
B [I] [I [I ...]]
=head1 DESCRIPTION
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 B<--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.
=head1 OPTIONS
=over 4
=item B<-h>, B<-help>, B<--help>, B<-?>
Show a short help and exit.
=item B<--version>
Show version and exit.
=item B<-r>, B<--revisions>
Show revision numbers in output.
=item B<-b>, B<--branches>
Show branch names in revisions when possible.
=item B<-t>, B<--tags>
Show tags (symbolic names) in output.
=item B<-T>, B<--tagdates>
Show tags in output on their first occurance.
=item B<--show-dead>
Show dead files.
=item B<--stdin>
Read from stdin, don't run cvs log.
=item B<--stdout>
Output to stdout not to ChangeLog.
=item B<-d>, B<--distributed>
Put ChangeLogs in subdirs.
=item B<-f> I, B<--file> I
Write to I instead of ChangeLog.
=item B<--fsf>
Use this if log data is in FSF ChangeLog style.
=item B<--FSF>
Attempt strict FSF-standard compatible output (incompatible with B<--accum>).
=item B<-W> I, B<--window> I
Window of time within which log entries unify.
=item -B I, B<--usermap> I
Expand usernames to email addresses from I.
=item B<--passwd> I
Use system passwd file for user name expansion. If no mail domain is provided
(via B<--domain>), it tries to read one from B, output of B, B, or B. cvs2cl exits with an error if none of
those options is successful. Use a domain of '' to prevent the addition of a
mail domain.
=item B<--domain> I
Domain to build email addresses from.
=item B<--gecos>
Get user information from GECOS data.
=item B<-R> I, B<--regexp> I
Include only entries that match I. This option may be used multiple
times.
=item B<-I> I, B<--ignore> I
Ignore files whose names match I. 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.
=item B<-C>, B<--case-insensitive>
Any regexp matching is done case-insensitively.
=item B<-F> I, B<--follow> I
Show only revisions on or ancestral to I.
=item B<--follow-only> I
Like --follow, but sub-branches are not followed.
=item B<--no-ancestors>
When using B<-F>, only track changes since the I started.
=item B<--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.
=item B<-S>, B<--separate-header>
Blank line between each header and log message.
=item B<--group-within-date>
Group ChangeLog entries on the same date together, instead of having a
separate entry for each commit on that date.
=item B<--summary>
Add CVS change summary information.
=item B<--no-wrap>
Don't auto-wrap log message (recommend B<-S> also).
=item B<--no-indent>
Don't indent log message
=item B<--gmt>, B<--utc>
Show times in GMT/UTC instead of local time.
=item B<--accum>
Add to an existing ChangeLog (incompatible with B<--xml> and B<--FSF>).
=item B<-w>, B<--day-of-week>
Show day of week.
=item B<--no-times>
Don't show times in output.
=item B<--chrono>
Output log in chronological order (default is reverse chronological order).
=item B<--header> I
Get ChangeLog header from I ("B<->" means stdin).
=item B<--xml>
Output XML instead of ChangeLog format (incompatible with B<--accum>).
=item B<--xml-encoding> I
Insert encoding clause in XML header.
=item B<--xml-stylesheet> I
Insert xml-stylesheet processing instruction with I formatting stylesheet file path in XML header.
=item B<--noxmlns>
Don't include xmlns= attribute in root element.
=item B<--hide-filenames>
Don't show filenames (ignored for XML output).
=item B<--no-common-dir>
Don't shorten directory names from filenames.
=item B<--rcs> I
Handle filenames from raw RCS, for instance those produced by "cvs rlog"
output, stripping the prefix I.
=item B<-P>, B<--prune>
Don't show empty log messages.
=item B<--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.
=item B<--ignore-tag> I
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.
=item B<--show-tag> I
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.
=item B<--delta> IB<:>I
Attempt a delta between two tags (since I up to and
including I). The algorithm is a simple date-based one
(this is a hard problem) so results are imperfect.
=item B<-g> I, B<--global-opts> I
Pass I to cvs like in "cvs I log ...".
=item B<-l> I, B<--log-opts> I
Pass I to cvs log like in "cvs ... log I".
=back
Notes about the options and arguments:
=over 4
=item *
The B<-I> and B<-F> options may appear multiple times.
=item *
To follow trunk revisions, use "B<-F trunk>" ("B<-F TRUNK>" also works). This is
okay because no would ever, ever be crazy enough to name a branch "trunk",
right? Right.
=item *
For the B<-U> option, the I should be formatted like CVSROOT/users. That is,
each line of I looks like this:
jrandom:jrandom@red-bean.com
or maybe even like this
jrandom:'Jesse Q. Random '
Don't forget to quote the portion after the colon if necessary.
=item *
Many people want to filter by date. To do so, invoke cvs2cl.pl like this:
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).
=item *
Dates/times are interpreted in the local time zone.
=item *
Remember to quote the argument to `B<-l>' so that your shell doesn't interpret
spaces as argument separators.
=item *
See the 'Common Options' section of the cvs manual ('info cvs' on UNIX-like
systems) for more information.
=item *
Note that the rules for quoting under windows shells are different.
=item *
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.
=back
=head1 EXAMPLES
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<"""
=head1 AUTHORS
=over 4
=item Karl Fogel
=item Melissa O'Neill
=item Martyn J. Pearce
=back
Contributions from
=over 4
=item Mike Ayers
=item Tim Bradshaw
=item Richard Broberg
=item Nathan Bryant
=item Oswald Buddenhagen
=item Neil Conway
=item Arthur de Jong
=item Mark W. Eichin
=item Dave Elcock
=item Reid Ellis
=item Simon Josefsson
=item Robin Hugh Johnson
=item Terry Kane
=item Pete Kempf
=item Akos Kiss
=item Claus Klein
=item Eddie Kohler
=item Richard Laager
=item Kevin Lilly
=item Karl-Heinz Marbaise
=item Mitsuaki Masuhara
=item Henrik Nordstrom
=item Joe Orton
=item Peter Palfrader
=item Thomas Parmelan
=item Jordan Russell
=item Jacek Sliwerski
=item Johannes Stezenbach
=item Joseph Walton
=item Ernie Zapata
=back
=head1 BUGS
Please report bugs to C.
=head1 PREREQUISITES
This script requires C, C, and C. It
also seems to require C or higher.
=head1 OPERATING SYSTEM COMPATIBILITY
Should work on any OS.
=head1 SCRIPT CATEGORIES
Version_Control/CVS
=head1 COPYRIGHT
(C) 2001,2002,2003,2004 Martyn J. Pearce, under the GNU GPL.
(C) 1999 Karl Fogel, 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.
=head1 SEE ALSO
cvs(1)
cvs2cl-2.73/COPYING 0000644 0001750 0001750 00000043105 07163364121 013224 0 ustar weasel weasel GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Library General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their
rights.
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
b) You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
a) Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
b) Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
Copyright (C) 19yy
This program 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 of the License, or
(at your option) any later version.
This program 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 should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) 19yy name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
, 1 April 1989
Ty Coon, President of Vice
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU Library General
Public License instead of this License.
cvs2cl-2.73/ChangeLog 0000644 0001750 0001750 00000457705 11765402007 013761 0 ustar weasel weasel 2011-11-11 19:34 kfogel
* index.html (1.42): Update front page for new version.
2011-11-11 19:27 kfogel
* cvs2cl.pl (2.73): Add '--xml-stylesheet' option, and escape some
output properly for XML.
Patch by: Yury Lebedev
* cvs2cl.pl
(XML_Stylesheet): New global variable.
(output_header): Output the stylesheet. Also, fix indentation.
(output_tagdate): Escape the tag data.
(parse_options): Accept new '--xml-stylesheet' option.
(__DATA__): Document the new option. Also, remove stray period in
the documentation for the '--xml-encoding' option.
2010-12-12 16:34 kfogel
* xslt/index.html (1.3): HTML formatting fix.
2010-12-12 16:29 kfogel
* xslt/: cl2html2.xslt (1.2), clgen.sh (1.2), index.html (1.2):
* cl2html2.xslt, clgen.sh: Bring these up-to-date with the r2
versions from
https://cvs2html.svn.sourceforge.net/svnroot/cvs2html/trunk.
* index.html: Document the above.
2010-12-02 15:52 kfogel
* index.html (1.41), xslt/cl2html2.xslt (1.1), xslt/clgen.sh (1.1),
xslt/index.html (1.1): Add Alejandro Dobniewski's XSLT for
HTML-izing cvs2cl-generated ChangeLogs.
2008-12-05 14:50 kfogel
* index.html (1.40):
* cvs2cl/index.html: Use a better email address.
2008-06-26 13:56 kfogel
* cvs2cl.pl (2.72):
* cvs2cl.pl: Remove or disguise email addresses, to prevent spam.
2008-05-17 08:28 kfogel
* index.html (1.39):
* index.html: Update version number.
2008-05-17 08:25 kfogel
* cvs2cl.pl (2.71):
* cvs2cl/cvs2cl.pl: Fix POD formatting mistake that was preventing
'--group-within-date' documentation from showing.
Patch by: Ville Skyttä
2008-05-10 11:55 kfogel
* cvs2cl.pl (2.70):
* cvs2cl/cvs2cl.pl
(delta_check): Oops, follow up to r2.69 with a second typo fix.
D'oh.
2008-05-10 11:49 kfogel
* cvs2cl.pl (2.69):
* cvs2cl/cvs2cl.pl
(delta_check): Fix typo introduced in r2.65 that caused --delta to
effectively ignore TO_TAG (that is, 'cvs2cl.pl --delta FROM:TO'
would also display any changes between TO and HEAD).
Patch by: Hans Hoppe
2008-04-11 15:50 kfogel
* cvs2cl.pl (2.68):
* cvs2cl/cvs2cl.pl: Put the $0 in quotes ("$0"). See email below
for why.
Suggested by: Andreas
From: spambouncer{_AT_}gmx.de
To: bug-cvs2cl{_AT_}red-bean.com
Subject: cvs2cl on cygwin
Date: Fri, 11 Apr 2008 10:20:13 +0200
Message-ID: <20080411082013.268540@gmx.net>
Hello bean people!
First of all, thanks for the script without which cvs log is
basically useless. However, I wasn't able to run the script
properly with cygwin/cvsnt. Cygwin looked for the script in
"/cygdrive/c/Program Files/cvsnt/", and Perl couldn't handle the
space in "Program Files" (classic issue it seems), resulting in the
following error message:
Can't open perl script "/cygdrive/c/Program": No such file or
directory
I asked about this on the cygwin mailing list (see thread at
http://www.mail-archive.com/cygwin@cygwin.com/index.html#87229)
and was told to put the $0 on the second line (exec perl) in
quotes, which works fine.
I don't know if this would break script execution on other systems.
If so, you could mention this issue on the web site. If not,
please fix! :)
Thanks, Andreas
2007-08-01 20:49 kfogel
* cvs2cl.pl (2.67):
* cvs2cl/cvs2cl.pl
(FSF_Output): New variable.
(parse_options): Set it, check that it's not used with --accum.
(POD documentation): Document inter-option restrictions.
Found by: Guillaume Cottenceau
2007-07-15 00:52 kfogel
* cvs2cl.pl (2.66):
* cvs2cl.pl: Document the '--group-within-date' option.
Suggested by: Pierre Locquet
2007-07-15 00:48 kfogel
* cvs2cl.pl (2.65): "It would be nice to be able to leave
unspecified either *FROM_TAG* or *TO_TAG* on the --delta option, so
the logs span from the BASE or to the HEAD, respectively."
* cvs2cl.pl
(delta_check, parse_options): Adjust accordingly.
Patch by: Eric K. Henderson
2007-07-15 00:42 kfogel
* cvs2cl.pl (2.64):
* cvs2cl.pl
(read_date_author_and_state): $pw is a string, not an object, so
stop referring to the $pw->name field.
Found by: Peter Kjellerstedt
2007-07-15 00:41 kfogel
* cvs2cl.pl (2.63):
* cvs2cl.pl
(read_date_author_and_state): Check that $fullname is defined
before looking at its value.
Patch by: Peter Kjellerstedt
His bug report said "there is a small bug in cvs2cl.pl in
read_date_author_and_state() if someone has an entry in the
/etc/passwd file but an empty gecos field.".
2007-04-23 13:42 root
* index.html (1.38): Release 2.62, with three bugfixes.
2007-04-23 13:30 kfogel
* cvs2cl.pl (2.62):
* cvs2cl.pl
(output_changelog): Handle Windows paths too.
Patch by: Alexey Panchenko
From: Alexey Panchenko
To: bug-cvs2cl{_AT_}red-bean.com
Subject: One more patch
Date: Thu, 3 Nov 2005 18:48:18 +0600
Message-ID: <55435455.20051103184818@olmisoft.com>
The same cvs2cl from CVS HEAD.
I would like to execute it with full output path, e.g.
"perl cvs2cl.pl --file D:\MyProjects\Project1\reports\ChangeLog"
when output is not distributed, everything is groupped in directory
"./" and finally script is trying to create file with the path
./D:\MyProjects\Project1\reports\ChangeLog/cvs2clXXXX.tmp" and
fails. Looks like the code is fixing this issue only for unixes
where full path is started with '/' however on windows full path
starts with drive and the fix is not working.
2007-04-23 13:26 kfogel
* cvs2cl.pl (2.61):
* cvs2cl.pl
(read_changelog): Don't fork on Windows, just open a subcommand.
Patch by: Alexey Panchenko
From: Alexey Panchenko
To: bug-cvs2cl{_AT_}red-bean.com
Subject: Patch for revision 2.59
Date: Thu, 3 Nov 2005 18:31:46 +0600
Message-ID: <1196138239.20051103183146@olmisoft.com>
I checkouted revision 2.59 from CVS and it does not work under
Windows using Active Perl 5.6.1.
The previous version I use was 2.53 and it work fine. The
difference I noticed is in read_changelog() - new version uses
fork(). I think fork is not need on windows, so the patch is
below:
2007-02-04 14:21 kfogel
* cvs2cl.pl (2.60):
* cvs2cl.pl
(parse_options): Allow period in regexp that matches the tag
arguments to the --delta option.
Patch by: Gary Duzan
2005-08-12 21:57 kfogel
* index.html (1.37):
* index.html: Follow up to rev 1.36, making notice less terse and
thanking Martyn Pearce.
2005-08-12 10:58 kfogel
* index.html (1.36):
* index.html: Announce need for new maintainer.
2005-05-18 00:45 kfogel
* index.html (1.35): Fix typo, and add Anne Dudfield's name to
contributor list.
2005-05-18 00:42 kfogel
* changelogs.html (1.3), index.html (1.34): Update for 2.59.
Unpromise further ChangeLog-writing tips.
2005-05-18 00:34 kfogel
* cvs2cl.pl (2.59):
(output_changelog): Extend the regular expression that matches the
header line of a ChangeLog entry to allow for optional day of week.
This fixes the bug whereby the --accum option would not work when
the existing ChangeLog was generated with the -w (--day-of-week)
option. Patch from Anne Dudfield .
2004-11-07 09:28 fluffy
* cvs2cl.pl (2.58):
* Add tag dates to XML output
patch contributed by Simon Josefsson
* Fix quoting for cvs log command (fork & exec)
* Determine branch-members in _revision_is_wanted with regex to
include branches to 10+ revisions
* Fix non-working --prune option
* Add note about use of suidperl for CGI
words contributed by Andrew Cutler
* Correct sense of --no-ancestors
patch contributed by Steve Glow
2004-11-07 09:20 fluffy
* index.html (1.33): Add 2.58 release note
2004-11-07 07:38 fluffy
* BUGS/mail/: xml-header-option/0000.html (1.1),
xml-header-option/attachment.html (1.1),
xml-header-option/author.html (1.1), xml-header-option/date.html
(1.1), xml-header-option/index.html (1.1),
xml-header-option/subject.html (1.1),
xml-header-option/att-0000/ChangeLog.xsd (1.1),
xml-tag-dates/0000.html (1.1), xml-tag-dates/0001.html (1.1),
xml-tag-dates/0002.html (1.1), xml-tag-dates/0003.html (1.1),
xml-tag-dates/0004.html (1.1), xml-tag-dates/0005.html (1.1),
xml-tag-dates/0006.html (1.1), xml-tag-dates/0007.html (1.1),
xml-tag-dates/attachment.html (1.1), xml-tag-dates/author.html
(1.1), xml-tag-dates/date.html (1.1), xml-tag-dates/index.html
(1.1), xml-tag-dates/subject.html (1.1): [no log message]
2004-11-07 07:04 fluffy
* BUGS/mail/:
revision-on-branch-plus-ten-rev/att-0001/cvs2pl.bug.tbz2 (1.1),
undefined-function-with--d/0000.html (1.3),
undefined-function-with--d/0001.html (1.2),
undefined-function-with--d/0002.html (1.1),
undefined-function-with--d/attachment.html (1.3),
undefined-function-with--d/author.html (1.3),
undefined-function-with--d/date.html (1.3),
undefined-function-with--d/index.html (1.3),
undefined-function-with--d/subject.html (1.3),
use-of-quotes-on-windoze/0000.html (1.1),
use-of-quotes-on-windoze/attachment.html (1.1),
use-of-quotes-on-windoze/author.html (1.1),
use-of-quotes-on-windoze/date.html (1.1),
use-of-quotes-on-windoze/index.html (1.1),
use-of-quotes-on-windoze/subject.html (1.1): [no log message]
2004-11-07 07:01 fluffy
* BUGS/mail/: prune-doesnt-work/0000.html (1.1),
prune-doesnt-work/0001.html (1.1), prune-doesnt-work/0002.html
(1.1), prune-doesnt-work/attachment.html (1.1),
prune-doesnt-work/author.html (1.1), prune-doesnt-work/date.html
(1.1), prune-doesnt-work/index.html (1.1),
prune-doesnt-work/subject.html (1.1),
prune-doesnt-work/att-0002/cvs2pl.bug.tbz2 (1.1),
revision-on-branch-plus-ten-rev/0000.html (1.1),
revision-on-branch-plus-ten-rev/0001.html (1.1),
revision-on-branch-plus-ten-rev/attachment.html (1.1),
revision-on-branch-plus-ten-rev/author.html (1.1),
revision-on-branch-plus-ten-rev/date.html (1.1),
revision-on-branch-plus-ten-rev/index.html (1.1),
revision-on-branch-plus-ten-rev/subject.html (1.1): [no log
message]
2004-11-07 06:58 fluffy
* BUGS/mail/: ignore-should-take-regex/0000.html (1.1),
ignore-should-take-regex/attachment.html (1.1),
ignore-should-take-regex/author.html (1.1),
ignore-should-take-regex/date.html (1.1),
ignore-should-take-regex/index.html (1.1),
ignore-should-take-regex/subject.html (1.1),
inverted--no-ancestors/0000.html (1.4),
inverted--no-ancestors/0001.html (1.4),
inverted--no-ancestors/0002.html (1.1),
inverted--no-ancestors/0003.html (1.1),
inverted--no-ancestors/0004.html (1.1),
inverted--no-ancestors/0005.html (1.1),
inverted--no-ancestors/0006.html (1.1),
inverted--no-ancestors/attachment.html (1.4),
inverted--no-ancestors/author.html (1.4),
inverted--no-ancestors/date.html (1.4),
inverted--no-ancestors/index.html (1.4),
inverted--no-ancestors/subject.html (1.4),
inverted--no-ancestors/att-0006/00-part (1.1): [no log message]
2004-11-07 06:54 fluffy
* BUGS/mail/:
date-format-change-cvs-1-12-9/att-0010/cvs2cl-2.55-be-cvs-1.12-format.patch
(1.1), date-format-change-cvs-1-12-9/att-0011/patch (1.1),
gecos-unitialized-value/0000.html (1.3),
gecos-unitialized-value/0001.html (1.3),
gecos-unitialized-value/0002.html (1.1),
gecos-unitialized-value/0003.html (1.1),
gecos-unitialized-value/0004.html (1.1),
gecos-unitialized-value/attachment.html (1.3),
gecos-unitialized-value/author.html (1.3),
gecos-unitialized-value/date.html (1.3),
gecos-unitialized-value/index.html (1.3),
gecos-unitialized-value/subject.html (1.3): [no log message]
2004-11-07 06:51 fluffy
* BUGS/: detail.html (1.13), summary.html (1.12),
mail/binmode-on-windoze/0000.html (1.6),
mail/binmode-on-windoze/0001.html (1.5),
mail/binmode-on-windoze/0002.html (1.2),
mail/binmode-on-windoze/0003.html (1.2),
mail/binmode-on-windoze/0004.html (1.2),
mail/binmode-on-windoze/0005.html (1.1),
mail/binmode-on-windoze/0006.html (1.1),
mail/binmode-on-windoze/0007.html (1.1),
mail/binmode-on-windoze/0008.html (1.1),
mail/binmode-on-windoze/attachment.html (1.5),
mail/binmode-on-windoze/author.html (1.5),
mail/binmode-on-windoze/date.html (1.5),
mail/binmode-on-windoze/index.html (1.5),
mail/binmode-on-windoze/subject.html (1.5),
mail/date-format-change-cvs-1-12-9/0000.html (1.2),
mail/date-format-change-cvs-1-12-9/0001.html (1.2),
mail/date-format-change-cvs-1-12-9/0002.html (1.2),
mail/date-format-change-cvs-1-12-9/0003.html (1.2),
mail/date-format-change-cvs-1-12-9/0004.html (1.2),
mail/date-format-change-cvs-1-12-9/0005.html (1.2),
mail/date-format-change-cvs-1-12-9/0006.html (1.2),
mail/date-format-change-cvs-1-12-9/0007.html (1.2),
mail/date-format-change-cvs-1-12-9/0008.html (1.2),
mail/date-format-change-cvs-1-12-9/0009.html (1.1),
mail/date-format-change-cvs-1-12-9/0010.html (1.1),
mail/date-format-change-cvs-1-12-9/0011.html (1.1),
mail/date-format-change-cvs-1-12-9/0012.html (1.1),
mail/date-format-change-cvs-1-12-9/attachment.html (1.2),
mail/date-format-change-cvs-1-12-9/author.html (1.2),
mail/date-format-change-cvs-1-12-9/date.html (1.2),
mail/date-format-change-cvs-1-12-9/index.html (1.2),
mail/date-format-change-cvs-1-12-9/subject.html (1.2): [no log
message]
2004-10-30 12:01 fluffy
* ChangeLog.xsd (1.2): support optional linesadded/linesremoved
elements
2004-10-30 11:50 fluffy
* ChangeLog.xsd (1.1): Contributed by Yury Lebedev
2004-10-12 02:30 kfogel
* index.html (1.32):
* cvs2cl/index.html: Active maintainership of cl2html is in the
hands of Simon Josefsson now, so link to his site.
2004-07-10 15:40 fluffy
* BUGS/mail/: undefined-function-with--d/0000.html (1.2),
undefined-function-with--d/attachment.html (1.2),
undefined-function-with--d/author.html (1.2),
undefined-function-with--d/date.html (1.2),
undefined-function-with--d/index.html (1.2),
undefined-function-with--d/subject.html (1.2),
gecos-parsing-uses-getpwnam-incorrectly/0000.html (1.2),
gecos-parsing-uses-getpwnam-incorrectly/attachment.html (1.2),
gecos-parsing-uses-getpwnam-incorrectly/author.html (1.2),
gecos-parsing-uses-getpwnam-incorrectly/date.html (1.2),
gecos-parsing-uses-getpwnam-incorrectly/index.html (1.2),
gecos-parsing-uses-getpwnam-incorrectly/subject.html (1.2),
undefined-function-with--d/0001.html (1.1),
gecos-parsing-uses-getpwnam-incorrectly/0001.html (1.1): Mail
Update
2004-07-10 15:20 fluffy
* BUGS/mail/: binmode-on-windoze/0002.html (1.1),
binmode-on-windoze/0003.html (1.1), binmode-on-windoze/0004.html
(1.1), date-format-change-cvs-1-12-9/0000.html (1.1),
date-format-change-cvs-1-12-9/0001.html (1.1),
date-format-change-cvs-1-12-9/0002.html (1.1),
date-format-change-cvs-1-12-9/0003.html (1.1),
date-format-change-cvs-1-12-9/0004.html (1.1),
date-format-change-cvs-1-12-9/0005.html (1.1),
date-format-change-cvs-1-12-9/0006.html (1.1),
date-format-change-cvs-1-12-9/0007.html (1.1),
date-format-change-cvs-1-12-9/0008.html (1.1),
date-format-change-cvs-1-12-9/attachment.html (1.1),
date-format-change-cvs-1-12-9/author.html (1.1),
date-format-change-cvs-1-12-9/date.html (1.1),
date-format-change-cvs-1-12-9/index.html (1.1),
date-format-change-cvs-1-12-9/subject.html (1.1),
date-format-change-cvs-1-12-9/att-0002/signature.asc (1.1),
follow-only-option/0006.html (1.1), follow-only-option/0007.html
(1.1), follow-only-option/0008.html (1.1),
follow-only-option/att-0008/signature.asc (1.1),
gecos-parsing-uses-getpwnam-incorrectly/0000.html (1.1),
gecos-parsing-uses-getpwnam-incorrectly/attachment.html (1.1),
gecos-parsing-uses-getpwnam-incorrectly/author.html (1.1),
gecos-parsing-uses-getpwnam-incorrectly/date.html (1.1),
gecos-parsing-uses-getpwnam-incorrectly/index.html (1.1),
gecos-parsing-uses-getpwnam-incorrectly/subject.html (1.1),
gecos-parsing-uses-getpwnam-incorrectly/att-0000/cvs2cl.pl-2.55.patch
(1.1), undefined-function-with--d/0000.html (1.1),
undefined-function-with--d/attachment.html (1.1),
undefined-function-with--d/author.html (1.1),
undefined-function-with--d/date.html (1.1),
undefined-function-with--d/index.html (1.1),
undefined-function-with--d/subject.html (1.1),
undefined-function-with--d/att-0000/signature.asc (1.1): Mail
update
2004-07-10 15:14 fluffy
* BUGS/: detail.html (1.12), summary.html (1.11),
mail/binmode-on-windoze/0000.html (1.5),
mail/binmode-on-windoze/0001.html (1.4),
mail/binmode-on-windoze/attachment.html (1.4),
mail/binmode-on-windoze/author.html (1.4),
mail/binmode-on-windoze/date.html (1.4),
mail/binmode-on-windoze/index.html (1.4),
mail/binmode-on-windoze/subject.html (1.4),
mail/follow-only-option/0000.html (1.2),
mail/follow-only-option/0001.html (1.2),
mail/follow-only-option/0002.html (1.2),
mail/follow-only-option/0003.html (1.2),
mail/follow-only-option/0004.html (1.2),
mail/follow-only-option/0005.html (1.2),
mail/follow-only-option/attachment.html (1.2),
mail/follow-only-option/author.html (1.2),
mail/follow-only-option/date.html (1.2),
mail/follow-only-option/index.html (1.2),
mail/follow-only-option/subject.html (1.2): Mail update
2004-07-10 14:38 fluffy
* index.html (1.31): Update 2.56 to 2.57
2004-07-10 14:38 fluffy
* cvs2cl.pl (2.57): Fix typo in RE for 1.12.9-style dates
2004-07-10 13:53 fluffy
* cvs2cl.pl (2.56):
* add patch to allow correct date format reading under cvs 1.12.9
patch contributed by Jordan Russell ,
Martin Dorey ,
Geo Carncross
, Simon
Josefsson
* handle carriage returns in windoze output
* fix missing use of File::Basename in ChangeLog::FileEntry
patch contributed by Jacek Sliwerski
* fix gecos handling to read getpwnam correctly
patch contributed by Christian Marquardt
2004-07-10 13:49 fluffy
* index.html (1.30): Add notes of 2.56
2004-07-10 11:38 fluffy
* cvs2cl_ruether.xslt (1.1): Donated by alexander Ruether
2004-05-16 12:57 kfogel
* index.html (1.29):
* cvs2cl/index.html: Remove the 'cvs login' step from the anonymous
CVS instructions. CVS hasn't required it since late 1999,
though apparently nobody knows this, because many sites still
document a login step before the checkout.
2004-05-15 15:15 fluffy
* BUGS/mail/: bad-ref--t-b/att-0002/signature.asc (1.1),
delta-should-take-square-brackets/0000.html (1.1),
delta-should-take-square-brackets/0001.html (1.1),
delta-should-take-square-brackets/attachment.html (1.1),
delta-should-take-square-brackets/author.html (1.1),
delta-should-take-square-brackets/date.html (1.1),
delta-should-take-square-brackets/index.html (1.1),
delta-should-take-square-brackets/subject.html (1.1),
follow-only-option/0000.html (1.1), follow-only-option/0001.html
(1.1), follow-only-option/0002.html (1.1),
follow-only-option/0003.html (1.1), follow-only-option/0004.html
(1.1), follow-only-option/0005.html (1.1),
follow-only-option/attachment.html (1.1),
follow-only-option/author.html (1.1),
follow-only-option/date.html (1.1), follow-only-option/index.html
(1.1), follow-only-option/subject.html (1.1),
lines-modified-option/0000.html (1.1),
lines-modified-option/0001.html (1.1),
lines-modified-option/attachment.html (1.1),
lines-modified-option/author.html (1.1),
lines-modified-option/date.html (1.1),
lines-modified-option/index.html (1.1),
lines-modified-option/subject.html (1.1),
no-exit-code-on-error/0000.html (1.1),
no-exit-code-on-error/0001.html (1.1),
no-exit-code-on-error/attachment.html (1.1),
no-exit-code-on-error/author.html (1.1),
no-exit-code-on-error/date.html (1.1),
no-exit-code-on-error/index.html (1.1),
no-exit-code-on-error/subject.html (1.1),
unit-with--follow/0000.html (1.1), unit-with--follow/0001.html
(1.1), unit-with--follow/0002.html (1.1),
unit-with--follow/attachment.html (1.1),
unit-with--follow/author.html (1.1), unit-with--follow/date.html
(1.1), unit-with--follow/index.html (1.1),
unit-with--follow/subject.html (1.1),
follow-only-option/att-0003/signature.asc (1.1),
lines-modified-option/att-0000/cvs2cl-lines-modified-1.patch
(1.1), no-exit-code-on-error/att-0000/signature.asc (1.1): Mail
for 2.55
2004-05-15 15:11 fluffy
* BUGS/: detail.html (1.11), summary.html (1.10),
mail/bad-ref--t-b/0000.html (1.2), mail/bad-ref--t-b/0001.html
(1.2), mail/bad-ref--t-b/attachment.html (1.2),
mail/bad-ref--t-b/author.html (1.2), mail/bad-ref--t-b/date.html
(1.2), mail/bad-ref--t-b/index.html (1.2),
mail/bad-ref--t-b/subject.html (1.2), mail/bad-ref--t-b/0002.html
(1.1), mail/bad-ref--t-b/0003.html (1.1),
mail/bad-ref--t-b/0004.html (1.1): Mail for 2.55
2004-05-15 15:09 fluffy
* cvs2cl.pl (2.55): Add --lines-modified, --follow-only options
2004-05-15 14:59 fluffy
* index.html (1.28): Add details for 2.55
2004-04-19 20:17 kfogel
* cvs2cl.pl (2.54): Correct spelling of Melissa O'Neill's name.
2004-04-17 09:35 fluffy
* index.html (1.27): Add Pete Kempf to contributors' list
2004-03-07 06:42 fluffy
* BUGS/: detail.html (1.10), summary.html (1.9),
mail/bad-ref--t-b/0000.html (1.1), mail/bad-ref--t-b/0001.html
(1.1), mail/bad-ref--t-b/attachment.html (1.1),
mail/bad-ref--t-b/author.html (1.1), mail/bad-ref--t-b/date.html
(1.1), mail/bad-ref--t-b/index.html (1.1),
mail/bad-ref--t-b/subject.html (1.1),
mail/bad-ref--t-b/att-0000/signature.asc (1.1),
mail/no-manpage/0000.html (1.2), mail/no-manpage/0001.html (1.2),
mail/no-manpage/0002.html (1.1), mail/no-manpage/0003.html (1.1),
mail/no-manpage/attachment.html (1.2),
mail/no-manpage/author.html (1.2), mail/no-manpage/date.html
(1.2), mail/no-manpage/index.html (1.2),
mail/no-manpage/subject.html (1.2),
mail/no-manpage/att-0002/signature.asc (1.1),
mail/summary-doesnt-wrap/0000.html (1.2),
mail/summary-doesnt-wrap/0001.html (1.2),
mail/summary-doesnt-wrap/0002.html (1.1),
mail/summary-doesnt-wrap/0003.html (1.1),
mail/summary-doesnt-wrap/attachment.html (1.2),
mail/summary-doesnt-wrap/author.html (1.2),
mail/summary-doesnt-wrap/date.html (1.2),
mail/summary-doesnt-wrap/index.html (1.2),
mail/summary-doesnt-wrap/subject.html (1.2),
mail/summary-doesnt-wrap/att-0002/00-part (1.1): [no log message]
2004-03-07 06:32 fluffy
* index.html (1.26): Add in 2.53
2004-03-07 05:56 fluffy
* cvs2cl.pl (2.53):
* fix to provide non-zero exit status if cvs log fails
* fix --follow to not complain of undefined values
patch contributed by Johannes Stezenbach
* fix --gecos to cope if author is missing, or if gecos field lacks
commas
* fix -t -b to not die with a bad array dereference
patch contributed by Thomas Parmelan
* formatting fixes for pod
patch contributed by Peter Palfrader
2004-03-06 08:57 fluffy
* cl2html_rss-karaguezian.xslt (1.1): Generate RSS & HTML (with
table & colouring for files); contributed by Nicolas Karaguezian
2004-01-21 11:02 fluffy
* cvs2cl.pl (2.52), index.html (1.25), BUGS/detail.html (1.9),
BUGS/summary.html (1.8):
* fix --summary to wrap lines (unless --no-wrap is also used)
patch contributed by Richard Laager
* fix --no-indent option to be intuitive in conjunction with
--hide-filenames and --no-wrap
patch contributed by Karl-Heinz Marbaise
* factor out ChangeLog:: classes
* rejig POD to make man page
2004-01-21 10:55 fluffy
* BUGS/mail/: no-manpage/att-0000/signature.asc (1.1),
summary-doesnt-wrap/att-0001/patch (1.1): Mail updates for 2.52
2004-01-21 10:36 fluffy
* BUGS/mail/: rlog-format-stdin/0000.html (1.3),
rlog-format-stdin/0001.html (1.3),
rlog-format-stdin/attachment.html (1.3),
rlog-format-stdin/author.html (1.3), rlog-format-stdin/date.html
(1.3), rlog-format-stdin/index.html (1.3),
rlog-format-stdin/subject.html (1.3),
shell-minimize-file-lists/0000.html (1.4),
shell-minimize-file-lists/0001.html (1.4),
shell-minimize-file-lists/0002.html (1.4),
shell-minimize-file-lists/0003.html (1.4),
shell-minimize-file-lists/0004.html (1.4),
shell-minimize-file-lists/0005.html (1.3),
shell-minimize-file-lists/attachment.html (1.4),
shell-minimize-file-lists/author.html (1.4),
shell-minimize-file-lists/date.html (1.4),
shell-minimize-file-lists/index.html (1.4),
shell-minimize-file-lists/subject.html (1.4),
show-dead-option/0000.html (1.3), show-dead-option/0001.html
(1.3), show-dead-option/attachment.html (1.3),
show-dead-option/author.html (1.3), show-dead-option/date.html
(1.3), show-dead-option/index.html (1.3),
show-dead-option/subject.html (1.3), show-tags-option/0000.html
(1.4), show-tags-option/0001.html (1.4),
show-tags-option/0002.html (1.4), show-tags-option/0003.html
(1.3), show-tags-option/attachment.html (1.4),
show-tags-option/author.html (1.4), show-tags-option/date.html
(1.4), show-tags-option/index.html (1.4),
show-tags-option/subject.html (1.4), sort-by-filename/0000.html
(1.3), sort-by-filename/0001.html (1.3),
sort-by-filename/attachment.html (1.3),
sort-by-filename/author.html (1.3), sort-by-filename/date.html
(1.3), sort-by-filename/index.html (1.3),
sort-by-filename/subject.html (1.3),
squash-duplicate-filenames/0000.html (1.4),
squash-duplicate-filenames/0001.html (1.4),
squash-duplicate-filenames/0002.html (1.3),
squash-duplicate-filenames/attachment.html (1.4),
squash-duplicate-filenames/author.html (1.4),
squash-duplicate-filenames/date.html (1.4),
squash-duplicate-filenames/index.html (1.4),
squash-duplicate-filenames/subject.html (1.4),
summary-doesnt-wrap/0000.html (1.1),
summary-doesnt-wrap/0001.html (1.1),
summary-doesnt-wrap/attachment.html (1.1),
summary-doesnt-wrap/author.html (1.1),
summary-doesnt-wrap/date.html (1.1),
summary-doesnt-wrap/index.html (1.1),
summary-doesnt-wrap/subject.html (1.1), summary-option/0000.html
(1.3), summary-option/0001.html (1.3), summary-option/0002.html
(1.3), summary-option/attachment.html (1.3),
summary-option/author.html (1.3), summary-option/date.html (1.3),
summary-option/index.html (1.3), summary-option/subject.html
(1.3), support-for-function-name/0000.html (1.3),
support-for-function-name/0001.html (1.3),
support-for-function-name/attachment.html (1.3),
support-for-function-name/author.html (1.3),
support-for-function-name/date.html (1.3),
support-for-function-name/index.html (1.3),
support-for-function-name/subject.html (1.3),
tagdates-option/0000.html (1.3), tagdates-option/0001.html (1.3),
tagdates-option/attachment.html (1.3),
tagdates-option/author.html (1.3), tagdates-option/date.html
(1.3), tagdates-option/index.html (1.3),
tagdates-option/subject.html (1.3),
unify-by-author-and-time/0000.html (1.4),
unify-by-author-and-time/0001.html (1.3),
unify-by-author-and-time/0002.html (1.3),
unify-by-author-and-time/attachment.html (1.4),
unify-by-author-and-time/author.html (1.4),
unify-by-author-and-time/date.html (1.4),
unify-by-author-and-time/index.html (1.4),
unify-by-author-and-time/subject.html (1.4),
update-option/0000.html (1.4), update-option/0001.html (1.4),
update-option/0002.html (1.4), update-option/0003.html (1.3),
update-option/attachment.html (1.4), update-option/author.html
(1.4), update-option/date.html (1.4), update-option/index.html
(1.4), update-option/subject.html (1.4), wrap-spaces/0000.html
(1.3), wrap-spaces/attachment.html (1.3), wrap-spaces/author.html
(1.3), wrap-spaces/date.html (1.3), wrap-spaces/index.html (1.3),
wrap-spaces/subject.html (1.3), xml-add-isodate/0000.html (1.2),
xml-add-isodate/0001.html (1.2), xml-add-isodate/attachment.html
(1.2), xml-add-isodate/author.html (1.2),
xml-add-isodate/date.html (1.2), xml-add-isodate/index.html
(1.2), xml-add-isodate/subject.html (1.2),
xml-encoding-option/0000.html (1.3),
xml-encoding-option/0001.html (1.3),
xml-encoding-option/0002.html (1.3),
xml-encoding-option/attachment.html (1.3),
xml-encoding-option/author.html (1.3),
xml-encoding-option/date.html (1.3),
xml-encoding-option/index.html (1.3),
xml-encoding-option/subject.html (1.3),
xml-encoding-option/att-0000/cvs2cl.pl (1.2),
xml-encoding-option/att-0000/diff.txt (1.2),
xml-msg-spurious-newline/0000.html (1.3),
xml-msg-spurious-newline/attachment.html (1.3),
xml-msg-spurious-newline/author.html (1.3),
xml-msg-spurious-newline/date.html (1.3),
xml-msg-spurious-newline/index.html (1.3),
xml-msg-spurious-newline/subject.html (1.3),
xml-namespace-option/0000.html (1.3),
xml-namespace-option/0001.html (1.3),
xml-namespace-option/attachment.html (1.3),
xml-namespace-option/author.html (1.3),
xml-namespace-option/date.html (1.3),
xml-namespace-option/index.html (1.3),
xml-namespace-option/subject.html (1.3): Mail updates for 2.52
2004-01-21 10:33 fluffy
* BUGS/mail/: -W-and-0-value/0000.html (1.3),
-W-and-0-value/attachment.html (1.3), -W-and-0-value/author.html
(1.3), -W-and-0-value/date.html (1.3), -W-and-0-value/index.html
(1.3), -W-and-0-value/subject.html (1.3), -r-and--b/0000.html
(1.3), -r-and--b/attachment.html (1.3), -r-and--b/author.html
(1.3), -r-and--b/date.html (1.3), -r-and--b/index.html (1.3),
-r-and--b/subject.html (1.3), FSF-option/0000.html (1.4),
FSF-option/0001.html (1.4), FSF-option/0002.html (1.3),
FSF-option/attachment.html (1.4), FSF-option/author.html (1.4),
FSF-option/date.html (1.4), FSF-option/index.html (1.4),
FSF-option/subject.html (1.4), accum-and-D/0000.html (1.3),
accum-and-D/0001.html (1.3), accum-and-D/attachment.html (1.3),
accum-and-D/author.html (1.3), accum-and-D/date.html (1.3),
accum-and-D/index.html (1.3), accum-and-D/subject.html (1.3),
accum-utc-repeated-add/0000.html (1.5),
accum-utc-repeated-add/0001.html (1.5),
accum-utc-repeated-add/0002.html (1.4),
accum-utc-repeated-add/0003.html (1.4),
accum-utc-repeated-add/0004.html (1.4),
accum-utc-repeated-add/0005.html (1.3),
accum-utc-repeated-add/0006.html (1.3),
accum-utc-repeated-add/0007.html (1.3),
accum-utc-repeated-add/0008.html (1.3),
accum-utc-repeated-add/attachment.html (1.5),
accum-utc-repeated-add/author.html (1.5),
accum-utc-repeated-add/date.html (1.5),
accum-utc-repeated-add/index.html (1.5),
accum-utc-repeated-add/subject.html (1.5),
add-host-recognition-to--U/0000.html (1.3),
add-host-recognition-to--U/0001.html (1.3),
add-host-recognition-to--U/0002.html (1.3),
add-host-recognition-to--U/0003.html (1.3),
add-host-recognition-to--U/0004.html (1.3),
add-host-recognition-to--U/attachment.html (1.3),
add-host-recognition-to--U/author.html (1.3),
add-host-recognition-to--U/date.html (1.3),
add-host-recognition-to--U/index.html (1.3),
add-host-recognition-to--U/subject.html (1.3),
add-native-limits-options/0000.html (1.3),
add-native-limits-options/attachment.html (1.3),
add-native-limits-options/author.html (1.3),
add-native-limits-options/date.html (1.3),
add-native-limits-options/index.html (1.3),
add-native-limits-options/subject.html (1.3),
binmode-on-windoze/0000.html (1.4), binmode-on-windoze/0001.html
(1.3), binmode-on-windoze/attachment.html (1.3),
binmode-on-windoze/author.html (1.3),
binmode-on-windoze/date.html (1.3), binmode-on-windoze/index.html
(1.3), binmode-on-windoze/subject.html (1.3),
branch-added-files-with-space-in-fn/0000.html (1.2),
branch-added-files-with-space-in-fn/0001.html (1.2),
branch-added-files-with-space-in-fn/0002.html (1.2),
branch-added-files-with-space-in-fn/attachment.html (1.2),
branch-added-files-with-space-in-fn/author.html (1.2),
branch-added-files-with-space-in-fn/date.html (1.2),
branch-added-files-with-space-in-fn/index.html (1.2),
branch-added-files-with-space-in-fn/subject.html (1.2),
change-tracking-format/0000.html (1.3),
change-tracking-format/attachment.html (1.3),
change-tracking-format/author.html (1.3),
change-tracking-format/date.html (1.3),
change-tracking-format/index.html (1.3),
change-tracking-format/subject.html (1.3),
chrono-option/0000.html (1.4), chrono-option/0001.html (1.4),
chrono-option/0002.html (1.4), chrono-option/0003.html (1.3),
chrono-option/attachment.html (1.4), chrono-option/author.html
(1.4), chrono-option/date.html (1.4), chrono-option/index.html
(1.4), chrono-option/subject.html (1.4),
chrono-undocumented/0000.html (1.3),
chrono-undocumented/0001.html (1.3),
chrono-undocumented/attachment.html (1.3),
chrono-undocumented/author.html (1.3),
chrono-undocumented/date.html (1.3),
chrono-undocumented/index.html (1.3),
chrono-undocumented/subject.html (1.3), collate-by-tag/0000.html
(1.2), collate-by-tag/0001.html (1.2),
collate-by-tag/attachment.html (1.2), collate-by-tag/author.html
(1.2), collate-by-tag/date.html (1.2), collate-by-tag/index.html
(1.2), collate-by-tag/subject.html (1.2),
collect-v-numbers/0000.html (1.4), collect-v-numbers/0001.html
(1.3), collect-v-numbers/attachment.html (1.4),
collect-v-numbers/author.html (1.4), collect-v-numbers/date.html
(1.4), collect-v-numbers/index.html (1.4),
collect-v-numbers/subject.html (1.4),
cosmetic-indenting/0000.html (1.3), cosmetic-indenting/0001.html
(1.3), cosmetic-indenting/0002.html (1.3),
cosmetic-indenting/0003.html (1.3), cosmetic-indenting/0004.html
(1.3), cosmetic-indenting/0005.html (1.3),
cosmetic-indenting/0006.html (1.3), cosmetic-indenting/0007.html
(1.3), cosmetic-indenting/attachment.html (1.3),
cosmetic-indenting/author.html (1.3),
cosmetic-indenting/date.html (1.3), cosmetic-indenting/index.html
(1.3), cosmetic-indenting/subject.html (1.3),
deleted-file-no-revision/0000.html (1.3),
deleted-file-no-revision/attachment.html (1.3),
deleted-file-no-revision/author.html (1.3),
deleted-file-no-revision/date.html (1.3),
deleted-file-no-revision/index.html (1.3),
deleted-file-no-revision/subject.html (1.3),
deleted-subdirs-disappear/0000.html (1.3),
deleted-subdirs-disappear/attachment.html (1.3),
deleted-subdirs-disappear/author.html (1.3),
deleted-subdirs-disappear/date.html (1.3),
deleted-subdirs-disappear/index.html (1.3),
deleted-subdirs-disappear/subject.html (1.3),
delta-flag/0000.html (1.3), delta-flag/0001.html (1.3),
delta-flag/0002.html (1.3), delta-flag/attachment.html (1.3),
delta-flag/author.html (1.3), delta-flag/date.html (1.3),
delta-flag/index.html (1.3), delta-flag/subject.html (1.3),
delta-undocumented/0000.html (1.4), delta-undocumented/0001.html
(1.4), delta-undocumented/0002.html (1.4),
delta-undocumented/0003.html (1.3),
delta-undocumented/attachment.html (1.4),
delta-undocumented/author.html (1.4),
delta-undocumented/date.html (1.4), delta-undocumented/index.html
(1.4), delta-undocumented/subject.html (1.4),
dirs-called-0/0000.html (1.4), dirs-called-0/0001.html (1.4),
dirs-called-0/0002.html (1.4), dirs-called-0/0003.html (1.4),
dirs-called-0/0004.html (1.4), dirs-called-0/0005.html (1.3),
dirs-called-0/0006.html (1.3), dirs-called-0/0007.html (1.3),
dirs-called-0/0008.html (1.3), dirs-called-0/0009.html (1.3),
dirs-called-0/0010.html (1.3), dirs-called-0/attachment.html
(1.4), dirs-called-0/author.html (1.4), dirs-called-0/date.html
(1.4), dirs-called-0/index.html (1.4), dirs-called-0/subject.html
(1.4), dirs-called-0/att-0009/cvs2cl.pl (1.3),
eol-whitespace/0000.html (1.3), eol-whitespace/0001.html (1.3),
eol-whitespace/0002.html (1.3), eol-whitespace/0003.html (1.3),
eol-whitespace/attachment.html (1.3), eol-whitespace/author.html
(1.3), eol-whitespace/date.html (1.3), eol-whitespace/index.html
(1.3), eol-whitespace/subject.html (1.3),
examples-of-date-use/0000.html (1.2),
examples-of-date-use/0001.html (1.2),
examples-of-date-use/0002.html (1.2),
examples-of-date-use/0003.html (1.2),
examples-of-date-use/attachment.html (1.2),
examples-of-date-use/author.html (1.2),
examples-of-date-use/date.html (1.2),
examples-of-date-use/index.html (1.2),
examples-of-date-use/subject.html (1.2), exclude-regex/0000.html
(1.3), exclude-regex/0001.html (1.3),
exclude-regex/attachment.html (1.3), exclude-regex/author.html
(1.3), exclude-regex/date.html (1.3), exclude-regex/index.html
(1.3), exclude-regex/subject.html (1.3),
extra-square-brackets/0000.html (1.5),
extra-square-brackets/0001.html (1.5),
extra-square-brackets/0002.html (1.5),
extra-square-brackets/0003.html (1.5),
extra-square-brackets/0004.html (1.4),
extra-square-brackets/0005.html (1.4),
extra-square-brackets/0006.html (1.4),
extra-square-brackets/0007.html (1.3),
extra-square-brackets/attachment.html (1.5),
extra-square-brackets/author.html (1.5),
extra-square-brackets/date.html (1.5),
extra-square-brackets/index.html (1.5),
extra-square-brackets/subject.html (1.5),
gecos-domain-options/0000.html (1.4),
gecos-domain-options/0001.html (1.4),
gecos-domain-options/0002.html (1.3),
gecos-domain-options/0003.html (1.3),
gecos-domain-options/attachment.html (1.4),
gecos-domain-options/author.html (1.4),
gecos-domain-options/date.html (1.4),
gecos-domain-options/index.html (1.4),
gecos-domain-options/subject.html (1.4),
gecos-unitialized-value/0000.html (1.2),
gecos-unitialized-value/0001.html (1.2),
gecos-unitialized-value/attachment.html (1.2),
gecos-unitialized-value/author.html (1.2),
gecos-unitialized-value/date.html (1.2),
gecos-unitialized-value/index.html (1.2),
gecos-unitialized-value/subject.html (1.2),
group-by-author-and-day/0000.html (1.3),
group-by-author-and-day/0001.html (1.3),
group-by-author-and-day/0002.html (1.3),
group-by-author-and-day/0003.html (1.3),
group-by-author-and-day/attachment.html (1.3),
group-by-author-and-day/author.html (1.3),
group-by-author-and-day/date.html (1.3),
group-by-author-and-day/index.html (1.3),
group-by-author-and-day/subject.html (1.3),
hardwired-exec-line/0000.html (1.3),
hardwired-exec-line/0001.html (1.3),
hardwired-exec-line/0002.html (1.3),
hardwired-exec-line/0003.html (1.3),
hardwired-exec-line/attachment.html (1.3),
hardwired-exec-line/author.html (1.3),
hardwired-exec-line/date.html (1.3),
hardwired-exec-line/index.html (1.3),
hardwired-exec-line/subject.html (1.3),
hide-branch-additions/0000.html (1.3),
hide-branch-additions/0001.html (1.3),
hide-branch-additions/attachment.html (1.3),
hide-branch-additions/author.html (1.3),
hide-branch-additions/date.html (1.3),
hide-branch-additions/index.html (1.3),
hide-branch-additions/subject.html (1.3),
hide-branch-additions/att-0000/cvs2cl.pl.2.48 (1.3),
ignore-tag-option/0000.html (1.3),
ignore-tag-option/attachment.html (1.3),
ignore-tag-option/author.html (1.3), ignore-tag-option/date.html
(1.3), ignore-tag-option/index.html (1.3),
ignore-tag-option/subject.html (1.3),
inverted--no-ancestors/0000.html (1.3),
inverted--no-ancestors/0001.html (1.3),
inverted--no-ancestors/attachment.html (1.3),
inverted--no-ancestors/author.html (1.3),
inverted--no-ancestors/date.html (1.3),
inverted--no-ancestors/index.html (1.3),
inverted--no-ancestors/subject.html (1.3), item-prefix/0000.html
(1.3), item-prefix/0001.html (1.3), item-prefix/attachment.html
(1.3), item-prefix/author.html (1.3), item-prefix/date.html
(1.3), item-prefix/index.html (1.3), item-prefix/subject.html
(1.3), latest-rev/0000.html (1.3), latest-rev/0001.html (1.3),
latest-rev/attachment.html (1.3), latest-rev/author.html (1.3),
latest-rev/date.html (1.3), latest-rev/index.html (1.3),
latest-rev/subject.html (1.3), log-only-on-branch/0000.html
(1.3), log-only-on-branch/0001.html (1.3),
log-only-on-branch/0002.html (1.3), log-only-on-branch/0003.html
(1.3), log-only-on-branch/attachment.html (1.3),
log-only-on-branch/author.html (1.3),
log-only-on-branch/date.html (1.3), log-only-on-branch/index.html
(1.3), log-only-on-branch/subject.html (1.3),
mailname-vs-domain/0000.html (1.3), mailname-vs-domain/0001.html
(1.3), mailname-vs-domain/0002.html (1.3),
mailname-vs-domain/0003.html (1.3),
mailname-vs-domain/attachment.html (1.3),
mailname-vs-domain/author.html (1.3),
mailname-vs-domain/date.html (1.3), mailname-vs-domain/index.html
(1.3), mailname-vs-domain/subject.html (1.3),
malformed-utf-8/0000.html (1.3), malformed-utf-8/0001.html (1.3),
malformed-utf-8/0002.html (1.3), malformed-utf-8/0003.html (1.3),
malformed-utf-8/0004.html (1.3), malformed-utf-8/0005.html (1.3),
malformed-utf-8/0006.html (1.3), malformed-utf-8/0007.html (1.3),
malformed-utf-8/0008.html (1.3), malformed-utf-8/0009.html (1.3),
malformed-utf-8/0010.html (1.3), malformed-utf-8/0011.html (1.3),
malformed-utf-8/attachment.html (1.3),
malformed-utf-8/author.html (1.3), malformed-utf-8/date.html
(1.3), malformed-utf-8/index.html (1.3),
malformed-utf-8/subject.html (1.3), multi-follow/0000.html (1.2),
multi-follow/0001.html (1.2), multi-follow/attachment.html (1.2),
multi-follow/author.html (1.2), multi-follow/date.html (1.2),
multi-follow/index.html (1.2), multi-follow/subject.html (1.2),
no-ancestors-option/0000.html (1.3),
no-ancestors-option/0001.html (1.3),
no-ancestors-option/0002.html (1.3),
no-ancestors-option/attachment.html (1.3),
no-ancestors-option/author.html (1.3),
no-ancestors-option/date.html (1.3),
no-ancestors-option/index.html (1.3),
no-ancestors-option/subject.html (1.3),
no-ancestors-option/att-0000/cvs2cl.pl (1.3),
no-common-dir-option/0000.html (1.4),
no-common-dir-option/0001.html (1.4),
no-common-dir-option/0002.html (1.3),
no-common-dir-option/attachment.html (1.4),
no-common-dir-option/author.html (1.4),
no-common-dir-option/date.html (1.4),
no-common-dir-option/index.html (1.4),
no-common-dir-option/subject.html (1.4), no-indent/0000.html
(1.2), no-indent/0001.html (1.2), no-indent/attachment.html
(1.2), no-indent/author.html (1.2), no-indent/date.html (1.2),
no-indent/index.html (1.2), no-indent/subject.html (1.2),
no-indent-still-does/0000.html (1.1),
no-indent-still-does/0001.html (1.1),
no-indent-still-does/attachment.html (1.1),
no-indent-still-does/author.html (1.1),
no-indent-still-does/date.html (1.1),
no-indent-still-does/index.html (1.1),
no-indent-still-does/subject.html (1.1), no-manpage/0000.html
(1.1), no-manpage/0001.html (1.1), no-manpage/attachment.html
(1.1), no-manpage/author.html (1.1), no-manpage/date.html (1.1),
no-manpage/index.html (1.1), no-manpage/subject.html (1.1),
no-times-option/0000.html (1.3), no-times-option/0001.html (1.3),
no-times-option/attachment.html (1.3),
no-times-option/author.html (1.3), no-times-option/date.html
(1.3), no-times-option/index.html (1.3),
no-times-option/subject.html (1.3),
passwd-user-expansion/0000.html (1.3),
passwd-user-expansion/0001.html (1.3),
passwd-user-expansion/0002.html (1.3),
passwd-user-expansion/0003.html (1.3),
passwd-user-expansion/0004.html (1.3),
passwd-user-expansion/attachment.html (1.3),
passwd-user-expansion/author.html (1.3),
passwd-user-expansion/date.html (1.3),
passwd-user-expansion/index.html (1.3),
passwd-user-expansion/subject.html (1.3), rcs-file-name/0000.html
(1.3), rcs-file-name/0001.html (1.3),
rcs-file-name/attachment.html (1.3), rcs-file-name/author.html
(1.3), rcs-file-name/date.html (1.3), rcs-file-name/index.html
(1.3), rcs-file-name/subject.html (1.3),
rcs-file-windoze/0000.html (1.3), rcs-file-windoze/0001.html
(1.3), rcs-file-windoze/attachment.html (1.3),
rcs-file-windoze/author.html (1.3), rcs-file-windoze/date.html
(1.3), rcs-file-windoze/index.html (1.3),
rcs-file-windoze/subject.html (1.3), rcs-option/0000.html (1.3),
rcs-option/0001.html (1.3), rcs-option/0002.html (1.3),
rcs-option/attachment.html (1.3), rcs-option/author.html (1.3),
rcs-option/date.html (1.3), rcs-option/index.html (1.3),
rcs-option/subject.html (1.3), remove-attic-from-rcs/0000.html
(1.2), remove-attic-from-rcs/0001.html (1.2),
remove-attic-from-rcs/0002.html (1.2),
remove-attic-from-rcs/0003.html (1.2),
remove-attic-from-rcs/0004.html (1.2),
remove-attic-from-rcs/0005.html (1.2),
remove-attic-from-rcs/attachment.html (1.2),
remove-attic-from-rcs/author.html (1.2),
remove-attic-from-rcs/date.html (1.2),
remove-attic-from-rcs/index.html (1.2),
remove-attic-from-rcs/subject.html (1.2),
revert-common-dir-1file/0000.html (1.5),
revert-common-dir-1file/0001.html (1.5),
revert-common-dir-1file/0002.html (1.4),
revert-common-dir-1file/0003.html (1.3),
revert-common-dir-1file/attachment.html (1.5),
revert-common-dir-1file/author.html (1.5),
revert-common-dir-1file/date.html (1.5),
revert-common-dir-1file/index.html (1.5),
revert-common-dir-1file/subject.html (1.5): Mail updates for 2.52
2004-01-20 05:37 fluffy
* ieee1394-cl.html (1.1): Daniel Ciaglia's XSLT (Example Output)
2004-01-20 05:30 fluffy
* cl2any-ciaglia.bash (1.1), cl2html-ciaglia.xslt (1.1): Daniel
Ciaglia's XSLT
2003-12-10 03:27 fluffy
* index.html (1.24): Add Robin Johnson to the list of contributors
2003-12-09 05:16 fluffy
* filter-cvs2cl.xslt (1.1): [no log message]
2003-12-09 05:14 fluffy
* index.html (1.23): Add in 2.51 release notes, and authors &
contributors section
2003-12-09 05:05 fluffy
* BUGS/mail/: branch-added-files-with-space-in-fn/0000.html (1.1),
branch-added-files-with-space-in-fn/0001.html (1.1),
branch-added-files-with-space-in-fn/0002.html (1.1),
branch-added-files-with-space-in-fn/attachment.html (1.1),
branch-added-files-with-space-in-fn/author.html (1.1),
branch-added-files-with-space-in-fn/date.html (1.1),
branch-added-files-with-space-in-fn/index.html (1.1),
branch-added-files-with-space-in-fn/subject.html (1.1),
collate-by-tag/0000.html (1.1), collate-by-tag/0001.html (1.1),
collate-by-tag/attachment.html (1.1), collate-by-tag/author.html
(1.1), collate-by-tag/date.html (1.1), collate-by-tag/index.html
(1.1), collate-by-tag/subject.html (1.1),
examples-of-date-use/0000.html (1.1),
examples-of-date-use/0001.html (1.1),
examples-of-date-use/0002.html (1.1),
examples-of-date-use/0003.html (1.1),
examples-of-date-use/attachment.html (1.1),
examples-of-date-use/author.html (1.1),
examples-of-date-use/date.html (1.1),
examples-of-date-use/index.html (1.1),
examples-of-date-use/subject.html (1.1),
gecos-unitialized-value/0000.html (1.1),
gecos-unitialized-value/0001.html (1.1),
gecos-unitialized-value/attachment.html (1.1),
gecos-unitialized-value/author.html (1.1),
gecos-unitialized-value/date.html (1.1),
gecos-unitialized-value/index.html (1.1),
gecos-unitialized-value/subject.html (1.1),
multi-follow/0000.html (1.1), multi-follow/0001.html (1.1),
multi-follow/attachment.html (1.1), multi-follow/author.html
(1.1), multi-follow/date.html (1.1), multi-follow/index.html
(1.1), multi-follow/subject.html (1.1), no-indent/0000.html
(1.1), no-indent/0001.html (1.1), no-indent/attachment.html
(1.1), no-indent/author.html (1.1), no-indent/date.html (1.1),
no-indent/index.html (1.1), no-indent/subject.html (1.1),
remove-attic-from-rcs/0000.html (1.1),
remove-attic-from-rcs/0001.html (1.1),
remove-attic-from-rcs/0002.html (1.1),
remove-attic-from-rcs/0003.html (1.1),
remove-attic-from-rcs/0004.html (1.1),
remove-attic-from-rcs/0005.html (1.1),
remove-attic-from-rcs/attachment.html (1.1),
remove-attic-from-rcs/author.html (1.1),
remove-attic-from-rcs/date.html (1.1),
remove-attic-from-rcs/index.html (1.1),
remove-attic-from-rcs/subject.html (1.1),
xml-add-isodate/0000.html (1.1), xml-add-isodate/0001.html (1.1),
xml-add-isodate/attachment.html (1.1),
xml-add-isodate/author.html (1.1), xml-add-isodate/date.html
(1.1), xml-add-isodate/index.html (1.1),
xml-add-isodate/subject.html (1.1),
xml-add-isodate/att-0000/filter-cvs2cl.xsl (1.1),
xml-add-isodate/att-0000/isoDate.patch (1.1): Bugs status update
2003-12-09 04:58 fluffy
* BUGS/: detail.html (1.8), summary.html (1.7),
mail/-W-and-0-value/0000.html (1.2),
mail/-W-and-0-value/attachment.html (1.2),
mail/-W-and-0-value/author.html (1.2),
mail/-W-and-0-value/date.html (1.2),
mail/-W-and-0-value/index.html (1.2),
mail/-W-and-0-value/subject.html (1.2), mail/-r-and--b/0000.html
(1.2), mail/-r-and--b/attachment.html (1.2),
mail/-r-and--b/author.html (1.2), mail/-r-and--b/date.html (1.2),
mail/-r-and--b/index.html (1.2), mail/-r-and--b/subject.html
(1.2), mail/FSF-option/0000.html (1.3), mail/FSF-option/0001.html
(1.3), mail/FSF-option/0002.html (1.2),
mail/FSF-option/attachment.html (1.3),
mail/FSF-option/author.html (1.3), mail/FSF-option/date.html
(1.3), mail/FSF-option/index.html (1.3),
mail/FSF-option/subject.html (1.3), mail/accum-and-D/0000.html
(1.2), mail/accum-and-D/0001.html (1.2),
mail/accum-and-D/attachment.html (1.2),
mail/accum-and-D/author.html (1.2), mail/accum-and-D/date.html
(1.2), mail/accum-and-D/index.html (1.2),
mail/accum-and-D/subject.html (1.2),
mail/accum-and-D/att-0000/cvs2cl.pl.diff (1.1),
mail/accum-utc-repeated-add/0000.html (1.4),
mail/accum-utc-repeated-add/0001.html (1.4),
mail/accum-utc-repeated-add/0002.html (1.3),
mail/accum-utc-repeated-add/0003.html (1.3),
mail/accum-utc-repeated-add/0004.html (1.3),
mail/accum-utc-repeated-add/0005.html (1.2),
mail/accum-utc-repeated-add/0006.html (1.2),
mail/accum-utc-repeated-add/0007.html (1.2),
mail/accum-utc-repeated-add/0008.html (1.2),
mail/accum-utc-repeated-add/attachment.html (1.4),
mail/accum-utc-repeated-add/author.html (1.4),
mail/accum-utc-repeated-add/date.html (1.4),
mail/accum-utc-repeated-add/index.html (1.4),
mail/accum-utc-repeated-add/subject.html (1.4),
mail/add-host-recognition-to--U/0000.html (1.2),
mail/add-host-recognition-to--U/0001.html (1.2),
mail/add-host-recognition-to--U/0002.html (1.2),
mail/add-host-recognition-to--U/0003.html (1.2),
mail/add-host-recognition-to--U/0004.html (1.2),
mail/add-host-recognition-to--U/attachment.html (1.2),
mail/add-host-recognition-to--U/author.html (1.2),
mail/add-host-recognition-to--U/date.html (1.2),
mail/add-host-recognition-to--U/index.html (1.2),
mail/add-host-recognition-to--U/subject.html (1.2),
mail/add-native-limits-options/0000.html (1.2),
mail/add-native-limits-options/attachment.html (1.2),
mail/add-native-limits-options/author.html (1.2),
mail/add-native-limits-options/date.html (1.2),
mail/add-native-limits-options/index.html (1.2),
mail/add-native-limits-options/subject.html (1.2),
mail/binmode-on-windoze/0000.html (1.3),
mail/binmode-on-windoze/0001.html (1.2),
mail/binmode-on-windoze/attachment.html (1.2),
mail/binmode-on-windoze/author.html (1.2),
mail/binmode-on-windoze/date.html (1.2),
mail/binmode-on-windoze/index.html (1.2),
mail/binmode-on-windoze/subject.html (1.2),
mail/change-tracking-format/0000.html (1.2),
mail/change-tracking-format/attachment.html (1.2),
mail/change-tracking-format/author.html (1.2),
mail/change-tracking-format/date.html (1.2),
mail/change-tracking-format/index.html (1.2),
mail/change-tracking-format/subject.html (1.2),
mail/chrono-option/0000.html (1.3), mail/chrono-option/0001.html
(1.3), mail/chrono-option/0002.html (1.3),
mail/chrono-option/0003.html (1.2),
mail/chrono-option/attachment.html (1.3),
mail/chrono-option/author.html (1.3),
mail/chrono-option/date.html (1.3), mail/chrono-option/index.html
(1.3), mail/chrono-option/subject.html (1.3),
mail/chrono-undocumented/0000.html (1.2),
mail/chrono-undocumented/0001.html (1.2),
mail/chrono-undocumented/attachment.html (1.2),
mail/chrono-undocumented/author.html (1.2),
mail/chrono-undocumented/date.html (1.2),
mail/chrono-undocumented/index.html (1.2),
mail/chrono-undocumented/subject.html (1.2),
mail/collect-v-numbers/0000.html (1.3),
mail/collect-v-numbers/0001.html (1.2),
mail/collect-v-numbers/attachment.html (1.3),
mail/collect-v-numbers/author.html (1.3),
mail/collect-v-numbers/date.html (1.3),
mail/collect-v-numbers/index.html (1.3),
mail/collect-v-numbers/subject.html (1.3),
mail/cosmetic-indenting/0000.html (1.2),
mail/cosmetic-indenting/0001.html (1.2),
mail/cosmetic-indenting/0002.html (1.2),
mail/cosmetic-indenting/0003.html (1.2),
mail/cosmetic-indenting/0004.html (1.2),
mail/cosmetic-indenting/0005.html (1.2),
mail/cosmetic-indenting/0006.html (1.2),
mail/cosmetic-indenting/0007.html (1.2),
mail/cosmetic-indenting/attachment.html (1.2),
mail/cosmetic-indenting/author.html (1.2),
mail/cosmetic-indenting/date.html (1.2),
mail/cosmetic-indenting/index.html (1.2),
mail/cosmetic-indenting/subject.html (1.2),
mail/deleted-file-no-revision/0000.html (1.2),
mail/deleted-file-no-revision/attachment.html (1.2),
mail/deleted-file-no-revision/author.html (1.2),
mail/deleted-file-no-revision/date.html (1.2),
mail/deleted-file-no-revision/index.html (1.2),
mail/deleted-file-no-revision/subject.html (1.2),
mail/deleted-subdirs-disappear/0000.html (1.2),
mail/deleted-subdirs-disappear/attachment.html (1.2),
mail/deleted-subdirs-disappear/author.html (1.2),
mail/deleted-subdirs-disappear/date.html (1.2),
mail/deleted-subdirs-disappear/index.html (1.2),
mail/deleted-subdirs-disappear/subject.html (1.2),
mail/delta-flag/0000.html (1.2), mail/delta-flag/0001.html (1.2),
mail/delta-flag/0002.html (1.2), mail/delta-flag/attachment.html
(1.2), mail/delta-flag/author.html (1.2),
mail/delta-flag/date.html (1.2), mail/delta-flag/index.html
(1.2), mail/delta-flag/subject.html (1.2),
mail/delta-undocumented/0000.html (1.3),
mail/delta-undocumented/0001.html (1.3),
mail/delta-undocumented/0002.html (1.3),
mail/delta-undocumented/0003.html (1.2),
mail/delta-undocumented/attachment.html (1.3),
mail/delta-undocumented/author.html (1.3),
mail/delta-undocumented/date.html (1.3),
mail/delta-undocumented/index.html (1.3),
mail/delta-undocumented/subject.html (1.3),
mail/dirs-called-0/0000.html (1.3), mail/dirs-called-0/0001.html
(1.3), mail/dirs-called-0/0002.html (1.3),
mail/dirs-called-0/0003.html (1.3), mail/dirs-called-0/0004.html
(1.3), mail/dirs-called-0/0005.html (1.2),
mail/dirs-called-0/0006.html (1.2), mail/dirs-called-0/0007.html
(1.2), mail/dirs-called-0/0008.html (1.2),
mail/dirs-called-0/0009.html (1.2), mail/dirs-called-0/0010.html
(1.2), mail/dirs-called-0/attachment.html (1.3),
mail/dirs-called-0/author.html (1.3),
mail/dirs-called-0/date.html (1.3), mail/dirs-called-0/index.html
(1.3), mail/dirs-called-0/subject.html (1.3),
mail/dirs-called-0/att-0009/cvs2cl.pl (1.2),
mail/eol-whitespace/0000.html (1.2),
mail/eol-whitespace/0001.html (1.2),
mail/eol-whitespace/0002.html (1.2),
mail/eol-whitespace/0003.html (1.2),
mail/eol-whitespace/attachment.html (1.2),
mail/eol-whitespace/author.html (1.2),
mail/eol-whitespace/date.html (1.2),
mail/eol-whitespace/index.html (1.2),
mail/eol-whitespace/subject.html (1.2),
mail/exclude-regex/0000.html (1.2), mail/exclude-regex/0001.html
(1.2), mail/exclude-regex/attachment.html (1.2),
mail/exclude-regex/author.html (1.2),
mail/exclude-regex/date.html (1.2), mail/exclude-regex/index.html
(1.2), mail/exclude-regex/subject.html (1.2),
mail/extra-square-brackets/0000.html (1.4),
mail/extra-square-brackets/0001.html (1.4),
mail/extra-square-brackets/0002.html (1.4),
mail/extra-square-brackets/0003.html (1.4),
mail/extra-square-brackets/0004.html (1.3),
mail/extra-square-brackets/0005.html (1.3),
mail/extra-square-brackets/0006.html (1.3),
mail/extra-square-brackets/0007.html (1.2),
mail/extra-square-brackets/attachment.html (1.4),
mail/extra-square-brackets/author.html (1.4),
mail/extra-square-brackets/date.html (1.4),
mail/extra-square-brackets/index.html (1.4),
mail/extra-square-brackets/subject.html (1.4),
mail/gecos-domain-options/0000.html (1.3),
mail/gecos-domain-options/0001.html (1.3),
mail/gecos-domain-options/0002.html (1.2),
mail/gecos-domain-options/0003.html (1.2),
mail/gecos-domain-options/attachment.html (1.3),
mail/gecos-domain-options/author.html (1.3),
mail/gecos-domain-options/date.html (1.3),
mail/gecos-domain-options/index.html (1.3),
mail/gecos-domain-options/subject.html (1.3),
mail/group-by-author-and-day/0000.html (1.2),
mail/group-by-author-and-day/0001.html (1.2),
mail/group-by-author-and-day/0002.html (1.2),
mail/group-by-author-and-day/0003.html (1.2),
mail/group-by-author-and-day/attachment.html (1.2),
mail/group-by-author-and-day/author.html (1.2),
mail/group-by-author-and-day/date.html (1.2),
mail/group-by-author-and-day/index.html (1.2),
mail/group-by-author-and-day/subject.html (1.2),
mail/hardwired-exec-line/0000.html (1.2),
mail/hardwired-exec-line/0001.html (1.2),
mail/hardwired-exec-line/0002.html (1.2),
mail/hardwired-exec-line/0003.html (1.2),
mail/hardwired-exec-line/attachment.html (1.2),
mail/hardwired-exec-line/author.html (1.2),
mail/hardwired-exec-line/date.html (1.2),
mail/hardwired-exec-line/index.html (1.2),
mail/hardwired-exec-line/subject.html (1.2),
mail/hide-branch-additions/0000.html (1.2),
mail/hide-branch-additions/0001.html (1.2),
mail/hide-branch-additions/attachment.html (1.2),
mail/hide-branch-additions/author.html (1.2),
mail/hide-branch-additions/date.html (1.2),
mail/hide-branch-additions/index.html (1.2),
mail/hide-branch-additions/subject.html (1.2),
mail/hide-branch-additions/att-0000/cvs2cl.pl.2.48 (1.2),
mail/ignore-tag-option/0000.html (1.2),
mail/ignore-tag-option/attachment.html (1.2),
mail/ignore-tag-option/author.html (1.2),
mail/ignore-tag-option/date.html (1.2),
mail/ignore-tag-option/index.html (1.2),
mail/ignore-tag-option/subject.html (1.2),
mail/inverted--no-ancestors/0000.html (1.2),
mail/inverted--no-ancestors/0001.html (1.2),
mail/inverted--no-ancestors/attachment.html (1.2),
mail/inverted--no-ancestors/author.html (1.2),
mail/inverted--no-ancestors/date.html (1.2),
mail/inverted--no-ancestors/index.html (1.2),
mail/inverted--no-ancestors/subject.html (1.2),
mail/item-prefix/0000.html (1.2), mail/item-prefix/0001.html
(1.2), mail/item-prefix/attachment.html (1.2),
mail/item-prefix/author.html (1.2), mail/item-prefix/date.html
(1.2), mail/item-prefix/index.html (1.2),
mail/item-prefix/subject.html (1.2), mail/latest-rev/0000.html
(1.2), mail/latest-rev/0001.html (1.2),
mail/latest-rev/attachment.html (1.2),
mail/latest-rev/author.html (1.2), mail/latest-rev/date.html
(1.2), mail/latest-rev/index.html (1.2),
mail/latest-rev/subject.html (1.2),
mail/log-only-on-branch/0000.html (1.2),
mail/log-only-on-branch/0001.html (1.2),
mail/log-only-on-branch/0002.html (1.2),
mail/log-only-on-branch/0003.html (1.2),
mail/log-only-on-branch/attachment.html (1.2),
mail/log-only-on-branch/author.html (1.2),
mail/log-only-on-branch/date.html (1.2),
mail/log-only-on-branch/index.html (1.2),
mail/log-only-on-branch/subject.html (1.2),
mail/mailname-vs-domain/0000.html (1.2),
mail/mailname-vs-domain/0001.html (1.2),
mail/mailname-vs-domain/0002.html (1.2),
mail/mailname-vs-domain/0003.html (1.2),
mail/mailname-vs-domain/attachment.html (1.2),
mail/mailname-vs-domain/author.html (1.2),
mail/mailname-vs-domain/date.html (1.2),
mail/mailname-vs-domain/index.html (1.2),
mail/mailname-vs-domain/subject.html (1.2),
mail/malformed-utf-8/0000.html (1.2),
mail/malformed-utf-8/0001.html (1.2),
mail/malformed-utf-8/0002.html (1.2),
mail/malformed-utf-8/0003.html (1.2),
mail/malformed-utf-8/0004.html (1.2),
mail/malformed-utf-8/0005.html (1.2),
mail/malformed-utf-8/0006.html (1.2),
mail/malformed-utf-8/0007.html (1.2),
mail/malformed-utf-8/0008.html (1.2),
mail/malformed-utf-8/0009.html (1.2),
mail/malformed-utf-8/0010.html (1.2),
mail/malformed-utf-8/0011.html (1.2),
mail/malformed-utf-8/attachment.html (1.2),
mail/malformed-utf-8/author.html (1.2),
mail/malformed-utf-8/date.html (1.2),
mail/malformed-utf-8/index.html (1.2),
mail/malformed-utf-8/subject.html (1.2),
mail/malformed-utf-8/att-0006/perl-V.txt (1.1),
mail/malformed-utf-8/att-0008/env.txt (1.1),
mail/no-ancestors-option/0000.html (1.2),
mail/no-ancestors-option/0001.html (1.2),
mail/no-ancestors-option/0002.html (1.2),
mail/no-ancestors-option/attachment.html (1.2),
mail/no-ancestors-option/author.html (1.2),
mail/no-ancestors-option/date.html (1.2),
mail/no-ancestors-option/index.html (1.2),
mail/no-ancestors-option/subject.html (1.2),
mail/no-ancestors-option/att-0000/cvs2cl.pl (1.2),
mail/no-common-dir-option/0000.html (1.3),
mail/no-common-dir-option/0001.html (1.3),
mail/no-common-dir-option/0002.html (1.2),
mail/no-common-dir-option/attachment.html (1.3),
mail/no-common-dir-option/author.html (1.3),
mail/no-common-dir-option/date.html (1.3),
mail/no-common-dir-option/index.html (1.3),
mail/no-common-dir-option/subject.html (1.3),
mail/no-times-option/0000.html (1.2),
mail/no-times-option/0001.html (1.2),
mail/no-times-option/attachment.html (1.2),
mail/no-times-option/author.html (1.2),
mail/no-times-option/date.html (1.2),
mail/no-times-option/index.html (1.2),
mail/no-times-option/subject.html (1.2),
mail/passwd-user-expansion/0000.html (1.2),
mail/passwd-user-expansion/0001.html (1.2),
mail/passwd-user-expansion/0002.html (1.2),
mail/passwd-user-expansion/0003.html (1.2),
mail/passwd-user-expansion/0004.html (1.2),
mail/passwd-user-expansion/attachment.html (1.2),
mail/passwd-user-expansion/author.html (1.2),
mail/passwd-user-expansion/date.html (1.2),
mail/passwd-user-expansion/index.html (1.2),
mail/passwd-user-expansion/subject.html (1.2),
mail/rcs-file-name/0000.html (1.2), mail/rcs-file-name/0001.html
(1.2), mail/rcs-file-name/attachment.html (1.2),
mail/rcs-file-name/author.html (1.2),
mail/rcs-file-name/date.html (1.2), mail/rcs-file-name/index.html
(1.2), mail/rcs-file-name/subject.html (1.2),
mail/rcs-file-windoze/0000.html (1.2),
mail/rcs-file-windoze/0001.html (1.2),
mail/rcs-file-windoze/attachment.html (1.2),
mail/rcs-file-windoze/author.html (1.2),
mail/rcs-file-windoze/date.html (1.2),
mail/rcs-file-windoze/index.html (1.2),
mail/rcs-file-windoze/subject.html (1.2),
mail/rcs-option/0000.html (1.2), mail/rcs-option/0001.html (1.2),
mail/rcs-option/0002.html (1.2), mail/rcs-option/attachment.html
(1.2), mail/rcs-option/author.html (1.2),
mail/rcs-option/date.html (1.2), mail/rcs-option/index.html
(1.2), mail/rcs-option/subject.html (1.2),
mail/revert-common-dir-1file/0000.html (1.4),
mail/revert-common-dir-1file/0001.html (1.4),
mail/revert-common-dir-1file/0002.html (1.3),
mail/revert-common-dir-1file/0003.html (1.2),
mail/revert-common-dir-1file/attachment.html (1.4),
mail/revert-common-dir-1file/author.html (1.4),
mail/revert-common-dir-1file/date.html (1.4),
mail/revert-common-dir-1file/index.html (1.4),
mail/revert-common-dir-1file/subject.html (1.4),
mail/rlog-format-stdin/0000.html (1.2),
mail/rlog-format-stdin/0001.html (1.2),
mail/rlog-format-stdin/attachment.html (1.2),
mail/rlog-format-stdin/author.html (1.2),
mail/rlog-format-stdin/date.html (1.2),
mail/rlog-format-stdin/index.html (1.2),
mail/rlog-format-stdin/subject.html (1.2),
mail/shell-minimize-file-lists/0000.html (1.3),
mail/shell-minimize-file-lists/0001.html (1.3),
mail/shell-minimize-file-lists/0002.html (1.3),
mail/shell-minimize-file-lists/0003.html (1.3),
mail/shell-minimize-file-lists/0004.html (1.3),
mail/shell-minimize-file-lists/0005.html (1.2),
mail/shell-minimize-file-lists/attachment.html (1.3),
mail/shell-minimize-file-lists/author.html (1.3),
mail/shell-minimize-file-lists/date.html (1.3),
mail/shell-minimize-file-lists/index.html (1.3),
mail/shell-minimize-file-lists/subject.html (1.3),
mail/show-dead-option/0000.html (1.2),
mail/show-dead-option/0001.html (1.2),
mail/show-dead-option/attachment.html (1.2),
mail/show-dead-option/author.html (1.2),
mail/show-dead-option/date.html (1.2),
mail/show-dead-option/index.html (1.2),
mail/show-dead-option/subject.html (1.2),
mail/show-tags-option/0000.html (1.3),
mail/show-tags-option/0001.html (1.3),
mail/show-tags-option/0002.html (1.3),
mail/show-tags-option/0003.html (1.2),
mail/show-tags-option/attachment.html (1.3),
mail/show-tags-option/author.html (1.3),
mail/show-tags-option/date.html (1.3),
mail/show-tags-option/index.html (1.3),
mail/show-tags-option/subject.html (1.3),
mail/sort-by-filename/0000.html (1.2),
mail/sort-by-filename/0001.html (1.2),
mail/sort-by-filename/attachment.html (1.2),
mail/sort-by-filename/author.html (1.2),
mail/sort-by-filename/date.html (1.2),
mail/sort-by-filename/index.html (1.2),
mail/sort-by-filename/subject.html (1.2),
mail/squash-duplicate-filenames/0000.html (1.3),
mail/squash-duplicate-filenames/0001.html (1.3),
mail/squash-duplicate-filenames/0002.html (1.2),
mail/squash-duplicate-filenames/attachment.html (1.3),
mail/squash-duplicate-filenames/author.html (1.3),
mail/squash-duplicate-filenames/date.html (1.3),
mail/squash-duplicate-filenames/index.html (1.3),
mail/squash-duplicate-filenames/subject.html (1.3),
mail/summary-option/0000.html (1.2),
mail/summary-option/0001.html (1.2),
mail/summary-option/0002.html (1.2),
mail/summary-option/attachment.html (1.2),
mail/summary-option/author.html (1.2),
mail/summary-option/date.html (1.2),
mail/summary-option/index.html (1.2),
mail/summary-option/subject.html (1.2),
mail/support-for-function-name/0000.html (1.2),
mail/support-for-function-name/0001.html (1.2),
mail/support-for-function-name/attachment.html (1.2),
mail/support-for-function-name/author.html (1.2),
mail/support-for-function-name/date.html (1.2),
mail/support-for-function-name/index.html (1.2),
mail/support-for-function-name/subject.html (1.2),
mail/tagdates-option/0000.html (1.2),
mail/tagdates-option/0001.html (1.2),
mail/tagdates-option/attachment.html (1.2),
mail/tagdates-option/author.html (1.2),
mail/tagdates-option/date.html (1.2),
mail/tagdates-option/index.html (1.2),
mail/tagdates-option/subject.html (1.2),
mail/tagdates-option/att-0000/cvs2cl.tagdates.patch (1.1),
mail/unify-by-author-and-time/0000.html (1.3),
mail/unify-by-author-and-time/0001.html (1.2),
mail/unify-by-author-and-time/0002.html (1.2),
mail/unify-by-author-and-time/attachment.html (1.3),
mail/unify-by-author-and-time/author.html (1.3),
mail/unify-by-author-and-time/date.html (1.3),
mail/unify-by-author-and-time/index.html (1.3),
mail/unify-by-author-and-time/subject.html (1.3),
mail/update-option/0000.html (1.3), mail/update-option/0001.html
(1.3), mail/update-option/0002.html (1.3),
mail/update-option/0003.html (1.2),
mail/update-option/attachment.html (1.3),
mail/update-option/author.html (1.3),
mail/update-option/date.html (1.3), mail/update-option/index.html
(1.3), mail/update-option/subject.html (1.3),
mail/wrap-spaces/0000.html (1.2),
mail/wrap-spaces/attachment.html (1.2),
mail/wrap-spaces/author.html (1.2), mail/wrap-spaces/date.html
(1.2), mail/wrap-spaces/index.html (1.2),
mail/wrap-spaces/subject.html (1.2),
mail/xml-encoding-option/0000.html (1.2),
mail/xml-encoding-option/0001.html (1.2),
mail/xml-encoding-option/0002.html (1.2),
mail/xml-encoding-option/attachment.html (1.2),
mail/xml-encoding-option/author.html (1.2),
mail/xml-encoding-option/date.html (1.2),
mail/xml-encoding-option/index.html (1.2),
mail/xml-encoding-option/subject.html (1.2),
mail/xml-encoding-option/att-0000/cvs2cl.pl (1.1),
mail/xml-encoding-option/att-0000/diff.txt (1.1),
mail/xml-msg-spurious-newline/0000.html (1.2),
mail/xml-msg-spurious-newline/attachment.html (1.2),
mail/xml-msg-spurious-newline/author.html (1.2),
mail/xml-msg-spurious-newline/date.html (1.2),
mail/xml-msg-spurious-newline/index.html (1.2),
mail/xml-msg-spurious-newline/subject.html (1.2),
mail/xml-namespace-option/0000.html (1.2),
mail/xml-namespace-option/0001.html (1.2),
mail/xml-namespace-option/attachment.html (1.2),
mail/xml-namespace-option/author.html (1.2),
mail/xml-namespace-option/date.html (1.2),
mail/xml-namespace-option/index.html (1.2),
mail/xml-namespace-option/subject.html (1.2): Bugs status update
2003-12-09 04:07 fluffy
* cvs2cl.pl (2.51):
* add no-indent option
patch contributed by Akos Kiss
* add examples of date use
* partial implementation of group-within-date
* avoid uninitialized value warnings with --gecos
patch contributed by Mitsuaki Masuhara
* fix --FSF to not indent extra spaces
* add ISO date to XML output
patch contributed by Joseph Walton
* remove Attic/ path from --rcs output (to match non-rcs output)
patch contributed by Dave Elcock
* handle files with a space in their name that were added on a
branch patch contributed by Dave Elcock
2003-08-25 06:11 fluffy
* BUGS/: detail.html (1.7), summary.html (1.6),
mail/accum-utc-repeated-add/0000.html (1.3),
mail/accum-utc-repeated-add/0001.html (1.3),
mail/accum-utc-repeated-add/0002.html (1.2),
mail/accum-utc-repeated-add/0003.html (1.2),
mail/accum-utc-repeated-add/0004.html (1.2),
mail/accum-utc-repeated-add/0005.html (1.1),
mail/accum-utc-repeated-add/0006.html (1.1),
mail/accum-utc-repeated-add/0007.html (1.1),
mail/accum-utc-repeated-add/0008.html (1.1),
mail/accum-utc-repeated-add/attachment.html (1.3),
mail/accum-utc-repeated-add/author.html (1.3),
mail/accum-utc-repeated-add/date.html (1.3),
mail/accum-utc-repeated-add/index.html (1.3),
mail/accum-utc-repeated-add/subject.html (1.3),
mail/accum-utc-repeated-add/att-0005/LOG.gz (1.1),
mail/accum-utc-repeated-add/att-0008/00-part (1.1),
mail/add-host-recognition-to--U/0000.html (1.1),
mail/add-host-recognition-to--U/0001.html (1.1),
mail/add-host-recognition-to--U/0002.html (1.1),
mail/add-host-recognition-to--U/0003.html (1.1),
mail/add-host-recognition-to--U/0004.html (1.1),
mail/add-host-recognition-to--U/attachment.html (1.1),
mail/add-host-recognition-to--U/author.html (1.1),
mail/add-host-recognition-to--U/date.html (1.1),
mail/add-host-recognition-to--U/index.html (1.1),
mail/add-host-recognition-to--U/subject.html (1.1),
mail/add-native-limits-options/0000.html (1.1),
mail/add-native-limits-options/attachment.html (1.1),
mail/add-native-limits-options/author.html (1.1),
mail/add-native-limits-options/date.html (1.1),
mail/add-native-limits-options/index.html (1.1),
mail/add-native-limits-options/subject.html (1.1),
mail/change-tracking-format/0000.html (1.1),
mail/change-tracking-format/attachment.html (1.1),
mail/change-tracking-format/author.html (1.1),
mail/change-tracking-format/date.html (1.1),
mail/change-tracking-format/index.html (1.1),
mail/change-tracking-format/subject.html (1.1),
mail/chrono-undocumented/0000.html (1.1),
mail/chrono-undocumented/0001.html (1.1),
mail/chrono-undocumented/attachment.html (1.1),
mail/chrono-undocumented/author.html (1.1),
mail/chrono-undocumented/date.html (1.1),
mail/chrono-undocumented/index.html (1.1),
mail/chrono-undocumented/subject.html (1.1),
mail/collect-v-numbers/0000.html (1.2),
mail/collect-v-numbers/0001.html (1.1),
mail/collect-v-numbers/attachment.html (1.2),
mail/collect-v-numbers/author.html (1.2),
mail/collect-v-numbers/date.html (1.2),
mail/collect-v-numbers/index.html (1.2),
mail/collect-v-numbers/subject.html (1.2),
mail/cosmetic-indenting/0000.html (1.1),
mail/cosmetic-indenting/0001.html (1.1),
mail/cosmetic-indenting/0002.html (1.1),
mail/cosmetic-indenting/0003.html (1.1),
mail/cosmetic-indenting/0004.html (1.1),
mail/cosmetic-indenting/0005.html (1.1),
mail/cosmetic-indenting/0006.html (1.1),
mail/cosmetic-indenting/0007.html (1.1),
mail/cosmetic-indenting/attachment.html (1.1),
mail/cosmetic-indenting/author.html (1.1),
mail/cosmetic-indenting/date.html (1.1),
mail/cosmetic-indenting/index.html (1.1),
mail/cosmetic-indenting/subject.html (1.1),
mail/eol-whitespace/0000.html (1.1),
mail/eol-whitespace/0001.html (1.1),
mail/eol-whitespace/0002.html (1.1),
mail/eol-whitespace/0003.html (1.1),
mail/eol-whitespace/attachment.html (1.1),
mail/eol-whitespace/author.html (1.1),
mail/eol-whitespace/date.html (1.1),
mail/eol-whitespace/index.html (1.1),
mail/eol-whitespace/subject.html (1.1),
mail/eol-whitespace/att-0002/cvs2cl.diff (1.1),
mail/group-by-author-and-day/0000.html (1.1),
mail/group-by-author-and-day/0001.html (1.1),
mail/group-by-author-and-day/0002.html (1.1),
mail/group-by-author-and-day/0003.html (1.1),
mail/group-by-author-and-day/attachment.html (1.1),
mail/group-by-author-and-day/author.html (1.1),
mail/group-by-author-and-day/date.html (1.1),
mail/group-by-author-and-day/index.html (1.1),
mail/group-by-author-and-day/subject.html (1.1),
mail/group-by-author-and-day/att-0001/cl2html.xslt (1.1),
mail/hide-branch-additions/0000.html (1.1),
mail/hide-branch-additions/0001.html (1.1),
mail/hide-branch-additions/attachment.html (1.1),
mail/hide-branch-additions/author.html (1.1),
mail/hide-branch-additions/date.html (1.1),
mail/hide-branch-additions/index.html (1.1),
mail/hide-branch-additions/subject.html (1.1),
mail/hide-branch-additions/att-0000/cvs2cl.pl.2.48 (1.1),
mail/inverted--no-ancestors/0000.html (1.1),
mail/inverted--no-ancestors/0001.html (1.1),
mail/inverted--no-ancestors/attachment.html (1.1),
mail/inverted--no-ancestors/author.html (1.1),
mail/inverted--no-ancestors/date.html (1.1),
mail/inverted--no-ancestors/index.html (1.1),
mail/inverted--no-ancestors/subject.html (1.1),
mail/mailname-vs-domain/0000.html (1.1),
mail/mailname-vs-domain/0001.html (1.1),
mail/mailname-vs-domain/0002.html (1.1),
mail/mailname-vs-domain/0003.html (1.1),
mail/mailname-vs-domain/attachment.html (1.1),
mail/mailname-vs-domain/author.html (1.1),
mail/mailname-vs-domain/date.html (1.1),
mail/mailname-vs-domain/index.html (1.1),
mail/mailname-vs-domain/subject.html (1.1),
mail/rcs-file-windoze/0000.html (1.1),
mail/rcs-file-windoze/0001.html (1.1),
mail/rcs-file-windoze/attachment.html (1.1),
mail/rcs-file-windoze/author.html (1.1),
mail/rcs-file-windoze/date.html (1.1),
mail/rcs-file-windoze/index.html (1.1),
mail/rcs-file-windoze/subject.html (1.1),
mail/revert-common-dir-1file/0000.html (1.3),
mail/revert-common-dir-1file/0001.html (1.3),
mail/revert-common-dir-1file/0002.html (1.2),
mail/revert-common-dir-1file/0003.html (1.1),
mail/revert-common-dir-1file/attachment.html (1.3),
mail/revert-common-dir-1file/author.html (1.3),
mail/revert-common-dir-1file/date.html (1.3),
mail/revert-common-dir-1file/index.html (1.3),
mail/revert-common-dir-1file/subject.html (1.3),
mail/shell-minimize-file-lists/0000.html (1.2),
mail/shell-minimize-file-lists/0001.html (1.2),
mail/shell-minimize-file-lists/0002.html (1.2),
mail/shell-minimize-file-lists/0003.html (1.2),
mail/shell-minimize-file-lists/0004.html (1.2),
mail/shell-minimize-file-lists/0005.html (1.1),
mail/shell-minimize-file-lists/attachment.html (1.2),
mail/shell-minimize-file-lists/author.html (1.2),
mail/shell-minimize-file-lists/date.html (1.2),
mail/shell-minimize-file-lists/index.html (1.2),
mail/shell-minimize-file-lists/subject.html (1.2),
mail/support-for-function-name/0000.html (1.1),
mail/support-for-function-name/0001.html (1.1),
mail/support-for-function-name/attachment.html (1.1),
mail/support-for-function-name/author.html (1.1),
mail/support-for-function-name/date.html (1.1),
mail/support-for-function-name/index.html (1.1),
mail/support-for-function-name/subject.html (1.1),
mail/unify-by-author-and-time/0000.html (1.2),
mail/unify-by-author-and-time/0001.html (1.1),
mail/unify-by-author-and-time/0002.html (1.1),
mail/unify-by-author-and-time/attachment.html (1.2),
mail/unify-by-author-and-time/author.html (1.2),
mail/unify-by-author-and-time/date.html (1.2),
mail/unify-by-author-and-time/index.html (1.2),
mail/unify-by-author-and-time/subject.html (1.2),
mail/update-option/0000.html (1.2), mail/update-option/0001.html
(1.2), mail/update-option/0002.html (1.2),
mail/update-option/0003.html (1.1),
mail/update-option/attachment.html (1.2),
mail/update-option/author.html (1.2),
mail/update-option/date.html (1.2), mail/update-option/index.html
(1.2), mail/update-option/subject.html (1.2),
mail/wrap-spaces/0000.html (1.1),
mail/wrap-spaces/attachment.html (1.1),
mail/wrap-spaces/author.html (1.1), mail/wrap-spaces/date.html
(1.1), mail/wrap-spaces/index.html (1.1),
mail/wrap-spaces/subject.html (1.1),
mail/xml-msg-spurious-newline/0000.html (1.1),
mail/xml-msg-spurious-newline/attachment.html (1.1),
mail/xml-msg-spurious-newline/author.html (1.1),
mail/xml-msg-spurious-newline/date.html (1.1),
mail/xml-msg-spurious-newline/index.html (1.1),
mail/xml-msg-spurious-newline/subject.html (1.1),
mail/xml-namespace-option/0000.html (1.1),
mail/xml-namespace-option/0001.html (1.1),
mail/xml-namespace-option/attachment.html (1.1),
mail/xml-namespace-option/author.html (1.1),
mail/xml-namespace-option/date.html (1.1),
mail/xml-namespace-option/index.html (1.1),
mail/xml-namespace-option/subject.html (1.1): Bugs update for
2.50
2003-08-25 06:02 fluffy
* index.html (1.22): Comments for 2.50
2003-08-25 05:52 fluffy
* cvs2cl.pl (2.50):
* Sort tags on output to ensure determinism to assist in tests (and
other change-check mechanisms).
* Change 'wrap' to 'mywrap' because Text::Wrap in perl 5.005_03
exports wrap unconditionally and generates an override warning
* Remove additional newline from msg in XML mode
* Add --noxmlns option
* Interpret "[user@]host:/file/whatever" in -U option
patch contributed by Eddie Kohler
* Better wrapping of filenames with --no-wrap
* Undocument --update since it doesn't actually do anything useful.
2003-08-24 12:39 fluffy
* cl2html.xslt (1.1): [no log message]
2003-06-21 06:46 fluffy
* index.html (1.21): Add notes for 2.49
2003-06-21 06:24 fluffy
* cvs2cl.pl (2.49):
* Conflate --domain, --mailname options
* Document --chrono option
patch contributed by Ernie Zapata
* Amend --rcs to work with windoze
patch contributed by Ernie Zapata
* Fix awkward wrapping that hangs indent where multi-space sequences
are wrapped
* Add checking for combined use of -[lg] with --stdin
* Fix multiple accumulation of logs with --accum --utc
patch contributed by Arthur de Jong
* Remove superfluous end-of-line whitespace
patch courtesy of Oswald Buddenhagen
* Amend indenting style to hang whole paragraph past '* '.
* don't show log entries for file addition on a branch (except with
--no-hide-branch-additions option).
patch contributed by Kevin Lilly
* Document --no-hide-branch-additions flag
2003-04-22 02:58 fluffy
* index.html (1.20): Update for 2.48
2003-04-21 11:43 fluffy
* BUGS/: detail.html (1.6), summary.html (1.5),
mail/FSF-option/0000.html (1.2), mail/FSF-option/0001.html (1.2),
mail/FSF-option/0002.html (1.1), mail/FSF-option/attachment.html
(1.2), mail/FSF-option/author.html (1.2),
mail/FSF-option/date.html (1.2), mail/FSF-option/index.html
(1.2), mail/FSF-option/subject.html (1.2),
mail/accum-utc-repeated-add/0000.html (1.2),
mail/accum-utc-repeated-add/0001.html (1.2),
mail/accum-utc-repeated-add/0002.html (1.1),
mail/accum-utc-repeated-add/0003.html (1.1),
mail/accum-utc-repeated-add/0004.html (1.1),
mail/accum-utc-repeated-add/attachment.html (1.2),
mail/accum-utc-repeated-add/author.html (1.2),
mail/accum-utc-repeated-add/date.html (1.2),
mail/accum-utc-repeated-add/index.html (1.2),
mail/accum-utc-repeated-add/subject.html (1.2),
mail/chrono-option/0000.html (1.2), mail/chrono-option/0001.html
(1.2), mail/chrono-option/0002.html (1.2),
mail/chrono-option/0003.html (1.1),
mail/chrono-option/attachment.html (1.2),
mail/chrono-option/author.html (1.2),
mail/chrono-option/date.html (1.2), mail/chrono-option/index.html
(1.2), mail/chrono-option/subject.html (1.2),
mail/chrono-option/att-0000/PGP.sig (1.1),
mail/chrono-option/att-0000/rae.diff (1.1),
mail/collect-v-numbers/0000.html (1.1),
mail/collect-v-numbers/attachment.html (1.1),
mail/collect-v-numbers/author.html (1.1),
mail/collect-v-numbers/date.html (1.1),
mail/collect-v-numbers/index.html (1.1),
mail/collect-v-numbers/subject.html (1.1),
mail/delta-undocumented/0000.html (1.2),
mail/delta-undocumented/0001.html (1.2),
mail/delta-undocumented/0002.html (1.2),
mail/delta-undocumented/0003.html (1.1),
mail/delta-undocumented/attachment.html (1.2),
mail/delta-undocumented/author.html (1.2),
mail/delta-undocumented/date.html (1.2),
mail/delta-undocumented/index.html (1.2),
mail/delta-undocumented/subject.html (1.2),
mail/dirs-called-0/0000.html (1.2), mail/dirs-called-0/0001.html
(1.2), mail/dirs-called-0/0002.html (1.2),
mail/dirs-called-0/0003.html (1.2), mail/dirs-called-0/0004.html
(1.2), mail/dirs-called-0/0005.html (1.1),
mail/dirs-called-0/0006.html (1.1), mail/dirs-called-0/0007.html
(1.1), mail/dirs-called-0/0008.html (1.1),
mail/dirs-called-0/0009.html (1.1), mail/dirs-called-0/0010.html
(1.1), mail/dirs-called-0/attachment.html (1.2),
mail/dirs-called-0/author.html (1.2),
mail/dirs-called-0/date.html (1.2), mail/dirs-called-0/index.html
(1.2), mail/dirs-called-0/subject.html (1.2),
mail/dirs-called-0/att-0009/cvs2cl.pl (1.1),
mail/extra-square-brackets/0000.html (1.3),
mail/extra-square-brackets/0001.html (1.3),
mail/extra-square-brackets/0002.html (1.3),
mail/extra-square-brackets/0003.html (1.3),
mail/extra-square-brackets/0004.html (1.2),
mail/extra-square-brackets/0005.html (1.2),
mail/extra-square-brackets/0006.html (1.2),
mail/extra-square-brackets/0007.html (1.1),
mail/extra-square-brackets/attachment.html (1.3),
mail/extra-square-brackets/author.html (1.3),
mail/extra-square-brackets/date.html (1.3),
mail/extra-square-brackets/index.html (1.3),
mail/extra-square-brackets/subject.html (1.3),
mail/gecos-domain-options/0000.html (1.2),
mail/gecos-domain-options/0001.html (1.2),
mail/gecos-domain-options/0002.html (1.1),
mail/gecos-domain-options/0003.html (1.1),
mail/gecos-domain-options/attachment.html (1.2),
mail/gecos-domain-options/author.html (1.2),
mail/gecos-domain-options/date.html (1.2),
mail/gecos-domain-options/index.html (1.2),
mail/gecos-domain-options/subject.html (1.2),
mail/gecos-domain-options/att-0000/diff (1.1),
mail/gecos-domain-options/att-0003/01-part (1.1),
mail/no-ancestors-option/0000.html (1.1),
mail/no-ancestors-option/0001.html (1.1),
mail/no-ancestors-option/0002.html (1.1),
mail/no-ancestors-option/attachment.html (1.1),
mail/no-ancestors-option/author.html (1.1),
mail/no-ancestors-option/date.html (1.1),
mail/no-ancestors-option/index.html (1.1),
mail/no-ancestors-option/subject.html (1.1),
mail/no-ancestors-option/att-0000/cvs2cl.pl (1.1),
mail/no-common-dir-option/0000.html (1.2),
mail/no-common-dir-option/0001.html (1.2),
mail/no-common-dir-option/0002.html (1.1),
mail/no-common-dir-option/attachment.html (1.2),
mail/no-common-dir-option/author.html (1.2),
mail/no-common-dir-option/date.html (1.2),
mail/no-common-dir-option/index.html (1.2),
mail/no-common-dir-option/subject.html (1.2),
mail/passwd-user-expansion/0000.html (1.1),
mail/passwd-user-expansion/0001.html (1.1),
mail/passwd-user-expansion/0002.html (1.1),
mail/passwd-user-expansion/0003.html (1.1),
mail/passwd-user-expansion/0004.html (1.1),
mail/passwd-user-expansion/attachment.html (1.1),
mail/passwd-user-expansion/author.html (1.1),
mail/passwd-user-expansion/date.html (1.1),
mail/passwd-user-expansion/index.html (1.1),
mail/passwd-user-expansion/subject.html (1.1),
mail/rcs-option/0000.html (1.1), mail/rcs-option/0001.html (1.1),
mail/rcs-option/0002.html (1.1), mail/rcs-option/attachment.html
(1.1), mail/rcs-option/author.html (1.1),
mail/rcs-option/date.html (1.1), mail/rcs-option/index.html
(1.1), mail/rcs-option/subject.html (1.1),
mail/revert-common-dir-1file/0000.html (1.2),
mail/revert-common-dir-1file/0001.html (1.2),
mail/revert-common-dir-1file/0002.html (1.1),
mail/revert-common-dir-1file/attachment.html (1.2),
mail/revert-common-dir-1file/author.html (1.2),
mail/revert-common-dir-1file/date.html (1.2),
mail/revert-common-dir-1file/index.html (1.2),
mail/revert-common-dir-1file/subject.html (1.2),
mail/shell-minimize-file-lists/0000.html (1.1),
mail/shell-minimize-file-lists/0001.html (1.1),
mail/shell-minimize-file-lists/0002.html (1.1),
mail/shell-minimize-file-lists/0003.html (1.1),
mail/shell-minimize-file-lists/0004.html (1.1),
mail/shell-minimize-file-lists/attachment.html (1.1),
mail/shell-minimize-file-lists/author.html (1.1),
mail/shell-minimize-file-lists/date.html (1.1),
mail/shell-minimize-file-lists/index.html (1.1),
mail/shell-minimize-file-lists/subject.html (1.1),
mail/show-dead-option/0000.html (1.1),
mail/show-dead-option/0001.html (1.1),
mail/show-dead-option/attachment.html (1.1),
mail/show-dead-option/author.html (1.1),
mail/show-dead-option/date.html (1.1),
mail/show-dead-option/index.html (1.1),
mail/show-dead-option/subject.html (1.1),
mail/show-tags-option/0000.html (1.2),
mail/show-tags-option/0001.html (1.2),
mail/show-tags-option/0002.html (1.2),
mail/show-tags-option/0003.html (1.1),
mail/show-tags-option/attachment.html (1.2),
mail/show-tags-option/author.html (1.2),
mail/show-tags-option/date.html (1.2),
mail/show-tags-option/index.html (1.2),
mail/show-tags-option/subject.html (1.2),
mail/show-tags-option/att-0002/log.tgz (1.1),
mail/squash-duplicate-filenames/0000.html (1.2),
mail/squash-duplicate-filenames/0001.html (1.2),
mail/squash-duplicate-filenames/0002.html (1.1),
mail/squash-duplicate-filenames/attachment.html (1.2),
mail/squash-duplicate-filenames/author.html (1.2),
mail/squash-duplicate-filenames/date.html (1.2),
mail/squash-duplicate-filenames/index.html (1.2),
mail/squash-duplicate-filenames/subject.html (1.2),
mail/summary-option/0000.html (1.1),
mail/summary-option/0001.html (1.1),
mail/summary-option/0002.html (1.1),
mail/summary-option/attachment.html (1.1),
mail/summary-option/author.html (1.1),
mail/summary-option/date.html (1.1),
mail/summary-option/index.html (1.1),
mail/summary-option/subject.html (1.1),
mail/update-option/0000.html (1.1), mail/update-option/0001.html
(1.1), mail/update-option/0002.html (1.1),
mail/update-option/attachment.html (1.1),
mail/update-option/author.html (1.1),
mail/update-option/date.html (1.1), mail/update-option/index.html
(1.1), mail/update-option/subject.html (1.1): Update for 2.48
2003-04-21 04:50 fluffy
* cvs2cl.pl (2.48):
* Add --passwd option
patch based on code contributed by Mark W. Eichin
* Add doc. for --update
* Add --summary, --update options
patches contributed by Mike Ayers
* Add --no-ancestors
patch contributed by Richard Broberg
* add --show-dead option
patch based on code supplied by Dave Elcock
* add --rcs option
patch courtesy of Joe Orton
* add --mailname option, correct --passwd
2003-04-12 09:36 fluffy
* index.html (1.19): Add links to CVS home, CVSps page.
2003-03-10 10:35 fluffy
* BUGS/: detail.html (1.5), summary.html (1.4),
mail/FSF-option/0000.html (1.1), mail/FSF-option/0001.html (1.1),
mail/FSF-option/attachment.html (1.1),
mail/FSF-option/author.html (1.1), mail/FSF-option/date.html
(1.1), mail/FSF-option/index.html (1.1),
mail/FSF-option/subject.html (1.1),
mail/binmode-on-windoze/0000.html (1.2),
mail/chrono-option/0000.html (1.1), mail/chrono-option/0001.html
(1.1), mail/chrono-option/0002.html (1.1),
mail/chrono-option/attachment.html (1.1),
mail/chrono-option/author.html (1.1),
mail/chrono-option/date.html (1.1), mail/chrono-option/index.html
(1.1), mail/chrono-option/subject.html (1.1),
mail/chrono-option/att-0000/01-rae.diff (1.1),
mail/chrono-option/att-0000/02-PGP.sig (1.1),
mail/chrono-option/att-0002/00-part (1.1),
mail/delta-undocumented/0000.html (1.1),
mail/delta-undocumented/0001.html (1.1),
mail/delta-undocumented/0002.html (1.1),
mail/delta-undocumented/attachment.html (1.1),
mail/delta-undocumented/author.html (1.1),
mail/delta-undocumented/date.html (1.1),
mail/delta-undocumented/index.html (1.1),
mail/delta-undocumented/subject.html (1.1),
mail/extra-square-brackets/0000.html (1.2),
mail/extra-square-brackets/0001.html (1.2),
mail/extra-square-brackets/0002.html (1.2),
mail/extra-square-brackets/0003.html (1.2),
mail/extra-square-brackets/0004.html (1.1),
mail/extra-square-brackets/0005.html (1.1),
mail/extra-square-brackets/0006.html (1.1),
mail/extra-square-brackets/attachment.html (1.2),
mail/extra-square-brackets/author.html (1.2),
mail/extra-square-brackets/date.html (1.2),
mail/extra-square-brackets/index.html (1.2),
mail/extra-square-brackets/subject.html (1.2),
mail/gecos-domain-options/0000.html (1.1),
mail/gecos-domain-options/0001.html (1.1),
mail/gecos-domain-options/attachment.html (1.1),
mail/gecos-domain-options/author.html (1.1),
mail/gecos-domain-options/date.html (1.1),
mail/gecos-domain-options/index.html (1.1),
mail/gecos-domain-options/subject.html (1.1),
mail/gecos-domain-options/att-0000/01-diff (1.1),
mail/gecos-domain-options/att-0000/02-part (1.1),
mail/no-common-dir-option/0000.html (1.1),
mail/no-common-dir-option/0001.html (1.1),
mail/no-common-dir-option/attachment.html (1.1),
mail/no-common-dir-option/author.html (1.1),
mail/no-common-dir-option/date.html (1.1),
mail/no-common-dir-option/index.html (1.1),
mail/no-common-dir-option/subject.html (1.1),
mail/no-times-option/0000.html (1.1),
mail/no-times-option/0001.html (1.1),
mail/no-times-option/attachment.html (1.1),
mail/no-times-option/author.html (1.1),
mail/no-times-option/date.html (1.1),
mail/no-times-option/index.html (1.1),
mail/no-times-option/subject.html (1.1),
mail/revert-common-dir-1file/0000.html (1.1),
mail/revert-common-dir-1file/0001.html (1.1),
mail/revert-common-dir-1file/attachment.html (1.1),
mail/revert-common-dir-1file/author.html (1.1),
mail/revert-common-dir-1file/date.html (1.1),
mail/revert-common-dir-1file/index.html (1.1),
mail/revert-common-dir-1file/subject.html (1.1),
mail/show-tags-option/0000.html (1.1),
mail/show-tags-option/0001.html (1.1),
mail/show-tags-option/0002.html (1.1),
mail/show-tags-option/attachment.html (1.1),
mail/show-tags-option/author.html (1.1),
mail/show-tags-option/date.html (1.1),
mail/show-tags-option/index.html (1.1),
mail/show-tags-option/subject.html (1.1),
mail/show-tags-option/att-0002/01-log.tgz (1.1),
mail/squash-duplicate-filenames/0000.html (1.1),
mail/squash-duplicate-filenames/0001.html (1.1),
mail/squash-duplicate-filenames/attachment.html (1.1),
mail/squash-duplicate-filenames/author.html (1.1),
mail/squash-duplicate-filenames/date.html (1.1),
mail/squash-duplicate-filenames/index.html (1.1),
mail/squash-duplicate-filenames/subject.html (1.1): [no log
message]
2003-03-10 10:08 fluffy
* cvs2cl.pl (2.47):
* Add test for --delta option
* Document --delta option
* Add --gecos, --domain options
patch supplied by Robin Hugh Johnson
* Add --FSF option
* Add test for -W option
* Add --no-common-dir option
patch supplied by Simon Josefsson
* Exclude duplicate file information items from info lines
* Add --show-tag option, tweak implementation of ignore-tag option
Document both
* Add tests for --ignore-tags option
* Make sort order deterministic for equal timestamps
* Fix bug #25 (Option to write output in chronologically ascending
order)
patch supplied by Reid Ellis
* Fix bug #24 (Option to not print HH:MM on timestamps)
patch supplied by Simon Josefsson
2003-01-18 07:14 fluffy
* cvs2cl.pl (2.46):
* Add --no-times option
patch supplied by Simon Josefsson jas@extundo.com
2003-01-18 05:35 fluffy
* index.html (1.18): Add descriptions to bug numbers in changelog
2003-01-18 05:21 fluffy
* index.html (1.17): Add mini-change history at bottom
2003-01-13 03:38 fluffy
* BUGS/detail.html (1.4): Remove leading newline
2003-01-12 13:30 fluffy
* BUGS/: detail.html (1.3), summary.html (1.3): Bugs update
2003-01-12 07:56 fluffy
* BUGS/mail/: binmode-on-windoze/0001.html (1.1),
binmode-on-windoze/attachment.html (1.1),
binmode-on-windoze/author.html (1.1),
binmode-on-windoze/date.html (1.1), binmode-on-windoze/index.html
(1.1), binmode-on-windoze/subject.html (1.1),
extra-square-brackets/0000.html (1.1),
extra-square-brackets/0001.html (1.1),
extra-square-brackets/0002.html (1.1),
extra-square-brackets/0003.html (1.1),
extra-square-brackets/attachment.html (1.1),
extra-square-brackets/author.html (1.1),
extra-square-brackets/date.html (1.1),
extra-square-brackets/index.html (1.1),
extra-square-brackets/subject.html (1.1),
hardwired-exec-line/0000.html (1.1),
hardwired-exec-line/0001.html (1.1),
hardwired-exec-line/0002.html (1.1),
hardwired-exec-line/0003.html (1.1),
hardwired-exec-line/attachment.html (1.1),
hardwired-exec-line/author.html (1.1),
hardwired-exec-line/date.html (1.1),
hardwired-exec-line/index.html (1.1),
hardwired-exec-line/subject.html (1.1), latest-rev/0000.html
(1.1), latest-rev/0001.html (1.1), latest-rev/attachment.html
(1.1), latest-rev/author.html (1.1), latest-rev/date.html (1.1),
latest-rev/index.html (1.1), latest-rev/subject.html (1.1),
malformed-utf-8/0000.html (1.1), malformed-utf-8/0001.html (1.1),
malformed-utf-8/0002.html (1.1), malformed-utf-8/0003.html (1.1),
malformed-utf-8/0004.html (1.1), malformed-utf-8/0005.html (1.1),
malformed-utf-8/0006.html (1.1), malformed-utf-8/0007.html (1.1),
malformed-utf-8/0008.html (1.1), malformed-utf-8/0009.html (1.1),
malformed-utf-8/0010.html (1.1), malformed-utf-8/0011.html (1.1),
malformed-utf-8/attachment.html (1.1),
malformed-utf-8/author.html (1.1), malformed-utf-8/date.html
(1.1), malformed-utf-8/index.html (1.1),
malformed-utf-8/subject.html (1.1),
malformed-utf-8/att-0006/01-perl-V.txt (1.1),
malformed-utf-8/att-0008/01-env.txt (1.1),
sort-by-filename/0000.html (1.1), sort-by-filename/0001.html
(1.1), sort-by-filename/attachment.html (1.1),
sort-by-filename/author.html (1.1), sort-by-filename/date.html
(1.1), sort-by-filename/index.html (1.1),
sort-by-filename/subject.html (1.1): Mail update
2003-01-12 07:50 fluffy
* BUGS/mail/binmode-on-windoze/0000.html (1.1): Mail update
2003-01-12 07:41 fluffy
* cvs2cl.pl (2.45):
* Fix bug #22 (spurious extra square brackets)
patch supplied by Tim Bradshaw tfb@cley.com
* Fix bug #19 (carriage returns on windoze)
patch based on code supplied by Kane, Terry
TeKane@radiantsystems.com
* Fix bug #23 (hardwired perl version)
patch supplied by Tim Bradshaw tfb@cley.com
2002-11-25 15:00 fluffy
* cvs2cl.pl (2.44): Fix bug #18 (spurious UTF-8 warnings)
2002-11-24 05:53 fluffy
* BUGS.html (1.2), BUGS/detail.html (1.2), BUGS/summary.html (1.2):
BUGS update for 2.43
2002-11-24 05:49 fluffy
* BUGS/mail/: tagdates-option/0000.html (1.1),
tagdates-option/0001.html (1.1), tagdates-option/attachment.html
(1.1), tagdates-option/author.html (1.1),
tagdates-option/date.html (1.1), tagdates-option/index.html
(1.1), tagdates-option/subject.html (1.1),
tagdates-option/att-0000/01-cvs2cl.tagdates.patch (1.1),
xml-encoding-option/0000.html (1.1),
xml-encoding-option/0001.html (1.1),
xml-encoding-option/0002.html (1.1),
xml-encoding-option/attachment.html (1.1),
xml-encoding-option/author.html (1.1),
xml-encoding-option/date.html (1.1),
xml-encoding-option/index.html (1.1),
xml-encoding-option/subject.html (1.1),
xml-encoding-option/att-0000/01-diff.txt (1.1),
xml-encoding-option/att-0000/02-cvs2cl.pl (1.1),
unify-by-author-and-time/0000.html (1.1),
unify-by-author-and-time/attachment.html (1.1),
unify-by-author-and-time/author.html (1.1),
unify-by-author-and-time/date.html (1.1),
unify-by-author-and-time/index.html (1.1),
unify-by-author-and-time/subject.html (1.1): mail dissected by
bug
2002-11-24 05:45 fluffy
* BUGS/mail/: accum-and-D/att-0000/01-cvs2cl.pl.diff (1.1),
accum-and-D/0000.html (1.1), accum-and-D/0001.html (1.1),
accum-and-D/attachment.html (1.1), accum-and-D/author.html (1.1),
accum-and-D/date.html (1.1), accum-and-D/index.html (1.1),
accum-and-D/subject.html (1.1), accum-utc-repeated-add/0000.html
(1.1), accum-utc-repeated-add/0001.html (1.1),
accum-utc-repeated-add/attachment.html (1.1),
accum-utc-repeated-add/author.html (1.1),
accum-utc-repeated-add/date.html (1.1),
accum-utc-repeated-add/index.html (1.1),
accum-utc-repeated-add/subject.html (1.1),
deleted-file-no-revision/0000.html (1.1),
deleted-file-no-revision/attachment.html (1.1),
deleted-file-no-revision/author.html (1.1),
deleted-file-no-revision/date.html (1.1),
deleted-file-no-revision/index.html (1.1),
deleted-file-no-revision/subject.html (1.1),
deleted-subdirs-disappear/0000.html (1.1),
deleted-subdirs-disappear/attachment.html (1.1),
deleted-subdirs-disappear/author.html (1.1),
deleted-subdirs-disappear/date.html (1.1),
deleted-subdirs-disappear/index.html (1.1),
deleted-subdirs-disappear/subject.html (1.1),
delta-flag/0000.html (1.1), delta-flag/0001.html (1.1),
delta-flag/0002.html (1.1), delta-flag/attachment.html (1.1),
delta-flag/author.html (1.1), delta-flag/date.html (1.1),
delta-flag/index.html (1.1), delta-flag/subject.html (1.1),
dirs-called-0/0000.html (1.1), dirs-called-0/0001.html (1.1),
dirs-called-0/0002.html (1.1), dirs-called-0/0003.html (1.1),
dirs-called-0/0004.html (1.1), dirs-called-0/attachment.html
(1.1), dirs-called-0/author.html (1.1), dirs-called-0/date.html
(1.1), dirs-called-0/index.html (1.1), dirs-called-0/subject.html
(1.1), exclude-regex/0000.html (1.1), exclude-regex/0001.html
(1.1), exclude-regex/attachment.html (1.1),
exclude-regex/author.html (1.1), exclude-regex/date.html (1.1),
exclude-regex/index.html (1.1), exclude-regex/subject.html (1.1),
ignore-tag-option/0000.html (1.1),
ignore-tag-option/attachment.html (1.1),
ignore-tag-option/author.html (1.1), ignore-tag-option/date.html
(1.1), ignore-tag-option/index.html (1.1),
ignore-tag-option/subject.html (1.1), item-prefix/0000.html
(1.1), item-prefix/0001.html (1.1), item-prefix/attachment.html
(1.1), item-prefix/author.html (1.1), item-prefix/date.html
(1.1), item-prefix/index.html (1.1), item-prefix/subject.html
(1.1), log-only-on-branch/0000.html (1.1),
log-only-on-branch/0001.html (1.1), log-only-on-branch/0002.html
(1.1), log-only-on-branch/0003.html (1.1),
log-only-on-branch/attachment.html (1.1),
log-only-on-branch/author.html (1.1),
log-only-on-branch/date.html (1.1), log-only-on-branch/index.html
(1.1), log-only-on-branch/subject.html (1.1),
rcs-file-name/0000.html (1.1), rcs-file-name/0001.html (1.1),
rcs-file-name/attachment.html (1.1), rcs-file-name/author.html
(1.1), rcs-file-name/date.html (1.1), rcs-file-name/index.html
(1.1), rcs-file-name/subject.html (1.1),
rlog-format-stdin/0000.html (1.1), rlog-format-stdin/0001.html
(1.1), rlog-format-stdin/attachment.html (1.1),
rlog-format-stdin/author.html (1.1), rlog-format-stdin/date.html
(1.1), rlog-format-stdin/index.html (1.1),
rlog-format-stdin/subject.html (1.1): mail dissected by bug
2002-11-24 05:36 fluffy
* BUGS/mail/: -W-and-0-value/0000.html (1.1),
-W-and-0-value/attachment.html (1.1), -W-and-0-value/author.html
(1.1), -W-and-0-value/date.html (1.1), -W-and-0-value/index.html
(1.1), -W-and-0-value/subject.html (1.1), -r-and--b/0000.html
(1.1), -r-and--b/attachment.html (1.1), -r-and--b/author.html
(1.1), -r-and--b/date.html (1.1), -r-and--b/index.html (1.1),
-r-and--b/subject.html (1.1): mail dissected by bug
2002-11-23 14:51 fluffy
* index.html (1.16): Include BUGS.html reference
2002-11-23 14:26 fluffy
* cvs2cl.pl (2.43):
* Fix bug #14 (Conflict with --accum and -D)
patch based on code supplied by Claus Klein
Claus.Klein@marconi.com
* Fix bug #11 (add '--tagdates' option)
patch supplied by Henrik Nordstrom
2002-11-23 11:49 fluffy
* cvs2cl.pl (2.42):
* Fix bug #8 (add '--delta' flag)
patch supplied by Nathan Bryant
2002-11-18 15:36 fluffy
* index.html (1.15): Remove the colours! (this is really a test
that updates are getting through)
2002-11-18 15:33 fluffy
* BUGS.html (1.1), BUGS.xml (1.1), BUGS/detail.html (1.1),
BUGS/summary.html (1.1): Initial bug logs
2002-11-18 15:30 fluffy
* cvs2cl.pl (2.41):
* Fix bug #5 (-W fails on argument '0')
2002-10-27 02:50 fluffy
* cvs2cl.pl (2.40):
* Tweak eval line for fun & profit (and to make it work with perl
-I lib cvs2cl)
* Add fix for really long file names (so they don't get wrapped).
This only works with later versions of Text::Wrap, unfortunately;
specifically not with the version that comes in 5.005_03
* Add fix for direcories called '0' containing multiple files
Fix from Joachim Achtzehnter ,
also from Rich Bowen
* Add --xml-encoding option
based on code from Patrick Ficheux
2002-07-29 08:00 fluffy
* cvs2cl.pl (2.39): Add ignore_tags option. Currently
undocumented, 'til I'm convinced it's a runner. Sort utags prior to
output to make testing predictable.
2002-07-03 17:11 kfogel
* index.html (1.14): end of testing
2002-07-03 16:57 kfogel
* index.html (1.13): test
2002-07-03 16:56 kfogel
* index.html (1.12): test while kfogel is locking
2002-07-03 16:36 kfogel
* index.html (1.10), index.html (1.11): test
2002-07-03 16:36 kfogel
* index.html (1.9): test commit
2002-05-25 19:43 kfogel
* BUGS.mbox (1.2): Add more info about Laurent Duperval's
line-wrapping bug.
2002-05-23 11:56 kfogel
* BUGS.mbox (1.1), index.html (1.8): Store bugs in CVS, point to
them from new notice on home page.
2002-05-23 11:49 kfogel
* index.html (1.7): Add notice about maintainership transfer.
2001-02-12 13:55 kfogel
* Makefile (1.10):
(log): Use new "--accum" option.
2001-02-12 13:54 kfogel
* Makefile (1.9), cvs2cl.pl (2.38):
* cvs2cl.pl: New `--accum' option.
* Makefile (log, changelog, ChangeLog): new rule and aliases.
2001-01-09 10:15 kfogel
* index.html (1.6): Describe cvs2html a bit more.
2001-01-03 15:31 sussman
* Makefile (1.8): Added Mike Sussman to people.html
2000-12-28 17:19 kfogel
* cvs2cl.pl (2.37): Better fsf-style formatting, but still not
perfect.
Sheesh. Who would have thought this was such a problem?
2000-12-28 16:10 kfogel
* cvs2cl.pl (2.36): Grinding it down, just a little tweak left.
2000-12-28 15:36 kfogel
* cvs2cl.pl (2.35): In-progress checkpoint, working on that pesky
formatting bug.
2000-12-25 18:26 kfogel
* tests/Makefile (1.8): Show context diffs for test failures.
2000-12-25 18:21 kfogel
* cvs2cl.pl (2.34):
(derive_change_log): reset %symbolic_names to avoid spurious re-uses
of revision numbers; Hendrik Ruijter 's
patch.
2000-12-13 17:17 kfogel
* cvs2cl.pl (2.33):
(pretty_file_list): fix regexp so we keep all digits of the revision
number. Thanks to Alan Barrett for the patch.
2000-12-13 17:09 kfogel
* changelog-xml-schema.xdr (1.1), changelog.dtd (1.1), index.html
(1.5): Added David Carlson's draft
XML dtd and schema.
2000-11-13 20:31 kfogel
* cvs2cl.pl (2.32):
(wrap_log_entry): Removed the experimental blank-line handling.
2000-11-13 20:29 kfogel
* cvs2cl.pl (2.31):
(wrap_log_entry): handle leading spaces specially. This commit also
includes some experimental blank-line handling, which I will remove
in a moment.
2000-11-07 15:27 kfogel
* get-rev.cgi (2.3): Remove tmp file.
2000-11-07 15:22 kfogel
* get-rev.cgi (2.2): work
2000-11-07 15:14 kfogel
* get-rev.cgi (2.1): script for checking out a specific revision
2000-11-07 14:43 kfogel
* cvs2cl.pl (2.30): Update home page url.
2000-11-07 14:16 kfogel
* Makefile (1.7): Doc fix.
2000-11-07 13:17 kfogel
* index.html (1.4): Fix links to sample ChangeLogs.
2000-11-07 13:15 kfogel
* index.html (1.3): fix image link
2000-11-07 13:14 kfogel
* changelogs.html (1.2), index.html (1.2): White backgrounds.
2000-11-07 13:13 kfogel
* .cvsignore (1.2), Makefile (1.6), changelogs.html (1.1),
index.html (1.1), make-samples.sh (1.1): Moving cvs2cl home page
out of kfogel and into generic repository; make web stuff live
directly and statically here too.
2000-09-06 11:57 kfogel
* Makefile (1.5), cvs2cl.pl (2.29), tests/out-4a.txt (1.5),
tests/out-4b.txt (1.5), tests/out-5b.txt (1.2): Okay, *really*
make `-S' and `--fsf' cooperate this time.
Tests adjusted accordingly.
2000-09-05 23:42 kfogel
* cvs2cl.pl (2.28), tests/Makefile (1.7), tests/out-4a.txt (1.4),
tests/out-4b.txt (1.4), tests/out-5b.txt (1.1): Handle the case
where both `-S' and `--fsf' were passed. Added test for same.
2000-09-05 18:13 kfogel
* tests/: .cvsignore (1.1), Makefile (1.6), log-5.txt (1.1),
out-1a.txt (1.2), out-1a.xml (1.3), out-2a.xml (1.3), out-3a.txt
(1.2), out-3b.txt (1.2), out-4a.txt (1.3), out-4b.txt (1.3),
out-4c.txt (1.3), out-5a.txt (1.1): Change all tests and outputs
to UTC (at Ian Robertson's suggestion).
(test-5): yet another test of the `--fsf' option. This log was
known to cause problems before recent fixes.
2000-09-05 18:00 kfogel
* cvs2cl.pl (2.27):
(derive_change_log): oops, compensate for After_Header setting
outside all loops.
2000-09-05 17:35 kfogel
* cvs2cl.pl (2.26):
(derive_change_log): compensate for After_Header setting.
2000-09-05 16:16 kfogel
* cvs2cl.pl (2.25): Incorporate new custom FSF-style wrapping into
derive_change_log().
2000-09-05 15:50 kfogel
* cvs2cl.pl (2.24):
(wrap_log_entry): done. Works perfectly now.
2000-09-05 14:27 kfogel
* cvs2cl.pl (2.23):
(wrap_log_entry): rewritten following the shower inspiration.
Almost perfect now.
2000-09-04 20:20 kfogel
* cvs2cl.pl (2.22): Revert everything having to do with custom
wrapping.
2000-09-04 20:19 kfogel
* cvs2cl.pl (2.21): More work on custom wrap, but doesn't actually
work yet.
2000-09-04 18:52 kfogel
* cvs2cl.pl (2.20): Temporarily revert, to continue working on
custom wrapping.
2000-09-04 18:51 kfogel
* cvs2cl.pl (2.19): Custom wrapping in progress (committing for
archival purposes only).
2000-08-29 17:50 kfogel
* cvs2cl.pl (2.18): Much better explanatory comment about
FSF-style.
2000-08-29 17:31 kfogel
* cvs2cl.pl (2.17), tests/Makefile (1.5), tests/log-4.txt (1.2),
tests/out-4a.txt (1.2), tests/out-4b.txt (1.2), tests/out-4c.txt
(1.2): Added --fsf option, conditionally handle all of FSF
ChangeLog style:
* cvs2cl.pl ($FSF_Style): new var.
(parse_options): set above new var if --fsf flag seen.
(pretty_msg_text, derive_change_log): respectively add and remove
shims, but only if $FSF_Style.
* Makefile: don't forget to run test-4, duh.
(test-4): add new --fsf option, and also add -S for looks.
* log-4.txt: added a real barn-burner of a log entry from JimB.
* out-4a.txt, out-4c.txt, out-4c.txt: adjusted for new data.
2000-08-28 19:49 kfogel
* cvs2cl.pl (2.16): Doc fix.
2000-08-28 19:42 kfogel
* cvs2cl.pl (2.15), tests/Makefile (1.4), tests/log-4.txt (1.1),
tests/out-4a.txt (1.1), tests/out-4b.txt (1.1), tests/out-4c.txt
(1.1): Added heuristics for standard the paren-grouping
convention used in log entries, and tests for same:
(pretty_msg_text): add an extra newline before the paren group, to
prevent wrapping.
(derive_change_log): remove the extra newline, after the wrap()
call.
2000-08-21 23:13 kfogel
* cvs2cl.pl (2.14): Note about fixing standard syntax.
2000-08-21 13:39 kfogel
* Makefile (1.4): Added `install' rule.
2000-08-16 10:27 kfogel
* Makefile (1.3): Tell the truth.
2000-08-16 10:26 kfogel
* cvs2cl.pl (2.13):
(pretty_file_list): init $common_dir to undef; adjust later
conditionals to distinguish undef value from "", the latter meaning
that no common directory prefix is possible.
This fixes the bug with filenames and directory prefixes reported by
Shlomo Reinstein .
2000-08-16 10:22 kfogel
* tests/: Makefile (1.3), log-3.txt (1.1), out-3a.txt (1.1),
out-3b.txt (1.1): Added tests from Shlomo Reinstein's log.
2000-08-14 10:59 kfogel
* cvs2cl.pl (2.12): Handle even the [allegedly impossible] case of
an undefined dir prefix.
2000-08-14 10:52 kfogel
* cvs2cl.pl (2.11): Be more careful about setting $common_dir.
This hopefully fixes a two-char eats problem reported by Shlomo
Reinstein ; Shlomo's patch is included
in a comment (search for "shlomo") for reference, in case this
doesn't work. Only Shlomo can test right now, although if this
doesn't work I'll just ask him for his log info.
2000-07-07 14:12 kfogel
* cvs2cl.pl (2.10), tests/out-1a.xml (1.2), tests/out-2a.xml (1.2):
Set an XML namespace if --xml.
2000-07-07 11:20 kfogel
* tests/log-2.txt (1.2): revert to Olivier's exact version
2000-07-07 10:00 kfogel
* cvs2cl.pl (2.9), tests/Makefile (1.2), tests/log-2.txt (1.1),
tests/out-2a.xml (1.1): Fix branch-number bug reported by Olivier
Vit .
I think this fix compensates for some hand-created weirdness in his
RCS files -- for example, the symbolic-names list in his log (see
tests/log-2.txt) was prefixed with spaces instead of tab, and there
was a branch number of the form 1.7.2 instead of 1.7.0.2.
Nevertheless, it is possible to compensate for these things without
impairing the rest of cvs2cl.pl, and who knows, others may have
similar things going on in their repositories.
2000-07-04 14:19 kfogel
* Makefile (1.2): wording tweak
2000-07-04 14:18 kfogel
* cvs2cl.pl (2.8): More branch-number parsing fixes, this time from
Ken Olstad .
2000-07-04 14:06 kfogel
* cvs2cl.pl (2.7): Ignore comment lines and lines without colons in
usermap file (bug report and patch from Eric Maryniak
).
2000-07-04 14:00 kfogel
* Makefile (1.1): Run tests from here too.
2000-07-04 13:56 kfogel
* cvs2cl.pl (2.6): Checked in fix from Mike Stead
for overeager digit-matching in branch/rev calculations.
(Note: also reported by Olivier Vit ).
2000-07-04 13:51 kfogel
* tests/: Makefile (1.1), log-1.txt (1.1), out-1a.txt (1.1),
out-1a.xml (1.1): started test suite
2000-06-28 15:15 kfogel
* cvs2cl.pl (2.5): Applied Ying Zhang 's
patch adding the "--hide-filenames" option.
2000-04-19 13:06 kfogel
* cvs2cl.pl (2.4): Do xml-escaping on author once only, in outer
loop not inner, to avoid compounded escaping. (Thanks to Peter
Karlsson for the bug report.)
2000-01-28 00:02 kfogel
* cvs2cl.pl (2.3): Applied directory separator fix from David
Goldfarb .
2000-01-25 10:10 kfogel
* cvs2cl.pl (2.2): Added --no-wrap option.
Also, stop wrapping log message body when XML output.
2000-01-04 17:33 kfogel
* cvs2cl.pl (2.1): Downcase all XML tags (DTD to be formalized
soon).
1999-12-31 12:11 kfogel
* cvs2cl.pl (2.0): bump version to 2.0
1999-12-31 12:01 kfogel
* cvs2cl.pl (1.175): Removed "BETA" designation.
1999-12-29 11:19 kfogel
* cvs2cl.pl (1.174): Applied fix from Melissa O'Neill
. She correctly fixed the
entry-order/time-unification bug, as opposed to my previous fix,
which merey broke things in a different way.
1999-12-28 22:09 kfogel
* TODO (1.16), cvs2cl.pl (1.173): Finally fixed the
entry-order/time-unification bug!
It was due to over-liberality about nearby commit times during the
hash twist phase, which was probably the wrong time to notice such
things anyway -- better to catch them during the qunk-storing phase,
by comparing both commit time and message contents. This is what we
now do.
1999-12-28 09:41 kfogel
* cvs2cl.pl (1.172): Print XML meta header first, and enclose
everything in ... to avoid illegal
multirootedness, all on the advice of Ramon Felciano
.
1999-12-28 09:36 kfogel
* cvs2cl.pl (1.171):
(pretty_file_list): unify XML-related code, for readability.
1999-12-27 18:34 kfogel
* cvs2cl.pl (1.170): Tweak usage.
1999-12-27 18:31 kfogel
* cvs2cl.pl (1.169): Add note to usage message, regarding
promiscuity of --xml option.
1999-12-27 18:26 kfogel
* cvs2cl.pl (1.168): If doing XML output, then include day of week
unconditionally.
1999-12-27 18:17 kfogel
* cvs2cl.pl (1.167): Finished XML output ("--xml" option),
suggested by Ramon Felciano .
1999-12-23 19:29 kfogel
* cvs2cl.pl (1.166): progress on --xml output, though still not
complete
1999-12-23 19:05 kfogel
* cvs2cl.pl (1.165): started implementing --xml output; not done
yet!
1999-12-18 00:39 kfogel
* cvs2cl.pl (1.164): added --easy-parse-format option
1999-12-17 23:49 kfogel
* TODO (1.15), cvs2cl.pl (1.163): fixed tag unification bug
1999-12-17 23:23 kfogel
* TODO (1.14): record useful debugging command
1999-12-17 23:17 kfogel
* cvs2cl.pl (1.162): more output format description
1999-12-17 23:09 kfogel
* TODO (1.13): noticed new bug
1999-12-17 23:08 kfogel
* cvs2cl.pl (1.161): Added -C, --case-insensitive option
(suggestion from Todd Denniston )
1999-12-17 22:21 kfogel
* cvs2cl.pl (1.160): added informal format description
1999-12-10 12:44 kfogel
* TODO (1.12): reprioritize
1999-12-06 21:55 kfogel
* cvs2cl.pl (1.159): Transmogrify Windows filenames to Unix-style.
Fix due to Frank Stockinger ,
who noticed the problem because he runs cvs2cl.pl with ActiveState
Perl under Windows NT.
1999-12-06 21:51 kfogel
* a-subdir/: foo.txt, test.txt (Brancho_Gratuito.[3,4]): just a
test change
1999-12-06 21:39 kfogel
* cvs2cl.pl (1.158): fix typo: it's --follow, not --follow-branch
Thanks to G. Paul Ziemba for reporting
this.
1999-11-09 15:45 kfogel
* TODO (1.11): Entered reproduction recipe (log data) for entry
order bug.
1999-11-06 21:50 kfogel
* TODO (1.10): Removed all of Doug Finkle's recent bugs. Now
that's what I call a good night!
1999-11-06 21:22 kfogel
* cvs2cl.pl (1.157): More robust option parsing: exit with error if
a required argument is absent.
1999-11-06 21:09 kfogel
* cvs2cl.pl (1.156): Handle "-F trunk" (also "-F TRUNK") with a
special case, thus giving a way to follow the trunk alone, ignoring
any branches.
This is okay because no would ever, ever be crazy enough to name a
branch "trunk", right? Right.
1999-11-06 20:40 kfogel
* cvs2cl.pl (1.155): Fixed Doug Finkle's bug where by spurious
branch information would appear in his ChangeLog entries. However,
the cure is (unavoidably) only slightly preferable to the disease.
Read on...
Suppose we see a log entry like this:
----------------------------
revision 1.1
date: 1999/10/17 [etc etc]
branches: 1.1.2;
Log message begins here.
----------------------------
The question is, how we can tell the difference between that log
message and a *two*-line log message whose first line is
"branches: 1.1.2;"
See the problem? The output of "cvs log" is inherently ambiguous.
For now, we punt: we liberally assume that people don't write log
messages like that, and just toss a "branches:" line if we see it
but are not showing branches. I hope no one ever loses real log
data because of this. Sigh.
1999-11-06 20:17 kfogel
* cvs2cl.pl (1.154): Fix bug in which the file separators
terminating files with no revisions (from "cvs -d DATE" output, for
example) were not noticed.
1999-11-03 09:59 kfogel
* TODO (1.9): more stuff from Doug Finkle
1999-09-27 10:34 kfogel
* TODO (1.8): added Doug's bugs
1999-09-20 02:04 kfogel
* cvs2cl.pl (1.153): Bug fix from Marcin Kasperski
:
If $common_dir is "./", then just set it to "". This fixes the
occasional two-char-eats problem.
1999-09-19 23:04 kfogel
* cvs2cl.pl (1.152): simplified common_dir code, a couple of other
things
1999-09-19 15:04 kfogel
* cvs2cl.pl (1.151): consistency in usage message
1999-09-19 02:03 kfogel
* TODO (1.7): removed old items
1999-09-19 01:58 kfogel
* cvs2cl.pl (1.150): Added --gmt/--utc and -w/--day-of-week
options.
1999-09-19 01:29 kfogel
* cvs2cl.pl (1.149): Common dir prefix unification done.
1999-09-19 00:33 kfogel
* cvs2cl.pl (1.148): commit with 'Speedy' code in, for kicks; will
revert immediately
1999-09-18 00:16 kfogel
* cvs2cl.pl (1.147): abstracted out common dir detection, but still
punting
1999-09-18 00:05 kfogel
* cvs2cl.pl (1.146): fixed undefined hash reference bug
1999-09-17 23:30 kfogel
* cvs2cl.pl (1.145): small reformatting of usage
1999-09-16 11:01 kfogel
* cvs2cl.pl (1.144): Fix usage bug, rearrange usage
1999-09-15 23:05 kfogel
* cvs2cl.pl (1.143): format usage more clearly
1999-09-15 23:00 kfogel
* cvs2cl.pl (1.142): oops, fix typo from last change
1999-09-15 22:59 kfogel
* cvs2cl.pl (1.141): no more default header -- only print header on
request
1999-09-15 22:34 kfogel
* cvs2cl.pl (1.140): mark as beta
1999-09-15 22:31 kfogel
* cvs2cl.pl (1.139): use scalar instead of $#
1999-09-15 22:20 kfogel
* cvs2cl.pl (1.138): document new stuff
1999-09-15 21:59 kfogel
* cvs2cl.pl (1.137): -F / --follow-branches working
1999-09-15 21:43 kfogel
* cvs2cl.pl (1.136): Branch-following detection code working.
Has no effect yet -- the conditionals are all there, but their
consequents are empty.
1999-09-14 15:00 kfogel
* cvs2cl.pl (1.135): reverted previous non-working change -- it was
just for storage
1999-09-14 15:00 kfogel
* cvs2cl.pl (1.134): progress on Follow_Branches
1999-09-13 22:53 kfogel
* cvs2cl.pl (1.133): continuing implementation of Follow_Branches
1999-09-13 22:40 kfogel
* cvs2cl.pl (1.132): oops, don't clear overenthusiastically
1999-09-13 22:38 kfogel
* cvs2cl.pl (1.131): fixed single-file bug, started implementing
Follow_Branches
1999-09-13 20:36 kfogel
* cvs2cl.pl (1.130): Accurify comments.
1999-09-13 20:35 kfogel
* cvs2cl.pl (1.129): Unify common directories.
1999-09-13 20:04 kfogel
* cvs2cl.pl (1.128): Unify tags even when branches are present.
1999-09-13 19:22 kfogel
* cvs2cl.pl (1.127): Use hashes instead of lists in
pretty_file_list(), for efficiency.
1999-09-13 10:11 kfogel
* cvs2cl.pl (1.126): added todo comment
1999-09-13 01:58 kfogel
* TODO (1.6): updated
1999-09-13 01:36 kfogel
* cvs2cl.pl (1.125): implemented -I / --ignore option
1999-09-13 01:16 kfogel
* cvs2cl.pl (1.124): fixed another buglet
1999-09-13 01:14 kfogel
* cvs2cl.pl (1.123): fixed some buglets
1999-09-13 00:59 kfogel
* cvs2cl.pl (1.122): fix regexp gate to behave in the expected way,
finally!
1999-09-13 00:49 kfogel
* cvs2cl.pl (1.121): New unifying/summarizing output format.
Needs testing, though.
Branch roots are still recorded, but are not included in the new
output format. Should ask if there's any demand for them, as
they're probably not critical to most people.
1999-09-12 23:54 kfogel
* cvs2cl.pl (1.120): revert previous interim revision
1999-09-12 23:53 kfogel
* cvs2cl.pl (1.119): interim revision, toward new release; will
revert
1999-09-12 22:58 kfogel
* TODO (1.5): added request from Doug Finkle
1999-09-12 21:16 kfogel
* cvs2cl.pl (1.118): mild comment changes
1999-07-29 22:56 kfogel
* TODO (1.4): new items
1999-07-29 22:19 kfogel
* cvs2cl.pl (1.117): tweak usage
1999-07-29 22:18 kfogel
* cvs2cl.pl (1.116): Added -W / --window option to control
$Max_Checkin_Duration (the window of time within which log entries
get unified).
1999-07-29 22:08 kfogel
* cvs2cl.pl (1.115): Dear cvs2cl users,
Okay, okay, you win. :-) I have added an option to expand usernames
to email addresses, from a user-supplied map file. The map file's
format is the same as CVSROOT/users in the repository (see the
Cederqvist), and in fact you might want to actually use that file,
because I still do plan to add an option to "cvs log" to expand
directly in the log output based on that file. In an ideal world,
cvs2cl would not depend on a local copy of that file, but I realize
we do not live in an ideal world.
The option is -U / --usermap.
1999-07-25 02:09 kfogel
* TODO (1.3): add item about cumulative updates
1999-07-25 02:04 kfogel
* TODO (1.2): clarify
1999-07-25 01:38 kfogel
* cvs2cl.pl (1.114): really, truly fix leading .// problem
1999-07-25 01:30 kfogel
* cvs2cl.pl (1.113): really fix leading .// problem
1999-07-25 01:23 kfogel
* cvs2cl.pl (1.112): fix leading .// problem
1999-07-25 00:45 kfogel
* cvs2cl.pl (1.111): Finished partial reversion to 1.107.
Thus, the difference from 1.107 to now is that unless revisions were
specified, branches will be shown as Branch_Name, not Branch_Name.N.
This change is from Avi Kivity , whose patch also
included the interesting feature of listing the branch only once for
all the files on that branch in that commit. See the log message
1.108 for why I haven't yet permanently incorporated that part of
his patch.
1999-07-25 00:40 kfogel
* cvs2cl.pl (1.110): partial reversion to 1.107; see log message at
1.108 for reasons
1999-07-25 00:38 kfogel
* cvs2cl.pl (1.109): fixed buglet in regexp, before partial
reversion of previous change
1999-07-25 00:36 kfogel
* cvs2cl.pl (1.108): Merged in all of Avi Kivity
's patch to unify branch listings if revisions
and tags aren't being included.
Will revert part of this change immediately. I'm not sure the whole
thing should be done yet, because in the new output, it's impossible
to distinguish between N files with the same log message in the same
commit on the same branch, and N files with the same log message on
the same commit but with only the last file on the branch. So far,
the output of cvs2cl has always been unambiguous; if that's going to
change, it should at least be by request (i.e., by option) only.
However, Avi is totally right about branches being displayed as
Branch_Name, not Branch_Name.N, when revisions were not requested.
1999-07-23 11:37 kfogel
* cvs2cl.pl (1.107): handle empty ChangeLog headers gracefully
1999-07-23 03:06 kfogel
* TODO (1.1): My stack is so high I actually need to write it down.
Sigh.
1999-07-16 23:09 kfogel
* a-subdir/: foo.txt (tags: FISHTAG), test.txt, subsubdir/test.txt
(Brancho_Gratuito.[2,3,2]): change piles upon change
1999-07-16 23:05 kfogel
* a-subdir/test.txt (Brancho_Gratuito.2): new change
1999-07-16 23:05 kfogel
* a-subdir/: foo.txt, test.txt, subsubdir/test.txt
(Brancho_Gratuito.[1,1,1]): change them on the branch
1999-07-16 23:04 kfogel
* a-subdir/foo.txt (1.2): meaningless change
1999-07-16 23:03 kfogel
* a-subdir/foo.txt (1.1): a truly pointless file -- exploring
branches
1999-07-16 11:09 kfogel
* cvs2cl.pl (1.106): note stdin behavior of --header
1999-07-16 10:04 kfogel
* cvs2cl.pl (1.105): Change from Avi Kivity :
Offer new "--header" option to control ChangeLog header (patch
rewritten slightly to use slurp_file(), in anticipation of future
need).
1999-07-01 10:58 kfogel
* cvs2cl.pl (1.104): Only compile $Regexp_Gate once.
1999-07-01 10:56 kfogel
* cvs2cl.pl (1.103): Match against author too when doing
-R/--regexp
1999-06-15 23:09 kfogel
* mywrap.pl (1.2): skeleton
1999-06-15 19:36 kfogel
* mywrap.pl (1.1): initial import
1999-05-26 00:01 kfogel
* cvs2cl.pl (1.102): Added long note about wrap() bug at end
1999-05-25 23:17 kfogel
* cvs2cl.pl (1.101): improved previous improvement
1999-05-25 22:16 kfogel
* cvs2cl.pl (1.100): Improve output by improving decisions about
which newlines to strip off: now leaves alone indented and lines
beginning with a mail-quote character (">").
1999-05-22 21:31 kfogel
* cvs2cl.pl (1.99): expand comment
1999-05-21 22:19 kfogel
* cvs2cl.pl (1.98): trivial change to bump version number for PAUSE
1999-05-21 17:34 kfogel
* cvs2cl.pl (1.97): categorize in Version_Control/CVS
1999-05-21 14:16 kfogel
* cvs2cl.pl (1.96): test regexp against the whole entry, not just
msg_txt
1999-05-21 14:00 kfogel
* cvs2cl.pl (1.95): Treat non-options as filename arguments for
'cvs log'
1999-05-21 12:59 kfogel
* cvs2cl.pl (1.94): update PAUSE info
1999-05-21 00:15 kfogel
* cvs2cl.pl (1.93): Fixed yet another bug in branch root tracing,
by tweaking a regexp again.
Added the -R / --regexp feature.
(The bugfix is unrelated to the new feature.)
1999-05-20 15:45 kfogel
* cvs2cl.pl (1.92): Accept -P for --prune, like CVS
1999-05-20 01:54 kfogel
* cvs2cl.pl (1.91): Fixed some regular expressions. This takes
care of the branch-tracing bug reported by John Cavanaugh
.
1999-05-19 15:36 kfogel
* cvs2cl.pl (1.90): mention perl-indent-level after all
1999-05-19 15:17 kfogel
* cvs2cl.pl (1.89): Change from William A. Hoffman
:
Invoke perl in a path-independent manner (subtitled: "Karl learns
about the -x option to Perl and is appropriately awed").
1999-05-19 14:58 kfogel
* cvs2cl.pl (1.88): Patch from Johannes Stezenbach
:
Handle the possibility that no revisions are shown for a given file
(this can happen with "cvs log -d", for example).
1999-05-12 23:43 kfogel
* cvs2cl.pl (1.87): make -b useful even without -r
1999-05-12 23:12 kfogel
* cvs2cl.pl (1.86): if showing branches, show latest ancestor as
such
1999-05-12 21:58 kfogel
* cvs2cl.pl (1.85): removed debugging statements; better comment
1999-05-12 21:52 kfogel
* cvs2cl.pl (1.84): Added -b / --branches option.
This implements John Cavanaugh 's suggestion to
substitute branch names into revision numbers where possible.
1999-05-12 16:29 kfogel
* cvs2cl.pl (1.83): fixed; undid previous reversion
1999-05-12 16:12 kfogel
* cvs2cl.pl (1.82): reverted to 1.79 to debug problems in previous
two revisions
1999-05-12 16:10 kfogel
* cvs2cl.pl (1.81): clean but broken; will revert to 1.79 and
incrementally return to this
1999-05-12 15:37 kfogel
* cvs2cl.pl (1.80): Avoid using `if' and `unless' in postfix style.
Plus a few other minor cleanups.
1999-05-12 15:21 kfogel
* cvs2cl.pl (1.79): perfectify comment
1999-05-12 15:18 kfogel
* cvs2cl.pl (1.78): Changes from Melissa O'Neill
:
Use "defined $foo" instead of "$foo", to protect against files name
"0" and such.
Don't even hint at ignoring "revision" lines anymore (even though
ignoring was happening after the revision had already been grabbed).
Remember to skip to next line once revision is grabbed, and clear
out the $revision variable after the loop.
Removed unnecessary curly braces.
1999-04-19 01:14 kfogel
* cvs2cl.pl (1.77): Changes from Melissa O'Neill
:
Use \d instead of 0-9 in regexps. Don't use double-quotes where not
necessary.
1999-04-13 17:29 kfogel
* cvs2cl.pl (1.76): Match exact length of $file_separator and
$log_separator, thus avoiding identical-prefix-bugs like the
following:
==============================================================================
or perhaps
-----------------------------
See? Both of those had one extra "=" or "-" than an actual
separators do. So if this is all one log entry, then the bug is
fixed.
1999-04-13 16:26 kfogel
* cvs2cl.pl (1.75): comment accurification
1999-04-13 09:33 kfogel
* cvs2cl.pl (1.74): removed BETA designation
1999-04-13 09:30 kfogel
* cvs2cl.pl (1.73): Change from Avi Kivity :
Be liberal about matching symbolic names -- just take anything
preceding the colon. Enforcing restrictions on tag names is CVS's
responsibility, not ours.
1999-04-10 00:35 kfogel
* cvs2cl.pl (1.72): Made POD documentation, for the Perl Scripts
Archive
1999-04-09 11:09 kfogel
* README (1.3): Reverted previous change, which was only made to
test public CVS access anyway.
1999-04-09 10:53 melissa
* README (1.2): Trivial change (about to be reverted).
This is not Melissa, this is really Karl. I'm just testing the new
`pubcvs' system, with melissa as the first user.
1999-04-08 20:22 kfogel
* cvs2cl.pl (1.71): Oops, fixed previous fix to implementation of
"-t" / "--tags". Now remembers to clear out %symbolic_names after
use.
1999-04-08 19:15 kfogel
* cvs2cl.pl (1.70): Fixed implementation of "-t" / "--tags": now
correctly handles multiple symbolic names on the same revision
number.
Thanks, Melissa, for the autovivication lesson.
1999-04-08 18:54 kfogel
* cvs2cl.pl (1.69, spuriousduplicatetag5, spurious_duplicate_tag_4,
spurious-duplicate-tag-3, spurious-duplicate-tag-2,
spurious-duplicate-tag-1): Use "$VERSION" instead of "$Version",
for compatibility with the Perl Scripts Archive, to which this will
soon be submitted.
1999-04-08 16:54 kfogel
* cvs2cl.pl (1.68, post-tag-name-changes): Implemented "-t" /
"--tags" option.
1999-04-08 14:14 kfogel
* cvs2cl.pl (1.67, pre-tag-name-changes): Changed "Insure" to
"Ensure" in comment.
From: "Melissa O'Neill" Subject: English Usage
and Future Features To: Karl Fogel Date: Thu,
8 Apr 1999 11:14:23 -0700
You wrote: > Okay, it's out; I just sent an announcement to
info-cvs. > > Thanks for all the patches; I've pretty much kept my
grubby little > paws off them and applied them as they were (see
ChangeLog for > details). > > In fact, I think the only change I
reverted was the spelling fix > "Insure" --> "Ensure". :-) These
seem to be synonymous in common > usage and are also the same (in
this sense) according to the > OED... which is only an authority
insofar as it reflects usage > accurately, I guess, but I trust them
to have done their research > anyway. Believe it or not, this exact
question, involving these two > words used in the same sense, came
up in a paper I was editing > recently.
I'd recommend you check out Lyn Dupre's _BUGS in Writing_. This is
an excellent book, aimed pretty squarely at Computer Science folks
writing papers (although much more widely applicable). It's funny,
and very readable, and has been very well received.
Segment 45, ``Ensure, Assure, Insure'' covers this very issue. Lyn
writes
The terms ensure, assure and insure have notably different
denotations. To avoid embarrassment, you should distinguish
among them.
You should use ensure to mean to make sure of a state of affairs or
to guarantee that an event occurs.
BAD: Jim was careful to insure that the project went smoothly.
GOOD: Carol was careful to ensure that the party went smoothly.
BAD: Using this software will assure that you pay your taxes on
time. GOOD: Using this software will ensure that you pay your rent
on time.
You should use insure to mean to take insurance out on
BAD: I need to ensure my car before I drive it
GOOD: I need to insure my car before I drive it
BAD: Max was disappointed to discover that assuring his hard-disk
had not protected the company against an earthquake-induced
crash.
GOOD: Max was delighted to find that he had insured his laptop
computer before it was stolen.
You should use assure to mean give assurance or reassure.
BAD: To ensure yourself that all is well, turn on the lights and
check under the bed.
GOOD: To assure yourself that the proof is correct, you should take
the time to work through it.
GOOD: To insure yourself, call a reliable company such as Lloyds of
London.
SPLENDID: Rest assured that I have insured your home to ensure your
peace of mind.
SPLENDID: Before I can insure your business, you must assure me
that you can ensure that your programmers do careful quality
assurance.
I quoted (slightly cut down) a chunk of the book, not so much to
show this particular point, but more to give you a taste of Lyn's
book. Ever since it was recommended to me by a reviewer of one of
my papers (Chris Okasaki), I've been recommending it to just about
everyone.
Of course, you can find out answers to matters of English style on
the Web for nothing, but it's not nearly as fun as Lyn's book. Some
other resources would be:
The Guide to Grammar and Style by Jack Lynch
writes:
Assure, Ensure, Insure.
While ensure and insure aren't quite so clear cut, assure is very
different from both. You assure a person that things will go
right by making him confident. Never use assure in the sense
of "Assure that the wording is correct"; you can only assure
somebody that it's correct.
Ensure and insure are sometimes used interchangeably, but it may be
better to keep them separate. Insuring is the business of an
insurance company, i.e., setting aside resources in case of a
loss. Ensure means make sure, as in "Ensure that this is done by
Monday."
The Curmudgeon's Stylebook
covers similar ground:
ASSURE, ENSURE, INSURE
The words are close in meaning, but they're not interchangeable.
Ensure is usually the correct word; it means to make sure:
Before starting the car, I ensure the baby is buckled in.
Assure doesn't work that way; you assure another person of
something: After ensuring the baby was buckled in, I assured her
mother things were fine. One meaning of insure is to ensure, but
better publications use the word only in references to the business
of insurance: Even if the baby isn't buckled in, her life is insured
for $100,000.
Paul Brians' Common Errors in English
is another good resource,
which states:
ASSURE/ENSURE/INSURE
To "assure" a person of something is to make him or her confident
of it. According to Associated Press style, to "ensure" that
something happens is to make certain that it does, and to "insure"
is to issue an insurance policy. Other authorities, however,
consider "ensure" and "insure" interchangeable. To please
conservatives, make the distinction. However, it is worth noting
that in older usage these spellings were not clearly distinguished.
European "life assurance" companies take the position that all
policy-holders are mortal and someone will definitely collect,
thus assuring heirs of some income. American companies tend to
go with "insurance" for coverage of life as well as of fire,
theft, etc.
All of these sites are good resources for settling questions about
English usage, as are the FAQs posted to alt.usage.english.
> It may just be a British vs. American spelling difference, now
that I > think about it. Do you use British normally?
The only significant difference between UK and US usage here is that
Brits talk about `life assurance' (because you're going to die, one
day), and Americans talk about `life insurance' (because no one
really wants to believe they're mortal).
An an Englishwoman living in Canada, my spelling is annoyingly
midatlantic. I've always (even in England) initialized arrays,
rather than initialised them, but I use coloured pens rather than
colored ones. But most of my professional writing is for US
publications, so I have to adopt US conventions most of the time.
>> - Spotting when a log message is applied to every file in the
distribution. > > Ahh... so we could use a special string "all
files: blah blah blah" > for the log entry?
Yes, or even no files list at all. For example, in the EGS
changelog, there is the following entry:
Sun Mar 14 02:38:07 PST 1999 Jeff Law (law@cygnus.com)
* egcs-1.1.2 Released.
>> - Improving the formatting of ChangeLog entries. Long, carefully
formatted, >> entries are currently rather trampled by the
wrapping code. (Probably needs >> a command-line option.) > > I've
just been thinking about this too. May just modify some code > from
Text::Wrap. I'll bet we can guess right w/o a command-line > option
most of the time. I think a good strategy would be to only add >
newlines, never remove any. So long lines get auto-wrapped, but
then > the next line (in the original) doesn't move up, it stays on
its own > line. And of course, this only goes for the message
portion, not the > filenames. > > This way, text that tries to make
lists would stay readable. For > example: > > (parse_options):
parse the --fish option. > (stirfry): if `fish' is set, behave
appropriately. Adjust call to allergies(), and lower cooking heat
based on reference in heat_table. > (allergies): adjust for fish if
`fish' is set. > > would get turned into this: > > (parse_options):
parse the --fish option. > (stirfry): if `fish' is set, behave
appropriately. Adjust call to > allergies(), and lower cooking heat
based on reference in heat_table. > (allergies): adjust for fish if
`fish' is set. > > instead of this: > > (parse_options): parse the
--fish option. (stirfry): if `fish' is > set, behave appropriately.
Adjust call to allergies(), and lower > cooking heat based on
reference in heat_table. (allergies): adjust > for fish if `fish'
is set.
Yes, that seems like a good way to go.
Melissa.
1999-04-08 11:17 kfogel
* cvs2cl.pl (1.66): Put Melissa's name up near the top
1999-04-08 11:10 kfogel
* cvs2cl.pl (1.65): Implemented -r / --revisions option.
1999-04-08 10:49 kfogel
* cvs2cl.pl (1.64): Put "(BETA)" in version string, because the
recent slew of changes has only been tested by Melissa and myself.
Untabified, indented everything.
1999-04-08 10:45 kfogel
* cvs2cl.pl (1.63): Change from Melissa O'Neill :
Modified algorithm and data layout to collect multiple ChangeLog
messages for a given author over a sliding window of time.
1999-04-08 10:36 kfogel
* cvs2cl.pl (1.62): Change from Melissa O'Neill :
Fixed transposition in explanation (author and message were
swapped).
1999-04-08 10:35 kfogel
* cvs2cl.pl (1.61): Change from Melissa O'Neill :
Moved output of date and author up one loop level. Now ChangeLog
entries can have multiple parts (different log messages for
different files). The hash twisting/time merging code will almost
never generate data this way, however.
1999-04-08 10:28 kfogel
* cvs2cl.pl (1.60): Change from Melissa O'Neill :
Oops. Forgot seconds in parse_date_and_author.
1999-04-08 10:25 kfogel
* cvs2cl.pl (1.59): Change from Melissa O'Neill :
Major rewrite of the core code. Now parse_date_and_author returns a
time (i.e., seconds since the epoch) and author, rather than an
textual date and author. The whole structure of what we store has
been changed. No more building keys from concatenated strings (i.e.,
D.A.M. keys), instead we use multi-level hashes. This change should
reduce memory use.
Previously, $Max_Checkin_Duration had an effective granularity of 60
seconds, due to the dropping of seconds from dates in
parse_date_and_author. Because parse_date_and_author now groks dates
to the second, it would now be okay to set $Max_Checkin_Duration to
ten seconds, whereas previously that would be identical to setting
it to zero.
(Melissa, I made some mods to this patch, first to get it to apply,
then to get it to run. The upshot is: everything is untabified now,
hunk #7 was applied by hand [this was from patch #15], and since
apparently can't do "my (undef,...)" on line 304, I changed it to
"my ($ignore,...)" instead. Maybe the original way is legal in a
higher version of Perl or something? -kff)
1999-04-08 10:00 kfogel
* cvs2cl.pl (1.58): Change from Melissa O'Neill :
Modified output loop to use `each' instead of `keys'.
1999-04-08 09:54 kfogel
* cvs2cl.pl (1.57): Change from Melissa O'Neill :
Eliminate $ignore_me.
1999-04-08 09:52 kfogel
* cvs2cl.pl (1.56): Change from Melissa O'Neill :
Eliminated use of File::Copy in favor of rename.
1999-04-08 09:46 kfogel
* cvs2cl.pl (1.55): Change from Melissa O'Neill :
Fixed various uses of "" that really meant `undefined' to use
undefined.
Only work out names for temporary files if we will actually be using
them.
1999-04-08 09:44 kfogel
* cvs2cl.pl (1.54): Change from Melissa O'Neill :
Converted logfile header to be a global variable (in future, we
might allow the header to be omitted or altered). It now uses a
`here document' too.
1999-04-08 09:42 kfogel
* cvs2cl.pl (1.53): Change from Melissa O'Neill :
Fixed pretty_file_list to use join rather than a home-grown
equivalent. (Doh! Thanks, Melissa! -kff)
1999-04-08 09:36 kfogel
* cvs2cl.pl (1.52): Change from Melissa O'Neill :
Removed the last of the `_reffy' stuff and needless hash copying.
1999-04-08 09:31 kfogel
* cvs2cl.pl (1.51): Change from Melissa O'Neill :
Use a `here document' for the help message.
1999-04-07 17:49 kfogel
* cvs2cl.pl (1.50, spurious-tag-at-1_50): Change from Melissa
O'Neill :
Switched from using "" to mean undefined to using undefined to mean
undefined. (Some other cases remain, we'll do them later.)
Removed some superfluous tests from conditionals (it's true that
they make it clear what is true at that point, but that could be
expressed in a comment, rather than in executed code).
(Unfortunately, this meant that I outdented a fairly large chunk of
code, making the diff look like a more extensive change than it
really is.)
Eliminated a test for /^$file_separator/o by saving the result from
the earlier test.
1999-04-07 17:41 kfogel
* cvs2cl.pl (1.49): Change from Melissa O'Neill :
Simplified subhash code down to one line.
1999-04-07 17:37 kfogel
* cvs2cl.pl (1.48): Change from Melissa O'Neill :
Added /o to separator regexps.
1999-04-07 17:34 kfogel
* cvs2cl.pl (1.47): Change from Melissa O'Neill :
Avoid using Date::Parse. We now use timegm (from Time::Local) to do
date -> time conversions, and perform the time parsing ourselves
(given that dates are always in a pretty standard from).
1999-04-07 17:26 kfogel
* cvs2cl.pl (1.46): Change from Melissa O'Neill :
Added support for checkins that are not on the same minute by adding
a new loop to detect nearby dates.
1999-03-22 23:48 kfogel
* cvs2cl.pl (1.45): Heh, fix typo in version() -- it's "cvs2cl.pl,
not "cvs2pl.cl", which would be a very different program!
1999-03-22 18:40 kfogel
* COPYING (1.1, spuriousduplicatetag5, spurious_duplicate_tag_4,
spurious-duplicate-tag-3, spurious-duplicate-tag-2,
spurious-duplicate-tag-1, post-tag-name-changes,
pre-tag-name-changes): ship GPL too
1999-03-22 18:35 kfogel
* cvs2cl.pl (1.44): Added warning of auto-generation to output.
1999-03-19 23:07 kfogel
* README (1.1, spuriousduplicatetag5, spurious_duplicate_tag_4,
spurious-duplicate-tag-3, spurious-duplicate-tag-2,
spurious-duplicate-tag-1, post-tag-name-changes,
pre-tag-name-changes), cvs2cl.pl (1.43): Meaningful error codes
on exit. Added README in case anyone stumbles by chance upon this
directory.
1999-03-19 22:03 kfogel
* cvs2cl.pl (1.42): Don't double slashes in debug message.
1999-03-19 22:02 kfogel
* cvs2cl.pl (1.41): Better debugging output.
1999-03-19 21:57 kfogel
* a-subdir/test.txt (1.2), a-subdir/subsubdir/test.txt (1.2),
b-subdir/test.txt (1.2) (utags: post-tag-name-changes,
pre-tag-name-changes, spurious-duplicate-tag-1,
spurious-duplicate-tag-2, spurious-duplicate-tag-3,
spurious-tag-for-testing-tag-name-support,
spurious_duplicate_tag_4, spuriousduplicatetag5): [no log
message]
1999-03-19 21:56 kfogel
* cvs2cl.pl (1.40): Put ampersands on calls to debug().
1999-03-19 21:45 kfogel
* cvs2cl.pl (1.39): Ooops, fixed the filename-resetting bug. Added
undocumented --debug flag and the debug() routine.
1999-03-19 20:10 kfogel
* cvs2cl.pl (1.38): Fixed capitalization.
1999-03-19 19:57 kfogel
* cvs2cl.pl (1.37): Totally clean up usage() and parse_options().
Now it errors if unknown options. Also, restored "." prefix to bak
files (oops).
1999-03-19 19:45 kfogel
* cvs2cl.pl (1.36): Rewrite "The Plan" to reflect the new two-level
hash structure.
1999-03-19 19:40 kfogel
* cvs2cl.pl (1.35): Clean up some other inconsistencies in usage
message.
1999-03-19 19:39 kfogel
* cvs2cl.pl (1.34): In usage message, note that "--distributed" now
works.
1999-03-19 19:38 kfogel
* cvs2cl.pl (1.33): Fitz and I are pleased.
1999-03-19 19:28 kfogel
* a-subdir/test.txt (1.1), a-subdir/subsubdir/test.txt (1.1),
b-subdir/test.txt (1.1): This is only test data, please ignore
it.
Feel free to modify it and commit whenever you need to generate
another change message.
1999-03-19 19:21 kfogel
* cvs2cl.pl (1.32): Well, the --distributed option seems to be
working now. Time to run sanity tests.
1999-03-19 10:28 kfogel
* cvs2cl.pl (1.31): Document the plan for --distributed, get
everything in place; ready to implement.
Better var names too.
1999-03-19 10:10 kfogel
* cvs2cl.pl (1.30): Prettifications, no code changes.
1999-03-18 20:49 kfogel
* cvs2cl.pl (1.29): Reinstate -f/--file option, because we'll need
it again when the -d/--distributed option is finished.
Make tmp file name include PID.
Better option contradiction checking.
1999-03-18 18:06 kfogel
* cvs2cl.pl (1.28): implementation of --distributed option in
progress
1999-03-18 17:27 kfogel
* cvs2cl.pl (1.27): Implemented all proposed options except
--distributed, ahhh.
1999-03-15 18:17 kfogel
* cvs2cl.pl (1.26): sanify some more comments
1999-03-15 18:14 kfogel
* cvs2cl.pl (1.25): sanify some comments
1999-03-15 18:05 kfogel
* cvs2cl.pl (1.24): added note about --prune option
1999-03-15 15:37 kfogel
* cvs2cl.pl (1.23): correct comment
1999-03-15 15:28 kfogel
* long-log.out (1.3), short-log.out (1.2): no need for these files
now
1999-03-15 15:17 kfogel
* cvs2cl.pl (1.22): slight changes to usage
1999-03-13 00:51 kfogel
* cvs2cl.pl (1.21): oops, don't run usage
1999-03-13 00:50 kfogel
* cvs2cl.pl (1.20): include usage
1999-03-13 00:07 kfogel
* .cvsignore (1.1, spuriousduplicatetag5, spurious_duplicate_tag_4,
spurious-duplicate-tag-3, spurious-duplicate-tag-2,
spurious-duplicate-tag-1, post-tag-name-changes,
pre-tag-name-changes), ChangeLog (1.12): no need to keep a
derived ChangeLog in the repository
1999-03-13 00:06 kfogel
* ChangeLog (1.11): about to remove ChangeLog
1999-03-12 20:03 kfogel
* cvs2cl.pl (1.19): better separator comments
1999-03-12 19:59 kfogel
* ChangeLog (1.10), cvs2cl.pl (1.18): oops, be truer to GNU
ChangeLog style
1999-03-12 11:56 kfogel
* ChangeLog (1.9): [no log message]
1999-03-12 11:56 kfogel
* cvs2cl.pl (1.17): backup in .ChangeLog.bak, not ChangeLog.bak
1999-03-12 11:54 kfogel
* ChangeLog (1.8), cvs2cl.pl (1.16): comment the msg_txt prettifier
better
1999-03-12 11:41 kfogel
* ChangeLog (1.7), cvs2cl.pl (1.15): detect official CVS empty log
messages too
1999-03-12 11:39 kfogel
* ChangeLog (1.6): [no log message]
1999-03-12 11:38 kfogel
* cvs2cl.pl (1.14): include author
1999-03-12 11:37 kfogel
* cvs2cl.pl (1.13): include revision number
1999-03-12 11:34 kfogel
* ChangeLog (1.5): ChangeLog now reflects previous bugfix, heh
1999-03-12 11:34 kfogel
* ChangeLog (1.4), cvs2cl.pl (1.12): okay, preserve paragraphs
1999-03-12 11:20 kfogel
* cvs2cl.pl (1.11): Wrap more compactly, by eliminating lone
newlines in the message text. Thus, for example, a paragraph like
this one will be all together, but the following paragraph will
still be its own paragraph. Let's see if this works right, though.
Use "no log message" on conceptually empty log messages, not just
empty strings. Not that this log message would be one of those,
nooooo, it's quite long.
See?
1999-03-12 01:35 kfogel
* ChangeLog (1.3): Hmmm, beginning to realize I'll always be one
behind...
1999-03-12 01:27 kfogel
* ChangeLog (1.2): added comment about keeping ChangeLog
1999-03-12 01:23 kfogel
* ChangeLog (1.1): Well, might as well keep a ChangeLog then!
1999-03-12 01:18 kfogel
* cvs2cl.pl (1.10): better comment
1999-03-12 01:10 kfogel
* cvs2cl.pl (1.9): smokin'
1999-03-12 00:55 kfogel
* cvs2cl.pl (1.8): ready to smoke
1999-03-12 00:29 kfogel
* cvs2cl.pl (1.7), short-log.out (1.1): basic functionality done,
needs auto-fill though
1999-03-11 20:06 kfogel
* cvs2cl.pl (1.6): progress
1999-03-11 19:52 kfogel
* cvs2cl.pl (1.5): get date and author too
1999-03-11 19:30 kfogel
* cvs2cl.pl (1.4): knows filenames
1999-03-11 19:23 kfogel
* long-log.out (1.2), cvs2cl.pl (1.3): better data, previous was
bad due to just-discovered cvs log bug!
1999-03-11 18:34 kfogel
* cvs2cl.pl (1.2, spurious-tag-for-testing-tag-name-support):
document The Plan
1999-03-11 18:13 kfogel
* cvs2cl.pl (1.1), long-log.out (1.1): initial imports
cvs2cl-2.73/README.ORIGTARGZ 0000644 0001750 0001750 00000000642 11765402146 014422 0 ustar weasel weasel This orig.tar.gz was build on Mon, 11 Jun 2012 16:37:02 +0200 from a
working copy tarball provided by upstream.
cvs2cl was at revision 2.73 at that time.
The upstream website can be found at http://www.red-bean.com/cvs2cl/
There are a lot more files in the CVS, but this tarball only
includes cvs2cl.pl and 3 or 4 other files.
The ChangeLog was created using cvs2cl itself.
--
Peter Palfrader
cvs2cl-2.73/index.html 0000644 0001750 0001750 00000064355 11765402007 014177 0 ustar weasel weasel
cvs2cl.pl
cvs2cl.pl: A script for converting CVS log messages to
ChangeLog files.
The latest version is 2.73, released 17
May, 2008.
NOTICE
(2010-12-02): cvs2cl is in maintenance mode. Martyn Pearce stepped
down years ago after a long and successful stint as cvs2cl's
maintainer (thanks, Martyn!).
The original author, Karl Fogel, continues to accept patches. The
most recent patch, applied on 2011-11-10, was from Yuri Lebedev,
adding the '--xml-stylesheet' option. If you use cvs2cl a lot and
are interested in becoming the new maintainer, please say so.
Overview
cvs2cl is Perl script that does what you think it does:
it 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.
There is also XSLT available to convert
the ChangeLog output to HTML.
cvs -d :pserver:anonymous@cvs.red-bean.com:/usr/local/cvs co cvs2cl
Note that by using perldoc, you can review a full manpage
for cvs2cl:
perldoc cvs2cl.pl
If you have a bug to report, please mail it to bug-cvs2cl at red-bean dot com,
including the command-line you executed, what you expected to happen,
how what you got differed from this, and a small output of cvs log that
may be used to recreate the problem. A patch to fix the issue is
especially welcome.
XML Mode & XSLT, XSD
cvs2cl is capable of producing XML output.
David Carlson (davidwcarlson at hotmail dot
com) has come up with a draft dtd
and schema for cvs2cl's XML output.
Here's an XSL stylesheet kindly
donated by Daniel Ciaglia (daniel at ciaglia dot
de), that's a variant on the html XSLT below, with the
following amendments:
DOCTYPE changed to HTML 4.01;
removed the xmlns:cvs2cl definition
switched encoding to iso-8859-1
Example output from this stylesheet may be seen here Daniel also contributed a bash script to use with XSLT
transformations.
Here's a development of Daniel's
stylesheet kindly donated by Alexander Ruether that features:
Colored headlines
Convert linefeeds to <br>
via javascript you can show/hide the concerned files
Here's an XSL stylesheet kindly
donated by Joseph Walton (joe at kafsemo dot
org) that generates RSS output from changelogs in XML mode
(requires 2.51 for the isoDate patch).
Here's an XSL stylesheet
that kind donator Nicolas Karageuzian (nicolas at
karageuzian dot com) describes as "quick and dirty", that
generates rss and html using a table with colour changing for files
Here's a simple xslt (1.0) example for
converting the XML output to XHTML. It really is a very simple example,
for I am no expert: it's just a starting point. If anybody else has a
nicer application to share, please send it to the bug address, and I'll
post it here.
Here's an XSD, kindly donated by Yury
Lebedev (yurylebedev at mail dot
ru), that can translate cvs2cl.pl's XML output into DataSet
from MS dotNet Framework or can be used to validate/transform XML output
data types in DOM document. Instead of XDR, this XSD can be used 'as is'
without any modification of XML output - it's necessary only attach this
XSD as separate 'schema' for 'http://www.red-bean.com/xmlns/cvs2cl/'
namespace before loading such XML into a DOM document (depending on used
XML parser implementation).
Recent Developments
Monday, 23rd April 2007:
2.62 released, with several
bugfixes:
One by Gary Duzan to tolerate dot when matching tag names.
One by Alexey Panchenko to support Windows output paths
better.
Another by Alexey Panchenko to call subprocesses on Windows
correctly.
Wednesday, 17th May 2005:
2.59 released, with one
bugfix.
Sunday, 7th Novemmber 2004:
2.58 released, with several
bugfixes
Saturday, 10th July 2004:
2.57 released, with several
bugfixes; most notably to handle the date output from the new cvs 1.12.9
server.
Saturday, 15th May 2004:
2.54 released, with a couple of
new features. An XSLT donated by Alexander Ruether was also added.
Sunday, 7th March 2004:
2.53 released, a bugfix
release
Saturday, 6th March 2004:
Added XSLT donated by Nicolas
Karageuzian
Tuesday, 20th January 2004:
The structure of cvs2cl has
been significantly altered with the release of 2.52, introducing a
number of classes (all still within the one file), into which the major
subroutines have been placed.
Monday, 5th January 2004:
Integrated Peter Palfrader's
manpage (original)
into the POD for cvs2cl.
Tuesday, 9th December 2003:
2.51 released. A new set of bug fixes, and a couple of minor
features.
Wednesday, 26th November 2003:
Here's an XSL stylesheet kindly
donated by Joseph Walton (joe at kafsemo
dotorg) generates RSS output from changelogs in XML mode
(requires 2.51 for the isoDate patch).
Monday, 25th August 2003:
2.50 released. A new set of bug fixes, and a couple of minor
features.
Sunday, 24th August 2003:
Here's
a simple xslt (1.0) example for converting the XML output to
HTML. It really is a very simple example, for I am no expert: it's
just a starting point. If anybody else has a nicer application to
share, please send it to the bug address, and I'll post it here.
Saturday, 21st June 2003:
2.49 released. A new set of bug fixes, and an improvement to the
indenting style.
Tuesday, 22nd April 2003:
2.48 released. A stack of bugs have been fixed, and new features
added
Saturday, 23rd November 2002:
A number of bugs have recently been fixed, and a new bugs-status page has been created
Thursday, 23rd May 2002:
Martyn J. Pearce is the new
maintainer of cvs2cl. This site remains cvs2cl's home site, and bug
reports, patches, suggestions & pizza coupons should still be sent to
the bug-cvs2cl at red-bean dot
com mailing list.
David Carlson (davidwcarlson at hotmail
dot com) has come up with a draft dtd and schema for cvs2cl's XML output.
Examples
Here is cvs2cl.pl generating several flavors of its own ChangeLog.
Note that all of these invocations also used the "--fsf"
option (omitted below for brevity), because a few log entries were
written in FSF-style as an experiment.
cvs2html
cvs2html is a program which converts CVS log data to HTML. It
apparently organizes the data by file rather than by commit, which may
be less or more useful than cvs2cl depending on your needs.
CVSps
CVSps is a program for generating 'patchset' information from a CVS
repository. A patchset in this case is defined as a set of changes
made to a collection of files, and all committed at the same time
(using a single 'cvs commit' command). This information is valuable to
seeing the big picture of the evolution of a cvs project. While cvs
tracks revision information, it is often difficult to see what changes
were committed 'atomically' to the repository.
filter-cvs2cl.xslt
This is an XSL stylesheet kindly donated by Joseph Walton (joe at kafsemo dotorg) generates RSS
output from changelogs in XML mode (requires 2.51 for the isoDate
patch).
cl2html.xslt
This is a simple xslt file as a starting point for converting the XML
output of cvs2cl.pl to HTML. It really is just an
example, and a pretty tatty one at that. If you enhance it, or have
other examples of xslt for cvs2cl.pl (or, come to that,
Enhanced DTD/Schema/RelaxNG, etc. for the cvs2cl.pl XML output), and
are willing to share, please mail them to the bugs address, and they
too will be posted here!
cl2html.plcl2html.pl converts the XML outputted by cvs2cl.pl's
C<--xml> option to HTML or XHTML code.
This is essentially similar to the XSLT above, but done in perl
instead. Suitable for the more dromedarian among us.
cvs2cl.pl used for the gentoo.org website
"You'll remember that in Part 2 of this series I mentioned that the
cvs2cl.pl CVS Changelog generation script (see Resources) could
produce XML output and that I wanted to eventually use this feature as
the basis for a daily CVS Changelog page that would appear on the new
Web site. Now, with the new XML backend in place, adding the new
Changelog page is a piece of cake. Here's an enhanced version of the
cvslog.sh script that also takes care of handling the XML-to-HTML
conversion:"