diff options
| author | Christian Weiske <cweiske@cweiske.de> | 2013-11-13 21:06:47 +0100 |
|---|---|---|
| committer | Christian Weiske <cweiske@cweiske.de> | 2013-11-13 21:06:47 +0100 |
| commit | 7e53b1f3b455b88253bb82469d9d51925bcf16c7 (patch) | |
| tree | a210ba3ebb729fa4bee403bf95f57c2c804aabd3 /src/phorkie/Repository.php | |
| parent | cdd2d6b071d66ab892b621106fb4f817a55dec9c (diff) | |
| download | phorkie-7e53b1f3b455b88253bb82469d9d51925bcf16c7.tar.gz phorkie-7e53b1f3b455b88253bb82469d9d51925bcf16c7.zip | |
support utf-8 characters in file names
Diffstat (limited to 'src/phorkie/Repository.php')
| -rw-r--r-- | src/phorkie/Repository.php | 38 |
1 files changed, 37 insertions, 1 deletions
diff --git a/src/phorkie/Repository.php b/src/phorkie/Repository.php index f45c76f..7428c8a 100644 --- a/src/phorkie/Repository.php +++ b/src/phorkie/Repository.php @@ -156,6 +156,36 @@ 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; + } + protected function getFilePaths() { if ($this->hash === null) { @@ -168,7 +198,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) |
