App-ListRevDeps

 view release on metacpan or  search on metacpan

lib/App/ListRevDeps.pm  view on Meta::CPAN

    my %mdist; # mentioned dist, for checking circularity
    my %mmod;  # mentioned mod
    my %excluded; # to avoid showing skipped message multiple times

    my $do_list;
    $do_list = sub {
        my ($dist, $level) = @_;
        $level //= 0;
        log_debug("Listing reverse dependencies for dist %s (level=%d) ...", $mod, $level);

        my @res;

        if ($mdist{$dist}++) {
            push @errs, "Circular dependency (dist=$dist)";
            return ();
        }

        # list dists which depends on $dist. XXX we should switch to using the
        # API function instead, see CPAN::ReverseDependencies.
        my $depdists = $chi->compute(
            "metacpan-dist_rev_deps-$dist", $ce, sub {
                log_info("Querying MetaCPAN for dist %s ...", $dist);
                my $res = $mcpan->rev_deps($dist);
                if ($ENV{LOG_API_RESPONSE}) { log_trace("API result: %s", $res) }
                $res;
            });

        #use DD; dd $depdists;
        for my $d (@{ $depdists->{items} }) {
            my $d_name = $d->{_source}{distribution};
            if ($exclude_re && $d_name =~ $exclude_re) {
                log_info("Excluded dist %s", $d_name)
                    unless $excluded{$d_name}++;
                next;
            }
            my $res = {
                dist => $d_name,
            };
            if ($level < $maxlevel-1 || $maxlevel == -1) {
                $res->{rev_deps} = [$do_list->($d_name, $level+1)];
            }
            if ($raw) {
                push @res, $res;
            } else {
                push @res, join(
                    "",
                    "    " x $level,
                    $res->{dist},
                    "\n",
                    join("", @{ $res->{rev_deps} // [] }),
                );
            }
        }

        @res;
    };

    my @res;
    for (ref($mod) eq 'ARRAY' ? @$mod : $mod) {
        my $dist;
        # if it already looks like a dist, skip an API call
        if (/-/) {
            $dist = $_;
        } else {
            my $modinfo = $chi->compute(
                "metacpan-mod-$_", $ce, sub {
                    log_info("Querying MetaCPAN for module %s ...", $_);
                    my $res = $mcpan->module($_);
                    if ($ENV{LOG_API_RESPONSE}) { log_trace("API result: %s", $res) }
                    $res;
                });
            $dist = $modinfo->distribution;
        }
        push @res, $do_list->($dist);
    }
    my $res = $raw ? \@res : join("", @res);

    [200, @errs ? "Unsatisfiable dependencies" : "OK", $res,
     {"cmdline.exit_code" => @errs ? 200:0}];
}

1;
# ABSTRACT: List reverse dependencies of a Perl module

__END__

=pod

=encoding UTF-8

=head1 NAME

App::ListRevDeps - List reverse dependencies of a Perl module

=head1 VERSION

This document describes version 0.16 of App::ListRevDeps (from Perl distribution App-ListRevDeps), released on 2017-07-10.

=head1 SYNOPSIS

 # Use via list-rev-deps CLI script

=head1 DESCRIPTION

Currently uses MetaCPAN API and also scrapes the MetaCPAN website and by default
caches results for 24 hours.

=head1 FUNCTIONS


=head2 list_rev_deps

Usage:

 list_rev_deps(%args) -> [status, msg, result, meta]

List reverse dependencies of a Perl module.

This function is not exported.

Arguments ('*' denotes required arguments):



( run in 1.113 second using v1.01-cache-2.11-cpan-98e64b0badf )