From 6805e21a08f773dc4066c179dd78537c4dc339fb Mon Sep 17 00:00:00 2001
From: Julian Blake Kongslie <jblake@omgwallhack.org>
Date: Wed, 7 Jul 2010 12:13:45 -0700
Subject: Lots of stuff for manipulating IkiWiki setup scripts.

---
 usr/src/libpiny/Build.PL                 |  2 +-
 usr/src/libpiny/debian/changelog         |  6 +++
 usr/src/libpiny/lib/IkiWiki/FakeSetup.pm | 89 ++++++++++++++++++++++++++++++++
 3 files changed, 96 insertions(+), 1 deletion(-)
 create mode 100644 usr/src/libpiny/lib/IkiWiki/FakeSetup.pm

(limited to 'usr/src/libpiny')

diff --git a/usr/src/libpiny/Build.PL b/usr/src/libpiny/Build.PL
index 8639991..09cf3fb 100644
--- a/usr/src/libpiny/Build.PL
+++ b/usr/src/libpiny/Build.PL
@@ -2,7 +2,7 @@ use Module::Build;
 Module::Build->new
   ( module_name   => 'Piny'
   , license       => 'BSD-3'
-  , dist_version  => '0.5'
+  , dist_version  => '0.6'
   , requires      =>
     { 'Moose'               => 0
     , 'Email::Valid::Loose' => 0
diff --git a/usr/src/libpiny/debian/changelog b/usr/src/libpiny/debian/changelog
index 79952b6..df872b4 100644
--- a/usr/src/libpiny/debian/changelog
+++ b/usr/src/libpiny/debian/changelog
@@ -1,3 +1,9 @@
+libpiny-perl (0.6) unstable; urgency=low
+
+  * Added IkiWiki::FakeSetup for manipulating IkiWiki setup scripts.
+
+ -- Julian Blake Kongslie <jblake@omgwallhack.org>  Wed, 07 Jul 2010 12:12:37 -0700
+
 libpiny-perl (0.5) unstable; urgency=low
 
   * Allow listing repos and querying access rights.
diff --git a/usr/src/libpiny/lib/IkiWiki/FakeSetup.pm b/usr/src/libpiny/lib/IkiWiki/FakeSetup.pm
new file mode 100644
index 0000000..8a8b2d2
--- /dev/null
+++ b/usr/src/libpiny/lib/IkiWiki/FakeSetup.pm
@@ -0,0 +1,89 @@
+package IkiWiki::FakeSetup;
+
+use strict;
+use warnings;
+
+use Data::Dumper qw( );
+use Exporter qw( import );
+
+our @EXPORT_OK = qw( readSetup writeSetup );
+
+sub readSetup {
+  my ( $setupfile ) = @_;
+
+  # Sorry about the use of globals but it's hard to share lexicals with dynamically generated source.
+  $IkiWiki::FakeSetup::package = undef;
+  @IkiWiki::FakeSetup::args = ();
+
+  sub inc {
+    my ( $self, $file ) = @_;
+
+    my $package = $file;
+    $package =~ s/\//::/g;
+    $package =~ s/\.pm//;
+
+    my @src =
+      ( "package $package;\n"
+      , "sub import {\n"
+      , "  my ( \$class, \@args ) = \@_;\n"
+      , "  print 'in import\\n';"
+      , "  \$IkiWiki::FakeSetup::package = \$class;\n"
+      , "  \@IkiWiki::FakeSetup::args = \@args;\n"
+      , "}\n"
+      , "1;\n"
+      );
+
+    return sub { if ( scalar @src ) { $_ = shift @src; return 1; } else { return 0; } };
+
+  };
+
+  eval {
+    my @oldINC = @INC;
+    @INC = ( ".", \&inc );
+
+    my %oldINC = %INC;
+    %INC = ( );
+
+    do $setupfile;
+
+    @INC = @oldINC;
+    %INC = %oldINC;
+  };
+
+  return ( $IkiWiki::FakeSetup::package, @IkiWiki::FakeSetup::args );
+
+}
+
+sub writeSetup {
+  my ( $package, @args ) = @_;
+
+  my $d = Data::Dumper->new( \@args );
+  $d->Terse( 1 );
+
+  return "#!/usr/bin/perl\n\nuse $package " . $d->Dump( ) . ";\n";
+}
+
+1;
+
+__END__
+
+Because it may not be completely obvious, here's how you would use this:
+
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+
+use IkiWiki::FakeSetup qw( readSetup writeSetup );
+
+# This reads the setup file, returning the package it uses and any configuration it passed to that package.
+my ( $package, $config ) = readSetup( "almighty_ikiwiki_template.setup" );
+
+# Make changes to the configuration.
+$config->{"srcdir"} = "/some/dir";
+$config->{"adminemail"} = "somejerk\@jerkville.com";
+
+# Open a new file, and write the changed configuration to it.
+open( SETUP, ">", "almighty_ikiwiki_template_changed.setup" );
+print SETUP writeSetup( $package, $config );
+close( SETUP );
-- 
cgit v1.2.3