File Coverage

blib/lib/Dist/Zilla/PluginBundle/Author/ETHER.pm
Criterion Covered Total %
statement 73 74 98.6
branch 3 6 50.0
condition 1 9 11.1
subroutine 24 25 96.0
pod 0 3 0.0
total 101 117 86.3


line stmt bran cond sub pod time code
1 21     21   16767259 use strict;
  21         201  
  21         705  
2 21     21   119 use warnings;
  21         45  
  21         1664  
3             package Dist::Zilla::PluginBundle::Author::ETHER; # git description: v0.161-6-g8e9216b
4             # vim: set ts=8 sts=2 sw=2 tw=100 et :
5             # ABSTRACT: A plugin bundle for distributions built by ETHER
6             # KEYWORDS: author bundle distribution tool
7              
8             our $VERSION = '0.162';
9              
10 21     21   1384 use if "$]" >= 5.022, experimental => 're_strict';
  21         72  
  21         258  
11 21     21   2709 no if "$]" >= 5.031009, feature => 'indirect';
  21         65  
  21         188  
12 21     21   967 no if "$]" >= 5.033001, feature => 'multidimensional';
  21         57  
  21         142  
13 21     21   963 no if "$]" >= 5.033006, feature => 'bareword_filehandles';
  21         55  
  21         121  
14 21     21   8978 use Moose;
  21         5088451  
  21         173  
15             with
16             'Dist::Zilla::Role::PluginBundle::Easy',
17             'Dist::Zilla::Role::PluginBundle::PluginRemover' => { -version => '0.103' },
18             'Dist::Zilla::Role::PluginBundle::Config::Slicer';
19              
20 21     21   171896 use Dist::Zilla::Util;
  21         344551  
  21         976  
21 21     21   192 use Moose::Util::TypeConstraints qw(enum subtype where class_type);
  21         64  
  21         254  
22 21     21   17690 use List::Util 1.45 qw(first any uniq none);
  21         514  
  21         1878  
23 21     21   159 use Module::Runtime qw(require_module use_module);
  21         66  
  21         193  
24 21     21   11842 use Devel::CheckBin 'can_run';
  21         2078367  
  21         1644  
25 21     21   197 use Path::Tiny;
  21         96  
  21         1064  
26 21     21   11979 use CPAN::Meta 2.150006; # for x_* preservation
  21         603700  
  21         758  
27 21     21   204 use CPAN::Meta::Requirements;
  21         64  
  21         501  
28 21     21   12611 use Term::ANSIColor 'colored';
  21         161481  
  21         17193  
29             eval { +require Win32::Console::ANSI } if $^O eq 'MSWin32';
30 21     21   216 use Config;
  21         53  
  21         891  
31 21     21   142 use Try::Tiny;
  21         65  
  21         1647  
32 21     21   8599 use URI::Escape 'uri_escape';
  21         25793  
  21         1424  
33 21     21   213 use namespace::autoclean;
  21         83  
  21         468  
