TEST(get_relative_path)
{
+#ifdef _WIN32
+ CHECK_STR_EQ_FREE2("a", get_relative_path("C:/doesn't matter", "a"));
+ CHECK_STR_EQ_FREE2("a/b", get_relative_path("C:/doesn't matter", "a/b"));
+ CHECK_STR_EQ_FREE2(".", get_relative_path("C:/a", "C:/a"));
+ CHECK_STR_EQ_FREE2("..", get_relative_path("C:/a/b", "C:/a"));
+ CHECK_STR_EQ_FREE2("b", get_relative_path("C:/a", "C:/a/b"));
+ CHECK_STR_EQ_FREE2("b/c", get_relative_path("C:/a", "C:/a/b/c"));
+ CHECK_STR_EQ_FREE2("../c", get_relative_path("C:/a/b", "C:/a/c"));
+ CHECK_STR_EQ_FREE2("../c/d", get_relative_path("C:/a/b", "C:/a/c/d"));
+ CHECK_STR_EQ_FREE2("../../c/d", get_relative_path("C:/a/b/c", "C:/a/c/d"));
+ CHECK_STR_EQ_FREE2("../..", get_relative_path("C:/a/b", "C:/"));
+ CHECK_STR_EQ_FREE2("../../c", get_relative_path("C:/a/b", "C:/c"));
+ CHECK_STR_EQ_FREE2("a/b", get_relative_path("C:/", "C:/a/b"));
+#else
CHECK_STR_EQ_FREE2("a", get_relative_path("/doesn't matter", "a"));
CHECK_STR_EQ_FREE2("a/b", get_relative_path("/doesn't matter", "a/b"));
CHECK_STR_EQ_FREE2(".", get_relative_path("/a", "/a"));
CHECK_STR_EQ_FREE2("../..", get_relative_path("/a/b", "/"));
CHECK_STR_EQ_FREE2("../../c", get_relative_path("/a/b", "/c"));
CHECK_STR_EQ_FREE2("a/b", get_relative_path("/", "/a/b"));
+#endif
}
TEST(format_hash_as_string)
const char *p;
char *result;
- assert(from && from[0] == '/');
+ assert(from && is_absolute_path(from));
assert(to);
- if (!*to || *to != '/') {
+ if (!*to || !is_absolute_path(to)) {
return x_strdup(to);
}
+#ifdef _WIN32
+ // Both paths are absolute, drop the drive letters
+ assert(from[0] == to[0]); // Assume the same drive letter
+ from += 2;
+ to += 2;
+#endif
+
result = x_strdup("");
common_prefix_len = common_dir_prefix_length(from, to);
if (common_prefix_len > 0 || !str_eq(from, "/")) {