Code

Merge branch 'gr/cvsimport-alternative-cvspass-location' into maint
authorJunio C Hamano <gitster@pobox.com>
Fri, 13 May 2011 17:44:54 +0000 (10:44 -0700)
committerJunio C Hamano <gitster@pobox.com>
Fri, 13 May 2011 17:44:54 +0000 (10:44 -0700)
* gr/cvsimport-alternative-cvspass-location:
  Look for password in both CVS and CVSNT password files.

1  2 
git-cvsimport.perl

diff --combined git-cvsimport.perl
index bbf327f3e891cacdd14c0b18b51702ce14b2b6df,5c012a35d20f6925564caea2ecf3179c5b204035..8d41610bcf260545bcc5b6a8c30b43d427c70491
@@@ -227,6 -227,31 +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'};
                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);
        $self->{'socketo'}->write("valid-requests\n");
        $self->{'socketo'}->flush();
  
 -      chomp(my $rep=$self->readline());
 +      my $rep=$self->readline();
 +      die "Failed to read from server" unless defined $rep;
 +      chomp($rep);
        if ($rep !~ s/^Valid-requests\s*//) {
                $rep="<unknown>" unless $rep;
                die "Expected Valid-requests from server, but got: $rep\n";