X-Git-Url: https://git.cweiske.de/phorkie.git/blobdiff_plain/20ca4e9e509a111f8de0069feeac54e3b31098ee..808a3a5857c77ef99605fdfdde9b31b5c02e22c6:/src/phorkie/Repository.php diff --git a/src/phorkie/Repository.php b/src/phorkie/Repository.php index 815ef5e..013f017 100644 --- a/src/phorkie/Repository.php +++ b/src/phorkie/Repository.php @@ -96,7 +96,6 @@ class Repository public function loadHash() { - return; if ($this->hash !== null) { return; } @@ -114,6 +113,12 @@ class Repository $this->hash = $output; } + public function reloadHash() + { + $this->hash = null; + return $this->loadHash(); + } + /** * Populates $this->message * @@ -144,7 +149,7 @@ class Repository /** * Loads the list of files in this repository * - * @return File[] Array of files + * @return File[] Array of file objects */ public function getFiles() { @@ -156,6 +161,41 @@ class Repository return $arFiles; } + /** + * Decodes unicode characters in git filenames + * They begin and end with double quote characters, and may contain + * backslash + 3 letter octal code numbers representing the character. + * + * For example, + * > "t\303\244st.txt" + * means + * > täst.txt + * + * On the shell, you can pipe them into "printf" and have them decoded. + * + * @param string Encoded git file name + * + * @return string Decoded file name + */ + protected function decodeFileName($name) + { + $name = substr($name, 1, -1); + $name = str_replace('\"', '"', $name); + $name = preg_replace_callback( + '#\\\\[0-7]{3}#', + function ($ar) { + return chr(octdec(substr($ar[0], 1))); + }, + $name + ); + return $name; + } + + /** + * Return array with all file paths in this repository + * + * @return array + */ protected function getFilePaths() { if ($this->hash === null) { @@ -168,7 +208,13 @@ class Repository ->setOption('name-only') ->addArgument($hash) ->execute(); - return explode("\n", trim($output)); + $files = explode("\n", trim($output)); + foreach ($files as &$file) { + if ($file{0} == '"') { + $file = $this->decodeFileName($file); + } + } + return $files; } public function getFileByName($name, $bHasToExist = true) @@ -208,8 +254,13 @@ class Repository $db = new Database(); $db->getIndexer()->deleteRepo($this); - return Tools::recursiveDelete($this->workDir) + $bOk = Tools::recursiveDelete($this->workDir) && Tools::recursiveDelete($this->gitDir); + + $not = new Notificator(); + $not->delete($this); + + return $bOk; } public function getTitle() @@ -264,6 +315,7 @@ class Repository * - "delete" * - "delete-confirm" * - "display" + * - "embed" * - "fork" * - "revision" * @param string $option Additional link option, e.g. revision number @@ -275,6 +327,9 @@ class Repository { if ($type == 'edit') { $link = $this->id . '/edit'; + if ($option !== null) { + $link .= '/' . urlencode($option); + } } else if ($type == 'display') { $link = $this->id; } else if ($type == 'fork') { @@ -285,8 +340,20 @@ class Repository $link = $this->id . '/delete'; } else if ($type == 'delete-confirm') { $link = $this->id . '/delete/confirm'; + } else if ($type == 'embed') { + $link = $this->id . '/embed'; + } else if ($type == 'oembed-json') { + $link = 'oembed.php?format=json&url=' + . urlencode($this->getLink('display', null, true)); + } else if ($type == 'oembed-xml') { + $link = 'oembed.php?format=xml&url=' + . urlencode($this->getLink('display', null, true)); + } else if ($type == 'remotefork') { + return 'web+fork:' . $this->getLink('display', null, true); } else if ($type == 'revision') { $link = $this->id . '/rev/' . $option; + } else if ($type == 'linkback') { + $link = $this->id . '/linkback'; } else { throw new Exception('Unknown link type'); }