gwynne                                   Fri, 24 Jul 2009 18:54:54 +0000

Revision: http://svn.php.net/viewvc?view=revision&revision=284714

Log:
- Restructure hooks again. They now use a common include which does a bunch of 
common stuff.
- Use PHP_EOL instead of a literal \n for commit emails. Paranoia.
- Now provide more information on copied paths (esp. for tagging)
- Creating tags by copying an existing directory is now allowed
- start-commit doesn't need to do anything
- reduce the number of times the path list is iterated in pre-commit
- Now mix and match the use of global and pear avail files on a per-path basis
- TODO: Parse the avail files only once instead of once per committed path
- Replace regexp with simple string ops for just about everything
- Don't bother storing the URL prefix as part of the bug info, nothing used that
- Remove worthless $Revision$ constants. Another thing nothing used.

Changed paths:
    U   SVNROOT/commit-bugs.php
    U   SVNROOT/commit-email.php
    U   SVNROOT/commit-svnroot.php
    A   SVNROOT/hook-common.inc.php
    U   SVNROOT/post-commit
    U   SVNROOT/pre-commit
    U   SVNROOT/start-commit

Modified: SVNROOT/commit-bugs.php
===================================================================
--- SVNROOT/commit-bugs.php	2009-07-24 18:08:42 UTC (rev 284713)
+++ SVNROOT/commit-bugs.php	2009-07-24 18:54:54 UTC (rev 284714)
@@ -5,7 +5,6 @@

 // -----------------------------------------------------------------------------------------------------------------------------
 // Constants
