The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
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 <filename>\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 = <STDIN>); $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