From dfb9844dfb08eba25febea69f7fa31236d195a6f Mon Sep 17 00:00:00 2001 From: Sitaram Chamarty Date: Thu, 29 Mar 2012 07:04:46 +0530 Subject: [PATCH] info command simplified (thanks to Eli for the back-and-forth that led to this) --- src/commands/info | 116 +++++++++++++++++++++++++--------------------- t/info.t | 87 ++++++++++++++++++---------------- t/perms-groups.t | 24 +++++----- t/sequence.t | 4 +- t/ssh-basic.t | 8 ++-- 5 files changed, 127 insertions(+), 112 deletions(-) diff --git a/src/commands/info b/src/commands/info index 2dc433b..7b8b845 100755 --- a/src/commands/info +++ b/src/commands/info @@ -9,78 +9,88 @@ use Gitolite::Rc; use Gitolite::Common; use Gitolite::Conf::Load; -=for usage -Usage: gitolite info [-p [-lc] [] +=for args +Usage: gitolite info [-lc] [] -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}; diff --git a/t/info.t b/t/info.t index ccb25b3..ce54027 100755 --- a/t/info.t +++ b/t/info.t @@ -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/ +"; diff --git a/t/perms-groups.t b/t/perms-groups.t index 1681d33..59c5fb5 100755 --- a/t/perms-groups.t +++ b/t/perms-groups.t @@ -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/ "; diff --git a/t/sequence.t b/t/sequence.t index f88348a..d85f420 100755 --- a/t/sequence.t +++ b/t/sequence.t @@ -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/ diff --git a/t/ssh-basic.t b/t/ssh-basic.t index 9051fa0..2ace6ca 100755 --- a/t/ssh-basic.t +++ b/t/ssh-basic.t @@ -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/ "