diff options
author | Holger Weiss <holger@zedat.fu-berlin.de> | 2009-10-24 09:44:33 (GMT) |
---|---|---|
committer | Holger Weiss <holger@zedat.fu-berlin.de> | 2009-10-24 09:44:33 (GMT) |
commit | a5fa304ce3fefdbdeb9f447c08234dd33d8f454a (patch) | |
tree | 3ca40658d6eab622712b65e2e74350cf8a5951d0 /tools | |
parent | 709d238041a590b42c598ee5099d252f4352c3c0 (diff) | |
download | monitoring-plugins-a5fa304ce3fefdbdeb9f447c08234dd33d8f454a.tar.gz |
git-notify: Send notifications on ref changes, too
Do not only generate notifications on commits, but also if a branch head
or lightweight tag was created, removed, or modified. Notifications on
branch head updates are omitted if one or more commit notification have
been generated and the branch head now references a descendant of the
originally referenced commit (which should be the usual case).
Diffstat (limited to 'tools')
-rwxr-xr-x | tools/git-notify | 90 |
1 files changed, 68 insertions, 22 deletions
diff --git a/tools/git-notify b/tools/git-notify index 6d5a564..9ab012e 100755 --- a/tools/git-notify +++ b/tools/git-notify | |||
@@ -47,6 +47,9 @@ my $cia_address = "cia\@cia.navi.cx"; | |||
47 | # debug mode | 47 | # debug mode |
48 | my $debug = 0; | 48 | my $debug = 0; |
49 | 49 | ||
50 | # number of generated (non-CIA) notifications | ||
51 | my $sent_notices = 0; | ||
52 | |||
50 | # configuration parameters | 53 | # configuration parameters |
51 | 54 | ||
52 | # base URL of the gitweb repository browser (can be set with the -u option) | 55 | # base URL of the gitweb repository browser (can be set with the -u option) |
@@ -272,6 +275,28 @@ sub get_object_info($) | |||
272 | return %info; | 275 | return %info; |
273 | } | 276 | } |
274 | 277 | ||
278 | # send a ref change notice to a mailing list | ||
279 | sub send_ref_notice($$@) | ||
280 | { | ||
281 | my ($ref, $action, @notice) = @_; | ||
282 | my ($reftype, $refname) = ($ref =~ /^refs\/(head|tag)s\/(.+)/); | ||
283 | |||
284 | $reftype =~ s/^head$/branch/; | ||
285 | |||
286 | @notice = (format_table( | ||
287 | "Module: $repos_name", | ||
288 | ($reftype eq "tag" ? "Tag:" : "Branch:") . $refname, | ||
289 | @notice, | ||
290 | ($action ne "removed" and $gitweb_url) | ||
291 | ? "URL: $gitweb_url/?a=shortlog;h=$ref" : undef), | ||
292 | "", | ||
293 | "The $refname $reftype has been $action."); | ||
294 | |||
295 | mail_notification($commitlist_address, "$refname $reftype $action", | ||
296 | "text/plain; charset=us-ascii", @notice); | ||
297 | $sent_notices++; | ||
298 | } | ||
299 | |||
275 | # send a commit notice to a mailing list | 300 | # send a commit notice to a mailing list |
276 | sub send_commit_notice($$) | 301 | sub send_commit_notice($$) |
277 | { | 302 | { |
@@ -315,6 +340,7 @@ sub send_commit_notice($$) | |||
315 | mail_notification($commitlist_address, | 340 | mail_notification($commitlist_address, |
316 | $info{"author_name"} . ": " . ${$info{"log"}}[0], | 341 | $info{"author_name"} . ": " . ${$info{"log"}}[0], |
317 | "text/plain; charset=UTF-8", @notice); | 342 | "text/plain; charset=UTF-8", @notice); |
343 | $sent_notices++; | ||
318 | } | 344 | } |
319 | 345 | ||
320 | # send a commit notice to the CIA server | 346 | # send a commit notice to the CIA server |
@@ -383,44 +409,64 @@ sub send_global_notice($$$) | |||
383 | } | 409 | } |
384 | 410 | ||
385 | mail_notification($commitlist_address, "New commits on branch $ref", "text/plain; charset=UTF-8", @$notice); | 411 | mail_notification($commitlist_address, "New commits on branch $ref", "text/plain; charset=UTF-8", @$notice); |
412 | $sent_notices++; | ||
386 | } | 413 | } |
387 | 414 | ||
388 | # send all the notices | 415 | # send all the notices |
389 | sub send_all_notices($$$) | 416 | sub send_all_notices($$$) |
390 | { | 417 | { |
391 | my ($old_sha1, $new_sha1, $ref) = @_; | 418 | my ($old_sha1, $new_sha1, $ref) = @_; |
419 | my ($reftype, $refname, $action, @notice); | ||
392 | 420 | ||
393 | $ref =~ s/^refs\/heads\///; | 421 | return if ($ref =~ /^refs\/remotes\// |
422 | or (@include_list && !grep {$_ eq $ref} @include_list)); | ||
423 | die "The name \"$ref\" doesn't sound like a local branch or tag" | ||
424 | if not (($reftype, $refname) = ($ref =~ /^refs\/(head|tag)s\/(.+)/)); | ||
394 | 425 | ||
395 | return if (@include_list && !grep {$_ eq $ref} @include_list); | 426 | if ($new_sha1 eq '0' x 40) |
396 | |||
397 | if ($old_sha1 eq '0' x 40) # new ref | ||
398 | { | 427 | { |
399 | send_commit_notice( $ref, $new_sha1 ) if $commitlist_address; | 428 | $action = "removed"; |
400 | return; | 429 | @notice = ( "Old SHA1: $old_sha1" ); |
401 | } | 430 | } |
402 | 431 | elsif ($old_sha1 eq '0' x 40) | |
403 | my @commits = (); | ||
404 | |||
405 | open LIST, "-|" or exec "git", "rev-list", @revlist_options, "^$old_sha1", "$new_sha1", @exclude_list or die "cannot exec git-rev-list"; | ||
406 | while (<LIST>) | ||
407 | { | 432 | { |
408 | chomp; | 433 | $action = "created"; |
409 | die "invalid commit $_" unless /^[0-9a-f]{40}$/; | 434 | @notice = ( "SHA1: $new_sha1" ); |
410 | unshift @commits, $_; | ||
411 | } | 435 | } |
412 | close LIST; | 436 | elsif ($reftype eq "tag") |
413 | 437 | { | |
414 | if (@commits > $max_individual_notices) | 438 | $action = "updated"; |
439 | @notice = ( "Old SHA1: $old_sha1", "New SHA1: $new_sha1" ); | ||
440 | } | ||
441 | elsif (not grep( $_ eq $old_sha1, @{ git_rev_list( $new_sha1, "--full-history" ) } )) | ||
415 | { | 442 | { |
416 | send_global_notice( $ref, $old_sha1, $new_sha1 ) if $commitlist_address; | 443 | $action = "rewritten"; |
417 | return; | 444 | @notice = ( "Old SHA1: $old_sha1", "New SHA1: $new_sha1" ); |
418 | } | 445 | } |
419 | 446 | ||
420 | foreach my $commit (@commits) | 447 | send_ref_notice( $ref, $action, @notice ) if ($commitlist_address and $action); |
448 | |||
449 | unless ($reftype eq "tag" or $new_sha1 eq '0' x 40) | ||
421 | { | 450 | { |
422 | send_commit_notice( $ref, $commit ) if $commitlist_address; | 451 | my $commits = get_new_commits ( $old_sha1, $new_sha1 ); |
423 | send_cia_notice( $ref, $commit ) if $cia_project_name; | 452 | |
453 | if (@$commits > $max_individual_notices) | ||
454 | { | ||
455 | send_global_notice( $refname, $old_sha1, $new_sha1 ) if $commitlist_address; | ||
456 | } | ||
457 | else | ||
458 | { | ||
459 | foreach my $commit (@$commits) | ||
460 | { | ||
461 | send_commit_notice( $refname, $commit ) if $commitlist_address; | ||
462 | send_cia_notice( $refname, $commit ) if $cia_project_name; | ||
463 | } | ||
464 | } | ||
465 | if ($sent_notices == 0 and $commitlist_address) | ||
466 | { | ||
467 | @notice = ( "Old SHA1: $old_sha1", "New SHA1: $new_sha1" ); | ||
468 | send_ref_notice( $ref, "modified", @notice ); | ||
469 | } | ||
424 | } | 470 | } |
425 | } | 471 | } |
426 | 472 | ||