(perltidy)
This commit is contained in:
parent
2cb7d8313e
commit
1c15b4cc2d
|
@ -3,6 +3,7 @@ use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
|
|
||||||
my $tid;
|
my $tid;
|
||||||
|
|
||||||
BEGIN {
|
BEGIN {
|
||||||
$tid = $ENV{GL_TID} || 0;
|
$tid = $ENV{GL_TID} || 0;
|
||||||
delete $ENV{GL_TID};
|
delete $ENV{GL_TID};
|
||||||
|
@ -33,15 +34,15 @@ usage() if not @ARGV or $ARGV[0] eq '-h';
|
||||||
|
|
||||||
_die "HOSTNAME not set" if not $rc{HOSTNAME};
|
_die "HOSTNAME not set" if not $rc{HOSTNAME};
|
||||||
|
|
||||||
my ($cmd, $host, $repo) = @ARGV;
|
my ( $cmd, $host, $repo ) = @ARGV;
|
||||||
usage() if not $repo;
|
usage() if not $repo;
|
||||||
|
|
||||||
if ($cmd eq 'push') {
|
if ( $cmd eq 'push' ) {
|
||||||
valid_slave($host, $repo) if exists $ENV{GL_USER};
|
valid_slave( $host, $repo ) if exists $ENV{GL_USER};
|
||||||
# will die if host not in slaves for repo
|
# will die if host not in slaves for repo
|
||||||
|
|
||||||
trace(1, "TID=$tid host=$host repo=$repo", "gitolite mirror push started");
|
trace( 1, "TID=$tid host=$host repo=$repo", "gitolite mirror push started" );
|
||||||
_chdir($rc{GL_REPO_BASE});
|
_chdir( $rc{GL_REPO_BASE} );
|
||||||
_chdir("$repo.git");
|
_chdir("$repo.git");
|
||||||
|
|
||||||
my $errors = 0;
|
my $errors = 0;
|
||||||
|
@ -50,19 +51,19 @@ if ($cmd eq 'push') {
|
||||||
chomp;
|
chomp;
|
||||||
if (/FATAL/) {
|
if (/FATAL/) {
|
||||||
$errors++;
|
$errors++;
|
||||||
gl_log('mirror', $_);
|
gl_log( 'mirror', $_ );
|
||||||
} else {
|
} else {
|
||||||
trace(1, "mirror: $_");
|
trace( 1, "mirror: $_" );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
exit $errors;
|
exit $errors;
|
||||||
}
|
}
|
||||||
|
|
||||||
sub valid_slave {
|
sub valid_slave {
|
||||||
my ($host, $repo) = @_;
|
my ( $host, $repo ) = @_;
|
||||||
_die "invalid repo '$repo'" unless $repo =~ $REPONAME_PATT;
|
_die "invalid repo '$repo'" unless $repo =~ $REPONAME_PATT;
|
||||||
|
|
||||||
my $ref = git_config($repo, "^gitolite-options\\.mirror\\.slaves.*");
|
my $ref = git_config( $repo, "^gitolite-options\\.mirror\\.slaves.*" );
|
||||||
my %list = map { $_ => 1 } map { split } values %$ref;
|
my %list = map { $_ => 1 } map { split } values %$ref;
|
||||||
|
|
||||||
_die "'$host' not a valid slave for '$repo'" unless $list{$host};
|
_die "'$host' not a valid slave for '$repo'" unless $list{$host};
|
||||||
|
|
|
@ -72,7 +72,7 @@ sub in_ssh {
|
||||||
my $ip;
|
my $ip;
|
||||||
( $ip = $ENV{SSH_CONNECTION} || '(no-IP)' ) =~ s/ .*//;
|
( $ip = $ENV{SSH_CONNECTION} || '(no-IP)' ) =~ s/ .*//;
|
||||||
|
|
||||||
gl_log( 'ssh', "ARGV=" . join( ",", @ARGV ), "SOC=" . ( $ENV{SSH_ORIGINAL_COMMAND} || ''), "FROM=$ip" );
|
gl_log( 'ssh', "ARGV=" . join( ",", @ARGV ), "SOC=" . ( $ENV{SSH_ORIGINAL_COMMAND} || '' ), "FROM=$ip" );
|
||||||
|
|
||||||
$ENV{SSH_ORIGINAL_COMMAND} ||= '';
|
$ENV{SSH_ORIGINAL_COMMAND} ||= '';
|
||||||
my $soc = $ENV{SSH_ORIGINAL_COMMAND};
|
my $soc = $ENV{SSH_ORIGINAL_COMMAND};
|
||||||
|
@ -172,24 +172,24 @@ sub sanity {
|
||||||
sub http_setup_die_handler {
|
sub http_setup_die_handler {
|
||||||
|
|
||||||
$SIG{__DIE__} = sub {
|
$SIG{__DIE__} = sub {
|
||||||
my $service = ($ENV{SSH_ORIGINAL_COMMAND} =~ /git-receive-pack/ ? 'git-receive-pack' : 'git-upload-pack');
|
my $service = ( $ENV{SSH_ORIGINAL_COMMAND} =~ /git-receive-pack/ ? 'git-receive-pack' : 'git-upload-pack' );
|
||||||
my $message = shift; chomp($message);
|
my $message = shift; chomp($message);
|
||||||
print STDERR "$message\n";
|
print STDERR "$message\n";
|
||||||
|
|
||||||
# format the service response, then the message. With initial
|
# format the service response, then the message. With initial
|
||||||
# help from Ilari and then a more detailed email from Shawn...
|
# help from Ilari and then a more detailed email from Shawn...
|
||||||
$service = "# service=$service\n"; $message = "ERR $message\n";
|
$service = "# service=$service\n"; $message = "ERR $message\n";
|
||||||
$service = sprintf("%04X", length($service)+4) . "$service"; # no CRLF on this one
|
$service = sprintf( "%04X", length($service) + 4 ) . "$service"; # no CRLF on this one
|
||||||
$message = sprintf("%04X", length($message)+4) . "$message";
|
$message = sprintf( "%04X", length($message) + 4 ) . "$message";
|
||||||
|
|
||||||
http_print_headers();
|
http_print_headers();
|
||||||
print $service;
|
print $service;
|
||||||
print "0000"; # flush-pkt, apparently
|
print "0000"; # flush-pkt, apparently
|
||||||
print $message;
|
print $message;
|
||||||
print STDERR $service;
|
print STDERR $service;
|
||||||
print STDERR $message;
|
print STDERR $message;
|
||||||
exit 0; # if it's ok for die_webcgi in git.git/http-backend.c, it's ok for me ;-)
|
exit 0; # if it's ok for die_webcgi in git.git/http-backend.c, it's ok for me ;-)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sub http_simulate_ssh_connection {
|
sub http_simulate_ssh_connection {
|
||||||
|
@ -197,26 +197,27 @@ sub http_simulate_ssh_connection {
|
||||||
# http-backend.c for how I got that. Also note that "info" is overloaded;
|
# http-backend.c for how I got that. Also note that "info" is overloaded;
|
||||||
# git uses "info/refs...", while gitolite uses "info" or "info?...". So
|
# git uses "info/refs...", while gitolite uses "info" or "info?...". So
|
||||||
# there's a "/" after info in the list below
|
# there's a "/" after info in the list below
|
||||||
if ($ENV{PATH_INFO} =~ m(^/(.*)/(HEAD$|info/refs$|objects/|git-(?:upload|receive)-pack$))) {
|
if ( $ENV{PATH_INFO} =~ m(^/(.*)/(HEAD$|info/refs$|objects/|git-(?:upload|receive)-pack$)) ) {
|
||||||
my $repo = $1;
|
my $repo = $1;
|
||||||
my $verb = ($ENV{REQUEST_URI} =~ /git-receive-pack/) ? 'git-receive-pack' : 'git-upload-pack';
|
my $verb = ( $ENV{REQUEST_URI} =~ /git-receive-pack/ ) ? 'git-receive-pack' : 'git-upload-pack';
|
||||||
$ENV{SSH_ORIGINAL_COMMAND} = "$verb '$repo'";
|
$ENV{SSH_ORIGINAL_COMMAND} = "$verb '$repo'";
|
||||||
} else {
|
} else {
|
||||||
# this is one of our custom commands; could be anything really,
|
# this is one of our custom commands; could be anything really,
|
||||||
# because of the adc feature
|
# because of the adc feature
|
||||||
my ($verb) = ($ENV{PATH_INFO} =~ m(^/(\S+)));
|
my ($verb) = ( $ENV{PATH_INFO} =~ m(^/(\S+)) );
|
||||||
my $args = $ENV{QUERY_STRING};
|
my $args = $ENV{QUERY_STRING};
|
||||||
$args =~ s/\+/ /g;
|
$args =~ s/\+/ /g;
|
||||||
$ENV{SSH_ORIGINAL_COMMAND} = $verb;
|
$ENV{SSH_ORIGINAL_COMMAND} = $verb;
|
||||||
$ENV{SSH_ORIGINAL_COMMAND} .= " $args" if $args;
|
$ENV{SSH_ORIGINAL_COMMAND} .= " $args" if $args;
|
||||||
http_print_headers(); # in preparation for the eventual output!
|
http_print_headers(); # in preparation for the eventual output!
|
||||||
}
|
}
|
||||||
$ENV{SSH_CONNECTION} = "$ENV{REMOTE_ADDR} $ENV{REMOTE_PORT} $ENV{SERVER_ADDR} $ENV{SERVER_PORT}";
|
$ENV{SSH_CONNECTION} = "$ENV{REMOTE_ADDR} $ENV{REMOTE_PORT} $ENV{SERVER_ADDR} $ENV{SERVER_PORT}";
|
||||||
}
|
}
|
||||||
|
|
||||||
my $http_headers_printed = 0;
|
my $http_headers_printed = 0;
|
||||||
|
|
||||||
sub http_print_headers {
|
sub http_print_headers {
|
||||||
my($code, $text) = @_;
|
my ( $code, $text ) = @_;
|
||||||
|
|
||||||
return if $http_headers_printed++;
|
return if $http_headers_printed++;
|
||||||
$code ||= 200;
|
$code ||= 200;
|
||||||
|
|
|
@ -392,12 +392,12 @@ sub creator {
|
||||||
|
|
||||||
sub ext_grouplist {
|
sub ext_grouplist {
|
||||||
my $user = shift;
|
my $user = shift;
|
||||||
my $pgm = $rc{GROUPLIST_PGM};
|
my $pgm = $rc{GROUPLIST_PGM};
|
||||||
return [] if not $pgm;
|
return [] if not $pgm;
|
||||||
|
|
||||||
return $cache{$user} if $cache{$user};
|
return $cache{$user} if $cache{$user};
|
||||||
my @extgroups = map { s/^@?/@/; $_; } split ' ', `$rc{GROUPLIST_PGM} $user`;
|
my @extgroups = map { s/^@?/@/; $_; } split ' ', `$rc{GROUPLIST_PGM} $user`;
|
||||||
return ($cache{$user} = \@extgroups);
|
return ( $cache{$user} = \@extgroups );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -42,7 +42,7 @@ sub update {
|
||||||
sub bypass {
|
sub bypass {
|
||||||
require Cwd;
|
require Cwd;
|
||||||
Cwd->import;
|
Cwd->import;
|
||||||
gl_log( 'update', getcwd(), '(' . ($ENV{USER} || '?') . ')', 'bypass', @ARGV );
|
gl_log( 'update', getcwd(), '(' . ( $ENV{USER} || '?' ) . ')', 'bypass', @ARGV );
|
||||||
exit 0;
|
exit 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -32,11 +32,11 @@ our %rc;
|
||||||
# pre-populate some important rc keys
|
# pre-populate some important rc keys
|
||||||
# ----------------------------------------------------------------------
|
# ----------------------------------------------------------------------
|
||||||
|
|
||||||
$rc{GL_BINDIR} = $ENV{GL_BINDIR};
|
$rc{GL_BINDIR} = $ENV{GL_BINDIR};
|
||||||
$rc{GL_LIBDIR} = $ENV{GL_LIBDIR};
|
$rc{GL_LIBDIR} = $ENV{GL_LIBDIR};
|
||||||
|
|
||||||
# these keys could be overridden by the rc file later
|
# these keys could be overridden by the rc file later
|
||||||
$rc{GL_REPO_BASE} = "$ENV{HOME}/repositories";
|
$rc{GL_REPO_BASE} = "$ENV{HOME}/repositories";
|
||||||
$rc{GL_ADMIN_BASE} = "$ENV{HOME}/.gitolite";
|
$rc{GL_ADMIN_BASE} = "$ENV{HOME}/.gitolite";
|
||||||
$rc{LOG_TEMPLATE} = "$ENV{HOME}/.gitolite/logs/gitolite-%y-%m.log";
|
$rc{LOG_TEMPLATE} = "$ENV{HOME}/.gitolite/logs/gitolite-%y-%m.log";
|
||||||
|
|
||||||
|
@ -183,7 +183,7 @@ sub trigger {
|
||||||
if ( my ( $module, $sub ) = ( $pgm =~ /^(.*)::(\w+)$/ ) ) {
|
if ( my ( $module, $sub ) = ( $pgm =~ /^(.*)::(\w+)$/ ) ) {
|
||||||
|
|
||||||
require Gitolite::Triggers;
|
require Gitolite::Triggers;
|
||||||
trace(1, 'trigger', $module, $sub, @args, $rc_section, @_ );
|
trace( 1, 'trigger', $module, $sub, @args, $rc_section, @_ );
|
||||||
Gitolite::Triggers::run( $module, $sub, @args, $rc_section, @_ );
|
Gitolite::Triggers::run( $module, $sub, @args, $rc_section, @_ );
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -8,7 +8,7 @@ use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
|
|
||||||
my $git_commands = "git-upload-pack|git-receive-pack|git-upload-archive";
|
my $git_commands = "git-upload-pack|git-receive-pack|git-upload-archive";
|
||||||
my $hn = $rc{HOSTNAME};
|
my $hn = $rc{HOSTNAME};
|
||||||
|
|
||||||
# ----------------------------------------------------------------------
|
# ----------------------------------------------------------------------
|
||||||
|
|
||||||
|
@ -17,14 +17,14 @@ sub input {
|
||||||
|
|
||||||
# note: we treat %rc as our own internal "poor man's %ENV"
|
# note: we treat %rc as our own internal "poor man's %ENV"
|
||||||
$rc{FROM_SERVER} = $1;
|
$rc{FROM_SERVER} = $1;
|
||||||
trace(3, "from_server: $1");
|
trace( 3, "from_server: $1" );
|
||||||
|
|
||||||
if ( $ENV{SSH_ORIGINAL_COMMAND} =~ /^USER=(\S+) SOC=(git-receive-pack '(\S+)')$/ ) {
|
if ( $ENV{SSH_ORIGINAL_COMMAND} =~ /^USER=(\S+) SOC=(git-receive-pack '(\S+)')$/ ) {
|
||||||
# my ($user, $newsoc, $repo) = ($1, $2, $3);
|
# my ($user, $newsoc, $repo) = ($1, $2, $3);
|
||||||
$ENV{SSH_ORIGINAL_COMMAND} = $2;
|
$ENV{SSH_ORIGINAL_COMMAND} = $2;
|
||||||
@ARGV = ($1);
|
@ARGV = ($1);
|
||||||
$rc{REDIRECTED_PUSH} = 1;
|
$rc{REDIRECTED_PUSH} = 1;
|
||||||
trace(3, "redirected_push for user $1");
|
trace( 3, "redirected_push for user $1" );
|
||||||
} else {
|
} else {
|
||||||
# master -> slave push, no access checks needed
|
# master -> slave push, no access checks needed
|
||||||
$ENV{GL_BYPASS_ACCESS_CHECKS} = 1;
|
$ENV{GL_BYPASS_ACCESS_CHECKS} = 1;
|
||||||
|
@ -33,14 +33,14 @@ sub input {
|
||||||
|
|
||||||
# ----------------------------------------------------------------------
|
# ----------------------------------------------------------------------
|
||||||
|
|
||||||
my ($mode, $master, %slaves, %trusted_slaves);
|
my ( $mode, $master, %slaves, %trusted_slaves );
|
||||||
|
|
||||||
sub pre_git {
|
sub pre_git {
|
||||||
return unless $hn;
|
return unless $hn;
|
||||||
# nothing, and I mean NOTHING, happens if HOSTNAME is not set
|
# nothing, and I mean NOTHING, happens if HOSTNAME is not set
|
||||||
trace(1, "pre_git() on $hn");
|
trace( 1, "pre_git() on $hn" );
|
||||||
|
|
||||||
my ($repo, $user, $aa) = @_[1, 2, 3];
|
my ( $repo, $user, $aa ) = @_[ 1, 2, 3 ];
|
||||||
|
|
||||||
my $sender = $rc{FROM_SERVER} || '';
|
my $sender = $rc{FROM_SERVER} || '';
|
||||||
$user = '' if $sender and not exists $rc{REDIRECTED_PUSH};
|
$user = '' if $sender and not exists $rc{REDIRECTED_PUSH};
|
||||||
|
@ -55,18 +55,17 @@ sub pre_git {
|
||||||
# exclude this host from both the master and slave lists)
|
# exclude this host from both the master and slave lists)
|
||||||
return if $aa eq 'R';
|
return if $aa eq 'R';
|
||||||
|
|
||||||
trace(1, "mirror", "pre_git", $repo, "user=$user", "sender=$sender", "mode=$mode",
|
trace( 1, "mirror", "pre_git", $repo, "user=$user", "sender=$sender", "mode=$mode", ( $rc{REDIRECTED_PUSH} ? ("redirected") : () ) );
|
||||||
($rc{REDIRECTED_PUSH} ? ("redirected") : ()));
|
|
||||||
|
|
||||||
# ------------------------------------------------------------------
|
# ------------------------------------------------------------------
|
||||||
# case 1: we're master or slave, normal user pushing to us
|
# case 1: we're master or slave, normal user pushing to us
|
||||||
if ($user and not $rc{REDIRECTED_PUSH}) {
|
if ( $user and not $rc{REDIRECTED_PUSH} ) {
|
||||||
trace(3, "case 1, user push");
|
trace( 3, "case 1, user push" );
|
||||||
return if $mode eq 'local' or $mode eq 'master';
|
return if $mode eq 'local' or $mode eq 'master';
|
||||||
if ($trusted_slaves{$hn}) {
|
if ( $trusted_slaves{$hn} ) {
|
||||||
trace(3, "redirecting to $master");
|
trace( 3, "redirecting to $master" );
|
||||||
trace(1, "redirect to $master");
|
trace( 1, "redirect to $master" );
|
||||||
exec("ssh", $master, "USER=$user", "SOC=$ENV{SSH_ORIGINAL_COMMAND}");
|
exec( "ssh", $master, "USER=$user", "SOC=$ENV{SSH_ORIGINAL_COMMAND}" );
|
||||||
} else {
|
} else {
|
||||||
_die "$hn: pushing '$repo' to slave '$hn' not allowed";
|
_die "$hn: pushing '$repo' to slave '$hn' not allowed";
|
||||||
}
|
}
|
||||||
|
@ -74,9 +73,9 @@ sub pre_git {
|
||||||
|
|
||||||
# ------------------------------------------------------------------
|
# ------------------------------------------------------------------
|
||||||
# case 2: we're slave, master pushing to us
|
# case 2: we're slave, master pushing to us
|
||||||
if ($sender and not $rc{REDIRECTED_PUSH}) {
|
if ( $sender and not $rc{REDIRECTED_PUSH} ) {
|
||||||
trace(3, "case 2, master push");
|
trace( 3, "case 2, master push" );
|
||||||
_die "$hn: '$repo' is local" if $mode eq 'local';
|
_die "$hn: '$repo' is local" if $mode eq 'local';
|
||||||
_die "$hn: '$repo' is native" if $mode eq 'master';
|
_die "$hn: '$repo' is native" if $mode eq 'master';
|
||||||
_die "$hn: '$sender' is not the master for '$repo'" if $master ne $sender;
|
_die "$hn: '$sender' is not the master for '$repo'" if $master ne $sender;
|
||||||
return;
|
return;
|
||||||
|
@ -84,12 +83,12 @@ sub pre_git {
|
||||||
|
|
||||||
# ------------------------------------------------------------------
|
# ------------------------------------------------------------------
|
||||||
# case 3: we're master, slave sending a redirected push to us
|
# case 3: we're master, slave sending a redirected push to us
|
||||||
if ($sender and $rc{REDIRECTED_PUSH}) {
|
if ( $sender and $rc{REDIRECTED_PUSH} ) {
|
||||||
trace(3, "case 2, slave redirect");
|
trace( 3, "case 2, slave redirect" );
|
||||||
_die "$hn: '$repo' is local" if $mode eq 'local';
|
_die "$hn: '$repo' is local" if $mode eq 'local';
|
||||||
_die "$hn: '$repo' is not native" if $mode eq 'slave';
|
_die "$hn: '$repo' is not native" if $mode eq 'slave';
|
||||||
_die "$hn: '$sender' is not a valid slave for '$repo'" if not $slaves{$sender};
|
_die "$hn: '$sender' is not a valid slave for '$repo'" if not $slaves{$sender};
|
||||||
_die "$hn: redirection not allowed from '$sender'" if not $trusted_slaves{$sender};
|
_die "$hn: redirection not allowed from '$sender'" if not $trusted_slaves{$sender};
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -102,9 +101,9 @@ sub pre_git {
|
||||||
sub post_git {
|
sub post_git {
|
||||||
return unless $hn;
|
return unless $hn;
|
||||||
# nothing, and I mean NOTHING, happens if HOSTNAME is not set
|
# nothing, and I mean NOTHING, happens if HOSTNAME is not set
|
||||||
trace(1, "post_git() on $hn");
|
trace( 1, "post_git() on $hn" );
|
||||||
|
|
||||||
my ($repo, $user, $aa) = @_[1, 2, 3];
|
my ( $repo, $user, $aa ) = @_[ 1, 2, 3 ];
|
||||||
# we don't deal with any reads
|
# we don't deal with any reads
|
||||||
return if $aa eq 'R';
|
return if $aa eq 'R';
|
||||||
|
|
||||||
|
@ -115,13 +114,12 @@ sub post_git {
|
||||||
# now you know the repo, get its mirroring details
|
# now you know the repo, get its mirroring details
|
||||||
details($repo);
|
details($repo);
|
||||||
|
|
||||||
trace(1, "mirror", "post_git", $repo, "user=$user", "sender=$sender", "mode=$mode",
|
trace( 1, "mirror", "post_git", $repo, "user=$user", "sender=$sender", "mode=$mode", ( $rc{REDIRECTED_PUSH} ? ("redirected") : () ) );
|
||||||
($rc{REDIRECTED_PUSH} ? ("redirected") : ()));
|
|
||||||
|
|
||||||
# ------------------------------------------------------------------
|
# ------------------------------------------------------------------
|
||||||
# case 1: we're master or slave, normal user pushing to us
|
# case 1: we're master or slave, normal user pushing to us
|
||||||
if ($user and not $rc{REDIRECTED_PUSH}) {
|
if ( $user and not $rc{REDIRECTED_PUSH} ) {
|
||||||
trace(3, "case 1, user push");
|
trace( 3, "case 1, user push" );
|
||||||
return if $mode eq 'local';
|
return if $mode eq 'local';
|
||||||
# slave was eliminated earlier anyway, so that leaves 'master'
|
# slave was eliminated earlier anyway, so that leaves 'master'
|
||||||
|
|
||||||
|
@ -133,16 +131,16 @@ sub post_git {
|
||||||
|
|
||||||
# ------------------------------------------------------------------
|
# ------------------------------------------------------------------
|
||||||
# case 2: we're slave, master pushing to us
|
# case 2: we're slave, master pushing to us
|
||||||
if ($sender and not $rc{REDIRECTED_PUSH}) {
|
if ( $sender and not $rc{REDIRECTED_PUSH} ) {
|
||||||
trace(3, "case 2, master push");
|
trace( 3, "case 2, master push" );
|
||||||
# nothing to do
|
# nothing to do
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
# ------------------------------------------------------------------
|
# ------------------------------------------------------------------
|
||||||
# case 3: we're master, slave sending a redirected push to us
|
# case 3: we're master, slave sending a redirected push to us
|
||||||
if ($sender and $rc{REDIRECTED_PUSH}) {
|
if ( $sender and $rc{REDIRECTED_PUSH} ) {
|
||||||
trace(3, "case 2, slave redirect");
|
trace( 3, "case 2, slave redirect" );
|
||||||
|
|
||||||
# find all slaves and push to each of them
|
# find all slaves and push to each of them
|
||||||
push_to_slaves($repo);
|
push_to_slaves($repo);
|
||||||
|
@ -158,40 +156,40 @@ sub post_git {
|
||||||
my $repo = shift;
|
my $repo = shift;
|
||||||
return if $lastrepo eq $repo;
|
return if $lastrepo eq $repo;
|
||||||
|
|
||||||
$master = master($repo);
|
$master = master($repo);
|
||||||
%slaves = slaves($repo);
|
%slaves = slaves($repo);
|
||||||
$mode = mode($repo);
|
$mode = mode($repo);
|
||||||
%trusted_slaves = trusted_slaves($repo);
|
%trusted_slaves = trusted_slaves($repo);
|
||||||
trace(3, $master, $mode, join(",", sort keys %slaves), join(",", sort keys %trusted_slaves) );
|
trace( 3, $master, $mode, join( ",", sort keys %slaves ), join( ",", sort keys %trusted_slaves ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
sub master {
|
sub master {
|
||||||
return option(+shift, 'mirror.master');
|
return option( +shift, 'mirror.master' );
|
||||||
}
|
}
|
||||||
|
|
||||||
sub slaves {
|
sub slaves {
|
||||||
my $ref = git_config(+shift, "^gitolite-options\\.mirror\\.slaves.*");
|
my $ref = git_config( +shift, "^gitolite-options\\.mirror\\.slaves.*" );
|
||||||
my %out = map { $_ => 1 } map { split } values %$ref;
|
my %out = map { $_ => 1 } map { split } values %$ref;
|
||||||
return %out;
|
return %out;
|
||||||
}
|
}
|
||||||
|
|
||||||
sub trusted_slaves {
|
sub trusted_slaves {
|
||||||
my $ref = git_config(+shift, "^gitolite-options\\.mirror\\.redirectOK.*");
|
my $ref = git_config( +shift, "^gitolite-options\\.mirror\\.redirectOK.*" );
|
||||||
# the list of trusted slaves (where we accept redirected pushes from)
|
# the list of trusted slaves (where we accept redirected pushes from)
|
||||||
# is either explicitly given...
|
# is either explicitly given...
|
||||||
my @out = map { split } values %$ref;
|
my @out = map { split } values %$ref;
|
||||||
my %out = map { $_ => 1 } @out;
|
my %out = map { $_ => 1 } @out;
|
||||||
# ...or it's all the slaves mentioned if the list is just a "all"
|
# ...or it's all the slaves mentioned if the list is just a "all"
|
||||||
%out = %slaves if (@out == 1 and $out[0] eq 'all');
|
%out = %slaves if ( @out == 1 and $out[0] eq 'all' );
|
||||||
return %out;
|
return %out;
|
||||||
}
|
}
|
||||||
|
|
||||||
sub mode {
|
sub mode {
|
||||||
my $repo = shift;
|
my $repo = shift;
|
||||||
return 'local' if not $hn;
|
return 'local' if not $hn;
|
||||||
return 'master' if $master eq $hn;
|
return 'master' if $master eq $hn;
|
||||||
return 'slave' if $slaves{$hn};
|
return 'slave' if $slaves{$hn};
|
||||||
return 'local' if not $master and not %slaves;
|
return 'local' if not $master and not %slaves;
|
||||||
_die "$hn: '$repo' is mirrored but not here";
|
_die "$hn: '$repo' is mirrored but not here";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -200,9 +198,9 @@ sub push_to_slaves {
|
||||||
my $repo = shift;
|
my $repo = shift;
|
||||||
|
|
||||||
my $u = $ENV{GL_USER};
|
my $u = $ENV{GL_USER};
|
||||||
delete $ENV{GL_USER}; # why? see src/commands/mirror
|
delete $ENV{GL_USER}; # why? see src/commands/mirror
|
||||||
|
|
||||||
for my $s (sort keys %slaves) {
|
for my $s ( sort keys %slaves ) {
|
||||||
system("gitolite mirror push $s $repo &");
|
system("gitolite mirror push $s $repo &");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue