aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xt/t0060-path-utils.sh37
-rw-r--r--test-path-utils.c25
2 files changed, 62 insertions, 0 deletions
diff --git a/t/t0060-path-utils.sh b/t/t0060-path-utils.sh
index 09a42a428..72e89ce71 100755
--- a/t/t0060-path-utils.sh
+++ b/t/t0060-path-utils.sh
@@ -12,6 +12,11 @@ norm_path() {
"test \"\$(test-path-utils normalize_path_copy '$1')\" = '$2'"
}
+relative_path() {
+ test_expect_success $4 "relative path: $1 $2 => $3" \
+ "test \"\$(test-path-utils relative_path '$1' '$2')\" = '$3'"
+}
+
# On Windows, we are using MSYS's bash, which mangles the paths.
# Absolute paths are anchored at the MSYS installation directory,
# which means that the path / accounts for this many characters:
@@ -183,4 +188,36 @@ test_expect_success SYMLINKS 'real path works on symlinks' '
test "$sym" = "$(test-path-utils real_path "$dir2/syml")"
'
+relative_path /a/b/c/ /a/b/ c/
+relative_path /a/b/c/ /a/b c/
+relative_path /a//b//c/ //a/b// c/ POSIX
+relative_path /a/b /a/b .
+relative_path /a/b/ /a/b .
+relative_path /a /a/b /a POSIX
+relative_path / /a/b/ / POSIX
+relative_path /a/c /a/b/ /a/c POSIX
+relative_path /a/c /a/b /a/c POSIX
+relative_path /x/y /a/b/ /x/y POSIX
+relative_path /a/b "<empty>" /a/b POSIX
+relative_path /a/b "<null>" /a/b POSIX
+relative_path a/b/c/ a/b/ c/
+relative_path a/b/c/ a/b c/
+relative_path a/b//c a//b c
+relative_path a/b/ a/b/ .
+relative_path a/b/ a/b .
+relative_path a a/b a # TODO: should be: ..
+relative_path x/y a/b x/y # TODO: should be: ../../x/y
+relative_path a/c a/b a/c # TODO: should be: ../c
+relative_path a/b "<empty>" a/b
+relative_path a/b "<null>" a/b
+relative_path "<empty>" /a/b "(empty)"
+relative_path "<empty>" "<empty>" "(empty)"
+relative_path "<empty>" "<null>" "(empty)"
+relative_path "<null>" "<empty>" "(null)"
+relative_path "<null>" "<null>" "(null)"
+
+test_expect_failure 'relative path: <null> /a/b => segfault' '
+ test-path-utils relative_path "<null>" "/a/b"
+'
+
test_done
diff --git a/test-path-utils.c b/test-path-utils.c
index 0092cbf35..8a6d22404 100644
--- a/test-path-utils.c
+++ b/test-path-utils.c
@@ -28,6 +28,19 @@ static int normalize_ceiling_entry(struct string_list_item *item, void *unused)
return 1;
}
+static void normalize_argv_string(const char **var, const char *input)
+{
+ if (!strcmp(input, "<null>"))
+ *var = NULL;
+ else if (!strcmp(input, "<empty>"))
+ *var = "";
+ else
+ *var = input;
+
+ if (*var && (**var == '<' || **var == '('))
+ die("Bad value: %s\n", input);
+}
+
int main(int argc, char **argv)
{
if (argc == 3 && !strcmp(argv[1], "normalize_path_copy")) {
@@ -103,6 +116,18 @@ int main(int argc, char **argv)
return 0;
}
+ if (argc == 4 && !strcmp(argv[1], "relative_path")) {
+ const char *in, *prefix, *rel;
+ normalize_argv_string(&in, argv[2]);
+ normalize_argv_string(&prefix, argv[3]);
+ rel = relative_path(in, prefix);
+ if (!rel)
+ puts("(null)");
+ else
+ puts(strlen(rel) > 0 ? rel : "(empty)");
+ return 0;
+ }
+
fprintf(stderr, "%s: unknown function name: %s\n", argv[0],
argv[1] ? argv[1] : "(there was none)");
return 1;