diff --git a/src/Composer/Command/CreateProjectCommand.php b/src/Composer/Command/CreateProjectCommand.php index 7989c60d2..33cd46f0e 100644 --- a/src/Composer/Command/CreateProjectCommand.php +++ b/src/Composer/Command/CreateProjectCommand.php @@ -26,9 +26,9 @@ use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; -use Symfony\Component\Filesystem\Filesystem; use Symfony\Component\Finder\Finder; use Composer\Json\JsonFile; +use Composer\Util\Filesystem; use Composer\Util\RemoteFilesystem; use Composer\Package\Version\VersionParser; @@ -190,20 +190,24 @@ EOT if (!$keepVcs && ( !$io->isInteractive() || - $io->askConfirmation('Do you want remove all previous VCS history ? [yes]: ', true) + $io->askConfirmation('Do you want to remove the exisitng VCS (.git, .svn..) history? [Y,n]? ', true) ) ) { $finder = new Finder(); - $finder->in($directory)->ignoreVCS(false)->ignoreDotFiles(false); + $finder->directories()->in(getcwd())->ignoreVCS(false)->ignoreDotFiles(false); foreach (array('.svn', '_svn', 'CVS', '_darcs', '.arch-params', '.monotone', '.bzr', '.git', '.hg') as $vcsName) { $finder->name($vcsName); } - $fs = new Filesystem(); try { - $fs->remove($finder); - } catch (IOException $e) { - $io->write("An error occured while removing the .git directory"); + $fs = new Filesystem(); + foreach (iterator_to_array($finder) as $dir) { + if (!$fs->removeDirectory($dir)) { + throw new \RuntimeException('Could not remove '.$dir); + } + } + } catch (\Exception $e) { + $io->write('An error occured while removing the VCS metadata: '.$e->getMessage().''); } } } diff --git a/src/Composer/Downloader/GitDownloader.php b/src/Composer/Downloader/GitDownloader.php index 750ff73bf..728e0ba5d 100644 --- a/src/Composer/Downloader/GitDownloader.php +++ b/src/Composer/Downloader/GitDownloader.php @@ -160,6 +160,7 @@ class GitDownloader extends VcsDownloader protected function updateToCommit($path, $reference, $branch, $date) { $template = 'git checkout %s && git reset --hard %1$s'; + $branch = preg_replace('{(?:^dev-|(?:\.x)?-dev$)}i', '', $branch); // check whether non-commitish are branches or tags, and fetch branches with the remote name $gitRef = $reference; @@ -167,11 +168,12 @@ class GitDownloader extends VcsDownloader && 0 === $this->process->execute('git branch -r', $output, $path) && preg_match('{^\s+composer/'.preg_quote($reference).'$}m', $output) ) { - $gitRef = 'composer/'.$reference; + $command = sprintf('git checkout -B %s %s && git reset --hard %2$s', escapeshellarg($branch), escapeshellarg('composer/'.$reference)); + if (0 === $this->process->execute($command, $output, $path)) { + return; + } } - $branch = preg_replace('{(?:^dev-|(?:\.x)?-dev$)}i', '', $branch); - // checkout branch by name if the current reference matches the tip of the branch if (preg_match('{^[a-f0-9]{40}$}', $reference) && 0 === $this->process->execute('git log '.escapeshellarg($branch).' -1 --format=format:%H', $output, $path)