34              
35             sub mvp_multivalue_args { qw(installer copy_file_from_release) }
36              
37             # Note: no support yet for depending on a specific version of the plugin --
38             # but [PromptIfStale] generally makes that unnecessary
39             has installer => (
40             isa => 'ArrayRef[Str]',
41             init_arg => undef,
42             lazy => 1,
43             default => sub {
44             my $self = shift;
45              
46             return [ 'MakeMaker::Fallback', 'ModuleBuildTiny::Fallback' ]
47             if not exists $self->payload->{installer};
48              
49             # remove 'none' from installer list
50             return [ grep $_ ne 'none', @{ $self->payload->{installer} } ];
51             },
52             traits => ['Array'],
53             handles => { installer => 'elements' },
54             );
55              
56             has server => (
57             is => 'ro', isa => enum([qw(github gitmo p5sagit catagits none)]),
58             init_arg => undef,
59             lazy => 1,
60             default => sub { $_[0]->payload->{server} // 'github' },
61             );
62              
63             has bugtracker => (
64             is => 'ro', isa => enum([qw(rt github)]),
65             init_arg => undef,
66             lazy => 1,
67             default => sub {
68             my $bugtracker = $_[0]->payload->{bugtracker} // 'rt';
69             die 'bugtracker cannot be github unless server = github'
70             if $bugtracker eq 'github' and $_[0]->server ne 'github';
71             $bugtracker;
72             },
73             );
74              
75             has surgical_podweaver => (
76             is => 'ro', isa => 'Bool',
77             init_arg => undef,
78             lazy => 1,
79             default => sub { $_[0]->payload->{surgical_podweaver} // 0 },
80             );
81              
82             has airplane => (
83             is => 'ro', isa => 'Bool',
84             init_arg => undef,
85             lazy => 1,
86             default => sub { $ENV{DZIL_AIRPLANE} || $_[0]->payload->{airplane} // 0 },
87             );
88              
89             has copy_file_from_release => (
90             isa => 'ArrayRef[Str]',
91             init_arg => undef,
92             lazy => 1,
93             default => sub { $_[0]->payload->{copy_file_from_release} // [] },
94             traits => ['Array'],
95             handles => { copy_files_from_release => 'elements' },
96             );
97              
98             around copy_files_from_release => sub {
99             my $orig = shift; my $self = shift;
100             sort(uniq($self->$orig(@_),
101             qw(LICENCE LICENSE CONTRIBUTING ppport.h INSTALL),
102             $self->cpanfile ? 'cpanfile' : (),
103             ));
104             };
105              
106             sub commit_files_after_release {
107 40     40 0 369 grep -e, sort(uniq('README.md', 'README.pod', 'Changes', shift->copy_files_from_release));
108             }
109              
110             has changes_version_columns => (
111             is => 'ro', isa => subtype('Int', where { $_ > 0 && $_ < 20 }),
112             init_arg => undef,
113             lazy => 1,
114             default => sub { $_[0]->payload->{changes_version_columns} // 10 },
115             );
116              
117             has licence => (
118             is => 'ro', isa => 'Str',
119             init_arg => undef,
120             lazy => 1,
121             default => sub {
122             my $self = shift;
123             my $authority = $self->authority;
124             $self->payload->{licence}
125             // $self->payload->{license}
126             # licenSe is US-only; known non-American authors will be treated appropriately.
127             // ((any { $authority eq "cpan:$_" }
128             qw(ETHER ABERGMAN AVAR BINGOS BOBTFISH CHANSEN CHOLET DOHERTY FLORA GAAS GETTY GSAR ILMARI JAWNSY JQUELIN LBROCARD LEONT LLAP MANWAR MSTROUT NEILB NUFFIN OALDERS PERIGRIN PHAYLON RELEQUEST SALVA))
129             ? 'LICENCE' : 'LICENSE');
130             },
131             );
132              
133             has authority => (
134             is => 'ro', isa => 'Str',
135             init_arg => undef,
136             lazy => 1,
137             default => sub {
138             my $self = shift;
139              
140             # we could warn about this, but then we'd have to change configs (and bump prereqs) for an awful lot of
141             # distributions.
142             return $self->payload->{'Authority.authority'}
143             if exists $self->payload->{'Authority.authority'};
144              
145             $self->payload->{authority} // 'cpan:ETHER';
146             },
147             );
148              
149             has fake_release => (
150             is => 'ro', isa => 'Bool',
151             init_arg => undef,
152             lazy => 1,
153             default => sub { $ENV{FAKE_RELEASE} || $_[0]->payload->{fake_release} // 0 },
154             );
155              
156             has plugin_prereq_phase => (
157             is => 'ro',
158             isa => 'Str',
159             lazy => 1,
160             default => sub { $_[0]->payload->{plugin_prereq_phase} // 'x_Dist_Zilla' },
161             );
162              
163             has plugin_prereq_relationship => (
164             is => 'ro',
165             isa => 'Str',
166             lazy => 1,
167             default => sub { $_[0]->payload->{plugin_prereq_relationship} // 'requires' },
168             );
169              
170             has cpanfile => (
171             is => 'ro', isa => 'Bool',
172             init_arg => undef,
173             lazy => 1,
174             default => sub { $_[0]->payload->{cpanfile} // 0 },
175             );
176              
177             sub pause_cfg_file () { '.pause' }
178 0 0 0 0 0 0 sub pause_cfg_dir () { $^O eq 'MSWin32' && "$]" < 5.016 ? $ENV{HOME} || $ENV{USERPROFILE} : (<~>)[0] }
      0        
179              
180             my $_pause_config;
181             sub _pause_config {
182             return $_pause_config if $_pause_config;
183              
184             # stolen shamelessly from Dist::Zilla::Plugin::UploadToCPAN
185             my $self = shift;
186             require CPAN::Uploader;
187             my $file = $self->pause_cfg_file;
188             $file = File::Spec->catfile($self->pause_cfg_dir, $file)
189             unless File::Spec->file_name_is_absolute($file);
190             return {} unless -e $file && -r _;
191             my $cfg = try {
192             CPAN::Uploader->read_config_file($file)
193             } catch {
194             warn "[\@Author::ETHER] Couldn't load credentials from '$file': $_";
195             {};
196             };
197             return $cfg;
198             }
199              
200             sub _pause_download_url {
201 40     40   137 my $self = shift;
202 40         129 my ($username, $password) = @{$self->_pause_config}{qw(user password)};
  40         560  
203 40 50 33     1545 return if not $username or not $password;
204 40         583 $password = uri_escape($password) =~ s/%/%%/gr;
205 40         2793 'http://'.$username.':'.$password.'@pause.perl.org/pub/PAUSE/authors/id/'.substr($username, 0, 1).'/'.substr($username,0,2).'/'.$username.'/%a';
206             }
207              
208             # configs are applied when plugins match ->isa($key) or ->does($key)
209             my %extra_args = (
210             'Dist::Zilla::Plugin::MakeMaker' => { 'eumm_version' => '0' },
211             'Dist::Zilla::Plugin::ModuleBuildTiny' => { ':version' => '0.012', version_method => 'conservative', static => 'auto' },
212             'Dist::Zilla::Plugin::MakeMaker::Fallback' => { ':version' => '0.029' },
213             # default_jobs is no-op until Dist::Zilla 5.014
214             'Dist::Zilla::Role::TestRunner' => { default_jobs => 9 },
215             'Dist::Zilla::Plugin::ModuleBuild' => { mb_version => '0.28' },
216             'Dist::Zilla::Plugin::ModuleBuildTiny::Fallback' => { ':version' => '0.018', version_method => 'conservative', static => 'auto' },
217             );
218              
219             # plugins that use the network when they run
220             sub _network_plugins {
221 5     5   3438663 qw(
222             PromptIfStale
223             Test::Pod::LinkCheck
224             Test::Pod::No404s
225             Git::Remote::Check
226             CheckPrereqsIndexed
227             CheckIssues
228             UploadToCPAN
229             Git::Push
230             );
231             }
232              
233             has _has_bash => (
234             is => 'ro',
235             isa => 'Bool',
236             lazy => 1,
237             default => sub { !!can_run('bash') },
238             );
239              
240             # note this is applied to the plugin list in Dist::Zilla::Role::PluginBundle::PluginRemover,
241             # but we also need to use it here to be sure we are not adding configs that are only needed
242             # by plugins that will be subsequently removed.
243             has _removed_plugins => (
244             isa => 'HashRef[Str]',
245             init_arg => undef,
246             lazy => 1,
247             default => sub {
248             my $self = shift;
249             my $remove = $self->payload->{ $self->plugin_remover_attribute } // [];
250             my %removed; @removed{@$remove} = (!!1) x @$remove;
251             \%removed;
252             },
253             traits => ['Hash'],
254             handles => { _plugin_removed => 'exists', _removed_plugins => 'keys' },
255             );
256              
257             # this attribute and its supporting code is a candidate to be extracted out into its own role,
258             # for re-use in other bundles
259             has _plugin_requirements => (
260             isa => class_type('CPAN::Meta::Requirements'),
261             lazy => 1,
262             default => sub { CPAN::Meta::Requirements->new },
263             handles => {
264             _add_minimum_plugin_requirement => 'add_minimum',
265             _plugin_requirements_as_string_hash => 'as_string_hash',
266             },
267             );
268              
269             # files that might be in the repository that should never be gathered
270             my @never_gather = grep -e, qw(
271             Makefile.PL ppport.h README.md README.pod META.json
272             cpanfile TODO CONTRIBUTING LICENCE LICENSE INSTALL
273             inc/ExtUtils/MakeMaker/Dist/Zilla/Develop.pm
274             );
275              
276             sub BUILD {
277 43     43 0 472687 my $self = shift;
278              
279 43 100       2270 if ($self->airplane) {
280 3         34 warn '[@Author::ETHER] ' . colored('building in airplane mode - plugins requiring the network are skipped, and releases are not permitted', 'yellow') . "\n";
281              
282             # doing this before running configure means we can be sure we update the removal list before
283             # our _removed_plugins attribute is built.
284 3         257 push @{ $self->payload->{ $self->plugin_remover_attribute } }, $self->_network_plugins;
  3         114  
285             }
286             }
287              
288             sub configure {
289             my $self = shift;
290              
291             warn '[DZ] Building with ', blessed($self), ' ', $VERSION, "...\n"
292             if not $INC{'Test/More.pm'};
293              
294             warn '[@Author::ETHER] no "bash" executable found; skipping Run::AfterBuild command to update .ackrc', "\n"
295             if not $INC{'Test/More.pm'} and not $self->_has_bash;
296              
297             # NOTE! since the working directory has not changed to $zilla->root yet
298             # (and in future versions of Dist::Zilla, it may never change...)
299             # if running this code via a different mechanism than dzil <command>, file
300             # operations may be looking at the wrong directory! Take this into
301             # consideration when running tests!
302              
303             my $has_xs = glob('*.xs') ? 1 : 0;
304             warn '[@Author::ETHER] XS-based distribution detected.', "\n" if $has_xs;
305             die '[@Author::ETHER] no Makefile.PL found in the repository root: this is not very nice for contributors!', "\n"
306             if $has_xs and not -e 'Makefile.PL';
307              
308             # check for a bin/ that should probably be renamed to script/
309             warn '[@Author::ETHER] ', colored('bin/ detected - should this be moved to script/, so its contents can be installed into $PATH?', 'bright_red'), "\n"
310             if -d 'bin' and any { $_ eq 'ModuleBuildTiny' } $self->installer;
311              
312             warn '[@Author::ETHER] ', colored('You are using [ModuleBuild] as an installer, WTF?!', 'bright_red'), "\n"
313             if any { $_->isa('Dist::Zilla::Plugin::ModuleBuild') }
314             map Dist::Zilla::Util->expand_config_package_name($_), $self->installer;
315              
316             # this is better than injecting a perl prereq for 5.008, to allow MBT to
317             # become more 5.006-compatible in the future without forcing the distribution to be re-released.
318             die 'Module::Build::Tiny should not be used in distributions that are targeting perl 5.006!'
319             if any { /ModuleBuildTiny/ } $self->installer
320             and (not exists $self->payload->{'Test::MinimumVersion.max_target_perl'}
321             or $self->payload->{'Test::MinimumVersion.max_target_perl'} < '5.008');
322              
323             warn '[@Author::ETHER] ', colored('.git is missing and META.json is present -- this looks like a CPAN download rather than a git repository. You should probably run '
324             . (-f 'Build.PL' ? 'perl Build.PL; ./Build' : 'perl Makefile.PL; make') . ' instead of using dzil commands!', 'yellow'), "\n"
325             if not -d '.git' and -f 'META.json' and not $self->_plugin_removed('Git::GatherDir');
326              
327             # only set x_static_install using auto mode for my own distributions
328             # (for all other distributions, set explicitly to on or off)
329             # Note that this is just the default; if a dist.ini changed these values, ConfigSlicer will apply it later
330             my $static_install_mode = $self->payload->{'StaticInstall.mode'} // 'auto';
331             my $static_install_dry_run = ($static_install_mode eq 'auto'
332             and $self->authority ne 'cpan:ETHER') ? 1 : 0;
333              
334             warn '[@Author::ETHER] ', colored('server = ' . $self->server
335             . ': recommend instead using server = github and GithubMeta.remote = '
336             . $self->server . ' with a read-only mirror', 'yellow'), "\n"
337             if $self->server ne 'github' and $self->server ne 'none';
338              
339             # method modifier will also apply default configs, compile plugin prereqs
340             $self->add_plugins(
341             # adding this first indicates the start of the bundle in x_Dist_Zilla metadata
342             [ 'Prereqs' => 'pluginbundle version' => {
343             '-phase' => 'develop', '-relationship' => 'recommends',
344             $self->meta->name => $self->VERSION,
345             } ],
346              
347             # VersionProvider
348             # see [@Git::VersionManager]
349              
350             # Before Build
351             # [ 'EnsurePrereqsInstalled' ], # FIXME: use options to make this less annoying!
352             [ 'PromptIfStale' => 'stale modules, build' => { phase => 'build', module => [ $self->meta->name ] } ],
353              
354             # ExecFiles
355             (-d ($self->payload->{'ExecDir.dir'} // 'script') || any { /^ExecDir\./ } keys %{ $self->payload })
356             ? [ 'ExecDir' => { dir => 'script' } ] : (),
357              
358             # Finders
359             [ 'FileFinder::ByName' => Examples => { dir => 'examples' } ],
360              
361             # Gather Files
362             [ 'Git::GatherDir' => { ':version' => '2.016', @never_gather ? ( exclude_filename => \@never_gather) : () } ],
363              
364             qw(MetaYAML MetaJSON Readme Manifest),
365              
366             $self->cpanfile ? [ 'CPANFile' ] : (),
367              
368             [ 'License' => { ':version' => '5.038', filename => $self->licence } ],
369             [ 'GenerateFile::FromShareDir' => 'generate CONTRIBUTING' => { -dist => 'Dist-Zilla-PluginBundle-Author-ETHER', -filename => 'CONTRIBUTING', has_xs => $has_xs } ],
370             [ 'InstallGuide' => { ':version' => '1.200005' } ],
371              
372             [ 'Test::Compile' => { ':version' => '2.039', bail_out_on_fail => 1, xt_mode => 1,
373             script_finder => [qw(:PerlExecFiles @Author::ETHER/Examples)] } ],
374             [ 'Test::NoTabs' => { ':version' => '0.08', finder => [qw(:InstallModules :ExecFiles @Author::ETHER/Examples :TestFiles :ExtraTestFiles)] } ],
375             [ 'Test::EOL' => { ':version' => '0.17', finder => [qw(:InstallModules :ExecFiles @Author::ETHER/Examples :TestFiles :ExtraTestFiles)] } ],
376             'MetaTests',
377             [ 'Test::CPAN::Changes' => { ':version' => '0.012' } ],
378             'Test::ChangesHasContent',
379             [ 'Test::MinimumVersion' => { ':version' => '2.000010', max_target_perl => '5.006' } ],
380             [ 'PodSyntaxTests' => { ':version' => '5.040' } ],
381             [ 'PodCoverageTests' => { ':version' => '5.040' } ],
382             [ 'Test::PodSpelling' => { ':version' => '2.006003', stopwords => ['irc'], directories => [qw(examples lib script t xt)] } ],
383             #[Test::Pod::LinkCheck] many outstanding bugs
384             ($ENV{CONTINUOUS_INTEGRATION} ? () : [ 'Test::Pod::No404s' => { ':version' => '1.003' } ] ),
385             [ 'Test::Kwalitee' => { ':version' => '2.10', filename => 'xt/author/kwalitee.t' } ],
386             [ 'MojibakeTests' => { ':version' => '0.8' } ],
387             [ 'Test::ReportPrereqs' => { ':version' => '0.022', verify_prereqs => 1,
388             version_extractor => ( ( any { $_ ne 'MakeMaker' } $self->installer ) ? 'Module::Metadata' : 'ExtUtils::MakeMaker' ),
389             include => [ sort qw(autodie Encode File::Temp JSON::PP Module::Runtime Sub::Name YAML),
390             $self->_plugin_removed('PodCoverageTests') ? () : 'Pod::Coverage' ] } ],
391             [ 'Test::Portability' => { ':version' => '2.000007' } ],
392             [ 'Test::CleanNamespaces' => { ':version' => '0.006' } ],
393              
394              
395             # Munge Files
396             [ 'Git::Describe' => { ':version' => '0.004', on_package_line => 1 } ],
397             [
398             ($self->surgical_podweaver ? 'SurgicalPodWeaver' : 'PodWeaver') => {
399             $self->surgical_podweaver ? () : ( ':version' => '4.008' ),
400             -f 'weaver.ini' ? () : ( config_plugin => '@Author::ETHER' ),
401             replacer => 'replace_with_comment',
402             post_code_replacer => 'replace_with_nothing',
403             }
404             ],
405              
406             # Metadata
407             $self->server eq 'github' ? [ 'GithubMeta' => {
408             ':version' => '0.54',
409             homepage => 0,
410             issues => ($self->bugtracker eq 'github' ? 1 : 0),
411             } ] : (),
412             [ 'AutoMetaResources' => {
413             $self->bugtracker eq 'rt' ? ( 'bugtracker.rt' => 1 ) : (),
414             $self->server eq 'gitmo' ? ( 'repository.gitmo' => 1 )
415             : $self->server eq 'p5sagit' ? ( 'repository.p5sagit' => 1 )
416             : $self->server eq 'catagits' ? ( 'repository.catagits' => 1 )
417             : ()
418             } ],
419             [ 'Authority' => { ':version' => '1.009', authority => $self->authority, do_munging => 0 } ],
420             [ 'MetaNoIndex' => { directory => [ qw(t xt), grep -d, qw(inc local perl5 fatlib examples share corpus demo) ] } ],
421             [ 'MetaProvides::Package' => { ':version' => '1.15000002', finder => ':InstallModules', meta_noindex => 1, inherit_version => 0, inherit_missing => 0 } ],
422             'MetaConfig',
423             [ 'Keywords' => { ':version' => '0.004' } ],
424             ($Config{default_inc_excludes_dot} ? [ 'UseUnsafeInc' => { dot_in_INC => 0 } ] : ()),
425             # [Git::Contributors]
426             # [StaticInstall]
427              
428             # Register Prereqs
429             # (MakeMaker or other installer)
430             [ 'AutoPrereqs' => { ':version' => '5.038' } ],
431             [ 'Prereqs::AuthorDeps' => { ':version' => '0.006', phase => $self->plugin_prereq_phase, relation => $self->plugin_prereq_relationship } ],
432             [ 'MinimumPerl' => { ':version' => '1.006', configure_finder => ':NoFiles' } ],
433             ($self->surgical_podweaver ? [ 'Prereqs' => pod_weaving => {
434             '-phase' => $self->plugin_prereq_phase,
435             '-relationship' => $self->plugin_prereq_relationship,
436             'Dist::Zilla::Plugin::SurgicalPodWeaver' => 0
437             } ] : ()),
438              
439             # Install Tool (some are also Test Runners)
440             $self->installer, # options are set lower down, via %extra_args
441              
442             # we prefer this to run after other Register Prereqs plugins
443             [ 'Git::Contributors' => { ':version' => '0.029', order_by => 'commits' } ],
444              
445             # must appear after installers; also note that MBT::*'s static tweak is consequently adjusted, later
446             [ 'StaticInstall' => { ':version' => '0.005', mode => $static_install_mode, dry_run => $static_install_dry_run } ],
447              
448             # Test Runners (load after installers to avoid a rebuild)
449             [ 'RunExtraTests' => { ':version' => '0.024' } ],
450              
451             # After Build
452             'CheckSelfDependency',
453              
454             ( $self->_has_bash ?
455             [ 'Run::AfterBuild' => '.ackrc' => { ':version' => '0.038', quiet => 1, run => q{bash -c "test -e .ackrc && grep -q -- '--ignore-dir=.latest' .ackrc || echo '--ignore-dir=.latest' >> .ackrc; if [[ `dirname '%d'` != .build ]]; then test -e .ackrc && grep -q -- '--ignore-dir=%d' .ackrc || echo '--ignore-dir=%d' >> .ackrc; fi"} } ]
456             : ()),
457             [ 'Run::AfterBuild' => '.latest' => { ':version' => '0.041', quiet => 1, fatal_errors => 0, eval => q!if ('%d' =~ /^%n-[.[:xdigit:]]+$/) { unlink '.latest'; symlink '%d', '.latest'; }! } ],
458              
459              
460             # Before Release
461             [ 'CheckStrictVersion' => { decimal_only => 1 } ],
462             'CheckMetaResources',
463             'EnsureLatestPerl',
464             [ 'PromptIfStale' => 'stale modules, release' => { phase => 'release', check_all_plugins => 1, check_all_prereqs => 1 } ],
465              
466             # if in airplane mode, allow our uncommitted dist.ini edit which sets 'airplane = 1'
467             [ 'Git::Check' => 'initial check' => { allow_dirty => [ $self->airplane ? 'dist.ini' : '' ] } ],
468              
469             'Git::CheckFor::MergeConflicts',
470             [ 'Git::CheckFor::CorrectBranch' => { ':version' => '0.004', release_branch => 'master' } ],
471             [ 'Git::Remote::Check' => { branch => 'master', remote_branch => 'master' } ],
472             [ 'CheckPrereqsIndexed' => { ':version' => '0.019' } ],
473             'TestRelease',
474             [ 'Git::Check' => 'after tests' => { allow_dirty => [''] } ],
475             'CheckIssues',
476             # (ConfirmRelease)
477              
478             # Releaser
479             $self->fake_release
480             ? do { warn '[@Author::ETHER] ', colored('FAKE_RELEASE set - not uploading to CPAN', 'yellow'), "\n"; 'FakeRelease' }
481             : 'UploadToCPAN',
482              
483             # After Release
484             ( $self->licence eq 'LICENSE' && -e 'LICENCE' ?
485             [ 'Run::AfterRelease' => 'remove old LICENCE' => { ':version' => '0.038', quiet => 1, eval => q!unlink 'LICENCE'! } ]
486             : ()),
487             ( $self->licence eq 'LICENCE' && -e 'LICENSE' ?
488             [ 'Run::AfterRelease' => 'remove old LICENSE' => { ':version' => '0.038', quiet => 1, eval => q!unlink 'LICENSE'! } ]
489             : ()),
490             ( -e 'README.md' ?
491             [ 'Run::AfterRelease' => 'remove old READMEs' => { ':version' => '0.038', quiet => 1, eval => q!unlink 'README.md'! } ]
492             : ()),
493              
494             [ 'CopyFilesFromRelease' => 'copy generated files' => { filename => [ $self->copy_files_from_release ] } ],
495             [ 'ReadmeAnyFromPod' => { ':version' => '0.142180', type => 'pod', location => 'root', phase => 'release' } ],
496             );
497              
498             # plugins to do with calculating, munging, incrementing versions
499             $self->add_bundle('@Git::VersionManager' => {
500             # Take care! runtime-requires prereqs needs to be updated in dist.ini when this is changed.
501             ':version' => '0.007',
502              
503             'RewriteVersion::Transitional.:version' => 0.006,
504             'RewriteVersion::Transitional.global' => 1,
505             'RewriteVersion::Transitional.fallback_version_provider' => 'Git::NextVersion',
506             'RewriteVersion::Transitional.version_regexp' => '^v([\d._]+)(-TRIAL)?$',
507              
508             # for first Git::Commit
509             commit_files_after_release => [ $self->commit_files_after_release ],
510             # because of [Git::Check], only files copied from the release would be added -- there is nothing else
511             # hanging around in the current directory
512             'release snapshot.add_files_in' => ['.'],
513             'release snapshot.commit_msg' => '%N-%v%t%n%n%c',
514              
515             'Git::Tag.tag_message' => 'v%v%t',
516              
517             # if the caller set bump_only_matching_versions, then this global setting falls on the floor automatically
518             # because the bundle uses the non-Transitional plugin in that case.
519             'BumpVersionAfterRelease::Transitional.global' => 1,
520             'BumpVersionAfterRelease::Transitional.finder' => [ ':InstallModules' ], # removed :ExecFiles
521              
522             'NextRelease.:version' => '5.033',
523             'NextRelease.time_zone' => 'UTC',
524             'NextRelease.format' => '%-' . ($self->changes_version_columns - 2) . 'v %{yyyy-MM-dd HH:mm:ss\'Z\'}d%{ (TRIAL RELEASE)}T',
525              
526             # 0.003 and earlier uses develop-suggests unconditionally, so we need not specify a minimum version
527             # for the default case here.
528             plugin_prereq_phase => $self->plugin_prereq_phase,
529             plugin_prereq_relationship => $self->plugin_prereq_relationship,
530             });
531              
532             $self->add_plugins(
533             'Git::Push',
534             $self->server eq 'github' ? [ 'GitHub::Update' => { ':version' => '0.40', metacpan => 1 } ] : (),
535             );
536              
537             # install with an author-specific URL from PAUSE, so cpanm-reporter knows where to submit the report
538             # hopefully the file is available at this location soonish after release!
539             my $pause_download_url = $self->_pause_download_url;;
540             $self->add_plugins(
541             [ 'Run::AfterRelease' => 'install release' => {
542             ':version' => '0.031', fatal_errors => 0, run => 'cpanm '.$pause_download_url } ],
543             ) if $pause_download_url;
544              
545             # halt release after pre-release checks, but before ConfirmRelease
546             $self->add_plugins('BlockRelease') if $self->airplane;
547              
548             $self->add_plugins(
549             [ 'Run::AfterRelease' => 'release complete' => { ':version' => '0.038', quiet => 1, eval => [ qq{print "release complete!\\xa"} ] } ],
550             # listed late, to allow all other plugins which do BeforeRelease checks to run first.
551             'ConfirmRelease',
552             );
553              
554             # if ModuleBuildTiny(::*) is being used, disable its static option if
555             # [StaticInstall] is being run with mode=off or dry_run=1
556             if (($static_install_mode eq 'off' or $static_install_dry_run)
557             and any { /^ModuleBuildTiny/ } $self->installer) {
558             my $mbt = Dist::Zilla::Util->expand_config_package_name('ModuleBuildTiny');
559             my $mbt_spec = first { $_->[1] =~ /^$mbt/ } @{ $self->plugins };
560              
561             $mbt_spec->[-1]{static} = 'no';
562             }
563              
564             # add used plugins to desired prereq section
565             $self->add_plugins(
566             [ 'Prereqs' => 'prereqs for @Author::ETHER' => {
567             '-phase' => $self->plugin_prereq_phase,
568             '-relationship' => $self->plugin_prereq_relationship,
569             %{ $self->_plugin_requirements_as_string_hash } } ]
570             ) if $self->plugin_prereq_phase and $self->plugin_prereq_relationship;
571              
572             # listed last, to be sure we run at the very end of each phase
573             $self->add_plugins(
574             [ 'VerifyPhases' => 'PHASE VERIFICATION' => { ':version' => '0.015' } ]
575             ) if ($ENV{USER} // '') eq 'ether';
576             }
577              
578             # determine plugin prereqs, and apply default configs (respecting superclasses, roles)
579             around add_plugins => sub {
580             my ($orig, $self, @plugins) = @_;
581              
582             @plugins = grep {
583             my $plugin = $_;
584             my $plugin_package = Dist::Zilla::Util->expand_config_package_name($plugin->[0]);
585             none {
586             $plugin_package eq Dist::Zilla::Util->expand_config_package_name($_) # match by package name
587             or ($plugin->[1] and not ref $plugin->[1] and $plugin->[1] eq $_) # match by moniker
588             } $self->_removed_plugins
589             } map +(ref $_ ? $_ : [ $_ ]), @plugins;
590              
591             foreach my $plugin_spec (@plugins) {
592             # these should never be added as plugin prereqs
593             next if $plugin_spec->[0] eq 'BlockRelease' # temporary use during development
594             or $plugin_spec->[0] eq 'VerifyPhases'; # only used by ether, not others
595              
596             my $plugin = Dist::Zilla::Util->expand_config_package_name($plugin_spec->[0]);
597             require_module($plugin);
598              
599             push @$plugin_spec, {} if not ref $plugin_spec->[-1];
600             my $payload = $plugin_spec->[-1];
601              
602             foreach my $module (grep +($plugin->isa($_) or $plugin->does($_)), keys %extra_args) {
603             my %configs = %{ $extra_args{$module} }; # copy, not reference!
604              
605             # don't keep :version unless it matches the package exactly, but still respect the prereq
606             $self->_add_minimum_plugin_requirement($module => delete $configs{':version'})
607             if exists $configs{':version'} and $module ne $plugin;
608              
609             # we don't need to worry about overwriting the payload with defaults, as
610             # ConfigSlicer will copy them back over later on.
611             @{$payload}{keys %configs} = values %configs;
612             }
613              
614             # record prereq (and version) for later possible injection
615             # (Note: this depends on $CWD being equal to $zilla->root)
616             $self->_add_minimum_plugin_requirement($plugin => $payload->{':version'} // 0)
617             if not -f do { (my $filename = $plugin) =~ s{::}{/}g; $filename .= '.pm' };
618             }
619              
620             return $self->$orig(@plugins);
621             };
622              
623             around add_bundle => sub {
624             my ($orig, $self, $bundle, $payload) = @_;
625              
626             return if $self->_plugin_removed($bundle);
627              
628             my $package = Dist::Zilla::Util->expand_config_package_name($bundle);
629             &use_module(
630             $package,
631             $payload && $payload->{':version'} ? $payload->{':version'} : (),
632             );
633              
634             # default configs can be passed in directly - no need to consult %extra_args
635              
636             # record plugin prereq of bundle only, not its components (it should do that itself)
637             $self->_add_minimum_plugin_requirement($package => $payload->{':version'} // 0);
638              
639             # allow config slices to propagate down from the user
640             $payload = {
641             %$payload, # caller bundle's default settings for this bundle, passed to this sub
642             # custom configs from the user, which may override defaults
643             (map +($_ => $self->payload->{$_}), grep /^(.+?)\.(.+?)/, keys %{ $self->payload }),
644             };
645              
646             # allow the user to say -remove = <plugin added in subbundle>, but also do not override
647             # any removals that were passed into this sub directly.
648             push @{$payload->{-remove}}, @{ $self->payload->{ $self->plugin_remover_attribute } }
649             if $self->payload->{ $self->plugin_remover_attribute };
650              
651             return $self->$orig($bundle, $payload);
652             };
653              
654             __PACKAGE__->meta->make_immutable;
655              
656             __END__
657              
658             =pod
659              
660             =encoding UTF-8
661              
662             =head1 NAME
663              
664             Dist::Zilla::PluginBundle::Author::ETHER - A plugin bundle for distributions built by ETHER
665              
666             =head1 VERSION
667              
668             version 0.162
669              
670             =head1 SYNOPSIS
671              
672             In your F<dist.ini>:
673              
674             [@Author::ETHER]
675              
676             =head1 DESCRIPTION
677              
678             =for stopwords optimizations
679              
680             This is a L<Dist::Zilla> plugin bundle. It is I<very approximately> equal to the
681             following F<dist.ini> (following the preamble), minus some optimizations:
682              
683             [Prereqs / pluginbundle version]
684             -phase = develop
685             -relationship = recommends
686             Dist::Zilla::PluginBundle::Author::ETHER = <current installed version>
687              
688             ;;; Before Build
689             [PromptIfStale / stale modules, build]
690             phase = build
691             module = Dist::Zilla::Plugin::Author::ETHER
692              
693              
694             ;;; ExecFiles
695             [ExecDir]
696             dir = script ; only if script dir exists
697              
698              
699             ;;; Finders
700             [FileFinder::ByName / Examples]
701             dir = examples
702              
703              
704             ;;; Gather Files
705             [Git::GatherDir]
706             :version = 2.016
707             exclude_filename = CONTRIBUTING
708             exclude_filename = INSTALL
709             exclude_filename = LICENCE
710             exclude_filename = LICENSE
711             exclude_filename = META.json
712             exclude_filename = Makefile.PL
713             exclude_filename = README.md
714             exclude_filename = README.pod
715             exclude_filename = TODO
716             exclude_filename = cpanfile
717             exclude_filename = inc/ExtUtils/MakeMaker/Dist/Zilla/Develop.pm
718             exclude_filename = ppport.h
719              
720             [MetaYAML]
721             [MetaJSON]
722             [Readme]
723             [Manifest]
724             [License]
725             :version = 5.038
726             filename = LICENCE ; for distributions where I have authority
727              
728             [CPANFile] ; iff cpanfile = 1
729              
730             [GenerateFile::FromShareDir / generate CONTRIBUTING]
731             -dist = Dist-Zilla-PluginBundle-Author-ETHER
732             -filename = CONTRIBUTING
733             has_xs = <dynamically-determined flag>
734             [InstallGuide]
735             :version = 1.200005
736              
737             [Test::Compile]
738             :version = 2.039
739             bail_out_on_fail = 1
740             xt_mode = 1
741             script_finder = :PerlExecFiles
742             script_finder = Examples
743              
744             [Test::NoTabs]
745             :version = 0.08
746             finder = :InstallModules
747             finder = :ExecFiles
748             finder = Examples
749             finder = :TestFiles
750             finder = :ExtraTestFiles
751              
752             [Test::EOL]
753             :version = 0.17
754             finder = :InstallModules
755             finder = :ExecFiles
756             finder = Examples
757             finder = :TestFiles
758             finder = :ExtraTestFiles
759              
760             [MetaTests]
761             [Test::CPAN::Changes]
762             :version = 0.012
763             [Test::ChangesHasContent]
764             [Test::MinimumVersion]
765             :version = 2.000010
766             max_target_perl = 5.006
767             [PodSyntaxTests]
768             :version = 5.040
769             [PodCoverageTests]
770             :version = 5.040
771             [Test::PodSpelling]
772             :version = 2.006003
773             stopwords = irc
774             directory = examples
775             directory = lib
776             directory = script
777             directory = t
778             directory = xt
779              
780             ;[Test::Pod::LinkCheck] many outstanding bugs
781             [Test::Pod::No404s]
782             :version = 1.003
783             [Test::Kwalitee]
784             :version = 2.10
785             filename = xt/author/kwalitee.t
786             [MojibakeTests]
787             :version = 0.8
788             [Test::ReportPrereqs]
789             :version = 0.022
790             verify_prereqs = 1
791             version_extractor = Module::Metadata
792             include = Encode
793             include = File::Temp
794             include = JSON::PP
795             include = Module::Runtime
796             include = Pod::Coverage
797             include = Sub::Name
798             include = YAML
799             include = autodie
800             [Test::Portability]
801             :version = 2.000007
802             [Test::CleanNamespaces]
803             :version = 0.006
804              
805              
806             ;;; Munge Files
807             [Git::Describe]
808             :version = 0.004
809             on_package_line = 1
810              
811             [PodWeaver] (or [SurgicalPodWeaver])
812             :version = 4.008
813             config_plugin = @Author::ETHER ; unless weaver.ini is present
814             replacer = replace_with_comment
815             post_code_replacer = replace_with_nothing
816              
817              
818             ;;; Metadata
819             [GithubMeta] ; (if server = 'github' or omitted)
820             :version = 0.54
821             homepage = 0
822             issues = 0
823              
824             [AutoMetaResources]
825             bugtracker.rt = 1 ; (if issues = 'rt' or omitted)
826             ; (plus repository.* = 1 if server = 'gitmo' or 'p5sagit')
827              
828             [Authority]
829             :version = 1.009
830             authority = cpan:ETHER
831             do_munging = 0
832              
833             [MetaNoIndex]
834             directory = corpus
835             directory = demo
836             directory = examples
837             directory = fatlib
838             directory = inc
839             directory = local
840             directory = perl5
841             directory = share
842             directory = t
843             directory = xt
844              
845             [MetaProvides::Package]
846             :version = 1.15000002
847             finder = :InstallModules
848             meta_noindex = 1
849             inherit_version = 0
850             inherit_missing = 0
851              
852             [MetaConfig]
853             [Keywords]
854             :version = 0.004
855              
856             ; if we are releasing with a new perl with -DDEFAULT_INC_EXCLUDES_DOT set
857             [UseUnsafeInc]
858             dot_in_INC = 0
859              
860             ;[Git::Contributors] ; below
861             ;[StaticInstall] ; below
862              
863              
864             ;;; Register Prereqs
865             [AutoPrereqs]
866             :version = 5.038
867             [Prereqs::AuthorDeps]
868             phase = x_Dist_Zilla ; (or whatever 'plugin_prereq_phase' is set to)
869             relation = requires ; (or whatever 'plugin_prereq_relationship' is set to)
870             [MinimumPerl]
871             :version = 1.006
872             configure_finder = :NoFiles
873              
874             [Prereqs / prereqs for @Author::ETHER]
875             -phase = x_Dist_Zilla ; (or whatever 'plugin_prereq_phase' is set to)
876             -relationship = requires ; (or whatever 'plugin_prereq_relationship' is set to)
877             ...all the plugins this bundle uses...
878              
879              
880             ;;; Install Tool
881             ; <specified installer(s)>
882              
883             [Git::Contributors]
884             :version = 0.029
885             order_by = commits
886              
887             [StaticInstall]
888             :version = 0.005
889             mode = auto
890             dry_run = 1 ; only if authority is not ETHER
891              
892              
893             ;;; Test Runner
894             ; <specified installer(s)>
895             [RunExtraTests]
896             :version = 0.024
897             default_jobs = 9
898              
899              
900             ;;; After Build
901             [CheckSelfDependency]
902              
903             [Run::AfterBuild / .ackrc]
904             :version = 0.038
905             quiet = 1
906             run = bash -c "test -e .ackrc && grep -q -- '--ignore-dir=.latest' .ackrc || echo '--ignore-dir=.latest' >> .ackrc; if [[ `dirname '%d'` != .build ]]; then test -e .ackrc && grep -q -- '--ignore-dir=%d' .ackrc || echo '--ignore-dir=%d' >> .ackrc; fi"
907             [Run::AfterBuild / .latest]
908             :version = 0.041
909             quiet = 1
910             fatal_errors = 0
911             eval = if ('%d' =~ /^%n-[.[:xdigit:]]+$/) { unlink '.latest'; symlink '%d', '.latest'; }
912              
913              
914             ;;; Before Release
915             [CheckStrictVersion]
916             decimal_only = 1
917              
918             [CheckMetaResources]
919             [EnsureLatestPerl]
920             [PromptIfStale / stale modules, release]
921             phase = release
922             check_all_plugins = 1
923             check_all_prereqs = 1
924              
925             [Git::Check / initial check]
926             allow_dirty =
927              
928             [Git::CheckFor::MergeConflicts]
929              
930             [Git::CheckFor::CorrectBranch]
931             :version = 0.004
932             release_branch = master
933              
934             [Git::Remote::Check]
935             branch = master
936             remote_branch = master
937              
938             [CheckPrereqsIndexed]
939             :version = 0.019
940             [TestRelease]
941             [Git::Check / after tests]
942             allow_dirty =
943             [CheckIssues]
944             ;(ConfirmRelease)
945              
946              
947             ;;; Releaser
948             [UploadToCPAN]
949              
950              
951             ;;; After Release
952             [Run::AfterRelease / remove old LICENCE] ; if switching from LICENCE -> LICENSE
953             :version = 0.038
954             quiet = 1
955             eval = unlink 'LICENCE'
956              
957             [Run::AfterRelease / remove old LICENSE] ; if switching from LICENSE -> LICENCE
958             :version = 0.038
959             quiet = 1
960             eval = unlink 'LICENSE'
961              
962             [Run::AfterRelease / remove old READMEs]
963             :version = 0.038
964             quiet = 1
965             eval = unlink 'README.md'
966              
967             [CopyFilesFromRelease / copy generated files]
968             filename = CONTRIBUTING
969             filename = INSTALL
970             filename = LICENCE
971             filename = LICENSE
972             filename = ppport.h
973             filename = cpanfile ; iff cpanfile = 1
974              
975             [ReadmeAnyFromPod]
976             :version = 0.142180
977             type = pod
978             location = root
979             phase = release
980              
981             ;;;;;; begin [@Git::VersionManager]
982              
983             ; this is actually a VersionProvider and FileMunger
984             [RewriteVersion::Transitional]
985             :version = 0.004
986             global = 1
987             fallback_version_provider = Git::NextVersion
988             version_regexp = ^v([\d._]+)(-TRIAL)?$
989              
990             [CopyFilesFromRelease / copy Changes]
991             filename = Changes
992              
993             [Git::Commit / release snapshot]
994             :version = 2.020
995             add_files_in = .
996             allow_dirty = CONTRIBUTING
997             allow_dirty = Changes
998             allow_dirty = INSTALL
999             allow_dirty = LICENCE
1000             allow_dirty = LICENSE
1001             allow_dirty = README.md
1002             allow_dirty = README.pod
1003             allow_dirty = cpanfile ; iff cpanfile = 1
1004             allow_dirty = ppport.h
1005             commit_msg = %N-%v%t%n%n%c
1006              
1007             [Git::Tag]
1008             tag_message = v%v%t
1009              
1010             [BumpVersionAfterRelease::Transitional]
1011             :version = 0.004
1012             global = 1
1013             finder = :InstallModules ; removed :ExecFiles
1014              
1015             [NextRelease]
1016             :version = 5.033
1017             time_zone = UTC
1018             format = %-8v %{yyyy-MM-dd HH:mm:ss'Z'}d%{ (TRIAL RELEASE)}T
1019              
1020             [Git::Commit / post-release commit]
1021             :version = 2.020
1022             allow_dirty = Changes
1023             allow_dirty_match = ^lib/.*\.pm$
1024             commit_msg = increment $VERSION after %v release
1025              
1026             ;;;;;; end [@Git::VersionManager]
1027              
1028             [Git::Push]
1029              
1030             [GitHub::Update] ; (if server = 'github' or omitted)
1031             :version = 0.40
1032             metacpan = 1
1033              
1034             [Run::AfterRelease / install release]
1035             :version = 0.031
1036             fatal_errors = 0
1037             run = cpanm http://URMOM:mysekritpassword@pause.perl.org/pub/PAUSE/authors/id/U/UR/URMOM/%a
1038              
1039             [Run::AfterRelease / release complete]
1040             :version = 0.038
1041             quiet = 1
1042             eval = print "release complete!\xa"
1043              
1044             ; listed late, to allow all other plugins which do BeforeRelease checks to run first.
1045             [ConfirmRelease]
1046              
1047             ; listed last, to be sure we run at the very end of each phase
1048             ; only performed if $ENV{USER} eq 'ether'
1049             [VerifyPhases / PHASE VERIFICATION]
1050             :version = 0.015
1051              
1052             =for Pod::Coverage configure mvp_multivalue_args
1053              
1054             =for stopwords metacpan
1055              
1056             The distribution's code is assumed to be hosted at L<github|http://github.com>;
1057             L<RT|http://rt.cpan.org> is used as the issue tracker (see option L</rt> below).
1058             The home page in the metadata points to L<github|http://github.com>,
1059             while the home page on L<github|http://github.com> is updated on release to
1060             point to L<metacpan|http://metacpan.org>.
1061             The version and other metadata is derived directly from the local git repository.
1062              
1063             =head1 OPTIONS / OVERRIDES
1064              
1065             =head2 version
1066              
1067             Use C<< V=<version> >> in the shell to override the version of the distribution being built;
1068             otherwise the version is incremented after each release, in the F<*.pm> files.
1069              
1070             =head2 pod coverage
1071              
1072             Subroutines can be considered "covered" for pod coverage tests by adding a
1073             directive to pod (as many as you'd like),
1074             as described in L<Pod::Coverage::TrustPod>:
1075              
1076             =for Pod::Coverage foo bar baz
1077              
1078             =head2 spelling stopwords
1079              
1080             =for stopwords Stopwords
1081              
1082             Stopwords for spelling tests can be added by adding a directive to pod (as
1083             many as you'd like), as described in L<Pod::Spell/ADDING STOPWORDS>:
1084              
1085             =for stopwords foo bar baz
1086              
1087             See also L<[Test::PodSpelling]|Dist::Zilla::Plugin::Test::PodSpelling/stopwords>.
1088              
1089             =head2 installer
1090              
1091             =for stopwords ModuleBuildTiny
1092              
1093             Available since version 0.007.
1094              
1095             The installer back-end(s) to use (can be specified more than once); defaults
1096             to L<C<ModuleBuildTiny::Fallback>|Dist::Zilla::Plugin::ModuleBuildTiny::Fallback>
1097             and L<C<MakeMaker::Fallback>|Dist::Zilla::Plugin::MakeMaker::Fallback>
1098             (which generates a F<Build.PL> for normal use with no-configure-requires
1099             protection, and F<Makefile.PL> as a fallback, containing an upgrade warning).
1100             For toolchain-grade modules, you should only use F<Makefile.PL>-generating installers.
1101              
1102             You can select other backends (by plugin name, without the C<[]>), with the
1103             C<installer> option, or C<none> if you are supplying your own, as a separate
1104             plugin(s).
1105              
1106             Encouraged choices are:
1107              
1108             =over 4
1109              
1110             =item *
1111              
1112             C<< installer = ModuleBuildTiny >>
1113              
1114             =item *
1115              
1116             C<< installer = MakeMaker >>
1117              
1118             =item *
1119              
1120             C<< installer = MakeMaker::Fallback >> (when used in combination with ModuleBuildTiny)
1121              
1122             =item *
1123              
1124             C<< installer = =inc::Foo >> (if no configs are needed for this plugin; e.g. subclassed from L<[MakeMaker::Awesome]|Dist::Zilla::Plugin::MakeMaker::Awesome>)
1125              
1126             =item *
1127              
1128             C<< installer = none >> (if you are providing your own elsewhere in the file, with configs)
1129              
1130             =back
1131              
1132             =head2 server
1133              
1134             Available since version 0.019.
1135              
1136             If provided, must be one of:
1137              
1138             =over 4
1139              
1140             =item *
1141              
1142             C<github>
1143              
1144             (default)
1145             metadata and release plugins are tailored to L<github|http://github.com>.
1146              
1147             =item *
1148              
1149             C<gitmo>
1150              
1151             metadata and release plugins are tailored to
1152             L<gitmo@git.moose.perl.org|http://git.moose.perl.org>.
1153              
1154             =item *
1155              
1156             C<p5sagit>
1157              
1158             metadata and release plugins are tailored to
1159             L<p5sagit@git.shadowcat.co.uk|http://git.shadowcat.co.uk>.
1160              
1161             =item *
1162              
1163             C<catagits>
1164              
1165             metadata and release plugins are tailored to
1166             L<catagits@git.shadowcat.co.uk|http://git.shadowcat.co.uk>.
1167              
1168             =item *
1169              
1170             C<none>
1171              
1172             no special configuration of metadata (relating to repositories etc) is done --
1173             you'll need to provide this yourself.
1174              
1175             =back
1176              
1177             =head2 airplane
1178              
1179             Available since version 0.053.
1180              
1181             A boolean option that, when set, removes the use of all plugins that use the
1182             network (generally for comparing metadata against PAUSE, and querying the
1183             remote git server), as well as blocking the use of the C<release> command.
1184             Defaults to false; can also be set with the environment variable C<DZIL_AIRPLANE>.
1185              
1186             =head2 copy_file_from_release
1187              
1188             Available in this form since version 0.076.
1189              
1190             A file, to be present in the build, which is copied back to the source
1191             repository at release time and committed to git. Can be used more than
1192             once. Defaults to:
1193             F<LICENCE>, F<LICENSE>, F<CONTRIBUTING>, F<Changes>, F<ppport.h>, F<INSTALL>,
1194             as well as F<cpanfile> if C<cpanfile = 1> is specified in the options;
1195             defaults are appended to, rather than overwritten.
1196              
1197             =head2 surgical_podweaver
1198              
1199             =for stopwords PodWeaver SurgicalPodWeaver
1200              
1201             Available since version 0.051.
1202              
1203             A boolean option that, when set, uses
1204             L<[SurgicalPodWeaver]|Dist::Zilla::Plugin::SurgicalPodWeaver> instead of
1205             L<[PodWeaver]|Dist::Zilla::Plugin::SurgicalPodWeaver>, but with all the same
1206             options. Defaults to false.
1207              
1208             =head2 changes_version_columns
1209              
1210             Available since version 0.076.
1211              
1212             An integer that specifies how many columns (right-padded with whitespace) are
1213             allocated in F<Changes> entries to the version string. Defaults to 10.
1214              
1215             =head2 licence (or license)
1216              
1217             Available since version 0.101.
1218              
1219             A string that specifies the name to use for the licence file. Defaults to
1220             C<LICENCE> for distributions where I (ETHER) or any other known non-Americans
1221             have first-come permissions, or C<LICENSE> otherwise.
1222             (The pod section for legal information is also adjusted appropriately.)
1223              
1224             =head2 authority
1225              
1226             Available since version 0.117.
1227              
1228             A string of the form C<cpan:PAUSEID> that references the PAUSE ID of the user who has primary ("first-come")
1229             authority over the distribution and main module namespace. If not provided, it is extracted from the configuration
1230             passed through to the L<[Authority]|Dist::Zilla::Plugin::Authority> plugin, and finally defaults to C<cpan:ETHER>.
1231             It is presently used for setting C<x_authority> metadata and deciding which spelling is used for the F<LICENCE>
1232             file (if the C<licence> configuration is not provided).
1233              
1234             =head2 fake_release
1235              
1236             =for stopwords UploadToCPAN FakeRelease
1237              
1238             Available since version 0.122.
1239              
1240             A boolean option that, when set, removes L<[UploadToCPAN]|Dist::Zilla::Plugin::UploadToCPAN> from the plugin list
1241             and replaces it with L<[FakeRelease]|Dist::Zilla::Plugin::FakeRelease>.
1242             Defaults to false; can also be set with the environment variable C<FAKE_RELEASE>.
1243              
1244             =head2 plugin_prereq_phase, plugin_prereq_relationship
1245              
1246             If these are set, then plugins used by the bundle (with minimum version requirements) are injected into the
1247             distribution's prerequisites at the specified phase and relationship. Defaults to C<x_Dist_Zilla> and C<requires>.
1248             Disable with:
1249              
1250             plugin_prereq_phase =
1251             plugin_prereq_relationship =
1252              
1253             Available since version 0.133.
1254              
1255             =for stopwords cpanfile
1256              
1257             =head2 cpanfile
1258              
1259             Available since version 0.147.
1260              
1261             A boolean option that, when set, adds a F<cpanfile> to the built distribution and also commits it to the local
1262             repository after release. Beware that if the distribution has C<< dynamic_config => 1 >> in metadata, this will
1263             I<not> be a complete list of prerequisites.
1264              
1265             =head2 bugtracker
1266              
1267             Available since version 0.154.
1268              
1269             When set to C<rt> or omitted, L<RT|http://rt.cpan.org> is used as the bug/issue tracker. Can also be set to
1270             C<github>, in which case GitHub issues are used as the bugtracker in distribution metadata.
1271              
1272             =for stopwords customizations
1273              
1274             =head2 other customizations
1275              
1276             This bundle makes use of L<Dist::Zilla::Role::PluginBundle::PluginRemover> and
1277             L<Dist::Zilla::Role::PluginBundle::Config::Slicer> to allow further customization.
1278             (Note that even though some overridden values are inspected in this class,
1279             they are still overlaid on top of whatever this bundle eventually decides to
1280             pass - so what is in the F<dist.ini> always trumps everything else.)
1281              
1282             Plugins are not loaded until they are actually needed, so it is possible to
1283             C<--force>-install this plugin bundle and C<-remove> some plugins that do not
1284             install or are otherwise problematic.
1285              
1286             If a F<weaver.ini> is present in the distribution, pod is woven using it;
1287             otherwise, the behaviour is as with a F<weaver.ini> containing the single line
1288             C<[@Author::ETHER]> (see L<Pod::Weaver::PluginBundle::Author::ETHER>).
1289              
1290             =head1 NAMING SCHEME
1291              
1292             =for stopwords KENTNL
1293              
1294             This distribution follows best practices for author-oriented plugin bundles; for more information,
1295             see L<KENTNL's distribution|Dist::Zilla::PluginBundle::Author::KENTNL/NAMING-SCHEME>.
1296              
1297             =head1 SEE ALSO
1298              
1299             =over 4
1300              
1301             =item *
1302              
1303             L<Pod::Weaver::PluginBundle::Author::ETHER>
1304              
1305             =item *
1306              
1307             L<Dist::Zilla::MintingProfile::Author::ETHER>
1308              
1309             =item *
1310              
1311             L<Dist::Zilla::PluginBundle::Git::VersionManager>
1312              
1313             =back
1314              
1315             =head1 SUPPORT
1316              
1317             Bugs may be submitted through L<the RT bug tracker|https://rt.cpan.org/Public/Dist/Display.html?Name=Dist-Zilla-PluginBundle-Author-ETHER>
1318             (or L<bug-Dist-Zilla-PluginBundle-Author-ETHER@rt.cpan.org|mailto:bug-Dist-Zilla-PluginBundle-Author-ETHER@rt.cpan.org>).
1319              
1320             There is also a mailing list available for users of this distribution, at
1321             L<http://dzil.org/#mailing-list>.
1322              
1323             There is also an irc channel available for users of this distribution, at
1324             L<C<#distzilla> on C<irc.perl.org>|irc://irc.perl.org/#distzilla>.
1325              
1326             I am also usually active on irc, as 'ether' at C<irc.perl.org> and C<irc.libera.chat>.
1327              
1328             =head1 AUTHOR
1329              
1330             Karen Etheridge <ether@cpan.org>
1331              
1332             =head1 CONTRIBUTORS
1333              
1334             =for stopwords Dave Rolsky Edward Betts Graham Knop Randy Stauner Roy Ivy III Сергей Романов
1335              
1336             =over 4
1337              
1338             =item *
1339              
1340             Dave Rolsky <autarch@urth.org>
1341              
1342             =item *
1343              
1344             Edward Betts <edward@4angle.com>
1345              
1346             =item *
1347              
1348             Graham Knop <haarg@haarg.org>
1349              
1350             =item *
1351              
1352             Randy Stauner <rwstauner@cpan.org>
1353              
1354             =item *
1355              
1356             Roy Ivy III <rivy@cpan.org>
1357              
1358             =item *
1359              
1360             Сергей Романов <sromanov@cpan.org>
1361              
1362             =back
1363              
1364             =head1 COPYRIGHT AND LICENCE
1365              
1366             This software is copyright (c) 2013 by Karen Etheridge.
1367              
1368             This is free software; you can redistribute it and/or modify it under
1369             the same terms as the Perl 5 programming language system itself.
1370              
1371             =cut