rendered paste bodyIndex: subversion/include/svn_error_codes.h
===================================================================
--- subversion/include/svn_error_codes.h (revision 18687)
+++ subversion/include/svn_error_codes.h (working copy)
@@ -859,6 +859,10 @@
SVN_ERR_APMOD_CATEGORY_START + 4,
"Input/output error")
+ SVN_ERRDEF (SVN_ERR_APMOD_DIRECTORY_EXISTS,
+ SVN_ERR_APMOD_CATEGORY_START + 5,
+ "Directory already exists")
+
/* libsvn_client errors */
SVN_ERRDEF(SVN_ERR_CLIENT_VERSIONED_PATH_REQUIRED,
Index: subversion/mod_dav_svn/repos.c
===================================================================
--- subversion/mod_dav_svn/repos.c (revision 18687)
+++ subversion/mod_dav_svn/repos.c (working copy)
@@ -2896,6 +2896,41 @@
svn_error_t *serr;
dav_error *err;
+ /* This message
+ *
+ * http://subversion.tigris.org/servlets/ReadMsg?list=dev&msgNo=111295
+ * From: Kamesh Jayachandran <kamesh@collab.net>
+ * To: dev@subversion.tigris.org
+ * Subject: Re: [PATCH][Issue 2295]"svn mkdir URL" gives \
+ * poor error message when
+ * directory exists
+ * Date: Mon, 30 Jan 2006 19:40:38 +0530
+ * Message-ID: <43DE1E5E.4020307@collab.net>
+ * References: <43DCD9E2.1070408@collab.net>
+ * <85mzheod6n.fsf@newton.ch.collab.net>
+ * <43DDD7AE.7090000@collab.net>
+ * <43DE1A67.9000602@btopenworld.com>
+ *
+ * explains how this method of detecting an attempt to create a
+ * directory ("collection") where one already exists is based on
+ * code in httpd-2.0.55/modules/dav/main/mod_dav.c, saying:
+ *
+ * "In case get_resource returns a resource with *exists* member
+ * being true, apache dav does not call create collection hook
+ * and error out with HTTP_METHOD_NOT_ALLOWED."
+ *
+ * That message is a response to someone else asking whether doing
+ * this check in dav_svn_get_resource() is really appropriate (see
+ * http://subversion.tigris.org/servlets/ReadMsg?list=dev&msgNo=111293).
+ * IGNORE MOST OF THE ABOVE COMMENT, GARRETT, IT DATES FROM PREV PATCH
+ */
+ if (resource->exists)
+ {
+ return dav_new_error(resource->pool, HTTP_CONFLICT,
+ SVN_ERR_APMOD_DIRECTORY_EXISTS,
+ "Directory already exists");
+ }
+
if (resource->type != DAV_RESOURCE_TYPE_WORKING
&& resource->type != DAV_RESOURCE_TYPE_REGULAR)
{
Index: subversion/tests/cmdline/basic_tests.py
===================================================================
--- subversion/tests/cmdline/basic_tests.py (revision 18687)
+++ subversion/tests/cmdline/basic_tests.py (working copy)
@@ -1714,6 +1714,27 @@
None, ".*has no committed revision.*",
'cat', '-rPREV', f_path)
+#----------------------------------------------------------------------
+# Issue #2295.
+def duplicate_mkdir_over_dav_url(sbox):
+ "useful error on 'mkdir URL_TO_EXISTING_DIR'"
+
+
+ sbox.build()
+ url = svntest.main.current_repo_url
+ scheme = url[:string.find(url, ":")]
+ if scheme == 'http' or scheme == 'https':
+ duplicate_url_path = url + '/duplicate'
+
+ svntest.actions.run_and_verify_svn("mkdir DAV_URL/DUPLICATE",
+ ["\n", "Committed revision 2.\n"], [],
+ 'mkdir', '-m', 'log_msg',
+ duplicate_url_path)
+
+ svntest.actions.run_and_verify_svn("mkdir DAV_URL/DUPLICATE",
+ [], '.*409 Directory already exists.*',
+ 'mkdir', '-m', 'log_msg',
+ duplicate_url_path)
########################################################################
# Run the tests
Index: subversion/tests/cmdline/commit_tests.py
===================================================================
--- subversion/tests/cmdline/commit_tests.py (revision 18687)
+++ subversion/tests/cmdline/commit_tests.py (working copy)
@@ -1990,6 +1990,28 @@
'ci', '-m', 'log msg', iota_path)
+#----------------------------------------------------------------------
+# Issue #2295.
+def duplicate_mkdir_over_dav_url(sbox):
+ "useful error on 'mkdir DAV_URL_TO_EXISTING_DIR'"
+
+ sbox.build()
+ url = svntest.main.current_repo_url
+ scheme = url[:string.find(url, ":")]
+ if scheme == 'http' or scheme == 'https':
+ duplicate_url_path = url + '/duplicate'
+
+ svntest.actions.run_and_verify_svn("mkdir DAV_URL/DUPLICATE",
+ ["\n", "Committed revision 2.\n"], [],
+ 'mkdir', '-m', 'log_msg',
+ duplicate_url_path)
+
+ svntest.actions.run_and_verify_svn("mkdir DAV_URL/DUPLICATE",
+ [], '.*Directory already exists.*',
+ 'mkdir', '-m', 'log_msg',
+ duplicate_url_path)
+
+
########################################################################
# Run the tests
@@ -2029,7 +2051,8 @@
mods_in_schedule_delete,
Skip(tab_test, (os.name != 'posix' or sys.platform == 'cygwin')),
local_mods_are_not_commits,
- post_commit_hook_test
+ post_commit_hook_test,
+ duplicate_mkdir_over_dav_url,
]
if __name__ == '__main__':