[PATCH v12 01/15] test: add test cases for relative_path
From: Jiang Xin <hidden>
Date: 2016-06-15 22:57:18
Subsystem:
the rest · Maintainer:
Linus Torvalds
Add subcommand "relative_path" in test-path-utils, and add test cases in t0060. Signed-off-by: Jiang Xin <redacted> --- t/t0060-path-utils.sh | 26 ++++++++++++++++++++++++++ test-path-utils.c | 25 +++++++++++++++++++++++++ 2 files changed, 51 insertions(+)
diff --git a/t/t0060-path-utils.sh b/t/t0060-path-utils.sh
index 09a42..2199b 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,25 @@ 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/ +relative_path /a/b /a/b . +relative_path /a/b/ /a/b . +relative_path /a /a/b /a +relative_path / /a/b/ / +relative_path /a/c /a/b/ /a/c +relative_path /a/c /a/b /a/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 0092cb..18267 100644
--- a/test-path-utils.c
+++ b/test-path-utils.c@@ -1,6 +1,19 @@ #include "cache.h" #include "string-list.h" +#define PARSE_ARGV_STRING(var, input) do { \ + if (!strcmp(input, "<null>")) { \ + var = NULL; \ + } else if (!strcmp(input, "<empty>")) { \ + var = ""; \ + } else if (*input == '<' || *input == '(') { \ + fprintf(stderr, "Bad value: %s\n", input); \ + return 1; \ + } else { \ + var = input; \ + } \ +} while (0) + /* * A "string_list_each_func_t" function that normalizes an entry from * GIT_CEILING_DIRECTORIES. If the path is unusable for some reason,
@@ -103,6 +116,18 @@ int main(int argc, char **argv) return 0; } + if (argc == 4 && !strcmp(argv[1], "relative_path")) { + const char *abs, *base, *rel; + PARSE_ARGV_STRING(abs, argv[2]); + PARSE_ARGV_STRING(base, argv[3]); + rel = relative_path(abs, base); + 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;
--
1.8.3.rc2.26.g7472058