Skip to content

Commit

Permalink
t0060: verify that basename() and dirname() work as expected
Browse files Browse the repository at this point in the history
Unfortunately, some libgen implementations yield outcomes different
from what Git expects. For example, mingw-w64-crt provides a basename()
function, that shortens `path0/` to `path`!

So let's verify that the basename() and dirname() functions we use
conform to what Git expects.

Derived-from-code-by: Ramsay Jones <ramsay@ramsayjones.plus.com>
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Johannes Schindelin authored and Junio C Hamano committed Jan 12, 2016
1 parent 824682a commit 7d1aaa6
Show file tree
Hide file tree
Showing 2 changed files with 169 additions and 0 deletions.
3 changes: 3 additions & 0 deletions t/t0060-path-utils.sh
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,9 @@ case $(uname -s) in
;;
esac

test_expect_success basename 'test-path-utils basename'
test_expect_success dirname 'test-path-utils dirname'

norm_path "" ""
norm_path . ""
norm_path ./ ""
Expand Down
166 changes: 166 additions & 0 deletions test-path-utils.c
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,166 @@ static void normalize_argv_string(const char **var, const char *input)
die("Bad value: %s\n", input);
}

struct test_data {
const char *from; /* input: transform from this ... */
const char *to; /* output: ... to this. */
};

static int test_function(struct test_data *data, char *(*func)(char *input),
const char *funcname)
{
int failed = 0, i;
char buffer[1024];
char *to;

for (i = 0; data[i].to; i++) {
if (!data[i].from)
to = func(NULL);
else {
strcpy(buffer, data[i].from);
to = func(buffer);
}
if (strcmp(to, data[i].to)) {
error("FAIL: %s(%s) => '%s' != '%s'\n",
funcname, data[i].from, to, data[i].to);
failed = 1;
}
}
return failed;
}

static struct test_data basename_data[] = {
/* --- POSIX type paths --- */
{ NULL, "." },
{ "", "." },
{ ".", "." },
{ "..", ".." },
{ "/", "/" },
#if defined(__CYGWIN__) && !defined(NO_LIBGEN_H)
{ "//", "//" },
{ "///", "//" },
{ "////", "//" },
#else
{ "//", "/" },
{ "///", "/" },
{ "////", "/" },
#endif
{ "usr", "usr" },
{ "/usr", "usr" },
{ "/usr/", "usr" },
{ "/usr//", "usr" },
{ "/usr/lib", "lib" },
{ "usr/lib", "lib" },
{ "usr/lib///", "lib" },

#if defined(__MINGW32__) || defined(_MSC_VER)

/* --- win32 type paths --- */
{ "\\usr", "usr" },
{ "\\usr\\", "usr" },
{ "\\usr\\\\", "usr" },
{ "\\usr\\lib", "lib" },
{ "usr\\lib", "lib" },
{ "usr\\lib\\\\\\", "lib" },
{ "C:/usr", "usr" },
{ "C:/usr", "usr" },
{ "C:/usr/", "usr" },
{ "C:/usr//", "usr" },
{ "C:/usr/lib", "lib" },
{ "C:usr/lib", "lib" },
{ "C:usr/lib///", "lib" },
{ "C:", "." },
{ "C:a", "a" },
{ "C:/", "/" },
{ "C:///", "/" },
#if defined(NO_LIBGEN_H)
{ "\\", "\\" },
{ "\\\\", "\\" },
{ "\\\\\\", "\\" },
#else

/* win32 platform variations: */
#if defined(__MINGW32__)
{ "\\", "/" },
{ "\\\\", "/" },
{ "\\\\\\", "/" },
#endif

#if defined(_MSC_VER)
{ "\\", "\\" },
{ "\\\\", "\\" },
{ "\\\\\\", "\\" },
#endif

#endif
#endif
{ NULL, NULL }
};

static struct test_data dirname_data[] = {
/* --- POSIX type paths --- */
{ NULL, "." },
{ "", "." },
{ ".", "." },
{ "..", "." },
{ "/", "/" },
{ "//", "//" },
#if defined(__CYGWIN__) && !defined(NO_LIBGEN_H)
{ "///", "//" },
{ "////", "//" },
#else
{ "///", "/" },
{ "////", "/" },
#endif
{ "usr", "." },
{ "/usr", "/" },
{ "/usr/", "/" },
{ "/usr//", "/" },
{ "/usr/lib", "/usr" },
{ "usr/lib", "usr" },
{ "usr/lib///", "usr" },

#if defined(__MINGW32__) || defined(_MSC_VER)

/* --- win32 type paths --- */
{ "\\", "\\" },
{ "\\\\", "\\\\" },
{ "\\usr", "\\" },
{ "\\usr\\", "\\" },
{ "\\usr\\\\", "\\" },
{ "\\usr\\lib", "\\usr" },
{ "usr\\lib", "usr" },
{ "usr\\lib\\\\\\", "usr" },
{ "C:a", "C:." },
{ "C:/", "C:/" },
{ "C:///", "C:/" },
{ "C:/usr", "C:/" },
{ "C:/usr/", "C:/" },
{ "C:/usr//", "C:/" },
{ "C:/usr/lib", "C:/usr" },
{ "C:usr/lib", "C:usr" },
{ "C:usr/lib///", "C:usr" },
{ "\\\\\\", "\\" },
{ "\\\\\\\\", "\\" },
#if defined(NO_LIBGEN_H)
{ "C:", "C:." },
#else

/* win32 platform variations: */
#if defined(__MINGW32__)
/* the following is clearly wrong ... */
{ "C:", "." },
#endif

#if defined(_MSC_VER)
{ "C:", "C:." },
#endif

#endif
#endif
{ NULL, NULL }
};

int main(int argc, char **argv)
{
if (argc == 3 && !strcmp(argv[1], "normalize_path_copy")) {
Expand Down Expand Up @@ -133,6 +293,12 @@ int main(int argc, char **argv)
return 0;
}

if (argc == 2 && !strcmp(argv[1], "basename"))
return test_function(basename_data, basename, argv[1]);

if (argc == 2 && !strcmp(argv[1], "dirname"))
return test_function(dirname_data, dirname, argv[1]);

fprintf(stderr, "%s: unknown function name: %s\n", argv[0],
argv[1] ? argv[1] : "(there was none)");
return 1;
Expand Down

0 comments on commit 7d1aaa6

Please sign in to comment.