update 0.5.0 changelog
[phorkie.git] / src / phorkie / ForkRemote.php
index 78c3caa37fd81740a293509b658fa91802314f5c..f8e319a3e095586804dbab821080d08deca9d2cc 100644 (file)
@@ -3,6 +3,11 @@ namespace phorkie;
 
 class ForkRemote
 {
+    /**
+     * Contains error message when parse() failed
+     */
+    public $error;
+
     protected $url;
 
     /**
@@ -22,82 +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'])) {
-                //<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()
     {
@@ -105,7 +47,7 @@ class ForkRemote
         foreach ($this->arGitUrls as $title => $arUrls) {
             foreach ($arUrls as $url) {
                 $nFound++;
-                $uniqueUrl = $url;
+                $uniqueUrl = array('url' => $url, 'title' => $title);
             }
         }
 
@@ -135,11 +77,5 @@ class ForkRemote
     {
         $this->url = $url;
     }
-
-    public function isSupported($url)
-    {
-        return parse_url($url, PHP_URL_SCHEME) == 'git';
-    }
 }
-
 ?>