[PATCH] git-cvsimport-script: handling of tags

This patch changes git-cvsimport-script so that it creates tag objects
instead of refs to commits, and adds an option, -u, to convert
underscores in branch and tag names to dots (since CVS doesn't allow
dots in branches and tags.)

Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
H. Peter Anvin 2005-09-06 10:36:01 -07:00 committed by Junio C Hamano
parent 89580e3f6d
commit 0d821d4dab
2 changed files with 39 additions and 11 deletions

View File

@ -44,6 +44,9 @@ OPTIONS
to avoid noisy changesets. Highly recommended, but off by default to avoid noisy changesets. Highly recommended, but off by default
to preserve compatibility with early imported trees. to preserve compatibility with early imported trees.
-u::
Convert underscores in tag and branch names to dots.
-o <branch-for-HEAD>:: -o <branch-for-HEAD>::
The 'HEAD' branch from CVS is imported to the 'origin' branch within The 'HEAD' branch from CVS is imported to the 'origin' branch within
the git repository, as 'HEAD' already has a special meaning for git. the git repository, as 'HEAD' already has a special meaning for git.

View File

@ -24,23 +24,24 @@ use Time::Local;
use IO::Socket; use IO::Socket;
use IO::Pipe; use IO::Pipe;
use POSIX qw(strftime dup2); use POSIX qw(strftime dup2);
use IPC::Open2;
$SIG{'PIPE'}="IGNORE"; $SIG{'PIPE'}="IGNORE";
$ENV{'TZ'}="UTC"; $ENV{'TZ'}="UTC";
our($opt_h,$opt_o,$opt_v,$opt_k,$opt_d,$opt_p,$opt_C,$opt_z,$opt_i,$opt_s,$opt_m,$opt_M); our($opt_h,$opt_o,$opt_v,$opt_k,$opt_u,$opt_d,$opt_p,$opt_C,$opt_z,$opt_i,$opt_s,$opt_m,$opt_M);
sub usage() { sub usage() {
print STDERR <<END; print STDERR <<END;
Usage: ${\basename $0} # fetch/update GIT from CVS Usage: ${\basename $0} # fetch/update GIT from CVS
[ -o branch-for-HEAD ] [ -h ] [ -v ] [ -d CVSROOT ] [-o branch-for-HEAD] [-h] [-v] [-d CVSROOT]
[ -p opts-for-cvsps ] [ -C GIT_repository ] [ -z fuzz ] [-p opts-for-cvsps] [-C GIT_repository] [-z fuzz]
[ -i ] [ -k ] [-s subst] [ -m ] [ -M regex] [ CVS_module ] [-i] [-k] [-u] [-s subst] [-m] [-M regex] [CVS_module]
END END
exit(1); exit(1);
} }
getopts("hivmko:d:p:C:z:s:M:") or usage(); getopts("hivmkuo:d:p:C:z:s:M:") or usage();
usage if $opt_h; usage if $opt_h;
@ARGV <= 1 or usage(); @ARGV <= 1 or usage();
@ -628,13 +629,37 @@ my $commit = sub {
or die "Cannot write branch $branch for update: $!\n"; or die "Cannot write branch $branch for update: $!\n";
if($tag) { if($tag) {
open(C,">$git_dir/refs/tags/$tag") my($in, $out) = ('','');
or die "Cannot create tag $tag: $!\n"; my($xtag) = $tag;
print C "$cid\n" $xtag =~ s/\s+\*\*.*$//; # Remove stuff like ** INVALID ** and ** FUNKY **
or die "Cannot write tag $branch: $!\n"; $xtag =~ tr/_/\./ if ( $opt_u );
my $pid = open2($in, $out, 'git-mktag');
print $out "object $cid\n".
"type commit\n".
"tag $xtag\n".
"tagger $author <$author>\n"
or die "Cannot create tag object $xtag: $!\n";
close($out)
or die "Cannot create tag object $xtag: $!\n";
my $tagobj = <$in>;
chomp $tagobj;
if ( !close($in) or waitpid($pid, 0) != $pid or
$? != 0 or $tagobj !~ /^[0123456789abcdef]{40}$/ ) {
die "Cannot create tag object $xtag: $!\n";
}
open(C,">$git_dir/refs/tags/$xtag")
or die "Cannot create tag $xtag: $!\n";
print C "$tagobj\n"
or die "Cannot write tag $xtag: $!\n";
close(C) close(C)
or die "Cannot write tag $branch: $!\n"; or die "Cannot write tag $xtag: $!\n";
print "Created tag '$tag' on '$branch'\n" if $opt_v;
print "Created tag '$xtag' on '$branch'\n" if $opt_v;
} }
}; };