Commit:    0b695d086de59588b192276afa68de38a8e35a88
Author:    David Soria Parra <d...@php.net>         Wed, 21 Mar 2012 19:20:39 
+0100
Parents:   d7109df39a028fec7e5603073147647b471c9b8a
Branches:  

Link:      
http://git.php.net/?p=karma.git;a=commitdiff;h=0b695d086de59588b192276afa68de38a8e35a88

Log:
Simplify getting branches and revision

Changed paths:
  M  lib/Git/PostReceiveHook.php

0b695d086de59588b192276afa68de38a8e35a88
diff --git a/lib/Git/PostReceiveHook.php b/lib/Git/PostReceiveHook.php
index b7efb42..1e18195 100644
--- a/lib/Git/PostReceiveHook.php
+++ b/lib/Git/PostReceiveHook.php
@@ -78,140 +78,26 @@ class PostReceiveHook extends ReceiveHook
                 }
             }
         }
-        $this->alreadyExistsBranches = array_diff($this->allBranches, 
$newBranches);
 
         //send mails per ref push
+        $revisions = [];
+
         foreach ($this->refs as $ref) {
             if ($ref['reftype'] == self::REF_TAG) {
                 $this->sendTagMail($ref['refname'], $ref['changetype'], 
$ref['old'], $ref['new']);
             }
-        }
 
-        foreach($this->refs as $ref) {
-            // magic populate the $this->revisions
-            if ($ref['changetype'] != self::TYPE_DELETED) {
-                $this->getBranchRevisions($ref['refname'], $ref['changetype'], 
$ref['old'], $ref['new']);
-            }
-        }
-        //send mails per commit
-        foreach ($this->revisions as $revision => $branches) {
-            // check if it commit was already in other branches
-            if (!$this->isRevExistsInBranches($revision, 
array_diff($this->allBranches, $branches))) {
-                $this->sendCommitMail($revision, $branches);
-            }
+            $revisions = array_merge(
+                $revisions,
+                $this->getRevisions(escapeshellarg($ref['old'] . '..' . 
$ref['new'])));
         }
 
