info command simplified

(thanks to Eli for the back-and-forth that led to this)
This commit is contained in:
Sitaram Chamarty 2012-03-29 07:04:46 +05:30
parent ae75f9c938
commit dfb9844dfb
5 changed files with 127 additions and 112 deletions

View file

@ -9,78 +9,88 @@ use Gitolite::Rc;
use Gitolite::Common;
use Gitolite::Conf::Load;
=for usage
Usage: gitolite info [-p [-lc] [<repo name pattern>]
=for args
Usage: gitolite info [-lc] [<repo name pattern>]
List all repos/repo groups you can access. By default, it shows you what the
conf file specified, which means group names and wild card patterns may show
up. Example, if the conf file looked like this:
List all repos/repo groups you can access.
@oss = git gitolite linux
repo @oss
RW+ = YourName
then running 'ssh git@host info' will only show you '@oss'.
'-p' looks at actual (physical) repos instead; in our example this will show
you git, gitolite, and linux.
'-lc' lists creators as an additional field at the end; this option is only
available with '-p'.
'-lc' lists creators as an additional field at the end.
The optional pattern is an unanchored regex that will limit the repos
searched, in both cases. It might speed up things a little if you have more
than a few thousand repos.
=cut
my ( $help, $phy, $lc, $patt ) = ('') x 4;
GetOptions(
'lc' => \$lc,
'p' => \$phy,
'h' => \$help,
) or usage();
# these two are globals
my ( $lc, $patt ) = args();
usage("'-lc' requires '-p'") if $lc and not $phy;
usage() if @ARGV > 1 or $help;
$patt = shift || '.';
print_version();
my $user = $ENV{GL_USER} or _die "GL_USER not set";
my $ref = 'any';
print_patterns(); # repos he can create for himself
print_phy_repos(); # repos already created
print "\n$rc{SITE_INFO}\n" if $rc{SITE_INFO};
chomp(my $hn = `hostname -s`);
my $gv = substr( `git --version`, 12 );
print "hello $user, this is $ENV{USER}\@$hn running gitolite3 " . version() . " on git $gv\n";
# ----------------------------------------------------------------------
my $lr = lister_dispatch('list-repos');
sub args {
my ( $lc, $patt ) = ( '', '' );
my $help = '';
my $perm;
my $repos;
my @aa;
GetOptions(
'lc' => \$lc,
'h' => \$help,
) or usage();
if ($phy) {
usage() if @ARGV > 1 or $help;
$patt = shift @ARGV || '.';
return ( $lc, $patt );
}
sub print_version {
chomp( my $hn = `hostname -s` );
my $gv = substr( `git --version`, 12 );
$ENV{GL_USER} or _die "GL_USER not set";
print "hello $ENV{GL_USER}, this is $ENV{USER}\@$hn running gitolite3 " . version() . " on git $gv\n";
}
sub print_patterns {
my ( $repos, @aa );
# find repo patterns only, call them with ^C flag included
@$repos = grep { !/$REPONAME_PATT/ } @{ lister_dispatch('list-repos')->() };
@aa = qw(R W ^C);
listem( $repos, '', @aa );
# but squelch the 'lc' flag for these
}
sub print_phy_repos {
my ( $repos, @aa );
# now get the actual repos and get R or W only
_chdir( $rc{GL_REPO_BASE} );
$repos = list_phy_repos(1);
@aa = qw(R W);
} else {
$repos = $lr->();
@aa = qw(R W ^C);
@aa = qw(R W);
listem( $repos, $lc, @aa );
}
my $creator = '';
for my $repo (@$repos) {
next unless $repo =~ /$patt/;
my $perm = '';
$creator = creator($repo) if $lc;
sub listem {
my ( $repos, $lc, @aa ) = @_;
my $creator = '';
for my $repo (@$repos) {
next unless $repo =~ /$patt/;
my $perm = '';
$creator = creator($repo) if $lc;
for my $aa (@aa) {
my $ret = access( $repo, $user, $aa, $ref );
$perm .= ( $ret =~ /DENIED/ ? " " : " $aa" );
for my $aa (@aa) {
my $ret = access( $repo, $ENV{GL_USER}, $aa, 'any' );
$perm .= ( $ret =~ /DENIED/ ? " " : " $aa" );
}
$perm =~ s/\^//;
next unless $perm =~ /\S/;
print "$perm\t$repo";
print "\t$creator" if $lc;
print "\n";
}
$perm =~ s/\^//;
next unless $perm =~ /\S/;
print "$perm\t$repo";
print "\t$creator" if $lc;
print "\n";
}
print "\n$rc{SITE_INFO}\n" if $rc{SITE_INFO};

View file

@ -9,7 +9,7 @@ use Gitolite::Test;
# the info command
# ----------------------------------------------------------------------
try 'plan 83';
try 'plan 78';
try "## info";
@ -22,8 +22,12 @@ confreset;confadd '
RW = u2
R = u1
repo t3
RW = u3
R = u4
RW = u3
R = u4
repo foo/..*
C = u1
RW = CREATOR u3
';
try "ADMIN_PUSH info; !/FATAL/" or die text();
@ -38,66 +42,67 @@ try "DEF GS = /hello %1, this is $ENV{USER}\\@.* running gitolite/";
try "
glt info u1; ok; GS u1
/R W \t\@t1/
/R \tt2/
/R W \ttesting/
!/R W \tt3/
glt info u2; ok; GS u2
/R \t\@t1/
/R W \tt2/
/R W \ttesting/
!/R W \tt3/
glt info u3; ok; GS u3
/R W \tt3/
/R W \ttesting/
!/R \t\@t1/
!/R W \tt2/
glt info u4; ok; GS u4
/R \tt3/
/R W \ttesting/
!/R \t\@t1/
!/R W \tt2/
glt info u5; ok; GS u5
/R W \ttesting/
!/R \t\@t1/
!/R W \tt2/
!/R W \tt3/
glt info u6; ok; GS u6
/R W \ttesting/
!/R \t\@t1/
!/R W \tt2/
!/R W \tt3/
";
try "
glt info u1 -p; ok; GS u1
/C\tfoo/\\.\\.\\*/
/R W *\tt1/
/R *\tt2/
/R W *\ttesting/
!/R W *\tt3/
glt info u2 -p; ok; GS u2
glt info u2; ok; GS u2
!/C\tfoo/
/R *\tt1/
/R W *\tt2/
/R W *\ttesting/
!/R W *\tt3/
glt info u3 -p; ok; GS u3
glt info u3; ok; GS u3
/R W *\tt3/
/R W *\ttesting/
!/R *\tt1/
!/R W *\tt2/
glt info u4 -p; ok; GS u4
glt info u4; ok; GS u4
/R *\tt3/
/R W *\ttesting/
!/R *\tt1/
!/R W *\tt2/
glt info u5 -p; ok; GS u5
glt info u5; ok; GS u5
/R W *\ttesting/
!/R *\tt1/
!/R W *\tt2/
!/R W *\tt3/
glt info u6 -p; ok; GS u6
glt info u6; ok; GS u6
/R W *\ttesting/
!/R *\tt1/
!/R W *\tt2/
!/R W *\tt3/
";
try "
glt ls-remote u1 file:///foo/one; ok
glt info u1; ok; GS u1
/C\tfoo/\\.\\.\\*/
/R W *\tfoo/one/
!/R W *\tfoo/one\tu1/
glt info u2; ok; GS u2
!/C\tfoo/
!/R W *\tfoo/one/
glt info u3; ok; GS u3
!/C\tfoo/
/R W *\tfoo/one/
!/R W *\tfoo/one\tu1/
";
try "
glt ls-remote u1 file:///foo/one; ok
glt info u1 -lc; ok; GS u1
put
/C\tfoo/\\.\\.\\*/
!/C\tfoo.*u1/
/R W *\tfoo/one\tu1/
glt info u2 -lc; ok; GS u2
put
!/C\tfoo/
!/R W *\tfoo/one/
glt info u3 -lc; ok; GS u3
put
!/C\tfoo/
/R W *\tfoo/one\tu1/
";

View file

@ -33,20 +33,20 @@ try "
glt ls-remote u1 file:///bar/u1/try1
/Initialized empty Git repository in .*/bar/u1/try1.git//
# default permissions for u2 and u4
glt info u1 -p -lc
glt info u1 -lc
/R W *\tbar/u1/try1\tu1/
glt info u2 -p -lc
glt info u2 -lc
!/R W *\tbar/u1/try1\tu1/
glt info u4 -p -lc
glt info u4 -lc
!/R W *\tbar/u1/try1\tu1/
# \@leads can RW try1
echo WRITERS \@leads | glt perms u1 bar/u1/try1; ok
glt info u1 -p -lc
glt info u1 -lc
/R W *\tbar/u1/try1\tu1/
glt info u2 -p -lc
glt info u2 -lc
/R W *\tbar/u1/try1\tu1/
glt info u4 -p -lc
glt info u4 -lc
!/R W *\tbar/u1/try1\tu1/
# \@devs can R try1
@ -55,14 +55,14 @@ try "
/READERS \@devs/
!/WRITERS \@leads/
glt info u1 -p -lc
glt info u1 -lc
/R W *\tbar/u1/try1\tu1/
glt info u2 -p -lc
glt info u2 -lc
!/R W *\tbar/u1/try1\tu1/
/R *\tbar/u1/try1\tu1/
glt info u4 -p -lc
glt info u4 -lc
!/R W *\tbar/u1/try1\tu1/
/R *\tbar/u1/try1\tu1/
@ -71,11 +71,11 @@ try "
glt perms u1 -l bar/u1/try1
/READERS \@devs/
/WRITERS \@leads/
glt info u1 -p -lc
glt info u1 -lc
/R W *\tbar/u1/try1\tu1/
glt info u2 -p -lc
glt info u2 -lc
/R W *\tbar/u1/try1\tu1/
glt info u4 -p -lc
glt info u4 -lc
!/R W *\tbar/u1/try1\tu1/
/R *\tbar/u1/try1\tu1/
";

View file

@ -37,7 +37,7 @@ try "
glt perms u1 -l foo/u1/bar
/WRITERS u2/
# expand
glt info u2 -p
glt info u2
/R W *\tfoo/u1/bar/
/R W *\ttesting/
@ -80,7 +80,7 @@ try "
glt perms u1 -l foo/u1/bar
/WRITERS u2/
# expand
glt info u2 -p
glt info u2
/R W *\tfoo/u1/bar/
/R W *\ttesting/

View file

@ -48,10 +48,10 @@ confreset; confadd '
try "ADMIN_PUSH set3; !/FATAL/" or die text();
try "
ssh u1 info; ok; /R W \tfoo/
ssh u2 info; ok; /R \tfoo/
ssh u3 info; ok; /R W \tfoo/
ssh u4 info; ok; /R \tfoo/
ssh u1 info; ok; /R W\tfoo/
ssh u2 info; ok; /R \tfoo/
ssh u3 info; ok; /R W\tfoo/
ssh u4 info; ok; /R \tfoo/
ssh u5 info; ok; !/foo/
ssh u6 info; ok; !/foo/
"