New and Improved: Here Comes the Flood

Posted in: Technical Track

In the last few weeks, I launched quite a few small releases to CPAN. Taken separately, they are hardly worth a full blog entry, but taken together, they’ll make for a lovely N&I entry. So if you have been wondering what I’ve been up recently, here goes:


Git::CPAN::Patch has one new command, git cpan-clone, provided by Mike Doherty, which mimics the behavior of git clone, but with cpan-added value.

Also, I dove back in the guts of Git::CPAN::Import and altered them so that the fetching of the cpan tarball uses MetaCPAN::API and LWP::UserAgent instead of CPANPLUS. That change gave the typical use-case a wee bit of a performance boost. How wee is that bit? Well:

[bash]# with CPANPlus

$ time git cpan-init Git::CPAN::Patch
[MSG] No ‘/usr/local/soft/cpanplus/custom-sources’ dir, skipping custom
[MSG] No ‘/usr/local/soft/cpanplus/custom-sources’ dir, skipping custom
[MSG] No ‘/usr/local/soft/cpanplus/custom-sources’ dir, skipping custom
importing Git::CPAN::Patch
downloading Git-CPAN-Patch-0.8.0.tar.gz
extracting distribution
created tag ‘v0.8.0’ (70cb4765ec367083b88d84a246053f0f4d9c4776)
Already on ‘master’ at
line 195
Branch master set up to track local ref refs/remotes/cpan/master.

real 0m59.742s
user 0m28.530s
sys 0m1.230s

# with MetaCPAN

$ time git cpan-init Git::CPAN::Patch
importing Git-CPAN-Patch (Git::CPAN::Patch)
downloading Git-CPAN-Patch
extracting distribution
created tag ‘0.8.0’ (5052f9cc1014fa042843155086943b92c4e4b43b)
Already on ‘master’ at
line 195
Branch master set up to track local ref refs/remotes/cpan/master.

real 0m2.755s
user 0m0.570s
sys 0m0.190s

A mere factor of 20 times faster. Boo-friggin’-yah.


The initial release of Email::Simple::Markdown satisfied my itch, but not the one, as it turned out, of my overlords. They wanted the html version of emails to still retain some pizzazz. Fair enough.

So I added the ability to provide a stylesheet for the html part of the email (as a string or a hashref, just for giggles) as well as a pre-markup filter to manipulate the pristine text version in something potentially more glamorous. And while I was at it, I also made possible for the user to choose between Text::Markdown and Text::MultiMarkdown for the markdown rendering engine.

[perl]my $email = Email::Simple::Markdown->create(
markdown_engine => ‘Text::Markdown’,
header => [ … ],
body => $text_with_markdown,
css => {
h1 => { color => ‘red’ },
pre_markdown_filter => sub {
# paste a pre-defined html banner at the top
$_ = $html_banner . $_;



An upcoming version of CPAN::Changes should contain a little patch of mine introducing tidy_changelog, which at its core is just a very simple wrapper around CPAN::Changes to parse and print out a changelog from the command-line.

Of course, I can’t let good enough alone, so the script can also do a little more, like figure out what file in the current directory is the changelog if you don’t specify it or print the headers off the changelog. It can work potentially in reverse, so that you can do things like figure out the last few dates of your releases:

[bash]$ tidy_changelog –headers –reverse | tail
changelog not provided, guessing ‘Changes’

0.15 2011-04-11

0.16 2011-04-12

0.17 2011-04-21

0.18 2011-10-18

0.19 2012-04-30


I like stats. And one morning I figured out that it would be nifty if the changelog of a distribution would also contain a churn indicator for each release. A few hours later, the last of my breakfast coffee was consumed as Dist::Zilla::Plugin::ChangeStats::Git was born, which is now appending the coveted numbers to my changes:

[perl]0.8.0 2012-05-22
[ENHANCEMENTS] – Added new command ‘cpan-clone’, which operates like git-clone [Mike
Doherty] [STATISTICS] – code churn: 1 files changed, 4 insertions(+), 86 deletions(-)


The release is pending Fayland‘s approval, but GitStore should soon be able to return the full history of a stored object in addition to returning the latest version.

[perl]use GitStore;
my $store = GitStore->new( ‘/path/to/git/repo’ );

# the good ol’ way
my $object = $store->get(‘/some/object’);

# new, and improved!
my @history = $store->history(‘/some/object’);

say "created at " . $history[0]->timestamp;

While this might look like a random act of patching, I’m actually paving the way for the rebirth of Galuga which, if you remember, is using git as its article repository. So, yeah, there is a method to my madness. I swear.


Here, I’m just riding the patch provided by Daniel Bruder, who added a Schwartzian Transform achievement to Perl::Achievements.

Dist::Zilla::PluginBundle::YANICK and Task::BeLike::YANICK

Well, okay, so both Dist::Zilla::PluginBundle::YANICK and Task::BeLike::YANICK are more for personal use. But, they can always be used by the curious to get an insight of the heap of tools that I typically rely on.

Want to talk with an expert? Schedule a call with our team to get the conversation started.

No comments

Leave a Reply

Your email address will not be published. Required fields are marked *