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#14 $ # # Richard Geiger # require 5.000; use Cwd; use File::Basename; use bytes; use Carp; # ...or flounder. (This will fail unless 'perl' is a perl5!) $| = 1; ($Myname = $0) =~ s%^.*/%%; $Mydir = dirname($0); $Here = getcwd(); if ($Mydir ne ".") { chdir "$Mydir" || die "$Myname: can't chdir \"$Mydir\": $!"; } chdir ".." || die "$Myname: can't chdir \"..\": $!"; $Mydir = getcwd(); 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; } sub mklabel { my ($label, @Revs) = @_; print "make label: $label\n"; $label = &atq($label); my $time = time; print DBLBLS "\@pv\@ 2 \@db.domain\@ $label 108 \@\@ \@\@ ". "\@cvs2p4\@ $time $time 8 0 \@Created by cvs2p4.\@\n"; foreach my $rev (@Revs) { my ($f, $r) = ($rev =~ /^(.*)#(\d+)$/); $f = &p4_esc($f); $f = &atq($f); print DBLBLS "\@pv\@ 0 \@db.label\@ $label $f $r\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; } push(@Args, $ARGV[0]); shift; } if ($#Args ne 0) { &usage; } $Convdir = $Args[0]; #chdir $Convdir || die "$Myname: can't chdir \"$Convdir\": $!"; #$Convdir = getcwd(); #chdir $Here || die "$Myname: can't chdir \"$Here\": $!"; require "$Convdir/config"; $Metadata = "$Convdir/metadata"; $Labels = "$Convdir/labels"; $Rrevmap = "$Convdir/rrevmap"; $DBlbls = "$P4ROOT/dblbls"; $Checkpoint = "checkpoint"; # 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; } $P4 = "$P4 -p $P4PORT -c cvs2p4 -u $P4USER"; use DB_File; $DBMCLASS="DB_File"; $myhashinfo = new DB_File::HASHINFO; $myhashinfo->{bsize} = 4096; if (! tie(%RREVMAP, $DBMCLASS, $Rrevmap, O_RDONLY, 0444, $myhashinfo)) { print "$Myname: can't tie \"$Rrevmap\": $!\n"; exit 1; } if (! open(LABELS, "<$Labels")) { print "$Myname: can't open \">$Labels\": $!\n"; exit 1; } # Open the db metadata (journal format) file we will write # if (! open(DBLBLS, ">$DBlbls")) { print "$Myname: can't open \"$DBlbls\": $!\n"; exit 1; } ################################################################################ # # branch_for_tag() # # Due to differences in the way Perforce and RCS/CVS work, Perforce # cannot know, by looking at the RCS archive alone, which branch(s) a # given label applies to. The default, in essence, is to make tags # for ALL branches to which it _could_ apply. This results in huge # numbers of often useless labels, and long "dolabels" phases. # # Often, however, the day can be saved, IF the user can provide a # mapping function that can take a label name and map it to a branch # name, along with a function that can take a Perforce revision # (pathname and revision number), and a branch name, and return an # indication of whether the revision given is in fact on the branch # given. (The latter function is usually trivially easy). # # If you want to use this feature, you will need to uncomment and # modify the following two functions to match your data. # # The first takes an RCS revision tag, and returns the name of the # branch that the revision is associated with: # #sub branch_for_tag #{ # my ($tag) = @_; # # # These are a couple of example mappings, in this case based # # on the format of the tag names themselves (but your function # # is free to use any method you can devise): # # # # if ($tag =~ /^v(\d+)_(\d+)_([dab])_(\d)+$/) { return "main"; } # # if ($tag =~ /^(branch_.*)_\d\d\d$/) { return $1; } # # # ADD YOUR CODE HERE # # # Sorry, can't map this one I guess. # # # return ""; #} # The second function you need to pay attention to is rev_on_branch(). # # Usually, this will be just as shown here, where it involves # comparing a component of the revision's pathname (i.e., the # "branch-level directory" in Perforce, with the given $tag_branch. # The result of the comparison is the result of the function. # # If your conversion uses the default arrangement in the cvs2p4 # config file, so that the third pathname component is the branch # name, e.g., # # //depot/<module>/<branch>/... # # you won't need to change this at all: # #sub rev_on_branch #{ # my ($rev, $tag_branch) = @_; # my ($branch) = ($rev =~ /^\/\/depot\/[^\/]+\/([^\/]+)\//); # return ($branch eq $tag_branch); #} # # End of branch_for_tag() stuff... # ################################################################################ @Revs = (); while (<LABELS>) { if (/^([^\s]+)/) { if ($#Revs >= 0) { &mklabel($label, @Revs); } $label = $1; @Revs = (); } elsif (/^ (.*)/) { $tag = $1; if ($revs = $RREVMAP{$tag}) { # GOAL: determine the branch this tag is for # (which is encoded in the tag name), # and only do the push for the revision # in $revs that is on the branch it belongs # to.... # if (defined(&branch_for_tag)) { $tag_branch = &branch_for_tag($label); if (! $tag_branch) { next; } } foreach $rev (split(/\001/, $revs)) { if ((! defined(&branch_for_tag)) || &rev_on_branch($rev, $tag_branch)) { push (@Revs, $rev); } } } } } if ($#Revs >= 0) { &mklabel($label, @Revs); } close DBLBLS; close LABELS; untie %RREVMAP; $DBlbls =~ s%^.*/%%; $P4D = "$P4D -r ."; chdir($P4ROOT) || die("unable to chdir to $P4ROOT: $!"); if (oscall("$P4D -jr $DBlbls")) { print "$Myname: \"$P4D -jr $DBlbls\" failed.\n"; exit 1; } rmfiles($Checkpoint); if (oscall("$P4D -jd $Checkpoint")) { print "$Myname: \"$P4D -jd $Checkpoint\" failed.\n"; exit 1; } exit 0;
# | Change | User | Description | Committed | |
---|---|---|---|---|---|
#2 | 5205 | Jeffery G. Smith | First pass at Windows support. | ||
#1 | 5204 | Jeffery G. Smith | Create personal development branch. | ||
//guest/perforce_software/utils/cvs2p4/bin/dolabels | |||||
#9 | 5145 | Richard Geiger | Publish 2.5.5 | ||
#8 | 4354 | Richard Geiger | Integrate 2.4 changes. | ||
#7 | 3711 | Richard Geiger | release 2.3.7 | ||
#6 | 2063 | rmg | Publish 2.3.2 | ||
#5 | 1989 | Richard Geiger | Public 2.3.1 | ||
#4 | 1786 | rmg | Publish 2.0 | ||
#3 | 1410 | rmg | Publish 1.3.2 | ||
#2 | 1205 | Richard Geiger | Publish 1.3.1 | ||
#1 | 1187 | Richard Geiger |
1.3. Mainly, support for labels! |
||
//guest/richard_geiger/utils/cvs2p4/bin/dolabels | |||||
#1 | 1185 | Richard Geiger |
Changes for 1.3 (Labels!) |