diff options
Diffstat (limited to 'tools/git-notify')
-rwxr-xr-x | tools/git-notify | 29 |
1 files changed, 24 insertions, 5 deletions
diff --git a/tools/git-notify b/tools/git-notify index e64754c..dc843ef 100755 --- a/tools/git-notify +++ b/tools/git-notify | |||
@@ -352,6 +352,18 @@ sub get_repos_name() | |||
352 | return $repos; | 352 | return $repos; |
353 | } | 353 | } |
354 | 354 | ||
355 | # return the type of the given object | ||
356 | sub get_object_type($) | ||
357 | { | ||
358 | my $obj = shift; | ||
359 | |||
360 | open TYPE, "-|" or exec "git", "cat-file", "-t", $obj or die "cannot run git-cat-file"; | ||
361 | my $type = <TYPE>; | ||
362 | chomp $type; | ||
363 | close TYPE or die $! ? "Cannot execute cat-file: $!" : "cat-file exited with status: $?"; | ||
364 | return $type; | ||
365 | } | ||
366 | |||
355 | # extract the information from a commit or tag object and return a hash containing the various fields | 367 | # extract the information from a commit or tag object and return a hash containing the various fields |
356 | sub get_object_info($) | 368 | sub get_object_info($) |
357 | { | 369 | { |
@@ -362,10 +374,7 @@ sub get_object_info($) | |||
362 | 374 | ||
363 | $info{"encoding"} = "utf-8"; | 375 | $info{"encoding"} = "utf-8"; |
364 | 376 | ||
365 | open TYPE, "-|" or exec "git", "cat-file", "-t", $obj or die "cannot run git-cat-file"; | 377 | my $type = get_object_type($obj); |
366 | my $type = <TYPE>; | ||
367 | chomp $type; | ||
368 | close TYPE or die $! ? "Cannot execute cat-file: $!" : "cat-file exited with status: $?"; | ||
369 | 378 | ||
370 | open OBJ, "-|" or exec "git", "cat-file", $type, $obj or die "cannot run git-cat-file"; | 379 | open OBJ, "-|" or exec "git", "cat-file", $type, $obj or die "cannot run git-cat-file"; |
371 | while (<OBJ>) | 380 | while (<OBJ>) |
@@ -572,13 +581,18 @@ sub send_global_notice($$$) | |||
572 | sub send_all_notices($$$) | 581 | sub send_all_notices($$$) |
573 | { | 582 | { |
574 | my ($old_sha1, $new_sha1, $ref) = @_; | 583 | my ($old_sha1, $new_sha1, $ref) = @_; |
575 | my ($reftype, $refname, $action, @notice); | 584 | my ($reftype, $refname, $tagtype, $action, @notice); |
576 | 585 | ||
577 | return if ($ref =~ /^refs\/remotes\// | 586 | return if ($ref =~ /^refs\/remotes\// |
578 | or (@include_list && !grep {$_ eq $ref} @include_list)); | 587 | or (@include_list && !grep {$_ eq $ref} @include_list)); |
579 | die "The name \"$ref\" doesn't sound like a local branch or tag" | 588 | die "The name \"$ref\" doesn't sound like a local branch or tag" |
580 | if not (($reftype, $refname) = ($ref =~ /^refs\/(head|tag)s\/(.+)/)); | 589 | if not (($reftype, $refname) = ($ref =~ /^refs\/(head|tag)s\/(.+)/)); |
581 | 590 | ||
591 | if ($reftype eq "tag") | ||
592 | { | ||
593 | $tagtype = get_object_type($ref) eq "tag" ? "annotated" : "lightweight"; | ||
594 | } | ||
595 | |||
582 | if ($new_sha1 eq '0' x 40) | 596 | if ($new_sha1 eq '0' x 40) |
583 | { | 597 | { |
584 | $action = "removed"; | 598 | $action = "removed"; |
@@ -586,6 +600,11 @@ sub send_all_notices($$$) | |||
586 | } | 600 | } |
587 | elsif ($old_sha1 eq '0' x 40) | 601 | elsif ($old_sha1 eq '0' x 40) |
588 | { | 602 | { |
603 | if ($reftype eq "tag" and $tagtype eq "annotated") | ||
604 | { | ||
605 | send_commit_notice( $refname, $new_sha1 ) if $commitlist_address; | ||
606 | return; | ||
607 | } | ||
589 | $action = "created"; | 608 | $action = "created"; |
590 | @notice = ( "SHA1: $new_sha1" ); | 609 | @notice = ( "SHA1: $new_sha1" ); |
591 | } | 610 | } |