Log message and patch follow. But first i have a question. This
function has a comment that says errors should be ignored.
Failing to create the default config directory and/or files
should not cause whatever operation the user actually requested
to fail. I agree with that 100%. Unfortunately, the comment is
inaccurate; this function *will* bomb if creating the files
fails. Can i fix that in this patch also? The correct behavior
for this function, IMNSHO, is never to fail.
Here is what i mean:
0 ~% mv .subversion .subversion.cur
0 ~% touch .subversion
0 ~% chmod 0 .subversion
0 ~% svn st -Nq
/u/epg/work/svn/trunk/subversion/libsvn_subr/config_file.c:354:
(apr_err=125001)
svn: Bogus filename
svn: Can't open config file /u/epg/.subversion/config
That is broken.
Current log message and patch (doesn't fix that issue yet, only
the one in the Subject):
Currently, svn has the annoying behavior of restoring files i have
deleted from the .subversion configuration directory. See how
annoying it is:
0 .subversion% svn st
? README
M servers
0 .subversion% rm README
0 .subversion% ls README
ls: README: No such file or directory
1 .subversion% svn st
? README
M servers
Grrrrr.
* subversion/libsvn_subr/config_file.c:
(svn_config_ensure): When the .subversion directory does not exist,
attempt to create it and the default files. Do not attempt to
create the default files when the directory already exists.
Index: subversion/libsvn_subr/config_file.c
===================================================================
--- subversion/libsvn_subr/config_file.c (revision 4549)
+++ subversion/libsvn_subr/config_file.c (working copy)
@@ -450,6 +450,12 @@
apr_status_t apr_err;
svn_error_t *err;
+ /* XXX: I agree with this comment, but it is not in fact followed.
+ Hopefully people agree i should fix that... */
+ /* If we get errors trying to do things below, just stop and return
+ success. There's no _need_ to init a config directory if
+ something's preventing it. */
+
/* Ensure that the user-specific config directory exists. */
SVN_ERR (svn_config__user_config_path (path, NULL, pool));
@@ -462,31 +468,22 @@
apr_err = apr_dir_make (path, APR_OS_DEFAULT, pool);
if (apr_err)
return SVN_NO_ERROR;
- }
- else if (kind != svn_node_dir)
- return SVN_NO_ERROR;
-
- /* Else, there's a configuration directory. */
-
- /* If we get errors trying to do things below, just stop and return
- success. There's no _need_ to init a config directory if
- something's preventing it. */
- /** Ensure that the `README' file exists. **/
- SVN_ERR (svn_config__user_config_path
- (path, SVN_CONFIG__USR_README_FILE, pool));
+ /** Ensure that the `README' file exists. **/
+ SVN_ERR (svn_config__user_config_path
+ (path, SVN_CONFIG__USR_README_FILE, pool));
- if (! path) /* highly unlikely, since a previous call succeeded */
- return SVN_NO_ERROR;
+ if (! path) /* highly unlikely, since a previous call succeeded */
+ return SVN_NO_ERROR;
- err = svn_io_check_path (path, kind, pool);
- if (err)
- return SVN_NO_ERROR;
+ err = svn_io_check_path (path, kind, pool);
+ if (err)
+ return SVN_NO_ERROR;
- if (kind == svn_node_none)
- {
- apr_file_t *f;
- const char *contents =
+ if (kind == svn_node_none)
+ {
+ apr_file_t *f;
+ const char *contents =
This directory holds run-time configuration information for Subversion\n
clients. The configuration files all share the same syntax, but you\n
should examine a particular file to learn what configuration\n
@@ -595,40 +592,41 @@
REGISTRY:HKCU\\Software\\Tigris.org\\Subversion\\Hairstyles\n
\n;
- apr_err = apr_file_open (f, path,
- (APR_WRITE | APR_CREATE | APR_EXCL),
- APR_OS_DEFAULT,
- pool);
-
- if (! apr_err)
- {
- apr_err = apr_file_write_full (f, contents, strlen (contents), NULL);
- if (apr_err)
- return svn_error_createf (apr_err, NULL,
- writing config file `%s', path);
-
- apr_err = apr_file_close (f);
- if (apr_err)
- return svn_error_createf (apr_err, NULL,
- closing config file `%s', path);
+ apr_err = apr_file_open (f, path,
+ (APR_WRITE | APR_CREATE | APR_EXCL),
+ APR_OS_DEFAULT,
+ pool);
+
+ if (! apr_err)
+ {
+ apr_err = apr_file_write_full (f, contents, strlen (contents),
+ NULL);
+ if (apr_err)
+ return svn_error_createf (apr_err, NULL,
+ writing config file `%s', path);
+
+ apr_err = apr_file_close (f);
+ if (apr_err)
+ return svn_error_createf (apr_err, NULL,
+ closing config file `%s', path);
+ }
}
- }
- /** Ensure that the `servers' file exists. **/
- SVN_ERR (svn_config__user_config_path
- (path, SVN_CONFIG__USR_SERVERS_FILE, pool));
+ /** Ensure that the `servers' file exists. **/
+ SVN_ERR (svn_config__user_config_path
+ (path, SVN_CONFIG__USR_SERVERS_FILE, pool));
- if (! path) /* highly unlikely, since a previous call succeeded */
- return SVN_NO_ERROR;
+ if (! path) /* highly unlikely, since a previous call succeeded */
+ return SVN_NO_ERROR;
- err = svn_io_check_path (path, kind, pool);
- if (err)
- return SVN_NO_ERROR;
-
- if (kind == svn_node_none)
- {
- apr_file_t *f;
- const char *contents =
+ err = svn_io_check_path (path, kind, pool);
+ if (err)
+ return SVN_NO_ERROR;
+
+ if (kind == svn_node_none)
+ {
+ apr_file_t *f;
+ const char *contents =
### This file specifies server-specific protocol parameters,\n
### including HTTP proxy information, HTTP timeout settings, and\n
### svn protocol tunnel agents (for running svn over ssh or similar\n
@@ -698,40 +696,41 @@
# No http-timeout, so just use the builtin default.\n
# No neon-debug-mask, so neon debugging is disabled.\n;
- apr_err = apr_file_open (f, path,
- (APR_WRITE | APR_CREATE | APR_EXCL),
- APR_OS_DEFAULT,
- pool);
-
- if (! apr_err)
- {
- apr_err = apr_file_write_full (f, contents, strlen (contents), NULL);
- if (apr_err)
- return svn_error_createf (apr_err, NULL,
- writing config file `%s', path);
-
- apr_err = apr_file_close (f);
- if (apr_err)
- return svn_error_createf (apr_err, NULL,
- closing config file `%s', path);
+ apr_err = apr_file_open (f, path,
+ (APR_WRITE | APR_CREATE | APR_EXCL),
+ APR_OS_DEFAULT,
+ pool);
+
+ if (! apr_err)
+ {
+ apr_err = apr_file_write_full (f, contents, strlen (contents),
+ NULL);
+ if (apr_err)
+ return svn_error_createf (apr_err, NULL,
+ writing config file `%s', path);
+
+ apr_err = apr_file_close (f);
+ if (apr_err)
+ return svn_error_createf (apr_err, NULL,
+ closing config file `%s', path);
+ }
}
- }
- /** Ensure that the `config' file exists. **/
- SVN_ERR (svn_config__user_config_path
- (path, SVN_CONFIG__USR_CONFIG_FILE, pool));
+ /** Ensure that the `config' file exists. **/
+ SVN_ERR (svn_config__user_config_path
+ (path, SVN_CONFIG__USR_CONFIG_FILE, pool));
- if (! path) /* highly unlikely, since a previous call succeeded */
- return SVN_NO_ERROR;
+ if (! path) /* highly unlikely, since a previous call succeeded */
+ return SVN_NO_ERROR;
- err = svn_io_check_path (path, kind, pool);
- if (err)
- return SVN_NO_ERROR;
-
- if (kind == svn_node_none)
- {
- apr_file_t *f;
- const char *contents =
+ err = svn_io_check_path (path, kind, pool);
+ if (err)
+ return SVN_NO_ERROR;
+
+ if (kind == svn_node_none)
+ {
+ apr_file_t *f;
+ const char *contents =
### This file configures various client-side behaviors.\n
###\n
### The commented-out examples below are intended to demonstrate\n
@@ -739,7 +738,7 @@
\n
### Section for authentication and authorization customizations.\n
### Set store-password to 'no' to avoid storing your subversion\n
- ### password in your working copies. It defaults to 'yes'.\n
+ ### password in your working copies. It defaults to 'yes'.\n
# [auth]\n
# store-password = no\n
\n
@@ -773,27 +772,29 @@
# global-ignores = *.o *.lo *.la #*# .*.rej *.rej .*~ *~ .#*
\n
### Set compression to 'no' to avoid compressing requests\n
- ### to a DAV-enabled Subversion server. It defaults to 'yes'.\n
+ ### to a DAV-enabled Subversion server. It defaults to 'yes'.\n
# compression = yes\n
### See http://subversion.tigris.org/issues/show_bug.cgi?id=668\n
### for what else will soon be customized in this file.\n;
-
- apr_err = apr_file_open (f, path,
- (APR_WRITE | APR_CREATE | APR_EXCL),
- APR_OS_DEFAULT,
- pool);
- if (! apr_err)
- {
- apr_err = apr_file_write_full (f, contents, strlen (contents), NULL);
- if (apr_err)
- return svn_error_createf (apr_err, NULL,
- writing config file `%s', path);
-
- apr_err = apr_file_close (f);
- if (apr_err)
- return svn_error_createf (apr_err, NULL,
- closing config file `%s', path);
+ apr_err = apr_file_open (f, path,
+ (APR_WRITE | APR_CREATE | APR_EXCL),
+ APR_OS_DEFAULT,
+ pool);
+
+ if (! apr_err)
+ {
+ apr_err = apr_file_write_full (f, contents, strlen (contents),
+ NULL);
+ if (apr_err)
+ return svn_error_createf (apr_err, NULL,
+ writing config file `%s', path);
+
+ apr_err = apr_file_close (f);
+ if (apr_err)
+ return svn_error_createf (apr_err, NULL,
+ closing config file `%s', path);
+ }
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@subversion.tigris.org
For additional commands, e-mail: dev-help@subversion.tigris.org
Received on Sat Oct 14 02:16:08 2006