Hi, here's the patch again - sent as an attachment. Sorry for any inconvenience. Regards, Mark
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