[PATCH] git-cvsimport-script: handling of tags
authorH. Peter Anvin <hpa@zytor.com>
Tue, 6 Sep 2005 17:36:01 +0000 (10:36 -0700)
committerJunio C Hamano <junkio@cox.net>
Tue, 6 Sep 2005 18:57:37 +0000 (11:57 -0700)
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>
Documentation/git-cvsimport-script.txt
git-cvsimport-script
index d01a15d8a3a60b58aaa5d084b07bfe5809956e54..9d8acfcb130324e5a4a31a54585a92b194107c9c 100644 (file)
@@ -44,6 +44,9 @@ OPTIONS
        to avoid noisy changesets. Highly recommended, but off by default
        to preserve compatibility with early imported trees. 
 
        to avoid noisy changesets. Highly recommended, but off by default
        to preserve compatibility with early imported trees. 
 
+-u::
+       Convert underscores in tag and branch names to dots.
+
 -o <branch-for-HEAD>::
        The 'HEAD' branch from CVS is imported to the 'origin' branch within
        the git repository, as 'HEAD' already has a special meaning for git.
 -o <branch-for-HEAD>::
        The 'HEAD' branch from CVS is imported to the 'origin' branch within
        the git repository, as 'HEAD' already has a special meaning for git.
index e3a8e584a562e8e50c5d7316acc653babafcd8ba..5079c7931224f220eb4d4a327bd28dfba495c232 100755 (executable)
@@ -24,23 +24,24 @@ use Time::Local;
 use IO::Socket;
 use IO::Pipe;
 use POSIX qw(strftime dup2);
 use IO::Socket;
 use IO::Pipe;
 use POSIX qw(strftime dup2);
+use IPC::Open2;
 
 $SIG{'PIPE'}="IGNORE";
 $ENV{'TZ'}="UTC";
 
 
 $SIG{'PIPE'}="IGNORE";
 $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() {
        print STDERR <<END;
 Usage: ${\basename $0}     # fetch/update GIT from CVS
 
 sub usage() {
        print STDERR <<END;
 Usage: ${\basename $0}     # fetch/update GIT from CVS
-       [ -o branch-for-HEAD ] [ -h ] [ -v ] [ -d CVSROOT ]
-       [ -p opts-for-cvsps ] [ -C GIT_repository ] [ -z fuzz ]
-       [ -i ] [ -k ] [-s subst] [ -m ] [ -M regex] [ CVS_module ]
+       [-o branch-for-HEAD] [-h] [-v] [-d CVSROOT]
+       [-p opts-for-cvsps] [-C GIT_repository] [-z fuzz]
+       [-i] [-k] [-u] [-s subst] [-m] [-M regex] [CVS_module]
 END
        exit(1);
 }
 
 END
        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;
 
 @ARGV <= 1 or usage();
 usage if $opt_h;
 
 @ARGV <= 1 or usage();
@@ -628,13 +629,37 @@ my $commit = sub {
                or die "Cannot write branch $branch for update: $!\n";
 
        if($tag) {
                or die "Cannot write branch $branch for update: $!\n";
 
        if($tag) {
-               open(C,">$git_dir/refs/tags/$tag")
-                       or die "Cannot create tag $tag: $!\n";
-               print C "$cid\n"
-                       or die "Cannot write tag $branch: $!\n";
+               my($in, $out) = ('','');
+               my($xtag) = $tag;
+               $xtag =~ s/\s+\*\*.*$//; # Remove stuff like ** INVALID ** and ** FUNKY **
+               $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";
-               print "Created tag '$tag' on '$branch'\n" if $opt_v;
+                       or die "Cannot write tag $xtag: $!\n";
+
+               print "Created tag '$xtag' on '$branch'\n" if $opt_v;
        }
 };
 
        }
 };