| line | stmt | bran | cond | sub | pod | time | code | 
| 1 |  |  |  |  |  |  | package Ado::Build; | 
| 2 | 3 |  |  | 3 |  | 55853 | use 5.014; | 
|  | 3 |  |  |  |  | 9 |  | 
| 3 | 3 |  |  | 3 |  | 13 | use strict; | 
|  | 3 |  |  |  |  | 4 |  | 
|  | 3 |  |  |  |  | 66 |  | 
| 4 | 3 |  |  | 3 |  | 13 | use warnings FATAL => 'all'; | 
|  | 3 |  |  |  |  | 5 |  | 
|  | 3 |  |  |  |  | 134 |  | 
| 5 | 3 |  |  | 3 |  | 14 | use File::Spec::Functions qw(catdir catfile); | 
|  | 3 |  |  |  |  | 5 |  | 
|  | 3 |  |  |  |  | 180 |  | 
| 6 | 3 |  |  | 3 |  | 13 | use File::Path qw(make_path); | 
|  | 3 |  |  |  |  | 4 |  | 
|  | 3 |  |  |  |  | 150 |  | 
| 7 | 3 |  |  | 3 |  | 558 | use File::Copy qw(copy); | 
|  | 3 |  |  |  |  | 2083 |  | 
|  | 3 |  |  |  |  | 143 |  | 
| 8 | 3 |  |  | 3 |  | 1645 | use ExtUtils::Installed; | 
|  | 3 |  |  |  |  | 286350 |  | 
|  | 3 |  |  |  |  | 195 |  | 
| 9 | 3 |  |  | 3 |  | 2031 | use ExtUtils::Install; | 
|  | 3 |  |  |  |  | 29991 |  | 
|  | 3 |  |  |  |  | 228 |  | 
| 10 | 3 |  |  | 3 |  | 20 | use parent 'Module::Build'; | 
|  | 3 |  |  |  |  | 5 |  | 
|  | 3 |  |  |  |  | 25 |  | 
| 11 | 3 |  |  | 3 |  | 115270 | use Exporter qw( import );    #export functionality to Ado::BuildPlugin etc.. | 
|  | 3 |  |  |  |  | 5 |  | 
|  | 3 |  |  |  |  | 5117 |  | 
| 12 |  |  |  |  |  |  | our @EXPORT_OK = qw( | 
| 13 |  |  |  |  |  |  | create_build_script process_etc_files do_create_readme | 
| 14 |  |  |  |  |  |  | process_public_files process_templates_files | 
| 15 |  |  |  |  |  |  | ACTION_perltidy ACTION_submit PERL_DIRS); | 
| 16 |  |  |  |  |  |  |  | 
| 17 |  |  |  |  |  |  | sub PERL_DIRS { | 
| 18 | 0 |  |  | 0 | 1 | 0 | state $dirs = [map { catdir($_[0]->base_dir, $_) } qw(bin lib etc t)]; | 
|  | 0 |  |  |  |  | 0 |  | 
| 19 | 0 |  |  |  |  | 0 | return @$dirs; | 
| 20 |  |  |  |  |  |  | } | 
| 21 |  |  |  |  |  |  |  | 
| 22 |  |  |  |  |  |  | sub create_build_script { | 
| 23 | 1 |  |  | 1 | 1 | 5 | my $self = shift; | 
| 24 |  |  |  |  |  |  |  | 
| 25 |  |  |  |  |  |  | #Deciding where to install | 
| 26 | 1 |  | 33 |  |  | 22 | my $prefix = $self->install_base || $self->config('siteprefix'); | 
| 27 | 1 |  |  |  |  | 106 | for my $be (qw(etc public log templates)) { | 
| 28 |  |  |  |  |  |  |  | 
| 29 |  |  |  |  |  |  | #in case of installing a plugin, check if folder exists | 
| 30 | 4 | 100 |  |  |  | 103 | next unless -d $be; | 
| 31 | 1 |  |  |  |  | 22 | $self->add_build_element($be); | 
| 32 | 1 |  |  |  |  | 54 | $self->install_path($be => catdir($prefix, $be)); | 
| 33 |  |  |  |  |  |  | } | 
| 34 | 1 |  |  |  |  | 23 | return $self->SUPER::create_build_script(); | 
| 35 |  |  |  |  |  |  | } | 
| 36 |  |  |  |  |  |  |  | 
| 37 |  |  |  |  |  |  | sub process_public_files { | 
| 38 | 0 |  |  | 0 | 1 |  | my $self = shift; | 
| 39 | 0 |  |  |  |  |  | for my $asset (@{$self->rscan_dir('public')}) { | 
|  | 0 |  |  |  |  |  |  | 
| 40 | 0 | 0 |  |  |  |  | if (-d $asset) { | 
| 41 | 0 |  |  |  |  |  | make_path(catdir('blib', $asset)); | 
| 42 | 0 |  |  |  |  |  | next; | 
| 43 |  |  |  |  |  |  | } | 
| 44 | 0 |  |  |  |  |  | copy($asset, catfile('blib', $asset)); | 
| 45 |  |  |  |  |  |  | } | 
| 46 | 0 |  |  |  |  |  | return; | 
| 47 |  |  |  |  |  |  | } | 
| 48 |  |  |  |  |  |  |  | 
| 49 |  |  |  |  |  |  | sub process_etc_files { | 
| 50 | 0 |  |  | 0 | 1 |  | my $self   = shift; | 
| 51 | 0 |  | 0 |  |  |  | my $prefix = $self->install_base || $self->config('siteprefix'); | 
| 52 | 0 |  | 0 |  |  |  | my $mode   = $ENV{MOJO_MODE} ||= 'development'; | 
| 53 |  |  |  |  |  |  |  | 
| 54 | 0 |  |  |  |  |  | for my $asset (@{$self->rscan_dir('etc')}) { | 
|  | 0 |  |  |  |  |  |  | 
| 55 | 0 | 0 |  |  |  |  | if (-d $asset) { | 
| 56 | 0 |  |  |  |  |  | make_path(catdir('blib', $asset)); | 
| 57 | 0 |  |  |  |  |  | next; | 
| 58 |  |  |  |  |  |  | } | 
| 59 |  |  |  |  |  |  |  | 
| 60 |  |  |  |  |  |  | # skip SQLite automatically created files | 
| 61 | 0 | 0 |  |  |  |  | next if ($asset =~ m/ado\-(shm|wal)/); | 
| 62 | 0 |  |  |  |  |  | my $asset_path = catfile($prefix, $asset); | 
| 63 | 0 | 0 | 0 |  |  |  | if ($asset =~ m/ado\.sqlite/ && -s $asset_path) { | 
| 64 | 0 |  |  |  |  |  | $self->log_info("Skipping $asset because it already exists at $asset_path! $/"); | 
| 65 | 0 |  |  |  |  |  | next; | 
| 66 |  |  |  |  |  |  | } | 
| 67 | 0 |  |  |  |  |  | copy($asset, catfile('blib', $asset)); | 
| 68 |  |  |  |  |  |  | } | 
| 69 | 0 |  |  |  |  |  | return; | 
| 70 |  |  |  |  |  |  | } | 
| 71 |  |  |  |  |  |  |  | 
| 72 |  |  |  |  |  |  | sub process_log_files { | 
| 73 | 0 |  |  | 0 | 1 |  | my $self = shift; | 
| 74 | 0 |  |  |  |  |  | for my $asset (@{$self->rscan_dir('log')}) { | 
|  | 0 |  |  |  |  |  |  | 
| 75 | 0 | 0 |  |  |  |  | if (-d $asset) { | 
| 76 | 0 |  |  |  |  |  | make_path(catdir('blib', $asset)); | 
| 77 | 0 |  |  |  |  |  | next; | 
| 78 |  |  |  |  |  |  | } | 
| 79 | 0 |  |  |  |  |  | copy($asset, catfile('blib', $asset)); | 
| 80 |  |  |  |  |  |  | } | 
| 81 | 0 |  |  |  |  |  | return; | 
| 82 |  |  |  |  |  |  | } | 
| 83 |  |  |  |  |  |  |  | 
| 84 |  |  |  |  |  |  | sub process_templates_files { | 
| 85 | 0 |  |  | 0 | 1 |  | my $self = shift; | 
| 86 | 0 |  |  |  |  |  | for my $asset (@{$self->rscan_dir('templates')}) { | 
|  | 0 |  |  |  |  |  |  | 
| 87 | 0 | 0 |  |  |  |  | if (-d $asset) { | 
| 88 | 0 |  |  |  |  |  | make_path(catdir('blib', $asset)); | 
| 89 | 0 |  |  |  |  |  | next; | 
| 90 |  |  |  |  |  |  | } | 
| 91 | 0 |  |  |  |  |  | copy($asset, catfile('blib', $asset)); | 
| 92 |  |  |  |  |  |  | } | 
| 93 | 0 |  |  |  |  |  | return; | 
| 94 |  |  |  |  |  |  | } | 
| 95 |  |  |  |  |  |  |  | 
| 96 |  |  |  |  |  |  | sub _uninstall { | 
| 97 | 0 |  |  | 0 |  |  | my $self    = shift; | 
| 98 | 0 |  |  |  |  |  | my $dryrun  = shift; | 
| 99 | 0 |  | 0 |  |  |  | my $verbose = shift || 1;    # true by default | 
| 100 |  |  |  |  |  |  |  | 
| 101 | 0 | 0 |  |  |  |  | unshift @INC, $self->install_base if $self->install_base; | 
| 102 |  |  |  |  |  |  |  | 
| 103 | 0 |  |  |  |  |  | my $module    = $self->module_name; | 
| 104 | 0 |  |  |  |  |  | my $installed = ExtUtils::Installed->new; | 
| 105 | 0 |  |  |  |  |  | my $packlist  = $installed->packlist($module)->packlist_file; | 
| 106 |  |  |  |  |  |  |  | 
| 107 |  |  |  |  |  |  | # Remove all installed files | 
| 108 | 0 |  |  |  |  |  | ExtUtils::Install::uninstall($packlist, $verbose, $dryrun); | 
| 109 |  |  |  |  |  |  |  | 
| 110 |  |  |  |  |  |  | # Remove empty installation directories. | 
| 111 | 0 |  |  |  |  |  | foreach (reverse sort $installed->directories($module)) { | 
| 112 | 0 | 0 | 0 |  |  |  | say "rmdir $_" and next if $verbose and $dryrun; | 
|  |  |  | 0 |  |  |  |  | 
| 113 | 0 | 0 |  |  |  |  | say rmdir $_ ? "rmdir $_" : "rmdir $_ - $!" if not $dryrun; | 
|  |  | 0 |  |  |  |  |  | 
| 114 |  |  |  |  |  |  | } | 
| 115 | 0 |  |  |  |  |  | return; | 
| 116 |  |  |  |  |  |  | } | 
| 117 |  |  |  |  |  |  |  | 
| 118 |  |  |  |  |  |  | sub ACTION_uninstall { | 
| 119 | 0 |  |  | 0 | 1 |  | my $self = shift; | 
| 120 | 0 |  |  |  |  |  | return $self->_uninstall; | 
| 121 |  |  |  |  |  |  | } | 
| 122 |  |  |  |  |  |  |  | 
| 123 |  |  |  |  |  |  | sub ACTION_fakeuninstall { | 
| 124 | 0 |  |  | 0 | 1 |  | my $self = shift; | 
| 125 | 0 |  |  |  |  |  | return $self->_uninstall('dry-run'); | 
| 126 |  |  |  |  |  |  | } | 
| 127 |  |  |  |  |  |  |  | 
| 128 |  |  |  |  |  |  | sub ACTION_build { | 
| 129 | 0 |  |  | 0 | 1 |  | my $self = shift; | 
| 130 |  |  |  |  |  |  |  | 
| 131 |  |  |  |  |  |  | #Make sure *log files are empty before moving them to blib | 
| 132 | 0 |  |  |  |  |  | _empty_log_files('log'); | 
| 133 |  |  |  |  |  |  |  | 
| 134 |  |  |  |  |  |  | #Do other interventions before the real build... | 
| 135 | 0 |  |  |  |  |  | $self->SUPER::ACTION_build; | 
| 136 | 0 |  |  |  |  |  | return; | 
| 137 |  |  |  |  |  |  | } | 
| 138 |  |  |  |  |  |  |  | 
| 139 |  |  |  |  |  |  | sub ACTION_test { | 
| 140 | 0 |  |  | 0 | 1 |  | my $self = shift; | 
| 141 |  |  |  |  |  |  |  | 
| 142 |  |  |  |  |  |  | #Custom functionality before test | 
| 143 | 0 | 0 |  |  |  |  | $self->_process_custom_files(catdir('blib', 'etc'), catdir('blib', 'log')) | 
| 144 |  |  |  |  |  |  | if -d 'blib'; | 
| 145 | 0 |  |  |  |  |  | $self->_process_custom_files('etc', 'log'); | 
| 146 | 0 |  |  |  |  |  | $self->SUPER::ACTION_test; | 
| 147 | 0 |  |  |  |  |  | return; | 
| 148 |  |  |  |  |  |  | } | 
| 149 |  |  |  |  |  |  |  | 
| 150 |  |  |  |  |  |  | sub ACTION_dist { | 
| 151 | 0 |  |  | 0 | 1 |  | my $self = shift; | 
| 152 |  |  |  |  |  |  |  | 
| 153 |  |  |  |  |  |  | #Make sure *log files are empty before including them into the distro | 
| 154 | 0 |  |  |  |  |  | _empty_log_files('log'); | 
| 155 |  |  |  |  |  |  |  | 
| 156 |  |  |  |  |  |  | #Do other interventions before the real dist.. | 
| 157 | 0 |  |  |  |  |  | $self->SUPER::ACTION_dist; | 
| 158 | 0 |  |  |  |  |  | return; | 
| 159 |  |  |  |  |  |  | } | 
| 160 |  |  |  |  |  |  |  | 
| 161 |  |  |  |  |  |  | sub ACTION_install { | 
| 162 | 0 |  |  | 0 | 1 |  | my $self = shift; | 
| 163 |  |  |  |  |  |  |  | 
| 164 |  |  |  |  |  |  | #Custom functionality before installation | 
| 165 |  |  |  |  |  |  | #here... | 
| 166 |  |  |  |  |  |  | #TODO: Think about what to do with *.conf and *.sqlite files in case of upgrade!!! | 
| 167 |  |  |  |  |  |  | #TODO: (upgrade)rotate logs - archive existing log files before emptying. | 
| 168 | 0 |  |  |  |  |  | $self->SUPER::ACTION_install; | 
| 169 |  |  |  |  |  |  |  | 
| 170 |  |  |  |  |  |  | #Custom functionality after installation | 
| 171 | 0 |  |  |  |  |  | $self->_process_custom_files($self->install_path('etc'), $self->install_path('log')); | 
| 172 | 0 |  |  |  |  |  | return; | 
| 173 |  |  |  |  |  |  | } | 
| 174 |  |  |  |  |  |  |  | 
| 175 |  |  |  |  |  |  | sub _process_custom_files { | 
| 176 | 0 |  |  | 0 |  |  | my ($self, $etc_dir, $log_dir) = @_; | 
| 177 |  |  |  |  |  |  |  | 
| 178 |  |  |  |  |  |  | #make some files writable and/or readable only by the user that runs the application | 
| 179 | 0 |  |  |  |  |  | my $ro = oct('0400'); | 
| 180 | 0 |  |  |  |  |  | my $rw = oct('0600'); | 
| 181 | 0 |  |  |  |  |  | for my $asset ( | 
| 182 |  |  |  |  |  |  | qw(ado.conf plugins/routes.conf plugins/auth.conf plugins/markdown_renderer.conf)) | 
| 183 |  |  |  |  |  |  | { | 
| 184 | 0 |  |  |  |  |  | _chmod($ro, catfile($etc_dir, $asset)); | 
| 185 |  |  |  |  |  |  | } | 
| 186 | 0 |  |  |  |  |  | _chmod($rw, catfile($etc_dir, 'ado.sqlite')); | 
| 187 |  |  |  |  |  |  |  | 
| 188 |  |  |  |  |  |  | #Make sure *log files are existing and empty | 
| 189 | 0 |  |  |  |  |  | _empty_log_files($log_dir); | 
| 190 | 0 |  |  |  |  |  | for my $asset (qw(development production)) { | 
| 191 | 0 |  |  |  |  |  | _chmod($rw, catfile($log_dir, "$asset.log")); | 
| 192 |  |  |  |  |  |  | } | 
| 193 | 0 |  |  |  |  |  | return; | 
| 194 |  |  |  |  |  |  | } | 
| 195 |  |  |  |  |  |  |  | 
| 196 |  |  |  |  |  |  | sub _chmod { | 
| 197 | 0 |  |  | 0 |  |  | my ($mode, $file) = @_; | 
| 198 | 0 |  | 0 |  |  |  | return chmod($mode, $file) | 
| 199 |  |  |  |  |  |  | || Carp::carp("Could not change mode for $file: $!"); | 
| 200 |  |  |  |  |  |  | } | 
| 201 |  |  |  |  |  |  |  | 
| 202 |  |  |  |  |  |  | sub ACTION_perltidy { | 
| 203 | 0 |  |  | 0 | 1 |  | my $self = shift; | 
| 204 | 0 | 0 |  |  |  |  | eval { require Perl::Tidy } || do { | 
|  | 0 |  |  |  |  |  |  | 
| 205 | 0 |  |  |  |  |  | $self->log_warn( | 
| 206 |  |  |  |  |  |  | "Perl::Tidy is not installed$/" . "Please install it and rerun ./Build perltidy$/"); | 
| 207 | 0 |  |  |  |  |  | return; | 
| 208 |  |  |  |  |  |  | }; | 
| 209 | 0 |  |  |  |  |  | my @files; | 
| 210 | 0 |  |  |  |  |  | for my $dir ($self->PERL_DIRS) { | 
| 211 | 0 |  |  |  |  |  | my $dir_files = $self->rscan_dir($dir); | 
| 212 | 0 |  |  |  |  |  | for my $file (@$dir_files) { | 
| 213 | 0 | 0 | 0 |  |  |  | push @files, $file | 
| 214 |  |  |  |  |  |  | if -f $file && $file =~ m{(\.pl|/ado|\.pm|ado.*?\.conf|\.t)$}x; | 
| 215 |  |  |  |  |  |  | } | 
| 216 |  |  |  |  |  |  | } | 
| 217 |  |  |  |  |  |  |  | 
| 218 | 0 | 0 |  |  |  |  | if ($self->verbose) { | 
| 219 | 0 |  |  |  |  |  | say join($/, @files) . "$/perltidy-ing " . @files . " files..."; | 
| 220 |  |  |  |  |  |  | } | 
| 221 |  |  |  |  |  |  |  | 
| 222 |  |  |  |  |  |  | #We use ./.perltidyrc for all arguments | 
| 223 | 0 |  |  |  |  |  | Perl::Tidy::perltidy(argv => [@files]); | 
| 224 | 0 |  |  |  |  |  | foreach my $file (@{$self->rscan_dir($self->base_dir)}) { | 
|  | 0 |  |  |  |  |  |  | 
| 225 | 0 | 0 |  |  |  |  | unlink($file) if $file =~ /\.bak$/; | 
| 226 |  |  |  |  |  |  | } | 
| 227 | 0 |  |  |  |  |  | say "perltidy-ed distribution."; | 
| 228 | 0 |  |  |  |  |  | return; | 
| 229 |  |  |  |  |  |  | } | 
| 230 |  |  |  |  |  |  |  | 
| 231 |  |  |  |  |  |  | sub ACTION_submit { | 
| 232 | 0 |  |  | 0 | 1 |  | my $self = shift; | 
| 233 |  |  |  |  |  |  |  | 
| 234 |  |  |  |  |  |  | #$self->depends_on("perltidy"); | 
| 235 | 0 |  |  |  |  |  | say "TODO: commit and push after tidying and testing and who knows what"; | 
| 236 | 0 |  |  |  |  |  | return; | 
| 237 |  |  |  |  |  |  | } | 
| 238 |  |  |  |  |  |  |  | 
| 239 |  |  |  |  |  |  |  | 
| 240 |  |  |  |  |  |  | #Empties log files in a given directory. | 
| 241 |  |  |  |  |  |  | sub _empty_log_files { | 
| 242 | 0 | 0 |  | 0 |  |  | (my ($log_dir) = @_) || Carp::croak('Please provide $log_dir'); | 
| 243 | 0 |  | 0 |  |  |  | open my $logd, ">", "$log_dir/development.log" || Carp::croak $!; | 
| 244 | 0 |  |  |  |  |  | close $logd; | 
| 245 | 0 |  | 0 |  |  |  | open my $logp, ">", "$log_dir/production.log" || Carp::croak $!; | 
| 246 | 0 |  |  |  |  |  | close $logp; | 
| 247 | 0 |  |  |  |  |  | return; | 
| 248 |  |  |  |  |  |  | } | 
| 249 |  |  |  |  |  |  |  | 
| 250 |  |  |  |  |  |  | sub do_create_readme { | 
| 251 | 0 |  |  | 0 | 1 |  | my $self = shift; | 
| 252 | 0 | 0 |  |  |  |  | if ($self->dist_version_from =~ /Ado\.pm$/) { | 
| 253 |  |  |  |  |  |  |  | 
| 254 |  |  |  |  |  |  | #Create README from Ado::Manual.pod | 
| 255 | 0 |  |  |  |  |  | require Pod::Text; | 
| 256 | 0 |  |  |  |  |  | my $readme_from = catfile('lib', 'Ado', 'Manual.pod'); | 
| 257 | 0 |  |  |  |  |  | my $parser = Pod::Text->new(sentence => 0, indent => 2, width => 76); | 
| 258 | 0 |  |  |  |  |  | $parser->parse_from_file($readme_from, 'README'); | 
| 259 | 0 |  |  |  |  |  | $self->log_info("Created README$/"); | 
| 260 |  |  |  |  |  |  |  | 
| 261 |  |  |  |  |  |  | #add README.md just to be cool.. | 
| 262 | 0 | 0 |  |  |  |  | eval { require Pod::Markdown } | 
|  | 0 |  |  |  |  |  |  | 
| 263 |  |  |  |  |  |  | || return $self->log_warn('Pod::Markdown required for creating README.md' . $/); | 
| 264 | 0 |  |  |  |  |  | $parser = Pod::Markdown->new; | 
| 265 | 0 |  |  |  |  |  | $parser->parse_from_file($readme_from); | 
| 266 | 0 |  |  |  |  |  | my $readme_md = 'README.md'; | 
| 267 | 0 | 0 |  |  |  |  | if (open(my $out, '>', $readme_md)) { | 
| 268 | 0 |  |  |  |  |  | my $markdown = $parser->as_markdown; | 
| 269 | 0 |  |  |  |  |  | my $ci_badge = | 
| 270 |  |  |  |  |  |  | '[](https://travis-ci.org/kberov/Ado)'; | 
| 272 | 0 |  |  |  |  |  | $markdown =~ s/(\n.+Travis-CI.+\n)/$1\n$ci_badge\n\n/xgm; | 
| 273 | 0 |  |  |  |  |  | $out->say($markdown); | 
| 274 | 0 |  |  |  |  |  | $out->close; | 
| 275 | 0 |  |  |  |  |  | $self->log_info("Created $readme_md$/"); | 
| 276 |  |  |  |  |  |  | } | 
| 277 | 0 |  |  |  |  |  | else { Carp::croak("Could not create $readme_md... $!"); } | 
| 278 |  |  |  |  |  |  | } | 
| 279 |  |  |  |  |  |  | else { | 
| 280 | 0 |  |  |  |  |  | $self->SUPER::do_create_readme(); | 
| 281 |  |  |  |  |  |  | } | 
| 282 | 0 |  |  |  |  |  | return; | 
| 283 |  |  |  |  |  |  | } | 
| 284 |  |  |  |  |  |  |  | 
| 285 |  |  |  |  |  |  | 1; | 
| 286 |  |  |  |  |  |  |  | 
| 287 |  |  |  |  |  |  | =pod | 
| 288 |  |  |  |  |  |  |  | 
| 289 |  |  |  |  |  |  | =encoding utf8 | 
| 290 |  |  |  |  |  |  |  | 
| 291 |  |  |  |  |  |  | =head1 NAME | 
| 292 |  |  |  |  |  |  |  | 
| 293 |  |  |  |  |  |  | Ado::Build - Custom routines for Ado installation | 
| 294 |  |  |  |  |  |  |  | 
| 295 |  |  |  |  |  |  | =head1 SYNOPSIS | 
| 296 |  |  |  |  |  |  |  | 
| 297 |  |  |  |  |  |  | #Build.PL | 
| 298 |  |  |  |  |  |  | use 5.014000; | 
| 299 |  |  |  |  |  |  | use strict; | 
| 300 |  |  |  |  |  |  | use warnings FATAL => 'all'; | 
| 301 |  |  |  |  |  |  | use FindBin; | 
| 302 |  |  |  |  |  |  | use lib("$FindBin::Bin/lib"); | 
| 303 |  |  |  |  |  |  | use Ado::Build; | 
| 304 |  |  |  |  |  |  | my $builder = Ado::Build->new(..); | 
| 305 |  |  |  |  |  |  | $builder->create_build_script(); | 
| 306 |  |  |  |  |  |  |  | 
| 307 |  |  |  |  |  |  | #on the command line | 
| 308 |  |  |  |  |  |  | cd /path/to/cloned/Ado | 
| 309 |  |  |  |  |  |  | perl Build.PL | 
| 310 |  |  |  |  |  |  | ./Build | 
| 311 |  |  |  |  |  |  | ./Build test | 
| 312 |  |  |  |  |  |  | #change/add some code | 
| 313 |  |  |  |  |  |  | ./Build test | 
| 314 |  |  |  |  |  |  | ./Build perltidy | 
| 315 |  |  |  |  |  |  | ./Build dist | 
| 316 |  |  |  |  |  |  | ./Build submit | 
| 317 |  |  |  |  |  |  | #.... and so on | 
| 318 |  |  |  |  |  |  |  | 
| 319 |  |  |  |  |  |  |  | 
| 320 |  |  |  |  |  |  | =head1 DESCRIPTION | 
| 321 |  |  |  |  |  |  |  | 
| 322 |  |  |  |  |  |  | This is a subclass of L. We use L to add | 
| 323 |  |  |  |  |  |  | custom functionality. This module and L exist just because of | 
| 324 |  |  |  |  |  |  | the additional install paths that we use beside C and C and | 
| 325 |  |  |  |  |  |  | processing the files in those paths. These modules also can serve as examples | 
| 326 |  |  |  |  |  |  | for your own builders if you have some custom things to do during  build, test, | 
| 327 |  |  |  |  |  |  | install and even if you need to add a new C to your setup. | 
| 328 |  |  |  |  |  |  |  | 
| 329 |  |  |  |  |  |  | =head1 ATTRIBUTES | 
| 330 |  |  |  |  |  |  |  | 
| 331 |  |  |  |  |  |  | Ado::Build defines some attributes, used across different actions. | 
| 332 |  |  |  |  |  |  |  | 
| 333 |  |  |  |  |  |  | =head2 PERL_DIRS | 
| 334 |  |  |  |  |  |  |  | 
| 335 |  |  |  |  |  |  | Returns the list of absolute paths to directories in the project containing | 
| 336 |  |  |  |  |  |  | Perl files. Read-only. | 
| 337 |  |  |  |  |  |  |  | 
| 338 |  |  |  |  |  |  | $self->PERL_DIRS; | 
| 339 |  |  |  |  |  |  | #(/base/dir/bin, /base/dir/lib, /base/dir/t, /base/dir/etc) | 
| 340 |  |  |  |  |  |  |  | 
| 341 |  |  |  |  |  |  |  | 
| 342 |  |  |  |  |  |  |  | 
| 343 |  |  |  |  |  |  | =head1 METHODS | 
| 344 |  |  |  |  |  |  |  | 
| 345 |  |  |  |  |  |  | Ado::Build inherits all methods from L and implements | 
| 346 |  |  |  |  |  |  | the following ones. | 
| 347 |  |  |  |  |  |  |  | 
| 348 |  |  |  |  |  |  | =head2 create_build_script | 
| 349 |  |  |  |  |  |  |  | 
| 350 |  |  |  |  |  |  | This method is called in C. | 
| 351 |  |  |  |  |  |  | In this method we also call C for C C, | 
| 352 |  |  |  |  |  |  | C and C folders. | 
| 353 |  |  |  |  |  |  | Finally we set all the Cs for the distro | 
| 354 |  |  |  |  |  |  | and we call C<$self-ESUPER::create_build_script>. | 
| 355 |  |  |  |  |  |  |  | 
| 356 |  |  |  |  |  |  | =head2 process_etc_files | 
| 357 |  |  |  |  |  |  |  | 
| 358 |  |  |  |  |  |  | Moves files found in C to C. | 
| 359 |  |  |  |  |  |  | See L | 
| 360 |  |  |  |  |  |  | Returns void. | 
| 361 |  |  |  |  |  |  |  | 
| 362 |  |  |  |  |  |  | =head2 process_log_files | 
| 363 |  |  |  |  |  |  |  | 
| 364 |  |  |  |  |  |  | Moves files found in C to C. | 
| 365 |  |  |  |  |  |  | Returns void. | 
| 366 |  |  |  |  |  |  |  | 
| 367 |  |  |  |  |  |  | =head2 process_public_files | 
| 368 |  |  |  |  |  |  |  | 
| 369 |  |  |  |  |  |  | Moves files found in C to C. | 
| 370 |  |  |  |  |  |  | Returns void. | 
| 371 |  |  |  |  |  |  |  | 
| 372 |  |  |  |  |  |  | =head2 process_templates_files | 
| 373 |  |  |  |  |  |  |  | 
| 374 |  |  |  |  |  |  | Moves files found in C to C. | 
| 375 |  |  |  |  |  |  | Returns void. | 
| 376 |  |  |  |  |  |  |  | 
| 377 |  |  |  |  |  |  | =head2 ACTION_build | 
| 378 |  |  |  |  |  |  |  | 
| 379 |  |  |  |  |  |  | We put here custom functionality executed around the | 
| 380 |  |  |  |  |  |  | C<$self-ESUPER::ACTION_build>. See the source for details. | 
| 381 |  |  |  |  |  |  |  | 
| 382 |  |  |  |  |  |  | =head2 ACTION_test | 
| 383 |  |  |  |  |  |  |  | 
| 384 |  |  |  |  |  |  | We put here custom functionality executed around the | 
| 385 |  |  |  |  |  |  | C<$self-ESUPER::ACTION_test>. See the source for details. | 
| 386 |  |  |  |  |  |  |  | 
| 387 |  |  |  |  |  |  | =head2 ACTION_dist | 
| 388 |  |  |  |  |  |  |  | 
| 389 |  |  |  |  |  |  | We put here custom functionality executed around the | 
| 390 |  |  |  |  |  |  | C<$self-ESUPER::ACTION_dist>. See the sources for details. | 
| 391 |  |  |  |  |  |  |  | 
| 392 |  |  |  |  |  |  | =head2 ACTION_install | 
| 393 |  |  |  |  |  |  |  | 
| 394 |  |  |  |  |  |  | Changes file permissions to C<0600> of some files | 
| 395 |  |  |  |  |  |  | like C and to C<0400> of some files like C. | 
| 396 |  |  |  |  |  |  | You can put additional custom functionality here. | 
| 397 |  |  |  |  |  |  |  | 
| 398 |  |  |  |  |  |  | =head2 ACTION_fakeuninstall | 
| 399 |  |  |  |  |  |  |  | 
| 400 |  |  |  |  |  |  | Dry run for uninstall operation against module Ado. | 
| 401 |  |  |  |  |  |  |  | 
| 402 |  |  |  |  |  |  | =head2 ACTION_uninstall | 
| 403 |  |  |  |  |  |  |  | 
| 404 |  |  |  |  |  |  | Perform uninstall operation against Ado module. | 
| 405 |  |  |  |  |  |  |  | 
| 406 |  |  |  |  |  |  | =head2 ACTION_perltidy | 
| 407 |  |  |  |  |  |  |  | 
| 408 |  |  |  |  |  |  | Tidies all C<*.conf, *.pm, *.pl, *.t> files found in project | 
| 409 |  |  |  |  |  |  | directories C in the distribution. | 
| 410 |  |  |  |  |  |  | Uses the C<./pertidyrc> found in the project root directory. | 
| 411 |  |  |  |  |  |  | Cleans up all C<.bak> files. | 
| 412 |  |  |  |  |  |  | This action does not tidies C. | 
| 413 |  |  |  |  |  |  | Use C for that. | 
| 414 |  |  |  |  |  |  |  | 
| 415 |  |  |  |  |  |  | perl Build.PL | 
| 416 |  |  |  |  |  |  | ./Build perltidy | 
| 417 |  |  |  |  |  |  | ./Build | 
| 418 |  |  |  |  |  |  | ... | 
| 419 |  |  |  |  |  |  |  | 
| 420 |  |  |  |  |  |  | =head2 ACTION_submit | 
| 421 |  |  |  |  |  |  |  | 
| 422 |  |  |  |  |  |  | TODO: commit and push after testing tidying and who knows what.. | 
| 423 |  |  |  |  |  |  |  | 
| 424 |  |  |  |  |  |  | ./Build submit | 
| 425 |  |  |  |  |  |  |  | 
| 426 |  |  |  |  |  |  |  | 
| 427 |  |  |  |  |  |  |  | 
| 428 |  |  |  |  |  |  | =head2 do_create_readme | 
| 429 |  |  |  |  |  |  |  | 
| 430 |  |  |  |  |  |  | Creates the README file from C. | 
| 431 |  |  |  |  |  |  |  | 
| 432 |  |  |  |  |  |  | =head1 SEE ALSO | 
| 433 |  |  |  |  |  |  |  | 
| 434 |  |  |  |  |  |  | L, | 
| 435 |  |  |  |  |  |  | L, | 
| 436 |  |  |  |  |  |  | L, | 
| 437 |  |  |  |  |  |  | L, | 
| 438 |  |  |  |  |  |  | Build.PL in Ado distribution directory. | 
| 439 |  |  |  |  |  |  |  | 
| 440 |  |  |  |  |  |  | =head1 AUTHOR | 
| 441 |  |  |  |  |  |  |  | 
| 442 |  |  |  |  |  |  | Красимир Беров (Krasimir Berov) | 
| 443 |  |  |  |  |  |  |  | 
| 444 |  |  |  |  |  |  | =head1 COPYRIGHT AND LICENSE | 
| 445 |  |  |  |  |  |  |  | 
| 446 |  |  |  |  |  |  | Copyright 2013-2014 Красимир Беров (Krasimir Berov). | 
| 447 |  |  |  |  |  |  |  | 
| 448 |  |  |  |  |  |  | This program is free software, you can redistribute it and/or | 
| 449 |  |  |  |  |  |  | modify it under the terms of the | 
| 450 |  |  |  |  |  |  | GNU Lesser General Public License v3 (LGPL-3.0). | 
| 451 |  |  |  |  |  |  | You may copy, distribute and modify the software provided that | 
| 452 |  |  |  |  |  |  | modifications are open source. However, software that includes | 
| 453 |  |  |  |  |  |  | the license may release under a different license. | 
| 454 |  |  |  |  |  |  |  | 
| 455 |  |  |  |  |  |  | See http://opensource.org/licenses/lgpl-3.0.html for more information. | 
| 456 |  |  |  |  |  |  |  | 
| 457 |  |  |  |  |  |  | =cut | 
| 458 |  |  |  |  |  |  |  |