The branch, PHP_POST_RECEIVE on karma.git has been updated
       via  89a2d90e9e5d2e8a661b91c1fdb3f32cf2d90cdd (commit)
      from  5d58ad7ac1700df5ad7d9bf50b73b80b71ce9844 (commit)

http://git.php.net/?p=karma.git;a=log;h=89a2d90e9e5d2e8a661b91c1fdb3f32cf2d90cdd;hp=5d58ad7ac1700df5ad7d9bf50b73b80b71ce9844

Summary of changes:
 lib/Git/PostReceiveHook.php |   86 +++++++++++++++++++++++++++++++++++++-----
 1 files changed, 75 insertions(+), 11 deletions(-)

-- Log ----------------------------------------
commit 89a2d90e9e5d2e8a661b91c1fdb3f32cf2d90cdd
Author: Alexander Moskaliov <ir...@php.net>
Date:   Mon Mar 5 21:24:30 2012 +0400

    Tag mail

diff --git a/lib/Git/PostReceiveHook.php b/lib/Git/PostReceiveHook.php
index 96660a1..0530ac4 100644
--- a/lib/Git/PostReceiveHook.php
+++ b/lib/Git/PostReceiveHook.php
@@ -60,20 +60,55 @@ class PostReceiveHook extends ReceiveHook
         // TODO: check old post-receive for other especial cases
     }
 
+
+    /*
+     * Note:
+     *   * - commits in push,
+     *   digits - simply commits
+     *   chars - branches
+     *   + - commits already in server git repository
+     *   without +  - commits in local git repository
+     *
+     * Situation #1.
+     *
+     *    1+ - 2* - A*
+     *          \
+     *          3* - B*
+     *
+     *  Problem: we have 0-B for B branch in push input data.
+     *  Solution: git rev-list B --not A   ->  3-B     (--not A C D E F ... 
all branches)
+     *
+     * Situation #2.
+     *    1 - 2 - A
+     *          \
+     *          3* - B*
+     *  Problem: we will have 0-B in rev-list.
+     *  Solution: ?
+     *
+     * Situation #3.
+     *
+     *  1+ - 2+  -   3+ - A+
+     *        \     /
+     *        4* - 5* - B*
+     * Problem: we will have 5-B in rev-list, but what about 4 commit?
+     *
+     * Solution: ?
+     *
+     *
+     * ... more problems
+     *
+     */
     private function sendBranchMail(array $branch)
     {
 
         if ($branch['changetype'] == self::TYPE_UPDATED) {
             $title = "Branch " . $branch['refname'] . " was updated";
-            $message = $title . "\n\n";
         } elseif ($branch['changetype'] == self::TYPE_CREATED) {
             $title = "Branch " . $branch['refname'] . " was created";
-            $message = $title . "\n\n";
         } else {
             $title = "Branch " . $branch['refname'] . " was deleted";
-            $message = $title . "\n\n";
         }
-
+        $message = $title . "\n\n";
 
 
         if ($branch['changetype'] != self::TYPE_DELETED) {
@@ -106,26 +141,56 @@ class PostReceiveHook extends ReceiveHook
 
         if ($tag['changetype'] == self::TYPE_UPDATED) {
             $title = "Tag " . $tag['refname'] . " was updated";
-            $message = $title . "\n\n";
         } elseif ($tag['changetype'] == self::TYPE_CREATED) {
             $title = "Tag " . $tag['refname'] . " was created";
-            $message = $title . "\n\n";
         } else {
             $title = "Tag " . $tag['refname'] . " was deleted";
-            $message = $title . "\n\n";
         }
 
-        if ($tag['changetype'] != self::TYPE_CREATED) $isAnnotatedOldTag = 
$this->isAnnotatedTag($tag['old']);
-        if ($tag['changetype'] != self::TYPE_DELETED) $isAnnotatedNewTag = 
$this->isAnnotatedTag($tag['new']);
+        $message = $title . "\n\n";
+
+        if ($tag['changetype'] != self::TYPE_DELETED) {
+            $message .= "Tag info:\n";
+            $isAnnotatedNewTag = $this->isAnnotatedTag($tag['refname']);
+            if ($isAnnotatedNewTag) {
+                $message .= $this->getAnnotatedTagInfo($tag['refname']) ."\n";
+            } else {
+                $message .= $this->getTagInfo($tag['new']) ."\n";
+            }
+        }
+        if ($tag['changetype'] != self::TYPE_CREATED) {
+            $message .= "Old tag sha: \n" . $tag['old'];
+        }
+
 
         // TODO: write info about tag and target
 
         $this->mail($this->emailprefix . '[push] ' . $title , $message);
     }
 
+    private function getTagInfo($tag)
+    {
+        $info = "Target:\n";
+        $info .= $this->execute('git diff-tree --stat --pretty=medium -c %s', 
$tag);
+        return $info;
+    }
+
+    private function getAnnotatedTagInfo($tag)
+    {
+        $tagInfo = $this->execute('git for-each-ref --format="%%(*objectname) 
%%(taggername) %%(taggerdate)" %s', $tag);
+        list($target, $tagger, $taggerdate) = explode(' ', $tagInfo);
+
+        $info = "Tagger: " . $tagger . "\n";
+        $info .= "Date: " . $taggerdate . "\n";
+        $info .= $this->execute("git cat-file tag %s | sed -e '1,/^$/d'", 
$tag)."\n";
+        $info .= "Target:\n";
+        $info .= $this->execute('git diff-tree --stat --pretty=medium -c %s', 
$target);
+        return $info;
+    }
+
     private function isAnnotatedTag($rev)
     {
-        return $this->execute('git for-each-ref --format="%%(objecttype)" %s', 
$rev) == 'tag';
+        return trim($this->execute('git for-each-ref --format="%%(objecttype)" 
%s', $rev)) == 'tag';
     }
 
 
@@ -135,7 +200,6 @@ class PostReceiveHook extends ReceiveHook
             'git rev-list %s',
             $revRange
         );
-        $output = trim($output);
         $revisions = $output ? explode("\n", trim($output)) : array();
         return $revisions;
     }

Thank you for your contribution.

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to