From: Charles McGarvey Date: Tue, 21 Jan 2020 17:14:26 +0000 (-0700) Subject: Version 0.48 X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Fgit-codeowners;a=commitdiff_plain;h=7cd7abef6e13815b2deb4abb9c2e1edc1eee380e Version 0.48 --- diff --git a/Changes b/Changes index 94ce334..dc5ce0f 100644 --- a/Changes +++ b/Changes @@ -1,5 +1,9 @@ Revision history for App-Codeowners. +0.48 2020-01-21 10:13:14-07:00 MST7MDT + * Add rename_project and update_owners_by_project functions. + * No changes to the CLI. + 0.47 2019-11-17 17:36:49-07:00 MST7MDT * Configure git in unit tests to avoid unnecessary test failures. * Compare long paths on win32 (thanks CPAN testers). diff --git a/META.json b/META.json index 22654cd..cbfbafd 100644 --- a/META.json +++ b/META.json @@ -114,55 +114,55 @@ "provides" : { "App::Codeowners" : { "file" : "lib/App/Codeowners.pm", - "version" : "0.47" + "version" : "0.48" }, "App::Codeowners::Formatter" : { "file" : "lib/App/Codeowners/Formatter.pm", - "version" : "0.47" + "version" : "0.48" }, "App::Codeowners::Formatter::CSV" : { "file" : "lib/App/Codeowners/Formatter/CSV.pm", - "version" : "0.47" + "version" : "0.48" }, "App::Codeowners::Formatter::JSON" : { "file" : "lib/App/Codeowners/Formatter/JSON.pm", - "version" : "0.47" + "version" : "0.48" }, "App::Codeowners::Formatter::String" : { "file" : "lib/App/Codeowners/Formatter/String.pm", - "version" : "0.47" + "version" : "0.48" }, "App::Codeowners::Formatter::TSV" : { "file" : "lib/App/Codeowners/Formatter/TSV.pm", - "version" : "0.47" + "version" : "0.48" }, "App::Codeowners::Formatter::Table" : { "file" : "lib/App/Codeowners/Formatter/Table.pm", - "version" : "0.47" + "version" : "0.48" }, "App::Codeowners::Formatter::YAML" : { "file" : "lib/App/Codeowners/Formatter/YAML.pm", - "version" : "0.47" + "version" : "0.48" }, "App::Codeowners::Options" : { "file" : "lib/App/Codeowners/Options.pm", - "version" : "0.47" + "version" : "0.48" }, "App::Codeowners::Util" : { "file" : "lib/App/Codeowners/Util.pm", - "version" : "0.47" + "version" : "0.48" }, "App::Codeowners::Util::Process" : { "file" : "lib/App/Codeowners/Util.pm", - "version" : "0.47" + "version" : "0.48" }, "File::Codeowners" : { "file" : "lib/File/Codeowners.pm", - "version" : "0.47" + "version" : "0.48" }, "Test::File::Codeowners" : { "file" : "lib/Test/File/Codeowners.pm", - "version" : "0.47" + "version" : "0.48" } }, "release_status" : "stable", @@ -177,7 +177,7 @@ "web" : "https://github.com/chazmcgarvey/git-codeowners" } }, - "version" : "0.47", + "version" : "0.48", "x_authority" : "cpan:CCM", "x_generated_by_perl" : "v5.28.0", "x_serialization_backend" : "Cpanel::JSON::XS version 4.15" diff --git a/META.yml b/META.yml index babd239..e4aa077 100644 --- a/META.yml +++ b/META.yml @@ -31,43 +31,43 @@ no_index: provides: App::Codeowners: file: lib/App/Codeowners.pm - version: '0.47' + version: '0.48' App::Codeowners::Formatter: file: lib/App/Codeowners/Formatter.pm - version: '0.47' + version: '0.48' App::Codeowners::Formatter::CSV: file: lib/App/Codeowners/Formatter/CSV.pm - version: '0.47' + version: '0.48' App::Codeowners::Formatter::JSON: file: lib/App/Codeowners/Formatter/JSON.pm - version: '0.47' + version: '0.48' App::Codeowners::Formatter::String: file: lib/App/Codeowners/Formatter/String.pm - version: '0.47' + version: '0.48' App::Codeowners::Formatter::TSV: file: lib/App/Codeowners/Formatter/TSV.pm - version: '0.47' + version: '0.48' App::Codeowners::Formatter::Table: file: lib/App/Codeowners/Formatter/Table.pm - version: '0.47' + version: '0.48' App::Codeowners::Formatter::YAML: file: lib/App/Codeowners/Formatter/YAML.pm - version: '0.47' + version: '0.48' App::Codeowners::Options: file: lib/App/Codeowners/Options.pm - version: '0.47' + version: '0.48' App::Codeowners::Util: file: lib/App/Codeowners/Util.pm - version: '0.47' + version: '0.48' App::Codeowners::Util::Process: file: lib/App/Codeowners/Util.pm - version: '0.47' + version: '0.48' File::Codeowners: file: lib/File/Codeowners.pm - version: '0.47' + version: '0.48' Test::File::Codeowners: file: lib/Test/File/Codeowners.pm - version: '0.47' + version: '0.48' recommends: Pod::Usage: '0' Term::Detect::Software: '0' @@ -93,7 +93,7 @@ resources: bugtracker: https://github.com/chazmcgarvey/git-codeowners/issues homepage: https://github.com/chazmcgarvey/git-codeowners repository: https://github.com/chazmcgarvey/git-codeowners.git -version: '0.47' +version: '0.48' x_authority: cpan:CCM x_generated_by_perl: v5.28.0 x_serialization_backend: 'YAML::Tiny version 1.73' diff --git a/Makefile.PL b/Makefile.PL index ae4b301..100341a 100644 --- a/Makefile.PL +++ b/Makefile.PL @@ -47,7 +47,7 @@ my %WriteMakefileArgs = ( "Test::Exit" => 0, "Test::More" => 0 }, - "VERSION" => "0.47", + "VERSION" => "0.48", "test" => { "TESTS" => "t/*.t" } diff --git a/README b/README index 0b9aa08..9d0b26e 100644 --- a/README +++ b/README @@ -4,7 +4,7 @@ NAME VERSION - version 0.47 + version 0.48 SYNOPSIS diff --git a/bin/git-codeowners b/bin/git-codeowners index 6ea28c6..178f874 100755 --- a/bin/git-codeowners +++ b/bin/git-codeowners @@ -10,7 +10,7 @@ use strict; use App::Codeowners; -our $VERSION = '0.47'; # VERSION +our $VERSION = '0.48'; # VERSION App::Codeowners->main(@ARGV); @@ -26,7 +26,7 @@ git-codeowners - A tool for managing CODEOWNERS files =head1 VERSION -version 0.47 +version 0.48 =head1 SYNOPSIS diff --git a/lib/App/Codeowners.pm b/lib/App/Codeowners.pm index 0a21fb6..5715354 100644 --- a/lib/App/Codeowners.pm +++ b/lib/App/Codeowners.pm @@ -14,7 +14,7 @@ use Encode qw(encode); use File::Codeowners; use Path::Tiny; -our $VERSION = '0.47'; # VERSION +our $VERSION = '0.48'; # VERSION sub main { @@ -177,7 +177,7 @@ sub _command_update { my $template = <<'END'; This file shows mappings between subdirs/files and the individuals and teams who own them. You can read this file yourself or use tools to query it, - so you can quickly determine who to speak with or send pull requests to. ❤️ + so you can quickly determine who to speak with or send pull requests to. Simply write a gitignore pattern followed by one or more names/emails/groups. Examples: @@ -218,7 +218,7 @@ App::Codeowners - A tool for managing CODEOWNERS files =head1 VERSION -version 0.47 +version 0.48 =head1 DESCRIPTION diff --git a/lib/App/Codeowners/Formatter.pm b/lib/App/Codeowners/Formatter.pm index 2f974d8..efb516c 100644 --- a/lib/App/Codeowners/Formatter.pm +++ b/lib/App/Codeowners/Formatter.pm @@ -5,7 +5,7 @@ package App::Codeowners::Formatter; use warnings; use strict; -our $VERSION = '0.47'; # VERSION +our $VERSION = '0.48'; # VERSION use Module::Load; @@ -120,7 +120,7 @@ App::Codeowners::Formatter - Base class for formatting codeowners output =head1 VERSION -version 0.47 +version 0.48 =head1 SYNOPSIS diff --git a/lib/App/Codeowners/Formatter/CSV.pm b/lib/App/Codeowners/Formatter/CSV.pm index 036bb44..3913700 100644 --- a/lib/App/Codeowners/Formatter/CSV.pm +++ b/lib/App/Codeowners/Formatter/CSV.pm @@ -5,7 +5,7 @@ package App::Codeowners::Formatter::CSV; use warnings; use strict; -our $VERSION = '0.47'; # VERSION +our $VERSION = '0.48'; # VERSION use parent 'App::Codeowners::Formatter'; @@ -63,7 +63,7 @@ App::Codeowners::Formatter::CSV - Format codeowners output as comma-separated va =head1 VERSION -version 0.47 +version 0.48 =head1 DESCRIPTION diff --git a/lib/App/Codeowners/Formatter/JSON.pm b/lib/App/Codeowners/Formatter/JSON.pm index 2d1c300..a8a4509 100644 --- a/lib/App/Codeowners/Formatter/JSON.pm +++ b/lib/App/Codeowners/Formatter/JSON.pm @@ -5,7 +5,7 @@ package App::Codeowners::Formatter::JSON; use warnings; use strict; -our $VERSION = '0.47'; # VERSION +our $VERSION = '0.48'; # VERSION use parent 'App::Codeowners::Formatter'; @@ -42,7 +42,7 @@ App::Codeowners::Formatter::JSON - Format codeowners output as JSON =head1 VERSION -version 0.47 +version 0.48 =head1 DESCRIPTION diff --git a/lib/App/Codeowners/Formatter/String.pm b/lib/App/Codeowners/Formatter/String.pm index 6c98c69..c613b47 100644 --- a/lib/App/Codeowners/Formatter/String.pm +++ b/lib/App/Codeowners/Formatter/String.pm @@ -5,7 +5,7 @@ package App::Codeowners::Formatter::String; use warnings; use strict; -our $VERSION = '0.47'; # VERSION +our $VERSION = '0.48'; # VERSION use parent 'App::Codeowners::Formatter'; @@ -136,7 +136,7 @@ App::Codeowners::Formatter::String - Format codeowners output using printf-like =head1 VERSION -version 0.47 +version 0.48 =head1 DESCRIPTION diff --git a/lib/App/Codeowners/Formatter/TSV.pm b/lib/App/Codeowners/Formatter/TSV.pm index 25b8d54..bcc90aa 100644 --- a/lib/App/Codeowners/Formatter/TSV.pm +++ b/lib/App/Codeowners/Formatter/TSV.pm @@ -5,7 +5,7 @@ package App::Codeowners::Formatter::TSV; use warnings; use strict; -our $VERSION = '0.47'; # VERSION +our $VERSION = '0.48'; # VERSION use parent 'App::Codeowners::Formatter::CSV'; @@ -25,7 +25,7 @@ App::Codeowners::Formatter::TSV - Format codeowners output as tab-separated valu =head1 VERSION -version 0.47 +version 0.48 =head1 DESCRIPTION diff --git a/lib/App/Codeowners/Formatter/Table.pm b/lib/App/Codeowners/Formatter/Table.pm index d419333..cba5147 100644 --- a/lib/App/Codeowners/Formatter/Table.pm +++ b/lib/App/Codeowners/Formatter/Table.pm @@ -5,7 +5,7 @@ package App::Codeowners::Formatter::Table; use warnings; use strict; -our $VERSION = '0.47'; # VERSION +our $VERSION = '0.48'; # VERSION use parent 'App::Codeowners::Formatter'; @@ -40,7 +40,7 @@ App::Codeowners::Formatter::Table - Format codeowners output as a table =head1 VERSION -version 0.47 +version 0.48 =head1 DESCRIPTION diff --git a/lib/App/Codeowners/Formatter/YAML.pm b/lib/App/Codeowners/Formatter/YAML.pm index de0bc60..16ef44d 100644 --- a/lib/App/Codeowners/Formatter/YAML.pm +++ b/lib/App/Codeowners/Formatter/YAML.pm @@ -5,7 +5,7 @@ package App::Codeowners::Formatter::YAML; use warnings; use strict; -our $VERSION = '0.47'; # VERSION +our $VERSION = '0.48'; # VERSION use parent 'App::Codeowners::Formatter'; @@ -36,7 +36,7 @@ App::Codeowners::Formatter::YAML - Format codeowners output as YAML =head1 VERSION -version 0.47 +version 0.48 =head1 DESCRIPTION diff --git a/lib/App/Codeowners/Options.pm b/lib/App/Codeowners/Options.pm index 153376f..0cfdf4b 100644 --- a/lib/App/Codeowners/Options.pm +++ b/lib/App/Codeowners/Options.pm @@ -8,7 +8,7 @@ use strict; use Getopt::Long 2.39 (); use Path::Tiny; -our $VERSION = '0.47'; # VERSION +our $VERSION = '0.48'; # VERSION sub pod2usage { eval { require Pod::Usage }; @@ -299,7 +299,7 @@ App::Codeowners::Options - Getopt and shell completion for App::Codeowners =head1 VERSION -version 0.47 +version 0.48 =head1 METHODS diff --git a/lib/App/Codeowners/Util.pm b/lib/App/Codeowners/Util.pm index b816956..8a0b886 100644 --- a/lib/App/Codeowners/Util.pm +++ b/lib/App/Codeowners/Util.pm @@ -23,7 +23,7 @@ our @EXPORT_OK = qw( zip ); -our $VERSION = '0.47'; # VERSION +our $VERSION = '0.48'; # VERSION sub find_nearest_codeowners { @@ -280,7 +280,7 @@ App::Codeowners::Util - Grab bag of utility subs for Codeowners modules =head1 VERSION -version 0.47 +version 0.48 =head1 DESCRIPTION diff --git a/lib/File/Codeowners.pm b/lib/File/Codeowners.pm index 0ae71a8..ee50d99 100644 --- a/lib/File/Codeowners.pm +++ b/lib/File/Codeowners.pm @@ -10,7 +10,7 @@ use Path::Tiny 0.089; use Scalar::Util qw(openhandle); use Text::Gitignore qw(build_gitignore_matcher); -our $VERSION = '0.47'; # VERSION +our $VERSION = '0.48'; # VERSION sub _croak { require Carp; Carp::croak(@_); } sub _usage { _croak("Usage: @_\n") } @@ -65,11 +65,13 @@ sub parse_from_fh { } elsif ($line =~ /^\h*#(.*)/) { my $comment = $1; + my $project; if ($comment =~ /^\h*Project:\h*(.+?)\h*$/i) { - $current_project = $1 || undef; + $project = $current_project = $1 || undef; } $lines[$lineno] = { comment => $comment, + $project ? (project => $project) : (), }; } elsif ($line =~ /^\h*$/) { @@ -278,11 +280,60 @@ sub update_owners { $self->_clear; + my $count = 0; + for my $line (@{$self->_lines}) { next if !$line->{pattern}; next if $pattern ne $line->{pattern}; $line->{owners} = [@$owners]; + ++$count; + } + + return $count; +} + + +sub update_owners_by_project { + my $self = shift; + my $project = shift; + my $owners = shift; + $project && $owners or _usage(q{$codeowners->update_owners_by_project($project => \@owners)}); + + $owners = [$owners] if ref($owners) ne 'ARRAY'; + + $self->_clear; + + my $count = 0; + + for my $line (@{$self->_lines}) { + next if !$line->{project} || !$line->{owners}; + next if $project ne $line->{project}; + $line->{owners} = [@$owners]; + ++$count; } + + return $count; +} + + +sub rename_project { + my $self = shift; + my $old_project = shift; + my $new_project = shift; + $old_project && $new_project or _usage(q{$codeowners->rename_project($project => $new_project)}); + + $self->_clear; + + my $count = 0; + + for my $line (@{$self->_lines}) { + next if !exists $line->{project} || $old_project ne $line->{project}; + $line->{project} = $new_project; + $line->{comment} = " Project: $new_project" if exists $line->{comment}; + ++$count; + } + + return $count; } @@ -354,7 +405,7 @@ File::Codeowners - Read and write CODEOWNERS files =head1 VERSION -version 0.47 +version 0.48 =head1 METHODS @@ -466,6 +517,22 @@ multiple such patterns, they will all be updated. Nothing happens if the file does not already have at least one such pattern. +=head2 update_owners_by_project + + $codeowners->update_owners_by_project($project => \@new_owners); + +Set a new set of owners for all patterns under the given project. + +Nothing happens if the file does not have a project with the given name. + +=head2 rename_project + + $codeowners->rename_project($old_name => $new_name); + +Rename a project. + +Nothing happens if the file does not have a project with the old name. + =head2 append $codeowners->append(comment => $str); diff --git a/lib/Test/File/Codeowners.pm b/lib/Test/File/Codeowners.pm index 14d4c2d..7d537c2 100644 --- a/lib/Test/File/Codeowners.pm +++ b/lib/Test/File/Codeowners.pm @@ -10,7 +10,7 @@ use Encode qw(encode); use File::Codeowners; use Test::Builder; -our $VERSION = '0.47'; # VERSION +our $VERSION = '0.48'; # VERSION my $Test = Test::Builder->new; @@ -88,7 +88,7 @@ Test::File::Codeowners - Write tests for CODEOWNERS files =head1 VERSION -version 0.47 +version 0.48 =head1 SYNOPSIS diff --git a/t/file-codeowners.t b/t/file-codeowners.t index a50a050..7bfb53c 100644 --- a/t/file-codeowners.t +++ b/t/file-codeowners.t @@ -94,6 +94,30 @@ subtest 'parse errors', sub { like($@, qr/^Parse error on line 1/, 'parse error'); }; +subtest 'handling projects', sub { + my $file = File::Codeowners->parse("$Bin/samples/kitchensink.CODEOWNERS"); + my $r; + + is_deeply($r = $file->projects, [ + 'Transportation', + ], 'projects listed') or diag explain $r; + + $file->rename_project('Transportation', 'Getting Around'); + is_deeply($r = $file->projects, [ + 'Getting Around', + ], 'project renamed') or diag explain $r; + + is_deeply($r = [@{$file->_lines}[-3 .. -1]], [ + {comment => ' Project: Getting Around', project => 'Getting Around'}, + {}, + {pattern => '/vehicles/**/batmobile.cad', 'owners' => ['@"Lucius Fox"'], project => 'Getting Around'}, + ], 'renaming project properly modifies lines') or diag explain $r; + + $file->update_owners_by_project('Getting Around', '@twoface'); + ok( scalar grep { $_ eq '@twoface' } @{$file->owners}, 'updating owner adds new owner'); + ok(!scalar grep { $_ eq '@"Lucius Fox"' } @{$file->owners}, 'updating owner removes old owner'); +}; + subtest 'editing and writing files', sub { my $file = File::Codeowners->parse("$Bin/samples/basic.CODEOWNERS"); my $r;