raw download for older revisions
authorChristian Weiske <cweiske@cweiske.de>
Tue, 17 Apr 2012 17:53:13 +0000 (19:53 +0200)
committerChristian Weiske <cweiske@cweiske.de>
Tue, 17 Apr 2012 17:53:13 +0000 (19:53 +0200)
src/phorkie/File.php
src/phorkie/Repository.php
www/.htaccess
www/raw.php

index bc0950f..acc44cd 100644 (file)
@@ -102,7 +102,12 @@ 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();
         }
index 6c71b47..c854cf1 100644 (file)
@@ -119,6 +119,16 @@ class Repository
      */
     public function getFiles()
     {
+        $files = $this->getFilePaths();
+        $arFiles = array();
+        foreach ($files as $name) {
+            $arFiles[] = new File($name, $this);
+        }
+        return $arFiles;
+    }
+
+    protected function getFilePaths()
+    {
         if ($this->hash === null) {
             $hash = 'HEAD';
         } else {
@@ -129,28 +139,23 @@ class Repository
             ->setOption('name-only')
             ->addArgument($hash)
             ->execute();
-        $files = explode("\n", trim($output));
-        $arFiles = array();
-        foreach ($files as $name) {
-            $arFiles[] = new File($name, $this);
-        }
-        return $arFiles;
+        return explode("\n", trim($output));
     }
 
     public function getFileByName($name, $bHasToExist = true)
     {
-        $base = basename($name);
-        if ($base != $name) {
-            throw new Exception('No directories supported for now');
-        }
+        $name = Tools::sanitizeFilename($name);
         if ($name == '') {
             throw new Exception_Input('Empty file name given');
         }
-        $fullpath = $this->workDir . '/' . $base;
-        if ($bHasToExist && !is_readable($fullpath)) {
-            throw new Exception_Input('File does not exist');
+
+        if ($bHasToExist) {
+            $files = $this->getFilePaths();
+            if (array_search($name, $files) === false) {
+                throw new Exception_Input('File does not exist');
+            }
         }
-        return new File($base, $this);
+        return new File($name, $this);
     }
 
     public function hasFile($name)
index 73ba7db..697b6ec 100644 (file)
@@ -9,6 +9,7 @@ RewriteRule ^([0-9]+)/edit$ /edit.php?id=$1
 RewriteRule ^([0-9]+)/fork$ /fork.php?id=$1
 RewriteRule ^([0-9]+)/raw/(.+)$ /raw.php?id=$1&file=$2
 RewriteRule ^([0-9]+)/rev/(.+)$ /revision.php?id=$1&rev=$2
+RewriteRule ^([0-9]+)/rev-raw/(.+)/(.+)$ /raw.php?id=$1&rev=$2&file=$3
 RewriteRule ^([0-9]+)/tool/([^/]+)/(.+)$ /tool.php?id=$1&tool=$2&file=$3
 
 RewriteRule ^list$ /list.php
index 28f7c56..8bda11e 100644 (file)
@@ -17,5 +17,10 @@ if ($mimetype === null) {
     $mimetype = 'text/plain';
 }
 header('Content-Type: ' . $mimetype);
-readfile($file->getFullPath());
+if ($repo->hash === null) {
+    //IIRC readfile is not so memory-intensive for big files
+    readfile($file->getFullPath());
+} else {
+    echo $file->getContent();
+}
 ?>