Alexandre Julliard : git-notify: Add support for reading references from stdin to allow running as a post-receive hook .

Alexandre Julliard julliard at wine.codeweavers.com
Thu Jun 14 11:18:12 CDT 2007


Module: tools
Branch: master
Commit: 6d9043361e57b699a496a96004cfc6511e7745d5
URL:    http://source.winehq.org/git/tools.git/?a=commit;h=6d9043361e57b699a496a96004cfc6511e7745d5

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Thu Jun 14 17:17:35 2007 +0200

git-notify: Add support for reading references from stdin to allow running as a post-receive hook.

---

 git-notify |   77 +++++++++++++++++++++++++++++++++++++++---------------------
 1 files changed, 50 insertions(+), 27 deletions(-)

diff --git a/git-notify b/git-notify
index a2bf65d..df8d49e 100755
--- a/git-notify
+++ b/git-notify
@@ -28,6 +28,9 @@ use open ':utf8';
 use Encode 'encode';
 use Cwd 'realpath';
 
+binmode STDIN, ':utf8';
+binmode STDOUT, ':utf8';
+
 # some parameters you may want to change
 
 # base URL of the gitweb repository browser (can be set with the -u option)
@@ -121,7 +124,7 @@ sub parse_options()
         elsif ($arg eq '-d') { $debug++; }
         else { usage(); }
     }
-    if ($#ARGV != 2) { usage(); }
+    if (@ARGV && $#ARGV != 2) { usage(); }
 }
 
 # send an email notification
@@ -339,40 +342,60 @@ sub send_global_notice($$$)
     mail_notification($commitlist_address, "New commits on branch $ref", "text/plain; charset=UTF-8", @notice);
 }
 
-$repos_name = get_repos_name();
-parse_options();
+# send all the notices
+sub send_all_notices($$$)
+{
+    my ($ref, $old_sha1, $new_sha1) = @_;
 
-# append repository path to URL
-$gitweb_url .= "/$repos_name.git";
+    $ref =~ s/^refs\/heads\///;
 
-my $ref = $ARGV[0];
-$ref =~ s/^refs\/heads\///;
+    if ($old_sha1 eq '0' x 40)  # new ref
+    {
+        send_commit_notice( $ref, $new_sha1 ) if $commitlist_address;
+        return;
+    }
 
-if ($ARGV[1] eq '0' x 40)  # new ref
-{
-    send_commit_notice( $ref, $ARGV[2] );
-    exit 0;
-}
+    my @commits = ();
 
-my @commits = ();
+    open LIST, "-|" or exec "git", "rev-list", "^$old_sha1", "$new_sha1", @exclude_list or die "cannot exec git-rev-list";
+    while (<LIST>)
+    {
+        chomp;
+        die "invalid commit $_" unless /^[0-9a-f]{40}$/;
+        unshift @commits, $_;
+    }
+    close LIST;
 
-open LIST, "-|" or exec "git", "rev-list", "^$ARGV[1]", "$ARGV[2]", @exclude_list or die "cannot exec git-rev-list";
-while (<LIST>)
-{
-    chomp;
-    die "invalid commit $_" unless /^[0-9a-f]{40}$/;
-    unshift @commits, $_;
+    if (@commits > $max_individual_notices)
+    {
+        send_global_notice( $ref, $old_sha1, $new_sha1 ) if $commitlist_address;
+        return;
+    }
+
+    foreach my $commit (@commits)
+    {
+        send_commit_notice( $ref, $commit ) if $commitlist_address;
+        send_cia_notice( $ref, $commit ) if $cia_project_name;
+    }
 }
-close LIST;
 
-if (@commits > $max_individual_notices)
+$repos_name = get_repos_name();
+parse_options();
+
+# append repository path to URL
+$gitweb_url .= "/$repos_name.git";
+
+if (@ARGV)
 {
-    send_global_notice( $ref, $ARGV[1], $ARGV[2] );
-    exit 0;
+    send_all_notices( $ARGV[0], $ARGV[1], $ARGV[2] );
 }
-
-foreach my $commit (@commits)
+else  # read them from stdin
 {
-    send_commit_notice( $ref, $commit ) if $commitlist_address;
-    send_cia_notice( $ref, $commit ) if $cia_project_name;
+    while (<>)
+    {
+        chomp;
+        if (/^([0-9a-f]{40}) ([0-9a-f]{40}) (.*)$/) { send_all_notices( $3, $1, $2 ); }
+    }
 }
+
+exit 0;




More information about the wine-cvs mailing list