X-Git-Url: https://git.cweiske.de/phorkie.git/blobdiff_plain/a4a47e2f9bd26259f0f6256a9652a39836c56a4d..52de444faa10f37c4174e9fe2c75e77484342549:/src/phorkie/Repository.php diff --git a/src/phorkie/Repository.php b/src/phorkie/Repository.php index aa1ea4c..25b049c 100644 --- a/src/phorkie/Repository.php +++ b/src/phorkie/Repository.php @@ -32,6 +32,12 @@ class Repository */ public $hash; + /** + * Commit message of the last (or current) revision + * + * @var string + */ + public $message; /** @@ -49,9 +55,14 @@ class Repository if (!is_numeric($_GET['id'])) { throw new Exception_Input('Paste ID not numeric'); } + if (isset($_GET['rev'])) { + $this->hash = $_GET['rev']; + } + $this->id = (int)$_GET['id']; $this->loadDirs(); $this->loadHash(); + $this->loadMessage(); } protected function loadDirs() @@ -75,6 +86,7 @@ class Repository public function loadHash() { + return; if ($this->hash !== null) { return; } @@ -92,6 +104,28 @@ class Repository $this->hash = $output; } + /** + * Populates $this->message + * + * @return void + */ + public function loadMessage() + { + $rev = (isset($this->hash)) ? $this->hash : 'HEAD'; + $output = $this->getVc()->getCommand('log') + ->setOption('oneline') + ->addArgument('-1') + ->addArgument($rev) + ->execute(); + $output = trim($output); + if (strpos($output, ' ') > 0) { + $output = substr($output, strpos($output, ' '), strlen($output)); + $this->message = trim($output); + } else { + $this->message = "This commit message intentionally left blank."; + } + } + public function loadById($id) { if (!is_numeric($id)) { @@ -114,28 +148,43 @@ class Repository */ public function getFiles() { - $files = glob($this->workDir . '/*'); + $files = $this->getFilePaths(); $arFiles = array(); - foreach ($files as $path) { - $arFiles[] = new File($path, $this); + foreach ($files as $name) { + $arFiles[] = new File($name, $this); } return $arFiles; } - public function getFileByName($name, $bHasToExist = true) + protected function getFilePaths() { - $base = basename($name); - if ($base != $name) { - throw new Exception('No directories supported for now'); + if ($this->hash === null) { + $hash = 'HEAD'; + } else { + $hash = $this->hash; } + $output = $this->getVc()->getCommand('ls-tree') + ->setOption('r') + ->setOption('name-only') + ->addArgument($hash) + ->execute(); + return explode("\n", trim($output)); + } + + public function getFileByName($name, $bHasToExist = true) + { + $name = Tools::sanitizeFilename($name); if ($name == '') { throw new Exception_Input('Empty file name given'); } - $path = $this->workDir . '/' . $base; - if ($bHasToExist && !is_readable($path)) { - 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($path, $this); + return new File($name, $this); } public function hasFile($name) @@ -156,10 +205,23 @@ class Repository */ public function delete() { + $db = new Database(); + $db->getIndexer()->deleteRepo($this); + return Tools::recursiveDelete($this->workDir) && Tools::recursiveDelete($this->gitDir); } + public function getTitle() + { + $desc = $this->getDescription(); + if (trim($desc) != '') { + return $desc; + } + + return 'paste #' . $this->id; + } + public function getDescription() { if (!is_readable($this->gitDir . '/description')) { @@ -177,12 +239,12 @@ class Repository * Get a link to the repository * * @param string $type Link type. Supported are: - * - "commit" * - "edit" * - "delete" * - "delete-confirm" * - "display" * - "fork" + * - "revision" * @param string $option * * @return string @@ -195,12 +257,14 @@ class Repository return '/' . $this->id; } else if ($type == 'fork') { return '/' . $this->id . '/fork'; + } else if ($type == 'doap') { + return '/' . $this->id . '/doap'; } else if ($type == 'delete') { return '/' . $this->id . '/delete'; } else if ($type == 'delete-confirm') { return '/' . $this->id . '/delete/confirm'; - } else if ($type == 'commit') { - return '/' . $this->id . '/' . $option; + } else if ($type == 'revision') { + return '/' . $this->id . '/rev/' . $option; } throw new Exception('Unknown link type'); } @@ -246,10 +310,19 @@ class Repository $commit->committerName = $arOutput[$current + 2]; $commit->committerEmail = $arOutput[$current + 3]; + if (substr($arOutput[$current + 4], 0, 1) != ' ') { + //commit without changed lines + $arCommits[] = $commit; + $current += 4; + continue; + } + $arLineParts = explode(' ', trim($arOutput[$current + 4])); $commit->filesChanged = $arLineParts[0]; $commit->linesAdded = $arLineParts[3]; - $commit->linesDeleted = $arLineParts[5]; + if (isset($arLineParts[5])) { + $commit->linesDeleted = $arLineParts[5]; + } $current += 6;