[PATCH v4 0/4] Ensure that we can build without libgen.h
- From
Johannes Schindelin <johannes.schindelin@gmx.de>
- Date
- Jan 12, 2016, 07:57 UTC
- Message-ID
- <cover.1452585382.git.johannes.schindelin@gmx.de>
- In-Reply-To
- <cover.1452536924.git.johannes.schindelin@gmx.de>
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