Add GitRepository class
parent
1eb2a46308
commit
bb52105c37
|
@ -14,6 +14,7 @@ namespace Composer;
|
||||||
|
|
||||||
use Composer\Repository\ComposerRepository;
|
use Composer\Repository\ComposerRepository;
|
||||||
use Composer\Repository\PlatformRepository;
|
use Composer\Repository\PlatformRepository;
|
||||||
|
use Composer\Repository\GitRepository;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Jordi Boggiano <j.boggiano@seld.be>
|
* @author Jordi Boggiano <j.boggiano@seld.be>
|
||||||
|
@ -72,22 +73,27 @@ class Composer
|
||||||
return $this->repositories;
|
return $this->repositories;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function createRepository($type, $url)
|
public function createRepository($type, $spec)
|
||||||
{
|
{
|
||||||
$url = rtrim($url, '/');
|
if (is_string($spec)) {
|
||||||
|
$spec = array('url' => $spec);
|
||||||
|
}
|
||||||
|
$spec['url'] = rtrim($spec['url'], '/');
|
||||||
|
|
||||||
switch ($type) {
|
switch ($type) {
|
||||||
case 'git-bare':
|
case 'git-bare':
|
||||||
case 'git-package':
|
|
||||||
case 'git-multi':
|
case 'git-multi':
|
||||||
throw new \Exception($type.' repositories not supported yet');
|
throw new \Exception($type.' repositories not supported yet');
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 'git':
|
||||||
|
return new GitRepository($spec['url']);
|
||||||
|
|
||||||
case 'platform':
|
case 'platform':
|
||||||
return new PlatformRepository;
|
return new PlatformRepository;
|
||||||
|
|
||||||
case 'composer':
|
case 'composer':
|
||||||
return new ComposerRepository($url);
|
return new ComposerRepository($spec['url']);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -0,0 +1,99 @@
|
||||||
|
<?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\Repository;
|
||||||
|
|
||||||
|
use Composer\Package\MemoryPackage;
|
||||||
|
use Composer\Package\BasePackage;
|
||||||
|
use Composer\Package\Link;
|
||||||
|
use Composer\Package\LinkConstraint\VersionConstraint;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Jordi Boggiano <j.boggiano@seld.be>
|
||||||
|
*/
|
||||||
|
class GitRepository extends ArrayRepository
|
||||||
|
{
|
||||||
|
protected $packages;
|
||||||
|
|
||||||
|
public function __construct($url)
|
||||||
|
{
|
||||||
|
$this->url = $url;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function initialize()
|
||||||
|
{
|
||||||
|
parent::initialize();
|
||||||
|
|
||||||
|
if (preg_match('#^(?:https?|git(?:\+ssh)?|ssh)://#', $this->url)) {
|
||||||
|
// check if the repo is on github.com, read the composer.json file & branch/tags out of it
|
||||||
|
// otherwise, maybe we have to clone the repo to figure out what's in it
|
||||||
|
throw new \Exception('Not implemented yet');
|
||||||
|
} elseif (file_exists($this->url)) {
|
||||||
|
if (!file_exists($this->url.'/composer.json')) {
|
||||||
|
throw new \InvalidArgumentException('The repository at url '.$this->url.' does not contain a composer.json file.');
|
||||||
|
}
|
||||||
|
$config = json_decode(file_get_contents($this->url.'/composer.json'), true);
|
||||||
|
if (!$config) {
|
||||||
|
throw new \UnexpectedValueException('Config file could not be parsed: '.$this->url.'/composer.json. Probably a JSON syntax error.');
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
throw new \InvalidArgumentException('Could not find repository at url '.$this->url);
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->createPackage($config);
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO code re-use
|
||||||
|
protected function createPackage($data)
|
||||||
|
{
|
||||||
|
$version = BasePackage::parseVersion($data['version']);
|
||||||
|
|
||||||
|
$package = new MemoryPackage($data['name'], $version['version'], $version['type']);
|
||||||
|
$package->setSourceType('git');
|
||||||
|
$package->setSourceUrl($this->url);
|
||||||
|
|
||||||
|
if (isset($data['license'])) {
|
||||||
|
$package->setLicense($data['license']);
|
||||||
|
}
|
||||||
|
|
||||||
|
$links = array(
|
||||||
|
'require',
|
||||||
|
'conflict',
|
||||||
|
'provide',
|
||||||
|
'replace',
|
||||||
|
'recommend',
|
||||||
|
'suggest',
|
||||||
|
);
|
||||||
|
foreach ($links as $link) {
|
||||||
|
if (isset($data[$link])) {
|
||||||
|
$method = 'set'.$link.'s';
|
||||||
|
$package->{$method}($this->createLinks($data['name'], $link.'s', $data[$link]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$this->addPackage($package);
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO code re-use
|
||||||
|
protected function createLinks($name, $description, $linkSpecs)
|
||||||
|
{
|
||||||
|
$links = array();
|
||||||
|
foreach ($linkSpecs as $dep => $ver) {
|
||||||
|
preg_match('#^([>=<~]*)([\d.]+.*)$#', $ver, $match);
|
||||||
|
if (!$match[1]) {
|
||||||
|
$match[1] = '=';
|
||||||
|
}
|
||||||
|
$constraint = new VersionConstraint($match[1], $match[2]);
|
||||||
|
$links[] = new Link($name, $dep, $constraint, $description);
|
||||||
|
}
|
||||||
|
return $links;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue