about summary refs log tree commit diff
path: root/lib
diff options
context:
space:
mode:
authorfranck cuny <franck@lumberjaph.net>2011-02-13 15:54:10 +0100
committerfranck cuny <franck@lumberjaph.net>2011-02-13 15:54:10 +0100
commit6e662082746507eadd10ec8bcd870a770c777134 (patch)
treec914d7191239fdc0a7d5ae9a751a5d9b129fa66a /lib
parentthat's why we want datetime (diff)
downloadjitterbug-6e662082746507eadd10ec8bcd870a770c777134.tar.gz
add configuration option to skip some branches; add tests for the Hook
Diffstat (limited to 'lib')
-rw-r--r--lib/jitterbug/Hook.pm111
1 files changed, 80 insertions, 31 deletions
diff --git a/lib/jitterbug/Hook.pm b/lib/jitterbug/Hook.pm
index 87cfba2..bf483d5 100644
--- a/lib/jitterbug/Hook.pm
+++ b/lib/jitterbug/Hook.pm
@@ -19,45 +19,91 @@ post '/' => sub {
 
     $payload = from_json($payload);
     my $repo = $payload->{repository}->{name};
+    my $ref  = $payload->{ref};
+
+    my $authorized = _authorized_branch( $repo, $ref );
+    if ( !$authorized ) {
+        debug("this branch is not authorized");
+        status 200;
+        return;
+    }
 
     my $project = schema->resultset('Project')->find( { name => $repo } );
 
-    if ( !$project ) {
-        debug("need to create a new project");
-        try {
-            schema->txn_do(
-                sub {
-                    $project = schema->resultset('Project')->create(
-                        {
-                            name => $repo,
-                            url  => $payload->{repository}->{url},
-                            description =>
-                              $payload->{repository}->{description},
-                            owner => to_json($payload->{repository}->{owner}),
-                        }
-                    );
-                }
-            );
-        }
-        catch {
-            error($_);
-        };
-    }
+    $project = _create_new_project($repo, $payload) if !$project;
 
     my $last_commit = pop @{ $payload->{commits} };
     $last_commit->{compare} = $payload->{compare};
     $last_commit->{pusher}  = $payload->{pushed};
     $last_commit->{ref}     = $payload->{ref};
 
+    _insert_commit($last_commit, $project);
+    _insert_new_task( $last_commit, $project );
+
+    debug("hook accepted");
+
+    { updated => $repo };
+};
+
+sub _authorized_branch {
+    my ($repo, $ref) = @_;
+    my $jtbg_conf     = setting 'jitterbug';
+    my $branches_conf = $jtbg_conf->{branches};
+
+    foreach my $name ($repo, 'jt_global') {
+        if ( defined $branches_conf->{$name} ) {
+            return 0 if _should_skip( $ref, $branches_conf->{$name} );
+        }
+    }
+    return 1;
+}
+
+sub _should_skip {
+    my ( $ref, $conf ) = @_;
+    foreach my $br_name (@$conf) {
+        return 1 if $ref =~ m!^refs/heads/$br_name!;
+    }
+    return 0;
+}
+
+sub _create_new_project {
+    my ($repo, $payload) = @_;
+
+    debug("need to create a new project");
+
+    my $project;
+    try {
+        schema->txn_do(
+            sub {
+                $project = schema->resultset('Project')->create(
+                    {
+                        name        => $repo,
+                        url         => $payload->{repository}->{url},
+                        description => $payload->{repository}->{description},
+                        owner => to_json( $payload->{repository}->{owner} ),
+                    }
+                );
+            }
+        );
+    }
+    catch {
+        error($_);
+    };
+    return $project;
+}
+
+sub _insert_commit {
+    my ($commit, $project) = @_;
+
     try {
         schema->txn_do(
             sub {
                 schema->resultset('Commit')->create(
                     {
-                        sha256    => $last_commit->{id},
-                        content   => to_json($last_commit),
+                        sha256    => $commit->{id},
+                        content   => to_json($commit),
                         projectid => $project->projectid,
-                        timestamp => $last_commit->{timestamp},
+                        timestamp => $commit->{timestamp},
                     }
                 );
             }
@@ -66,22 +112,25 @@ post '/' => sub {
     catch {
         error($_);
     };
+}
 
+sub _insert_new_task {
+    my ( $commit, $project ) = @_;
     try {
         schema->txn_do(
             sub {
                 schema->resultset('Task')->create(
-                    {sha256 => $last_commit->{id}, projectid => $project->projectid}
+                    {
+                        sha256    => $commit->{id},
+                        projectid => $project->projectid
+                    }
                 );
             }
         );
-    }catch{
+    }
+    catch {
         error($_);
     };
-
-    debug("hook accepted");
-
-    { updated => $repo };
-};
+}
 
 1;