X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Fgit-codeowners;a=blobdiff_plain;f=lib%2FApp%2FCodeowners.pm;h=1dc97cc49dba3ead168ab5e4bd23e2865c0d0424;hp=20be9855fa51d7917a683fb6ce8c0321f7c6ff87;hb=3c7ed3d762399efb2d01121392f7115104095788;hpb=4c0f6ed552c529fc6a3a09ffb6de91d6344ac790 diff --git a/lib/App/Codeowners.pm b/lib/App/Codeowners.pm index 20be985..1dc97cc 100644 --- a/lib/App/Codeowners.pm +++ b/lib/App/Codeowners.pm @@ -54,19 +54,46 @@ sub _command_show { my ($proc, $cdup) = run_git(qw{rev-parse --show-cdup}); $proc->wait and exit 1; + my $show_projects = $opts->{projects} // scalar @{$codeowners->projects}; + my $formatter = App::Codeowners::Formatter->new( format => $opts->{format} || ' * %-50F %O', handle => *STDOUT, - columns => [qw(File Owner), $opts->{project} ? 'Project' : ()], + columns => [ + 'File', + $opts->{patterns} ? 'Pattern' : (), + 'Owner', + $show_projects ? 'Project' : (), + ], ); + my %filter_owners = map { $_ => 1 } @{$opts->{owner}}; + my %filter_projects = map { $_ => 1 } @{$opts->{project}}; + my %filter_patterns = map { $_ => 1 } @{$opts->{pattern}}; + $proc = git_ls_files('.', $opts->args); while (my $filepath = $proc->next) { my $match = $codeowners->match(path($filepath)->relative($cdup)); + if (%filter_owners) { + for my $owner (@{$match->{owners}}) { + goto ADD_RESULT if $filter_owners{$owner}; + } + next; + } + if (%filter_patterns) { + goto ADD_RESULT if $filter_patterns{$match->{pattern} || ''}; + next; + } + if (%filter_projects) { + goto ADD_RESULT if $filter_projects{$match->{project} || ''}; + next; + } + ADD_RESULT: $formatter->add_result([ $filepath, + $opts->{patterns} ? $match->{pattern} : (), $match->{owners}, - $opts->{project} ? $match->{project} : (), + $show_projects ? $match->{project} : (), ]); } $proc->wait and exit 1; @@ -112,6 +139,26 @@ sub _command_patterns { $formatter->add_result(map { [$_] } @$results); } +sub _command_projects { + my $self = shift; + my $opts = shift; + + my $toplevel = git_toplevel('.') or die "Not a git repo\n"; + + my $codeowners_path = find_codeowners_in_directory($toplevel) + or die "No CODEOWNERS file in $toplevel\n"; + my $codeowners = File::Codeowners->parse_from_filepath($codeowners_path); + + my $results = $codeowners->projects; + + my $formatter = App::Codeowners::Formatter->new( + format => $opts->{format} || '%P', + handle => *STDOUT, + columns => [qw(Project)], + ); + $formatter->add_result(map { [$_] } @$results); +} + sub _command_create { goto &_command_update } sub _command_update { my $self = shift;