remote forking: use the original http/https url in description
[phorkie.git] / src / phorkie / File.php
index 519413d565411db7d45356fdf4979d11f364d5ab..7f5b5b407df44747c9d67f6f34f6f1eff7b025e9 100644 (file)
@@ -4,7 +4,7 @@ namespace phorkie;
 class File
 {
     /**
-     * Full path to the file
+     * Path to the file, relative to repository work directory
      *
      * @var string
      */
@@ -17,6 +17,11 @@ class File
      */
     public $repo;
 
+    /**
+     * Commit revision this file is at
+     */
+    public $hash;
+
     public function __construct($path, Repository $repo = null)
     {
         $this->path = $path;
@@ -30,7 +35,7 @@ class File
      */
     public function getFilename()
     {
-        return basename($this->path);
+        return $this->path;
     }
 
     /**
@@ -38,9 +43,9 @@ class File
      *
      * @return string
      */
-    public function getPath()
+    public function getFullPath()
     {
-        return $this->path;
+        return $this->repo->workDir . '/' . $this->path;
     }
 
     /**
@@ -55,7 +60,17 @@ class File
 
     public function getContent()
     {
-        return file_get_contents($this->path);
+        if ($this->repo->hash) {
+            //quick hack until https://pear.php.net/bugs/bug.php?id=19385 is fixed
+            $cmd = new GitCommandBinary($this->repo->getVc());
+            $cmd->setSubCommand('show');
+            return //$this->repo->getVc()->getCommand('show')
+                $cmd
+                ->addArgument($this->repo->hash . ':' . $this->path)
+                ->execute();
+        }
+
+        return file_get_contents($this->getFullPath());
     }
 
     public function getRenderedContent(Tool_Result $res = null)
@@ -65,11 +80,11 @@ class File
 
         if (isset($GLOBALS['phorkie']['languages'][$ext]['renderer'])) {
             $class = $GLOBALS['phorkie']['languages'][$ext]['renderer'];
+        } else if ($this->isText()) {
+            $class = '\\phorkie\\Renderer_Geshi';
         } else if (isset($GLOBALS['phorkie']['languages'][$ext]['mime'])) {
             $type = $GLOBALS['phorkie']['languages'][$ext]['mime'];
-            if (substr($type, 0, 5) == 'text/') {
-                $class = '\\phorkie\\Renderer_Geshi';
-            } else if (substr($type, 0, 6) == 'image/') {
+            if (substr($type, 0, 6) == 'image/') {
                 $class = '\\phorkie\\Renderer_Image';
             }
         }
@@ -91,13 +106,21 @@ class File
     public function getLink($type, $option = null)
     {
         if ($type == 'raw') {
-            return '/' . $this->repo->id . '/raw/' . $this->getFilename();
+            if ($this->repo->hash === null) {
+                return '/' . $this->repo->id . '/raw/' . $this->getFilename();
+            } else {
+                return '/' . $this->repo->id . '/rev-raw/' . $this->repo->hash
+                    . '/' . $this->getFilename();
+            }
         } else if ($type == 'tool') {
             return '/' . $this->repo->id . '/tool/' . $option . '/' . $this->getFilename();
         }
         throw new Exception('Unknown type');
     }
 
+    /**
+     * @return string Mime type of file
+     */
     public function getMimeType()
     {
         $ext = $this->getExt();
@@ -112,9 +135,37 @@ class File
      */
     public function getToolInfos()
     {
+        if ($this->repo->hash !== null) {
+            return array();
+        }
+
         $tm = new Tool_Manager();
         return $tm->getSuitable($this);
     }
+
+    /**
+     * Tells if the file contains textual content and is editable.
+     *
+     * @return boolean
+     */
+    public function isText()
+    {
+        $ext = $this->getExt();
+        if ($ext == '') {
+            //no file extension? then consider the size
+            $size = filesize($this->getFullPath());
+            //files <= 4kiB are considered to be text
+            return $size <= 4096;
+        }
+
+        if (!isset($GLOBALS['phorkie']['languages'][$ext]['mime'])) {
+            return false;
+        }
+
+        $type = $GLOBALS['phorkie']['languages'][$ext]['mime'];
+        return substr($type, 0, 5) === 'text/'
+            || $type == 'application/javascript';
+    }
 }
 
-?>
\ No newline at end of file
+?>