Index: 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 + * 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__':