X-Git-Url: https://git.cweiske.de/phorkie.git/blobdiff_plain/0bf9d11cf26314c7a3285a934c2faf3db50ec9ce..0e362c3a8a13e7e2ae7d5c1a5d2e5eaa163d153f:/src/phorkie/Repository.php diff --git a/src/phorkie/Repository.php b/src/phorkie/Repository.php index d82789d..9de2e1a 100644 --- a/src/phorkie/Repository.php +++ b/src/phorkie/Repository.php @@ -65,6 +65,16 @@ class Repository $this->loadMessage(); } + public function loadById($id) + { + if (!is_numeric($id)) { + throw new Exception_Input('Paste ID not numeric'); + } + $this->id = (int)$id; + $this->loadDirs(); + $this->loadHash(); + } + protected function loadDirs() { $gitDir = $GLOBALS['phorkie']['cfg']['gitdir'] . '/' . $this->id . '.git'; @@ -126,16 +136,6 @@ class Repository } } - public function loadById($id) - { - if (!is_numeric($id)) { - throw new Exception_Input('Paste ID not numeric'); - } - $this->id = (int)$id; - $this->loadDirs(); - $this->loadHash(); - } - public function getVc() { return new \VersionControl_Git($this->gitDir); @@ -144,7 +144,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 +156,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 +203,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 +249,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() @@ -274,19 +320,23 @@ class Repository public function getLink($type, $option = null, $full = false) { if ($type == 'edit') { - $link = '/' . $this->id . '/edit'; + $link = $this->id . '/edit'; } else if ($type == 'display') { - $link = '/' . $this->id; + $link = $this->id; } else if ($type == 'fork') { - $link = '/' . $this->id . '/fork'; + $link = $this->id . '/fork'; } else if ($type == 'doap') { - $link = '/' . $this->id . '/doap'; + $link = $this->id . '/doap'; } else if ($type == 'delete') { - $link = '/' . $this->id . '/delete'; + $link = $this->id . '/delete'; } else if ($type == 'delete-confirm') { - $link = '/' . $this->id . '/delete/confirm'; + $link = $this->id . '/delete/confirm'; + } else if ($type == 'remotefork') { + return 'web+fork:' . $this->getLink('display', null, true); } else if ($type == 'revision') { - $link = '/' . $this->id . '/rev/' . $option; + $link = $this->id . '/rev/' . $option; + } else if ($type == 'linkback') { + $link = $this->id . '/linkback'; } else { throw new Exception('Unknown link type'); } @@ -359,6 +409,14 @@ class Repository return $arCommits; } + + /** + * @return Repository_ConnectionInfo + */ + public function getConnectionInfo() + { + return new Repository_ConnectionInfo($this); + } } ?>