summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLibravatar Junio C Hamano <gitster@pobox.com>2012-09-12 14:21:50 -0700
committerLibravatar Junio C Hamano <gitster@pobox.com>2012-09-12 14:21:50 -0700
commitf4e964481a053e780050e683927a6b4d8dd309eb (patch)
tree9709e4fcde7e8438e58d204a0d137717a5273d37
parentMerge branch 'js/compat-itimer' (diff)
parentcvsimport: strip all inappropriate tag strings (diff)
downloadtgif-f4e964481a053e780050e683927a6b4d8dd309eb.tar.xz
Merge branch 'kd/cvsimport-avoid-invalid-tag'
"cvsimport" tried to create a tag taken from CVS without sufficiently sanitizing it, causing the import to fail when an invalid character in the tagname made underlying "git tag" to fail. * kd/cvsimport-avoid-invalid-tag: cvsimport: strip all inappropriate tag strings
-rwxr-xr-xgit-cvsimport.perl33
1 files changed, 30 insertions, 3 deletions
diff --git a/git-cvsimport.perl b/git-cvsimport.perl
index 8d41610bcf..8032f23202 100755
--- a/git-cvsimport.perl
+++ b/git-cvsimport.perl
@@ -889,10 +889,37 @@ sub commit {
$xtag =~ s/\s+\*\*.*$//; # Remove stuff like ** INVALID ** and ** FUNKY **
$xtag =~ tr/_/\./ if ( $opt_u );
$xtag =~ s/[\/]/$opt_s/g;
- $xtag =~ s/\[//g;
- system('git' , 'tag', '-f', $xtag, $cid) == 0
- or die "Cannot create tag $xtag: $!\n";
+ # See refs.c for these rules.
+ # Tag cannot contain bad chars. (See bad_ref_char in refs.c.)
+ $xtag =~ s/[ ~\^:\\\*\?\[]//g;
+ # Other bad strings for tags:
+ # (See check_refname_component in refs.c.)
+ 1 while $xtag =~ s/
+ (?: \.\. # Tag cannot contain '..'.
+ | \@{ # Tag cannot contain '@{'.
+ | ^ - # Tag cannot begin with '-'.
+ | \.lock $ # Tag cannot end with '.lock'.
+ | ^ \. # Tag cannot begin...
+ | \. $ # ...or end with '.'
+ )//xg;
+ # Tag cannot be empty.
+ if ($xtag eq '') {
+ warn("warning: ignoring tag '$tag'",
+ " with invalid tagname\n");
+ return;
+ }
+
+ if (system('git' , 'tag', '-f', $xtag, $cid) != 0) {
+ # We did our best to sanitize the tag, but still failed
+ # for whatever reason. Bail out, and give the user
+ # enough information to understand if/how we should
+ # improve the translation in the future.
+ if ($tag ne $xtag) {
+ print "Translated '$tag' tag to '$xtag'\n";
+ }
+ die "Cannot create tag $xtag: $!\n";
+ }
print "Created tag '$xtag' on '$branch'\n" if $opt_v;
}