This mini series adds a fall-back for the `dirname()` function that we use e.g. in git-am. This is necessary because not all platforms have a working libgen.h. While at it, we ensure that our basename() drop-in conforms to the POSIX specifications. In addition to Eric's style improvement, v4 also fixes the signature of skip_dos_drive_prefix() in the non-Windows case. Johannes Schindelin (4): Refactor skipping DOS drive prefixes compat/basename: make basename() conform to POSIX Provide a dirname() function when NO_LIBGEN_H=YesPlease t0060: verify that basename() and dirname() work as expected compat/basename.c | 66 ++++++++++++++++++-- compat/mingw.c | 14 ++--- compat/mingw.h | 10 ++- git-compat-util.h | 10 +++ path.c | 14 ++--- t/t0060-path-utils.sh | 3 + test-path-utils.c | 166 ++++++++++++++++++++++++++++++++++++++++++++++++++ 7 files changed, 259 insertions(+), 24 deletions(-) Interdiff vs v3: diff --git a/compat/basename.c b/compat/basename.c index 0a2ed25..96bd953 100644 --- a/compat/basename.c +++ b/compat/basename.c @@ -29,20 +29,15 @@ char *gitbasename (char *path) char *gitdirname(char *path) { + static struct strbuf buf = STRBUF_INIT; char *p = path, *slash = NULL, c; int dos_drive_prefix; if (!p) return "."; - if ((dos_drive_prefix = skip_dos_drive_prefix(&p)) && !*p) { - static struct strbuf buf = STRBUF_INIT; - -dot: - strbuf_reset(&buf); - strbuf_addf(&buf, "%.*s.", dos_drive_prefix, path); - return buf.buf; - } + if ((dos_drive_prefix = skip_dos_drive_prefix(&p)) && !*p) + goto dot; /* * POSIX.1-2001 says dirname("/") should return "/", and dirname("//") @@ -64,8 +59,13 @@ dot: slash = tentative; } - if (!slash) - goto dot; - *slash = '\0'; - return path; + if (slash) { + *slash = '\0'; + return path; + } + +dot: + strbuf_reset(&buf); + strbuf_addf(&buf, "%.*s.", dos_drive_prefix, path); + return buf.buf; } diff --git a/git-compat-util.h b/git-compat-util.h index 94f311a..5f72f1c 100644 --- a/git-compat-util.h +++ b/git-compat-util.h @@ -338,7 +338,7 @@ static inline int git_has_dos_drive_prefix(const char *path) #endif #ifndef skip_dos_drive_prefix -static inline int git_skip_dos_drive_prefix(const char **path) +static inline int git_skip_dos_drive_prefix(char **path) { return 0; } -- 2.6.3.windows.1.300.g1c25e49 -- 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