Re: [PATCH 1/2] relative_path should honor dos_drive_prefix
- From
Jiang Xin <worldhello.net@gmail.com>
- Date
- Sep 17, 2013, 08:24 UTC
- Message-ID
- <CANYiYbH9pLMx4gu1qONhy-+++ojUhPSd9F=sdRTmGWH3pSUTqQ@mail.gmail.com>
- In-Reply-To
- <xmqq7gelmfm5.fsf@gitster.dls.corp.google.com>
2013/9/13 Junio C Hamano <gitster@pobox.com>:
Show 44 quoted lines
> Jiang Xin <worldhello.net@gmail.com> writes: > >> 2013/9/13 Junio C Hamano <gitster@pobox.com>: >>> >>> 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