Add subcommand "relative_path" in test-path-utils, and add test cases
in t0060.

Signed-off-by: Jiang Xin <worldhello....@gmail.com>
---
 t/t0060-path-utils.sh | 23 +++++++++++++++++++++++
 test-path-utils.c     | 24 ++++++++++++++++++++++++
 2 files changed, 47 insertions(+)

diff --git a/t/t0060-path-utils.sh b/t/t0060-path-utils.sh
index 09a42..a51d7 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,22 @@ 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            ../
+relative_path /                /a/b/           ../../
+relative_path /a/c     /a/b/           ../c
+relative_path /a/c     /a/b            ../c
+relative_path /a/b     "(empty)"       /a/b
+relative_path /a/b     "(null)"        /a/b
+relative_path "(empty)"        /a/b            ./
+relative_path "(empty)"        "(empty)"       ./
+relative_path "(empty)"        "(null)"        ./
+relative_path "(null)" /a/b            ./
+relative_path "(null)" "(empty)"       ./
+relative_path "(null)" "(null)"        ./
+
 test_done
diff --git a/test-path-utils.c b/test-path-utils.c
index 0092cb..d759c 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 == '(') { \
+               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,17 @@ int main(int argc, char **argv)
                return 0;
        }
 
+       if (argc == 4 && !strcmp(argv[1], "relative_path")) {
+               struct strbuf sb = STRBUF_INIT;
+               const char *abs, *base, *rel;
+               PARSE_ARGV_STRING(abs, argv[2]);
+               PARSE_ARGV_STRING(base, argv[3]);
+               rel = relative_path(abs, base, &sb);
+               puts(rel ? rel : "(null)");
+               strbuf_release(&sb);
+               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.380.g956c2b2

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to