r38592 - /scripts/cpan-unpackaged-deps.pl
ryan52-guest at users.alioth.debian.org
ryan52-guest at users.alioth.debian.org
Thu Jun 25 10:06:54 UTC 2009
Author: ryan52-guest
Date: Thu Jun 25 10:06:33 2009
New Revision: 38592
URL: http://svn.debian.org/wsvn/?sc=1&rev=38592
Log:
add a script to map out unpackaged dependencies and generate a nice chart
Added:
scripts/cpan-unpackaged-deps.pl (with props)
Added: scripts/cpan-unpackaged-deps.pl
URL: http://svn.debian.org/wsvn/scripts/cpan-unpackaged-deps.pl?rev=38592&op=file
==============================================================================
--- scripts/cpan-unpackaged-deps.pl (added)
+++ scripts/cpan-unpackaged-deps.pl Thu Jun 25 10:06:33 2009
@@ -1,0 +1,117 @@
+#!/bin/perl
+
+package CPAN::Dist;
+
+use strict;
+use warnings;
+
+use Parse::CPAN::Meta;
+use DhMakePerl;
+
+our %modules;
+our %dists;
+our $dh_make_perl;
+
+sub init {
+ $dh_make_perl = DhMakePerl->new();
+ $dh_make_perl->cfg(DhMakePerl::Config->new());
+ $dh_make_perl->cfg->dist("sid");
+ my $f = `mktemp`;
+ chomp $f;
+ system("wget -q -O - http://cpan.hexten.net/modules/02packages.details.txt.gz | gunzip - | sed '1,/^\$/ d' > $f");
+ open F, $f;
+ while(<F>) {
+ my ($module, undef, $dist) = split(/\s+/, $_);
+ $modules{$module} = $dist;
+ }
+ close F;
+ unlink $f;
+}
+
+sub new {
+ my $class = shift;
+ my $self = {};
+ $self->{module} = shift;
+ bless $self, $class;
+ return if($self->packaged());
+ $self->{path} = $modules{$self->{module}};
+ return if(!$self->{path});
+ $self->{path} =~ /^.*\/(.*)-.*.(?:tar.gz|tgz)$/;
+ $self->{dist} = $1;
+ if(!$self->{dist}) {
+ print "ERROR: " . $self->{path} . "\n";
+ }
+ if(!$dists{$self->{dist}}) {
+ $self->initialize();
+ $dists{$self->{dist}} = $self;
+ }
+ return $dists{$self->{dist}};
+}
+
+sub initialize {
+ my $self = shift;
+ $self->{url} = "http://cpan.hexten.net/authors/id/" . $self->{path};
+ $self->{url} =~ s/(?:\.tar\.gz|tgz)$/.meta/;
+ my $f = `mktemp`;
+ chomp $f;
+ system("wget", "-q", "-O", $f, $self->{url});
+ $self->{meta} = Parse::CPAN::Meta::LoadFile($f);
+ unlink $f;
+ $self->make_deps();
+}
+
+sub make_deps {
+ my $self = shift;
+ my @requires = keys %{$self->{meta}->{requires}};
+ my @build_requires = keys %{$self->{meta}->{build_requires}};
+ my @deplist = (@requires, @build_requires);
+ my %deps_hash;
+ $deps_hash{$_} = 1 foreach(@deplist);
+ my @final_list = sort keys %deps_hash;
+ @{$self->{deps}} = map {ref($self)->new($_)} @final_list;
+ return $self->{deps};
+}
+
+sub packaged {
+ my $self = shift;
+ return "perl-modules" if($dh_make_perl->is_core_module($self->{module}));
+ return $dh_make_perl->get_apt_contents->find_perl_module_package($self->{module});
+}
+
+sub dists {
+ return %dists;
+}
+
+package main;
+
+use strict;
+use warnings;
+
+sub c {
+ my $str = shift;
+ $str =~ s/-/_/g;
+ return $str;
+}
+
+CPAN::Dist::init();
+my $dist = CPAN::Dist->new(shift);
+%dists = CPAN::Dist::dists();
+delete $dists{$dist->{dist}};
+my @a = ($dist, values %dists);
+my $f = `mktemp`;
+chomp $f;
+open OUT, ">", $f;
+print OUT "digraph G {\n";
+foreach(@a) {
+ my $dist = $_->{dist};
+ my @deps = @{$_->{deps}};
+ foreach(@deps) {
+ my $dep = $_->{dist};
+ print OUT " " . c($dist) . " -> " . c($dep) . ";\n";
+ }
+}
+print OUT "}\n";
+close OUT;
+system("dot", "-Tpng", "-o", "output.png", $f);
+unlink $f;
+
Propchange: scripts/cpan-unpackaged-deps.pl
------------------------------------------------------------------------------
svn:executable = *
More information about the Pkg-perl-cvs-commits
mailing list