class ForkRemote
{
+ /**
+ * Contains error message when parse() failed
+ */
+ public $error;
+
protected $url;
/**
public function __construct($url)
{
- $this->url = $url;
+ $this->url = trim($url);
}
public function parse()
{
- $scheme = parse_url($this->url, PHP_URL_SCHEME);
- switch ($scheme) {
- case 'git':
- //clearly a git url
- $this->arGitUrls = array(array($this->url));
- return true;
-
- case 'ssh':
- //FIXME: maybe loosen this when we know how to skip the
- //"do you trust this server" question of ssh
- $this->error = 'ssh:// URLs are not supported';
- return false;
-
- case 'http':
- case 'https':
- return $this->extractUrlsFromHtml($this->url);
- }
+ $hp = new HtmlParser();
+ $ret = $hp->extractGitUrls($this->url);
+ $this->arGitUrls = $hp->getGitUrls();
+ $this->error = $hp->error;
- $this->error = 'Unknown URLs scheme: ' . $scheme;
- return false;
- }
-
- protected function extractUrlsFromHtml($url)
- {
- //HTML is not necessarily well-formed, and Gitorious has many problems
- // in this regard
- //$sx = simplexml_load_file($url);
- libxml_use_internal_errors(true);
- $sx = simplexml_import_dom(\DomDocument::loadHtmlFile($url));
- $elems = $sx->xpath('//*[@rel="vcs-git"]');
-
- $count = $anonymous = 0;
- foreach ($elems as $elem) {
- if (!isset($elem['href'])) {
- continue;
- }
- $str = (string)$elem;
- if (isset($elem['title'])) {
- //<link href=".." rel="vcs-git" title="title" />
- $title = (string)$elem['title'];
- } else if ($str != '') {
- //<a href=".." rel="vcs-git">title</a>
- $title = $str;
- } else {
- $title = 'Unnamed repository #' . ++$anonymous;
- }
- $url = (string)$elem['href'];
- if ($this->isSupported($url)) {
- ++$count;
- $this->arGitUrls[$title][] = $url;
- }
- }
-
- return $count > 0;
+ return $ret;
}
/**
* Iterate through all git urls and return one if there is only
* one supported one.
*
- * @return mixed Boolean false or string
+ * @return mixed Boolean false or array with keys "url" and "title"
*/
public function getUniqueGitUrl()
{
foreach ($this->arGitUrls as $title => $arUrls) {
foreach ($arUrls as $url) {
$nFound++;
- $uniqueUrl = $url;
+ $uniqueUrl = array('url' => $url, 'title' => $title);
}
}
return $this->arGitUrls;
}
- public function isSupported($url)
+ /**
+ * Get the URL from which the git URL was derived, often
+ * the HTTP URL.
+ *
+ * @return string
+ */
+ public function getUrl()
+ {
+ return $this->url;
+ }
+
+ public function setUrl($url)
{
- return parse_url($url, PHP_URL_SCHEME) == 'git';
+ $this->url = $url;
}
}
-
?>