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-*- require 5.000; # $Id: //guest/richard_geiger/utils/cvs2p4/bin/dochanges#2 $ # # Richard Geiger # # These re's specify the set of expected messages from various p4 # operations which are successful. I.e., if a message is seen that # doe *not* match one of these, it's considered an error. # # ... for "p4 submit"s: # $check_submits = <<MSGS; Change [0-9]+ created with [0-9]+ open file\\(s\\). ^Change [0-9]+ submitted.\$ ^Locking [0-9]+ files ...\$ ^Submitting change [0-9]+.\$ ^(add|branch|edit|delete) //.+#[0-9]+\$ ^//.+ - refreshing\$ MSGS @check_submits = split(/\n/, $check_submits); # # ... for "p4 change -f"s: # $check_changefs = <<MSGS; Change [0-9]+ updated.\$ MSGS @check_changefs = split(/\n/, $check_changefs); #print "\@check_submits:\n"; #foreach $c (@check_submits) { print "$c\n"; } #obs##print "\n\@check_changes:\n"; #obs##foreach $c (@check_changes) { print "$c\n"; } #print "\n\@check_changefs:\n"; #foreach $c (@check_changefs) { print "$c\n"; } #exit 1; 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\": $!"; #obs#use IPC::Open2; require "$Mydir/lib/util.pl"; require "timelocal.pl"; $Convclient = "cvs2p4"; $Usage = <<LIT; $Myname: usage: $Myname [-v <n>] [-s <start_change_group>] <conversiondir> LIT sub usage { print STDERR $Usage; exit 1; } sub help { print STDERR <<LIT; $Usage $Myname <to be written> LIT exit 1; } # Guarantee that the name directory (may be multiple levels deep) # exists; create intermediate directories as needed (like mkdir -p) # sub insuredir { my($d) = @_; if (! -d $d) { my($p) = &dirname($d); &insuredir($p); mkdir $d, 0755; } } sub path { my($prefix, $file_dir, $file_name) = @_; my($path); $path = "$prefix"; if ($file_dir) { $path .= "$file_dir/"; } $path .= "$file_name"; return $path; } # Check a message; if it matches any of the expected ones on @res, # it's OK; otherwise, declare a problem and rithlessly exit. We # demand perfection! # sub checkmsg { my($msg, $from, @res) = @_; chop $msg; foreach $re (@res) { if ($msg =~ /$re/) { return; } } print "$Myname: checkmsg: *** $from *** $msg\n"; exit 1; } # A temp file used to hold p4 command output # $tmpout = "/tmp/p4_submit_out.$$"; # A convenient switch for disabling actual exection of commands. # $Do = 1; # Submit the current default change. # $msg is the log message to use. # $who is the original author of the RCS revision(s) # $time is the original time of the RCS revsision(s) # $files is the file list for the change. # @change is the change set; required for building revmap # (Used to construct the map of RCS revisions -> p4 changes. # sub p4submit { my($msg, $who, $time, $files, @change) = @_; my $changenum; # This bit is to allow us to pass multiple arrays. # Hipper folks would use refs to arrays, I know. # I must be as old as Larry Wall's Mom. # my (@files) = split(/\001/, $files); # Start the submit... # $p4submit = "$P4 submit -i >$tmpout 2>&1"; if ($V > 0) { print "$Myname: ...| $p4submit\n"; } if (! open(SUBMITW, "| $p4submit")) { print "$Myname: open \"| $p4submit\" failed: $!.\n"; exit 1; } $P1 = <<P1; Change:\tnew Client:\t$Convclient User:\t$Username Status:\tnew Description: P1 if ($V > 1) { my $vl; foreach $vl (split(/\n/, $P1)) { print "->SUBMITW: $vl\n"; } } print SUBMITW $P1; # Insert the log message... # if ($LOGNOTE) { my($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = gmtime(time); my($ts) = sprintf("%04d/%02d/%02d %02d:%02d:%02d", $year+1900, $mon+1, $mday, $hour, $min, $sec); $msg .= "\n[imported from CVS by $Convclient at $ts]\n"; } @msg = split(/\n/, $msg); foreach $line (@msg) { if ($V > 1) { print "->SUBMITW:\t$line\n"; } print SUBMITW "\t$line\n"; } $P2 = <<P2; Files: P2 if ($V > 1) { my $vl; foreach $vl (split(/\n/, $P2)) { print "->SUBMITW: $vl\n"; } } print SUBMITW $P2; # Insert the files list... # foreach $file (@files) { if ($V > 1) { print "->SUBMITW:\t$file\n"; } print SUBMITW "$file\n"; } close SUBMITW; # OK, now we inspect the output from "p4 submit". (Hey, we used to # use open2, but it kept leaving zombies around, and I got tired of # trying to understand why...) # if (! open(SUBMITR, "<$tmpout")) { print "$Myname: open \"<$tmpout\" failed: $!.\n"; exit 1; } # Build %chrevs - the whole first field of the change line, indexed # by the file path part. # foreach $chrev (@change) { ($revinfo = $chrev) =~ s/ .*//; chop $revinfo; $revinfo =~ m%^$CVS_MODULE/(.*)/([0-9\.]+)%; $chrev{$1} = $revinfo; } while (<SUBMITR>) { if ($V > 0) { print "SUBMITR->:$_"; } &checkmsg($_, "p4 submit", @check_submits); # Now update the rev map for each Perforce rev we see... # if (/^(add|branch|delete|edit) $P4_DEPOT\/[^\/]+\/(.*)#([0-9]+)$/) { $chpath = $2; $p4rev = $_; chop $p4rev; $p4rev =~ s/^.* //; $cvsrev = $chrev{$chpath}; $REVMAP{$p4rev} = $cvsrev; } if ($_ =~ /^Change ([0-9]+) submitted\.$/) { $changenum = $1; } } close SUBMITR; # Now we spoof the change to appear as done by $who at $time: # if ($changenum !~ /[0-9]+/) { print "$Myname: assert: didn't see change number <$changenum>.\n"; exit 1; } # Start "p4 change -i -f" # $p4changef = "$P4 change -i -f >$tmpout 2>&1"; if ($V > 0) { print "$Myname: ...| $p4changef\n"; } if (! open(CHANGEW, "| $p4changef")) { print "$Myname: open \"| $p4submit\" failed: $!.\n"; exit 1; } my($year, $mon, $day, $hour, $min, $sec) = ($time =~ /^(..)(..)(..)(..)(..)(..)/); $Date = sprintf("%4d/%02d/%02d %02d:%02d:%02d", $year, $mon, $day, $hour, $min, $sec); $C1 = <<C1; Change:\t$changenum Date:\t$Date Client:\t$Convclient User:\t$who Status:\tsubmitted Description: C1 if ($V > 1) { my $vl; foreach $vl (split(/\n/, $C1)) { print "->CHANGEW: $vl\n"; } } print CHANGEW $C1; # Insert the log message. Again. # foreach $line (@msg) { if ($V > 1) { print "->CHANGEW:\t$line\n"; } print CHANGEW "\t$line\n"; } close CHANGEW; # Now inspect the p4 output for errors... # if (! open(CHANGER, "<$tmpout")) { print "$Myname: open \"<$tmpout\" failed: $!.\n"; exit 1; } while (<CHANGER>) { if ($V > 0) { print "SUBMITR->:$_"; } &checkmsg($_, "p4 change -f", @check_changefs); } close CHANGER; unlink $tmpout; } $ext = <<EXTS; a bin bmp class coff com dll doc dvi dwarf exe fm gif gz ico jar jpg lib o obj pdf ps tar xbm xls zip z EXTS @ext = split(/\n/, $ext); foreach $ext (@ext) { $ext{$ext} = 1; } sub is_binary_file { my ($path) = @_; my ($filename) = $path; $filename =~ s/^.*\///; my $fileext; $filename =~ m/\.([^\.]+)$/; $fileext = $1; $fileext =~ tr/A-Z/a-z/; if (defined($ext{$fileext})) { return 1; } return 0; } #if (&is_binary_file($ARGV[0])) # { print "BINARY\n"; } else { print "TEXT\n"; } #exit 1; # Determine whether the depot already has this file on this code line. # (Used to determine when we need to branch). # sub depot_has { my($clientfile) = @_; my($line); $p4files = "$P4 files $clientfile 2>&1"; print "$Myname: $p4files |...\n"; if (! open(FILES, "$p4files |")) { print "$Myname: open \"$p4files |\" failed: $!.\n"; exit 1; } $line = <FILES>; #print $line; while(<FILES>) { print $_; } close FILES; if ($line =~ /- no such file\(s\)\./ || $line =~ / - delete change /) { return 0; } else { return 1; } } # Process one "change" from RCS. # Called with the set of RCS files/revs to process in @change # sub dochange { my @map; print "\n========== change group $do_change_num\n"; if ($V > 0) { foreach $c (@change) { ($filerev, $time, $who, $state, $line, $branches, $prevrev, $options) = split(/ /, $c); @filerev = split(/\//, $filerev); $rev = pop(@filerev); $file = join("/", @filerev); print "$who $time $filerev $state $line $branches\n"; } } # Get the # # Do the revisions... # print "=== deletes\n"; $nc = 0; undef $files; foreach $c (@change) { ($filerev, $time, $who, $state, $line, $branches, $prevrev, $options) = split(/ /, $c); if ($line eq "$TRUNKLINE") { $line = "main"; } @filerev = split(/\//, $filerev); $rev = pop(@filerev); $file = join("/", @filerev); ($file_dir = &dirname($file)) =~ s/^$CVS_MODULE//; $file_dir =~ s/^\///; ($file_name = $file) =~ s%^.*/%%; $Depotfile = &path("$P4_DEPOT/$line/", $file_dir, $file_name); $Clientfile = &path("$Client/$line/", $file_dir, $file_name); &insuredir(&dirname($Clientfile)); if ($state eq "dead") { $Exists_in_depot = &depot_has($Clientfile); if ($Exists_in_depot) { if (! -e $Clientfile) { # Create a dummy one to remove (p4/ must be stateless) # if (! open(C, ">$Clientfile")) { print "$Myname: can't create \"$Clientfile\": $!.\n"; exit 1; } close C; } if ($sts = &s("$P4 delete $Clientfile", $Do)) { exit $sts; } $nc++; if ($files) { $files .= "\001"; } $files .= "\t$Depotfile\t# Delete"; } } } if ($nc > 0) { &p4submit("Deleting\n", $who, $time, $files, @change); } print "===adds/edits===\n"; $nc = 0; undef $files; foreach $c (@change) { ($filerev, $time, $who, $state, $line, $branches, $prevrev, $options) = split(/ /, $c); if ($line eq "$TRUNKLINE") { $line = "main"; } @filerev = split(/\//, $filerev); $rev = pop(@filerev); $file = join("/", @filerev); ($file_dir = &dirname($file)) =~ s/^$CVS_MODULE//; $file_dir =~ s/^\///; ($file_name = $file) =~ s%^.*/%%; $Depotfile = &path("$P4_DEPOT/$line/", $file_dir, $file_name); $Clientfile = &path("$Client/$line/", $file_dir, $file_name); $Rcsfile = "$file,v"; if (! -f $Rcsfile) { $Rcsfile = &path("$CVS_MODULE/", $file_dir, "Attic/$file_name,v"); if (! -f $Rcsfile) { print "$Myname: can't find RCS ,v file for \"$file\".\n"; exit 1; } } &insuredir(&dirname($Clientfile)); # Note: we assume binary files never become text files or vice versa # if ($state ne "dead") { $Exists_in_depot = &depot_has($Clientfile); if ($Exists_in_depot) { if (($sts = &rm($Clientfile)) || ($sts = &s("$CO -p$rev $Rcsfile >$Clientfile", $Do))) { exit $sts; } if ($sts = &s("$P4 edit $Clientfile", $Do)) { exit $sts; } $nc++; if ($files) { $files .= "\001"; } $files .= "\t$Depotfile\t# Edit"; } else { if (($sts = &rm($Clientfile)) || ($sts = &s("$CO -p$rev $Rcsfile >$Clientfile", $Do))) { exit $sts; } # This is where we decide if this pup is a text or a binary file. # # We used to just trust the CVS options to tell us when we have # a binary... but many times binary files get checked in to CVS # and nobody remembers to tell CVS! So.... we now try to be more # clever. if ($options =~ /[ob]/ || -B $Clientfile || &is_binary_file($Clientfile)) { $type = "binary" } else { $type = "text"; } if ($options =~ /x/) { $type = "x$type"; } if ($type =~ /text/) { $type = "k$type"; } if ($sts = &s("$P4 add -t $type $Clientfile", $Do)) { exit $sts; } $nc++; if ($files) { $files .= "\001"; } $files .= "\t$Depotfile\t# Add"; } } } if ($nc > 0) { &p4submit($MSGS{$filerev}, $who, $time, $files, @change); } print "===branches===\n"; $nc = 0; undef $files; foreach $c (@change) { ($filerev, $time, $who, $state, $line, $branches, $prevrev, $options) = split(/ /, $c); if ($line eq "$TRUNKLINE") { $line = "main"; } if ($state ne "dead" && $branches ne "-") { @filerev = split(/\//, $filerev); $rev = pop(@filerev); $file = join("/", @filerev); ($file_dir = &dirname($file)) =~ s/^$CVS_MODULE//; $file_dir =~ s/^\///; ($file_name = $file) =~ s%^.*/%%; $Depotfile = &path("$P4_DEPOT/$line/", $file_dir, $file_name); $Clientfile = &path("$Client/$line/", $file_dir, $file_name); foreach $branch (split(/:/, $branches)) { $Depot_branchfile = &path("$P4_DEPOT/$branch/", $file_dir, $file_name); if ($sts = &s("$P4 integrate $Depotfile $Depot_branchfile", $Do)) { exit $sts; } $nc++; if ($files) { $files .= "\001"; } $files .= "\t$Depot_branchfile\t# Branch"; $Client_branchfile = &path("$Client/$branch/", $file_dir, $file_name); } } } if ($nc > 0) { &p4submit("Branching\n", $who, $time, $files, @change); } } # Expect messages from "p4d checkpoint" # $check_checkpoints = <<MSGS; ^command "checkpoint"\$ ^p4d_admin> ^: Checkpointing to ^: Saving journal to ^: Truncating MSGS @check_checkpoints = split(/\n/, $check_checkpoints); sub docheckpoint { my($cmd) = "rsh $P4HOST -l $P4USER /u/p4/bin/p4d_admin port $P4PORTNUM rsh checkpoint 2>&1 </dev/null |"; print "\n=== checkpoint after $do_change_num\n"; if (! open(RSH, $cmd)) { print "$Myname: can't open \"$cmd\": $!.\n"; exit 1; } print "$Myname: $cmd\n"; while (<RSH>) { &checkmsg($_, "p4d_admin rsh checkpoint", @check_checkpoints); print "$Myname: CHECKPOINT: $_"; } close RSH; } ###### main starts here # (@pwent) = getpwuid($<); if ($#pwent < 7) { print STDERR "$Myname: can't get your passwd file entry.\n"; exit 1; } $Username = $pwent[0]; if ($CHECKPOINT_INTERVAL && -x "/bin/domainname" && `/bin/domainname` =~ /^netapp.com$/) { $Docheckpointing = 1; } else { $Docheckpointing = 0; } # option switch variables get defaults here... $Metadata = "metadata"; # option switch variables get defaults here... $Boolopt = 0; $V = 1; $Start_at_ch = 1; while ($#ARGV >= 0) { if ($ARGV[0] eq "-boolopt") { $Boolopt = 1; shift; next; } elsif ($ARGV[0] eq "-v") { shift; if ($ARGV[0] < 0) { &usage; } $V = $ARGV[0]; shift; next; } elsif ($ARGV[0] eq "-s") { shift; if ($ARGV[0] < 0) { &usage; } $Start_at_ch = $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]; chdir $Convdir || die "$Myname: can't chdir \"$Convdir\": $!"; $Convdir = `/bin/pwd`; chop $Convdir; chdir $Here || die "$Myname: can't chdir \"$Here\": $!"; $Metadata = "$Convdir/metadata"; $Logmsgs = "$Convdir/logmsgs"; $Changes = "$Convdir/changes"; $Revmap = "$Convdir/revmap"; $Client = "$Convdir/p4"; $LOGNOTE = 1; require "$Convdir/config"; if (! defined($P4PORT)) { print "$Myname: no P4PORT in \"$Convdir/config\".\n"; exit 1; } else { $ENV{"P4PORT"} = $P4PORT; } ($P4HOST = $P4PORT) =~ s/:.*//; ($P4PORTNUM = $P4PORT) =~ s/^.*://; $P4USER = "p4"; $ENV{"P4CLIENT"} = $Convclient; # These defaults can be overriden in the config file # # Path the the RCS co command # if (! defined($CO)) { $CO = "/usr/local/bin/co"; } if (! -x ($CO)) { print "$Myname: No executable \"co\" command at \"$CO\".\n"; exit 1; } # Path the the p4 client command # if (! defined($P4)) { $P4 = "/usr/local/bin/p4"; } if (! -x ($P4)) { print "$Myname: No executable \"p4\" command at \"$P4\".\n"; exit 1; } if ($Start_at_ch == 1) { # We only do this to start (not when restarting from a chackpoint) # $P4CMD = "$P4 client -i"; # Remove $Convdir/p4 if it already exists... # (This is where the client tree gets build) # &s("/bin/rm -rf $Convdir/p4"); # Remove any revmap files... # &s("/bin/rm -f $Revmap.dir $Revmap.pag"); # Remove any existing client defined with this name. # &s("$P4 client -d $Convclient"); if (! open(P4, "| $P4CMD")) { print "$Myname: open \"/usr/local/bin/p4 client -i\" failed: $!.\n"; exit 1; } print P4 <<CLI; Client: $Convclient Root: $Client View: $P4_DEPOT/... //$Convclient/... CLI close P4; if ($?) { print "$Myname: \"$P4CMD\" failed to create client.\n"; exit 1; } } # Open the changes file (this is the genchamges output file) # if (! open(CHGS, "<$Changes")) { print "$Myname: can't open \"$Changes\": $!\n"; exit 1; } # Open the REVMAP database... # if (! dbmopen(REVMAP, $Revmap, 0666)) { print "$Myname: can't dbmopen \"$Revmap\": $!\n"; exit 1; } # Open the log messages database # if (! dbmopen(MSGS, $Logmsgs, 0444)) { print "$Myname: can't dbmopen \"$Logmsgs\": $!\n"; exit 1; } $gather_change_num = $do_change_num = 0; while (<CHGS>) { if (/^# ([0-9]+)$/) { $gather_change_num = $1; if ($do_change_num) { &dochange(@change); if (($CHECKPOINT_INTERVAL > 0) && (($do_change_num % $CHECKPOINT_INTERVAL) == 0)) { if ($Docheckpointing) { &docheckpoint; } } $do_change_num = 0; } if ($gather_change_num < $Start_at_ch) { $gather_change_num = 0; next; } # Clear the change # undef @change; } elsif ($gather_change_num) { push(@change, $_); $do_change_num = $gather_change_num; } } if ($do_change_num) { &dochange(@change); } # I like closure... # dbmclose MSGS; close CHGS; dbmclose REVMAP; if ($Docheckpointing) { &docheckpoint; } # This is the pre- -s capable version... # keeping it around a few revs for reference. # # # Eat the first line of CHGS; it should be a change number... # # # $_ = <CHGS>; # if (/^# ([0-9]+)$/) # { $change_num = $1; } # else # { die "first input line !~ /^# ([0-9]+)\$/...?"; } # # $n_changes_done = 0; # while (! eof CHGS) # { # # Clear the change # # # undef @change; # # # Gather all the revs for this change... # # # while (<CHGS>) # { # if (/^# ([0-9]+)/) { $change_num = $1; last; } # chop; # push(@change, $_); # } # # # And make it so... # # # &dochange(@change); # $n_changes_done++; # # # Time to checkpoint? # # # if (($CHECKPOINT_INTERVAL > 0) && (($n_changes_done % $CHECKPOINT_INTERVAL) == 0)) # { if ($Docheckpointing) { &docheckpoint; } } # }
# | Change | User | Description | Committed | |
---|---|---|---|---|---|
#57 | 6301 | Richard Geiger |
These changes resulted from a recent customer conversion. A checkpoint, more or less. |
||
#56 | 5712 | Richard Geiger |
Handle Pathhacks in srcdiff & dolabels. Moves sub Pathhacks() into util.pl |
||
#55 | 5707 | Richard Geiger |
Ironport local hacks. Not intended for general consumption! |
||
#54 | 5706 | Richard Geiger | Makes branch specs now. | ||
#53 | 5705 | Richard Geiger |
Fix to integ history generation when USE_IMPORT_DEPOT and Depotmap are used.... |
||
#52 | 5701 | Richard Geiger |
add comment about using the 2002.1 schema if the filetype bits are to be tweakened. |
||
#51 | 5688 | Richard Geiger | consistently invoke perl via PATH | ||
#50 | 5676 | Richard Geiger |
Add $CONVUSER to set owner for label and depot specs create dby the conversion. |
||
#49 | 5672 | Richard Geiger |
dochanges now remembers the list of known depots so dolabels can make explicit global mappings. |
||
#48 | 5668 | Richard Geiger |
REVRECS (mainly). cc: roger@icmanage.com, shiv@icmanage.com |
||
#47 | 5646 | Richard Geiger |
Make sure we have the leading directories if both $CVS_ROOT and $CVS_MODULE are defined. |
||
#46 | 5623 | Richard Geiger | $SPEC_DEPOT feature added. | ||
#45 | 5615 | Richard Geiger | more depot mapping fixes. | ||
#44 | 5611 | Richard Geiger | Fix a broken Depotmap{}. | ||
#43 | 5610 | Richard Geiger |
This just tightens up some pattern matches for Perforce depot-syntax names. Should be no function change, but it's probably safer this way. |
||
#42 | 5597 | Richard Geiger |
Add news USE_IMPORT_DEPOT switch, to allow you to have cvs-import'ed revisions (the "vendor branch") end up in a different depot than locally-authored revisions. This should pretty much complete feature work in 3.0; |
||
#41 | 5583 | Richard Geiger |
Handle "..." in CVS pathnames by changing them to ",,,"s. "Works for me!" |
||
#40 | 5582 | Richard Geiger |
Fixes a problem that prevented the NOKEYEXP_PATHNAME list from working. |
||
#39 | 5571 | Richard Geiger |
Fix the "NOKEYEXP_PATHNAME" mechanism... so that it works :-) |
||
#38 | 5569 | Richard Geiger |
Just a variable name change: NOEXC_PATHNAME in config is now NOKEYEXP_PATHNAME. |
||
#37 | 5555 | Richard Geiger | NOEXC_PATHNAME | ||
#36 | 5542 | Richard Geiger | checkpointing progress. | ||
#35 | 5541 | Richard Geiger | fix a bug where the equivalance of 1.1 and 1.1.1.1 is not recognized. | ||
#34 | 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. |
||
#33 | 5510 | Richard Geiger | Add the $Depotmap{"somecvstopdir"} = "//somep4depot"; facility | ||
#32 | 5509 | Richard Geiger | checkpoint | ||
#31 | 5490 | Richard Geiger | $Depotmap implemented. | ||
#30 | 5442 | Richard Geiger |
A checkpoint commit on the way to a 2.6.0 release with the new IronPort inspired improvements. |
||
#29 | 5437 | Richard Geiger |
just another checkpoint. Passed test/runtest, but still has debugging cruft in. Not fit for release! |
||
#28 | 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! |
||
#27 | 4914 | Richard Geiger | Adds PureRCS switch. | ||
#26 | 4885 | Richard Geiger | Allow using a name other than "main" for the TRUNKLINE branch. | ||
#25 | 4732 | Richard Geiger | Changes to support special characters # @ % * (for release 2.5) | ||
#24 | 4276 | Richard Geiger | fix dochanges so that <test_conv_dir>/depotmap is run correctly. | ||
#23 | 3708 | Richard Geiger | Changes for 2.3.6 | ||
#22 | 3594 | Richard Geiger | Changes for 2.3.5 | ||
#21 | 2061 | Richard Geiger |
changes for 2.3.2: - can adjust db hash bucket size; - Add $DEPOT config variable - Handle labels with '#' or '@' |
||
#20 | 1987 | Richard Geiger | Changes for 2.3.1 | ||
#19 | 1977 | Richard Geiger | Explicit p4d -r | ||
#18 | 1967 | Richard Geiger | Add new config item "DEADSTATE". | ||
#17 | 1965 | Richard Geiger | Fix bug where link was being made if $COPY succeedes. | ||
#16 | 1964 | Richard Geiger | Add $TEXTTYPE and surrounding accoutrements. | ||
#15 | 1781 | Richard Geiger |
This change reintegrates cvs2p4 2.0 developement work (through 2.0b6) back into my mainline development. |
||
#14 | 1637 | Richard Geiger | Was removing "Revmap.db" not "$Revmap.db". | ||
#13 | 1407 | Richard Geiger |
=== Release 1.3.2 - Reduce the memory footprint of bin/genmetadata. Previously, it was holding and sorting a complete copy of the metadata file "in-core" (as well as a copy of all of the RCS revision tags data!). This adds up quick, and some users saw genmetadata gobbling memory voraciously (and in some cases being running out, causing thrashing and/or process termination by the OS). genmetadata now keeps the metadata in a temp file, (sorting it in primary-key-sized chunks), and the revision tag information in a db-backed hash. - Fix the label handling so that _all_ perforce revisions based on the labeled cvs revision are included in the generated labels. Previously, one of the N "correct" Perforce revisions were being tagged (effectively, at random). This stems from the fact that lazy copying and branching are explicit in Perforce, but implicit in CVS. I.e., the "#1" revision in a new Perforce branch _appears_ to be a separate entity (identical to the revision from which it was branched. This means that to use the converted labels, it will be up to _you_ to remember what labels go with what branches: but that's the way it is in CVS, too. - A minor change in revmap to have a meaningful usage message, and properly handle the new rrevmap format. - dochanges correctly deletes revmap database files for either *.db or *.pag/*.dat style databases. |
||
#12 | 1185 | Richard Geiger |
Changes for 1.3 (Labels!) |
||
#11 | 1172 | Richard Geiger | Complete the toleracne of change renumbering. | ||
#10 | 1150 | Richard Geiger |
Allow messages about change renumbering, so cvs2p4 can be used to import to an existing (nonvirginal!) server. Note that I *don't* claim this works completely now, but from my experience at Orca a year ago, this was the only bugaboo that bit. Note also that it's still the user's obligation to insure that there are no pathname overlaps with files that already exist. *That* is guarenteed not to work! |
||
#9 | 791 | Richard Geiger |
Update for a new release; my change-of-venue noted; desensitized to conflicting P4CONFIG. |
||
#8 | 421 | Richard Geiger | Fix to the fix by Thomas Quinot. | ||
#7 | 416 | Richard Geiger | Pull in Thomas Quinot <quinot@inf.enst.fr>'s UTC bugfix, for 1.2.12. | ||
#6 | 250 | Richard Geiger |
Changes to allow coping with shell metacharacters (' ' & '$', at least) in file names. |
||
#5 | 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!). |
||
#4 | 240 | Richard Geiger |
Version 1.2.5, to account for post-1999 RCS behavior. (Courtesy of David Simon, Goldman Sachs) |
||
#3 | 228 | Richard Geiger |
Changes for 1.2.4 - recognize alternative "p4 files" message for files not present in the depot. |
||
#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) |