diff --git a/bin/composer b/bin/composer index b188aa337..15b9a907c 100755 --- a/bin/composer +++ b/bin/composer @@ -29,6 +29,7 @@ $rm->setRepositoryClass('package', 'Composer\Repository\PackageRepository'); // initialize download manager $dm = new Downloader\DownloadManager(); $dm->setDownloader('git', new Downloader\GitDownloader()); +$dm->setDownloader('hg', new Downloader\HgDownloader()); $dm->setDownloader('pear', new Downloader\PearDownloader()); $dm->setDownloader('zip', new Downloader\ZipDownloader()); diff --git a/src/Composer/Downloader/HgDownloader.php b/src/Composer/Downloader/HgDownloader.php new file mode 100644 index 000000000..df0d6ae05 --- /dev/null +++ b/src/Composer/Downloader/HgDownloader.php @@ -0,0 +1,74 @@ + + * Jordi Boggiano + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Composer\Downloader; + +use Composer\Package\PackageInterface; + +/** + * @author Per Bernhardt + */ +class HgDownloader implements DownloaderInterface +{ + /** + * {@inheritDoc} + */ + public function getInstallationSource() + { + return 'source'; + } + + /** + * {@inheritDoc} + */ + public function download(PackageInterface $package, $path) + { + if (!$package->getSourceReference()) { + throw new \InvalidArgumentException('The given package is missing reference information'); + } + + $url = escapeshellarg($package->getSourceUrl()); + $ref = escapeshellarg($package->getSourceReference()); + system(sprintf('hg clone %s %s && cd %2$s && hg up %s', $url, $path, $ref)); + } + + /** + * {@inheritDoc} + */ + public function update(PackageInterface $initial, PackageInterface $target, $path) + { + if (!$target->getSourceReference()) { + throw new \InvalidArgumentException('The given package is missing reference information'); + } + + $this->enforceCleanDirectory($path); + system(sprintf('cd %s && hg pull && hg up %s', $path, $target->getSourceReference())); + } + + /** + * {@inheritDoc} + */ + public function remove(PackageInterface $package, $path) + { + $this->enforceCleanDirectory($path); + $fs = new Util\Filesystem(); + $fs->remove($path); + } + + private function enforceCleanDirectory($path) + { + exec(sprintf('cd %s && hg st', $path), $output); + if (implode('', $output)) { + throw new \RuntimeException('Source directory has uncommitted changes'); + } + } +}