[PATCH] Use FIX_UTF8_MAC to enable conversion from UTF8-MAC to UTF8
From: Mark Junker <hidden>
Date: 2016-06-15 22:44:07
Subsystem:
kernel build + files below scripts/ (unless maintained elsewhere), the rest · Maintainers:
Nathan Chancellor, Nicolas Schier, Linus Torvalds
Use FIX_UTF8_MAC to enable conversion from UTF8-MAC to UTF8 for readdir and get_pathspec. I had to change get_pathspec too because otherwise git-add wouldn't work anymore because it uses the output of get_pathspec as strings to compare with the output of readdir. I'm quite unsure because this is my first patch for the git project and I have several questions: 1. Is FIX_UTF8_MAC the right name for this "feature"? 2. Do I have to introduce a configuration option for this "feature"? Signed-off-by: Mark Junker <redacted> --- Makefile | 5 +++++ compat/readdir.c | 26 ++++++++++++++++++++++++++ git-compat-util.h | 5 +++++ setup.c | 12 ++++++++++++ 4 files changed, 48 insertions(+), 0 deletions(-)
diff --git a/Makefile b/Makefile
index 5aac0c0..e55914e 100644
--- a/Makefile
+++ b/Makefile@@ -417,6 +417,7 @@ ifeq ($(uname_S),Darwin) endif NO_STRLCPY = YesPlease NO_MEMMEM = YesPlease + FIX_UTF8_MAC = YesPlease endif ifeq ($(uname_S),SunOS) NEEDS_SOCKET = YesPlease
@@ -616,6 +617,10 @@ ifdef NO_STRLCPY COMPAT_CFLAGS += -DNO_STRLCPY COMPAT_OBJS += compat/strlcpy.o endif +ifdef FIX_UTF8_MAC + COMPAT_CFLAGS += -DFIX_UTF8_MAC + COMPAT_OBJS += compat/readdir.o +endif ifdef NO_STRTOUMAX COMPAT_CFLAGS += -DNO_STRTOUMAX COMPAT_OBJS += compat/strtoumax.o
diff --git a/compat/readdir.c b/compat/readdir.c
new file mode 100644
index 0000000..045cfef
--- /dev/null
+++ b/compat/readdir.c@@ -0,0 +1,26 @@ +#include "../git-compat-util.h" +#include "../utf8.h" + +#undef readdir + +static struct dirent temp; + +struct dirent *gitreaddir(DIR *dirp) +{ + size_t utf8_len; + char *utf8; + struct dirent *result; + result = readdir(dirp); + if (result != NULL) { + memcpy(&temp, result, sizeof(struct dirent)); + utf8 = reencode_string(temp.d_name, "UTF8", "UTF8-MAC"); + if (utf8 != NULL) { + utf8_len = strlen(utf8); + temp.d_namlen = (u_int8_t) utf8_len; + memcpy(temp.d_name, utf8, utf8_len + 1); + free(utf8); + result = &temp; + } + } + return result; +}
diff --git a/git-compat-util.h b/git-compat-util.h
index b6ef544..cd0233d 100644
--- a/git-compat-util.h
+++ b/git-compat-util.h@@ -202,6 +202,11 @@ void *gitmemmem(const void *haystack, size_t haystacklen,
const void *needle, size_t needlelen);
#endif
+#ifdef FIX_UTF8_MAC
+#define readdir gitreaddir
+struct dirent *gitreaddir(DIR *dirp);
+#endif
+
#ifdef __GLIBC_PREREQ
#if __GLIBC_PREREQ(2, 1)
#define HAVE_STRCHRNULdiff --git a/setup.c b/setup.c
index adede16..4cec28b 100644
--- a/setup.c
+++ b/setup.c@@ -1,5 +1,8 @@ #include "cache.h" #include "dir.h" +#ifdef FIX_UTF8_MAC +#include "utf8.h" +#endif static int inside_git_dir = -1; static int inside_work_tree = -1;
@@ -131,6 +134,15 @@ const char **get_pathspec(const char *prefix, const char **pathspec)
p = pathspec;
prefixlen = prefix ? strlen(prefix) : 0;
do {
+#ifdef FIX_UTF8_MAC
+ /* Reencode as UTF8 (composed) to have a counterpart for the
+ * readdir-replacement on MacOS X.
+ */
+ char *utf8 = reencode_string(entry, "UTF8", "UTF8-MAC");
+ if (utf8 != NULL) {
+ entry = utf8;
+ }
+#endif
*p = prefix_path(prefix, prefixlen, entry);
} while ((entry = *++p) != NULL);
return (const char **) pathspec;
--
1.5.4.rc3.40.gebe4