From 5d76ec85a500321127ac879ffaa0aabd686bb7bf Mon Sep 17 00:00:00 2001 From: Christian Weiske Date: Tue, 17 Apr 2012 19:53:13 +0200 Subject: [PATCH] raw download for older revisions --- src/phorkie/File.php | 7 ++++++- src/phorkie/Repository.php | 33 +++++++++++++++++++-------------- www/.htaccess | 1 + www/raw.php | 7 ++++++- 4 files changed, 32 insertions(+), 16 deletions(-) diff --git a/src/phorkie/File.php b/src/phorkie/File.php index bc0950f..acc44cd 100644 --- a/src/phorkie/File.php +++ b/src/phorkie/File.php @@ -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(); } diff --git a/src/phorkie/Repository.php b/src/phorkie/Repository.php index 6c71b47..c854cf1 100644 --- a/src/phorkie/Repository.php +++ b/src/phorkie/Repository.php @@ -118,6 +118,16 @@ class Repository * @return File[] Array of files */ 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'; @@ -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) diff --git a/www/.htaccess b/www/.htaccess index 73ba7db..697b6ec 100644 --- a/www/.htaccess +++ b/www/.htaccess @@ -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 diff --git a/www/raw.php b/www/raw.php index 28f7c56..8bda11e 100644 --- a/www/raw.php +++ b/www/raw.php @@ -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(); +} ?> -- 2.30.2