eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}'
& eval 'exec perl -S $0 $argv:q'
if 0;
# THE PRECEEDING STUFF EXECS perl via $PATH
# -*-Fundamental-*-
# $Id: //guest/richard_geiger/utils/cvs2p4/bin/genmetadata#4 $
#
# Richard Geiger
#
require 5.000;
sub dirname
{
local($dir) = @_;
$dir =~ s%^$%.%; $dir = "$dir/";
if ($dir =~ m%^/[^/]*//*$%) { return "/"; }
if ($dir =~ m%^.*[^/]//*[^/][^/]*//*$%)
{ $dir =~ s%^(.*[^/])//*[^/][^/]*//*$%$1%; { return $dir; } }
return ".";
}
use Carp; # ...or flounder. (This will fail unless 'perl' is a perl5!)
$| = 1;
($Myname = $0) =~ s%^.*/%%;
$Mydir = &dirname($0);
$Here = `/bin/pwd`; chop $Here;
if ($Mydir ne ".") { chdir "$Mydir" || die "$Myname: can't chdir \"$Mydir\": $!"; }
chdir ".." || die "$Myname: can't chdir \"..\": $!";
$Mydir = `/bin/pwd`; chop $Mydir;
chdir $Here || die "$Myname: can't chdir \"$Here\": $!";
require "$Mydir/lib/util.pl";
$Usage = <<LIT;
$Myname: usage: $Myname
LIT
sub usage
{
print STDERR $Usage;
exit 1;
}
sub help
{
print STDERR <<LIT;
$Usage
$Myname is not done yet. Be patient.
LIT
exit 1;
}
######
#
# Perlstuff for parsing RCS repository files
#
# Some globals used by these routines...
#
$Rcs_Inquote = 0; # remembers when we're in a '@' quoted string
$Rcs_Eofatal = 1; # die if we hit the end of the file
$Rcs_File = "?"; # caller should set this for the error message
sub lead
{ if (defined($Myname)) { return "$Myname: "; } else { return ""; } }
sub rcsline
{
my $line;
my $m;
$line = <RCS>; $len = length($line);
if ($line eq "")
{
if ($Rcs_Eofatal)
{
$m = "unexpected eof on \"$Rcs_File\".";
printf STDERR "%s$m\n", &lead();
exit 1;
}
else
{ return undef; }
}
chomp $line;
return $line;
}
$Rcstok_Buf = "";
$Rcstok_pushed = undef;
# Return the next token from the RCS repository file.
# Caller should open the file on descriptor RCS.
# (Caller should also empty $Rcstok_Buf!)
sub rcstok
{
my $rcsstr;
my $m;
my $strpart;
if (defined($Rcstok_pushed))
{
my $ret = $Rcstok_pushed;
$Rcstok_pushed = undef;
return $ret;
}
$Rcstok_Buf =~ s/^\s+//;
if ($Rcstok_Buf eq "")
{
while (1)
{
$Rcstok_Buf = &rcsline();
if (! defined ($Rcstok_Buf)) { return undef; }
if ($Rcstok_Buf ne "") { last; }
}
$Rcstok_Buf =~ s/^\s+//;
}
# num
#
if ($Rcstok_Buf =~ /^([0-9][0-9.]+)(.*)$/)
{ $Rcstok_Buf = $2; return $1; }
# : ; id
#
# Note: the character class for "idchar" assumes all characters
# are printable ascii! May break with binary RCS files.
# (Actually, I've now convinced myself that there is no
# concern here).
#
if ($Rcstok_Buf =~ /^(:|;|[a-zA-Z][^ \t\n$,\.:;@]+)(.*)$/)
{ $Rcstok_Buf = $2; return $1; }
# string
#
if ($Rcstok_Buf =~ /^@(.*)$/)
{
$Rcstok_Buf = $1;
$rcsstr = "";
while (1)
{
if ($Rcstok_Buf eq "")
{
$rcsstr .= "\n";
$Rcstok_Buf = &rcsline();
if (! defined ($Rcstok_Buf)) { return undef; }
}
if ($Rcstok_Buf =~ /^([^@]+)(.*)$/)
{
$rcsstr .= $1;
$Rcstok_Buf = $2;
next;
}
if ($Rcstok_Buf =~ /^@@(.*)$/)
{
$rcsstr .= "@";
$Rcstok_Buf = $1;
next;
}
if ($Rcstok_Buf =~ /^@(.*)$/)
{
$Rcstok_Buf = $1;
return $rcsstr;
}
}
}
$m = "rcstok(): internal error: \$Rcstok_Buf <$Rcstok_Buf>";
printf STDERR "%s$m\n", &lead();
exit 1;
}
sub dirname
{
my ($dir) = @_;
$dir =~ s%^$%.%; $dir = "$dir/";
if ($dir =~ m%^/[^/]*//*$%) { return "/"; }
if ($dir =~ m%^.*[^/]//*[^/][^/]*//*$%)
{ $dir =~ s%^(.*[^/])//*[^/][^/]*//*$%$1%; { return $dir; } }
return ".";
}
sub skip_to_rcstok
{
my ($this) = @_;
my $tok;
while (($tok = &rcstok()) ne $this) { };
}
sub skip_to_deltas
{
my $tok;
# Called after we encounter ";" for symbols. We must now skip:
#
# locks {id : num}*; {strict ;}
# { comment {string}; }
# { expand {string}; }
# { newphrase }*
while (1)
{
$tok = &rcstok();
if ($tok eq "expand")
{
$RCS_expand = &rcstok();
if (&rcstok() ne ";")
{ die "$Myname: skip_to_deltas(): expected ';' after expand."; }
next;
}
if ($tok =~ /^[0-9]/) { $Rcstok_pushed = $tok; last; }
while (1)
{
$tok = &rcstok();
if ($tok eq ";") { last; }
}
}
}
sub test_rcstoks
{
my $tok;
open(RCS, "<$ARGV[1]") || die;
$Rcstok_Buf = "";
$Rcs_Eofatal = 0;
while (defined($tok = &rcstok))
{ print "<$tok>\n"; }
exit 1;
}
sub setrevs
{
my($d_rev, $d_next, $d_branches, $d_date, $d_author, $d_state) = @_;
my($b_rev);
$RCS_Revs{$d_rev} = "$d_next:$d_branches";
$d_date = "19$d_date" if length(( split( /\./, $d_date ))[0]) < 4;
$RCS_Dates{$d_rev} = "$d_date";
$RCS_Authors{$d_rev} = "$d_author";
$RCS_States{$d_rev} = "$d_state";
if ($d_rev =~ /^1\.1\.1\./)
{
# We have a "vendor" branch - spoof a branch tag for it.
#
$RCS_Branchtags{"import"} = "1.1.0.1";
$RCS_Tags{"import"} = "1.1.0.1";
}
if ($d_rev =~ /^[0-9]+\.[0-9]+$/)
{
$RCS_Prevs{$d_rev} = $d_next;
if ($d_next) { $RCS_Nexts{$d_next} = $d_rev; }
}
else
{
if ($d_next) { $RCS_Prevs{$d_next} = $d_rev; }
$RCS_Nexts{$d_rev} = $d_next;
}
foreach $b_rev (split(/ /, $d_branches))
{ $RCS_Prevs{$b_rev} = $d_rev; }
}
# initialize RCS_Tags, RCS_Revs, (etc.) from an RCS ,v file.
#
sub set_RCS_revs
{
my ($path, $do_texts) = @_;
my $repfile;
my $tag;
my $rev;
my $tok;
my ($d_havedelta, $d_branches, $d_next, $d_rev);
my $rcspath;
my $msg;
undef $RCS_Valid;
undef $RCS_expand;
undef $RCS_exec;
undef %RCS_Tags;
undef %RCS_Branchtags;
undef %RCS_Revs;
undef %RCS_States;
undef %RCS_Authors;
undef %RCS_Dates;
undef %RCS_Prevs;
undef %RCS_Nexts;
undef $RCS_Branch;
undef %RCS_Texts;
($Rcs_File = $path) =~ s%^.*/%%;
$repfile = $path;
$rcspath = "<$repfile";
if (! open(RCS, $rcspath))
{
printf STDERR "%scan't open \"$rcspath\": $!\n", &lead();
return 0;
}
if (-x $repfile) { $RCS_exec = "x"; }
$Rcstok_Buf = "";
#while (1) { $tok = &rcstok(); print "<$tok>\n"; }
&skip_to_rcstok("head");
# # (If the RCS repository is in the Attic there is logically no "head"
# # revision for this file)
# #
# if ($path !~ /Attic\/.+,v$/) { $RCS_Tags{"head"} = &rcstok(); }
$RCS_Tags{"head"} = &rcstok();
$tok = &rcstok(); $tok = &rcstok();
if ($tok eq "branch") { $RCS_Branch = &rcstok(); }
&skip_to_rcstok("symbols");
while (1)
{
$tok = &rcstok();
if ($tok eq ";") { last; }
$tag = $tok; &rcstok(); $rev = &rcstok();
$RCS_Tags{$tag} = $rev;
if ($rev =~ /\.0\.[0-9]+$/) { $RCS_Branchtags{$tag} = $rev; }
}
&skip_to_deltas();
$d_rev = ""; $d_havedelta = 0; $d_branches = ""; $d_next = "";
while (1)
{
$tok = &rcstok();
if ($tok =~ /[0-9.]+/)
{
if ($d_havedelta)
{ &setrevs($d_rev, $d_next, $d_branches, $d_date, $d_author, $d_state); }
$d_rev = $tok; $d_havedelta = 1; $d_branches = ""; $d_next = "";
}
elsif ($tok eq "branches")
{
while (1)
{
if (($tok = &rcstok()) eq ";") { last; }
if ($d_branches ne "") { $d_branches .= " "; }
$d_branches .= $tok;
}
}
elsif ($tok eq "date") { $tok = &rcstok(); if ($tok ne ";") { $d_date = $tok; &rcstok(); } }
elsif ($tok eq "author") { $tok = &rcstok(); if ($tok ne ";") { $d_author = $tok; &rcstok(); } }
elsif ($tok eq "state") { $tok = &rcstok(); if ($tok ne ";") { $d_state = $tok; &rcstok(); } }
elsif ($tok eq "next") { $tok = &rcstok(); if ($tok ne ";") { $d_next = $tok; &rcstok(); } }
elsif ($tok eq "desc") { last; }
else { &skip_to_rcstok(";"); }
}
if ($d_havedelta)
{ &setrevs($d_rev, $d_next, $d_branches, $d_date, $d_author, $d_state); }
if (! defined($do_texts)) { close RCS; $RCS_Valid = 1; return 1; }
$Rcs_Eofatal = 0;
while (1)
{
$tok = &rcstok();
if (! defined($tok)) { last; }
if ($tok =~ /[0-9.]+/)
{ $d_rev = $tok; }
elsif ($tok eq "text")
{
$msg = &rcstok();
if ($msg eq "") { $RCS_Texts{$d_rev} = 0; } else { $RCS_Texts{$d_rev} = 1; }
}
elsif ($tok eq "log")
{ $log = &rcstok(); $RCS_Logs{$d_rev} = $log; }
}
$Rcs_Eofatal = 1;
close RCS;
$RCS_Valid = 1;
return 1;
}
sub rcs_tip
{
my ($rev) = @_;
my $next;
# Find the tip of the branch...
#
while (1)
{
if (! defined($RCS_Revs{$rev}))
{ return "???"; }
($next) = split(/:/, $RCS_Revs{$rev});
if ($next eq "") { return $rev; }
$rev = $next;
}
}
# given a "CVS line spec" (revision #, "head", or a tag)
#
sub rev_on_line
{
my($line) = @_;
if ($line eq $TRUNKLINE)
{ $line = "head"; }
# else
# { $line = "${line}_BRANCH"; }
if (defined($RCS_Tags{$line})) { $line = $RCS_Tags{$line}; }
elsif ($line !~ /^[0-9.]+$/) { return "none"; }
if ($line =~ /\.0\.([0-9]+)$/)
{
# It's a CVS branch revision number... demunge it:
#
$line =~ s/\.0(\.[0-9]+)$/$1/;
# OK, see whether the branch actually exists:
# (We have an assumption here that first rev is always ".1")
#
$line = "$line.1";
if (! defined($RCS_Revs{$line}))
{
# Nope, so fall back to the root, which we know to be an
# existing revision...
$line =~ s/\.[0-9]+\.[0-9]+$//;
return $line;
}
# Yep, the branch exists; so it *is* a branch; so, we go out to
# the tip. (Right?)
#
return &rcs_tip($line);
}
# OK, do we have an RCS branch or an RCS revision number? (count
# the dots)
#
if (($line =~ tr/\././) % 2)
{
# An odd number of dots... it's a revision number
#
if (defined($RCS_Revs{$line})) { return $line; }
return "none"; # Or should we assert?
}
else
{
# An even number of dots... it's a branch number
# (We have an assumption here that first rev is always ".1")
#
return &rcs_tip("$line.1");
}
}
# Is rev "$this" < rev "$that"?
# Note: "" is considered infinitely high
# revs must be of the same order (I.e., same # of "."s)
#
sub rev_lt
{
my($this, $that) = @_;
my(@this, @that);
if (! $that) { return 1; }
@this = split(/\./, $this);
@that = split(/\./, $that);
while (1)
{
$this_n = shift(@this);
$that_n = shift(@that);
if ($this_n < $that_n) { return 1; }
if ($this_n > $that_n) { return 0; }
if ($#this < 0) { return 0; }
}
}
# Note: "" is considered infinitely high
#
sub linerev_gt
{
my($this, $that) = @_;
my $ret;
if (! $that)
{ $ret = 1; }
else
{
my $thisord, $thatord;
$thisord = ($this =~ tr/\././);
$thatord = ($that =~ tr/\././);
if ($thisord < $thatord)
{ $ret = 1; }
elsif ($thisord > $thatord)
{ $ret = 0; }
else
{ $ret = &rev_lt($that, $this); }
}
return $ret;
}
# Maximum size for a log message we'll keep.
# Messages beyond this get truncated, to accomodate a limitation
# on the key/value pair size in ndbm. That's life.
#
$MAXSZ = 256*3;
# Generate the metadata for a single file
#
sub dofile
{
local($dir, $file) = @_;
if ($file !~ /,v$/) { return; }
if ($IGNOREFILES && $file =~ /$IGNOREFILES/) { return; }
#if ($file ne "rm.c,v") { return; }
undef %RCS_lines;
undef %RCS_Branches;
undef $Firstusedrev;
# This parses the RCS information from the ,v file, filling
# in various data structures that we use, below.
#
&set_RCS_revs("$dir/$file", 0);
# What RCS keyword expansion options are in effect?
# (We use this to detect binary files)
#
$options = "${RCS_expand}$RCS_exec";
if (! $options) { $options = "-"; }
@path = split(/\//, "$dir/$file");
$file = pop(@path);
$file =~ s/,v$//;
if ($path[$#path] eq "Attic") { pop @path; }
$dir = join("/", @path);
$path = sprintf("%s%s%s", $dir, $dir ? "/" : "", $file);
# For all of the branches we see, store the tip revision in
# $HAVELINES{$line}; this is also where we weed out
# codelines we are not interested in.
#
foreach $line ((keys %RCS_Branchtags), $TRUNKLINE)
{
$no_flash_line = $line;
if (defined($BRANCH_FLASH)) { $no_flash_line =~ s/$BRANCH_FLASH$//; }
if ($WANTLINES && ! (defined($WANTLINES{$no_flash_line}))) { next; }
if (($tiprev = &rev_on_line($line)) eq "none") { next; }
$HAVELINES{$line} = $tiprev;
}
# Now we go through each line, to build a list of the RCS revs that
# need to be exported into the metadata stream.
#
while (1) # We have more lines to deal with...
{
(@k) = (keys %HAVELINES);
if ($#k < 0) { last; }
my $theline;
# Choose the highest numbered line of the lowest "order" for
# the next one to export... this will always pickup lines on
# branches nearer the trunk first, so the subsequent branches
# will have a place to branch from!
#
foreach $k (@k)
{
if ($k eq $TRUNKLINE) { $theline = $k; last; }
# if both lines select the *same* revision...
#
if ($HAVELINES{$k} eq $HAVELINES{$theline})
{
# ...take the one with the lower branch tag order first
#
if (&linerev_gt($RCS_Branchtags{$k}, $RCS_Branchtags{$theline}))
{ $theline = $k; next; }
}
if (&linerev_gt($HAVELINES{$k}, $HAVELINES{$theline}))
{ $theline = $k; }
}
$rev = $tiprev = &rev_on_line($theline);
$t = $theline;
if (defined($BRANCH_FLASH))
{ $t =~ s/$BRANCH_FLASH$//; }
# This is where we build the list of codelines we've encountered.
#
$All_lines{$t} = 1;
if ( (defined($RCS_lines{$rev})) &&
($theline ne $TRUNKLINE) &&
(($rev =~ tr/\././) < ($RCS_Branchtags{$theline} =~ tr/\././)))
{
if ($RCS_Branches{$rev}) { $RCS_Branches{$rev} .= ":"; }
$RCS_Branches{$rev} .= $t;
}
else
{
while ($rev && ! defined($RCS_lines{$rev}))
{
$RCS_lines{$rev} = $theline;
$rev = $RCS_Prevs{$rev};
}
if ($rev)
{
if ($RCS_Branches{$rev}) { $RCS_Branches{$rev} .= ":"; }
$RCS_Branches{$rev} .= $t;
}
}
# We test for "if $rev" here cause it may have gone null if the while loop
# above ran off the end...
#
if ($rev && (($rev =~ tr/\././) == 1) && &rev_lt($rev, $Firstusedrev))
{ $Firstusedrev = $rev }
delete $HAVELINES{$theline};
}
# OK, we have the set of revisions to export - write them to the
# metadata stream.
#
foreach $rev (keys %RCS_Revs)
{
$revkey = "$path/$rev";
$state = $RCS_States{$rev};
$author = $RCS_Authors{$rev};
$date = $RCS_Dates{$rev};
$date =~ s/\.//g;
$line = $RCS_lines{$rev};
if (defined($BRANCH_FLASH)) { $line =~ s/$BRANCH_FLASH$//; }
$branches = $RCS_Branches{$rev};
# Detect revisions before the first branch point, and
# omit them if we're not doing ALLTHEWAYBACK.
#
if ( (! $ALLTHEWAYBACK)
&& ($line eq $TRUNKLINE)
&& ($rev ne $RCS_Tags{"head"})
&& $Firstusedrev
&& &rev_lt($rev, $Firstusedrev))
{ next; }
if (! $line) { next; }
if (! $branches) { $branches = "-"; }
if ((! $ALLTHEWAYBACK) && $rev eq $Firstusedrev)
{ $prevrev = "-"; }
elsif ($RCS_Prevs{$rev})
{ $prevrev = $RCS_Prevs{$rev}; }
else
{ $prevrev = "-"; }
$All_lines{$line} = 1;
print META "$revkey$S$date$S$author$S$state$S$line$S$branches$S$prevrev$S$options\n";
# MAXSZ derives from a ndbm limitation on the size of a key/entry pair.
# at (256*3) it allows for a $revkey up to 250 chars or so.
#
$logmsg = substr($RCS_Logs{$rev}, 0, $MAXSZ);
if ($logmsg !~ /\n$/) { $logmsg .= "\n"; }
if (length($logmsg)+length($revkey) > 1010)
{ print "$Myname: revkey + log too long for <$revkey>\n"; exit 1; }
$MSGS{$revkey} = $logmsg;
}
print "$path\n";
}
# option switch variables get defaults here...
$Convdir = "";
$Boolopt = 0;
$Valopt = 0;
while ($#ARGV >= 0)
{
if ($ARGV[0] eq "-boolopt") { $Boolopt = 1; shift; next; }
elsif ($ARGV[0] eq "-valopt")
{
shift; if ($ARGV[0] < 0) { &usage; }
$Valopt = $ARGV[0]; shift; next;
}
elsif ($ARGV[0] eq "-help")
{ &help; }
elsif ($ARGV[0] =~ /^-/) { &usage; }
if ($Args ne "") { $Args .= " "; }
push(@Args, $ARGV[0]);
shift;
}
if ($#Args ne 0) { &usage; }
$Convdir = $Args[0];
$Metadata = "$Convdir/metadata";
$Logmsgs = "$Convdir/logmsgs";
$Changes = "$Convdir/changes";
$Revmap = "$Convdir/revmap";
$Clientdir = "$Convdir/p4";
require "$Convdir/config";
if (! open(META, "| sort -t '$S' -n +1 >$Metadata"))
{ print "$Myname: can't open \"| sort -n +1 >$Metadata\": $!\n"; exit 1; }
&s("rm -rf $Logmsgs.dir $Logmsgs.pag $Changes $Clientdir $Revmap.dir $Revmap.pag");
if (! dbmopen(MSGS, $Logmsgs, 0666))
{ print "$Myname: can't dbmopen \"$Logmsgs\": $!\n"; exit 1; }
#chdir $CVS_MODULE || die "$Myname: can't chdir \"$CVS_MODULE\": $!";
#$CVS_MODULE = `/bin/pwd`; chop $CVS_MODULE;
#chdir $Here || die "$Myname: can't chdir \"$Here\": $!";
&traverse($CVS_MODULE, 0, "dofile");
close META;
dbmclose MESSAGES;
$Lines = "$Convdir/lines";
if (! open(LINES, ">$Lines"))
{ print "$Myname: can't open \">$Lines\": $!\n"; }
else
{
print "===== Lines referenced:\n";
print LINES "===== Lines referenced:\n";
foreach $line (sort keys %All_lines)
{
print "$line\n";
print LINES "$line\n";
}
close LINES;
}
exit 0;
| # | Change | User | Description | Committed | |
|---|---|---|---|---|---|
| #81 | 6301 | Richard Geiger |
These changes resulted from a recent customer conversion. A checkpoint, more or less. |
||
| #80 | 5888 | Richard Geiger |
This fixes a subtle and heinous bug whereby imports done before a file gets a local change on "main" will be lost (even though the local change will reflect the contents of those "lost" revisions) cc: [email protected], [email protected] |
||
| #79 | 5811 | Richard Geiger |
I believe this changes handles the problem encountered by Henry Grishashvili at IC Manage. |
||
| #78 | 5673 | Richard Geiger | checkpoint ironport latest. | ||
| #77 | 5667 | Richard Geiger | fix a/na dup detection. | ||
| #76 | 5656 | Richard Geiger | Another fix for cases where TRUNKLINE is not head. | ||
| #75 | 5654 | Richard Geiger | Take care of David Birkhead's first two problem children :-) | ||
| #74 | 5651 | Richard Geiger | Cosmetic only | ||
| #73 | 5647 | Richard Geiger |
fixes for case of trunkline set to a branch (! the trunk) where a file is initially added. |
||
| #72 | 5633 | Richard Geiger |
Handle the "filename" attribute that some RCS/CVSes apparently create these days... Also, be sure to wipe the Convdir/p4root before genmetadata does it's thing, so as to remove any ,v files that genmetadata might find there. Also for general hygiene! |
||
| #71 | 5615 | Richard Geiger | more depot mapping fixes. | ||
| #70 | 5588 | Richard Geiger |
checkpoint the latest. This includes a rework of the label-heursitical stuff that seems to work better. |
||
| #69 | 5587 | Richard Geiger | Handle \r's in filenames by xlating to "%0d". | ||
| #68 | 5585 | Richard Geiger |
do complete branch determination in bin/genmetadata now... heh. |
||
| #67 | 5583 | Richard Geiger |
Handle "..." in CVS pathnames by changing them to ",,,"s. "Works for me!" |
||
| #66 | 5581 | Richard Geiger | pull out unintended leftover debug cruft. | ||
| #65 | 5580 | Richard Geiger | Tweaks & debugging fixes from the IP 2006/07/06 trial. | ||
| #64 | 5570 | Richard Geiger | decruftification. | ||
| #63 | 5568 | Richard Geiger |
If we are doing BRANCH_FLASH, do it consistently BEFORE using the un-de-flashed (!) value anywhere else! |
||
| #62 | 5567 | Richard Geiger |
Seems pretty close to right at this point. This change makes sure that we handle labels on "ambiguous" revisions (any 1.1.1.n, n > 1 revisions commited before any 1.2) as being present in *both* the import branch AND main correctly. |
||
| #61 | 5563 | Richard Geiger |
Life is a corner case. "UNMAPPED-COLLISION tags in tags.txt now indicate what collided better. Fix srcdiff to handle odd Log expansion corner case that was causing flase positives. |
||
| #60 | 5555 | Richard Geiger | NOEXC_PATHNAME | ||
| #59 | 5531 | Richard Geiger |
A significant checkpoint commit, with new improved handling of import vendor branches, and revisions present in main by virtue of multiple vendor drops to a file with no local mods. test/runtest works, with new refernece results pretty well scrutinized. |
||
| #58 | 5500 | Richard Geiger |
Fix handling of special chars in filenames with new rlog-based parsing. |
||
| #57 | 5498 | Richard Geiger | Eeeks, where did this line go!? | ||
| #56 | 5497 | Richard Geiger | checkpoint | ||
| #55 | 5495 | Richard Geiger |
Slight change to parsing rlog output, for better tolerance of people pasting rlog output into log messages. This also depend on the new rlog... |
||
| #54 | 5494 | Richard Geiger |
Heck, it's turning into 3.0! This is a watershed commit - switch to rlog-based ,v parsing... |
||
| #53 | 5490 | Richard Geiger | $Depotmap implemented. | ||
| #52 | 5489 | Richard Geiger | New checkpoint; now has multi-mod exclude_* files. | ||
| #51 | 5485 | Richard Geiger | good checkpoint | ||
| #50 | 5484 | Richard Geiger | checkpoint | ||
| #49 | 5483 | Richard Geiger |
The latest formula... ...and a typo. |
||
| #48 | 5480 | Richard Geiger |
Better vendor-branch handling... it's tricky! genmetadata now includes a flag in each line of the generated $Convdir/labels to indicate whether the file in question had "$Rcs_import_is_main" set. (The file had "branch: 1.1.1" as the default branch). |
||
| #47 | 5477 | Richard Geiger | Fix bug in prescan mode. | ||
| #46 | 5476 | Richard Geiger | I am import, hear me roar. | ||
| #45 | 5466 | Richard Geiger |
allow leading whitespace and/or trailing # comments in exclude_* lists. |
||
| #44 | 5465 | Richard Geiger | Add exclude list for tags & branches. | ||
| #43 | 5442 | Richard Geiger |
A checkpoint commit on the way to a 2.6.0 release with the new IronPort inspired improvements. |
||
| #42 | 5437 | Richard Geiger |
just another checkpoint. Passed test/runtest, but still has debugging cruft in. Not fit for release! |
||
| #41 | 5430 | Richard Geiger |
This is another "checkpoint" commit. It significantly rearranges how labels are done, so as to use a hueristic to divine label<->branch identifications. Not intended for release without further testing and tweakage! |
||
| #40 | 5428 | Richard Geiger |
A checkpoint commit; this adds a first stab attempt at a global (across all files) hueristic for determining the tag<->branchtag mapping. It seem to be working, but has not been deeply tested yet at all. There is also debugging cruft that should be removed before this goes into a release. Also, ALL of the big (per-file or more) hashes now get stored as tie'ed databases, in order to deal with memory exhaustion when dealing with BIG data sets. |
||
| #39 | 5426 | Richard Geiger | Add compilation of the tags and branch tags encountered. | ||
| #38 | 5392 | Richard Geiger | Adjust sort key specifier option to avoid the archiaic form. | ||
| #37 | 5272 | Richard Geiger | Allow "."s in author identifiers | ||
| #36 | 5199 | Richard Geiger | hush $CO .adamci | ||
| #35 | 5198 | Richard Geiger | First cut "ADAM" support for Intel Austin. | ||
| #34 | 5143 | Richard Geiger | prep for 2.5.5 | ||
| #33 | 5091 | Richard Geiger |
Fix delta processing - some labels (with nonnumerics following numerics) could otherwise confuse the parsing. |
||
| #32 | 4917 | Richard Geiger |
in PureRCS, always use the RCS branch number in the depot path. even for the #1 revs (which really point to it in RCS). |
||
| #31 | 4914 | Richard Geiger | Adds PureRCS switch. | ||
| #30 | 4732 | Richard Geiger | Changes to support special characters # @ % * (for release 2.5) | ||
| #29 | 4296 | Richard Geiger |
Integrate Robert Cowham's fox for the "binary slows"... In Cowham we Trust! |
||
| #28 | 4270 | Richard Geiger | Handle symbols name starting with a leading "num". | ||
| #27 | 3708 | Richard Geiger | Changes for 2.3.6 | ||
| #26 | 2376 | Richard Geiger | First show at fixing RCS/"import" confusion... | ||
| #25 | 2284 | Richard Geiger |
Package 2.3.3. Changes to begin handling MKS Source Integrity repositories. Today MKS; Tomorrow... ClearCase! (well). |
||
| #24 | 2239 | Richard Geiger |
Ignore "ext" and "format" RCS keywords. These are apparently added by MKS's rendition of RCS. Ug. |
||
| #23 | 2061 | Richard Geiger |
changes for 2.3.2: - can adjust db hash bucket size; - Add $DEPOT config variable - Handle labels with '#' or '@' |
||
| #22 | 1987 | Richard Geiger | Changes for 2.3.1 | ||
| #21 | 1942 | Richard Geiger |
Change to handle RCS branch tags (so this tools can work with RCS (vs CVS) repositories, too!) RCS branch tags are those with an even number of "."s. |
||
| #20 | 1781 | Richard Geiger |
This change reintegrates cvs2p4 2.0 developement work (through 2.0b6) back into my mainline development. |
||
| #19 | 1437 | Richard Geiger | Fix for 1.3.3 - labels on revived Attic files. | ||
| #18 | 1404 | Richard Geiger |
Oops, fix a bug ni the sort re-do from the last change: the external sort needs a -n. You'd think it would be smart enought to know what I want. Sheesh. :-) |
||
| #17 | 1388 | Richard Geiger | Put genmetadata on a memory diet. | ||
| #16 | 1203 | Richard Geiger |
Fix bug where dolables couldn't cope with tag in which the revision for a file was a delete Add the IMPORTTAGSPOOF switch. |
||
| #15 | 1185 | Richard Geiger |
Changes for 1.3 (Labels!) |
||
| #14 | 1031 | Richard Geiger | Changes for 1.2.17; fix one-letter id internal error bug. | ||
| #13 | 823 | Richard Geiger | Add assert for dup d/f,v d/Attic/f,v (like "Giao Phan" <[email protected]> saw) | ||
| #12 | 474 | Richard Geiger | Reject files with bad characters per perforce filenaming conventions. | ||
| #11 | 459 | Richard Geiger |
Now performs metadata sort using a sort routine coded directly in perl, rather than by using the host system's "sort" command. (Differences in "sort" behavior from one host to another had been observed to cause irregularities). |
||
| #10 | 416 | Richard Geiger | Pull in Thomas Quinot <[email protected]>'s UTC bugfix, for 1.2.12. | ||
| #9 | 398 | Richard Geiger | Skip (and note) ,v files with nonprintable characters in the fileame. | ||
| #8 | 392 | Richard Geiger | CHanges for 1.2.10 (tolerate empty RCS file) | ||
| #7 | 342 | Richard Geiger | Allow for "." in "id" symbols. | ||
| #6 | 330 | Richard Geiger |
This change allows cvs2p4 to cope with RCS archives with CR/LF line endings. (I'm not sure how these get created; presumably some weird side effect of Bill Gates. But one user had 'em; RCS seems to cope with 'em, and so I've decided to make cvs2p4 follow suit. |
||
| #5 | 305 | Richard Geiger | Changes for 1.2.7 | ||
| #4 | 249 | Richard Geiger |
Changes in preparation for supporting spaces in filenames. (In fact, this may work as of this change, but is not yet tested.) Also, add "runtest -gengood" to allow easier generatino of new *.good files. (It just doesn't quick on a miscompare!). |
||
| #3 | 240 | Richard Geiger |
Version 1.2.5, to account for post-1999 RCS behavior. (Courtesy of David Simon, Goldman Sachs) |
||
| #2 | 179 | Richard Geiger | CHanges for 1.2.3 | ||
| #1 | 130 | Richard Geiger |
CVS-to-Perforce converter. This is release 1.2.2 (first submit to the Perforce Public Depot) |