You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by ju...@apache.org on 2010/03/05 17:35:11 UTC
svn commit: r919478 - in /subversion/trunk/subversion/libsvn_wc: adm_files.c
adm_files.h update_editor.c
Author: julianfoad
Date: Fri Mar 5 16:35:10 2010
New Revision: 919478
URL: http://svn.apache.org/viewvc?rev=919478&view=rev
Log:
Revert r919413 and r919436. There is a problem which I cannot fix right
now, in that workqueue.c:install_committed_file() looks on disk at the
special text-base temp path, to see if there is a file there. After r919413,
there probably won't ever be.
* libsvn_wc/adm_files.c,
libsvn_wc/adm_files.h,
libsvn_wc/update_editor.c
Revert.
Modified:
subversion/trunk/subversion/libsvn_wc/adm_files.c
subversion/trunk/subversion/libsvn_wc/adm_files.h
subversion/trunk/subversion/libsvn_wc/update_editor.c
Modified: subversion/trunk/subversion/libsvn_wc/adm_files.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/adm_files.c?rev=919478&r1=919477&r2=919478&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/adm_files.c (original)
+++ subversion/trunk/subversion/libsvn_wc/adm_files.c Fri Mar 5 16:35:10 2010
@@ -373,6 +373,58 @@
/*** Opening and closing files in the adm area. ***/
+/* Create and open a writable file in the admin temporary area of the WC
+ directory DIR_ABSPATH, in a subdirectory named SUBDIR (such as "text-base"),
+ with the name FNAME and extra EXTENSION (such as ".svn-base"). If the
+ file already exists, first delete it. Set *STREAM to a writable stream
+ to this file, and (if SELECTED_ABSPATH is not NULL) set *SELECTED_PATH to
+ the path to this file, both allocated in RESULT_POOL.
+
+ Closing the stream will close (but not delete) the file. */
+static svn_error_t *
+open_adm_file(svn_stream_t **stream,
+ const char **selected_abspath,
+ const char *dir_abspath,
+ const char *subdir,
+ const char *fname,
+ const char *extension,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_error_t *err;
+
+ /* Extend with tmp name. */
+ dir_abspath = extend_with_adm_name(dir_abspath, extension, TRUE, result_pool,
+ subdir, fname, NULL);
+ if (selected_abspath)
+ *selected_abspath = dir_abspath; /* note: built in result_pool */
+
+ err = svn_stream_open_writable(stream, dir_abspath, result_pool, scratch_pool);
+ if (err && APR_STATUS_IS_EEXIST(err->apr_err))
+ {
+ /* Exclusive open failed, delete and retry */
+ svn_error_clear(err);
+ SVN_ERR(svn_io_remove_file2(dir_abspath, FALSE, scratch_pool));
+ err = svn_stream_open_writable(stream, dir_abspath, result_pool, scratch_pool);
+ }
+
+ /* Examine the error from the first and/or second attempt at opening. */
+ if (err && APR_STATUS_IS_ENOENT(err->apr_err))
+ {
+ /* If we receive a failure to open a file in our temporary directory,
+ * it may be because our temporary directories aren't created.
+ * Older SVN clients did not create these directories.
+ * 'svn cleanup' will fix this problem.
+ */
+ err = svn_error_quick_wrap(err,
+ _("Your .svn/tmp directory may be missing or "
+ "corrupt; run 'svn cleanup' and try again"));
+ }
+
+ return svn_error_return(err);
+}
+
+
svn_error_t *
svn_wc__open_adm_stream(svn_stream_t **stream,
const char *dir_abspath,
@@ -391,23 +443,24 @@
svn_error_t *
svn_wc__open_writable_base(svn_stream_t **stream,
const char **temp_base_abspath,
- svn_wc__db_t *db,
const char *local_abspath,
+ svn_boolean_t need_revert_base,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
- const char *temp_dir_abspath;
+ const char *parent_abspath;
+ const char *base_name;
- /* Select a directory in which to put a WC-1-style temp text-base file. */
- /* See update_editor.c:get_pristine_tee_stream() for the WC-NG way. */
- SVN_ERR(svn_wc__db_temp_wcroot_tempdir(&temp_dir_abspath, db, local_abspath,
- scratch_pool, scratch_pool));
- SVN_ERR(svn_stream_open_unique(stream,
- temp_base_abspath,
- temp_dir_abspath,
- svn_io_file_del_none,
- result_pool, scratch_pool));
- return SVN_NO_ERROR;
+ svn_dirent_split(local_abspath, &parent_abspath, &base_name, scratch_pool);
+
+ return open_adm_file(stream, temp_base_abspath,
+ parent_abspath,
+ SVN_WC__ADM_TEXT_BASE,
+ base_name,
+ need_revert_base
+ ? SVN_WC__REVERT_EXT
+ : SVN_WC__BASE_EXT,
+ result_pool, scratch_pool);
}
Modified: subversion/trunk/subversion/libsvn_wc/adm_files.h
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/adm_files.h?rev=919478&r1=919477&r2=919478&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/adm_files.h (original)
+++ subversion/trunk/subversion/libsvn_wc/adm_files.h Fri Mar 5 16:35:10 2010
@@ -116,15 +116,17 @@
apr_pool_t *scratch_pool);
-/* Open a writable stream to a temporary (normal or revert) text base,
- associated with the versioned file LOCAL_ABSPATH in DB. Set *STREAM to
- the opened stream and *TEMP_BASE_ABSPATH to the path to the temporary
- file, both allocated in RESULT_POOL. */
+/* Open the normal or revert text base, associated with LOCAL_ABSPATH, for
+ writing.
+ The selection is based on NEED_REVERT_BASE. The opened stream will be
+ returned in STREAM and the selected path will be returned in,
+ TEMP_BASE_ABSPATH, and both will be allocated in RESULT_POOL. Any temporary
+ allocations will be performed in SCRATCH_POOL. */
svn_error_t *
svn_wc__open_writable_base(svn_stream_t **stream,
const char **temp_base_abspath,
- svn_wc__db_t *db,
const char *local_abspath,
+ svn_boolean_t need_revert_base,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool);
Modified: subversion/trunk/subversion/libsvn_wc/update_editor.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/update_editor.c?rev=919478&r1=919477&r2=919478&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/update_editor.c (original)
+++ subversion/trunk/subversion/libsvn_wc/update_editor.c Fri Mar 5 16:35:10 2010
@@ -3727,6 +3727,7 @@
apr_hash_t *base_props, *working_props;
svn_error_t *err;
svn_stream_t *copied_stream;
+ const char *temp_dir_abspath;
const char *src_local_abspath;
svn_wc__db_t *db = eb->db;
const char *dir_repos_relpath, *dir_repos_root, *dir_repos_uuid;
@@ -3752,10 +3753,13 @@
else
SVN_ERR(err);
- /* Open the text base for writing (this will get us a temporary file). */
- SVN_ERR(svn_wc__open_writable_base(&copied_stream, &tfb->copied_text_base,
- db, pb->local_abspath,
- pool, pool));
+ SVN_ERR(svn_wc__db_temp_wcroot_tempdir(&temp_dir_abspath, db, pb->local_abspath,
+ subpool, subpool));
+ SVN_ERR(svn_stream_open_unique(&copied_stream,
+ &tfb->copied_text_base,
+ temp_dir_abspath,
+ svn_io_file_del_none,
+ pool, pool));
#ifdef SVN_EXPERIMENTAL
/* Copy the 'copied_stream' into a WC-NG pristine temp file as well. */
SVN_ERR(get_pristine_tee_stream(&copied_stream, &tfb->temp_pristine_abspath,
@@ -4423,7 +4427,8 @@
/* Open the text base for writing (this will get us a temporary file). */
err = svn_wc__open_writable_base(&target, &hb->work_abspath,
- fb->edit_baton->db, fb->local_abspath,
+ fb->local_abspath,
+ replaced /* need_revert_base */,
handler_pool, pool);
if (err)
{
@@ -6100,10 +6105,9 @@
/* Copy the text base contents into a temporary file so our log
can refer to it. Compute its checksum as we copy. */
- /* Open the text base for writing (this will get us a temporary file). */
- SVN_ERR(svn_wc__open_writable_base(&tmp_base_contents, &tmp_text_base_path,
- wc_ctx->db, local_abspath,
- pool, pool));
+ SVN_ERR(svn_stream_open_unique(&tmp_base_contents, &tmp_text_base_path,
+ temp_dir_abspath, svn_io_file_del_none, pool,
+ pool));
new_base_contents = svn_stream_checksummed2(new_base_contents,
&base_checksum, NULL,
svn_checksum_md5, TRUE, pool);