From: Torsten Bögershausen <tboegi@xxxxxx> When running under macOs a call to strbuf_getcwd() may return decomposed unicode. This could make `git ls-files` fail, see previous commit of t0050 The solution is to precompose the result of getcwd() if needed. One possible implementation would be to re-define getcwd() similar to opendir(), readdir() and closedir(). Since there is already a strbuf wrapper around getcwd(), and only this wrapper is used inside the whole codebase, equip strbuf_getcwd() with a call to the newly created function precompse_strbuf_if_needed(). Note that precompse_strbuf_if_needed() is a function under macOs, and is a "nop" on all other systems. Signed-off-by: Torsten Bögershausen <tboegi@xxxxxx> --- compat/precompose_utf8.c | 11 +++++++++++ compat/precompose_utf8.h | 1 + git-compat-util.h | 2 ++ strbuf.c | 1 + 4 files changed, 15 insertions(+) diff --git a/compat/precompose_utf8.c b/compat/precompose_utf8.c index 0bd5c24250..82ec2a1c5b 100644 --- a/compat/precompose_utf8.c +++ b/compat/precompose_utf8.c @@ -94,6 +94,17 @@ const char *precompose_string_if_needed(const char *in) return in; } +void precompse_strbuf_if_needed(struct strbuf *sb) +{ + char *buf_prec = (char *)precompose_string_if_needed(sb->buf); + if (buf_prec != sb->buf) { + size_t buf_prec_len = strlen(buf_prec); + free(strbuf_detach(sb, NULL)); + strbuf_attach(sb, buf_prec, buf_prec_len, buf_prec_len + 1); + } + +} + const char *precompose_argv_prefix(int argc, const char **argv, const char *prefix) { int i = 0; diff --git a/compat/precompose_utf8.h b/compat/precompose_utf8.h index fea06cf28a..fb17b1bd4a 100644 --- a/compat/precompose_utf8.h +++ b/compat/precompose_utf8.h @@ -30,6 +30,7 @@ typedef struct { const char *precompose_argv_prefix(int argc, const char **argv, const char *prefix); const char *precompose_string_if_needed(const char *in); +void precompse_strbuf_if_needed(struct strbuf *sb); void probe_utf8_pathname_composition(void); PREC_DIR *precompose_utf8_opendir(const char *dirname); diff --git a/git-compat-util.h b/git-compat-util.h index ca7678a379..80ae463410 100644 --- a/git-compat-util.h +++ b/git-compat-util.h @@ -344,6 +344,8 @@ static inline const char *precompose_string_if_needed(const char *in) return in; } +#define precompse_strbuf_if_needed(a) + #define probe_utf8_pathname_composition() #endif diff --git a/strbuf.c b/strbuf.c index 0d929e4e19..cefea6b75f 100644 --- a/strbuf.c +++ b/strbuf.c @@ -591,6 +591,7 @@ int strbuf_getcwd(struct strbuf *sb) for (;; guessed_len *= 2) { strbuf_grow(sb, guessed_len); if (getcwd(sb->buf, sb->alloc)) { + precompse_strbuf_if_needed(sb); strbuf_setlen(sb, strlen(sb->buf)); return 0; } -- 2.41.0.394.ge43f4fd0bd