summaryrefslogtreecommitdiff
path: root/subversion/libsvn_subr/path.c
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@baserock.org>2015-03-18 13:33:26 +0000
committer <>2015-07-08 14:41:01 +0000
commitbb0ef45f7c46b0ae221b26265ef98a768c33f820 (patch)
tree98bae10dde41c746c51ae97ec4f879e330415aa7 /subversion/libsvn_subr/path.c
parent239dfafe71711b2f4c43d7b90a1228d7bdc5195e (diff)
downloadsubversion-tarball-subversion-1.8.13.tar.gz
Imported from /home/lorry/working-area/delta_subversion-tarball/subversion-1.8.13.tar.gz.subversion-1.8.13
Diffstat (limited to 'subversion/libsvn_subr/path.c')
-rw-r--r--subversion/libsvn_subr/path.c101
1 files changed, 83 insertions, 18 deletions
diff --git a/subversion/libsvn_subr/path.c b/subversion/libsvn_subr/path.c
index 24fcd8f..84368f3 100644
--- a/subversion/libsvn_subr/path.c
+++ b/subversion/libsvn_subr/path.c
@@ -91,16 +91,33 @@ is_canonical(const char *path,
#endif
-char *svn_path_join(const char *base,
- const char *component,
- apr_pool_t *pool)
+/* functionality of svn_path_is_canonical but without the deprecation */
+static svn_boolean_t
+svn_path_is_canonical_internal(const char *path, apr_pool_t *pool)
+{
+ return svn_uri_is_canonical(path, pool) ||
+ svn_dirent_is_canonical(path, pool) ||
+ svn_relpath_is_canonical(path);
+}
+
+svn_boolean_t
+svn_path_is_canonical(const char *path, apr_pool_t *pool)
+{
+ return svn_path_is_canonical_internal(path, pool);
+}
+
+/* functionality of svn_path_join but without the deprecation */
+static char *
+svn_path_join_internal(const char *base,
+ const char *component,
+ apr_pool_t *pool)
{
apr_size_t blen = strlen(base);
apr_size_t clen = strlen(component);
char *path;
- assert(svn_path_is_canonical(base, pool));
- assert(svn_path_is_canonical(component, pool));
+ assert(svn_path_is_canonical_internal(base, pool));
+ assert(svn_path_is_canonical_internal(component, pool));
/* If the component is absolute, then return it. */
if (*component == '/')
@@ -124,6 +141,13 @@ char *svn_path_join(const char *base,
return path;
}
+char *svn_path_join(const char *base,
+ const char *component,
+ apr_pool_t *pool)
+{
+ return svn_path_join_internal(base, component, pool);
+}
+
char *svn_path_join_many(apr_pool_t *pool, const char *base, ...)
{
#define MAX_SAVED_LENGTHS 10
@@ -140,7 +164,7 @@ char *svn_path_join_many(apr_pool_t *pool, const char *base, ...)
total_len = strlen(base);
- assert(svn_path_is_canonical(base, pool));
+ assert(svn_path_is_canonical_internal(base, pool));
if (total_len == 1 && *base == '/')
base_is_root = TRUE;
@@ -160,7 +184,7 @@ char *svn_path_join_many(apr_pool_t *pool, const char *base, ...)
{
len = strlen(s);
- assert(svn_path_is_canonical(s, pool));
+ assert(svn_path_is_canonical_internal(s, pool));
if (SVN_PATH_IS_EMPTY(s))
continue;
@@ -353,7 +377,7 @@ svn_path_dirname(const char *path, apr_pool_t *pool)
{
apr_size_t len = strlen(path);
- assert(svn_path_is_canonical(path, pool));
+ assert(svn_path_is_canonical_internal(path, pool));
return apr_pstrmemdup(pool, path, previous_segment(path, len));
}
@@ -365,7 +389,7 @@ svn_path_basename(const char *path, apr_pool_t *pool)
apr_size_t len = strlen(path);
apr_size_t start;
- assert(svn_path_is_canonical(path, pool));
+ assert(svn_path_is_canonical_internal(path, pool));
if (len == 1 && path[0] == '/')
start = 0;
@@ -399,8 +423,8 @@ svn_path_compare_paths(const char *path1,
apr_size_t min_len = ((path1_len < path2_len) ? path1_len : path2_len);
apr_size_t i = 0;
- assert(is_canonical(path1, strlen(path1)));
- assert(is_canonical(path2, strlen(path2)));
+ assert(is_canonical(path1, path1_len));
+ assert(is_canonical(path2, path2_len));
/* Skip past common prefix. */
while (i < min_len && path1[i] == path2[i])
@@ -593,7 +617,7 @@ svn_path_decompose(const char *path,
apr_array_header_t *components =
apr_array_make(pool, 1, sizeof(const char *));
- assert(svn_path_is_canonical(path, pool));
+ assert(svn_path_is_canonical_internal(path, pool));
if (SVN_PATH_IS_EMPTY(path))
return components; /* ### Should we return a "" component? */
@@ -1058,7 +1082,7 @@ svn_path_url_add_component2(const char *url,
/* = svn_path_uri_encode() but without always copying */
component = uri_escape(component, svn_uri__char_validity, pool);
- return svn_path_join(url, component, pool);
+ return svn_path_join_internal(url, component, pool);
}
svn_error_t *
@@ -1076,7 +1100,7 @@ svn_path_get_absolute(const char **pabsolute,
}
-
+#if !defined(WIN32) && !defined(DARWIN)
/** Get APR's internal path encoding. */
static svn_error_t *
get_path_encoding(svn_boolean_t *path_is_utf8, apr_pool_t *pool)
@@ -1095,6 +1119,7 @@ get_path_encoding(svn_boolean_t *path_is_utf8, apr_pool_t *pool)
*path_is_utf8 = (encoding_style == APR_FILEPATH_ENCODING_UTF8);
return SVN_NO_ERROR;
}
+#endif
svn_error_t *
@@ -1102,15 +1127,19 @@ svn_path_cstring_from_utf8(const char **path_apr,
const char *path_utf8,
apr_pool_t *pool)
{
+#if !defined(WIN32) && !defined(DARWIN)
svn_boolean_t path_is_utf8;
SVN_ERR(get_path_encoding(&path_is_utf8, pool));
if (path_is_utf8)
+#endif
{
*path_apr = apr_pstrdup(pool, path_utf8);
return SVN_NO_ERROR;
}
+#if !defined(WIN32) && !defined(DARWIN)
else
return svn_utf_cstring_from_utf8(path_apr, path_utf8, pool);
+#endif
}
@@ -1119,23 +1148,27 @@ svn_path_cstring_to_utf8(const char **path_utf8,
const char *path_apr,
apr_pool_t *pool)
{
+#if !defined(WIN32) && !defined(DARWIN)
svn_boolean_t path_is_utf8;
SVN_ERR(get_path_encoding(&path_is_utf8, pool));
if (path_is_utf8)
+#endif
{
*path_utf8 = apr_pstrdup(pool, path_apr);
return SVN_NO_ERROR;
}
+#if !defined(WIN32) && !defined(DARWIN)
else
return svn_utf_cstring_to_utf8(path_utf8, path_apr, pool);
+#endif
}
/* Return a copy of PATH, allocated from POOL, for which control
characters have been escaped using the form \NNN (where NNN is the
octal representation of the byte's ordinal value). */
-static const char *
-illegal_path_escape(const char *path, apr_pool_t *pool)
+const char *
+svn_path_illegal_path_escape(const char *path, apr_pool_t *pool)
{
svn_stringbuf_t *retstr;
apr_size_t i, copied = 0;
@@ -1160,7 +1193,7 @@ illegal_path_escape(const char *path, apr_pool_t *pool)
svn_stringbuf_appendbytes(retstr, path + copied,
i - copied);
- /* Make sure buffer is big enough for '\' 'N' 'N' 'N' null */
+ /* Make sure buffer is big enough for '\' 'N' 'N' 'N' (and NUL) */
svn_stringbuf_ensure(retstr, retstr->len + 5);
/*### The backslash separator doesn't work too great with Windows,
but it's what we'll use for consistency with invalid utf8
@@ -1199,7 +1232,8 @@ svn_path_check_valid(const char *path, apr_pool_t *pool)
(SVN_ERR_FS_PATH_SYNTAX, NULL,
_("Invalid control character '0x%02x' in path '%s'"),
(unsigned char)*c,
- illegal_path_escape(svn_dirent_local_style(path, pool), pool));
+ svn_path_illegal_path_escape(svn_dirent_local_style(path, pool),
+ pool));
}
}
@@ -1248,3 +1282,34 @@ svn_path_splitext(const char **path_root,
if (path_ext)
*path_ext = "";
}
+
+
+/* Repository relative URLs (^/). */
+
+svn_boolean_t
+svn_path_is_repos_relative_url(const char *path)
+{
+ return (0 == strncmp("^/", path, 2));
+}
+
+svn_error_t *
+svn_path_resolve_repos_relative_url(const char **absolute_url,
+ const char *relative_url,
+ const char *repos_root_url,
+ apr_pool_t *pool)
+{
+ if (! svn_path_is_repos_relative_url(relative_url))
+ return svn_error_createf(SVN_ERR_BAD_URL, NULL,
+ _("Improper relative URL '%s'"),
+ relative_url);
+
+ /* No assumptions are made about the canonicalization of the inut
+ * arguments, it is presumed that the output will be canonicalized after
+ * this function, which will remove any duplicate path separator.
+ */
+ *absolute_url = apr_pstrcat(pool, repos_root_url, relative_url + 1,
+ (char *)NULL);
+
+ return SVN_NO_ERROR;
+}
+