2013/9/13 Junio C Hamano <gitster@xxxxxxxxx>: > Jiang Xin <worldhello.net@xxxxxxxxx> writes: > >> 2013/9/13 Junio C Hamano <gitster@xxxxxxxxx>: >>> >>> For systems that need POSIX escape hatch for Apollo Domain ;-), we >>> would need a bit more work. When both path1 and path2 begin with a >>> double-dash, we would need to check if they match up to the next >>> slash, so that >>> >>> - //host1/usr/src and //host1/usr/lib share the same root and the >>> former can be made to ../src relative to the latter; >>> >>> - //host1/usr/src and //host2/usr/lib are of separate roots. >>> >>> or something. >> >> But how could we know which platform supports network pathnames and >> needs such implementation. > > Near the end of > > http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.html#tag_04_12 > > is this: > > If a pathname begins with two successive <slash> characters, the > first component following the leading <slash> characters may be > interpreted in an implementation-defined manner, although more than > two leading <slash> characters shall be treated as a single <slash> > character. > > Two points to note are > > (1) Only paths that begin with exactly two slashes are special. > > (2) As it is "implementation-defined", we are not even allowed to > treat that //host1/usr/src and //host1/usr/lib as sharing "the > same root", and make the former to ../src relative to the > latter. > > So in the strictest sense, we do not have to bother. As long as we > make sure we do not molest anything that begins with exactly two > slashes. > I have checked the behavior of UNC path on Windows (msysGit): * I can cd to a UNC path: cd //server1/share1/path * can cd to other share: cd ../../share2/path * and can cd to other server's share: cd ../../../server2/share/path That means relative_path(path1, path2) support UNC paths out of the box. We only need to check both path1 and path2 are UNC paths, or both not. So, funciton “have_same_root" will write like this: +static int have_same_root(const char *path1, const char *path2) +{ + int is_abs1, is_abs2; + + is_abs1 = is_absolute_path(path1); + is_abs2 = is_absolute_path(path2); + if (is_abs1 && is_abs2) { + if (is_unc_path(path1) ^ is_unc_path(path2)) + return 0; + return tolower(path1[0]) == tolower(path2[0]); + } else { + return !is_abs1 && !is_abs2; + } +} -- Jiang Xin -- 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