com karma: Add mails about deleted commits and branch: lib/Git/PostReceiveHook.php lib/Git/ReceiveHook.php
| From: | Alexander Moskaliov | Date: | Tue, 03 Apr 2012 12:00:42 +0000 |
| Subject: | com karma: Add mails about deleted commits and branch: lib/Git/PostReceiveHook.php lib/Git/ReceiveHook.php | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-68652@lists.php.net to get a copy of this message | ||
Commit: a103092576b8d9d7ade835308e8d12ff130a59cf
Author: Alexander Moskaliov <irker@php.net> Tue, 3 Apr 2012 16:00:42 +0400
Parents: 410216d61c4f23d552e87741161844685e640b87
Branches: master
Link: http://git.php.net/?p=karma.git;a=commitdiff;h=a103092576b8d9d7ade835308e8d12ff130a59cf
Log:
Add mails about deleted commits and branch
Changed paths:
M lib/Git/PostReceiveHook.php
M lib/Git/ReceiveHook.php
diff --git a/lib/Git/PostReceiveHook.php b/lib/Git/PostReceiveHook.php index f524fa6..77396d4 100644 --- a/lib/Git/PostReceiveHook.php +++ b/lib/Git/PostReceiveHook.php @@ -82,9 +82,17 @@ class PostReceiveHook extends ReceiveHook if ($ref['reftype'] == self::REF_TAG) { // tag mail $this->sendTagMail($ref['refname'], $ref['changetype'], $ref['old'], $ref['new']); - } elseif ($ref['reftype'] == self::REF_BRANCH && $ref['changetype'] != self::TYPE_DELETED) { - // magic populate the $this->revisions - $this->getBranchRevisions($ref['refname'], $ref['changetype'], $ref['old'], $ref['new']); + } elseif ($ref['reftype'] == self::REF_BRANCH) { + if ($ref['changetype'] != self::TYPE_DELETED) { + // magic populate the $this->revisions + $this->getBranchRevisions($ref['refname'], $ref['changetype'], $ref['old'], $ref['new']); + + if ($ref['changetype'] == self::TYPE_UPDATED) { + $this->sendDeletedCommitsMail($ref['refname'], $ref['old'], $ref['new']); + } + } else { + $this->sendDeletedBranchMail($ref['refname']); + } } } @@ -98,113 +106,135 @@ class PostReceiveHook extends ReceiveHook } } + /** - * Send mail about branch. - * Subject: [git] [branch] %PROJECT%: %STATUS% branch %BRANCH_NAME% + * Send mail about force deleted commits. + * Subject: del %PROJECT%: %PATHS% * 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% + * Branch: %BRANCH% + * Deleted commits count: %REV_COUNT% + * User: %USER% Thu, 08 Mar 2012 12:39:48 +0000 * * --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-- - * + * Changed paths: + * %PATHS% * --/part1-- * + * --part2-- + * Diff: + * %DIFF% + * --/part2-- + * * @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) + private function sendDeletedCommitsMail($name, $oldrev, $newrev) { - $logString = ''; - $status = [self::TYPE_UPDATED => 'update', self::TYPE_CREATED => 'create', self::TYPE_DELETED => 'delete']; - $shortname = str_replace('refs/heads/', '', $name); + $deletedRevisionsCount = count($this->getRevisions(escapeshellarg($newrev . '..' . $oldrev))); - // forced push - if ($changeType == self::TYPE_UPDATED) { - $replacedRevisions = $this->getRevisions(escapeshellarg($newrev . '..' . $oldrev)) ?: false; - } else { - $replacedRevisions = false; - } - - if ($changeType != self::TYPE_DELETED) { + if ($deletedRevisionsCount > 0) { + $shortName = str_replace('refs/heads/', '', $name); - $revisions = $this->getBranchRevisions($name, $changeType, $oldrev, $newrev); + $paths = $this->getChangedPaths(escapeshellarg($newrev . '..' . $oldrev), true); + $pathsString = ''; + foreach ($paths as $path => $action) + { + $pathsString .= ' ' . $action . ' ' . $path . "\n"; + } - if (count($revisions)) { + $isTrivialMerge = count($paths) <= 0; + + if (!$isTrivialMerge) { + + $diff = \Git::gitExec('diff-tree --cc -r -R --no-commit-id %s', escapeshellarg($newrev . '..' . $oldrev)); + + $mail = new \Mail(); + $mail->setSubject($this->emailPrefix . 'del ' . $this->getRepositoryShortName() . ': '. implode(' ', array_keys($paths))); + $mail->setTimestamp(strtotime(date('r'))); + + $message = 'Branch: ' . $shortName . "\n"; + $message .= 'Deleted commits count: ' . $deletedRevisionsCount . "\n"; + $message .= 'User: ' . $this->pushAuthorName . ' <' . $this->pushAuthor . '@php.net> ' . date('r') . "\n"; + + if (strlen($pathsString) < 8192) { + // inline changed paths + $message .= "\nChanged paths:\n" . $pathsString . "\n"; + if ((strlen($pathsString) + strlen($diff)) < 8192) { + // inline diff + $message .= "\nDiff:\n" . $diff . "\n"; + } else { + // diff attach + $diffFile = 'diff_' . $newrev . '_' . $oldrev . '.txt'; + $mail->addTextFile($diffFile, $diff); + if ((strlen($message) + $mail->getFileLength($diffFile)) > 262144) { + // diff attach exceeded max size + $mail->dropFile($diffFile); + $message .= "\nDiff: <Diff exceeded maximum size>"; + } + } + } else { + // changed paths attach + $pathsFile = 'paths_' . $newrev . '_' . $oldrev . '.txt'; + $mail->addTextFile($pathsFile, $pathsString); + if ((strlen($message) + $mail->getFileLength($pathsFile)) > 262144) { + // changed paths attach exceeded max size + $mail->dropFile($pathsFile); + $message .= "\nChanged paths: <changed paths exceeded maximum size>"; + } else { + // diff attach + $diffFile = 'diff_' . $newrev . '_' . $oldrev . '.txt'; + $mail->addTextFile($diffFile, $diff); + if ((strlen($message) + $mail->getFileLength($pathsFile) + $mail->getFileLength($diffFile)) > 262144) { + // diff attach exceeded max size + $mail->dropFile($diffFile); + } + } + } - $logString = ''; + $mail->setMessage($message); - 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"; + $mail->setFrom($this->pushAuthor . '@php.net', $this->pushAuthorName); + $mail->addTo($this->mailingList); - } + $result = $mail->send(); + $this->log('revisions deleted ' . $newrev . '..' . $oldrev . ($result ? ' was send' : ' error while sending')); } - } - $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) { + /** + * Send mail about deleted branch. + * Subject: branch %PROJECT%: %BRANCH_NAME% deleted + * Body: + * Deleted branch: %BRANCH% + * User: %USER% Thu, 08 Mar 2012 12:39:48 +0000 + * + * @param string $name branch fullname (refs/heads/example) + */ + private function sendDeletedBranchMail($name) + { + $shortName = str_replace('refs/heads/', '', $name); - 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 = new \Mail(); + $mail->setSubject($this->emailPrefix . 'branch ' . $this->getRepositoryShortName() . ': '. $shortName . ' deleted'); + $mail->setTimestamp(strtotime(date('r'))); + + $message = 'Deleted branch: ' . $shortName . "\n"; + $message .= 'User: ' . $this->pushAuthorName . ' <' . $this->pushAuthor . '@php.net> ' . date('r') . "\n"; $mail->setMessage($message); $mail->setFrom($this->pushAuthor . '@php.net', $this->pushAuthorName); $mail->addTo($this->mailingList); - $mail->send(); + $result = $mail->send(); + $this->log('branch deleted ' . $shortName . ($result ? ' was send' : ' error while sending')); - return $mail->getId(); } @@ -224,7 +254,7 @@ class PostReceiveHook extends ReceiveHook /** * Send mail about tag. - * Subject: [git] [tag] %PROJECT%: %STATUS% tag %TAGNAME% + * Subject: tag %PROJECT%: %STATUS% tag %TAGNAME% * Body: * Tag %TAGNAME% in %PROJECT% was %STATUS% (if sha was changed)from %OLD_SHA% * Tag(if annotaded): %SHA% @@ -464,7 +494,7 @@ class PostReceiveHook extends ReceiveHook /** * Send mail about commit. - * Subject: [git] [commit] %PROJECT%: %PATHS% + * Subject: com %PROJECT%: %PATHS% * Body: * Commit: %SHA% * Author: %USER% Thu, 08 Mar 2012 12:39:48 +0000 diff --git a/lib/Git/ReceiveHook.php b/lib/Git/ReceiveHook.php index 0100d6e..8faedec 100644 --- a/lib/Git/ReceiveHook.php +++ b/lib/Git/ReceiveHook.php @@ -78,11 +78,12 @@ abstract class ReceiveHook * Required already escaped string in $revRange!!! * * @param string $revRange + * @param bool $reverse reverse diff * @return array */ - protected function getChangedPaths($revRange) + protected function getChangedPaths($revRange, $reverse = false) { - $raw = \Git::gitExec('diff-tree -r --no-commit-id -c --name-status --pretty="format:" %s', $revRange); + $raw = \Git::gitExec('diff-tree ' . ($reverse ? '-R ' : '') . '-r --no-commit-id -c --name-status --pretty="format:" %s', $revRange); $paths = []; $lines = explode("\n", $raw); foreach($lines as $line) {
diff --git a/lib/Git/PostReceiveHook.php b/lib/Git/PostReceiveHook.php index f524fa6..77396d4 100644 --- a/lib/Git/PostReceiveHook.php +++ b/lib/Git/PostReceiveHook.php @@ -82,9 +82,17 @@ class PostReceiveHook extends ReceiveHook if ($ref['reftype'] == self::REF_TAG) { // tag mail $this->sendTagMail($ref['refname'], $ref['changetype'], $ref['old'], $ref['new']); - } elseif ($ref['reftype'] == self::REF_BRANCH && $ref['changetype'] != self::TYPE_DELETED) { - // magic populate the $this->revisions - $this->getBranchRevisions($ref['refname'], $ref['changetype'], $ref['old'], $ref['new']); + } elseif ($ref['reftype'] == self::REF_BRANCH) { + if ($ref['changetype'] != self::TYPE_DELETED) { + // magic populate the $this->revisions + $this->getBranchRevisions($ref['refname'], $ref['changetype'], $ref['old'], $ref['new']); + + if ($ref['changetype'] == self::TYPE_UPDATED) { + $this->sendDeletedCommitsMail($ref['refname'], $ref['old'], $ref['new']); + } + } else { + $this->sendDeletedBranchMail($ref['refname']); + } } } @@ -98,113 +106,135 @@ class PostReceiveHook extends ReceiveHook } } + /** - * Send mail about branch. - * Subject: [git] [branch] %PROJECT%: %STATUS% branch %BRANCH_NAME% + * Send mail about force deleted commits. + * Subject: del %PROJECT%: %PATHS% * 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% + * Branch: %BRANCH% + * Deleted commits count: %REV_COUNT% + * User: %USER% Thu, 08 Mar 2012 12:39:48 +0000 * * --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-- - * + * Changed paths: + * %PATHS% * --/part1-- * + * --part2-- + * Diff: + * %DIFF% + * --/part2-- + * * @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) + private function sendDeletedCommitsMail($name, $oldrev, $newrev) { - $logString = ''; - $status = [self::TYPE_UPDATED => 'update', self::TYPE_CREATED => 'create', self::TYPE_DELETED => 'delete']; - $shortname = str_replace('refs/heads/', '', $name); + $deletedRevisionsCount = count($this->getRevisions(escapeshellarg($newrev . '..' . $oldrev))); - // forced push - if ($changeType == self::TYPE_UPDATED) { - $replacedRevisions = $this->getRevisions(escapeshellarg($newrev . '..' . $oldrev)) ?: false; - } else { - $replacedRevisions = false; - } - - if ($changeType != self::TYPE_DELETED) { + if ($deletedRevisionsCount > 0) { + $shortName = str_replace('refs/heads/', '', $name); - $revisions = $this->getBranchRevisions($name, $changeType, $oldrev, $newrev); + $paths = $this->getChangedPaths(escapeshellarg($newrev . '..' . $oldrev), true); + $pathsString = ''; + foreach ($paths as $path => $action) + { + $pathsString .= ' ' . $action . ' ' . $path . "\n"; + } - if (count($revisions)) { + $isTrivialMerge = count($paths) <= 0; + + if (!$isTrivialMerge) { + + $diff = \Git::gitExec('diff-tree --cc -r -R --no-commit-id %s', escapeshellarg($newrev . '..' . $oldrev)); + + $mail = new \Mail(); + $mail->setSubject($this->emailPrefix . 'del ' . $this->getRepositoryShortName() . ': '. implode(' ', array_keys($paths))); + $mail->setTimestamp(strtotime(date('r'))); + + $message = 'Branch: ' . $shortName . "\n"; + $message .= 'Deleted commits count: ' . $deletedRevisionsCount . "\n"; + $message .= 'User: ' . $this->pushAuthorName . ' <' . $this->pushAuthor . '@php.net> ' . date('r') . "\n"; + + if (strlen($pathsString) < 8192) { + // inline changed paths + $message .= "\nChanged paths:\n" . $pathsString . "\n"; + if ((strlen($pathsString) + strlen($diff)) < 8192) { + // inline diff + $message .= "\nDiff:\n" . $diff . "\n"; + } else { + // diff attach + $diffFile = 'diff_' . $newrev . '_' . $oldrev . '.txt'; + $mail->addTextFile($diffFile, $diff); + if ((strlen($message) + $mail->getFileLength($diffFile)) > 262144) { + // diff attach exceeded max size + $mail->dropFile($diffFile); + $message .= "\nDiff: <Diff exceeded maximum size>"; + } + } + } else { + // changed paths attach + $pathsFile = 'paths_' . $newrev . '_' . $oldrev . '.txt'; + $mail->addTextFile($pathsFile, $pathsString); + if ((strlen($message) + $mail->getFileLength($pathsFile)) > 262144) { + // changed paths attach exceeded max size + $mail->dropFile($pathsFile); + $message .= "\nChanged paths: <changed paths exceeded maximum size>"; + } else { + // diff attach + $diffFile = 'diff_' . $newrev . '_' . $oldrev . '.txt'; + $mail->addTextFile($diffFile, $diff); + if ((strlen($message) + $mail->getFileLength($pathsFile) + $mail->getFileLength($diffFile)) > 262144) { + // diff attach exceeded max size + $mail->dropFile($diffFile); + } + } + } - $logString = ''; + $mail->setMessage($message); - 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"; + $mail->setFrom($this->pushAuthor . '@php.net', $this->pushAuthorName); + $mail->addTo($this->mailingList); - } + $result = $mail->send(); + $this->log('revisions deleted ' . $newrev . '..' . $oldrev . ($result ? ' was send' : ' error while sending')); } - } - $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) { + /** + * Send mail about deleted branch. + * Subject: branch %PROJECT%: %BRANCH_NAME% deleted + * Body: + * Deleted branch: %BRANCH% + * User: %USER% Thu, 08 Mar 2012 12:39:48 +0000 + * + * @param string $name branch fullname (refs/heads/example) + */ + private function sendDeletedBranchMail($name) + { + $shortName = str_replace('refs/heads/', '', $name); - 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 = new \Mail(); + $mail->setSubject($this->emailPrefix . 'branch ' . $this->getRepositoryShortName() . ': '. $shortName . ' deleted'); + $mail->setTimestamp(strtotime(date('r'))); + + $message = 'Deleted branch: ' . $shortName . "\n"; + $message .= 'User: ' . $this->pushAuthorName . ' <' . $this->pushAuthor . '@php.net> ' . date('r') . "\n"; $mail->setMessage($message); $mail->setFrom($this->pushAuthor . '@php.net', $this->pushAuthorName); $mail->addTo($this->mailingList); - $mail->send(); + $result = $mail->send(); + $this->log('branch deleted ' . $shortName . ($result ? ' was send' : ' error while sending')); - return $mail->getId(); } @@ -224,7 +254,7 @@ class PostReceiveHook extends ReceiveHook /** * Send mail about tag. - * Subject: [git] [tag] %PROJECT%: %STATUS% tag %TAGNAME% + * Subject: tag %PROJECT%: %STATUS% tag %TAGNAME% * Body: * Tag %TAGNAME% in %PROJECT% was %STATUS% (if sha was changed)from %OLD_SHA% * Tag(if annotaded): %SHA% @@ -464,7 +494,7 @@ class PostReceiveHook extends ReceiveHook /** * Send mail about commit. - * Subject: [git] [commit] %PROJECT%: %PATHS% + * Subject: com %PROJECT%: %PATHS% * Body: * Commit: %SHA% * Author: %USER% Thu, 08 Mar 2012 12:39:48 +0000 diff --git a/lib/Git/ReceiveHook.php b/lib/Git/ReceiveHook.php index 0100d6e..8faedec 100644 --- a/lib/Git/ReceiveHook.php +++ b/lib/Git/ReceiveHook.php @@ -78,11 +78,12 @@ abstract class ReceiveHook * Required already escaped string in $revRange!!! * * @param string $revRange + * @param bool $reverse reverse diff * @return array */ - protected function getChangedPaths($revRange) + protected function getChangedPaths($revRange, $reverse = false) { - $raw = \Git::gitExec('diff-tree -r --no-commit-id -c --name-status --pretty="format:" %s', $revRange); + $raw = \Git::gitExec('diff-tree ' . ($reverse ? '-R ' : '') . '-r --no-commit-id -c --name-status --pretty="format:" %s', $revRange); $paths = []; $lines = explode("\n", $raw); foreach($lines as $line) {