650 lines
26 KiB
Diff
650 lines
26 KiB
Diff
Don't support DOS paths for Cygwin.
|
|
|
|
From: David Rothenberger <daveroth@acm.org>
|
|
|
|
* But do support a little UNC.
|
|
---
|
|
subversion/libsvn_subr/dirent_uri.c | 55 +++++---
|
|
subversion/tests/libsvn_subr/dirent_uri-test.c | 158 +++++++++++++++++++++---
|
|
subversion/tests/libsvn_subr/path-test.c | 10 +-
|
|
3 files changed, 181 insertions(+), 42 deletions(-)
|
|
|
|
diff --git a/subversion/libsvn_subr/dirent_uri.c b/subversion/libsvn_subr/dirent_uri.c
|
|
index 059734c..38e4afb 100644
|
|
--- a/subversion/libsvn_subr/dirent_uri.c
|
|
+++ b/subversion/libsvn_subr/dirent_uri.c
|
|
@@ -56,7 +56,7 @@
|
|
|
|
/* This check must match the check on top of dirent_uri-tests.c and
|
|
path-tests.c */
|
|
-#if defined(WIN32) || defined(__CYGWIN__) || defined(__OS2__)
|
|
+#if defined(WIN32) || defined(__OS2__)
|
|
#define SVN_USE_DOS_PATHS
|
|
#endif
|
|
|
|
@@ -125,6 +125,7 @@ canonicalize_to_upper(char c)
|
|
static apr_size_t
|
|
dirent_root_length(const char *dirent, apr_size_t len)
|
|
{
|
|
+#if defined(SVN_USE_DOS_PATHS) || defined(__CYGWIN__)
|
|
#ifdef SVN_USE_DOS_PATHS
|
|
if (len >= 2 && dirent[1] == ':' &&
|
|
((dirent[0] >= 'A' && dirent[0] <= 'Z') ||
|
|
@@ -132,6 +133,7 @@ dirent_root_length(const char *dirent, apr_size_t len)
|
|
{
|
|
return (len > 2 && dirent[2] == '/') ? 3 : 2;
|
|
}
|
|
+#endif
|
|
|
|
if (len > 2 && dirent[0] == '/' && dirent[1] == '/')
|
|
{
|
|
@@ -141,7 +143,7 @@ dirent_root_length(const char *dirent, apr_size_t len)
|
|
i++;
|
|
|
|
if (i == len)
|
|
- return len; /* Cygwin drive alias, invalid path on WIN32 */
|
|
+ return 1;
|
|
|
|
i++; /* Skip '/' */
|
|
|
|
@@ -449,7 +451,7 @@ canonicalize(const char **canonical_path,
|
|
{
|
|
*(dst++) = *(src++);
|
|
|
|
-#ifdef SVN_USE_DOS_PATHS
|
|
+#if defined(SVN_USE_DOS_PATHS) || defined(__CYGWIN__)
|
|
/* On Windows permit two leading separator characters which means an
|
|
* UNC path. */
|
|
if ((type == type_dirent) && *src == '/')
|
|
@@ -551,7 +553,7 @@ canonicalize(const char **canonical_path,
|
|
|
|
*dst = '\0';
|
|
|
|
-#ifdef SVN_USE_DOS_PATHS
|
|
+#if defined(SVN_USE_DOS_PATHS) || defined(__CYGWIN__)
|
|
/* Skip leading double slashes when there are less than 2
|
|
* canon segments. UNC paths *MUST* have two segments. */
|
|
if ((type == type_dirent) && canon[0] == '/' && canon[1] == '/')
|
|
@@ -689,7 +691,7 @@ get_longest_ancestor_length(path_type_t types,
|
|
apr_size_t path1_len, path2_len;
|
|
apr_size_t i = 0;
|
|
apr_size_t last_dirsep = 0;
|
|
-#ifdef SVN_USE_DOS_PATHS
|
|
+#if defined(SVN_USE_DOS_PATHS) || defined(__CYGWIN__)
|
|
svn_boolean_t unc = FALSE;
|
|
#endif
|
|
|
|
@@ -722,7 +724,7 @@ get_longest_ancestor_length(path_type_t types,
|
|
return 0;
|
|
|
|
/* Handle some windows specific cases */
|
|
-#ifdef SVN_USE_DOS_PATHS
|
|
+#if defined(SVN_USE_DOS_PATHS) || defined(__CYGWIN__)
|
|
if (types == type_dirent)
|
|
{
|
|
/* don't count the '//' from UNC paths */
|
|
@@ -732,6 +734,7 @@ get_longest_ancestor_length(path_type_t types,
|
|
unc = TRUE;
|
|
}
|
|
|
|
+#ifdef SVN_USE_DOS_PATHS
|
|
/* X:/ and X:/foo */
|
|
if (i == 3 && path1[2] == '/' && path1[1] == ':')
|
|
return i;
|
|
@@ -749,8 +752,9 @@ get_longest_ancestor_length(path_type_t types,
|
|
/* X: and X:foo */
|
|
if (path1[i - 1] == ':' || path2[i - 1] == ':')
|
|
return i;
|
|
- }
|
|
#endif /* SVN_USE_DOS_PATHS */
|
|
+ }
|
|
+#endif /* defined(SVN_USE_DOS_PATHS) || defined(__CYGWIN__) */
|
|
|
|
/* last_dirsep is now the offset of the last directory separator we
|
|
crossed before reaching a non-matching byte. i is the offset of
|
|
@@ -765,18 +769,20 @@ get_longest_ancestor_length(path_type_t types,
|
|
{
|
|
/* Nothing in common but the root folder '/' or 'X:/' for Windows
|
|
dirents. */
|
|
-#ifdef SVN_USE_DOS_PATHS
|
|
+#if defined(SVN_USE_DOS_PATHS) || defined(__CYGWIN__)
|
|
if (! unc)
|
|
{
|
|
+#ifdef SVN_USE_DOS_PATHS
|
|
/* X:/foo and X:/bar returns X:/ */
|
|
if ((types == type_dirent) &&
|
|
last_dirsep == 2 && path1[1] == ':' && path1[2] == '/'
|
|
&& path2[1] == ':' && path2[2] == '/')
|
|
return 3;
|
|
#endif /* SVN_USE_DOS_PATHS */
|
|
+#endif /* defined(SVN_USE_DOS_PATHS) || defined(__CYGWIN__) */
|
|
if (last_dirsep == 0 && path1[0] == '/' && path2[0] == '/')
|
|
return 1;
|
|
-#ifdef SVN_USE_DOS_PATHS
|
|
+#if defined(SVN_USE_DOS_PATHS) || defined(__CYGWIN__)
|
|
}
|
|
#endif
|
|
}
|
|
@@ -952,7 +958,8 @@ svn_relpath__make_internal(const char **internal_style_relpath,
|
|
svn_boolean_t
|
|
svn_dirent_is_root(const char *dirent, apr_size_t len)
|
|
{
|
|
-#ifdef SVN_USE_DOS_PATHS
|
|
+#if defined(SVN_USE_DOS_PATHS) || defined(__CYGWIN__)
|
|
+#ifndef __CYGWIN__
|
|
/* On Windows and Cygwin, 'H:' or 'H:/' (where 'H' is any letter)
|
|
are also root directories */
|
|
if ((len == 2 || ((len == 3) && (dirent[2] == '/'))) &&
|
|
@@ -960,9 +967,9 @@ svn_dirent_is_root(const char *dirent, apr_size_t len)
|
|
((dirent[0] >= 'A' && dirent[0] <= 'Z') ||
|
|
(dirent[0] >= 'a' && dirent[0] <= 'z')))
|
|
return TRUE;
|
|
+#endif
|
|
|
|
- /* On Windows and Cygwin //server/share is a root directory,
|
|
- and on Cygwin //drive is a drive alias */
|
|
+ /* On Windows and Cygwin //server/share is a root directory */
|
|
if (len >= 2 && dirent[0] == '/' && dirent[1] == '/'
|
|
&& dirent[len - 1] != '/')
|
|
{
|
|
@@ -977,11 +984,7 @@ svn_dirent_is_root(const char *dirent, apr_size_t len)
|
|
return FALSE;
|
|
}
|
|
}
|
|
-#ifdef __CYGWIN__
|
|
- return (segments <= 1);
|
|
-#else
|
|
return (segments == 1); /* //drive is invalid on plain Windows */
|
|
-#endif
|
|
}
|
|
#endif
|
|
|
|
@@ -1822,7 +1825,7 @@ svn_dirent_is_canonical(const char *dirent, apr_pool_t *scratch_pool)
|
|
if (*ptr == '/')
|
|
{
|
|
ptr++;
|
|
-#ifdef SVN_USE_DOS_PATHS
|
|
+#if defined(SVN_USE_DOS_PATHS) || defined(__CYGWIN__)
|
|
/* Check for UNC paths */
|
|
if (*ptr == '/')
|
|
{
|
|
@@ -2509,7 +2512,7 @@ svn_uri_get_dirent_from_file_url(const char **dirent,
|
|
|
|
/* Duplicate the URL, starting at the top of the path.
|
|
At the same time, we URI-decode the path. */
|
|
-#ifdef SVN_USE_DOS_PATHS
|
|
+#if defined(SVN_USE_DOS_PATHS) || defined(__CYGWIN__)
|
|
/* On Windows, we'll typically have to skip the leading / if the
|
|
path starts with a drive letter. Like most Web browsers, We
|
|
support two variants of this scheme:
|
|
@@ -2526,10 +2529,11 @@ svn_uri_get_dirent_from_file_url(const char **dirent,
|
|
even if the path looks like it starts with a drive letter.
|
|
*/
|
|
{
|
|
- static const char valid_drive_letters[] =
|
|
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
|
|
/* Casting away const! */
|
|
char *dup_path = (char *)svn_path_uri_decode(path, pool);
|
|
+#ifdef SVN_USE_DOS_PATHS
|
|
+ static const char valid_drive_letters[] =
|
|
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
|
|
|
|
/* This check assumes ':' and '|' are already decoded! */
|
|
if (!hostname && dup_path[1] && strchr(valid_drive_letters, dup_path[1])
|
|
@@ -2562,6 +2566,7 @@ svn_uri_get_dirent_from_file_url(const char **dirent,
|
|
dup_path[2] = '/'; /* Ensure not relative for '\' after drive! */
|
|
}
|
|
}
|
|
+#endif
|
|
if (hostname)
|
|
{
|
|
if (dup_path[0] == '/' && dup_path[1] == '\0')
|
|
@@ -2575,7 +2580,7 @@ svn_uri_get_dirent_from_file_url(const char **dirent,
|
|
else
|
|
*dirent = dup_path;
|
|
}
|
|
-#else /* !SVN_USE_DOS_PATHS */
|
|
+#else /* !(defined(SVN_USE_DOS_PATHS) || defined(__CYGWIN__)) */
|
|
/* Currently, the only hostnames we are allowing on non-Win32 platforms
|
|
are the empty string and 'localhost'. */
|
|
if (hostname)
|
|
@@ -2603,7 +2608,15 @@ svn_uri_get_file_url_from_dirent(const char **url,
|
|
if (dirent[0] == '/' && dirent[1] == '\0')
|
|
dirent = NULL; /* "file://" is the canonical form of "file:///" */
|
|
|
|
+#ifdef __CYGWIN__
|
|
+ if (dirent != NULL && dirent[0] == '/' && dirent[1] == '/')
|
|
+ /* Handle UNC paths //server/share -> file://server/share */
|
|
+ *url = apr_pstrcat(pool, "file:", dirent, NULL);
|
|
+ else
|
|
+ *url = apr_pstrcat(pool, "file://", dirent, (char *)NULL);
|
|
+#else
|
|
*url = apr_pstrcat(pool, "file://", dirent, SVN_VA_NULL);
|
|
+#endif
|
|
#else
|
|
if (dirent[0] == '/')
|
|
{
|
|
diff --git a/subversion/tests/libsvn_subr/dirent_uri-test.c b/subversion/tests/libsvn_subr/dirent_uri-test.c
|
|
index 9afc5b6..a679344 100644
|
|
--- a/subversion/tests/libsvn_subr/dirent_uri-test.c
|
|
+++ b/subversion/tests/libsvn_subr/dirent_uri-test.c
|
|
@@ -45,7 +45,7 @@
|
|
#define SVN_EMPTY_PATH ""
|
|
|
|
/* This check must match the check on top of dirent_uri.c and path-tests.c */
|
|
-#if defined(WIN32) || defined(__CYGWIN__) || defined(__OS2__)
|
|
+#if defined(WIN32) || defined(__OS2__)
|
|
#define SVN_USE_DOS_PATHS
|
|
#endif
|
|
|
|
@@ -65,7 +65,7 @@ test_dirent_is_root(apr_pool_t *pool)
|
|
{ "/foo/bar", FALSE },
|
|
{ "/foo", FALSE },
|
|
{ "", FALSE },
|
|
-#ifdef SVN_USE_DOS_PATHS
|
|
+#if defined(SVN_USE_DOS_PATHS)
|
|
{ "X:/foo", FALSE },
|
|
{ "X:/", TRUE },
|
|
{ "X:foo", FALSE }, /* Based on non absolute root */
|
|
@@ -74,6 +74,14 @@ test_dirent_is_root(apr_pool_t *pool)
|
|
{ "//srv/shr/fld", FALSE },
|
|
{ "//srv/s r", TRUE },
|
|
{ "//srv/s r/fld", FALSE },
|
|
+#elif defined(__CYGWIN__)
|
|
+ { "/", TRUE },
|
|
+ { "/X:foo", FALSE },
|
|
+ { "/X:", FALSE },
|
|
+ { "//srv/shr", TRUE },
|
|
+ { "//srv/shr/fld", FALSE },
|
|
+ { "//srv/s r", TRUE },
|
|
+ { "//srv/s r/fld", FALSE },
|
|
#else /* !SVN_USE_DOS_PATHS */
|
|
{ "/", TRUE },
|
|
{ "/X:foo", FALSE },
|
|
@@ -145,7 +153,7 @@ test_dirent_is_absolute(apr_pool_t *pool)
|
|
{ "foo/bar", FALSE },
|
|
{ "foo", FALSE },
|
|
{ "", FALSE },
|
|
-#ifdef SVN_USE_DOS_PATHS
|
|
+#if defined(SVN_USE_DOS_PATHS)
|
|
{ "/foo/bar", FALSE },
|
|
{ "/foo", FALSE },
|
|
{ "/", FALSE },
|
|
@@ -157,6 +165,18 @@ test_dirent_is_absolute(apr_pool_t *pool)
|
|
{ "//srv/shr/fld", TRUE },
|
|
{ "//srv/s r", TRUE },
|
|
{ "//srv/s r/fld", TRUE },
|
|
+#elif defined(__CYGWIN__)
|
|
+ { "/foo/bar", TRUE },
|
|
+ { "/foo", TRUE },
|
|
+ { "/", TRUE },
|
|
+ { "C:/foo", FALSE },
|
|
+ { "C:/", FALSE },
|
|
+ { "c:/", FALSE },
|
|
+ { "c:/foo", FALSE },
|
|
+ { "//srv/shr", TRUE },
|
|
+ { "//srv/shr/fld", TRUE },
|
|
+ { "//srv/s r", TRUE },
|
|
+ { "//srv/s r/fld", TRUE },
|
|
#else /* !SVN_USE_DOS_PATHS */
|
|
{ "/foo/bar", TRUE },
|
|
{ "/foo", TRUE },
|
|
@@ -228,7 +248,7 @@ test_dirent_join(apr_pool_t *pool)
|
|
{ SVN_EMPTY_PATH, "/abc", "/abc" },
|
|
{ SVN_EMPTY_PATH, SVN_EMPTY_PATH, SVN_EMPTY_PATH },
|
|
{ "/", "/", "/" },
|
|
-#ifdef SVN_USE_DOS_PATHS
|
|
+#if defined(SVN_USE_DOS_PATHS)
|
|
{ "X:/", SVN_EMPTY_PATH, "X:/" },
|
|
{ "X:/", "abc", "X:/abc" },
|
|
{ "X:/", "/def", "X:/def" },
|
|
@@ -251,6 +271,14 @@ test_dirent_join(apr_pool_t *pool)
|
|
{ "aa", "A:", "A:" },
|
|
{ "aa", "A:file", "A:file"},
|
|
{ "A:", "/", "A:/" },
|
|
+#elif defined(__CYGWIN__)
|
|
+ { "X:abc", "X:/def", "X:abc/X:/def" },
|
|
+ { "X:","abc", "X:/abc" },
|
|
+ { "X:/abc", "X:/def", "X:/abc/X:/def" },
|
|
+ { "//srv/shr", "fld", "//srv/shr/fld" },
|
|
+ { "//srv/shr/fld", "subfld", "//srv/shr/fld/subfld" },
|
|
+ { "//srv/shr/fld", "//srv/shr", "//srv/shr" },
|
|
+ { "//srv/s r", "fld", "//srv/s r/fld" },
|
|
#else /* !SVN_USE_DOS_PATHS */
|
|
{ "X:abc", "X:/def", "X:abc/X:/def" },
|
|
{ "X:","abc", "X:/abc" },
|
|
@@ -319,7 +347,7 @@ test_dirent_join(apr_pool_t *pool)
|
|
TEST_MANY((pool, SVN_EMPTY_PATH, "/", SVN_EMPTY_PATH, SVN_VA_NULL), "/");
|
|
TEST_MANY((pool, SVN_EMPTY_PATH, SVN_EMPTY_PATH, "/", SVN_VA_NULL), "/");
|
|
|
|
-#ifdef SVN_USE_DOS_PATHS
|
|
+#if defined(SVN_USE_DOS_PATHS)
|
|
TEST_MANY((pool, "X:/", "def", "ghi", SVN_VA_NULL), "X:/def/ghi");
|
|
TEST_MANY((pool, "abc", "X:/", "ghi", SVN_VA_NULL), "X:/ghi");
|
|
TEST_MANY((pool, "abc", "def", "X:/", SVN_VA_NULL), "X:/");
|
|
@@ -348,6 +376,17 @@ test_dirent_join(apr_pool_t *pool)
|
|
TEST_MANY((pool, "abcd", "/dir", "A:", "file", SVN_VA_NULL), "A:file");
|
|
TEST_MANY((pool, "abcd", "A:", "/dir", "file", SVN_VA_NULL), "A:/dir/file");
|
|
|
|
+#elif defined(__CYGWIN__)
|
|
+ TEST_MANY((pool, "X:", "def", "ghi", SVN_VA_NULL), "X:/def/ghi");
|
|
+ TEST_MANY((pool, "X:", SVN_EMPTY_PATH, "ghi", SVN_VA_NULL), "X:/ghi");
|
|
+ TEST_MANY((pool, "X:", "def", SVN_EMPTY_PATH, SVN_VA_NULL), "X:/def");
|
|
+ TEST_MANY((pool, SVN_EMPTY_PATH, "X:", "ghi", SVN_VA_NULL), "X:/ghi");
|
|
+ TEST_MANY((pool, "//srv/shr", "def", "ghi", SVN_VA_NULL), "//srv/shr/def/ghi");
|
|
+ TEST_MANY((pool, "//srv/shr/fld", "def", "ghi", SVN_VA_NULL), "//srv/shr/fld/def/ghi");
|
|
+ TEST_MANY((pool, "//srv/shr/fld", "def", "//srv/shr", SVN_VA_NULL), "//srv/shr");
|
|
+ TEST_MANY((pool, "//srv/s r/fld", "def", "//srv/s r", SVN_VA_NULL), "//srv/s r");
|
|
+ TEST_MANY((pool, SVN_EMPTY_PATH, "//srv/shr/fld", "def", "ghi", SVN_VA_NULL), "//srv/shr/fld/def/ghi");
|
|
+ TEST_MANY((pool, SVN_EMPTY_PATH, "//srv/shr/fld", "def", "//srv/shr", SVN_VA_NULL), "//srv/shr");
|
|
#else /* !SVN_USE_DOS_PATHS */
|
|
TEST_MANY((pool, "X:", "def", "ghi", SVN_VA_NULL), "X:/def/ghi");
|
|
TEST_MANY((pool, "X:", SVN_EMPTY_PATH, "ghi", SVN_VA_NULL), "X:/ghi");
|
|
@@ -423,7 +462,7 @@ test_dirent_basename(apr_pool_t *pool)
|
|
{ "/", "" },
|
|
{ SVN_EMPTY_PATH, SVN_EMPTY_PATH },
|
|
{ "X:/abc", "abc" },
|
|
-#ifdef SVN_USE_DOS_PATHS
|
|
+#if defined(SVN_USE_DOS_PATHS)
|
|
{ "X:", "" },
|
|
{ "X:/", "" },
|
|
{ "X:abc", "abc" },
|
|
@@ -431,6 +470,13 @@ test_dirent_basename(apr_pool_t *pool)
|
|
{ "//srv/shr/fld", "fld" },
|
|
{ "//srv/shr/fld/subfld", "subfld" },
|
|
{ "//srv/s r/fld", "fld" },
|
|
+#elif defined(__CYGWIN__)
|
|
+ { "X:", "X:" },
|
|
+ { "X:abc", "X:abc" },
|
|
+ { "//srv/shr", "" },
|
|
+ { "//srv/shr/fld", "fld" },
|
|
+ { "//srv/shr/fld/subfld", "subfld" },
|
|
+ { "//srv/s r/fld", "fld" },
|
|
#else /* !SVN_USE_DOS_PATHS */
|
|
{ "X:", "X:" },
|
|
{ "X:abc", "X:abc" },
|
|
@@ -540,7 +586,7 @@ test_dirent_dirname(apr_pool_t *pool)
|
|
{ "/", "/" },
|
|
{ SVN_EMPTY_PATH, SVN_EMPTY_PATH },
|
|
{ "X:abc/def", "X:abc" },
|
|
-#ifdef SVN_USE_DOS_PATHS
|
|
+#if defined(SVN_USE_DOS_PATHS)
|
|
{ "X:/", "X:/" },
|
|
{ "X:/abc", "X:/" },
|
|
{ "X:abc", "X:" },
|
|
@@ -549,6 +595,14 @@ test_dirent_dirname(apr_pool_t *pool)
|
|
{ "//srv/shr/fld", "//srv/shr" },
|
|
{ "//srv/shr/fld/subfld", "//srv/shr/fld" },
|
|
{ "//srv/s r/fld", "//srv/s r" },
|
|
+#elif defined(__CYGWIN__)
|
|
+ /* on non-Windows platforms, ':' is allowed in pathnames */
|
|
+ { "X:", "" },
|
|
+ { "X:abc", "" },
|
|
+ { "//srv/shr", "//srv/shr" },
|
|
+ { "//srv/shr/fld", "//srv/shr" },
|
|
+ { "//srv/shr/fld/subfld", "//srv/shr/fld" },
|
|
+ { "//srv/s r/fld", "//srv/s r" },
|
|
#else /* !SVN_USE_DOS_PATHS */
|
|
/* on non-Windows platforms, ':' is allowed in pathnames */
|
|
{ "X:", "" },
|
|
@@ -695,7 +749,9 @@ test_dirent_canonicalize(apr_pool_t *pool)
|
|
{ "x:/", "X:/" },
|
|
{ "x:", "X:" },
|
|
{ "x:AAAAA", "X:AAAAA" },
|
|
- /* We permit UNC dirents on Windows. By definition UNC
|
|
+#endif /* SVN_USE_DOS_PATHS */
|
|
+#if defined(SVN_USE_DOS_PATHS) || defined(__CYGWIN__)
|
|
+ /* We permit UNC dirents on Windows and Cygwin. By definition UNC
|
|
* dirents must have two components so we should remove the
|
|
* double slash if there is only one component. */
|
|
{ "//hst/foo", "//hst/foo" },
|
|
@@ -706,7 +762,7 @@ test_dirent_canonicalize(apr_pool_t *pool)
|
|
{ "//SERVER/SHare/", "//server/SHare" },
|
|
{ "//srv/s r", "//srv/s r" },
|
|
{ "//srv/s r/qq", "//srv/s r/qq" },
|
|
-#endif /* SVN_USE_DOS_PATHS */
|
|
+#endif /* defined(SVN_USE_DOS_PATHS) || defined(__CYGWIN__) */
|
|
};
|
|
|
|
for (t = tests; t < tests + COUNT_OF(tests); t++)
|
|
@@ -1077,7 +1133,7 @@ test_dirent_is_canonical(apr_pool_t *pool)
|
|
{ "X:foo", TRUE },
|
|
{ "X:foo/", FALSE },
|
|
{ "file with spaces", TRUE },
|
|
-#ifdef SVN_USE_DOS_PATHS
|
|
+#if defined(SVN_USE_DOS_PATHS)
|
|
{ "X:/", TRUE },
|
|
{ "X:/foo", TRUE },
|
|
{ "X:", TRUE },
|
|
@@ -1096,6 +1152,22 @@ test_dirent_is_canonical(apr_pool_t *pool)
|
|
{ "//server/SHare", TRUE },
|
|
{ "//SERVER/SHare", FALSE },
|
|
{ "//srv/SH RE", TRUE },
|
|
+#elif defined(__CYGWIN__)
|
|
+ { "X:/", FALSE },
|
|
+ /* Some people use colons in their filenames. */
|
|
+ { ":", TRUE },
|
|
+ { ".:", TRUE },
|
|
+ { "foo/.:", TRUE },
|
|
+ /* We permit UNC dirents on Cygwin. By definition UNC
|
|
+ * dirents must have two components so we should remove the
|
|
+ * double slash if there is only one component. */
|
|
+ { "//hst", FALSE },
|
|
+ { "//hst/./", FALSE },
|
|
+ { "//server/share/", FALSE },
|
|
+ { "//server/share", TRUE },
|
|
+ { "//server/SHare", TRUE },
|
|
+ { "//SERVER/SHare", FALSE },
|
|
+ { "//srv/SH RE", TRUE },
|
|
#else /* !SVN_USE_DOS_PATHS */
|
|
{ "X:/", FALSE },
|
|
/* Some people use colons in their filenames. */
|
|
@@ -1279,13 +1351,18 @@ test_dirent_split(apr_pool_t *pool)
|
|
{ "/", "/", "" },
|
|
{ "X:/foo/bar", "X:/foo", "bar" },
|
|
{ "X:foo/bar", "X:foo", "bar" },
|
|
-#ifdef SVN_USE_DOS_PATHS
|
|
+#if defined(SVN_USE_DOS_PATHS)
|
|
{ "X:/", "X:/", "" },
|
|
{ "X:/foo", "X:/", "foo" },
|
|
{ "X:foo", "X:", "foo" },
|
|
{ "//srv/shr", "//srv/shr", "" },
|
|
{ "//srv/shr/fld", "//srv/shr", "fld" },
|
|
{ "//srv/s r", "//srv/s r", "" },
|
|
+#elif defined(__CYGWIN__)
|
|
+ { "X:foo", SVN_EMPTY_PATH, "X:foo" },
|
|
+ { "//srv/shr", "//srv/shr", "" },
|
|
+ { "//srv/shr/fld", "//srv/shr", "fld" },
|
|
+ { "//srv/s r", "//srv/s r", "" },
|
|
#else /* !SVN_USE_DOS_PATHS */
|
|
{ "X:foo", SVN_EMPTY_PATH, "X:foo" },
|
|
#endif /* SVN_USE_DOS_PATHS */
|
|
@@ -1425,7 +1502,7 @@ static const testcase_ancestor_t dirent_ancestor_tests[] =
|
|
{ "/foo/bar/zig", "/foo", NULL },
|
|
{ "/foo/bar/zig", "/foo/ba", NULL },
|
|
{ "/foo/bar/zig", "/foo/bar/zi", NULL },
|
|
-#ifdef SVN_USE_DOS_PATHS
|
|
+#if defined(SVN_USE_DOS_PATHS)
|
|
{ "", "C:", NULL },
|
|
{ "", "C:foo", NULL },
|
|
{ "", "C:/", NULL },
|
|
@@ -1459,6 +1536,21 @@ static const testcase_ancestor_t dirent_ancestor_tests[] =
|
|
{ "//srv/shr/fld", "//srv2/shr/fld", NULL },
|
|
{ "//srv/shr/fld", "//srv/shr/f", NULL },
|
|
{ "/", "//srv/share", NULL },
|
|
+#elif defined(__CYGWIN__)
|
|
+ { "", "C:", "C:" },
|
|
+ { "", "C:/foo", "C:/foo" },
|
|
+ { "X:", "X:foo", NULL },
|
|
+ { "//srv", "//srv/share", NULL },
|
|
+ { "//srv", "//srv/shr/fld", NULL },
|
|
+ { "//srv/shr", "//srv", NULL },
|
|
+ { "//srv/share", "//vrs/share", NULL },
|
|
+ { "//srv/share", "//srv/share/foo", "foo" },
|
|
+ { "//srv/shr", "//srv/shr/fld", "fld" },
|
|
+ { "//srv/s r", "//srv/s r/fld", "fld" },
|
|
+ { "//srv/shr/fld", "//srv/shr", NULL },
|
|
+ { "//srv/shr/fld", "//srv2/shr/fld", NULL },
|
|
+ { "//srv/shr/fld", "//srv/shr/f", NULL },
|
|
+ { "/", "//srv/share", NULL },
|
|
#else /* !SVN_USE_DOS_PATHS */
|
|
{ "", "C:", "C:" },
|
|
{ "", "C:/foo", "C:/foo" },
|
|
@@ -1646,7 +1738,7 @@ test_dirent_get_longest_ancestor(apr_pool_t *pool)
|
|
{ "/", "/", "/"},
|
|
{ "X:foo", "Y:foo", SVN_EMPTY_PATH},
|
|
{ "X:/folder1", "Y:/folder2", SVN_EMPTY_PATH},
|
|
-#ifdef SVN_USE_DOS_PATHS
|
|
+#if defined(SVN_USE_DOS_PATHS)
|
|
{ "X:/", "X:/", "X:/"},
|
|
{ "X:/foo/bar/A/D/H/psi", "X:/foo/bar/A/B", "X:/foo/bar/A" },
|
|
{ "X:/foo/bar/boo", "X:/foo/bar/baz/boz", "X:/foo/bar"},
|
|
@@ -1660,6 +1752,14 @@ test_dirent_get_longest_ancestor(apr_pool_t *pool)
|
|
{ "X:", "X:foo", "X:"},
|
|
{ "X:", "X:/", SVN_EMPTY_PATH},
|
|
{ "X:foo", "X:bar", "X:"},
|
|
+#elif defined(__CYGWIN__)
|
|
+ { "X:/foo", "X:", "X:"},
|
|
+ { "X:/folder1", "X:/folder2", "X:"},
|
|
+ { "X:", "X:foo", SVN_EMPTY_PATH},
|
|
+ { "X:foo", "X:bar", SVN_EMPTY_PATH},
|
|
+ { "//srv/shr", "//srv/shr/fld", "//srv/shr" },
|
|
+ { "//srv/shr/fld", "//srv/shr", "//srv/shr" },
|
|
+ { "//srv/shr/fld", "//srv2/shr/fld", SVN_EMPTY_PATH },
|
|
#else /* !SVN_USE_DOS_PATHS */
|
|
{ "X:/foo", "X:", "X:"},
|
|
{ "X:/folder1", "X:/folder2", "X:"},
|
|
@@ -1805,11 +1905,13 @@ test_dirent_is_child(apr_pool_t *pool)
|
|
".foo",
|
|
"/",
|
|
"foo2",
|
|
-#ifdef SVN_USE_DOS_PATHS
|
|
+#if defined(SVN_USE_DOS_PATHS) || defined(__CYGWIN__)
|
|
"//srv",
|
|
"//srv2",
|
|
"//srv/shr",
|
|
"//srv/shr/fld",
|
|
+#endif
|
|
+#ifdef SVN_USE_DOS_PATHS
|
|
"H:/foo/bar",
|
|
"H:/foo/baz",
|
|
"H:/foo/bar/baz",
|
|
@@ -1851,7 +1953,7 @@ test_dirent_is_child(apr_pool_t *pool)
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
|
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
|
-#ifdef SVN_USE_DOS_PATHS
|
|
+#if defined(SVN_USE_DOS_PATHS) || defined(__CYGWIN__)
|
|
/* //srv paths */
|
|
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, "shr", "shr/fld", 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
|
@@ -1861,6 +1963,8 @@ test_dirent_is_child(apr_pool_t *pool)
|
|
0, 0, 0, "fld", 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
|
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
|
+#endif
|
|
+#ifdef SVN_USE_DOS_PATHS
|
|
/* H:/ paths */
|
|
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, "baz", 0, "baz/bing/boom", 0, 0, 0, 0, 0 },
|
|
@@ -2229,13 +2333,19 @@ test_dirent_local_style(apr_pool_t *pool)
|
|
} tests[] = {
|
|
{ "", "." },
|
|
{ ".", "." },
|
|
-#ifdef SVN_USE_DOS_PATHS
|
|
+#if defined(SVN_USE_DOS_PATHS)
|
|
{ "A:/", "A:\\" },
|
|
{ "A:/file", "A:\\file" },
|
|
{ "dir/file", "dir\\file" },
|
|
{ "/", "\\" },
|
|
{ "//server/share/dir", "\\\\server\\share\\dir" },
|
|
{ "//server/sh re/dir", "\\\\server\\sh re\\dir" },
|
|
+#elif defined(__CYGWIN__)
|
|
+ { "a:/file", "a:/file" },
|
|
+ { "dir/file", "dir/file" },
|
|
+ { "/", "/" },
|
|
+ { "//server/share/dir", "//server/share/dir" },
|
|
+ { "//server/sh re/dir", "//server/sh re/dir" },
|
|
#else
|
|
{ "a:/file", "a:/file" },
|
|
{ "dir/file", "dir/file" },
|
|
@@ -2271,7 +2381,7 @@ test_dirent_internal_style(apr_pool_t *pool)
|
|
{ "file", "file" },
|
|
{ "dir/file", "dir/file" },
|
|
{ "dir/file/./.", "dir/file" },
|
|
-#ifdef SVN_USE_DOS_PATHS
|
|
+#if defined(SVN_USE_DOS_PATHS)
|
|
{ "A:\\", "A:/" },
|
|
{ "A:\\file", "A:/file" },
|
|
{ "A:file", "A:file" },
|
|
@@ -2286,6 +2396,14 @@ test_dirent_internal_style(apr_pool_t *pool)
|
|
{ "//srv/shr", "//srv/shr" },
|
|
{ "//srv/s r", "//srv/s r" },
|
|
{ "//srv/s r", "//srv/s r" },
|
|
+#elif defined(__CYGWIN__)
|
|
+ { "a:/", "a:" }, /* Wrong but expected for svn_path_*() */
|
|
+ { "a:/file", "a:/file" },
|
|
+ { "dir/file", "dir/file" },
|
|
+ { "/", "/" },
|
|
+ { "//srv/shr", "//srv/shr" },
|
|
+ { "//srv/s r", "//srv/s r" },
|
|
+ { "//srv/s r", "//srv/s r" },
|
|
#else
|
|
{ "a:/", "a:" }, /* Wrong but expected for svn_path_*() */
|
|
{ "a:/file", "a:/file" },
|
|
@@ -2358,9 +2476,11 @@ test_dirent_from_file_url(apr_pool_t *pool)
|
|
{ "file://localhost", "/" },
|
|
{ "file://localhost/dir", "/dir" },
|
|
{ "file://localhost/dir/path", "/dir/path" },
|
|
-#ifdef SVN_USE_DOS_PATHS
|
|
+#if defined(SVN_USE_DOS_PATHS) || defined(__CYGWIN__)
|
|
{ "file://server/share", "//server/share" },
|
|
{ "file://server/share/dir", "//server/share/dir" },
|
|
+#endif
|
|
+#ifdef SVN_USE_DOS_PATHS
|
|
{ "file:///A:", "A:/" },
|
|
{ "file:///A:/dir", "A:/dir" },
|
|
{ "file:///A:dir", "A:dir" },
|
|
@@ -2418,7 +2538,7 @@ test_dirent_from_file_url_errors(apr_pool_t *pool)
|
|
/* error if scheme is not "file" */
|
|
"http://localhost/dir",
|
|
"file+ssh://localhost/dir",
|
|
-#ifndef SVN_USE_DOS_PATHS
|
|
+#if !(defined(SVN_USE_DOS_PATHS) || defined(__CYGWIN__))
|
|
"file://localhostwrongname/dir", /* error if host name not "localhost" */
|
|
#endif
|
|
};
|
|
diff --git a/subversion/tests/libsvn_subr/path-test.c b/subversion/tests/libsvn_subr/path-test.c
|
|
index 6f0a996..3a8e2fb 100644
|
|
--- a/subversion/tests/libsvn_subr/path-test.c
|
|
+++ b/subversion/tests/libsvn_subr/path-test.c
|
|
@@ -53,7 +53,7 @@
|
|
|
|
/* This check must match the check on top of dirent_uri.c and
|
|
dirent_uri-tests.c */
|
|
-#if defined(WIN32) || defined(__CYGWIN__) || defined(__OS2__)
|
|
+#if defined(WIN32) || defined(__OS2__)
|
|
#define SVN_USE_DOS_PATHS
|
|
#endif
|
|
|
|
@@ -1438,12 +1438,18 @@ test_path_internal_style(apr_pool_t *pool)
|
|
{ ".", "" },
|
|
{ "http://host/dir", "http://host/dir" },
|
|
{ "/", "/" },
|
|
-#ifdef SVN_USE_DOS_PATHS
|
|
+#if defined(SVN_USE_DOS_PATHS)
|
|
{ "a:\\", "A:/" },
|
|
{ "a:\\file", "A:/file" },
|
|
{ "dir\\file", "dir/file" },
|
|
{ "\\", "/" },
|
|
{ "\\\\server/share/dir", "//server/share/dir" },
|
|
+#elif defined(__CYGWIN__)
|
|
+ { "a:/", "a:" },
|
|
+ { "a:/file", "a:/file" },
|
|
+ { "dir/file", "dir/file" },
|
|
+ { "/", "/" },
|
|
+ { "//server/share/dir", "//server/share/dir" },
|
|
#else
|
|
{ "a:/", "a:" },
|
|
{ "a:/file", "a:/file" },
|