diff options
Diffstat (limited to 'tools/git-notify')
-rwxr-xr-x | tools/git-notify | 101 |
1 files changed, 68 insertions, 33 deletions
diff --git a/tools/git-notify b/tools/git-notify index ebede1a4..f524fd73 100755 --- a/tools/git-notify +++ b/tools/git-notify | |||
@@ -325,7 +325,7 @@ sub get_repos_name() | |||
325 | return $repos; | 325 | return $repos; |
326 | } | 326 | } |
327 | 327 | ||
328 | # extract the information from a commit object and return a hash containing the various fields | 328 | # extract the information from a commit or tag object and return a hash containing the various fields |
329 | sub get_object_info($) | 329 | sub get_object_info($) |
330 | { | 330 | { |
331 | my $obj = shift; | 331 | my $obj = shift; |
@@ -335,14 +335,21 @@ sub get_object_info($) | |||
335 | 335 | ||
336 | $info{"encoding"} = "utf-8"; | 336 | $info{"encoding"} = "utf-8"; |
337 | 337 | ||
338 | open OBJ, "-|" or exec "git", "cat-file", "commit", $obj or die "cannot run git-cat-file"; | 338 | open TYPE, "-|" or exec "git", "cat-file", "-t", $obj or die "cannot run git-cat-file"; |
339 | my $type = <TYPE>; | ||
340 | chomp $type; | ||
341 | close TYPE or die $! ? "Cannot execute cat-file: $!" : "cat-file exited with status: $?"; | ||
342 | |||
343 | open OBJ, "-|" or exec "git", "cat-file", $type, $obj or die "cannot run git-cat-file"; | ||
339 | while (<OBJ>) | 344 | while (<OBJ>) |
340 | { | 345 | { |
341 | chomp; | 346 | chomp; |
342 | if ($do_log) { push @log, $_; } | 347 | if ($do_log) |
343 | elsif (/^$/) { $do_log = 1; } | 348 | { |
344 | elsif (/^encoding (.+)/) { $info{"encoding"} = $1; } | 349 | last if /^-----BEGIN PGP SIGNATURE-----/; |
345 | elsif (/^(author|committer) ((.*) (<.*>)) (\d+) ([+-]\d+)$/) | 350 | push @log, $_; |
351 | } | ||
352 | elsif (/^(author|committer|tagger) ((.*) (<.*>)) (\d+) ([+-]\d+)$/) | ||
346 | { | 353 | { |
347 | $info{$1} = $2; | 354 | $info{$1} = $2; |
348 | $info{$1 . "_name"} = $3; | 355 | $info{$1 . "_name"} = $3; |
@@ -350,9 +357,19 @@ sub get_object_info($) | |||
350 | $info{$1 . "_date"} = $5; | 357 | $info{$1 . "_date"} = $5; |
351 | $info{$1 . "_tz"} = $6; | 358 | $info{$1 . "_tz"} = $6; |
352 | } | 359 | } |
360 | elsif (/^tag (.+)/) | ||
361 | { | ||
362 | $info{"tag"} = $1; | ||
363 | } | ||
364 | elsif (/^encoding (.+)/) | ||
365 | { | ||
366 | $info{"encoding"} = $1; | ||
367 | } | ||
368 | elsif (/^$/) { $do_log = 1; } | ||
353 | } | 369 | } |
354 | close OBJ or die $! ? "Cannot execute cat-file: $!" : "cat-file exited with status: $?"; | 370 | close OBJ or die $! ? "Cannot execute cat-file: $!" : "cat-file exited with status: $?"; |
355 | 371 | ||
372 | $info{"type"} = $type; | ||
356 | $info{"log"} = \@log; | 373 | $info{"log"} = \@log; |
357 | return %info; | 374 | return %info; |
358 | } | 375 | } |
@@ -385,7 +402,7 @@ sub send_commit_notice($$) | |||
385 | my ($ref,$obj) = @_; | 402 | my ($ref,$obj) = @_; |
386 | my %info = get_object_info($obj); | 403 | my %info = get_object_info($obj); |
387 | my @notice = (); | 404 | my @notice = (); |
388 | my $url; | 405 | my ($url,$subject); |
389 | 406 | ||
390 | open DIFF, "-|" or exec "git", "diff-tree", "-p", "-M", "--no-commit-id", $obj or die "cannot exec git-diff-tree"; | 407 | open DIFF, "-|" or exec "git", "diff-tree", "-p", "-M", "--no-commit-id", $obj or die "cannot exec git-diff-tree"; |
391 | my $diff = join("", <DIFF>); | 408 | my $diff = join("", <DIFF>); |
@@ -401,41 +418,57 @@ sub send_commit_notice($$) | |||
401 | 418 | ||
402 | $short_obj = $obj if not defined $short_obj; | 419 | $short_obj = $obj if not defined $short_obj; |
403 | chomp $short_obj; | 420 | chomp $short_obj; |
404 | $url = "$gitweb_url/?a=commit;h=$short_obj"; | 421 | $url = "$gitweb_url/?a=$info{type};h=$short_obj"; |
405 | } | 422 | } |
406 | 423 | ||
407 | push @notice, format_table( | 424 | if ($info{"type"} eq "tag") |
408 | "Module: $repos_name", | ||
409 | "Branch: $ref", | ||
410 | "Commit: $obj", | ||
411 | "Author:" . $info{"author"}, | ||
412 | $info{"committer"} ne $info{"author"} ? "Committer:" . $info{"committer"} : undef, | ||
413 | "Date:" . format_date($info{"author_date"},$info{"author_tz"}), | ||
414 | $url ? "URL: $url" : undef), | ||
415 | "", | ||
416 | @{$info{"log"}}, | ||
417 | "", | ||
418 | "---", | ||
419 | ""; | ||
420 | |||
421 | open STAT, "-|" or exec "git", "diff-tree", "--stat", "-M", "--no-commit-id", $obj or die "cannot exec git-diff-tree"; | ||
422 | push @notice, join("", <STAT>); | ||
423 | close STAT or die $! ? "Cannot execute diff-tree: $!" : "diff-tree exited with status: $?"; | ||
424 | |||
425 | if (($max_diff_size == -1) || (length($diff) < $max_diff_size)) | ||
426 | { | 425 | { |
427 | push @notice, $diff; | 426 | push @notice, format_table( |
427 | "Module: $repos_name", | ||
428 | "Branch: $ref", | ||
429 | "Tag: $obj", | ||
430 | "Tagger:" . $info{"tagger"}, | ||
431 | "Date:" . format_date($info{"tagger_date"},$info{"tagger_tz"}), | ||
432 | $url ? "URL: $url" : undef), | ||
433 | "", | ||
434 | join "\n", @{$info{"log"}}; | ||
435 | |||
436 | $subject = "Tag " . $info{"tag"} . ": " . $info{"tagger_name"}; | ||
428 | } | 437 | } |
429 | else | 438 | else |
430 | { | 439 | { |
431 | push @notice, "Diff: $gitweb_url/?a=commitdiff;h=$obj" if $gitweb_url; | 440 | push @notice, format_table( |
441 | "Module: $repos_name", | ||
442 | "Branch: $ref", | ||
443 | "Commit: $obj", | ||
444 | "Author:" . $info{"author"}, | ||
445 | $info{"committer"} ne $info{"author"} ? "Committer:" . $info{"committer"} : undef, | ||
446 | "Date:" . format_date($info{"author_date"},$info{"author_tz"}), | ||
447 | $url ? "URL: $url" : undef), | ||
448 | "", | ||
449 | @{$info{"log"}}, | ||
450 | "", | ||
451 | "---", | ||
452 | ""; | ||
453 | |||
454 | open STAT, "-|" or exec "git", "diff-tree", "--stat", "-M", "--no-commit-id", $obj or die "cannot exec git-diff-tree"; | ||
455 | push @notice, join("", <STAT>); | ||
456 | close STAT or die $! ? "Cannot execute diff-tree: $!" : "diff-tree exited with status: $?"; | ||
457 | |||
458 | if (($max_diff_size == -1) || (length($diff) < $max_diff_size)) | ||
459 | { | ||
460 | push @notice, $diff; | ||
461 | } | ||
462 | else | ||
463 | { | ||
464 | push @notice, "Diff: $gitweb_url/?a=commitdiff;h=$obj" if $gitweb_url; | ||
465 | } | ||
466 | $subject = $info{"author_name"}; | ||
432 | } | 467 | } |
433 | 468 | ||
469 | $subject .= ": " . truncate_str(${$info{"log"}}[0],50); | ||
434 | $_ = decode($info{"encoding"}, $_) for @notice; | 470 | $_ = decode($info{"encoding"}, $_) for @notice; |
435 | 471 | mail_notification($commitlist_address, $subject, "text/plain; charset=UTF-8", @notice); | |
436 | mail_notification($commitlist_address, | ||
437 | $info{"author_name"} . ": " . truncate_str(${$info{"log"}}[0], 50), | ||
438 | "text/plain; charset=UTF-8", @notice); | ||
439 | $sent_notices++; | 472 | $sent_notices++; |
440 | } | 473 | } |
441 | 474 | ||
@@ -446,6 +479,8 @@ sub send_cia_notice($$) | |||
446 | my %info = get_object_info($commit); | 479 | my %info = get_object_info($commit); |
447 | my @cia_text = (); | 480 | my @cia_text = (); |
448 | 481 | ||
482 | return if $info{"type"} ne "commit"; | ||
483 | |||
449 | push @cia_text, | 484 | push @cia_text, |
450 | "<message>", | 485 | "<message>", |
451 | " <generator>", | 486 | " <generator>", |