cvs2cl-2.73/0002755000175000017500000000000011765402153012171 5ustar weaselweaselcvs2cl-2.73/TODO0000644000175000017500000000122407163364121012655 0ustar weaselweaselOh 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.pl0000755000175000017500000026555111765402007013737 0ustar weaselweasel#!/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; 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/COPYING0000644000175000017500000004310507163364121013224 0ustar weaselweasel 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/ChangeLog0000644000175000017500000045770511765402007013761 0ustar weaselweasel2011-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.ORIGTARGZ0000644000175000017500000000064211765402146014422 0ustar weaselweaselThis 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.html0000644000175000017500000006435511765402007014177 0ustar weaselweasel 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.

A bug status page for cvs2cl may be found here

Otherwise, you can download the latest version of the script, or get it via CVS thusly:

      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.

1. cvs2cl.pl
2. cvs2cl.pl --xml
3. cvs2cl.pl --revisions
4. cvs2cl.pl --tags
5. cvs2cl.pl --branches
6. cvs2cl.pl --tags --revisions
7. cvs2cl.pl --branches --revisions
8. cvs2cl.pl --tags --branches
9. cvs2cl.pl --tags --branches --revisions
10. cvs2cl.pl --tags --branches --revisions --usermap $CVSROOT/CVSROOT/users --day-of-week

Running cvs2cl.pl --help will get you a thorough usage message, too.


Links

Here are some links to related resources:
  • The CVS Homepage
  • 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.pl cl2html.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:"


Summarized Change History

2.58
  • #50 Correct sense of --no-ancestors
  • #79 Fix non-working --prune
  • #80 Fix use of quotes in shell interpolation (that is, exec directly rather than using the shell).
  • #81 Fix implementation of --ignore to match documentation (i.e., use regexen).
  • #82 Fix implementation of branch recognition to handle branches with 10+ members.
  • #83 Add tag dates to XML output.
2.57
  • #75 Add patch to allow correct date format reading under cvs 1.12.9
  • #19 Fix regression of handling carriage returns with windows cvs log
  • #76 Fix missing use of File::Basename in ChangeLog::FileEntry
  • #77 Fix gecos handling to read getpwnam correctly
2.55 New features:
  • #73 Add --lines-modified option
  • #74 Add --follow-only option
2.53 Bug fixes:
  • #71 (provide non-zero exit code if cvs log fails)
  • #70 (eliminate unitialized value warnings with --follow)
  • #69 (fix --gecos to cope if author is missing, or if gecos field lacks commas)
  • #68 (fix -t -b to not die with a bad array dereference)
  • #65 (formatting fixes for pod)
2.52 New features:
  • Factor out a number of classes to ease maintenance and clarify data-flow
  • #65 (Reformat/Rewrite POD to form a valid manpage)
Bug fixes:
  • #66 (make --no-indent to not indent with --hide-filenames & --no-wrap)
2.51 New features:
  • #64 (Add --no-indent option)
  • #60 (Add ISO date to XML output)
Bug fixes:
  • #61 (Add examples of date use)
  • #63 (Partial implementation of group-within-date)
  • #56 (avoid uninitialized value warnings with --gecos)
  • Fix --FSF to not indent extra spaces
  • #57 (remove Attic/ path from --rcs output (to match non-rcs output))
  • #59 (handle files with a space in their name that were added on a branch)
2.50 New features:
  • Sort tags on output to ensure determinism to assist in tests (and other change-check mechanisms).
  • #52 (Add --noxmlns option)
  • #49 (Interpret "[user@]host:/file/whatever" in -U option)
Bug fixes:
  • Undocument --update since it doesn't actually do anything useful.
  • #51 (Remove additional newline from msg in XML mode)
  • #46 (Better wrapping of filenames with --no-wrap)
Implementation Changes:
  • Change 'wrap' to 'mywrap' because Text::Wrap in perl 5.005_03 exports wrap unconditionally and generates an override warning
2.49 New features:
  • #47 (Don't show log entries for branch-file addition)
  • #46 (Cosmetic Improvement to Indenting)
  • #45 (Fix awkward wrapping on two-space sentence gap)
  • #44 (Remove end-of-line whitespace being generated)
  • #43 (Conflate --mailname/--domain)
  • #42 (document --chrono flag)
  • #41 (Recognize RCS File on Windoze boxen)
  • #3 (Stop re-adding same logs with --accum --utc)
2.48
    New features:
  • #40 (Add --summary option to summarize groups in terms of added, deleted & changed files)
  • #39 (Add --update option to list only files that have changed since last run) #38
  • (Add --no-ancestors option to track only changes since a branch began)
  • #37 (Add --show-dead option to record dead files in output)
  • #36 (Add --rcs option to read raw rcs files)
  • #35 (Add --passwd option to read details from passwd file)
  • #35 (Add --mailname option to specify mail domain)
2.47 New features:
  • #33 (Document --delta flag)
  • #32 (Add --gecos, --domain options to include email & gecos informatin)
  • #29 (Add --FSF option to default output to FSF style)
  • #28 (Add --no-common-dir option to disable common-directory clustering in file output)
  • #26 (Add --show-tag option as opposite of --ignore-tag)
  • #25 (Add --chrono option to write output in chronological order)
2.46 New feature
  • #24 (Option to not print HH:MM on timestamps)
2.45 Fixes to bugs
  • #19 (carriage returns wreak havoc on windoze)
  • #22 (extra square brackets appeared on revision numbers)
  • #23 (perl version hardwired)
2.44 Fix to bug
  • #18 (spurious `malformed utf-8 character' warnings emitted)
2.43 Fixes to bugs
  • #14 (conflict with --accum and -D)
  • #11 (log tags with date the first tag occurred)
2.42 Fix to bug
  • #8 (delta option for trimming log between two tags)
2.41 Fix to bug
  • #5 (-W fails to handle argument '0')


Authors & Contributors

Authors

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

Contributors

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


brought to you by red-bean