From 585ce5b679406ffe8644b23e3a267d7af8e3a5de Mon Sep 17 00:00:00 2001 From: franck cuny Date: Thu, 23 Sep 2010 22:09:36 +0200 Subject: initial import --- lib/jitterbug.pm | 24 ++++++++++++++++++ lib/jitterbug/Hook.pm | 42 +++++++++++++++++++++++++++++++ lib/jitterbug/Plugin/Redis.pm | 21 ++++++++++++++++ lib/jitterbug/Project.pm | 57 +++++++++++++++++++++++++++++++++++++++++++ lib/jitterbug/WebService.pm | 34 ++++++++++++++++++++++++++ 5 files changed, 178 insertions(+) create mode 100644 lib/jitterbug.pm create mode 100644 lib/jitterbug/Hook.pm create mode 100644 lib/jitterbug/Plugin/Redis.pm create mode 100644 lib/jitterbug/Project.pm create mode 100644 lib/jitterbug/WebService.pm (limited to 'lib') diff --git a/lib/jitterbug.pm b/lib/jitterbug.pm new file mode 100644 index 0000000..47c186e --- /dev/null +++ b/lib/jitterbug.pm @@ -0,0 +1,24 @@ +package jitterbug; + +BEGIN { + use Dancer ':syntax'; + load_plugin 'jitterbug::Plugin::Redis'; +}; + +our $VERSION = '0.1'; + +load_app 'jitterbug::Hook', prefix => '/hook'; +load_app 'jitterbug::Project', prefix => '/project'; +load_app 'jitterbug::WebService', prefix => '/api'; + +before_template sub { + my $tokens = shift; + $tokens->{uri_base} = request->base; +}; + +get '/' => sub { + my @projects = redis->smembers(key_projects); + template 'index', {projects => \@projects}; +}; + +true; diff --git a/lib/jitterbug/Hook.pm b/lib/jitterbug/Hook.pm new file mode 100644 index 0000000..ae17b4b --- /dev/null +++ b/lib/jitterbug/Hook.pm @@ -0,0 +1,42 @@ +package jitterbug::Hook; + +BEGIN { + use Dancer ':syntax'; + load_plugin 'jitterbug::Plugin::Redis'; +}; + +setting serializer => 'JSON'; + +post '/' => sub { + my $hook = from_json(params->{payload}); + + my $repo = $hook->{repository}->{name}; + + my $repo_key = key_project($repo); + + if ( !redis->exists($repo_key) ) { + my $project = { + name => $repo, + url => $hook->{repository}->{url}, + description => $hook->{repository}->{description}, + owner => $hook->{repository}->{owner}, + }; + redis->set( $repo_key, to_json($project) ); + redis->sadd(key_projects, $repo); + } + + my $last_commit = pop @{ $hook->{commits} }; + + $last_commit->{repo} = $hook->{repository}->{url}; + $last_commit->{project} = $repo; + $last_commit->{compare} = $hook->{compare}; + + my $task_key = key_task_repo($repo); + redis->set($task_key, to_json($last_commit)); + + redis->sadd(key_tasks, $task_key); + + { updated => $repo }; +}; + +1; diff --git a/lib/jitterbug/Plugin/Redis.pm b/lib/jitterbug/Plugin/Redis.pm new file mode 100644 index 0000000..d2be756 --- /dev/null +++ b/lib/jitterbug/Plugin/Redis.pm @@ -0,0 +1,21 @@ +package jitterbug::Plugin::Redis; + +use Dancer::Config qw/setting/; +use Dancer::Plugin; +use Redis; + +register redis => sub { + Redis->new( server => setting('redis') ); +}; + +sub _key { join( ':', 'jitterbug', @_ ); } + +register key_projects => sub { _key('projects'); }; +register key_project => sub { _key('project', @_); }; +register key_builds_project => sub { _key('builds', @_); }; +register key_task_repo => sub { _key('tasks', @_); }; +register key_tasks => sub { _key('tasks'); }; + +register_plugin; + +1; diff --git a/lib/jitterbug/Project.pm b/lib/jitterbug/Project.pm new file mode 100644 index 0000000..904ebf9 --- /dev/null +++ b/lib/jitterbug/Project.pm @@ -0,0 +1,57 @@ +package jitterbug::Project; + +BEGIN { + use Dancer ':syntax'; + load_plugin 'jitterbug::Plugin::Redis'; +}; + +use DateTime; +use XML::Feed; + +get '/:project' => sub { + my $project = params->{project}; + + my $res = redis->get( key_project($project) ); + + send_error( "Project $project not found", 404 ) if !$res; + + my $desc = from_json($res); + + my @ids = redis->smembers( key_builds_project($project) ); + + my @builds; + foreach my $id (@ids) { + my $res = redis->get($id); + push @builds, from_json($res) if $res; + } + + template 'project/index', + { project => $project, builds => \@builds, %$desc }; +}; + +get '/:project/feed' => sub { + my $project = params->{project}; + + my @builds = reverse( redis->smembers( key_builds_project($project) ) ); + + my $feed = XML::Feed->new('Atom'); + $feed->title('builds for '.$project); + + foreach (splice(@builds, 0, 5)) { + my $res = redis->get($_); + next unless $res; + my $desc = from_json($res); + + foreach my $version (keys %{$desc->{version}}) { + my $entry = XML::Feed::Entry->new(); + $entry->title("build for ".$desc->{commit}.' on '.$version); + $entry->summary("Result: ".$desc->{version}->{$version}); + $feed->add_entry($entry); + } + } + + content_type('application/atom+xml'); + $feed->as_xml; +}; + +1; diff --git a/lib/jitterbug/WebService.pm b/lib/jitterbug/WebService.pm new file mode 100644 index 0000000..4f89be8 --- /dev/null +++ b/lib/jitterbug/WebService.pm @@ -0,0 +1,34 @@ +package jitterbug::WebService; + +BEGIN { + use Dancer ':syntax'; + load_plugin 'jitterbug::Plugin::Redis'; +} + +use File::Spec; + +set serializer => 'JSON'; + +get '/build/:project/:commit/:version' => sub { + my $project = params->{project}; + my $commit = params->{commit}; + my $version = params->{version}; + + my $conf = setting 'jitterbug'; + + my $file = File::Spec->catfile( $conf->{reports}->{dir}, + $project, $commit, $version . '.txt' ); + + if ( -f $file ) { + open my $fh, '<', $file; + my @content = <$fh>; + close $fh; + { + commit => $commit, + version => $version, + content => join( '', @content ), + }; + } +}; + +1; -- cgit 1.4.1