hmmm....

Finding Stuff in Your Local CPAN Mirror

So you’ve got this great new local CPAN you can use to install stuff you know about but how do you find stuff you don’t know about? There are two main ways I inspect the contents of my local CPAN mirror. The first is a simple shell function for searching package names, the second, has a bit more to it but we will save that for later.

grep to the Rescue

One of the metadata files in our local mirror is /modules/02packages.details.txt.gz. Let’s take a look inside.

/modules/02packages.details.txt.gz
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
File:         02packages.details.txt
URL:          http://www.perl.com/CPAN/modules/02packages.details.txt
Description:  Package names found in directory $CPAN/authors/id/
Columns:      package name, version, path
Intended-For: Automated fetch routines, namespace documentation.
Written-By:   CPAN::Mini::Inject 0.33
Line-Count:   145223
Last-Updated: Tue, 12 Aug 2014 15:01:40 GMT

AAA::Demo                         undef  J/JW/JWACH/Apache-FastForward-1.1.tar.gz
AAA::eBay                         undef  J/JW/JWACH/Apache-FastForward-1.1.tar.gz
AAAA::Crypt::DH                    0.04  B/BI/BINGOS/AAAA-Crypt-DH-0.04.tar.gz
AAAA::Mail::SpamAssassin          0.002  S/SC/SCHWIGON/AAAA-Mail-SpamAssassin-0.002.tar.gz
AAAAAAAAA                          1.01  M/MS/MSCHWERN/AAAAAAAAA-1.01.tar.gz
AAC::Pvoice                        0.91  J/JO/JOUKE/AAC-Pvoice-0.91.tar.gz
AAC::Pvoice::Bitmap                1.12  J/JO/JOUKE/AAC-Pvoice-0.91.tar.gz
AAC::Pvoice::Dialog                1.01  J/JO/JOUKE/AAC-Pvoice-0.91.tar.gz
...

The format is pretty straightforward. After a few header lines, we have one line per package seen by the indexer. The lines consist of three whitespace separated columns of a package name, current package version (if the indexer found one), and latest distribution containing it. The AAC-Provoice and Apache-FastForward distributions show us that each individual package within the distribution is listed. We could easily use zgrep to find packages that match a pattern.

/modules/02packages.details.txt.gz
1
2
3
4
5
$ zgrep -i tiny ~/Dropbox/minicpan/modules/02packages.details.txt.gz
Acme::Has::Tiny                   0.001  T/TO/TOBYINK/Acme-Has-Tiny-0.001.tar.gz
Acme::Module::Build::Tiny          0.0   D/DA/DAGOLDEN/Acme-Acme-Module-Build-Tiny-0.06.tar.gz
Acme::Tiny                        0.003  E/ET/ETHER/Acme-Tiny-0.003.tar.gz
...

This is a little long to type regularly. A shell alias isn’t appropriate as we want to sandwich the provided input between zgrep and the path to the file. Fortunately, a shell function will allow us to do this without much more verbosity.

1
2
3
function cpangrep {
    zgrep $* /home/yourusername/Dropbox/minicpan/modules/02packages.details.txt.gz
}

Dropping this line in your .zshrc or .bashrc will allow you to search 02packages.details.txt.gz with the cpangrep command.

1
2
3
4
5
6
7
8
$ cpangrep tiny | wc -l
21
$ cpangrep -i tiny | wc -l
344
$ cpangrep -i tiny
Acme::Has::Tiny                   0.001  T/TO/TOBYINK/Acme-Has-Tiny-0.001.tar.gz
Acme::Module::Build::Tiny          0.06  D/DA/DAGOLDEN/Acme-Acme-Module-Build
...

Since we use $* instead of $1, all arguments we give to the function are passed on to zgrep. This allows us to do things like search with or without ignoring case on demand.

CPAN::Mini::Webserver

CPAN::Mini::Webserver provides a script that launches a web server providing an interface to your local minicpan. Usage couldn’t be easier, install CPAN::Mini::Webserver then run minicpan_webserver. By default the server binds to port 2963 but you can change this with the --port argument.

If you’ve used search.cpan.org or metacpan, there should be no surprises in how to navigate around the site. The documentation has information on a few things you can plug in to your .minicpanrc to enable things like full text indexing.

Here are a few screenshots of CPAN::Mini::Webserver to wet your appetite.

Comments