'gitolite writes off/on...' done
This commit is contained in:
parent
1ec8be663e
commit
f0355d749b
|
@ -5,11 +5,15 @@ package Gitolite::Conf::Load;
|
||||||
|
|
||||||
@EXPORT = qw(
|
@EXPORT = qw(
|
||||||
load
|
load
|
||||||
|
|
||||||
access
|
access
|
||||||
git_config
|
git_config
|
||||||
|
|
||||||
option
|
option
|
||||||
repo_missing
|
repo_missing
|
||||||
|
check_repo_write_enabled
|
||||||
creator
|
creator
|
||||||
|
|
||||||
vrefs
|
vrefs
|
||||||
lister_dispatch
|
lister_dispatch
|
||||||
);
|
);
|
||||||
|
@ -154,6 +158,15 @@ sub repo_missing {
|
||||||
return not -d "$rc{GL_REPO_BASE}/$repo.git";
|
return not -d "$rc{GL_REPO_BASE}/$repo.git";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub check_repo_write_enabled {
|
||||||
|
my ($repo) = shift;
|
||||||
|
for my $f ("$ENV{HOME}/.gitolite.down", "$rc{GL_REPO_BASE}/$repo.git/.gitolite.down") {
|
||||||
|
next unless -f $f;
|
||||||
|
_die slurp($f) if -s $f;
|
||||||
|
_die "sorry, writes are currently disabled (no more info available)";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
# ----------------------------------------------------------------------
|
# ----------------------------------------------------------------------
|
||||||
|
|
||||||
sub load_common {
|
sub load_common {
|
||||||
|
|
50
src/commands/writes
Executable file
50
src/commands/writes
Executable file
|
@ -0,0 +1,50 @@
|
||||||
|
#!/usr/bin/perl
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
|
||||||
|
use lib $ENV{GL_BINDIR};
|
||||||
|
use Gitolite::Rc;
|
||||||
|
use Gitolite::Common;
|
||||||
|
use Gitolite::Conf::Load;
|
||||||
|
|
||||||
|
=for usage
|
||||||
|
Usage: gitolite writes on|off <reponame>|@all
|
||||||
|
|
||||||
|
'on' enables, 'off' disables, writes (pushes) to the named repo or all repos.
|
||||||
|
|
||||||
|
With 'off', any subsequent text is taken to be the message to be shown to
|
||||||
|
users when their pushes get rejected. If it is not supplied, it will take it
|
||||||
|
from STDIN; this allows longer messages.
|
||||||
|
=cut
|
||||||
|
|
||||||
|
usage() if not @ARGV or @ARGV < 2 or $ARGV[0] eq '-h';
|
||||||
|
|
||||||
|
usage() if $ARGV[0] ne 'on' and $ARGV[0] ne 'off';
|
||||||
|
my $on = ( shift eq 'on' );
|
||||||
|
|
||||||
|
my $repo = shift;
|
||||||
|
|
||||||
|
my $msg = join( " ", @ARGV );
|
||||||
|
# try STDIN only if no msg found in args *and* it's an 'off' command
|
||||||
|
if ( not $msg and not $on ) {
|
||||||
|
say2 "...please type the message to be shown to users:";
|
||||||
|
$msg = join( "", <> );
|
||||||
|
}
|
||||||
|
|
||||||
|
my $sf = ".gitolite.down";
|
||||||
|
my $rb = $rc{GL_REPO_BASE};
|
||||||
|
|
||||||
|
if ( $repo eq '@all' ) {
|
||||||
|
target( $ENV{HOME} );
|
||||||
|
} else {
|
||||||
|
target("$rb/$repo.git");
|
||||||
|
}
|
||||||
|
|
||||||
|
sub target {
|
||||||
|
my $repodir = shift;
|
||||||
|
if ($on) {
|
||||||
|
unlink "$repodir/$sf";
|
||||||
|
} else {
|
||||||
|
_print( "$repodir/$sf", $msg );
|
||||||
|
}
|
||||||
|
}
|
|
@ -82,6 +82,7 @@ sub main {
|
||||||
trigger( 'ACCESS_CHECK', $repo, $user, $aa, 'any', $ret );
|
trigger( 'ACCESS_CHECK', $repo, $user, $aa, 'any', $ret );
|
||||||
_die $ret if $ret =~ /DENIED/;
|
_die $ret if $ret =~ /DENIED/;
|
||||||
|
|
||||||
|
check_repo_write_enabled($repo) if $aa eq 'W';
|
||||||
trigger( 'PRE_GIT', $repo, $user, $aa, 'any', $verb );
|
trigger( 'PRE_GIT', $repo, $user, $aa, 'any', $verb );
|
||||||
my $repodir = "'$rc{GL_REPO_BASE}/$repo.git'";
|
my $repodir = "'$rc{GL_REPO_BASE}/$repo.git'";
|
||||||
_system( "git", "shell", "-c", "$verb $repodir" );
|
_system( "git", "shell", "-c", "$verb $repodir" );
|
||||||
|
|
115
t/writes.t
Executable file
115
t/writes.t
Executable file
|
@ -0,0 +1,115 @@
|
||||||
|
#!/usr/bin/perl
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
|
||||||
|
# this is hardcoded; change it if needed
|
||||||
|
use lib "src";
|
||||||
|
use Gitolite::Test;
|
||||||
|
use Cwd;
|
||||||
|
my $workdir = getcwd();
|
||||||
|
|
||||||
|
# 'gitolite writes' command
|
||||||
|
# ----------------------------------------------------------------------
|
||||||
|
|
||||||
|
my $sf = ".gitolite.down";
|
||||||
|
|
||||||
|
try "plan 58";
|
||||||
|
try "DEF POK = !/DENIED/; !/failed to push/";
|
||||||
|
|
||||||
|
# delete the down file
|
||||||
|
unlink "$ENV{HOME}/$sf";
|
||||||
|
|
||||||
|
# add foo, bar/..* repos to the config and push
|
||||||
|
confreset;confadd '
|
||||||
|
repo foo
|
||||||
|
RW = u1
|
||||||
|
R = u2
|
||||||
|
|
||||||
|
repo bar/..*
|
||||||
|
C = u2 u4 u6
|
||||||
|
RW = CREATOR
|
||||||
|
';
|
||||||
|
|
||||||
|
try "ADMIN_PUSH set1; !/FATAL/" or die text();
|
||||||
|
|
||||||
|
try "
|
||||||
|
# clone and push to foo
|
||||||
|
CLONE u1 foo; ok
|
||||||
|
cd foo; ok
|
||||||
|
tc f1; ok
|
||||||
|
PUSH u1 master; ok; /new branch/
|
||||||
|
|
||||||
|
# auto-clone and push to bar/u2
|
||||||
|
cd ..
|
||||||
|
CLONE u2 bar/u2; ok; /appear to have cloned an empty/
|
||||||
|
/Initialized empty/
|
||||||
|
cd u2;
|
||||||
|
tc f2
|
||||||
|
PUSH u2 master; ok;
|
||||||
|
|
||||||
|
# disable site with some message
|
||||||
|
gitolite writes off \@all testing site-wide disable; ok
|
||||||
|
|
||||||
|
# try push foo and see fail + message
|
||||||
|
cd ../foo; ok
|
||||||
|
tc f3; ok
|
||||||
|
PUSH u1; !ok; /testing site-wide disable/
|
||||||
|
# try push bar/u2 and ...
|
||||||
|
cd ../u2; ok
|
||||||
|
tc f4; ok
|
||||||
|
PUSH u2; !ok; /testing site-wide disable/
|
||||||
|
|
||||||
|
# try auto-create push bar/u4 and this works!!
|
||||||
|
cd ..
|
||||||
|
CLONE u4 bar/u4; ok; /appear to have cloned an empty/
|
||||||
|
/Initialized empty/
|
||||||
|
!/testing site-wide disable/
|
||||||
|
cd u4; ok
|
||||||
|
|
||||||
|
# enable site
|
||||||
|
gitolite writes on \@all; ok
|
||||||
|
|
||||||
|
# try same 3 again
|
||||||
|
|
||||||
|
# try push foo and see fail + message
|
||||||
|
cd ../foo; ok
|
||||||
|
tc g3; ok
|
||||||
|
PUSH u1; ok; /master -> master/
|
||||||
|
# try push bar/u2 and ...
|
||||||
|
cd ../u2; ok
|
||||||
|
tc g4; ok
|
||||||
|
PUSH u2; ok; /master -> master/
|
||||||
|
|
||||||
|
# try auto-create push bar/u4 and this works!!
|
||||||
|
cd ..
|
||||||
|
CLONE u6 bar/u6; ok; /appear to have cloned an empty/
|
||||||
|
/Initialized empty/
|
||||||
|
!/testing site-wide disable/
|
||||||
|
cd u6; ok
|
||||||
|
|
||||||
|
# disable just foo
|
||||||
|
gitolite writes off foo foo down
|
||||||
|
|
||||||
|
# try push foo and see the message
|
||||||
|
cd ../foo; ok
|
||||||
|
tc g3; ok
|
||||||
|
PUSH u1; !ok; /foo down/
|
||||||
|
!/testing site-wide disable/
|
||||||
|
# push bar/u2 ok
|
||||||
|
cd ../u2
|
||||||
|
tc g4
|
||||||
|
PUSH u2; ok; /master -> master/
|
||||||
|
|
||||||
|
# enable foo, disable bar/u2
|
||||||
|
gitolite writes on foo
|
||||||
|
gitolite writes off bar/u2 the bar is closed
|
||||||
|
|
||||||
|
# try both
|
||||||
|
cd ../foo; ok
|
||||||
|
tc h3; ok
|
||||||
|
PUSH u1; ok; /master -> master/
|
||||||
|
# push bar/u2 ok
|
||||||
|
cd ../u2
|
||||||
|
tc h4
|
||||||
|
PUSH u2; !ok; /the bar is closed/
|
||||||
|
";
|
Loading…
Reference in a new issue