#!/usr/bin/perl -w
###########################################
# github-push-receiver.cgi
# Github receive hook to publish via tpage
# Mike Schilli, 2012 (m@perlmeister.com)
###########################################
use strict;
use CGI qw( :all );
use Log::Log4perl qw(:easy);
use JSON qw( from_json );
use Sysadm::Install qw( :all );
use File::Basename;

my( $home ) = glob "~";

my $target_dir =
  "$home/htdocs/perlsnapshot";
my $repo_dir =
  "$home/perlsnapshot.git";
my $github_repo =
    # read-only
  "git://github.com/mschilli" .
  "/perlsnapshot.git";

Log::Log4perl->easy_init( { 
  file => ">>$home/gpr.log",
  level => $DEBUG,
});

print header( 'text/txt' );

my $json = param( 'payload' );

if( !defined $json ) {
    LOGDIE "Parameter payload missing";
}

if( ! -d $repo_dir ) {
  cd dirname $repo_dir;
  tap qw( git clone ), $github_repo,
      basename $repo_dir;
  cdback;
}

  # Get latest update from Github
cd $repo_dir;
tap "git", "pull", "origin", "master";
cdback;

my $payload = from_json( $json );

cd $repo_dir;

for my $commit ( 
  @{ $payload->{ commits } } ) {

  INFO "Commit found: $commit->{ id }";

  for my $file ( 
    @ { $commit->{ modified } } ) {

    INFO "Modified: $file";

    if( $file =~ m#^(\d{3}\.txt)$# ) {

      ( my $html_file = $file ) =~
        s/\.txt$/.html/;

      sysrun "tpage $file " .
             ">$target_dir/$html_file";
    }
  }
}

print "OK\n";
DEBUG "Finished";
