X-Git-Url: https://git.cweiske.de/phorkie.git/blobdiff_plain/813d3f5367c15dd21091af6eb7d263e1d98c4c17..43b23197ffc3e1d08a1e08b09dbb31f06692d7ff:/src/phorkie/ForkRemote.php diff --git a/src/phorkie/ForkRemote.php b/src/phorkie/ForkRemote.php index c9ed748..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,80 +22,24 @@ class ForkRemote public function __construct($url) { - $this->url = $url; + $this->url = trim($url); } public function parse() { - $arUrl = parse_url($this->url); - $scheme = $arUrl['scheme'] ?: ''; - if ($scheme == 'https' && isset($arUrl['host']) - && $arUrl['host'] == 'gist.github.com' - ) { - $scheme = 'git'; - $this->url = 'git://gist.github.com/'. ltrim($arUrl['path'], '/') . '.git'; - } - - 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; + $hp = new HtmlParser(); + $ret = $hp->extractGitUrls($this->url); + $this->arGitUrls = $hp->getGitUrls(); + $this->error = $hp->error; - case 'http': - case 'https': - return $this->extractUrlsFromHtml($this->url); - } - - $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() { @@ -98,7 +47,7 @@ class ForkRemote foreach ($this->arGitUrls as $title => $arUrls) { foreach ($arUrls as $url) { $nFound++; - $uniqueUrl = $url; + $uniqueUrl = array('url' => $url, 'title' => $title); } } @@ -113,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 parse_url($url, PHP_URL_SCHEME) == 'git'; + return $this->url; } -} + public function setUrl($url) + { + $this->url = $url; + } +} ?>