cvs: SVNROOT / run-conversion.php svn.users users.db
| From: | Gwynne Raskind | Date: | Wed, 03 Dec 2008 20:21:12 +0000 |
| Subject: | cvs: SVNROOT / run-conversion.php svn.users users.db | ||
| Groups: | svn.migration | ||
| Request: | Send a blank email to svn-migration+get-146@lists.php.net to get a copy of this message | ||
gwynne Wed Dec 3 20:21:12 2008 UTC
Added files:
/SVNROOT users.db
Removed files:
/SVNROOT svn.users
Modified files:
/SVNROOT run-conversion.php
Log:
correct filename
http://cvs.php.net/viewvc.cgi/SVNROOT/run-conversion.php?r1=1.48&r2=1.49&diff_format=u Index: SVNROOT/run-conversion.php diff -u SVNROOT/run-conversion.php:1.48 SVNROOT/run-conversion.php:1.49 --- SVNROOT/run-conversion.php:1.48 Mon Nov 17 20:35:26 2008 +++ SVNROOT/run-conversion.php Wed Dec 3 20:21:11 2008 @@ -7,7 +7,7 @@ // ----------------------------------------------------------------------------------------------------------------------------- // Constants -$version = substr('$Revision: 1.48 $', strlen('$Revision: '), -2); +$version = substr('$Revision: 1.49 $', strlen('$Revision: '), -2); $passes = array( 'processcvs', // Process CVS modules @@ -76,6 +76,21 @@ return $output; } +function cp($source, $dest) +{ + run_command("cp " . escapeshellarg($source) . ' ' . escapeshellarg($dest)); +} + +function mv($source, $dest) +{ + run_command("cp " . escapeshellarg($source) . ' ' . escapeshellarg($dest)); +} + +function rm($path) +{ + run_command("rm -Rf " . escapeshellarg($path)); +} + // ----------------------------------------------------------------------------------------------------------------------------- // Commandline options $cmdline_parser = new Console_CommandLine(array( @@ -98,7 +113,7 @@ 'short_name' => '-s', 'long_name' => '--svnroot', 'default' => '/home/svn', - 'description' => 'Specify the directory for SVN repositories.', + 'description' => 'Specify the directory for the SVN repository and its administrative files.', 'action' => 'StoreString')); $cmdline_parser->addOption('pass', array( 'short_name' => '-p', @@ -135,11 +150,8 @@ } $options['cvsroot'] = realpath($options['cvsroot']); -if (!is_dir($options['svnroot']) || !is_readable($options['svnroot']) || !is_executable($options['svnroot'])) { - error("SVN root directory must exist, be a directory, and be readable and searchable.\n"); -} -if (is_running_pass('svncreate') && !is_writable($options['svnroot'])) { - error("SVN root directory must be writable if running the svncreate pass.\n"); +if (!is_dir($options['svnroot']) || !is_readable($options['svnroot']) || !is_executable($options['svnroot']) || !is_writable($options['svnroot'])) { + error("SVN root directory must exist, be a directory, and be readable, writable, and searchable.\n"); } $options['svnroot'] = realpath($options['svnroot']); @@ -200,26 +212,6 @@ EOEXTRA; } } else { - if ($moduleName == 'php-src') { - // We special-case php-src so we can move TSRM and ZendEngine2 into it easily. Ugh. - $command = 'exec cp -Rpv ' . escapeshellarg($GLOBALS['options']['cvsroot'] . DIR_SEP . 'php-src') . ' ' . - escapeshellarg($GLOBALS['temp_path'] . DIR_SEP . 'php-src') . - ' 2>&1 > ' . escapeshellarg($GLOBALS['temp_path'] . DIR_SEP . 'cp-output'); - run_command($command); - $command = 'exec cp -Rpv ' . escapeshellarg($GLOBALS['options']['cvsroot'] . DIR_SEP . 'ZendEngine2') . ' ' . - escapeshellarg($GLOBALS['temp_path'] . DIR_SEP . 'php-src') . - ' 2>&1 >> ' . escapeshellarg($GLOBALS['temp_path'] . DIR_SEP . 'cp-output'); - run_command($command); - $command = 'exec cp -Rpv ' . escapeshellarg($GLOBALS['options']['cvsroot'] . DIR_SEP . 'TSRM') . ' ' . - escapeshellarg($GLOBALS['temp_path'] . DIR_SEP . 'php-src') . - ' 2>&1 >> ' . escapeshellarg($GLOBALS['temp_path'] . DIR_SEP . 'cp-output'); - run_command($command); - $command = 'exec cp -Rpv ' . escapeshellarg($GLOBALS['options']['cvsroot'] . DIR_SEP . 'CVSROOT') . ' ' . - escapeshellarg($GLOBALS['temp_path']) . - ' 2>&1 >> ' . escapeshellarg($GLOBALS['temp_path'] . DIR_SEP . 'cp-output'); - run_command($command, TRUE); - $cvspath = $GLOBALS['temp_path'] . DIR_SEP . 'php-src'; - } $this->optionsFileContents .= <<<EOEXTRA run_options.add_project( '{$cvspath}', @@ -264,188 +256,6 @@ } } -// Repository: A collection of related modules -class Repository -{ - private $repositoryName = NULL; - private $cvsModuleList = array(); - private $svnRepositoryPath = NULL; - private $renamingRules = array(); - - public function __construct($repoName) - { - $this->repositoryName = $repoName; - $this->svnRepositoryPath = $GLOBALS['options']['svnroot'] . DIR_SEP . $this->repositoryName; - } - - public function __toString() - { - $result = "Repository named '{$this->repositoryName}'.\n"; - $result .= "\tCVS modules:\n\t\t"; - $modList = ''; - foreach ($this->cvsModuleList as $mod => $meta) { - $modList .= $mod . " " . ($meta ? "(meta) " : ""); - } - $result .= wordwrap($modList, 80, "\n\t\t") . "\n"; -// $result .= "\tRenaming rules:\n\t\t"; -// $result .= wordwrap(str_replace("\n", "\n\t\t", print_r($this->renamingRules, 1)), 80, "\n\t\t"); - return trim($result); - } - - public function addCVSModule($module, $isMeta = FALSE) - { - $this->cvsModuleList[$module] = $isMeta; - } - - public function addRenameRule($rule) - { - $this->renamingRules[] = $rule; - } - - public function createSVNRepository() - { - if (file_exists($this->svnRepositoryPath)) { - if (!is_readable($this->svnRepositoryPath) || !is_writable($this->svnRepositoryPath)) { - error("Directory '{$this->svnRepositoryPath}' is in the way.\n"); - } - // Repo already exists - return; - } - $command = "exec svnadmin create " . escapeshellarg($this->svnRepositoryPath) . " 2>&1"; - v(1, "Creating SVN repository for '{$this->repositoryName}' in {$this->svnRepositoryPath}...\n"); - run_command($command); - } - - public function importCVSModules() - { - if (!is_dir($this->svnRepositoryPath) || !is_writable($this->svnRepositoryPath)) { - error("SVN repository at {$this->svnRepositoryPath} doesn't exist or isn't writable.\n"); - } - - $output = run_command('svnlook youngest ' . escapeshellarg($this->svnRepositoryPath)); - if (trim(end($output)) != 0) { - return; // Repo isn't empty - } - - v(1, "Running cvs2svn for '{$this->repositoryName}'...\n"); - $converter = new CVS2SVNConverter($this->repositoryName); - $converter->setOutputPath($this->svnRepositoryPath); - foreach ($this->cvsModuleList as $cvs_module => $isMeta) { - $converter->addCVSModule($cvs_module, $isMeta); - } - $converter->run(); - } - - private function executeSVNCommand($cmd) - { - $realCommand = "exec svn {$cmd} 2>&1"; - return run_command($realCommand); - } - - private function mkdirPath($path, $message) - { - $this->executeSVNCommand('mkdir -m ' . escapeshellarg($message) . - ' file:///' . escapeshellarg($this->svnRepositoryPath) . '/' . escapeshellarg($path)); - } - - private function deletePath($path, $message) - { - $this->executeSVNCommand('rm -m ' . escapeshellarg($message) . - ' file:///' . escapeshellarg($this->svnRepositoryPath) . '/' . escapeshellarg($path)); - } - - private function movePath($srcPath, $dstPath, $message) - { - $this->executeSVNCommand('mv -m ' . escapeshellarg($message) . - ' file:///' . escapeshellarg($this->svnRepositoryPath) . '/' . escapeshellarg($srcPath) . - ' file:///' . escapeshellarg($this->svnRepositoryPath) . '/' . escapeshellarg($dstPath)); - } - - private function renameMatchingPaths($base, $match, $replacement, $message) - { - $basePath = 'file:///' . escapeshellarg($this->svnRepositoryPath) . '/' . escapeshellarg($base); - $completeList = $this->executeSVNCommand('ls ' . $basePath); - foreach ($completeList as $value) { - if (preg_match($match, $value) === 1) { - $dstPath = preg_replace($match, $replacement, $value); - $this->executeSVNCommand('mv -m ' . escapeshellarg($message) . - ' ' . $basePath . '/' . escapeshellarg($value) . ' ' . $basePath . '/' . escapeshellarg($dstPath)); - } - } - } - - public function fixupRepository() - { - v(1, "Executing fixup commands for repository '{$this->repositoryName}'...\n"); - $message = "[SVN CONVERSION] Reorganization in repository {$this->repositoryName}."; - foreach ($this->renamingRules as $rule) { - switch ($rule['mode']) { - case 'mkdir': - $this->mkdirPath($rule['srcPath'], $message); - break; - case 'delete': - $this->deletePath($rule['srcPath'], $message); - break; - case 'move': - $this->movePath($rule['srcPath'], $rule['dstPath'], $message); - break; - case 'rename': - $this->renameMatchingPaths($rule['basePath'], $rule['match'], $rule['replacement'], $message); - break; - } - } - v(1, "Done fixing up.\n"); - } - - public function installAdminFiles() - { - v(1, "Installing administrative files for repository '{$this->repositoryName}'...\n"); - v(2, "Installing e-mail post-commit hook...\n"); - symlink($GLOBALS['options']['svnroot'] . DIR_SEP . 'SVNROOT' . DIR_SEP . 'commit-email.php', - $this->svnRepositoryPath . DIR_SEP . 'hooks' . DIR_SEP . 'post-commit'); - $authzDB = $this->svnRepositoryPath . DIR_SEP . 'conf' . DIR_SEP . 'authz.db'; - if (!file_exists($authzDB)) { - v(2, "Installing authz database...\n"); - file_put_contents($authzDB, <<<EOAUTHZ -[groups] - -[aliases] - -[/] -svnread = r - -EOAUTHZ - ); - } else { - v(2, "Not overwriting existing authz database.\n"); - } - v(2, "Installing Apache 2.2 config file...\n"); - $usersDB = $GLOBALS['options']['svnroot'] . DIR_SEP . 'svn.users'; - file_put_contents($this->svnRepositoryPath . DIR_SEP . 'conf' . DIR_SEP . 'httpd.conf', <<<EOHTTPD -# This file is intended to be Included from inside an Apache 2.2 VirtualHost section. - <Location "/{$this->repositoryName}"> - DAV svn - SVNPath "{$this->svnRepositoryPath}" - AuthzSVNAccessFile "{$authzDB}" - Satisfy All - Require valid-user - AuthType Digest - AuthName "PHP Subversion Repositories" - AuthUserFile "{$usersDB}" - AuthDigestDomain "/{$this->repositoryName}" - </Location> - -EOHTTPD - ); - v(1, "Done installing administrative files.\n"); - } - - public function getHTTPDConfPath() - { - return $this->svnRepositoryPath . DIR_SEP . 'conf' . DIR_SEP . 'httpd.conf'; - } -} - // ----------------------------------------------------------------------------------------------------------------------------- // Main v(1, "PHP Group CVS->SVN respository conversion.\n"); @@ -470,88 +280,66 @@ // processcvs pass function pass_processcvs() { - global $repoList, $options; + global $converter, $options; v(1, "Running processcvs pass...\n"); - $repoList = array(); - $repoList['doc'] = new Repository('php-doc'); - $repoList['gtk'] = new Repository('php-gtk'); - $repoList['src'] = new Repository('php-src'); - $repoList['web'] = new Repository('php-web'); - $repoList['phd'] = new Repository('phd'); - $repoList['pear1'] = new Repository('pear'); - $repoList['gd'] = new Repository('gd'); - $repoList['systems'] = new Repository('systems'); - - $cvs_modules = scandir_no_meta($options['cvsroot']); + $converter = new CVS2SVNConverter; + + $cvsPath = "{$GLOBALS['temp_path']}/cvsrepo"; + cp($GLOBALS['options']['cvsroot'], $cvsPath); + + mv("{$cvsPath}/phpdoc", "{$cvsPath}/doc-base"); + mv("{$cvsPath}/doc-base/en", "{$cvsPath}/phpdoc-en"); + mv("{$cvsPath}/pear", "{$cvsPath}/modules"); + mv("{$cvsPath}/TSRM", "{$cvsPath}/php-src/TSRM"); + mv("{$cvsPath}/ZendEngine2", "{$cvsPath}/php-src/ZendEngine2"); + mv("{$cvsPath}/pdo-specs", "{$cvsPath}/pecl/pdo/specs"); + + mkdir("{$cvsPath}/gtk"); + mkdir("{$cvsPath}/php"); + mkdir("{$cvsPath}/pear"); + mkdir("{$cvsPath)/web"); + mkdir("{$cvsPath}/phpdoc"); + + $cvs_modules = scandir_no_meta($cvsPath); foreach ($cvs_modules as $cvs_module) { if ($cvs_module == 'CVSROOT') { continue; } if (!is_dir($options['cvsroot'] . DIR_SEP . $cvs_module) || - count(scandir($options['cvsroot'] . DIR_SEP . $cvs_module)) == 2) { // empty - continue; - } - if (in_array($cvs_module, array('smarty', 'smarty-web', 'php4.fubar', 'php4.unused', 'peardoc.backup', 'php3', 'phpfi', 'livedocs', - 'Zend', 'functable', 'dialin', 'docstuff', 'jpgraph', 'phpoc_de', 'phpdoc-fa_IR', 'lxr', 'portal', 'pres', 'embed', 'imapd', - 'ZendEngine2', 'TSRM'))) { - continue; - } else if (in_array($cvs_module, array('systems', 'SVNROOT'))) { - $repoList['systems']->addCVSModule($cvs_module); + count(scandir($options['cvsroot'] . DIR_SEP . $cvs_module)) == 2 || + in_array($cvs_module, array('smarty', 'smarty-web', 'php4.fubar', 'php4.unused', 'peardoc.backup', 'php3', 'phpfi', 'livedocs', + 'Zend', 'functable', 'dialin', 'docstuff', 'jpgraph', 'phpoc_de', 'phpdoc-fa_IR', 'lxr', 'portal', 'pres', 'embed', 'imapd'))) { + rm("{$cvsPath}/{$cvs_module}"); } else if (in_array($cvs_module, array('php-gtk', 'php-gtk-doc', 'old-php-gtk-modules'))) { - $repoList['gtk']->addCVSModule($cvs_module); + mv("{$cvsPath}/{$cvs_module}", "{$cvsPath}/gtk/{$cvs_module}"); + $converter->addCVSModule("gtk/{$cvs_module}"); } else if (in_array($cvs_module, array('ZendAPI', 'php-src', 'pecl', 'pecl4win', 'php-objc', 'php-lang', 'win-installer', 'bindlib_w32', 'zlib', 'pdo-specs', 'php-internals-win', 'fastcgi-isapi'))) { - $repoList['src']->addCVSModule($cvs_module, $cvs_module == 'pecl'); - } else if ($cvs_module == 'phd') { - $repoList['phd']->addCVSModule($cvs_module); - } else if ($cvs_module == 'gd') { - $repoList['gd']->addCVSModule($cvs_module); - } else if (in_array($cvs_module, array('pear', 'pearbot', 'pear-core', 'peardoc'))) { - $repoList['pear1']->addCVSModule($cvs_module, $cvs_module == 'pear'); + mv("{$cvsPath}/{$cvs_module}", "{$cvsPath}/php/{$cvs_module}"); + $converter->addCVSModule("php/{$cvs_module}", $cvs_module == 'pecl'); + } else if (in_array($cvs_module, array('modules', 'pearbot', 'pear-core', 'peardoc'))) { + mv("{$cvsPath}/{$cvs_module}", "{$cvsPath}/pear/{$cvs_module}"); + $converter->addCVSModule("pear/{$cvs_module}", $cvs_module == 'modules'); } else if (substr($cvs_module, -3) == "web" || in_array($cvs_module, array('pres2', 'presentations', 'bugtracker'))) { - $repoList['web']->addCVSModule($cvs_module); - } else if (strncmp($cvs_module, "phpdoc", 6) == 0) { - $repoList['doc']->addCVSModule($cvs_module); + if (substr($cvs_module, -4) == '-web') { + $dest_cvs_module = substr($cvs_module, 0, -4); + } else if (substr($cvs_module, -3) == 'web') { + $dest_cvs_module = substr($cvs_module, 0, -3); + } + mv("{$cvsPath}/{$cvs_module}", "{$cvsPath}/web/{$dest_cvs_module}"); + $converter->addCVSModule("web/{$dest_cvs_module}"); + } else if (strncmp($cvs_module, "phpdoc", 6) == 0 || $cvs_module == 'doc-base') { + if (substr($cvs_module, 7) == 'phpdoc-') { + $dest_cvs_module = substr($cvs_module, 7); + } + mv("{$cvsPath}/{$cvs_module}", "{$cvsPath}/phpdoc/{$dest_cvs_module}"); + $converter->addCVSModule("phpdoc/{$dest_cvs_module}"); } } - // Fixup rules for php-doc - $repoList['doc']->addRenameRule(array('mode' => 'mkdir', 'srcPath' => 'en')); - $repoList['doc']->addRenameRule(array('mode' => 'mkdir', 'srcPath' => 'en/tags')); - $repoList['doc']->addRenameRule(array('mode' => 'mkdir', 'srcPath' => 'en/branches')); - $repoList['doc']->addRenameRule(array('mode' => 'move', 'srcPath' => 'phpdoc/trunk/en', 'dstPath' => 'en/trunk')); - $repoList['doc']->addRenameRule(array('mode' => 'move', 'srcPath' => 'phpdoc', 'dstPath' => 'doc-base')); - $repoList['doc']->addRenameRule(array('mode' => 'rename', 'basePath' => '', 'match' => '/^phpdoc-(.*)$/', 'replacement' => "\\1")); - // Fixup rules for php-src - $repoList['src']->addRenameRule(array('mode' => 'move', 'srcPath' => 'pdo-specs/trunk', 'dstPath' => 'pecl/pdo/trunk/specs')); - $repoList['src']->addRenameRule(array('mode' => 'delete', 'srcPath' => 'pdo-specs')); - // Fixup rules for pear1 - $repoList['pear1']->addRenameRule(array('mode' => 'delete', 'srcPath' => 'pear/Selenium/branches/shin/.svn')); - $repoList['pear1']->addRenameRule(array('mode' => 'delete', 'srcPath' => 'pear/Selenium/branches/shin/tests/.svn')); - $repoList['pear1']->addRenameRule(array('mode' => 'delete', 'srcPath' => 'pear/Selenium/branches/shin/tests/events/.svn')); - $repoList['pear1']->addRenameRule(array('mode' => 'delete', 'srcPath' => 'pear/Selenium/branches/shin/tests/html/.svn')); - $repoList['pear1']->addRenameRule(array('mode' => 'delete', 'srcPath' => 'pear/Selenium/branches/shin/docs/.svn')); - $repoList['pear1']->addRenameRule(array('mode' => 'delete', 'srcPath' => 'pear/Selenium/branches/shin/examples/.svn')); - $repoList['pear1']->addRenameRule(array('mode' => 'delete', 'srcPath' => 'pear/Selenium/tags/start/.svn')); - $repoList['pear1']->addRenameRule(array('mode' => 'delete', 'srcPath' => 'pear/Selenium/tags/start/tests/.svn')); - $repoList['pear1']->addRenameRule(array('mode' => 'delete', 'srcPath' => 'pear/Selenium/tags/start/tests/events/.svn')); - $repoList['pear1']->addRenameRule(array('mode' => 'delete', 'srcPath' => 'pear/Selenium/tags/start/tests/html/.svn')); - $repoList['pear1']->addRenameRule(array('mode' => 'delete', 'srcPath' => 'pear/Selenium/tags/start/docs/.svn')); - $repoList['pear1']->addRenameRule(array('mode' => 'delete', 'srcPath' => 'pear/Selenium/tags/start/examples/.svn')); - $repoList['pear1']->addRenameRule(array('mode' => 'delete', 'srcPath' => 'pear/Testing_Selenium/branches/shin/.svn')); - $repoList['pear1']->addRenameRule(array('mode' => 'delete', 'srcPath' => 'pear/Testing_Selenium/branches/shin/tests/.svn')); - $repoList['pear1']->addRenameRule(array('mode' => 'delete', 'srcPath' => 'pear/Testing_Selenium/branches/shin/tests/events/.svn')); - $repoList['pear1']->addRenameRule(array('mode' => 'delete', 'srcPath' => 'pear/Testing_Selenium/branches/shin/tests/html/.svn')); - $repoList['pear1']->addRenameRule(array('mode' => 'delete', 'srcPath' => 'pear/Testing_Selenium/branches/shin/docs/.svn')); - $repoList['pear1']->addRenameRule(array('mode' => 'delete', 'srcPath' => 'pear/Testing_Selenium/branches/shin/examples/.svn')); - $repoList['pear1']->addRenameRule(array('mode' => 'delete', 'srcPath' => 'pear/Testing_Selenium/tags/start/.svn')); - $repoList['pear1']->addRenameRule(array('mode' => 'delete', 'srcPath' => 'pear/Testing_Selenium/tags/start/tests/.svn')); - $repoList['pear1']->addRenameRule(array('mode' => 'delete', 'srcPath' => 'pear/Testing_Selenium/tags/start/tests/events/.svn')); - $repoList['pear1']->addRenameRule(array('mode' => 'delete', 'srcPath' => 'pear/Testing_Selenium/tags/start/tests/html/.svn')); - $repoList['pear1']->addRenameRule(array('mode' => 'delete', 'srcPath' => 'pear/Testing_Selenium/tags/start/docs/.svn')); - $repoList['pear1']->addRenameRule(array('mode' => 'delete', 'srcPath' => 'pear/Testing_Selenium/tags/start/examples/.svn')); + run_command('find ' . escapeshellarg("{$cvsPath}/pear/modules") . " -name '.svn' -type d -print0 | xargs -0 rm -Rf"); v(2, "Prepared " . count($repoList) . " SVN repositories.\n"); foreach ($repoList as $repo) { @@ -563,38 +351,53 @@ // svncreate pass function pass_svncreate() { - foreach ($GLOBALS['repoList'] as $repo) { - $repo->createSVNRepository(); - } + $svnPath = "{$GLOBALS['options']['svnroot']}/repository"; + if (file_exists($svnPath)) { + if (!is_readable($svnPath) || !is_writable($svnPath)) { + error("Directory '{$svnPath}' is in the way.\n"); + } + // Repo already exists + v(2, "SVN repository already exists. Not creating.\n"); + return; + } + v(1, "Creating SVN repository in {$svnPath}...\n"); + $command = "exec svnadmin create " . escapeshellarg($svnPath) . " 2>&1"; + run_command($command); } // ----------------------------------------------------------------------------------------------------------------------------- // cvs2svn pass function pass_cvs2svn() { - foreach ($GLOBALS['repoList'] as $repo) { - $repo->importCVSModules(); + global $converter; + + $svnPath = "{$GLOBALS['options']['svnroot']}/repository"; + if (!is_dir($svnPath) || !is_writable($svnPath)) { + error("SVN repository at {$svnPath} doesn't exist or isn't writable.\n"); } -} - -// ----------------------------------------------------------------------------------------------------------------------------- -// cleanup pass -function pass_cleanup() -{ - foreach ($GLOBALS['repoList'] as $repo) { - $repo->fixupRepository(); + + $output = run_command('svnlook youngest ' . escapeshellarg($svnPath)); + if (trim(end($output)) != 0) { + v(2 "SVN repository isn't empty. Not converting.\n"); + return; // Repo isn't empty } + + v(1, "Running cvs2svn for '{$this->repositoryName}'...\n"); + $converter->setOutputPath($svnPath); + $converter->run(); } // ----------------------------------------------------------------------------------------------------------------------------- // link pass function pass_link() { - $rawTagList = run_command('exec svn ls file:///' . escapeshellarg($GLOBALS['options']['svnroot'] . '/php-src/php-src/tags')); - $rawBranchList = run_command('exec svn ls file:///' . escapeshellarg($GLOBALS['options']['svnroot'] . '/php-src/php-src/branches')); + $svnPath = "{$GLOBALS['options']['svnroot']}/repository/php/php-src"; + + $rawTagList = run_command('exec svn ls file:///' . escapeshellarg("{$svnPath}/tags")); + $rawBranchList = run_command('exec svn ls file:///' . escapeshellarg("{$svnPath}/branches")); if (!file_exists($GLOBALS['temp_path'] . DIR_SEP . 'php-src-co')) { - run_command('exec svn checkout file:///' . escapeshellarg($GLOBALS['options']['svnroot'] . '/php-src/php-src') . ' ' . + run_command('exec svn checkout file:///' . escapeshellarg($svnPath) . ' ' . escapeshellarg($GLOBALS['temp_path'] . DIR_SEP . 'php-src-co') . ' 2>&1 > ' . escapeshellarg($GLOBALS['temp_path'] . DIR_SEP . 'co-output')); } @@ -605,14 +408,14 @@ $branchList = array(); foreach ($rawTagList as $tag) { $realTag = substr($tag, 0, -1); - $xml = run_command('exec svn info --xml file:///' . escapeshellarg($GLOBALS['options']['svnroot'] . '/php-src/php-src/tags/' . $realTag)); + $xml = run_command('exec svn info --xml file:///' . escapeshellarg("{$svnPath}/tags/{$realTag}")); $xml = implode("\n", $xml); $tagList[$realTag] = strtotime(substr($xml, strpos($xml, '<date>') + 6, strlen('0000-00-00T00:00:00.000000Z'))); run_command('exec svn propdel svn:externals ' . escapeshellarg('tags' . DIR_SEP . $realTag . DIR_SEP . 'ext') . ' 2>&1'); } foreach ($rawBranchList as $branch) { $realBranch = substr($branch, 0, -1); - $xml = run_command('exec svn info --xml file:///' . escapeshellarg($GLOBALS['options']['svnroot'] . '/php-src/php-src/branches/' . $realBranch)); + $xml = run_command('exec svn info --xml file:///' . escapeshellarg("{$svnPath}/branches/{$realBranch}")); $xml = implode("\n", $xml); $branchList[$realBranch] = strtotime(substr($xml, strpos($xml, '<date>') + 6, strlen('0000-00-00T00:00:00.000000Z'))); run_command('exec svn propdel svn:externals ' . escapeshellarg('branches' . DIR_SEP . $realBranch . DIR_SEP . 'ext') . ' 2>&1'); @@ -655,22 +458,6 @@ // install pass function pass_install() { - foreach ($GLOBALS['repoList'] as $repo) { - $repo->installAdminFiles(); - } - v(1, "Installing global administrative files...\n"); - $usersDB = $GLOBALS['options']['svnroot'] . DIR_SEP . 'svn.users'; - if (!file_exists($usersDB)) { - v(2, "Installing global user database...\n"); - $svnreadpass = md5('svnread:PHP Subversion Repositories:svnread'); - file_put_contents($usersDB, <<<EOUSERS -svnread:PHP Subversion Repositories:{$svnreadpass} - -EOUSERS - ); - } else { - v(2, "Not overwriting existing global user database.\n"); - } v(2, "Installing global Apache 2.2 configuration file....\n"); $svnRoot = $GLOBALS['options']['svnroot']; $logsDir = $svnRoot . DIR_SEP . 'logs' . DIR_SEP; @@ -678,22 +465,29 @@ $confContents = <<<EOHTTPD <VirtualHost *:80> ServerName svn.php.net - DocumentRoot "{$svnRoot}" - <Directory "/"> - Order allow,deny - Allow from all - </Directory> - LogLevel debug CustomLog "|/local/bin/rotatelogs {$logsDir}/svn-svn_log.%Y%m%d 86400" "%t %u %{SVN-ACTION}e" env=SVN-ACTION CustomLog "|/local/bin/rotatelogs {$logsDir}/svn-access_log.%Y%m%d 86400" combined ErrorLog "|/local/bin/rotatelogs {$logsDir}/svn-error_log.%Y%m%d 86400" + <Location "/"> + DAV svn + SVNPath "{$svnRoot}/repository" + AuthzSVNAccessFile "{$svnRoot]/SVNROOT/authz.db" + Satisfy All + Require valid-user + AuthType Digest + AuthName "PHP Subversion Repositories" + AuthUserFile "{$svnRoot}/SVNROOT/users.db" + AuthDigestDomain "/" + </Location> +</VirtualHost> EOHTTPD; - foreach ($GLOBALS['repoList'] as $repo) { - $confContents .= " Include " . $repo->getHTTPDConfPath() . "\n"; - } - $confContents .= "</VirtualHost>\n"; file_put_contents($apacheConf, $confContents); + + v(2, "Installing e-mail post-commit hook...\n"); + unlink("{$svnRoot}/repository/hooks/post-commit"); + symlink("{$svnRoot}/SVNROOT/commit-email.php", "{$svnRoot}/repository/hooks/post-commit"); + v(1, "Done installing global administrative files.\n"); } http://cvs.php.net/viewvc.cgi/SVNROOT/users.db?view=markup&rev=1.1 Index: SVNROOT/users.db +++ SVNROOT/users.db svnread:PHP Subversion Repositories:cb3d4eb7c0848cbbc8d68acabb0e4c3b
http://cvs.php.net/viewvc.cgi/SVNROOT/run-conversion.php?r1=1.48&r2=1.49&diff_format=u Index: SVNROOT/run-conversion.php diff -u SVNROOT/run-conversion.php:1.48 SVNROOT/run-conversion.php:1.49 --- SVNROOT/run-conversion.php:1.48 Mon Nov 17 20:35:26 2008 +++ SVNROOT/run-conversion.php Wed Dec 3 20:21:11 2008 @@ -7,7 +7,7 @@ // ----------------------------------------------------------------------------------------------------------------------------- // Constants -$version = substr('$Revision: 1.48 $', strlen('$Revision: '), -2); +$version = substr('$Revision: 1.49 $', strlen('$Revision: '), -2); $passes = array( 'processcvs', // Process CVS modules @@ -76,6 +76,21 @@ return $output; } +function cp($source, $dest) +{ + run_command("cp " . escapeshellarg($source) . ' ' . escapeshellarg($dest)); +} + +function mv($source, $dest) +{ + run_command("cp " . escapeshellarg($source) . ' ' . escapeshellarg($dest)); +} + +function rm($path) +{ + run_command("rm -Rf " . escapeshellarg($path)); +} + // ----------------------------------------------------------------------------------------------------------------------------- // Commandline options $cmdline_parser = new Console_CommandLine(array( @@ -98,7 +113,7 @@ 'short_name' => '-s', 'long_name' => '--svnroot', 'default' => '/home/svn', - 'description' => 'Specify the directory for SVN repositories.', + 'description' => 'Specify the directory for the SVN repository and its administrative files.', 'action' => 'StoreString')); $cmdline_parser->addOption('pass', array( 'short_name' => '-p', @@ -135,11 +150,8 @@ } $options['cvsroot'] = realpath($options['cvsroot']); -if (!is_dir($options['svnroot']) || !is_readable($options['svnroot']) || !is_executable($options['svnroot'])) { - error("SVN root directory must exist, be a directory, and be readable and searchable.\n"); -} -if (is_running_pass('svncreate') && !is_writable($options['svnroot'])) { - error("SVN root directory must be writable if running the svncreate pass.\n"); +if (!is_dir($options['svnroot']) || !is_readable($options['svnroot']) || !is_executable($options['svnroot']) || !is_writable($options['svnroot'])) { + error("SVN root directory must exist, be a directory, and be readable, writable, and searchable.\n"); } $options['svnroot'] = realpath($options['svnroot']); @@ -200,26 +212,6 @@ EOEXTRA; } } else { - if ($moduleName == 'php-src') { - // We special-case php-src so we can move TSRM and ZendEngine2 into it easily. Ugh. - $command = 'exec cp -Rpv ' . escapeshellarg($GLOBALS['options']['cvsroot'] . DIR_SEP . 'php-src') . ' ' . - escapeshellarg($GLOBALS['temp_path'] . DIR_SEP . 'php-src') . - ' 2>&1 > ' . escapeshellarg($GLOBALS['temp_path'] . DIR_SEP . 'cp-output'); - run_command($command); - $command = 'exec cp -Rpv ' . escapeshellarg($GLOBALS['options']['cvsroot'] . DIR_SEP . 'ZendEngine2') . ' ' . - escapeshellarg($GLOBALS['temp_path'] . DIR_SEP . 'php-src') . - ' 2>&1 >> ' . escapeshellarg($GLOBALS['temp_path'] . DIR_SEP . 'cp-output'); - run_command($command); - $command = 'exec cp -Rpv ' . escapeshellarg($GLOBALS['options']['cvsroot'] . DIR_SEP . 'TSRM') . ' ' . - escapeshellarg($GLOBALS['temp_path'] . DIR_SEP . 'php-src') . - ' 2>&1 >> ' . escapeshellarg($GLOBALS['temp_path'] . DIR_SEP . 'cp-output'); - run_command($command); - $command = 'exec cp -Rpv ' . escapeshellarg($GLOBALS['options']['cvsroot'] . DIR_SEP . 'CVSROOT') . ' ' . - escapeshellarg($GLOBALS['temp_path']) . - ' 2>&1 >> ' . escapeshellarg($GLOBALS['temp_path'] . DIR_SEP . 'cp-output'); - run_command($command, TRUE); - $cvspath = $GLOBALS['temp_path'] . DIR_SEP . 'php-src'; - } $this->optionsFileContents .= <<<EOEXTRA run_options.add_project( '{$cvspath}', @@ -264,188 +256,6 @@ } } -// Repository: A collection of related modules -class Repository -{ - private $repositoryName = NULL; - private $cvsModuleList = array(); - private $svnRepositoryPath = NULL; - private $renamingRules = array(); - - public function __construct($repoName) - { - $this->repositoryName = $repoName; - $this->svnRepositoryPath = $GLOBALS['options']['svnroot'] . DIR_SEP . $this->repositoryName; - } - - public function __toString() - { - $result = "Repository named '{$this->repositoryName}'.\n"; - $result .= "\tCVS modules:\n\t\t"; - $modList = ''; - foreach ($this->cvsModuleList as $mod => $meta) { - $modList .= $mod . " " . ($meta ? "(meta) " : ""); - } - $result .= wordwrap($modList, 80, "\n\t\t") . "\n"; -// $result .= "\tRenaming rules:\n\t\t"; -// $result .= wordwrap(str_replace("\n", "\n\t\t", print_r($this->renamingRules, 1)), 80, "\n\t\t"); - return trim($result); - } - - public function addCVSModule($module, $isMeta = FALSE) - { - $this->cvsModuleList[$module] = $isMeta; - } - - public function addRenameRule($rule) - { - $this->renamingRules[] = $rule; - } - - public function createSVNRepository() - { - if (file_exists($this->svnRepositoryPath)) { - if (!is_readable($this->svnRepositoryPath) || !is_writable($this->svnRepositoryPath)) { - error("Directory '{$this->svnRepositoryPath}' is in the way.\n"); - } - // Repo already exists - return; - } - $command = "exec svnadmin create " . escapeshellarg($this->svnRepositoryPath) . " 2>&1"; - v(1, "Creating SVN repository for '{$this->repositoryName}' in {$this->svnRepositoryPath}...\n"); - run_command($command); - } - - public function importCVSModules() - { - if (!is_dir($this->svnRepositoryPath) || !is_writable($this->svnRepositoryPath)) { - error("SVN repository at {$this->svnRepositoryPath} doesn't exist or isn't writable.\n"); - } - - $output = run_command('svnlook youngest ' . escapeshellarg($this->svnRepositoryPath)); - if (trim(end($output)) != 0) { - return; // Repo isn't empty - } - - v(1, "Running cvs2svn for '{$this->repositoryName}'...\n"); - $converter = new CVS2SVNConverter($this->repositoryName); - $converter->setOutputPath($this->svnRepositoryPath); - foreach ($this->cvsModuleList as $cvs_module => $isMeta) { - $converter->addCVSModule($cvs_module, $isMeta); - } - $converter->run(); - } - - private function executeSVNCommand($cmd) - { - $realCommand = "exec svn {$cmd} 2>&1"; - return run_command($realCommand); - } - - private function mkdirPath($path, $message) - { - $this->executeSVNCommand('mkdir -m ' . escapeshellarg($message) . - ' file:///' . escapeshellarg($this->svnRepositoryPath) . '/' . escapeshellarg($path)); - } - - private function deletePath($path, $message) - { - $this->executeSVNCommand('rm -m ' . escapeshellarg($message) . - ' file:///' . escapeshellarg($this->svnRepositoryPath) . '/' . escapeshellarg($path)); - } - - private function movePath($srcPath, $dstPath, $message) - { - $this->executeSVNCommand('mv -m ' . escapeshellarg($message) . - ' file:///' . escapeshellarg($this->svnRepositoryPath) . '/' . escapeshellarg($srcPath) . - ' file:///' . escapeshellarg($this->svnRepositoryPath) . '/' . escapeshellarg($dstPath)); - } - - private function renameMatchingPaths($base, $match, $replacement, $message) - { - $basePath = 'file:///' . escapeshellarg($this->svnRepositoryPath) . '/' . escapeshellarg($base); - $completeList = $this->executeSVNCommand('ls ' . $basePath); - foreach ($completeList as $value) { - if (preg_match($match, $value) === 1) { - $dstPath = preg_replace($match, $replacement, $value); - $this->executeSVNCommand('mv -m ' . escapeshellarg($message) . - ' ' . $basePath . '/' . escapeshellarg($value) . ' ' . $basePath . '/' . escapeshellarg($dstPath)); - } - } - } - - public function fixupRepository() - { - v(1, "Executing fixup commands for repository '{$this->repositoryName}'...\n"); - $message = "[SVN CONVERSION] Reorganization in repository {$this->repositoryName}."; - foreach ($this->renamingRules as $rule) { - switch ($rule['mode']) { - case 'mkdir': - $this->mkdirPath($rule['srcPath'], $message); - break; - case 'delete': - $this->deletePath($rule['srcPath'], $message); - break; - case 'move': - $this->movePath($rule['srcPath'], $rule['dstPath'], $message); - break; - case 'rename': - $this->renameMatchingPaths($rule['basePath'], $rule['match'], $rule['replacement'], $message); - break; - } - } - v(1, "Done fixing up.\n"); - } - - public function installAdminFiles() - { - v(1, "Installing administrative files for repository '{$this->repositoryName}'...\n"); - v(2, "Installing e-mail post-commit hook...\n"); - symlink($GLOBALS['options']['svnroot'] . DIR_SEP . 'SVNROOT' . DIR_SEP . 'commit-email.php', - $this->svnRepositoryPath . DIR_SEP . 'hooks' . DIR_SEP . 'post-commit'); - $authzDB = $this->svnRepositoryPath . DIR_SEP . 'conf' . DIR_SEP . 'authz.db'; - if (!file_exists($authzDB)) { - v(2, "Installing authz database...\n"); - file_put_contents($authzDB, <<<EOAUTHZ -[groups] - -[aliases] - -[/] -svnread = r - -EOAUTHZ - ); - } else { - v(2, "Not overwriting existing authz database.\n"); - } - v(2, "Installing Apache 2.2 config file...\n"); - $usersDB = $GLOBALS['options']['svnroot'] . DIR_SEP . 'svn.users'; - file_put_contents($this->svnRepositoryPath . DIR_SEP . 'conf' . DIR_SEP . 'httpd.conf', <<<EOHTTPD -# This file is intended to be Included from inside an Apache 2.2 VirtualHost section. - <Location "/{$this->repositoryName}"> - DAV svn - SVNPath "{$this->svnRepositoryPath}" - AuthzSVNAccessFile "{$authzDB}" - Satisfy All - Require valid-user - AuthType Digest - AuthName "PHP Subversion Repositories" - AuthUserFile "{$usersDB}" - AuthDigestDomain "/{$this->repositoryName}" - </Location> - -EOHTTPD - ); - v(1, "Done installing administrative files.\n"); - } - - public function getHTTPDConfPath() - { - return $this->svnRepositoryPath . DIR_SEP . 'conf' . DIR_SEP . 'httpd.conf'; - } -} - // ----------------------------------------------------------------------------------------------------------------------------- // Main v(1, "PHP Group CVS->SVN respository conversion.\n"); @@ -470,88 +280,66 @@ // processcvs pass function pass_processcvs() { - global $repoList, $options; + global $converter, $options; v(1, "Running processcvs pass...\n"); - $repoList = array(); - $repoList['doc'] = new Repository('php-doc'); - $repoList['gtk'] = new Repository('php-gtk'); - $repoList['src'] = new Repository('php-src'); - $repoList['web'] = new Repository('php-web'); - $repoList['phd'] = new Repository('phd'); - $repoList['pear1'] = new Repository('pear'); - $repoList['gd'] = new Repository('gd'); - $repoList['systems'] = new Repository('systems'); - - $cvs_modules = scandir_no_meta($options['cvsroot']); + $converter = new CVS2SVNConverter; + + $cvsPath = "{$GLOBALS['temp_path']}/cvsrepo"; + cp($GLOBALS['options']['cvsroot'], $cvsPath); + + mv("{$cvsPath}/phpdoc", "{$cvsPath}/doc-base"); + mv("{$cvsPath}/doc-base/en", "{$cvsPath}/phpdoc-en"); + mv("{$cvsPath}/pear", "{$cvsPath}/modules"); + mv("{$cvsPath}/TSRM", "{$cvsPath}/php-src/TSRM"); + mv("{$cvsPath}/ZendEngine2", "{$cvsPath}/php-src/ZendEngine2"); + mv("{$cvsPath}/pdo-specs", "{$cvsPath}/pecl/pdo/specs"); + + mkdir("{$cvsPath}/gtk"); + mkdir("{$cvsPath}/php"); + mkdir("{$cvsPath}/pear"); + mkdir("{$cvsPath)/web"); + mkdir("{$cvsPath}/phpdoc"); + + $cvs_modules = scandir_no_meta($cvsPath); foreach ($cvs_modules as $cvs_module) { if ($cvs_module == 'CVSROOT') { continue; } if (!is_dir($options['cvsroot'] . DIR_SEP . $cvs_module) || - count(scandir($options['cvsroot'] . DIR_SEP . $cvs_module)) == 2) { // empty - continue; - } - if (in_array($cvs_module, array('smarty', 'smarty-web', 'php4.fubar', 'php4.unused', 'peardoc.backup', 'php3', 'phpfi', 'livedocs', - 'Zend', 'functable', 'dialin', 'docstuff', 'jpgraph', 'phpoc_de', 'phpdoc-fa_IR', 'lxr', 'portal', 'pres', 'embed', 'imapd', - 'ZendEngine2', 'TSRM'))) { - continue; - } else if (in_array($cvs_module, array('systems', 'SVNROOT'))) { - $repoList['systems']->addCVSModule($cvs_module); + count(scandir($options['cvsroot'] . DIR_SEP . $cvs_module)) == 2 || + in_array($cvs_module, array('smarty', 'smarty-web', 'php4.fubar', 'php4.unused', 'peardoc.backup', 'php3', 'phpfi', 'livedocs', + 'Zend', 'functable', 'dialin', 'docstuff', 'jpgraph', 'phpoc_de', 'phpdoc-fa_IR', 'lxr', 'portal', 'pres', 'embed', 'imapd'))) { + rm("{$cvsPath}/{$cvs_module}"); } else if (in_array($cvs_module, array('php-gtk', 'php-gtk-doc', 'old-php-gtk-modules'))) { - $repoList['gtk']->addCVSModule($cvs_module); + mv("{$cvsPath}/{$cvs_module}", "{$cvsPath}/gtk/{$cvs_module}"); + $converter->addCVSModule("gtk/{$cvs_module}"); } else if (in_array($cvs_module, array('ZendAPI', 'php-src', 'pecl', 'pecl4win', 'php-objc', 'php-lang', 'win-installer', 'bindlib_w32', 'zlib', 'pdo-specs', 'php-internals-win', 'fastcgi-isapi'))) { - $repoList['src']->addCVSModule($cvs_module, $cvs_module == 'pecl'); - } else if ($cvs_module == 'phd') { - $repoList['phd']->addCVSModule($cvs_module); - } else if ($cvs_module == 'gd') { - $repoList['gd']->addCVSModule($cvs_module); - } else if (in_array($cvs_module, array('pear', 'pearbot', 'pear-core', 'peardoc'))) { - $repoList['pear1']->addCVSModule($cvs_module, $cvs_module == 'pear'); + mv("{$cvsPath}/{$cvs_module}", "{$cvsPath}/php/{$cvs_module}"); + $converter->addCVSModule("php/{$cvs_module}", $cvs_module == 'pecl'); + } else if (in_array($cvs_module, array('modules', 'pearbot', 'pear-core', 'peardoc'))) { + mv("{$cvsPath}/{$cvs_module}", "{$cvsPath}/pear/{$cvs_module}"); + $converter->addCVSModule("pear/{$cvs_module}", $cvs_module == 'modules'); } else if (substr($cvs_module, -3) == "web" || in_array($cvs_module, array('pres2', 'presentations', 'bugtracker'))) { - $repoList['web']->addCVSModule($cvs_module); - } else if (strncmp($cvs_module, "phpdoc", 6) == 0) { - $repoList['doc']->addCVSModule($cvs_module); + if (substr($cvs_module, -4) == '-web') { + $dest_cvs_module = substr($cvs_module, 0, -4); + } else if (substr($cvs_module, -3) == 'web') { + $dest_cvs_module = substr($cvs_module, 0, -3); + } + mv("{$cvsPath}/{$cvs_module}", "{$cvsPath}/web/{$dest_cvs_module}"); + $converter->addCVSModule("web/{$dest_cvs_module}"); + } else if (strncmp($cvs_module, "phpdoc", 6) == 0 || $cvs_module == 'doc-base') { + if (substr($cvs_module, 7) == 'phpdoc-') { + $dest_cvs_module = substr($cvs_module, 7); + } + mv("{$cvsPath}/{$cvs_module}", "{$cvsPath}/phpdoc/{$dest_cvs_module}"); + $converter->addCVSModule("phpdoc/{$dest_cvs_module}"); } } - // Fixup rules for php-doc - $repoList['doc']->addRenameRule(array('mode' => 'mkdir', 'srcPath' => 'en')); - $repoList['doc']->addRenameRule(array('mode' => 'mkdir', 'srcPath' => 'en/tags')); - $repoList['doc']->addRenameRule(array('mode' => 'mkdir', 'srcPath' => 'en/branches')); - $repoList['doc']->addRenameRule(array('mode' => 'move', 'srcPath' => 'phpdoc/trunk/en', 'dstPath' => 'en/trunk')); - $repoList['doc']->addRenameRule(array('mode' => 'move', 'srcPath' => 'phpdoc', 'dstPath' => 'doc-base')); - $repoList['doc']->addRenameRule(array('mode' => 'rename', 'basePath' => '', 'match' => '/^phpdoc-(.*)$/', 'replacement' => "\\1")); - // Fixup rules for php-src - $repoList['src']->addRenameRule(array('mode' => 'move', 'srcPath' => 'pdo-specs/trunk', 'dstPath' => 'pecl/pdo/trunk/specs')); - $repoList['src']->addRenameRule(array('mode' => 'delete', 'srcPath' => 'pdo-specs')); - // Fixup rules for pear1 - $repoList['pear1']->addRenameRule(array('mode' => 'delete', 'srcPath' => 'pear/Selenium/branches/shin/.svn')); - $repoList['pear1']->addRenameRule(array('mode' => 'delete', 'srcPath' => 'pear/Selenium/branches/shin/tests/.svn')); - $repoList['pear1']->addRenameRule(array('mode' => 'delete', 'srcPath' => 'pear/Selenium/branches/shin/tests/events/.svn')); - $repoList['pear1']->addRenameRule(array('mode' => 'delete', 'srcPath' => 'pear/Selenium/branches/shin/tests/html/.svn')); - $repoList['pear1']->addRenameRule(array('mode' => 'delete', 'srcPath' => 'pear/Selenium/branches/shin/docs/.svn')); - $repoList['pear1']->addRenameRule(array('mode' => 'delete', 'srcPath' => 'pear/Selenium/branches/shin/examples/.svn')); - $repoList['pear1']->addRenameRule(array('mode' => 'delete', 'srcPath' => 'pear/Selenium/tags/start/.svn')); - $repoList['pear1']->addRenameRule(array('mode' => 'delete', 'srcPath' => 'pear/Selenium/tags/start/tests/.svn')); - $repoList['pear1']->addRenameRule(array('mode' => 'delete', 'srcPath' => 'pear/Selenium/tags/start/tests/events/.svn')); - $repoList['pear1']->addRenameRule(array('mode' => 'delete', 'srcPath' => 'pear/Selenium/tags/start/tests/html/.svn')); - $repoList['pear1']->addRenameRule(array('mode' => 'delete', 'srcPath' => 'pear/Selenium/tags/start/docs/.svn')); - $repoList['pear1']->addRenameRule(array('mode' => 'delete', 'srcPath' => 'pear/Selenium/tags/start/examples/.svn')); - $repoList['pear1']->addRenameRule(array('mode' => 'delete', 'srcPath' => 'pear/Testing_Selenium/branches/shin/.svn')); - $repoList['pear1']->addRenameRule(array('mode' => 'delete', 'srcPath' => 'pear/Testing_Selenium/branches/shin/tests/.svn')); - $repoList['pear1']->addRenameRule(array('mode' => 'delete', 'srcPath' => 'pear/Testing_Selenium/branches/shin/tests/events/.svn')); - $repoList['pear1']->addRenameRule(array('mode' => 'delete', 'srcPath' => 'pear/Testing_Selenium/branches/shin/tests/html/.svn')); - $repoList['pear1']->addRenameRule(array('mode' => 'delete', 'srcPath' => 'pear/Testing_Selenium/branches/shin/docs/.svn')); - $repoList['pear1']->addRenameRule(array('mode' => 'delete', 'srcPath' => 'pear/Testing_Selenium/branches/shin/examples/.svn')); - $repoList['pear1']->addRenameRule(array('mode' => 'delete', 'srcPath' => 'pear/Testing_Selenium/tags/start/.svn')); - $repoList['pear1']->addRenameRule(array('mode' => 'delete', 'srcPath' => 'pear/Testing_Selenium/tags/start/tests/.svn')); - $repoList['pear1']->addRenameRule(array('mode' => 'delete', 'srcPath' => 'pear/Testing_Selenium/tags/start/tests/events/.svn')); - $repoList['pear1']->addRenameRule(array('mode' => 'delete', 'srcPath' => 'pear/Testing_Selenium/tags/start/tests/html/.svn')); - $repoList['pear1']->addRenameRule(array('mode' => 'delete', 'srcPath' => 'pear/Testing_Selenium/tags/start/docs/.svn')); - $repoList['pear1']->addRenameRule(array('mode' => 'delete', 'srcPath' => 'pear/Testing_Selenium/tags/start/examples/.svn')); + run_command('find ' . escapeshellarg("{$cvsPath}/pear/modules") . " -name '.svn' -type d -print0 | xargs -0 rm -Rf"); v(2, "Prepared " . count($repoList) . " SVN repositories.\n"); foreach ($repoList as $repo) { @@ -563,38 +351,53 @@ // svncreate pass function pass_svncreate() { - foreach ($GLOBALS['repoList'] as $repo) { - $repo->createSVNRepository(); - } + $svnPath = "{$GLOBALS['options']['svnroot']}/repository"; + if (file_exists($svnPath)) { + if (!is_readable($svnPath) || !is_writable($svnPath)) { + error("Directory '{$svnPath}' is in the way.\n"); + } + // Repo already exists + v(2, "SVN repository already exists. Not creating.\n"); + return; + } + v(1, "Creating SVN repository in {$svnPath}...\n"); + $command = "exec svnadmin create " . escapeshellarg($svnPath) . " 2>&1"; + run_command($command); } // ----------------------------------------------------------------------------------------------------------------------------- // cvs2svn pass function pass_cvs2svn() { - foreach ($GLOBALS['repoList'] as $repo) { - $repo->importCVSModules(); + global $converter; + + $svnPath = "{$GLOBALS['options']['svnroot']}/repository"; + if (!is_dir($svnPath) || !is_writable($svnPath)) { + error("SVN repository at {$svnPath} doesn't exist or isn't writable.\n"); } -} - -// ----------------------------------------------------------------------------------------------------------------------------- -// cleanup pass -function pass_cleanup() -{ - foreach ($GLOBALS['repoList'] as $repo) { - $repo->fixupRepository(); + + $output = run_command('svnlook youngest ' . escapeshellarg($svnPath)); + if (trim(end($output)) != 0) { + v(2 "SVN repository isn't empty. Not converting.\n"); + return; // Repo isn't empty } + + v(1, "Running cvs2svn for '{$this->repositoryName}'...\n"); + $converter->setOutputPath($svnPath); + $converter->run(); } // ----------------------------------------------------------------------------------------------------------------------------- // link pass function pass_link() { - $rawTagList = run_command('exec svn ls file:///' . escapeshellarg($GLOBALS['options']['svnroot'] . '/php-src/php-src/tags')); - $rawBranchList = run_command('exec svn ls file:///' . escapeshellarg($GLOBALS['options']['svnroot'] . '/php-src/php-src/branches')); + $svnPath = "{$GLOBALS['options']['svnroot']}/repository/php/php-src"; + + $rawTagList = run_command('exec svn ls file:///' . escapeshellarg("{$svnPath}/tags")); + $rawBranchList = run_command('exec svn ls file:///' . escapeshellarg("{$svnPath}/branches")); if (!file_exists($GLOBALS['temp_path'] . DIR_SEP . 'php-src-co')) { - run_command('exec svn checkout file:///' . escapeshellarg($GLOBALS['options']['svnroot'] . '/php-src/php-src') . ' ' . + run_command('exec svn checkout file:///' . escapeshellarg($svnPath) . ' ' . escapeshellarg($GLOBALS['temp_path'] . DIR_SEP . 'php-src-co') . ' 2>&1 > ' . escapeshellarg($GLOBALS['temp_path'] . DIR_SEP . 'co-output')); } @@ -605,14 +408,14 @@ $branchList = array(); foreach ($rawTagList as $tag) { $realTag = substr($tag, 0, -1); - $xml = run_command('exec svn info --xml file:///' . escapeshellarg($GLOBALS['options']['svnroot'] . '/php-src/php-src/tags/' . $realTag)); + $xml = run_command('exec svn info --xml file:///' . escapeshellarg("{$svnPath}/tags/{$realTag}")); $xml = implode("\n", $xml); $tagList[$realTag] = strtotime(substr($xml, strpos($xml, '<date>') + 6, strlen('0000-00-00T00:00:00.000000Z'))); run_command('exec svn propdel svn:externals ' . escapeshellarg('tags' . DIR_SEP . $realTag . DIR_SEP . 'ext') . ' 2>&1'); } foreach ($rawBranchList as $branch) { $realBranch = substr($branch, 0, -1); - $xml = run_command('exec svn info --xml file:///' . escapeshellarg($GLOBALS['options']['svnroot'] . '/php-src/php-src/branches/' . $realBranch)); + $xml = run_command('exec svn info --xml file:///' . escapeshellarg("{$svnPath}/branches/{$realBranch}")); $xml = implode("\n", $xml); $branchList[$realBranch] = strtotime(substr($xml, strpos($xml, '<date>') + 6, strlen('0000-00-00T00:00:00.000000Z'))); run_command('exec svn propdel svn:externals ' . escapeshellarg('branches' . DIR_SEP . $realBranch . DIR_SEP . 'ext') . ' 2>&1'); @@ -655,22 +458,6 @@ // install pass function pass_install() { - foreach ($GLOBALS['repoList'] as $repo) { - $repo->installAdminFiles(); - } - v(1, "Installing global administrative files...\n"); - $usersDB = $GLOBALS['options']['svnroot'] . DIR_SEP . 'svn.users'; - if (!file_exists($usersDB)) { - v(2, "Installing global user database...\n"); - $svnreadpass = md5('svnread:PHP Subversion Repositories:svnread'); - file_put_contents($usersDB, <<<EOUSERS -svnread:PHP Subversion Repositories:{$svnreadpass} - -EOUSERS - ); - } else { - v(2, "Not overwriting existing global user database.\n"); - } v(2, "Installing global Apache 2.2 configuration file....\n"); $svnRoot = $GLOBALS['options']['svnroot']; $logsDir = $svnRoot . DIR_SEP . 'logs' . DIR_SEP; @@ -678,22 +465,29 @@ $confContents = <<<EOHTTPD <VirtualHost *:80> ServerName svn.php.net - DocumentRoot "{$svnRoot}" - <Directory "/"> - Order allow,deny - Allow from all - </Directory> - LogLevel debug CustomLog "|/local/bin/rotatelogs {$logsDir}/svn-svn_log.%Y%m%d 86400" "%t %u %{SVN-ACTION}e" env=SVN-ACTION CustomLog "|/local/bin/rotatelogs {$logsDir}/svn-access_log.%Y%m%d 86400" combined ErrorLog "|/local/bin/rotatelogs {$logsDir}/svn-error_log.%Y%m%d 86400" + <Location "/"> + DAV svn + SVNPath "{$svnRoot}/repository" + AuthzSVNAccessFile "{$svnRoot]/SVNROOT/authz.db" + Satisfy All + Require valid-user + AuthType Digest + AuthName "PHP Subversion Repositories" + AuthUserFile "{$svnRoot}/SVNROOT/users.db" + AuthDigestDomain "/" + </Location> +</VirtualHost> EOHTTPD; - foreach ($GLOBALS['repoList'] as $repo) { - $confContents .= " Include " . $repo->getHTTPDConfPath() . "\n"; - } - $confContents .= "</VirtualHost>\n"; file_put_contents($apacheConf, $confContents); + + v(2, "Installing e-mail post-commit hook...\n"); + unlink("{$svnRoot}/repository/hooks/post-commit"); + symlink("{$svnRoot}/SVNROOT/commit-email.php", "{$svnRoot}/repository/hooks/post-commit"); + v(1, "Done installing global administrative files.\n"); } http://cvs.php.net/viewvc.cgi/SVNROOT/users.db?view=markup&rev=1.1 Index: SVNROOT/users.db +++ SVNROOT/users.db svnread:PHP Subversion Repositories:cb3d4eb7c0848cbbc8d68acabb0e4c3b