-$version = substr('$Revision$', strlen('$Revision: '), -2);
 $bug_pattern = '/(?:(pecl|pear|php)\s*)?(?:bug|#)[\s#:]*([0-9]+)/iuX';
 $bug_url_prefixes = array(
     'pear' => 'http://pear.php.net/bugs',
@@ -45,8 +44,8 @@
     $bug['project'] = $matched_bug[1] === "" ? $bug_project_default : strtolower($matched_bug[1]);
     $bug['number'] = intval($matched_bug[2]);
     $bugid = $bug['project'] . $bug['number'];
-    $bug['url_prefix'] = isset($bug_url_prefixes[$bug['project']]) ? $bug_url_prefixes[$bug['project']] : $bug_url_prefixes[''];
-    $bug['url'] = $bug['url_prefix'] . '/' . $bug['number'];
+    $url_prefix = isset($bug_url_prefixes[$bug['project']]) ? $bug_url_prefixes[$bug['project']] : $bug_url_prefixes[''];
+    $bug['url'] = $url_prefix . '/' . $bug['number'];
     $bug['status'] = 'unknown';
     $bug['short_desc'] = '';
     $bug_list[$bugid] = $bug;

Modified: SVNROOT/commit-email.php
===================================================================
--- SVNROOT/commit-email.php	2009-07-24 18:08:42 UTC (rev 284713)
+++ SVNROOT/commit-email.php	2009-07-24 18:54:54 UTC (rev 284714)
@@ -5,7 +5,6 @@

 // -----------------------------------------------------------------------------------------------------------------------------
 // Constants
-$version = substr('$Revision$', strlen('$Revision: '), -2);
 $smtp_server = '127.0.0.1';

 $commit_email_list = array(
@@ -103,19 +102,6 @@
 $always_addresses = array('gwy...@php.net');

 // -----------------------------------------------------------------------------------------------------------------------------
-function common_prefix($str1, $str2)
-{
-    $result = "";
-    $i = 0;
-    $max = min(strlen($str1), strlen($str2));
-    while ($i < $max && $str1[$i] === $str2[$i]) {
-        $result .= $str1[$i];
-        ++$i;
-    }
-    return $result;
-}
-
-// -----------------------------------------------------------------------------------------------------------------------------
 // Build list of e-mail addresses and parent changed path
 $emails_to = array();
 $parent_path = '/' . $commit_info['dirs_changed'][0];
@@ -150,22 +136,21 @@
 // Process bugs
 $bugs_body = '';
 if (isset($bug_list) && count($bug_list) > 0) {
-    $bugs_body = count($bug_list) > 1 ? "\nBugs: " : "\nBug: ";
+    $bugs_body = PHP_EOL . (count($bug_list) > 1 ? "Bugs: " : "Bug: ");
     foreach ($bug_list as $n => $bug) {
         if (isset($bug['error'])) {
             $status = '(error getting bug information)';
         } else {
             $status = "({$bug['status']}) {$bug['short_desc']}";
         }
-        $bugs_body .= "{$bug['url']} {$status}\n      ";
+        $bugs_body .= "{$bug['url']} {$status}" . PHP_EOL . "      ";
     }
 }

 // -----------------------------------------------------------------------------------------------------------------------------
 // Process changed paths
 $paths_list = $parent_path;
-foreach ($commit_info['changed_paths'] as $changed_path) {
-    $changed_path = trim(strstr($changed_path, ' '));
+foreach ($commit_info['changed_paths'] as $changed_path => $path_actions) {
     if (substr($changed_path, -1) !== '/') {
         $paths_list .= ' ' . substr($changed_path, strlen($parent_path) - 1);
     }
@@ -179,13 +164,13 @@
 $email_date = date(DATE_RFC2822, $commit_info['date']);
 $fullname = "=?utf-8?q?" . imap_8bit(str_replace(array('?', ' '), array('=3F', '_'), $commit_info['author_name'])) . "?=";
 $email_list = implode(', ', $emails_to);
-$readable_path_list = "    " . implode("\n    ", $commit_info['changed_paths']);
+$readable_path_list = "    " . implode(PHP_EOL . "    ", $commit_info['raw_changed_paths']);
 $nspaces = str_repeat(" ", max(1, 72 - strlen($commit_info['author']) - strlen($email_date)));

 $msg_body = <<<MIMEBODY
 From: {$fullname} <{$commit_info['author']...@php.net>
 To: {$email_list}
-Message-ID: <svn{$message...@svn.php.net>
+Message-ID: <svn-{$message...@svn.php.net>
 Date: {$email_date}
 Subject: {$subject}
 MIME-Version: 1.0
@@ -210,7 +195,7 @@
 MIMEBODY;

 if ($diffs_string === NULL) {
-    $diff_data = wordwrap(base64_encode($commit_info['diffs']), 80, "\n", TRUE);
+    $diff_data = wordwrap(base64_encode($commit_info['diffs']), 80, PHP_EOL, TRUE);
     $msg_body .= <<<MIMEBODY

 Content-Type: text/x-diff; encoding="utf-8"

Modified: SVNROOT/commit-svnroot.php
===================================================================
--- SVNROOT/commit-svnroot.php	2009-07-24 18:08:42 UTC (rev 284713)
+++ SVNROOT/commit-svnroot.php	2009-07-24 18:54:54 UTC (rev 284714)
@@ -4,10 +4,6 @@
 //  the appropriate variables and functions are defined.

 // -----------------------------------------------------------------------------------------------------------------------------
-// Constants
-$version = substr('$Revision$', strlen('$Revision: '), -2);
-
-// -----------------------------------------------------------------------------------------------------------------------------
 // Check for a SVNROOT commit
 $SVNROOT_changed = FALSE;
 foreach ($commit_info['dirs_changed'] as $changed_path) {
@@ -20,9 +16,7 @@
 // -----------------------------------------------------------------------------------------------------------------------------
 // If SVNROOT had a commit, we need to update the admin copy
 if ($SVNROOT_changed) {
-    if ($is_DEBUG) {
-        print "Updating SVNROOT...\n";
-    }
+    debug("Updating SVNROOT...");
     chdir(__DIR__);
     exec('exec svn update', $output, $status);
     fwrite(STDERR, implode("\n", $output) . "\n");

Added: SVNROOT/hook-common.inc.php
===================================================================
--- SVNROOT/hook-common.inc.php	                        (rev 0)
+++ SVNROOT/hook-common.inc.php	2009-07-24 18:54:54 UTC (rev 284714)
@@ -0,0 +1,144 @@
+<?php
+
+// -----------------------------------------------------------------------------------------------------------------------------
+// Settings
+error_reporting(E_ALL | E_STRICT);
+date_default_timezone_set('UTC');
+putenv("PATH=/usr/local/bin:/usr/bin:/bin");
+
+function fail($error)
+{
+    fwrite(STDERR, $error);
+    exit(1);
+}
+
+// -----------------------------------------------------------------------------------------------------------------------------
+// Constants
+$is_DEBUG = (isset($_ENV['DEBUG']) && $_ENV['DEBUG'] === 'DEBUG');
+
+// -----------------------------------------------------------------------------------------------------------------------------
+// Version check
+if (version_compare('5.2.0', PHP_VERSION, '>')) {
+    fail("Requires at least PHP 5.2.\n");
+}
+if (!defined('__DIR__')) {
+    define('__DIR__', dirname(__FILE__));
+}
+
+// -----------------------------------------------------------------------------------------------------------------------------
+// Utility functions
+function run_svnlook($command, $flags = array(), $args = array())
+{
+    if (isset($GLOBALS['TXN'])) {
+        $selector = '-t';
+        $selectee = $GLOBALS['TXN'];
+    } else if (isset($GLOBALS['REV'])) {
+        $selector = '-r';
+        $selectee = $GLOBALS['REV'];
+    } else {
+        fail("Unknown hook.\n");
+    }
+
+    $args = implode(' ', array_map('escapeshellarg', array_merge(
+        array('svnlook', $command),
+        $flags,
+        array($selector, $selectee, $GLOBALS['REPOS']),
+        $args
+    )));
+    exec("exec {$args} 2>&1", $output, $status);
+    if ($status !== 0) {
+        fail("svnlook failed with exit code {$status}\nOutput:\n" . implode("\n", $output) . "\n");
+    }
+    return $output;
+}
+
+function process_changed_paths($path_list)
+{
+    static $action_types = array('A' => 'added', 'D' => 'removed', 'U' => 'changed');
+    $final_paths = array();
+    for ($i = 0; $i < count($path_list); ++$i) {
+        $changed_path = $path_list[$i];
+        $content_status = $changed_path[0];
+        $props_status = $changed_path[1];
+        $copy_status = $changed_path[2];
+        $actual_path = substr($changed_path, 4);
+        $path_actions = array();
+        if ($content_status !== ' ' && $content_status !== '_') {
+            $path_actions[] = $action_types[$content_status];
+        }
+        if ($props_status !== ' ') {
+            $path_actions[] = 'props-changed';
+        }
+        if ($copy_status === '+') {
+            $path_actions[] = 'copied';
+            ++$i;
+        }
+        $final_paths[$actual_path] = $path_actions;
+    }
+    debug(print_r($final_paths, 1));
+    return $final_paths;
+}
+
+function read_commit_information()
+{
+    global $is_DEBUG;
+
+    $info = array(
+        'raw_changed_paths' => run_svnlook('changed', array('--copy-info')),
+        'dirs_changed' => run_svnlook('dirs-changed'),
+        'author' => ($is_DEBUG && getenv("DEBUGUSER")) ? getenv("DEBUGUSER") : trim(implode('', run_svnlook('author'))),
+        'log_message' => trim(implode("\n", run_svnlook('log'))),
+        'date' => strtotime(substr(trim(implode('', run_svnlook('date'))), 0, strlen("0000-00-00 00:00:00 +0000"))),
+        'diffs' => implode("\n", run_svnlook('diff')),
+    );
+
+    $info['changed_paths'] = process_changed_paths($info['raw_changed_paths']);
+
+    list($info['author_name'], $info['author_email']) = find_user($info['author']);
+
+    return $info;
+}
+
+function find_user($author)
+{
+    $usersDB = file(__DIR__ . '/users.db');
+    $saw_last_ISO = FALSE;
+    foreach ($usersDB as $userline) {
+        list ($username, $fullname, $email) = explode(":", trim($userline));
+        if ($username === 'ladderalice') {
+            $saw_last_ISO = TRUE;
+        }
+        if ($username === $author) {
+            if ($saw_last_ISO !== TRUE) {
+                $fullname = iconv("ISO-8859-1", "UTF-8//TRANSLIT", $fullname);
+            }
+            $result = array($fullname, $email);
+            break;
+        }
+    }
+    if (!isset($result)) {
+        fail("No such user.\n");
+    }
+    return $result;
+}
+
+function common_prefix($str1, $str2)
+{
+    $result = "";
+    $i = 0;
+    $max = min(strlen($str1), strlen($str2));
+    while ($i < $max && $str1[$i] === $str2[$i]) {
+        $result .= $str1[$i];
+        ++$i;
+    }
+    return $result;
+}
+
+function debug($message)
+{
+    if ($GLOBALS['is_DEBUG']) {
+        print "DEBUG: {$message}\n";
+    }
+}
+
+?>


Property changes on: SVNROOT/hook-common.inc.php
___________________________________________________________________
Added: svn:keywords
   + Id Rev
Added: svn:eol-style
   + native

Modified: SVNROOT/post-commit
===================================================================
--- SVNROOT/post-commit	2009-07-24 18:08:42 UTC (rev 284713)
+++ SVNROOT/post-commit	2009-07-24 18:54:54 UTC (rev 284714)
@@ -2,32 +2,10 @@
 <?php

 // -----------------------------------------------------------------------------------------------------------------------------
-// Settings
-error_reporting(E_ALL | E_STRICT);
-date_default_timezone_set('UTC');
-putenv("PATH=/usr/local/bin:/usr/bin:/bin");
+// Include
+require dirname(__FILE__) . '/hook-common.inc.php';

-function fail($error)
-{
-    fwrite(STDERR, $error);
-    exit(1);
-}
-
 // -----------------------------------------------------------------------------------------------------------------------------
-// Constants
-$version = substr('$Revision$', strlen('$Revision: '), -2);
-$is_DEBUG = (isset($_ENV['DEBUG']) && $_ENV['DEBUG'] === 'DEBUG');
-
-// -----------------------------------------------------------------------------------------------------------------------------
-// Version check
-if (version_compare('5.2.0', PHP_VERSION, '>')) {
-    fail("Requires at least PHP 5.2.\n");
-}
-if (!defined('__DIR__')) {
-    define('__DIR__', dirname(__FILE__));
-}
-
-// -----------------------------------------------------------------------------------------------------------------------------
 // Arguments
 if ($argc !== 3) {
     fail("Pass exactly two arguments: REPOS and REV.\n");
@@ -36,51 +14,11 @@
 $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) {
-        fail("svnlook failed with exit code {$status}\nOutput:\n" . implode("\n", $output) . "\n");
-    }
-    return $output;
-}
+// Read the commit data
+$commit_info = read_commit_information();

 // -----------------------------------------------------------------------------------------------------------------------------
-// Build list of changes
-$commit_info = array(
-    'changed_paths' => run_svnlook('changed'),
-    'dirs_changed' => run_svnlook('dirs-changed'),
-    'author' => ($is_DEBUG && getenv("DEBUGUSER")) ? getenv("DEBUGUSER") : trim(implode('', run_svnlook('author'))),
-    'log_message' => trim(implode("\n", run_svnlook('log'))),
-    'date' => strtotime(substr(trim(implode('', run_svnlook('date'))), 0, strlen("0000-00-00 00:00:00 +0000"))),
-    'diffs' => implode("\n", run_svnlook('diff')),
-);
-
-// -----------------------------------------------------------------------------------------------------------------------------
-// Read the user database
-$usersDB = file(dirname(__FILE__) . '/users.db');
-$saw_last_ISO = FALSE;
-foreach ($usersDB as $userline) {
-    list ($username, $fullname, $email) = explode(":", trim($userline));
-    if ($username === 'ladderalice') {
-        $saw_last_ISO = TRUE;
-    }
-    if ($username === $commit_info['author']) {
-        if ($saw_last_ISO !== TRUE) {
-            $fullname = iconv("ISO-8859-1", "UTF-8//TRANSLIT", $fullname);
-        }
-        $commit_info['author_name'] = $fullname;
-        $commit_info['author_email'] = $email;
-        break;
-    }
-}
-if (!isset($commit_info['author_name'])) {
-    fail("Couldn't find user\n");
-}
-
-// -----------------------------------------------------------------------------------------------------------------------------
-// Call various sub-scripts
+// Call the various sub-scripts
 require __DIR__ . '/commit-bugs.php';
 require __DIR__ . '/commit-email.php';
 require __DIR__ . '/commit-svnroot.php';

Modified: SVNROOT/pre-commit
===================================================================
--- SVNROOT/pre-commit	2009-07-24 18:08:42 UTC (rev 284713)
+++ SVNROOT/pre-commit	2009-07-24 18:54:54 UTC (rev 284714)
@@ -2,115 +2,71 @@
 <?php

 // -----------------------------------------------------------------------------------------------------------------------------
-// Settings
-error_reporting(E_ALL | E_STRICT);
-date_default_timezone_set('UTC');
-putenv("PATH=/usr/local/bin:/usr/bin:/bin");
+// Include
+require dirname(__FILE__) . '/hook-common.inc.php';

-function fail($error)
-{
-    fwrite(STDERR, $error);
-    exit(1);
-}
-
 // -----------------------------------------------------------------------------------------------------------------------------
-// Constants
-$version = substr('$Revision$', strlen('$Revision: '), -2);
-$is_DEBUG = (isset($_ENV['DEBUG']) && $_ENV['DEBUG'] === 'DEBUG');
-
-// -----------------------------------------------------------------------------------------------------------------------------
-// Version check
-if (version_compare('5.2.0', PHP_VERSION, '>')) {
-    fail("Requires at least PHP 5.2.\n");
-}
-
-// -----------------------------------------------------------------------------------------------------------------------------
 // Arguments
-if ($argc != 3 && !$is_DEBUG) {
+if ($argc != 3) {
     fail("Pass exactly two arguments: REPOS and TXN.\n");
 }
 $REPOS = $argv[1];
 $TXN = $argv[2];

 // -----------------------------------------------------------------------------------------------------------------------------
-// Utility
-function run_svnlook($command, $extra_args = array())
-{
-    $selector = $GLOBALS['is_DEBUG'] ? '-r' : '-t';
-    $cmd = 'exec svnlook ' . escapeshellarg($command) . " {$selector} " . escapeshellarg($GLOBALS['TXN']) . ' ' .
-        escapeshellarg($GLOBALS['REPOS']) . ' ' . implode(' ', array_map('escapeshellarg', $extra_args)) . ' 2>&1';
-    exec($cmd, $output, $status);
-    if ($status != 0) {
-        fail("svnlook ({$cmd}) failed with exit code {$status}\nOutput:\n" . implode("\n", $output) . "\nBacktrace:\n" . print_r(debug_backtrace(), 1));
-    }
-    return $output;
-}
-
-function pattern_matches_commit($pattern)
-{
-    foreach ($GLOBALS['paths_changed'] as $path_changed) {
-        if (!preg_match($pattern, $path_changed)) {
-            return FALSE;
-        }
-    }
-    return TRUE;
-}
-
-function explode_noempty($separator, $str) {
-    $result = explode($separator, $str);
-    $true_result = array();
-    foreach ($result as $element) {
-        if (empty($element)) {
-            continue;
-        }
-        $true_result[] = $element;
-    }
-    return $true_result;
-}
-
-// -----------------------------------------------------------------------------------------------------------------------------
-// Build list of changes
+// Read the commit data
 if ($is_DEBUG) {
-    $paths_changed = explode("\n", trim(stream_get_contents(STDIN)));
-    $log_message = array('test1', 'test2');
-    $author = $argv[3];
-} else {
-    $paths_changed = run_svnlook('changed');
-    $log_message = run_svnlook('log');
-    $author = trim(implode("\n", run_svnlook('author')));
+    // make svnlook use a revision instead for debugging
+    $REV = $TXN;
+    unset($TXN);
 }
-array_walk($paths_changed, create_function('&$v, $k', '$v = trim($v); $v = ltrim(substr($v, strcspn($v, " \t")));'));
+$commit_info = read_commit_information();

 // -----------------------------------------------------------------------------------------------------------------------------
 // Log message empty?
-if (strlen(trim(implode("\n", $log_message))) == 0) {
+if (strlen($commit_info['log_message']) === 0) {
     fail("Please specify a log message.\n");
 }

 // -----------------------------------------------------------------------------------------------------------------------------
-// Read avail database
-if (pattern_matches_commit('/^pear.*/')) {
-    $avail_db = dirname(__FILE__) . '/pear_avail';
-} else {
-    $avail_db = dirname(__FILE__) . '/global_avail';
+// Check for denied commits
+foreach ($commit_info['changed_paths'] as $changed_path => $path_actions) {
+    if (strncmp($changed_path, "archived/", strlen("archived/")) === 0) {
+        fail("Commits to archived modules are not allowed.\n");
+    }
+
+    //  path contains "/tags/" AND
+    //  path was not added OR
+    //  path was not copied OR
+    //  path is not a directory OR
+    //  path's immediate ancestor is not tags/
+    if (strpos($changed_path, '/tags/') !== FALSE &&
+        (!in_array('added', $path_actions) ||
+        !in_array('copied', $path_actions) ||
+        substr($changed_path, -1) !== '/' ||
+        substr(dirname($changed_path), -5) !== '/tags'))
+    {
+        fail("Committing to a tag is not allowed.\n");
+    }
 }
-$avail_lines = file($avail_db);

 // -----------------------------------------------------------------------------------------------------------------------------
-// Check for denied commits
-if (pattern_matches_commit('/^archived.*/')) {
-    fail("Commits to archived modules are not allowed.\n");
-}
+// Read avail database
+$main_avail_db = file(__DIR__ . '/global_avail');
+$pear_avail_db = file(__DIR__ . '/pear_avail');

-// Should match when tags is a component of the path but not the last component
-if (pattern_matches_commit('~/tags/.+~')) {
-    fail("Committing to a tag is not allowed.\n");
-}
-
 // -----------------------------------------------------------------------------------------------------------------------------
 // Check commit against it
 $exit_val = 0;
-foreach ($paths_changed as $path_changed) {
+foreach ($commit_info['changed_paths'] as $changed_path => $path_actions) {
+    if (strncmp($changed_path, "pear/", strlen("pear/")) === 0) {
+        $avail_lines = $pear_avail_db;
+        debug("Using PEAR avail.");
+    } else {
+        $avail_lines = $main_avail_db;
+        debug("Using global avail.");
+    }
+
     foreach ($avail_lines as $avail_line) {
         if (strncmp($avail_line, 'unavail', 7) == 0) {
             $bit = 0;
@@ -120,23 +76,16 @@
             continue;
         }

-        $params = explode("|", trim($avail_line));
-        if (count($params) == 1) {  // avail/unavail by itself
-            $userlist = array();
-            $modulelist = array();
-        } else if (count($params) == 2) {   // user list but no mod list
-            $userlist = explode_noempty(",", $params[1]);
-            $modulelist = array();
-        } else {
-            $userlist = explode_noempty(",", $params[1]);
-            $modulelist = explode_noempty(",", $params[2]);
-        }
-        $user_in_list = in_array($author, $userlist) || count($userlist) == 0;
+        $params = array_merge(explode("|", trim($avail_line), 3), array("", ""));
+        $modulelist = array_filter(explode(",", $params[2]));
+        $userlist = array_filter(explode(",", $params[1]));

-        $in_repo = count($modulelist) == 0;
+        $user_in_list = count($userlist) === 0 || in_array($commit_info['author'], $userlist);
+
+        $in_repo = count($modulelist) === 0;
         if (!$in_repo) {
             foreach ($modulelist as $module) {
-                if (fnmatch("{$module}*", $path_changed)) {
+                if (fnmatch("{$module}*", $changed_path)) {
                     $in_repo = TRUE;
                 }
             }
@@ -146,80 +95,38 @@
             $exit_val = $bit ? 0 : 1;
         }

-        if ($GLOBALS['is_DEBUG']) {
-            if ($user_in_list) {
-                print "DEBUG: User {$author} " . ($user_in_list ? "matched" : "did not match") . " user list: " . implode(",", $userlist) . "\n";
-            }
-            if ($in_repo) {
-                print "DEBUG: Path {$path_changed} " . ($in_repo ? "matched" : "did not match") . " repo list: " . implode(",", $modulelist) . "\n";
-            }
-            if ($user_in_list || $in_repo) {
-                print "DEBUG: exit_val == {$exit_val} for " . var_export($user_in_list, 1) . "/" . var_export($in_repo, 1) . ".\n";
-            }
+        if ($user_in_list) {
+            debug("User {$commit_info['author']} " . ($user_in_list ? "matched" : "did not match") . " user list: {$params[1]}");
         }
+        if ($in_repo) {
+            debug("Path {$changed_path} " . ($in_repo ? "matched" : "did not match") . " repo list: {$params[2]}");
+        }
+        if ($user_in_list || $in_repo) {
+            debug("exit_val == {$exit_val} for " . var_export($user_in_list, 1) . "/" . var_export($in_repo, 1) . ".");
+        }
     }
-    if ($exit_val) {   // if one dir fails, all fail
-        $last_path = $path_changed;
+    if ($exit_val) {   // if one path fails, all fail
+        $last_path = $changed_path;
         break;
     }
 }

 if ($exit_val) {
-    if (preg_match('/^pear/', $last_path)) {
+    if (strncmp($last_path, "pear/", strlen("pear/")) === 0) {
         $access_contact_email = 'pear-gr...@php.net';
-    } else if (preg_match('/^pecl/', $last_path)) {
+    } else if (strncmp($last_path, "pecl/", strlen("pecl/")) === 0) {
         $access_contact_email = 'pecl-gr...@php.net';
-    } else if (preg_match('/^phpdoc/', $last_path)) {
+    } else if (strncmp($last_path, "phpdoc/", strlen("phpdoc/")) === 0) {
         $access_contact_email = 'php...@lists.php.net';
     } else {
         $access_contact_email = 'gr...@php.net';
     }
-    fail("*******\nAccess denied: Insufficient karma for {$author} to {$last_path}.\nContact {$access_contact_email} for access.\n");
+    fail("*******\nAccess denied: Insufficient karma for {$commit_info['author']} to {$last_path}.\nContact {$access_contact_email} for access.\n");

 }

-if ($is_DEBUG) {
-    print "DEBUG: Access granted.\n";
-}
+debug("Access granted.");

-// -----------------------------------------------------------------------------------------------------------------------------
-// CHECK DISABLED BY POPULAR SCREAMING
-// Changing text files requires svn:keywords set
-/*
-$paths_added = array_filter($paths_changed, create_function('$v', 'return ($v[0] === "A");'));
-foreach ($paths_added as $path_added) {
-    preg_match('/^([^[:space:]]+)[[:space:]]+(.*)$/uX', $path_added, $matches);
-    $path_added = $matches[2];
-    if ($is_DEBUG) {
-        print "DEBUG: Checking properties for {$path_added}.\n";
-    }
-    if (substr($path_added, -1) === '/') { // is a directory?
-        continue;
-    }
-
-    $properties = array_map('trim', run_svnlook('proplist', array($path_added)));
-    if (in_array('svn:mime-type', $properties)) {
-        $mimetype = trim(implode("\n", run_svnlook('propget', array('svn:mime-type', $path_added))));
-    } else {
-        $mimetype = 'text/unknown';
-    }
-
-    if (strncmp($mimetype, "text/", 5) === 0) {
-        if ($is_DEBUG) {
-            print "DEBUG: File is non-binary. Checking for keywords.\n";
-        }
-        if (!in_array('svn:keywords', $properties)) {
-            fail("svn:keywords not set on textual file {$path_added}. Please see section 5 of http://darkrainfall.org/phpsvn-guide.html for instructions.\n");
-        }
-        if ($is_DEBUG) {
-            print "DEBUG: File has keywords. Moving on.\n";
-        }
-    } else if ($is_DEBUG) {
-        print "DEBUG: File is binary. Moving on.\n";
-    }
-}
-*/
-
 exit(0);

 ?>

Modified: SVNROOT/start-commit
===================================================================
--- SVNROOT/start-commit	2009-07-24 18:08:42 UTC (rev 284713)
+++ SVNROOT/start-commit	2009-07-24 18:54:54 UTC (rev 284714)
@@ -2,28 +2,10 @@
 <?php

 // -----------------------------------------------------------------------------------------------------------------------------
-// Settings
-error_reporting(E_ALL | E_STRICT);
-date_default_timezone_set('UTC');
-putenv("PATH=/usr/local/bin:/usr/bin:/bin");
+// Include
+require dirname(__FILE__) . '/hook-common.inc.php';

-function fail($error)
-{
-    fwrite(STDERR, $error);
-    exit(1);
-}
-
 // -----------------------------------------------------------------------------------------------------------------------------
-// Constants
-$version = substr('$Revision$', strlen('$Revision: '), -2);
-
-// -----------------------------------------------------------------------------------------------------------------------------
-// Version check
-if (version_compare('5.2.0', PHP_VERSION, '>')) {
-    fail("Requires at least PHP 5.2.\n");
-}
-
-// -----------------------------------------------------------------------------------------------------------------------------
 // Arguments
 if ($argc != 4) {
     fail("Pass exactly three arguments: REPOS, USER, and CAPABILITIES.\n");
@@ -33,21 +15,10 @@
 $CAPABILITIES = explode(':', $argv[3]);

 // -----------------------------------------------------------------------------------------------------------------------------
-// Does the user exist?
-$userfile = file(dirname(__FILE__) . '/users.db');
-$userexists = FALSE;
-foreach ($userfile as $userinfo) {
-    list($username, $realm, $md5) = explode(':', $userinfo, 3);
-    if ($username === $USER) {
-        $userexists = TRUE;
-        break;
-    }
-}
+// We don't actually need to do anything. Checking whether the given user exists
+// will be done by both Apache/svnserve *and* pre-commit. This hook is therefore
+// just a placeholder for now.

-if (!$userexists) {
-    fail("No such user.\n");
-}
-
 // -----------------------------------------------------------------------------------------------------------------------------
 // Proceed to pre-commit authorization
 exit(0);
-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to