Merge branch 'jc/maint-mailinfo-mime-attr'
[gitweb.git] / git-cvsimport.perl
index bbf327f3e891cacdd14c0b18b51702ce14b2b6df..8032f23202ff9a1e8e0fd2a6745021fb8f1fcf71 100755 (executable)
@@ -227,6 +227,31 @@ sub new {
        return $self;
 }
 
+sub find_password_entry {
+       my ($cvspass, @cvsroot) = @_;
+       my ($file, $delim) = @$cvspass;
+       my $pass;
+       local ($_);
+
+       if (open(my $fh, $file)) {
+               # :pserver:cvs@mea.tmt.tele.fi:/cvsroot/zmailer Ah<Z
+               CVSPASSFILE:
+               while (<$fh>) {
+                       chomp;
+                       s/^\/\d+\s+//;
+                       my ($w, $p) = split($delim,$_,2);
+                       for my $cvsroot (@cvsroot) {
+                               if ($w eq $cvsroot) {
+                                       $pass = $p;
+                                       last CVSPASSFILE;
+                               }
+                       }
+               }
+               close($fh);
+       }
+       return $pass;
+}
+
 sub conn {
        my $self = shift;
        my $repo = $self->{'fullrep'};
@@ -259,19 +284,23 @@ sub conn {
                if ($pass) {
                        $pass = $self->_scramble($pass);
                } else {
-                       open(H,$ENV{'HOME'}."/.cvspass") and do {
-                               # :pserver:cvs@mea.tmt.tele.fi:/cvsroot/zmailer Ah<Z
-                               while (<H>) {
-                                       chomp;
-                                       s/^\/\d+\s+//;
-                                       my ($w,$p) = split(/\s/,$_,2);
-                                       if ($w eq $rr or $w eq $rr2) {
-                                               $pass = $p;
-                                               last;
-                                       }
+                       my @cvspass = ([$ENV{'HOME'}."/.cvspass", qr/\s/],
+                                      [$ENV{'HOME'}."/.cvs/cvspass", qr/=/]);
+                       my @loc = ();
+                       foreach my $cvspass (@cvspass) {
+                               my $p = find_password_entry($cvspass, $rr, $rr2);
+                               if ($p) {
+                                       push @loc, $cvspass->[0];
+                                       $pass = $p;
                                }
-                       };
-                       $pass = "A" unless $pass;
+                       }
+
+                       if (1 < @loc) {
+                               die("Multiple cvs password files have ".
+                                   "entries for CVSROOT $opt_d: @loc");
+                       } elsif (!$pass) {
+                               $pass = "A";
+                       }
                }
 
                my ($s, $rep);
@@ -860,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;
        }