X-Git-Url: https://git.cweiske.de/phorkie.git/blobdiff_plain/c85fb1700ce938f28da420af9636e246912a996b..2a665e0f4eeb45c9d57df7dc7f9d853465b5fea9:/src/phorkie/ForkRemote.php diff --git a/src/phorkie/ForkRemote.php b/src/phorkie/ForkRemote.php index 524255a..f8e319a 100644 --- a/src/phorkie/ForkRemote.php +++ b/src/phorkie/ForkRemote.php @@ -3,6 +3,11 @@ namespace phorkie; class ForkRemote { + /** + * Contains error message when parse() failed + */ + public $error; + protected $url; /** @@ -17,72 +22,24 @@ class ForkRemote 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'])) { - // - $title = (string)$elem['title']; - } else if ($str != '') { - //title - $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() { @@ -90,7 +47,7 @@ class ForkRemote foreach ($this->arGitUrls as $title => $arUrls) { foreach ($arUrls as $url) { $nFound++; - $uniqueUrl = $url; + $uniqueUrl = array('url' => $url, 'title' => $title); } } @@ -105,10 +62,20 @@ class ForkRemote 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; } } - ?>