aboutsummaryrefslogtreecommitdiff
path: root/src/phorkie/Repository.php
diff options
context:
space:
mode:
authorChristian Weiske <cweiske@cweiske.de>2013-11-13 21:06:47 +0100
committerChristian Weiske <cweiske@cweiske.de>2013-11-13 21:06:47 +0100
commit7e53b1f3b455b88253bb82469d9d51925bcf16c7 (patch)
treea210ba3ebb729fa4bee403bf95f57c2c804aabd3 /src/phorkie/Repository.php
parentcdd2d6b071d66ab892b621106fb4f817a55dec9c (diff)
downloadphorkie-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.php38
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)