Update interface to merge vcs with basic archivers

main
Matthieu Moquet 12 years ago committed by Nils Adermann
parent 3b22791059
commit bfd2275cb0

@ -30,8 +30,6 @@ class ArchiveManager
protected $archivers = array();
protected $vcsArchivers = array();
/**
* @param string $buildDir The directory used to build the archive
* @param DownloadManager $downloadManager A manager used to download package sources
@ -53,11 +51,7 @@ class ArchiveManager
*/
public function addArchiver(ArchiverInterface $archiver)
{
if ($archiver instanceof VcsArchiver) {
$this->vcsArchivers[$archiver->getSourceType()] = $archiver;
} else {
$this->archivers[] = $archiver;
}
$this->archivers[] = $archiver;
}
/**
@ -88,21 +82,11 @@ class ArchiveManager
// Download sources
$this->downloadManager->download($package, $sources, true);
// Try VCS archivers first
$sourceType = $package->getSourceType();
if (isset($this->archivers[$sourceType]) && $this->archivers[$sourceType]->supports($format)) {
$archiver = $this->archivers[$sourceType];
$archiver->setSourceRef($sourceRef);
$archiver->setFormat($format);
$archiver->archive($sources, $target);
return $target;
}
// Fallback on default archivers
$sourceRef = $package->getSourceReference();
foreach ($this->archivers as $archiver) {
if ($archiver->supports($format)) {
$archiver->archive($sources, $target);
if ($archiver->supports($format, $sourceType)) {
$archiver->archive($sources, $target, $format, $sourceRef);
return $target;
}

@ -23,17 +23,21 @@ interface ArchiverInterface
/**
* Create an archive from the sources.
*
* @param string $source The sources directory
* @param string $target The target file
* @param string $source The sources directory
* @param string $target The target file
* @param string $format The format used for archive
* @param string $sourceRef The reference of the source to archive or null
* for the current reference
*/
public function archive($sources, $target);
public function archive($sources, $target, $format, $sourceRef = null);
/**
* Format supported by the archiver.
*
* @param string $format The format to support
* @param string $format The archive format
* @param string $sourceType The source type (git, svn, hg, etc.)
*
* @return boolean true if the format is supported by the archiver
*/
public function supports($format);
public function supports($format, $sourceType);
}

