#!/bin/sh mirror=${CPANMIRROR:-ftp://cpan.pair.com} path=/modules/02packages.details.txt.gz curl --silent "$mirror$path" | zcat 2>/dev/null | awk ' NR < 10 { next } { file = a[split($3, a, "/")] ver = a[split(file, a, "[-_]")] dist = substr(file, 1, length(file) - length(ver) - 1) if(!dist) next # ignore dists with no versions sub(/[.]tar[.].*$|[.]zip$/, "", ver) sub(/^[vV]/, "", ver) sub(/[.]pm$/, "", dist) # srsly? 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 { if(NR == 0) exit(1) for (dist in dists) { ver = dists[dist] print dist, ver, paths[dist] | "sort > cpan.dists" } close("sort > cpan.dists") # Prints modules out in sorted order, too! while((getline < "cpan.dists") > 0) { print $1 "\n" mods[$1,$2] > "cpan.mods" } } 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 } ' if [ $? -ne 0 ]; then echo "fetchcpan: failed to download package list from CPAN" 1>&2 exit 1 fi exit 0