-    }
-    /**
-     * Send mail about branch.
-     * Subject: [git] [branch] %PROJECT%: %STATUS% branch %BRANCH_NAME%
-     * Body:
-     * Branch %BRANCH_NAME% in %PROJECT% was %STATUS%
-     * Date: Thu, 08 Mar 2012 12:39:48 +0000(current mail date)
-     *
-     * Link: 
http://git.php.net/?p=%PROJECT_PATH%;a=log;h=%SHA_NEW%;hp=%SHA_OLD%
-     *
-     * --part1--
-     * Log:
-     *
-     * --per commit--
-     * Commit: %SHA%
-     * Author: %USER%                               Thu, 08 Mar 2012 12:39:48 
+0000
-     * Committer: %USER%                               Thu, 08 Mar 2012 
12:39:48 +0000
-     * Link: http://git.php.net/?p=%PROJECT_PATH%;a=commitdiff;h=%SHA%
-     * Shortlog: %COMMIT_SUBJECT%
-     * --/per commit--
-     *
-     * --/part1--
-     *
-     * @param string $name branch fullname (refs/heads/example)
-     * @param int $changeType delete, create or update
-     * @param string $oldrev old revision
-     * @param string $newrev new revision
-     * @return string mail uniq id
-     */
-    private function sendBranchMail($name, $changeType, $oldrev, $newrev)
-    {
-
-        $logString = '';
-        $status = [self::TYPE_UPDATED => 'update', self::TYPE_CREATED => 
'create', self::TYPE_DELETED => 'delete'];
-        $shortname = str_replace('refs/heads/', '', $name);
-
-        // forced push
-        if ($changeType == self::TYPE_UPDATED) {
-            $replacedRevisions = $this->getRevisions(escapeshellarg($newrev . 
'..' . $oldrev)) ?: false;
-        } else {
-            $replacedRevisions = false;
-        }
-
-        if ($changeType != self::TYPE_DELETED) {
-
-            $revisions = $this->getBranchRevisions($name, $changeType, 
$oldrev, $newrev);
-
-            if (count($revisions)) {
-
-                $logString = '';
-
-                foreach ($revisions as $revision) {
-                    $commitInfo = $this->getCommitInfo($revision);
-                    $logString .= 'Commit:    ' . $revision . "\n";
-                    $logString .= 'Author:    ' . $commitInfo['author'] . ' <' 
. $commitInfo['author_email'] . '>         ' . $commitInfo['author_date'] . 
"\n";
-                    if (($commitInfo['author'] != $commitInfo['committer']) || 
($commitInfo['author_email'] != $commitInfo['committer_email'])) {
-                        $logString .= 'Committer: ' . $commitInfo['committer'] 
. ' <' . $commitInfo['committer_email'] . '>      ' . 
$commitInfo['committer_date'] . "\n";
-                    }
-                    $logString .= 'Link:      http://git.php.net/?p=' . 
$this->getRepositoryName() . ";a=commitdiff;h=" . $revision . "\n";
-                    $logString .= 'Shortlog:  ' . $commitInfo['subject'] . 
"\n";
-                    $logString .= "\n";
-
-                }
-            }
+        foreach (array_unique($revisions) as $revision) {
+            $this->sendCommitMail($revision);
         }
 
-        $mail = new \Mail();
-        $mail->setSubject($this->emailPrefix . 'push ' . 
$this->getRepositoryShortName() . ': ' . $status[$changeType] . ' branch ' . 
$shortname);
-
-        $message = 'Branch ' . $shortname . ' in ' . 
$this->getRepositoryName() . ' was ' . $status[$changeType] . 'd' . "\n";
-        $message .= 'Date: ' . date('r') . "\n";
-
-        if ($changeType != self::TYPE_DELETED) {
-            $message .= "\n";
-            $message .= "Link: http://git.php.net/?p="; . 
$this->getRepositoryName() . ";a=log;h=" . $newrev . ($changeType != 
self::TYPE_CREATED ? ";hp=" . $oldrev : "") . "\n";
-            $message .= "\n";
-        }
-
-        // forced push
-        if ($replacedRevisions) {
-            $message .= "Discarded revisions: \n" . implode("\n", 
$replacedRevisions) . "\n\n";
-        }
-
-        if ($changeType != self::TYPE_DELETED) {
-
-            if (strlen($logString) < 8192) {
-                // inline log
-                $message .= "\nLog:\n" . $logString . "\n";
-            } else {
-                // log attach
-                $logFile = 'log_' . $oldrev . '_' . $newrev . '.txt';
-                $mail->addTextFile($logFile, $logString);
-                if ((strlen($message) + $mail->getFileLength($logFile)) > 
262144) {
-                    // changed paths attach exceeded max size
-                    $mail->dropFile($logFile);
-                    $message .= "\nLog: <changed paths exceeded maximum size>";
-                }
-            }
-        }
-
-        $mail->setMessage($message);
-
-        $mail->setFrom($this->pushAuthor . '@php.net', $this->pushAuthorName);
-        $mail->addTo($this->mailingList);
-
-        $mail->send();
-
-        return $mail->getId();
     }
 
-
     /**
      * Cache revisions per branche for use it later
      * @param string $branchName branch fullname
@@ -359,41 +245,6 @@ class PostReceiveHook extends ReceiveHook
     }
 
     /**
-     * Find revisions for branch change
-     * Also cache revisions list for revisions mails
-     * @param string $name branch fullname (refs/heads/example)
-     * @param int $changeType delete, create or update
-     * @param string $oldrev old revision
-     * @param string $newrev new revision
-     * @return array revisions list
-     */
-    private function getBranchRevisions($name, $changeType, $oldrev, $newrev)
-    {
-        if ($changeType == self::TYPE_UPDATED) {
-            // git rev-list old..new
-            $revisions = $this->getRevisions(escapeshellarg($oldrev . '..' . 
$newrev));
-        } else {
-            // for new branch we write log about new commits only
-            $revisions = $this->getRevisions(
-                escapeshellarg($newrev) . ' --not ' . implode(' ', 
$this->escapeArrayShellArgs($this->alreadyExistsBranches))
-            );
-
-            // for new branches we check if they was separated from other 
branches in same push
-            // see README.POST_RECEIVE_MAIL  "commit mail" part.
-            foreach ($this->updatedBranches as $refname) {
-                if ($this->isRevExistsInBranches($this->refs[$refname]['old'], 
[$name])) {
-                    $this->cacheRevisions($name, 
$this->getRevisions(escapeshellarg($this->refs[$refname]['old'] . '..' . 
$newrev)));
-                }
-            }
-        }
-
-        $this->cacheRevisions($name, $revisions);
-
-        return $revisions;
-    }
-
-
-    /**
      * Get list of revisions for $revRange
      *
      * Required already escaped string in $revRange!!!
@@ -496,47 +347,51 @@ class PostReceiveHook extends ReceiveHook
      * @param string $revision commit revision
      * @param array $branches branches in current push with this commit
      */
-    private function sendCommitMail($revision, $branches)
+    private function sendCommitMail($revision)
     {
 
-        $bnames = array_map(function($x) {
-                                return str_replace('refs/heads/', '', $x);
-                            }, $branches);
+        $info     = $this->getCommitInfo($revision);
+        $paths    = $this->getChangedPaths(escapeshellarg($revision));
+        $branches = $this->getBranchesForRevision($revision);
 
-        $info = $this->getCommitInfo($revision);
-        $paths = $this->getChangedPaths(escapeshellarg($revision));
         $pathsString = '';
         foreach ($paths as $path => $action)
         {
             $pathsString .= '  ' . $action . '  ' . $path . "\n";
         }
-        $diff =  \Git::gitExec('diff-tree -c -p %s', 
escapeshellarg($revision));
 
-        $mail = new \Mail();
-        $mail->setSubject($this->emailPrefix . 'com ' . 
$this->getRepositoryShortName() . ': ' . $info['subject'] . ': '. implode(' ', 
array_keys($paths)));
-        $mail->setTimestamp(strtotime($info['author_date']));
+        $diff =  \Git::gitExec('diff-tree -c -p %s', 
escapeshellarg($revision));
 
-        $message = '';
+        $reponame  = $this->getRepositoryShortName();
+        $subject   = $this->emailPrefix . 'com ' . $reponame . ': ' . 
$info['subject'] . ': '. implode(' ', array_keys($paths));
+        $timestamp = strtotime($info['author_date']);
 
+        $message  = '';
         $message .= 'Commit:    ' . $revision . "\n";
         $message .= 'Author:    ' . $info['author'] . ' <' . 
$info['author_email'] . '>         ' . $info['author_date'] . "\n";
+
         if (($info['author'] != $info['committer']) || ($info['author_email'] 
!= $info['committer_email'])) {
             $message .= 'Committer: ' . $info['committer'] . ' <' . 
$info['committer_email'] . '>      ' . $info['committer_date'] . "\n";
         }
-        if ($info['parents']) $message .= 'Parents:   ' . $info['parents'] . 
"\n";
 
-        $message .= "Branches:  " . implode(' ', $bnames) . "\n";
-        $message .= "\n" . "Link:       http://git.php.net/?p="; . 
$this->getRepositoryName() . ";a=commitdiff;h=" . $revision . "\n";
+        if ($info['parents']) {
+            $message .= 'Parents:   ' . $info['parents'] . "\n";
+        }
 
-        $message .= "\nLog:\n" . $info['log'] . "\n";
+        $message .= "Branches:  " . implode(' ', $branches) . "\n";
+        $message .= "\n";
+        $message .= "Link:      http://git.php.net/?p="; . 
$this->getRepositoryName() . ";a=commitdiff;h=" . $revision . "\n";
+        $message .= "\n";
+        $message .= "Log:\n" . $info['log'] . "\n";
 
         if ($bugs = $this->getBugs($info['log'])) {
             $message .= "\nBugs:\n" . implode("\n", $bugs) . "\n";
         }
 
-        $isTrivialMerge = empty($pathsString);
 
-        if (!$isTrivialMerge && strlen($pathsString) < 8192) {
+        $mail = new \Mail();
+
+        if (strlen($pathsString) < 8192) {
             // inline changed paths
             $message .= "\nChanged paths:\n" . $pathsString . "\n";
             if ((strlen($pathsString) + strlen($diff)) < 8192) {
@@ -571,7 +426,10 @@ class PostReceiveHook extends ReceiveHook
             }
         }
 
+        $isTrivialMerge = count($paths) <= 0;
         if (!$isTrivialMerge) {
+            $mail->setSubject($subject);
+            $mail->setTimestamp($timestamp);
             $mail->setMessage($message);
 
             $mail->setFrom($this->pushAuthor . '@php.net', 
$this->pushAuthorName);
@@ -592,4 +450,11 @@ class PostReceiveHook extends ReceiveHook
         return !(bool) \Git::gitExec('rev-list --max-count=1 %s --not %s', 
escapeshellarg($revision), implode(' ', 
$this->escapeArrayShellArgs($branches)));
     }
 
+    private function getBranchesForRevision($revision) {
+        $branches = explode("\n", \Git::gitExec('branch --contains %s', 
escapeshellarg($revision)));
+        return array_map(
+            function ($n) {
+                return trim($n, ' *');
+            }, $branches);
+    }
 }
-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to