@ -12,19 +12,31 @@
namespace Composer\Package\Archiver;
use Composer\Util\ProcessExecutor;
/**
* @author Till Klampaeckel <till@php.net>
* @author Matthieu Moquet <matthieu@moquet.net>
*/
class GitArchiver extends VcsArchiver
class GitArchiver implements ArchiverInterface
{
protected $process;
public function __construct($process = null)
{
$this->process = $process ?: new ProcessExecutor();
}
/**
* {@inheritdoc}
*/
public function archive($source, $target)
public function archive($sources, $target, $format, $sourceRef = null)
{
$format = $this->format ?: 'zip';
$sourceRef = $this->sourceRef ?: 'HEAD';
// Since git-archive no longer works with a commit ID in git 1.7.10,
// use by default the HEAD reference instead of the commit sha1
if (null === $sourceRef || preg_match('/^[0-9a-f]{40}$/i',$sourceRef)) {
$sourceRef = 'HEAD';
}
$command = sprintf(
'git archive --format %s --output %s %s',
@ -33,7 +45,7 @@ class GitArchiver extends VcsArchiver
$sourceRef
);
$exitCode = $this->process->execute($command, $output, $source);
$exitCode = $this->process->execute($command, $output, $sources);
if (0 !== $exitCode) {
throw new \RuntimeException(
@ -45,17 +57,9 @@ class GitArchiver extends VcsArchiver
/**
* {@inheritdoc}
*/
public function getSourceType()
{
return 'git';
}
/**
* {@inheritdoc}
*/
public function supports($format)
public function supports($format, $sourceType)
{
return in_array($format, array(
return 'git' === $sourceType && in_array($format, array(
'zip',
'tar',
'tgz',

@ -12,19 +12,29 @@
namespace Composer\Package\Archiver;
use Composer\Util\ProcessExecutor;
/**
* @author Till Klampaeckel <till@php.net>
* @author Matthieu Moquet <matthieu@moquet.net>
*/
class MercurialArchiver extends VcsArchiver
class MercurialArchiver implements ArchiverInterface
{
protected $process;
public function __construct($process = null)
{
$this->process = $process ?: new ProcessExecutor();
}
/**
* {@inheritdoc}
*/
public function archive($source, $target)
public function archive($sources, $target, $format, $sourceRef = null)
{
$format = $this->format ?: 'zip';
$sourceRef = $this->sourceRef ?: 'default';
if (null === $sourceRef) {
$sourceRef = 'default';
}
$command = sprintf(
'hg archive --rev %s --type %s %s',
@ -33,7 +43,7 @@ class MercurialArchiver extends VcsArchiver
escapeshellarg($target)
);
$exitCode = $this->process->execute($command, $output, $source);
$exitCode = $this->process->execute($command, $output, $sources);
if (0 !== $exitCode) {
throw new \RuntimeException(
@ -45,17 +55,9 @@ class MercurialArchiver extends VcsArchiver
/**
* {@inheritdoc}
*/
public function getSourceType()
{
return 'hg';
}
/**
* {@inheritdoc}
*/
public function supports($format)
public function supports($format, $sourceType)
{
return in_array($format, array(
return 'hg' === $sourceType && in_array($format, array(
'tar',
'tbz2',
'tgz',

@ -24,7 +24,7 @@ class TarArchiver extends BaseArchiver
/**
* {@inheritdoc}
*/
public function archive($sources, $target)
public function archive($sources, $target, $format, $sourceRef = null)
{
$this->createPharArchive($sources, $target, \Phar::TAR);
}
@ -32,7 +32,7 @@ class TarArchiver extends BaseArchiver
/**
* {@inheritdoc}
*/
public function supports($format)
public function supports($format, $sourceType)
{
return 'tar' === $format;
}

@ -1,60 +0,0 @@
<?php
/*
* This file is part of Composer.
*
* (c) Nils Adermann <naderman@naderman.de>
* Jordi Boggiano <j.boggiano@seld.be>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Composer\Package\Archiver;
use Composer\Util\ProcessExecutor;
/**
* VCS archivers are optimized for a specific source type.
*
* @author Till Klampaeckel <till@php.net>
* @author Matthieu Moquet <matthieu@moquet.net>
*/
abstract class VcsArchiver implements ArchiverInterface
{
protected $process;
protected $sourceRef;
protected $format;
public function __construct($process = null)
{
$this->process = $process ?: new ProcessExecutor();
}
public function getSourceRef()
{
return $this->sourceRef;
}
public function setSourceRef($sourceRef)
{
$this->sourceRef = $sourceRef;
}
public function getFormat()
{
return $this->format;
}
public function setFormat($format)
{
$this->format = $format;
}
/**
* Get the source type supported by the archiver.
*
* @return string The source type of the archiver
*/
abstract public function getSourceType();
}

@ -24,7 +24,7 @@ class ZipArchiver extends BaseArchiver
/**
* {@inheritdoc}
*/
public function archive($sources, $target)
public function archive($sources, $target, $format, $sourceRef = null)
{
$this->createPharArchive($sources, $target, \Phar::ZIP);
}
@ -32,7 +32,7 @@ class ZipArchiver extends BaseArchiver
/**
* {@inheritdoc}
*/
public function supports($format)
public function supports($format, $sourceType)
{
return 'zip' === $format;
}

@ -29,9 +29,7 @@ class GitArchiverTest extends ArchiverTest
// Test archive
$archiver = new GitArchiver();
$archiver->setFormat('zip');
$archiver->setSourceRef('master');
$archiver->archive($package->getSourceUrl(), $target);
$archiver->archive($package->getSourceUrl(), $target, 'zip', 'master');
$this->assertFileExists($target);
unlink($target);
@ -47,9 +45,7 @@ class GitArchiverTest extends ArchiverTest
// Test archive
$archiver = new GitArchiver();
$archiver->setFormat('tar');
$archiver->setSourceRef('master');
$archiver->archive($package->getSourceUrl(), $target);
$archiver->archive($package->getSourceUrl(), $target, 'tar', 'master');
$this->assertFileExists($target);
unlink($target);

@ -30,9 +30,7 @@ class MercurialArchiverTest extends ArchiverTest
// Test archive
$archiver = new MercurialArchiver();
$archiver->setFormat('zip');
$archiver->setSourceRef('default');
$archiver->archive($package->getSourceUrl(), $target);
$archiver->archive($package->getSourceUrl(), $target, 'zip', 'default');
$this->assertFileExists($target);
unlink($target);
@ -48,9 +46,7 @@ class MercurialArchiverTest extends ArchiverTest
// Test archive
$archiver = new MercurialArchiver();
$archiver->setFormat('tar');
$archiver->setSourceRef('default');
$archiver->archive($package->getSourceUrl(), $target);
$archiver->archive($package->getSourceUrl(), $target, 'tar', 'default');
$this->assertFileExists($target);
unlink($target);

@ -29,7 +29,7 @@ class TarArchiverTest extends ArchiverTest
// Test archive
$archiver = new TarArchiver();
$archiver->archive($package->getSourceUrl(), $target);
$archiver->archive($package->getSourceUrl(), $target, 'tar');
$this->assertFileExists($target);
unlink($target);

@ -29,7 +29,7 @@ class ZipArchiverTest extends ArchiverTest
// Test archive
$archiver = new ZipArchiver();
$archiver->archive($package->getSourceUrl(), $target);
$archiver->archive($package->getSourceUrl(), $target, 'zip');
$this->assertFileExists($target);
unlink($target);

Loading…
Cancel
Save