私は自分のcgit configでそれを正確に行いました。
# CGit on @PORT_HTTP_CGIT@
Listen @PORT_HTTP_CGIT@
<VirtualHost @FQN@:@PORT_HTTP_CGIT@>
ServerName @FQN@
ServerAlias @HOSTNAME@
SetEnv GIT_HTTP_BACKEND "@H@/usr/local/apps/git/libexec/git-core/git-http-backend"
DocumentRoot @H@/cgit
Alias /cgit @H@/cgit
<Directory @H@/cgit>
SetEnv GIT_PROJECT_ROOT=@H@/repositories
AddHandler cgi-script .cgi .pl
DirectoryIndex cgit.pl
(@xx@ は、値のテンプレート プレースホルダーです)
アイデアは、カスタム スクリプト(ここでは perl スクリプトですが、必要な他のスクリプト言語を使用できます) でラップすることです。これにより、次のことが可能になります。cgit.cgi
cgit.pl
- コールギトライト
- gitolite によって許可されたもののみを表示する
cgit.pl
ここで完全なスクリプトを見ることができます。
これは、特定のレポにアクセスしようとしている場合です。
if ($request_uri ne "/cgit/" && $request_uri ne "/cgit/cgit.pl/") {
(my $repo)=($path_info =~ /\/([^\/]+)/);
my $perm = "R";
if ($repo ne "") {
my $aperm = access( $repo, $user, 'R', 'any' );
# my ($aperm, $creator) = &repo_rights($repo);
$perm=$aperm;
}
if ($perm !~ /DENIED/) {
system("@H@/cgit/cgit.cgi");
}
}
これは、レポなしで cgit を呼び出している場合です。表示を許可されているレポのみをリストする必要があります。
そのためには、ネイティブを呼び出してcgit.cgi
から出力をフィルタリングし、「拒否された」レポに対応する行を削除します。
my $fname="$user.".timestamp().".tpl";
system("@H@/cgit/cgit.cgi > $fname");
open(INFO, $fname); # Open the file
@lines = <INFO>; # Read it into an array
close(INFO);
unlink($fname);
pop(@lines);
foreach (@lines) {
my $line=$_;
(my $repo)=($line =~ /title='([^']+)'/); #'
my $perm = "R";
if ($repo ne "") {
my $aperm = access( $repo, $user, 'R', 'any' );
# my ($aperm, $creator) = &repo_rights($repo);
$perm=$aperm;
}
if ($perm !~ /DENIED/) {
print $line;
}
}