From 1d058d4371b4ad2c326775157efea2b6d2cd4825 Mon Sep 17 00:00:00 2001 From: Polonkai Gergely Date: Fri, 13 Apr 2012 19:17:35 +0000 Subject: [PATCH] Added a new version of bin/vendors that supports git submodules Signed-off-by: Gergely POLONKAI (W00d5t0ck) --- bin/vendors | 266 ++++++++++++++++++++++++++++++++++------------------ 1 file changed, 176 insertions(+), 90 deletions(-) mode change 100755 => 100644 bin/vendors diff --git a/bin/vendors b/bin/vendors old mode 100755 new mode 100644 index 0e4fb85..49c774a --- a/bin/vendors +++ b/bin/vendors @@ -8,147 +8,233 @@ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. + * + * @author Fabien Potencier + * @author Florian Preusner */ -set_time_limit(0); +$rootDir = dirname(__DIR__); +$vendorName = 'vendor'; +$vendorDir = $rootDir . '/' . $vendorName; +$submodule = false; +$cloneOptions = ''; +$delete = false; +$install = true; + +$commands = array( + 'install' => 'install vendors as specified in deps or deps.lock (recommended)', + 'update' => 'update vendors to their latest versions (as specified in deps)', + 'delete' => 'remove vendors', + 'reinstall' => 'delete and install', + 'submodule:install' => 'install vendors as submodules', + 'submodule:update' => 'update vendors to their latest versions (as specified in deps)', + 'submodule:delete' => 'remove vendors', + 'submodule:reinstall' => 'delete and install' +); + -$rootDir = dirname(__DIR__); -$vendorDir = $rootDir.'/vendor'; array_shift($argv); -if (!isset($argv[0])) { - exit(<< $info) { - install: install vendors as specified in deps or deps.lock (recommended) - update: update vendors to their latest versions (as specified in deps) - lock: lock vendors to their current versions - -EOF - ); + $help .= str_pad($cmd, 21, ' ') . ": $info\n"; + } + + exit($help . "\n"); } -if (!in_array($command = array_shift($argv), array('install', 'update', 'lock'))) { - exit(sprintf('Command "%s" does not exist.', $command).PHP_EOL); -} - -/* - * Check wether this project is based on the Standard Edition that was - * shipped with vendors or not. - */ -if (is_dir($vendorDir.'/symfony') && !is_dir($vendorDir.'/symfony/.git') && !in_array('--reinstall', $argv)) { - exit(<< $dep) { - $dep = array_map('trim', $dep); + // revision + if (isset($versions[$name])) { + $rev = $versions[$name]; + } else { + $rev = isset($dep['version']) ? $dep['version'] : 'origin/HEAD'; + } + + // make sure to run commands on rootDir + system("cd $rootDir"); // install dir - $installDir = isset($dep['target']) ? $vendorDir.'/'.$dep['target'] : $vendorDir.'/'.$name; - if (in_array('--reinstall', $argv) && realpath($installDir)) { - if (defined('PHP_WINDOWS_VERSION_BUILD')) { - system(sprintf('rmdir /S /Q %s', escapeshellarg(realpath($installDir)))); + if($submodule) { + + $installDir = isset($dep['target']) ? $vendorName . $dep['target'] : $vendorName . '/' . $name; + } else { + + $installDir = isset($dep['target']) ? $vendorDir . $dep['target'] : $vendorDir . '/' . $name; + } + + + + if($delete) { + + echo "> Removing $name\n"; + + if($submodule) { + + deleteSubmodule($installDir, $rootDir); + } + + if(PHP_OS == 'WINNT') { + + system('rmdir /S /Q ' . escapeshellarg(realpath($installDir))); } else { - system(sprintf('rm -rf %s', escapeshellarg($installDir))); + + system('rm -rf ' . escapeshellarg($installDir)); } } - - if ('install' === $command || 'update' === $command) { - echo '> Installing/Updating '.$name.PHP_EOL; - - // url + + + if($install) { + + echo "> Installing/Updating $name\n"; + + // url if (!isset($dep['git'])) { - exit(sprintf('The "git" value for the "%s" dependency must be set.', $name).PHP_EOL); + exit(sprintf('The "git" value for the "%s" dependency must be set.', $name)); } $url = $dep['git']; - if (!is_dir($installDir)) { - system(sprintf('git clone %s %s', escapeshellarg($url), escapeshellarg($installDir))); - } + if($submodule) { - // revision - if (isset($versions[$name])) { - $rev = $versions[$name]; + $cmd = sprintf('git submodule add %s %s', escapeshellarg($url), escapeshellarg($installDir)); + $cmd .= ' && git submodule init'; + } else { - $rev = isset($dep['version']) ? $dep['version'] : 'origin/HEAD'; - } - - $status = system(sprintf('cd %s && git status --porcelain', escapeshellarg($installDir))); - if (!empty($status)) { - exit(sprintf('"%s" has local modifications. Please revert or commit/push them before running this command again.', $name).PHP_EOL); - } - $current_rev = system(sprintf('cd %s && git rev-list --max-count=1 HEAD', escapeshellarg($installDir))); - if ($current_rev === $rev) { - continue; + + $cmd = sprintf('git clone %s %s', escapeshellarg($url), escapeshellarg($installDir)); } + + echo " $cmd\n"; + + system($cmd); system(sprintf('cd %s && git fetch origin && git reset --hard %s', escapeshellarg($installDir), escapeshellarg($rev))); } - - if ('update' === $command || 'lock' === $command) { + + if ('update' === $command) { ob_start(); system(sprintf('cd %s && git log -n 1 --format=%%H', escapeshellarg($installDir))); - $newversion = trim(ob_get_clean()); - - ob_start(); - system(sprintf('cd %s && git name-rev --tags --name-only %s', escapeshellarg($installDir), $newversion)); - // remove trailing ^0 from tags, those are the tags themselves - $niceversion = preg_replace('/\^0$/', '', trim(ob_get_clean())); - - // undefined is returned in case no name-rev could be found - if ('undefined' !== $niceversion) { - $newversions[] = $name.' '.$niceversion; - } else { - $newversions[] = $name.' '.$newversion; - } + $newversions[] = trim($name.' '.ob_get_clean()); } } // update? -if ('update' === $command || 'lock' === $command) { - echo '> Updating deps.lock'.PHP_EOL; - - file_put_contents($rootDir.'/deps.lock', implode("\n", $newversions)."\n"); +if ('update' === $command) { + file_put_contents($rootDir.'/deps.lock', implode("\n", $newversions)); } -// php on windows can't use the shebang line from system() -$interpreter = defined('PHP_WINDOWS_VERSION_BUILD') ? 'php.exe' : ''; +if($install) { -// Update the bootstrap files -system(sprintf('%s %s %s', $interpreter, escapeshellarg($rootDir.'/vendor/bundles/Sensio/Bundle/DistributionBundle/Resources/bin/build_bootstrap.php'), escapeshellarg($rootDir))); + // php on windows can't use the shebang line from system() + $interpreter = PHP_OS == 'WINNT' ? 'php.exe' : ''; -// Update assets -system(sprintf('%s %s assets:install %s', $interpreter, escapeshellarg($rootDir.'/app/console'), escapeshellarg($rootDir.'/web/'))); + // Update the bootstrap files + //system(sprintf('%s %s', $interpreter, escapeshellarg($rootDir.'/bin/build_bootstrap'))); -// Remove the cache -system(sprintf('%s %s cache:clear --no-warmup', $interpreter, escapeshellarg($rootDir.'/app/console'))); + // Update assets + system(sprintf('%s %s assets:install --symlink %s', $interpreter, escapeshellarg($rootDir.'/app/console'), escapeshellarg($rootDir.'/web'))); + + // Remove the cache + system(sprintf('%s %s cache:clear --no-warmup', $interpreter, escapeshellarg($rootDir.'/app/console'))); +} + + + + +function deleteSubmodule($name, $rootDir) { + + $gitModules = $rootDir . '/.gitmodules'; + $gitConfig = $rootDir . '/.git/config'; + + $files = array($gitModules, $gitConfig); + + foreach($files as $file) : + + if(file_exists($file)) { + + $fileReturn = array(); + $found = false; + + foreach(file($file) as $line) { + + if(strpos($line, '"' . $name . '"') !== false) { + + $found = true; + continue; + } + + if($found) { + + if($line{0} != '[') { + + continue; + } + + $found = false; + } + + array_push($fileReturn, $line); + } + + $handle = fopen($file, 'wt'); + + if($handle) { + + fwrite($handle, implode($fileReturn)); + fclose($handle); + } + } + endforeach; + + $cmd = "git rm --cached --force $name"; + + echo " $cmd\n"; + system($cmd); +} \ No newline at end of file