2013/9/13 Junio C Hamano <[email protected]>:
> Jiang Xin <[email protected]> writes:
>
>> 2013/9/13 Junio C Hamano <[email protected]>:
>>>
>>> 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 [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html