summaryrefslogtreecommitdiffstats
path: root/preps/perl.d/fetchcpan
diff options
context:
space:
mode:
authorJustin Davis <jrcd83@gmail.com>2012-04-16 01:03:20 +0200
committerJustin Davis <jrcd83@gmail.com>2012-04-16 01:03:20 +0200
commit690e3e9a39e2691b483474725ee1a17d44231401 (patch)
tree9919cf2319fa08b8392659b63465c5c1434357c6 /preps/perl.d/fetchcpan
parent10ef1c3abeb88af473c34f8ddd18da3148796823 (diff)
downloadgenpkg-690e3e9a39e2691b483474725ee1a17d44231401.tar.gz
genpkg-690e3e9a39e2691b483474725ee1a17d44231401.tar.xz
Rename the metas/ directory to preps/.
This matches the prepkg script name.
Diffstat (limited to 'preps/perl.d/fetchcpan')
-rwxr-xr-xpreps/perl.d/fetchcpan60
1 files changed, 60 insertions, 0 deletions
diff --git a/preps/perl.d/fetchcpan b/preps/perl.d/fetchcpan
new file mode 100755
index 0000000..076599b
--- /dev/null
+++ b/preps/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
+}
+
+'