diff options
| author | Junio C Hamano <gitster@pobox.com> | 2008-04-02 00:22:15 -0700 | 
|---|---|---|
| committer | Junio C Hamano <gitster@pobox.com> | 2008-04-02 00:22:15 -0700 | 
| commit | 22e885e6d89a5aadd9ed2f7f36f5ae83cc77de74 (patch) | |
| tree | e02286103ffb723631f6420a00188c18a7845e6e /git-cvsserver.perl | |
| parent | 860bbd50390956b121f320987c5140b337e1ea3a (diff) | |
| parent | c1bc30614ad0a9b63f4f798f0aa71d376a095938 (diff) | |
| download | git-22e885e6d89a5aadd9ed2f7f36f5ae83cc77de74.tar.gz | |
Merge branch 'dd/cvsserver'
* dd/cvsserver:
  cvsserver: Use the user part of the email in log and annotate results
  cvsserver: Add test for update -p
  cvsserver: Implement update -p (print to stdout)
  cvsserver: Add a few tests for 'status' command
  cvsserver: Do not include status output for subdirectories if -l is passed
  cvsserver: Only print the file part of the filename in status header
  cvsserver: Respond to the 'editors' and 'watchers' commands
Diffstat (limited to 'git-cvsserver.perl')
| -rwxr-xr-x | git-cvsserver.perl | 78 | 
1 files changed, 59 insertions, 19 deletions
diff --git a/git-cvsserver.perl b/git-cvsserver.perl index 7a57177a81..64c255740b 100755 --- a/git-cvsserver.perl +++ b/git-cvsserver.perl @@ -73,8 +73,8 @@ my $methods = {      'status'          => \&req_status,      'admin'           => \&req_CATCHALL,      'history'         => \&req_CATCHALL, -    'watchers'        => \&req_CATCHALL, -    'editors'         => \&req_CATCHALL, +    'watchers'        => \&req_EMPTY, +    'editors'         => \&req_EMPTY,      'annotate'        => \&req_annotate,      'Global_option'   => \&req_Globaloption,      #'annotate'        => \&req_CATCHALL, @@ -199,6 +199,11 @@ sub req_CATCHALL      $log->warn("Unhandled command : req_$cmd : $data");  } +# This method invariably succeeds with an empty response. +sub req_EMPTY +{ +    print "ok\n"; +}  # Root pathname \n  #     Response expected: no. Tell the server which CVSROOT to use. Note that @@ -958,6 +963,17 @@ sub req_update              $meta = $updater->getmeta($filename);          } +        # If -p was given, "print" the contents of the requested revision. +        if ( exists ( $state->{opt}{p} ) ) { +            if ( defined ( $meta->{revision} ) ) { +                $log->info("Printing '$filename' revision " . $meta->{revision}); + +                transmitfile($meta->{filehash}, { print => 1 }); +            } + +            next; +        } +  	if ( ! defined $meta )  	{  	    $meta = { @@ -1091,9 +1107,9 @@ sub req_update              my $file_local = $filepart . ".mine";              system("ln","-s",$state->{entries}{$filename}{modified_filename}, $file_local);              my $file_old = $filepart . "." . $oldmeta->{revision}; -            transmitfile($oldmeta->{filehash}, $file_old); +            transmitfile($oldmeta->{filehash}, { targetfile => $file_old });              my $file_new = $filepart . "." . $meta->{revision}; -            transmitfile($meta->{filehash}, $file_new); +            transmitfile($meta->{filehash}, { targetfile => $file_new });              # we need to merge with the local changes ( M=successful merge, C=conflict merge )              $log->info("Merging $file_local, $file_old, $file_new"); @@ -1423,6 +1439,8 @@ sub req_status      {          $filename = filecleanup($filename); +        next if exists($state->{opt}{l}) && index($filename, '/', length($state->{prependdir})) >= 0; +          my $meta = $updater->getmeta($filename);          my $oldmeta = $meta; @@ -1466,8 +1484,10 @@ sub req_status          $status ||= "Unknown"; +        my ($filepart) = filenamesplit($filename); +          print "M ===================================================================\n"; -        print "M File: $filename\tStatus: $status\n"; +        print "M File: $filepart\tStatus: $status\n";          if ( defined($state->{entries}{$filename}{revision}) )          {              print "M Working revision:\t" . $state->{entries}{$filename}{revision} . "\n"; @@ -1541,14 +1561,14 @@ sub req_diff                  print "E File $filename at revision 1.$revision1 doesn't exist\n";                  next;              } -            transmitfile($meta1->{filehash}, $file1); +            transmitfile($meta1->{filehash}, { targetfile => $file1 });          }          # otherwise we just use the working copy revision          else          {              ( undef, $file1 ) = tempfile( DIR => $TEMP_DIR, OPEN => 0 );              $meta1 = $updater->getmeta($filename, $wrev); -            transmitfile($meta1->{filehash}, $file1); +            transmitfile($meta1->{filehash}, { targetfile => $file1 });          }          # if we have a second -r switch, use it too @@ -1563,7 +1583,7 @@ sub req_diff                  next;              } -            transmitfile($meta2->{filehash}, $file2); +            transmitfile($meta2->{filehash}, { targetfile => $file2 });          }          # otherwise we just use the working copy          else @@ -1576,7 +1596,7 @@ sub req_diff          {              ( undef, $file2 ) = tempfile( DIR => $TEMP_DIR, OPEN => 0 );              $meta2 = $updater->getmeta($filename, $wrev); -            transmitfile($meta2->{filehash}, $file2); +            transmitfile($meta2->{filehash}, { targetfile => $file2 });          }          # We need to have retrieved something useful @@ -1708,8 +1728,7 @@ sub req_log              print "M revision 1.$revision->{revision}\n";              # reformat the date for log output              $revision->{modified} = sprintf('%04d/%02d/%02d %s', $3, $DATE_LIST->{$2}, $1, $4 ) if ( $revision->{modified} =~ /(\d+)\s+(\w+)\s+(\d+)\s+(\S+)/ and defined($DATE_LIST->{$2}) ); -            $revision->{author} =~ s/\s+.*//; -            $revision->{author} =~ s/^(.{8}).*/$1/; +            $revision->{author} = cvs_author($revision->{author});              print "M date: $revision->{modified};  author: $revision->{author};  state: " . ( $revision->{filehash} eq "deleted" ? "dead" : "Exp" ) . ";  lines: +2 -3\n";              my $commitmessage = $updater->commitmessage($revision->{commithash});              $commitmessage =~ s/^/M /mg; @@ -1824,8 +1843,7 @@ sub req_annotate                  unless ( defined ( $metadata->{$commithash} ) )                  {                      $metadata->{$commithash} = $updater->getmeta($filename, $commithash); -                    $metadata->{$commithash}{author} =~ s/\s+.*//; -                    $metadata->{$commithash}{author} =~ s/^(.{8}).*/$1/; +                    $metadata->{$commithash}{author} = cvs_author($metadata->{$commithash}{author});                      $metadata->{$commithash}{modified} = sprintf("%02d-%s-%02d", $1, $2, $3) if ( $metadata->{$commithash}{modified} =~ /^(\d+)\s(\w+)\s\d\d(\d\d)/ );                  }                  printf("M 1.%-5d      (%-8s %10s): %s\n", @@ -2005,14 +2023,17 @@ sub revparse      return undef;  } -# This method takes a file hash and does a CVS "file transfer" which transmits the -# size of the file, and then the file contents. -# If a second argument $targetfile is given, the file is instead written out to -# a file by the name of $targetfile +# This method takes a file hash and does a CVS "file transfer".  Its +# exact behaviour depends on a second, optional hash table argument: +# - If $options->{targetfile}, dump the contents to that file; +# - If $options->{print}, use M/MT to transmit the contents one line +#   at a time; +# - Otherwise, transmit the size of the file, followed by the file +#   contents.  sub transmitfile  {      my $filehash = shift; -    my $targetfile = shift; +    my $options = shift;      if ( defined ( $filehash ) and $filehash eq "deleted" )      { @@ -2034,11 +2055,20 @@ sub transmitfile      if ( open my $fh, '-|', "git-cat-file", "blob", $filehash )      { -        if ( defined ( $targetfile ) ) +        if ( defined ( $options->{targetfile} ) )          { +            my $targetfile = $options->{targetfile};              open NEWFILE, ">", $targetfile or die("Couldn't open '$targetfile' for writing : $!");              print NEWFILE $_ while ( <$fh> );              close NEWFILE or die("Failed to write '$targetfile': $!"); +        } elsif ( defined ( $options->{print} ) && $options->{print} ) { +            while ( <$fh> ) { +                if( /\n\z/ ) { +                    print 'M ', $_; +                } else { +                    print 'MT text ', $_, "\n"; +                } +            }          } else {              print "$size\n";              print while ( <$fh> ); @@ -2107,6 +2137,16 @@ sub kopts_from_path      }  } +# Generate a CVS author name from Git author information, by taking +# the first eight characters of the user part of the email address. +sub cvs_author +{ +    my $author_line = shift; +    (my $author) = $author_line =~ /<([^>@]{1,8})/; + +    $author; +} +  package GITCVS::log;  ####  | 
