X-Git-Url: https://git.cweiske.de/phorkie.git/blobdiff_plain/f92de25cd3760271ea81fcdc5809b64f5f8f2247..43b23197ffc3e1d08a1e08b09dbb31f06692d7ff:/src/phorkie/ForkRemote.php diff --git a/src/phorkie/ForkRemote.php b/src/phorkie/ForkRemote.php index 8784e8e..f8e319a 100644 --- a/src/phorkie/ForkRemote.php +++ b/src/phorkie/ForkRemote.php @@ -27,87 +27,19 @@ class ForkRemote public function parse() { - if ($this->url == '') { - $this->error = 'Empty fork URL'; - return false; - } - - $arUrl = parse_url($this->url); - $scheme = isset($arUrl['scheme']) ? $arUrl['scheme'] : ''; - - if ($scheme == 'https' && isset($arUrl['host']) - && $arUrl['host'] == 'gist.github.com' - ) { - $this->arGitUrls[][] = 'git://gist.github.com/' - . ltrim($arUrl['path'], '/') . '.git'; - return true; - } + $hp = new HtmlParser(); + $ret = $hp->extractGitUrls($this->url); + $this->arGitUrls = $hp->getGitUrls(); + $this->error = $hp->error; - 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); - } - - $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; - } - } - - if ($count > 0) { - return true; - } - - $this->error = 'No git:// clone URL found'; - return false; + 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() { @@ -115,7 +47,7 @@ class ForkRemote foreach ($this->arGitUrls as $title => $arUrls) { foreach ($arUrls as $url) { $nFound++; - $uniqueUrl = $url; + $uniqueUrl = array('url' => $url, 'title' => $title); } } @@ -145,13 +77,5 @@ class ForkRemote { $this->url = $url; } - - public function isSupported($url) - { - $scheme = parse_url($url, PHP_URL_SCHEME); - return $scheme == 'git' - || $scheme == 'http' || $scheme == 'https'; - } } - ?>