package Jifty::Script::Adopt; use warnings; use strict; use base qw/App::CLI::Command/; use File::Copy (); use File::Spec (); use File::Basename (); use Jifty::Util; =head1 NAME Jifty::Script::Adopt - localize a stock jifty component =head1 DESCRIPTION Creates directories and copies files for you, launching $ENV{EDITOR} if it is defined. =head2 options =over =item --ls PATH List the contents of the stock components path. =back =cut sub options { ( 'l|ls' => 'list', 't|tree' => 'tree', ) } =head2 run jifty adopt web/templates/_elements/nav jifty adopt --ls web/static/ =cut sub run { my $self = shift; my (@args) = @_; my $filename = shift(@args); $filename ||= ''; my @parts = split(/[\/\\]/, $filename); if($self->{list}) { my $dir = File::Spec->catfile(Jifty::Util->share_root, @parts); unless(-d $dir) { warn "no such directory $dir"; } opendir(my $dh, $dir) or die; my @files = sort(grep(! /^\.\.?$/, readdir($dh))); my @dirs; # sort directories first for(my $i = 0; $i < @files; $i++) { # List::MoreUtil::part ? if(-d File::Spec->catfile($dir, $files[$i])) { push(@dirs, splice(@files, $i, 1) . '/'); $i--; } } print join("\n", @dirs, @files, ''); exit; } elsif($self->{tree}) { # Just punting here, maybe don't need this usage except when you # have no tree command? Oh, the irony. my $dir = File::Spec->catfile(Jifty::Util->share_root, @parts); unless(-d $dir) { warn "no such directory $dir"; } system('tree', $dir) and die "oops $!"; exit; } unless($filename) { die "usage: jifty adopt \n"; } my $share = 'share'; unless(-d $share) { die "must be run from your app directory\n"; } my $source = File::Spec->catfile(Jifty::Util->share_root, @parts); (-e $source) or die "no such source file '$source'\n"; my $dest = File::Spec->catfile($share, @parts); unless(-d File::Basename::dirname($dest)) { Jifty::Util->make_path($dest); } if(-e $dest) { print "$dest exists, overwrite? [n]\n"; chomp(my $ans = ); $ans ||= 'n'; exit 1 unless(lc($ans) eq 'y'); } File::Copy::copy($source, $dest) or die "copy failed $!"; chmod(0644, $dest) or die "cannot change mode $!"; # TODO put an option on that? if($ENV{EDITOR}) { fork and exit; exec("$ENV{EDITOR} $dest"); } } # end run # original author: Eric Wilhelm 1; # vim:ts=4:sw=4:et:sta