cvs: SVNROOT / commit-email.php

[email protected] ("Gwynne Raskind")
Newsgroups svn.migration
Message-ID <cvsgwynne1226351950@cvsserver>
gwynne		Mon Nov 10 21:19:10 2008 UTC

  Added files:                 
    /SVNROOT	commit-email.php 
  Log:
  commit e-mail script
  

http://cvs.php.net/viewvc.cgi/SVNROOT/commit-email.php?view=markup&rev=1.1
Index: SVNROOT/commit-email.php
+++ SVNROOT/commit-email.php
<?php

// -----------------------------------------------------------------------------------------------------------------------------
// Settings
error_reporting(E_ALL | E_STRICT);
date_default_timezone_set('UTC');

// -----------------------------------------------------------------------------------------------------------------------------
// Constants
$version = substr('$Revision: 1.1 $', strlen('$Revision: '), -2);
$email_to = array('[email protected]');
$smtp_server = '127.0.0.1';

// -----------------------------------------------------------------------------------------------------------------------------
// Version check
if (version_compare('5.2.0', PHP_VERSION, '>')) {
    die("Requires at least PHP 5.2.\n");
}

// -----------------------------------------------------------------------------------------------------------------------------
// Arguments
if ($argc != 3) {
    die("Pass exactly two arguments: REPOS and REV.\n");
}
$REPOS = $argv[1];
$REV = $argv[2];

// -----------------------------------------------------------------------------------------------------------------------------
// Utility
function run_svnlook($command)
{
    exec('exec svnlook ' . escapeshellarg($command) . ' -r ' . escapeshellarg($GLOBALS['REV']) . ' ' . escapeshellarg($GLOBALS['REPOS']), $output, $status);
    if ($status != 0) {
        die("svnlook failed with exit code {$status}\nOutput:\n" . implode("\n", $output) . "\n");
    }
    return $output;
}

// -----------------------------------------------------------------------------------------------------------------------------
// Get info from commit
$commit_info = run_svnlook('info');
$commit_user = $commit_info[0];
$commit_date = strtotime(substr($commit_info[1], 0, strlen("0000-00-00 00:00:00 +0000")));
$commit_log = implode("\n", array_slice($commit_info, 3));

// -----------------------------------------------------------------------------------------------------------------------------
// Determine "from" address
// Various repositories can play with this to read from their equivelant of the old cvsusers folder, or whatever else they like
$from = '[email protected]';

// -----------------------------------------------------------------------------------------------------------------------------
// Build list of changes
$changed_paths = run_svnlook('changed');

// -----------------------------------------------------------------------------------------------------------------------------
// Get diffs
$diffs = run_svnlook('diff');
$diffs = implode("\n", $diffs);

// -----------------------------------------------------------------------------------------------------------------------------
// Parent changed path
$dirs_changed = run_svnlook('dirs-changed');
$parent_path = $dirs_changed[0];
foreach ($dirs_changed as $dir_changed) {
    if (strlen($dir_changed) < strlen($parent_path)) {
        $parent_path = $dir_changed;
    }
}

// -----------------------------------------------------------------------------------------------------------------------------
// Build e-mail
$msg_headers = "From: {$from}\n" .
               "To: " . implode(', ', $email_to) . "\n" .
               "Message-ID: <svn{$commit_user}{$commit_date}@svn.php.net>\n" .
               "Date: " . date(DATE_RFC822, $commit_date) . "\n" .
               "Subject: svn: {$parent_path}\n";

$msg_body = "{$commit_user}\t\t" . date(DATE_RFC2822, $commit_date) . "\n" .
            "\n" .
            "Changed paths:\n" .
            "\t" . implode("\n\t", $changed_paths) . "\n" .
            "\n" .
            "Log:\n" .
            wordwrap($commit_log, 80, "\n") . "\n" .
            "\n";

if (strlen($diffs) >= 8000) {
    $boundary = $commit_user. $commit_date;
    $msg_headers .= "MIME-Version: 1.0\n" .
                    "Content-Type: multipart/mixed; boundary=\"{$boundary}\"\n";
    $msg_body = "This is a MIME encoded message.\n\n--{$boundary}\n" .
                "Content-Type: text/plain\n" .
                "\n" .
                "{$msg_body}\n" .
                "--{$boundary}\n" .
                "Content-Type: text/plain\n" .
                "Content-Disposition: attachment; filename=\"{$boundary}.txt\"\n" .
                "\n" .
                "{$diffs}\n" .
                "--{$boundary}--\n";
} else {
    $msg_body .= $diffs;
}

$complete_email = $msg_headers . "\n" . $msg_body;
$complete_email = str_replace(array("\r", "\n", "\r\n."), array("", "\r\n", ".."), $complete_email);

// -----------------------------------------------------------------------------------------------------------------------------
// Send e-mail
if (isset($_ENV['DEBUG']) && $_ENV['DEBUG'] == 'DEBUG') {
    $socket = fopen("php://stdout", "w");
} else {
    $socket = fsockopen($smtp_server, getservbyname('smtp', 'tcp'), $errno);
}
if ($socket === FALSE) {
    die("Couldn't connect to SMTP server {$smtp_server}. Errno: {$errno}.\n");
}

fwrite($socket,
    "HELO svnserver\r\n" .
    "MAIL FROM:<[email protected]>\r\n");
foreach ($email_to as $send_addr) {
    fwrite($socket, "RCPT TO:<{$email_to}>\r\n");
}
fwrite($socket,
    "DATA\r\n" .
    $complete_email . "\r\n" .
    ".\r\n" .
    "QUIT\r\n");
fclose($socket);

// -----------------------------------------------------------------------------------------------------------------------------
// Done!
exit(0);

?>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.