Junio C Hamano schrieb: > Credit for test script, motivation and initial patch goes to Thomas Rast, > but the bugs in the implementation of this patch are mine.. And with this squashed in it has fewer of them ;-) and is more portable. The bug was that /foo was incorrectly stripped from /foobar. -- Hannes diff --git a/path.c b/path.c index 78ab54a..3cb19c7 100644 --- a/path.c +++ b/path.c @@ -396,15 +396,15 @@ const char *make_relative_path(const char *abs, const char *base) static char buf[PATH_MAX + 1]; int i = 0, j = 0; - if (!base) + if (!base || !base[0]) return abs; while (base[i]) { - if (base[i] == '/') { - if (abs[j] != '/') + if (is_dir_sep(base[i])) { + if (!is_dir_sep(abs[j])) return abs; - while (base[i] == '/') + while (is_dir_sep(base[i])) i++; - while (abs[j] == '/') + while (is_dir_sep(abs[j])) j++; continue; } else if (abs[j] != base[i]) { @@ -413,7 +413,14 @@ const char *make_relative_path(const char *abs, const char *base) i++; j++; } - while (abs[j] == '/') + if ( + /* "/foo" is a prefix of "/foo" */ + abs[j] && + /* "/foo" is not a prefix of "/foobar" */ + !is_dir_sep(base[i-1]) && !is_dir_sep(abs[j]) + ) + return abs; + while (is_dir_sep(abs[j])) j++; if (!abs[j]) strcpy(buf, "."); -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html