1 package Girocco
::Notify
;
17 # This Perl code creates json payload within post-receive hook.
20 my ($proj, $commit) = @_;
22 my @gcmd = ($Girocco::Config
::git_bin
, '--git-dir='.$proj->{path
});
25 open $fd, '-|', @gcmd, 'log', '-1', '--pretty=format:%ae %an%n%ai%n%s%n%n%b', $commit
26 or die "cannot do git log: $! $?";
30 my ($ae, $an) = ($l[0] =~ /^(.*?) (.*)$/);
32 my $msg = join("\n", splice(@l, 2));
33 # Up to three trailing newlines in case of no body.
34 chomp $msg; chomp $msg; chomp $msg;
36 my ($rf, $af, $mf) = ([], [], []);
37 open $fd, '-|', @gcmd, 'diff-tree', '--name-status', '-r', "$commit^", $commit
38 or die "cannot do git diff-tree: $! $?";
41 my ($s, $file) = split(/\t/, $_);
58 "url" => $Girocco::Config
::gitweburl
."/".$proj->{name
}.".git/commit/".$commit,
59 "author" => { "name" => $an, "email" => $ae },
65 my ($url, $proj, $user, $ref, $oldrev, $newrev) = @_;
69 $pusher = { "name" => $user->{name
} };
70 if ($user->{name
} ne 'mob') {
71 $pusher->{"email"} = $user->{email
};
77 foreach my $commit (get_commits
($proj, $ref, $oldrev, $newrev)) {
78 push @
$commits, json_commit
($proj, $commit);
81 # This is backwards-compatible with GitHub (except the GitHub-specific
82 # full project name construction sometimes performed in clients)
83 my $payload = encode_json
{
89 "name" => $proj->{name
},
90 # Girocco extension: full_name is full project name,
91 # equivalent to GitHub's "owner[name]/name".
92 "full_name" => $proj->{name
}.".git",
94 "url" => $Girocco::Config
::gitweburl
.'/'.$proj->{name
}.".git",
95 # Girocco extension: Pull URL.
96 "pull_url" => $Girocco::Config
::gitpullurl
.'/'.$proj->{name
}.".git",
98 "owner" => { "name" => "", "email" => $proj->{email
} }
104 "commits" => $commits
107 # print "$payload\n";
108 my $ua = LWP
::UserAgent
->new;
110 $ua->post($url, { payload
=> $payload });
115 my ($cianame, $proj, $branch, $commit) = @_;
117 my @gcmd = ($Girocco::Config
::git_bin
, '--git-dir='.$proj->{path
});
120 open $fd, '-|', @gcmd, 'log', '-1', '--pretty=format:%an <%ae>%n%at%n%s', $commit
121 or die "cannot do git log: $! $?";
125 foreach (@l) { s/&/&/g; s/</</g; s/>/>/g; }
126 my ($a, $at, $subj) = @l;
129 open $fd, '-|', @gcmd, 'diff-tree', '--name-status', '-r', "$commit^", $commit
130 or die "cannot do git diff-tree: $! $?";
133 s/&/&/g; s/</</g; s/>/>/g;
134 my ($status, $file) = split(/\t/, $_);
139 my $rev = substr($commit, 0, 12);
144 <name>Girocco::Notify</name>
145 <version>1.0</version>
148 <project>$cianame</project>
150 if ($branch ne 'master') { # XXX: Check HEAD instead
151 $msg .= "<branch>$branch</branch>";
153 $msg .= "</source>\n";
154 $msg .= "<timestamp>$at</timestamp>\n";
155 $msg .= "<body><commit><author>$a</author><revision>$rev</revision>\n";
156 $msg .= "<url>$Girocco::Config::gitweburl/$proj->{name}.git/commit/$commit</url>\n";
158 foreach (@f) { $msg .= "<file>$_</file>\n"; }
159 $msg .= "</files><log>$subj</log></commit></body></message>\n";
162 my $rpc_client = new RPC
::XML
::Client
"http://cia.vc/RPC2";
163 my $rpc_request = RPC
::XML
::request
->new('hub.deliver', $msg);
164 my $rpc_response = $rpc_client->send_request($rpc_request);
165 ref $rpc_response or print STDERR
"XML-RPC Error: $RPC::XML::ERROR\n";
169 my ($cianame, $proj, $ref, $oldrev, $newrev) = @_;
171 # CIA notifications for branches only
173 $branch =~ s
#^refs/heads/## or return;
175 foreach my $commit (get_commits
($proj, $ref, $oldrev, $newrev)) {
176 cia_commit
($cianame, $proj, $branch, $commit);
182 my ($proj, $ref, $oldrev, $newrev) = @_;
184 my @gcmd = ($Girocco::Config
::git_bin
, '--git-dir='.$proj->{path
});
187 open $fd, '-|', @gcmd, 'for-each-ref', '--format=%(refname)', 'refs/heads/'
188 or die "cannot do git for-each-ref: $! $?";
191 @refs = grep { $_ ne $ref } @refs;
196 open $fd, '-|', @gcmd, 'rev-parse', '--not', @refs
197 or die "cannot do git rev-list for revlims: $! $?";
203 my $revspec = (($oldrev =~ /^0+$/) ?
$newrev : "$oldrev..$newrev");
204 open $fd, '-|', @gcmd, 'rev-list', @revlims, $revspec
205 or die "cannot do git rev-list: $! $?";
215 my ($proj, $user, $ref, $oldrev, $newrev) = @_;
217 chdir($proj->{path
});
219 # First, possibly send out various mails
220 if ($proj->{notifymail
}) {
223 if ($user->{name
} eq 'mob') {
224 $sender = "The Mob User <$proj->{email}>";
226 $sender = "$user->{name} <$user->{email}>";
229 $sender = "$proj->{name} <$proj->{email}>";
231 system($Girocco::Config
::basedir
.'/taskd/mail.sh',
232 "$ref", "$oldrev", "$newrev", $proj->{name
},
234 and warn "mail.sh failed";
237 # Next, send JSON packet to given URL if enabled.
238 if ($proj->{notifyjson
}) {
239 json
($proj->{notifyjson
}, $proj, $user, $ref, $oldrev, $newrev);
242 # Also send CIA notifications.
243 if ($proj->{notifycia
}) {
244 cia
($proj->{notifycia
}, $proj, $ref, $oldrev, $newrev);