Merge branch 'maint'
authorJunio C Hamano <junkio@cox.net>
Sun, 12 Nov 2006 02:30:31 +0000 (18:30 -0800)
committerJunio C Hamano <junkio@cox.net>
Sun, 12 Nov 2006 02:30:31 +0000 (18:30 -0800)
* maint:
git-cvsserver: read from git with -z to get non-ASCII pathnames.

1  2 
git-cvsserver.perl
diff --combined git-cvsserver.perl
index 8817f8bb4f7c6b69d186c70d83cfb49b1fcea80e,053d0d9cada27d5e3699233fc9fc23eaa9f83a15..ca519b7e49a0b2cc5104f71459fe621041382f19
@@@ -2118,17 -2118,9 +2118,17 @@@ sub ne
                  mode       TEXT NOT NULL
              )
          ");
 +        $self->{dbh}->do("
 +            CREATE INDEX revision_ix1
 +            ON revision (name,revision)
 +        ");
 +        $self->{dbh}->do("
 +            CREATE INDEX revision_ix2
 +            ON revision (name,commithash)
 +        ");
      }
  
 -    # Construct the revision table if required
 +    # Construct the head table if required
      unless ( $self->{tables}{head} )
      {
          $self->{dbh}->do("
                  mode       TEXT NOT NULL
              )
          ");
 +        $self->{dbh}->do("
 +            CREATE INDEX head_ix1
 +            ON head (name)
 +        ");
      }
  
      # Construct the properties table if required
@@@ -2343,67 -2331,72 +2343,72 @@@ sub updat
  
          if ( defined ( $lastpicked ) )
          {
-             my $filepipe = open(FILELIST, '-|', 'git-diff-tree', '-r', $lastpicked, $commit->{hash}) or die("Cannot call git-diff-tree : $!");
+             my $filepipe = open(FILELIST, '-|', 'git-diff-tree', '-z', '-r', $lastpicked, $commit->{hash}) or die("Cannot call git-diff-tree : $!");
+           local ($/) = "\0";
              while ( <FILELIST> )
              {
-                 unless ( /^:\d{6}\s+\d{3}(\d)\d{2}\s+[a-zA-Z0-9]{40}\s+([a-zA-Z0-9]{40})\s+(\w)\s+(.*)$/o )
+               chomp;
+                 unless ( /^:\d{6}\s+\d{3}(\d)\d{2}\s+[a-zA-Z0-9]{40}\s+([a-zA-Z0-9]{40})\s+(\w)$/o )
                  {
                      die("Couldn't process git-diff-tree line : $_");
                  }
+               my ($mode, $hash, $change) = ($1, $2, $3);
+               my $name = <FILELIST>;
+               chomp($name);
  
-                 # $log->debug("File mode=$1, hash=$2, change=$3, name=$4");
+                 # $log->debug("File mode=$mode, hash=$hash, change=$change, name=$name");
  
                  my $git_perms = "";
-                 $git_perms .= "r" if ( $1 & 4 );
-                 $git_perms .= "w" if ( $1 & 2 );
-                 $git_perms .= "x" if ( $1 & 1 );
+                 $git_perms .= "r" if ( $mode & 4 );
+                 $git_perms .= "w" if ( $mode & 2 );
+                 $git_perms .= "x" if ( $mode & 1 );
                  $git_perms = "rw" if ( $git_perms eq "" );
  
-                 if ( $3 eq "D" )
+                 if ( $change eq "D" )
                  {
-                     #$log->debug("DELETE   $4");
-                     $head->{$4} = {
-                         name => $4,
-                         revision => $head->{$4}{revision} + 1,
+                     #$log->debug("DELETE   $name");
+                     $head->{$name} = {
+                         name => $name,
+                         revision => $head->{$name}{revision} + 1,
                          filehash => "deleted",
                          commithash => $commit->{hash},
                          modified => $commit->{date},
                          author => $commit->{author},
                          mode => $git_perms,
                      };
-                     $self->insert_rev($4, $head->{$4}{revision}, $2, $commit->{hash}, $commit->{date}, $commit->{author}, $git_perms);
+                     $self->insert_rev($name, $head->{$name}{revision}, $hash, $commit->{hash}, $commit->{date}, $commit->{author}, $git_perms);
                  }
-                 elsif ( $3 eq "M" )
+                 elsif ( $change eq "M" )
                  {
-                     #$log->debug("MODIFIED $4");
-                     $head->{$4} = {
-                         name => $4,
-                         revision => $head->{$4}{revision} + 1,
-                         filehash => $2,
+                     #$log->debug("MODIFIED $name");
+                     $head->{$name} = {
+                         name => $name,
+                         revision => $head->{$name}{revision} + 1,
+                         filehash => $hash,
                          commithash => $commit->{hash},
                          modified => $commit->{date},
                          author => $commit->{author},
                          mode => $git_perms,
                      };
-                     $self->insert_rev($4, $head->{$4}{revision}, $2, $commit->{hash}, $commit->{date}, $commit->{author}, $git_perms);
+                     $self->insert_rev($name, $head->{$name}{revision}, $hash, $commit->{hash}, $commit->{date}, $commit->{author}, $git_perms);
                  }
-                 elsif ( $3 eq "A" )
+                 elsif ( $change eq "A" )
                  {
-                     #$log->debug("ADDED    $4");
-                     $head->{$4} = {
-                         name => $4,
+                     #$log->debug("ADDED    $name");
+                     $head->{$name} = {
+                         name => $name,
                          revision => 1,
-                         filehash => $2,
+                         filehash => $hash,
                          commithash => $commit->{hash},
                          modified => $commit->{date},
                          author => $commit->{author},
                          mode => $git_perms,
                      };
-                     $self->insert_rev($4, $head->{$4}{revision}, $2, $commit->{hash}, $commit->{date}, $commit->{author}, $git_perms);
+                     $self->insert_rev($name, $head->{$name}{revision}, $hash, $commit->{hash}, $commit->{date}, $commit->{author}, $git_perms);
                  }
                  else
                  {
-                     $log->warn("UNKNOWN FILE CHANGE mode=$1, hash=$2, change=$3, name=$4");
+                     $log->warn("UNKNOWN FILE CHANGE mode=$mode, hash=$hash, change=$change, name=$name");
                      die;
                  }
              }
              # this is used to detect files removed from the repo
              my $seen_files = {};
  
-             my $filepipe = open(FILELIST, '-|', 'git-ls-tree', '-r', $commit->{hash}) or die("Cannot call git-ls-tree : $!");
+             my $filepipe = open(FILELIST, '-|', 'git-ls-tree', '-z', '-r', $commit->{hash}) or die("Cannot call git-ls-tree : $!");
+           local $/ = "\0";
              while ( <FILELIST> )
              {
-                 unless ( /^(\d+)\s+(\w+)\s+([a-zA-Z0-9]+)\s+(.*)$/o )
+               chomp;
+                 unless ( /^(\d+)\s+(\w+)\s+([a-zA-Z0-9]+)\t(.*)$/o )
                  {
                      die("Couldn't process git-ls-tree line : $_");
                  }