/usr/src/openswan-2.6.38/packaging/utils/ciabot.pl is in openswan-modules-dkms 1:2.6.38-1.
This file is owned by root:root, with mode 0o755.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 | #!/usr/bin/perl -w
#
# ciabot -- Mail a git log message to a given address, for the purposes of CIA
#
# Loosely based on cvslog by Russ Allbery <rra@stanford.edu>
# Copyright 1998 Board of Trustees, Leland Stanford Jr. University
#
# Copyright 2001, 2003, 2004, 2005 Petr Baudis <pasky@ucw.cz>
#
# This program is free software; you can redistribute it and/or modify it under
# the terms of the GNU General Public License version 2, as published by the
# Free Software Foundation.
#
# The master location of this file is in the Cogito repository
# (see http://www.kernel.org/git/).
#
# This program is designed to run as the .git/commit-post-hook script. It takes
# the commit information, massaging it and mailing it to the address given below.
#
# The calling convention of the commit-post-hook script is:
#
# commit-post-hook $commit_sha1 $branch_name
#
# If it does not work, try to disable $xml_rpc in the configuration section
# below.
#
#
# Note that you can (and it might be actually more desirable) also use this
# script as the GIT update hook:
#
# refname=${1#refs/heads/}
# [ "$refname" = "master" ] && refname=
# oldhead=$2
# newhead=$3
# for merged in $(git-rev-list $newhead ^$oldhead | tac); do
# /path/to/ciabot.pl $merged $refname
# done
#
# This is useful when you use a remote repository without working copy, where
# you only push to - the update hook will be trigerred each time you push into
# that repository, and the pushed commits will be reported through CIA.
use strict;
use vars qw ($project $from_email $dest_email $noisy $rpc_uri $sendmail
$xml_rpc $ignore_regexp $alt_local_message_target);
### Configuration
# Project name (as known to CIA).
$project = 'Openswan';
# The from address in generated mails.
$from_email = 'nightly@xelerance.com';
# Mail all reports to this address.
$dest_email = 'nightly@lists.openswan.org';
# If using XML-RPC, connect to this URI.
$rpc_uri = 'http://cia.navi.cx/RPC2';
# Path to your USCD sendmail compatible binary (your mailer daemon created this
# program somewhere).
$sendmail = '/usr/sbin/sendmail';
# If set, the script will send CIA the full commit message. If unset, only the
# first line of the commit message will be sent.
$noisy = 1;
# This script can communicate with CIA either by mail or by an XML-RPC
# interface. The XML-RPC interface is faster and more efficient, however you
# need to have RPC::XML perl module installed, and some large CVS hosting sites
# (like Savannah or Sourceforge) might not allow outgoing HTTP connections
# while they allow outgoing mail. Also, this script will hang and eventually
# not deliver the event at all if CIA server happens to be down, which is
# unfortunately not an uncommon condition.
$xml_rpc = 0;
# You can make this bot to totally ignore events concerning the objects
# specified below. Each object is composed of <path>/<filename>,
#
# This variable should contain regexp, against which will each object be
# checked, and if the regexp is matched, the file is ignored. Therefore ie. to
# ignore all changes in the two files above and everything concerning module
# 'admin', use:
#
# $ignore_regexp = "^(gentoo/Manifest|elinks/src/bfu/inphist.c|admin/)";
$ignore_regexp = "";
# It can be useful to also grab the generated XML message by some other
# programs and ie. autogenerate some content based on it. Here you can specify
# a file to which it will be appended.
$alt_local_message_target = "";
### The code itself
use vars qw ($commit $tree @parent $author $committer);
use vars qw ($user $branch $rev @files $logmsg $message);
my $line;
### Input data loading
# The commit stuff
$commit = $ARGV[0];
$branch = $ARGV[1];
open COMMIT, "git-cat-file commit $commit|" or die "git-cat-file commit $commit: $!";
my $state = 0;
$logmsg = '';
while (defined ($line = <COMMIT>)) {
if ($state == 1) {
$logmsg .= $line;
$noisy or $state++;
next;
} elsif ($state > 1) {
next;
}
chomp $line;
unless ($line) {
$state = 1;
next;
}
my ($key, $value) = split(/ /, $line, 2);
if ($key eq 'tree') {
$tree = $value;
} elsif ($key eq 'parent') {
push(@parent, $value);
} elsif ($key eq 'author') {
$author = $value;
} elsif ($key eq 'committer') {
$committer = $value;
}
}
close COMMIT;
open DIFF, "git-diff-tree -r $parent[0] $tree|" or die "git-diff-tree $parent[0] $tree: $!";
while (defined ($line = <DIFF>)) {
chomp $line;
my @f;
(undef, @f) = split(/\t/, $line, 2);
push (@files, @f);
}
close DIFF;
# Figure out who is doing the update.
# XXX: Too trivial this way?
($user) = $author =~ /<(.*?)@/;
$rev = substr($commit, 0, 12);
### Remove to-be-ignored files
@files = grep { $_ !~ m/$ignore_regexp/; } @files
if ($ignore_regexp);
exit unless @files;
### Compose the mail message
my ($VERSION) = '1.0';
my $ts = time;
$message = <<EM
<message>
<generator>
<name>CIA Perl client for Git</name>
<version>$VERSION</version>
</generator>
<source>
<project>$project</project>
EM
;
$message .= " <branch>$branch</branch>" if ($branch);
$message .= <<EM
</source>
<timestamp>
$ts
</timestamp>
<body>
<commit>
<author>$user</author>
<revision>$rev</revision>
<files>
EM
;
foreach (@files) {
s/&/&/g;
s/</</g;
s/>/>/g;
$message .= " <file>$_</file>\n";
}
$logmsg =~ s/&/&/g;
$logmsg =~ s/</</g;
$logmsg =~ s/>/>/g;
$message .= <<EM
</files>
<log>
$logmsg
</log>
</commit>
</body>
</message>
EM
;
### Write the message to an alt-target
if ($alt_local_message_target and open (ALT, ">>$alt_local_message_target")) {
print ALT $message;
close ALT;
}
### Send out the XML-RPC message
if ($xml_rpc) {
# We gotta be careful from now on. We silence all the warnings because
# RPC::XML code is crappy and works with undefs etc.
$^W = 0;
$RPC::XML::ERROR if (0); # silence perl's compile-time warning
require RPC::XML;
require RPC::XML::Client;
my $rpc_client = new RPC::XML::Client $rpc_uri;
my $rpc_request = RPC::XML::request->new('hub.deliver', $message);
my $rpc_response = $rpc_client->send_request($rpc_request);
unless (ref $rpc_response) {
die "XML-RPC Error: $RPC::XML::ERROR\n";
}
exit;
}
### Send out the mail
# Open our mail program
open (MAIL, "| $sendmail -t -oi -oem") or die "Cannot execute $sendmail : " . ($?>>8);
# The mail header
print MAIL <<EOM;
From: $from_email
To: $dest_email
Content-type: text/xml
Subject: DeliverXML
EOM
print MAIL $message;
# Close the mail
close MAIL;
die "$0: sendmail exit status " . ($? >> 8) . "\n" unless ($? == 0);
# vi: set sw=2:
|