App-PAUSE-TimeMachine

 view release on metacpan or  search on metacpan

lib/App/PAUSE/TimeMachine.pm  view on Meta::CPAN

our $VERSION = '0.05';

use Pod::Usage ();
use IPC::Run;
use Plack::Runner;
use IO::Compress::Gzip ();
use File::pushd;

our $GIT_REPO = "git://github.com/batchpause/PAUSE-git";

sub new {
    my($class, %args) = @_;

    $args{git_dir} ||= $ENV{"PAUSETM_GIT_DIR"} || "$ENV{HOME}/.pausetm/PAUSE-git";
    bless {
        git_dir => $args{git_dir},
    }, $class;
}

sub psgi_app {
    my $self = shift;

    return sub {
        my $env = shift;

        if ($env->{PATH_INFO} eq '/') {
            return [200, ['Content-Type' => 'text/plain'], ["Access $env->{SCRIPT_NAME}/yyyy-mm-dd"]];
        }

        my $date = 'today';
        if ($env->{PATH_INFO} =~ s!^/([^/]+)!!) {
            $date = $1;
        }

        if ($env->{PATH_INFO} eq '/modules/02packages.details.txt.gz') {
            chomp(my $rev = $self->git_capture('rev-list', '-1', "--before=$date", 'master'));
            my $text = $self->git_capture('show', "$rev:02packages.details.txt");

            my($lastmod) = $text =~ m!^Last-Updated:\s*(.*)$!m;

            if ($env->{HTTP_IF_MODIFIED_SINCE} && $env->{HTTP_IF_MODIFIED_SINCE} eq $lastmod) {
                return [304, [], []];
            }

            IO::Compress::Gzip::gzip \$text => \my $gztext;
            return [
                200,
                [
                    'Content-Type' => 'application/x-gzip',
                    'Content-Length' => length($gztext),
                    'Last-Modified' => $lastmod,
                ],
                [$gztext],
            ];
        }

        if ($env->{PATH_INFO} =~ m!authors/id/!) {
            return [301, ['Location' => "http://backpan.perl.org/$env->{PATH_INFO}"], []];
        }

        return [404, ['Content-Type' => 'text/plain'], ["Not Found"]];
    };
}

sub git_dir {
    $_[0]->{git_dir};
}

sub run {
    my($self, @args) = @_;

    my $cmd = shift @args || "help";
    my $can = $self->can("cmd_$cmd") || $self->can("cmd_help");
    $self->$can(@args);
}

sub git_raw {
    my($self, @commands) = @_;
    IPC::Run::run ["git", @commands], \my $in, \*STDOUT;
}

sub git_opts {
    my $self = shift;
    ("--git-dir=" . $self->git_dir . "/.git", "--work-tree=.");
}

sub git {
    my($self, @commands) = @_;
    IPC::Run::run ["git", $self->git_opts, @commands];
}

sub git_capture {
    my($self, @commands) = @_;
    IPC::Run::run ["git", $self->git_opts, @commands], \my $in, \my $out;
    $out;
}

sub cmd_help {
    my $self = shift;
    Pod::Usage::pod2usage(1);
}

sub cmd_init {
    my $self = shift;
    $self->git_raw('clone', $GIT_REPO, $self->git_dir);
}

sub cmd_sync {
    my $self = shift;
    my $dir = pushd $self->git_dir;
    $self->git_raw('pull', 'origin', 'master');
}

sub cmd_cat {
    my($self, $date) = @_;
    chomp(my $rev = $self->git_capture('rev-list', '-1', "--before=$date", 'master'));
    $self->git('show', "$rev:02packages.details.txt");
}

sub cmd_server {
    my($self, @args) = @_;



( run in 1.439 second using v1.01-cache-2.11-cpan-39bf76dae61 )