diff options
Diffstat (limited to 'lib/metas/perl.d/fetchcpan')
-rwxr-xr-x | lib/metas/perl.d/fetchcpan | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/lib/metas/perl.d/fetchcpan b/lib/metas/perl.d/fetchcpan new file mode 100755 index 0000000..076599b --- /dev/null +++ b/lib/metas/perl.d/fetchcpan @@ -0,0 +1,60 @@ +#!/bin/sh + +mirror=${CPANMIRROR:-ftp://cpan.pair.com} +path=/modules/02packages.details.txt.gz + +curl --silent "$mirror$path" | gzip -dc | awk ' +NR < 10 { next } +{ + file = a[split($3, a, "/")] + + if (!match(file, /[-_][vV]?[0-9]+/)) { + #print "error: failed to grok " $3 | "cat 1>&2" + next + } + ver = substr(file, RSTART+1) + dist = substr(file, 1, RSTART-1) + + sub(/[.]tar[.].*$|[.]zip$/, "", ver) + sub(/^[vV]/, "", ver) + sub(/[.]pm$/, "", dist) + + if(dist == "perl") next + + mods[dist,ver] = mods[dist,ver] $1 " " $2 "\n" + if (lessthan(dists[dist], ver)) { + dists[dist] = ver + paths[dist] = $3 + } +} + +END { + for (dist in dists) { + ver = dists[dist] + print dist, ver, paths[dist] | "sort >cpandists" + } + close("sort >cpandists") + + # Prints modules out in sorted order, too! + while(getline<"cpandists" > 0) { + print $1 "\n" mods[$1,$2] >"cpanmods" + } +} + +function lessthan (l, r) +{ + return decver(l) < decver(r) +} + +function decver (vs) +{ + pcnt = gsub(/[.]/, ".", vs) + if (pcnt < 2) return vs + + len = split(vs, vc, ".") + dec = vc[1] + for (i=2; i<=len; i++) dec += (10 ^ (-i * 3)) * vc[i] + return dec +} + +' |