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 <mjscod@xxxxxx>
---
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_STRCHRNUL
diff --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
-
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html