diff options
-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 6d5a564c..9ab012e3 100755 --- a/tools/git-notify +++ b/tools/git-notify @@ -47,6 +47,9 @@ my $cia_address = "cia\@cia.navi.cx"; # debug mode my $debug = 0; +# number of generated (non-CIA) notifications +my $sent_notices = 0; + # configuration parameters # base URL of the gitweb repository browser (can be set with the -u option) @@ -272,6 +275,28 @@ sub get_object_info($) return %info; } +# send a ref change notice to a mailing list +sub send_ref_notice($$@) +{ + my ($ref, $action, @notice) = @_; + my ($reftype, $refname) = ($ref =~ /^refs\/(head|tag)s\/(.+)/); + + $reftype =~ s/^head$/branch/; + + @notice = (format_table( + "Module: $repos_name", + ($reftype eq "tag" ? "Tag:" : "Branch:") . $refname, + @notice, + ($action ne "removed" and $gitweb_url) + ? "URL: $gitweb_url/?a=shortlog;h=$ref" : undef), + "", + "The $refname $reftype has been $action."); + + mail_notification($commitlist_address, "$refname $reftype $action", + "text/plain; charset=us-ascii", @notice); + $sent_notices++; +} + # send a commit notice to a mailing list sub send_commit_notice($$) { @@ -315,6 +340,7 @@ sub send_commit_notice($$) mail_notification($commitlist_address, $info{"author_name"} . ": " . ${$info{"log"}}[0], "text/plain; charset=UTF-8", @notice); + $sent_notices++; } # send a commit notice to the CIA server @@ -383,44 +409,64 @@ sub send_global_notice($$$) } mail_notification($commitlist_address, "New commits on branch $ref", "text/plain; charset=UTF-8", @$notice); + $sent_notices++; } # send all the notices sub send_all_notices($$$) { my ($old_sha1, $new_sha1, $ref) = @_; + my ($reftype, $refname, $action, @notice); - $ref =~ s/^refs\/heads\///; + return if ($ref =~ /^refs\/remotes\// + or (@include_list && !grep {$_ eq $ref} @include_list)); + die "The name \"$ref\" doesn't sound like a local branch or tag" + if not (($reftype, $refname) = ($ref =~ /^refs\/(head|tag)s\/(.+)/)); - return if (@include_list && !grep {$_ eq $ref} @include_list); - - if ($old_sha1 eq '0' x 40) # new ref + if ($new_sha1 eq '0' x 40) { - send_commit_notice( $ref, $new_sha1 ) if $commitlist_address; - return; + $action = "removed"; + @notice = ( "Old SHA1: $old_sha1" ); } - - my @commits = (); - - open LIST, "-|" or exec "git", "rev-list", @revlist_options, "^$old_sha1", "$new_sha1", @exclude_list or die "cannot exec git-rev-list"; - while (<LIST>) + elsif ($old_sha1 eq '0' x 40) { - chomp; - die "invalid commit $_" unless /^[0-9a-f]{40}$/; - unshift @commits, $_; + $action = "created"; + @notice = ( "SHA1: $new_sha1" ); } - close LIST; - - if (@commits > $max_individual_notices) + elsif ($reftype eq "tag") + { + $action = "updated"; + @notice = ( "Old SHA1: $old_sha1", "New SHA1: $new_sha1" ); + } + elsif (not grep( $_ eq $old_sha1, @{ git_rev_list( $new_sha1, "--full-history" ) } )) { - send_global_notice( $ref, $old_sha1, $new_sha1 ) if $commitlist_address; - return; + $action = "rewritten"; + @notice = ( "Old SHA1: $old_sha1", "New SHA1: $new_sha1" ); } - foreach my $commit (@commits) + send_ref_notice( $ref, $action, @notice ) if ($commitlist_address and $action); + + unless ($reftype eq "tag" or $new_sha1 eq '0' x 40) { - send_commit_notice( $ref, $commit ) if $commitlist_address; - send_cia_notice( $ref, $commit ) if $cia_project_name; + my $commits = get_new_commits ( $old_sha1, $new_sha1 ); + + if (@$commits > $max_individual_notices) + { + send_global_notice( $refname, $old_sha1, $new_sha1 ) if $commitlist_address; + } + else + { + foreach my $commit (@$commits) + { + send_commit_notice( $refname, $commit ) if $commitlist_address; + send_cia_notice( $refname, $commit ) if $cia_project_name; + } + } + if ($sent_notices == 0 and $commitlist_address) + { + @notice = ( "Old SHA1: $old_sha1", "New SHA1: $new_sha1" ); + send_ref_notice( $ref, "modified", @notice ); + } } } |