App-GitHub-FindRepository

 view release on metacpan or  search on metacpan

lib/App/GitHub/FindRepository.pm  view on Meta::CPAN

        return $_ if -f && -r _ && -x _;
    }

    return undef;
}

sub do_usage (;$) {
    my $error = shift;
    warn $error if $error;
    warn <<_END_;

Usage: github-find-repository [...] <repository>

    --pinger <pinger>   The pinger to use (default is either git-ls-remote or git-peek-remote)

    --getter <getter>   The getter to use (default is LWP then curl)

    --git-protocol      Don't try to determine the repository by sniffing HTML, just use git://
                        NOTE: This mode will only check the given casing then lowercase

    --output <output>   One of (case insensitive):

                        Given "http://github.com/robertkrimen/aPp-giTHub-findRepoSitory.git"

                        URL      http://github.com/robertkrimen/App-GitHub-FindRepository.git
                        public   git://github.com/robertkrimen/App-GitHub-FindRepository.git
                        private  git\@github.com:robertkrimen/App-GitHub-FindRepository.git
                        base     robertkrimen/App-GitHub-FindRepository
                        name     App-GitHub-FindRepository
                        home     http://github.com/robertkrimen/App-GitHub-FindRepository

    --help, -h, -?      This help

    <repository>        The repository to test, can be like:

                        git://github.com/robertkrimen/App-GitHub-FindRepository.git
                        robertkrimen/App-GitHub-FindRepository.git
                        robertkrimen,App-GitHub-FindRepository

For example:

    github-find-repository --getter curl robertkrimen,aPp-giTHuB-findRepOsitory

_END_

    exit -1 if $error;
}

sub do_found ($$) {
    my $output = shift;
    my $repository = shift;
    if ($output) {
        print $repository->$output, "\n";
    }
    else {
        print "$repository\n";
    }
    exit 0;
}

sub do_not_found ($) {
    my $repository = shift;
    warn <<_END_;
$0: Repository \"$repository\" not found
_END_
    exit -1;
}

sub pinger {
    my $self = shift;
    return $ENV{GH_FR_PINGER} || _find_in_path 'git-ls-remote' || _find_in_path 'git-peek-remote';
}

sub _get_by_LWP {
    my $self = shift;
    return sub {
        my $url = shift;
        my $agent = LWP::UserAgent->new;
        my $response = $agent->get( $url );
        die $response->status_line, "\n" unless $response->is_success;
        return $response->decoded_content;
    };
}

sub _get_by_curl {
    my $self = shift;
    my $curl = shift;
    return sub {
        my $url = shift;
        return `$curl -s -L $url`;
    };
}
sub getter {
    my $self = shift;
    my $getter = shift;

    return $getter if ref $getter eq 'CODE';

    $getter = 'LWP' unless $getter;
        
    die "Oh my god no!\n" if $getter eq '^';

    my $command;
    if ($getter =~ m/^LWP$/i && eval "require LWP::UserAgent") {
        return $self->_get_by_LWP;
    }
    elsif ($command = _find_in_path 'curl') {
        return $self->_get_by_curl( $command );
    }

    return undef;
}

sub parse_repository {
    my $self = shift;
    return App::GitHub::FindRepository::Repository->parse( @_ );
}

sub find {
    my $self = shift;
    my $repository = $self->parse_repository( shift );

lib/App/GitHub/FindRepository.pm  view on Meta::CPAN


    return undef;
}

sub run {
    my $self = shift;
    
    my ($getter, $pinger, $git_protocol, $output, $help);
    GetOptions(
        'help|h|?' => \$help,
        'getter=s' => \$getter,
        'pinger=s' => \$pinger,
        'output=s' => \$output,
        'git-protocol' => \$git_protocol,
    );

    if ($help) {
        do_usage;
        exit 0;
    }

    $pinger = $self->pinger unless $pinger;

    my $repository = join '', @ARGV;

    do_usage <<_END_ unless $repository;
$0: You need to specify a repository
_END_

    if ($output) {
        $output = lc $output;
        $output =~ m/^(base|public|private|url|name|home)$/ or do_usage <<_END_;
$0: Unrecogonized output option "$output"
_END_
    }

    eval {
        my $repository = $repository;
        if ($git_protocol) {
            $repository = $self->find_by_git( $repository, pinger => $pinger );
        }
        else {
            $repository = $self->find( $repository, getter => $getter, pinger => $pinger );
        }

        do_found $output, $repository if $repository;
    };
    if ($@ =~ m/No pinger!/) {
        do_usage <<_END_;
$0: No pinger given and couldn't find git-ls-remote or git-peek-remote in \$PATH
_END_
    }
    elsif ($@) {
        my $error = $@;
        chomp $error;
        do_usage <<_END_;
$0: There was an error: $error
_END_
    }

    do_not_found $repository;
}

=head1 AUTHOR

Robert Krimen, C<< <rkrimen at cpan.org> >>

=head1 BUGS

Please report any bugs or feature requests to C<bug-app-github-findrepository at rt.cpan.org>, or through
the web interface at L<http://rt.cpan.org/NoAuth/ReportBug.html?Queue=App-GitHub-FindRepository>.  I will be notified, and then you'll
automatically be notified of progress on your bug as I make changes.




=head1 SUPPORT

You can find documentation for this module with the perldoc command.

    perldoc App::GitHub::FindRepository


You can also look for information at:

=over 4

=item * RT: CPAN's request tracker

L<http://rt.cpan.org/NoAuth/Bugs.html?Dist=App-GitHub-FindRepository>

=item * AnnoCPAN: Annotated CPAN documentation

L<http://annocpan.org/dist/App-GitHub-FindRepository>

=item * CPAN Ratings

L<http://cpanratings.perl.org/d/App-GitHub-FindRepository>

=item * Search CPAN

L<http://search.cpan.org/dist/App-GitHub-FindRepository/>

=back


=head1 ACKNOWLEDGEMENTS


=head1 COPYRIGHT & LICENSE

Copyright 2009 Robert Krimen, all rights reserved.

This program is free software; you can redistribute it and/or modify it
under the same terms as Perl itself.


=cut

__PACKAGE__; # End of App::GitHub::FindRepository



( run in 0.830 second using v1.01-cache-2.11-cpan-5623c5533a1 )