You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by hw...@apache.org on 2012/02/16 23:39:30 UTC
svn commit: r1245224 [2/4] - in /subversion/branches/ev2-export: ./ build/
build/generator/ build/generator/templates/ notes/api-errata/1.7/
subversion/bindings/swig/ subversion/include/ subversion/include/private/
subversion/libsvn_auth_gnome_keyring/...
Modified: subversion/branches/ev2-export/subversion/libsvn_client/update.c
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/libsvn_client/update.c?rev=1245224&r1=1245223&r2=1245224&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/libsvn_client/update.c (original)
+++ subversion/branches/ev2-export/subversion/libsvn_client/update.c Thu Feb 16 22:39:27 2012
@@ -370,7 +370,7 @@ update_internal(svn_revnum_t *result_rev
/* Fetch the update editor. If REVISION is invalid, that's okay;
the RA driver will call editor->set_target_revision later on. */
- SVN_ERR(svn_wc_get_update_editor4(&update_editor, &update_edit_baton,
+ SVN_ERR(svn_wc__get_update_editor(&update_editor, &update_edit_baton,
&revnum, ctx->wc_ctx, anchor_abspath,
target, use_commit_times, depth,
depth_is_sticky, allow_unver_obstructions,
Modified: subversion/branches/ev2-export/subversion/libsvn_delta/compat.c
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/libsvn_delta/compat.c?rev=1245224&r1=1245223&r2=1245224&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/libsvn_delta/compat.c (original)
+++ subversion/branches/ev2-export/subversion/libsvn_delta/compat.c Thu Feb 16 22:39:27 2012
@@ -211,6 +211,42 @@ add_action(struct ev2_edit_baton *eb,
return SVN_NO_ERROR;
}
+/* Find all the paths which are immediate children of PATH and return their
+ basenames in a list. */
+static apr_array_header_t *
+get_children(struct ev2_edit_baton *eb,
+ const char *path,
+ apr_pool_t *pool)
+{
+ apr_array_header_t *children = apr_array_make(pool, 1, sizeof(const char *));
+ apr_hash_index_t *hi;
+
+ for (hi = apr_hash_first(pool, eb->paths); hi; hi = apr_hash_next(hi))
+ {
+ const char *p = svn__apr_hash_index_key(hi);
+ const char *child;
+
+ /* Sanitize our paths. */
+ if (*p == '/')
+ p++;
+
+ /* Find potential children. */
+ child = svn_relpath_skip_ancestor(path, p);
+ if (!child || !*child)
+ continue;
+
+ /* If we have a path separator, it's a deep child, so just ignore it.
+ ### Is there an API we should be using for this? */
+ if (strchr(child, '/') != NULL)
+ continue;
+
+ APR_ARRAY_PUSH(children, const char *) = child;
+ }
+
+ return children;
+}
+
+
static svn_error_t *
process_actions(void *edit_baton,
const char *path,
@@ -298,8 +334,7 @@ process_actions(void *edit_baton,
if (kind == svn_kind_dir)
{
- children = apr_array_make(scratch_pool, 1,
- sizeof(const char *));
+ children = get_children(eb, path, scratch_pool);
}
else
{
@@ -712,6 +747,8 @@ struct handler_baton
svn_txdelta_window_handler_t apply_handler;
void *apply_baton;
+ svn_stream_t *source;
+
apr_pool_t *pool;
};
@@ -725,6 +762,8 @@ window_handler(svn_txdelta_window_t *win
if (window != NULL && !err)
return SVN_NO_ERROR;
+ SVN_ERR(svn_stream_close(hb->source));
+
svn_pool_destroy(hb->pool);
return svn_error_trace(err);
@@ -741,7 +780,6 @@ ev2_apply_textdelta(void *file_baton,
struct ev2_file_baton *fb = file_baton;
apr_pool_t *handler_pool = svn_pool_create(fb->eb->edit_pool);
struct handler_baton *hb = apr_pcalloc(handler_pool, sizeof(*hb));
- svn_stream_t *source;
svn_stream_t *target;
struct path_checksum_args *pca = apr_pcalloc(fb->eb->edit_pool,
sizeof(*pca));
@@ -749,16 +787,16 @@ ev2_apply_textdelta(void *file_baton,
pca->base_revision = fb->base_revision;
if (! fb->delta_base)
- source = svn_stream_empty(handler_pool);
+ hb->source = svn_stream_empty(handler_pool);
else
- SVN_ERR(svn_stream_open_readonly(&source, fb->delta_base, handler_pool,
+ SVN_ERR(svn_stream_open_readonly(&hb->source, fb->delta_base, handler_pool,
result_pool));
SVN_ERR(svn_stream_open_unique(&target, &pca->path, NULL,
svn_io_file_del_on_pool_cleanup,
fb->eb->edit_pool, result_pool));
- svn_txdelta_apply(source, target,
+ svn_txdelta_apply(hb->source, target,
NULL, NULL,
handler_pool,
&hb->apply_handler, &hb->apply_baton);
@@ -1889,6 +1927,10 @@ svn_editor__insert_shims(const svn_delta
svn_delta_unlock_func_t unlock_func;
void *unlock_baton;
+ SVN_ERR_ASSERT(shim_callbacks->fetch_kind_func != NULL);
+ SVN_ERR_ASSERT(shim_callbacks->fetch_props_func != NULL);
+ SVN_ERR_ASSERT(shim_callbacks->fetch_base_func != NULL);
+
SVN_ERR(svn_delta__editor_from_delta(&editor, &exb,
&unlock_func, &unlock_baton,
deditor_in, dedit_baton_in,
Modified: subversion/branches/ev2-export/subversion/libsvn_delta/editor.c
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/libsvn_delta/editor.c?rev=1245224&r1=1245223&r2=1245224&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/libsvn_delta/editor.c (original)
+++ subversion/branches/ev2-export/subversion/libsvn_delta/editor.c Thu Feb 16 22:39:27 2012
@@ -65,13 +65,26 @@ struct svn_editor_t
#ifdef ENABLE_ORDERING_CHECK
+/* Marker to indicate no further changes are allowed on this node. */
static const int marker_done;
-static const int marker_allow_add;
-static const int marker_allow_alter;
#define MARKER_DONE (&marker_done)
+
+/* Marker indicating that add_* may be called for this path, or that it
+ can be the destination of a copy or move. For copy/move, the path
+ will switch to MARKER_ALLOW_ALTER, to enable further tweaks. */
+static const int marker_allow_add;
#define MARKER_ALLOW_ADD (&marker_allow_add)
+
+/* Marker indicating that alter_* may be called for this path. */
+static const int marker_allow_alter;
#define MARKER_ALLOW_ALTER (&marker_allow_alter)
+/* Just like MARKER_DONE, but also indicates that the node was created
+ via add_directory(). This allows us to verify that the CHILDREN param
+ was comprehensive. */
+static const int marker_added_dir;
+#define MARKER_ADDED_DIR (&marker_added_dir)
+
#define MARK_FINISHED(editor) ((editor)->finished = TRUE)
#define SHOULD_NOT_BE_FINISHED(editor) SVN_ERR_ASSERT(!(editor)->finished)
@@ -79,28 +92,32 @@ static const int marker_allow_alter;
apr_hash_set((editor)->pending_incomplete_children, relpath, \
APR_HASH_KEY_STRING, NULL);
-#define MARK_COMPLETED(editor, relpath) \
+#define MARK_RELPATH(editor, relpath, value) \
apr_hash_set((editor)->completed_nodes, \
apr_pstrdup((editor)->result_pool, relpath), \
- APR_HASH_KEY_STRING, MARKER_DONE)
+ APR_HASH_KEY_STRING, value)
+
+#define MARK_COMPLETED(editor, relpath) \
+ MARK_RELPATH(editor, relpath, MARKER_DONE)
#define SHOULD_NOT_BE_COMPLETED(editor, relpath) \
SVN_ERR_ASSERT(apr_hash_get((editor)->completed_nodes, relpath, \
APR_HASH_KEY_STRING) == NULL)
#define MARK_ALLOW_ADD(editor, relpath) \
- apr_hash_set((editor)->completed_nodes, \
- apr_pstrdup((editor)->result_pool, relpath), \
- APR_HASH_KEY_STRING, MARKER_ALLOW_ADD)
+ MARK_RELPATH(editor, relpath, MARKER_ALLOW_ADD)
#define SHOULD_ALLOW_ADD(editor, relpath) \
SVN_ERR_ASSERT(allow_either(editor, relpath, MARKER_ALLOW_ADD, NULL))
#define MARK_ALLOW_ALTER(editor, relpath) \
- apr_hash_set((editor)->completed_nodes, \
- apr_pstrdup((editor)->result_pool, relpath), \
- APR_HASH_KEY_STRING, MARKER_ALLOW_ALTER)
+ MARK_RELPATH(editor, relpath, MARKER_ALLOW_ALTER)
#define SHOULD_ALLOW_ALTER(editor, relpath) \
SVN_ERR_ASSERT(allow_either(editor, relpath, MARKER_ALLOW_ALTER, NULL))
+#define MARK_ADDED_DIR(editor, relpath) \
+ MARK_RELPATH(editor, relpath, MARKER_ADDED_DIR)
+#define CHECK_UNKNOWN_CHILD(editor, relpath) \
+ SVN_ERR_ASSERT(check_unknown_child(editor, relpath))
+
static svn_boolean_t
allow_either(const svn_editor_t *editor,
const char *relpath,
@@ -112,6 +129,32 @@ allow_either(const svn_editor_t *editor,
return value == marker1 || value == marker2;
}
+static svn_boolean_t
+check_unknown_child(const svn_editor_t *editor,
+ const char *relpath)
+{
+ const char *parent;
+
+ /* If we already know about the new child, then exit early. */
+ if (apr_hash_get(editor->pending_incomplete_children, relpath,
+ APR_HASH_KEY_STRING) != NULL)
+ return TRUE;
+
+ parent = svn_relpath_dirname(relpath, editor->scratch_pool);
+
+ /* Was this parent created via svn_editor_add_directory() ? */
+ if (apr_hash_get(editor->completed_nodes, parent, APR_HASH_KEY_STRING)
+ == MARKER_ADDED_DIR)
+ {
+ /* Whoops. This child should have been listed in that add call,
+ and placed into ->pending_incomplete_children. */
+ return FALSE;
+ }
+
+ /* The parent was not added in this drive. */
+ return TRUE;
+}
+
#else
/* Be wary with the definition of these macros so that we don't
@@ -132,6 +175,9 @@ allow_either(const svn_editor_t *editor,
#define MARK_ALLOW_ALTER(editor, relpath) /* empty */
#define SHOULD_ALLOW_ALTER(editor, relpath) /* empty */
+#define MARK_ADDED_DIR(editor, relpath) /* empty */
+#define CHECK_UNKNOWN_CHILD(editor, relpath) /* empty */
+
#endif /* ENABLE_ORDERING_CHECK */
@@ -331,6 +377,7 @@ svn_editor_add_directory(svn_editor_t *e
SVN_ERR_ASSERT(props != NULL);
SHOULD_NOT_BE_FINISHED(editor);
SHOULD_ALLOW_ADD(editor, relpath);
+ CHECK_UNKNOWN_CHILD(editor, relpath);
if (editor->cancel_func)
SVN_ERR(editor->cancel_func(editor->cancel_baton));
@@ -340,7 +387,7 @@ svn_editor_add_directory(svn_editor_t *e
props, replaces_rev,
editor->scratch_pool);
- MARK_COMPLETED(editor, relpath);
+ MARK_ADDED_DIR(editor, relpath);
CLEAR_INCOMPLETE(editor, relpath);
#ifdef ENABLE_ORDERING_CHECK
@@ -378,6 +425,7 @@ svn_editor_add_file(svn_editor_t *editor
SVN_ERR_ASSERT(props != NULL);
SHOULD_NOT_BE_FINISHED(editor);
SHOULD_ALLOW_ADD(editor, relpath);
+ CHECK_UNKNOWN_CHILD(editor, relpath);
if (editor->cancel_func)
SVN_ERR(editor->cancel_func(editor->cancel_baton));
@@ -407,6 +455,7 @@ svn_editor_add_symlink(svn_editor_t *edi
SVN_ERR_ASSERT(props != NULL);
SHOULD_NOT_BE_FINISHED(editor);
SHOULD_ALLOW_ADD(editor, relpath);
+ CHECK_UNKNOWN_CHILD(editor, relpath);
if (editor->cancel_func)
SVN_ERR(editor->cancel_func(editor->cancel_baton));
@@ -433,6 +482,7 @@ svn_editor_add_absent(svn_editor_t *edit
SHOULD_NOT_BE_FINISHED(editor);
SHOULD_ALLOW_ADD(editor, relpath);
+ CHECK_UNKNOWN_CHILD(editor, relpath);
if (editor->cancel_func)
SVN_ERR(editor->cancel_func(editor->cancel_baton));
@@ -582,6 +632,7 @@ svn_editor_copy(svn_editor_t *editor,
editor->scratch_pool);
MARK_ALLOW_ALTER(editor, dst_relpath);
+ CLEAR_INCOMPLETE(editor, dst_relpath);
svn_pool_clear(editor->scratch_pool);
return err;
@@ -611,6 +662,7 @@ svn_editor_move(svn_editor_t *editor,
MARK_ALLOW_ADD(editor, src_relpath);
MARK_ALLOW_ALTER(editor, dst_relpath);
+ CLEAR_INCOMPLETE(editor, dst_relpath);
svn_pool_clear(editor->scratch_pool);
return err;
Modified: subversion/branches/ev2-export/subversion/libsvn_fs_fs/fs_fs.c
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/libsvn_fs_fs/fs_fs.c?rev=1245224&r1=1245223&r2=1245224&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/libsvn_fs_fs/fs_fs.c (original)
+++ subversion/branches/ev2-export/subversion/libsvn_fs_fs/fs_fs.c Thu Feb 16 22:39:27 2012
@@ -2941,7 +2941,8 @@ struct rep_read_baton
};
/* Combine the name of the rev file in RS with the given OFFSET to form
- * a cache lookup key. Allocations will be made from POOL. */
+ * a cache lookup key. Allocations will be made from POOL. May return
+ * NULL if the key cannot be constructed. */
static const char*
get_window_key(struct rep_state *rs, apr_off_t offset, apr_pool_t *pool)
{
@@ -2955,7 +2956,7 @@ get_window_key(struct rep_state *rs, apr
* comparison _will_ find them.
*/
if (apr_file_name_get(&name, rs->file))
- return "";
+ return NULL;
/* Handle packed files as well by scanning backwards until we find the
* revision or pack number. */
@@ -5376,6 +5377,80 @@ rep_write_get_baton(struct rep_write_bat
return SVN_NO_ERROR;
}
+/* For the hash REP->SHA1, try to find an already existing representation
+ in FS and return it in *OUT_REP. If no such representation exists or
+ if rep sharing has been disabled for FS, NULL will be returned. Since
+ there may be new duplicate representations within the same uncommitted
+ revision, those can be passed in REPS_HASH (maps a sha1 digest onto
+ representation_t*), otherwise pass in NULL for REPS_HASH.
+ POOL will be used for allocations. The lifetime of the returned rep is
+ limited by both, POOL and REP lifetime.
+ */
+static svn_error_t *
+get_shared_rep(representation_t **old_rep,
+ svn_fs_t *fs,
+ representation_t *rep,
+ apr_hash_t *reps_hash,
+ apr_pool_t *pool)
+{
+ svn_error_t *err;
+ fs_fs_data_t *ffd = fs->fsap_data;
+
+ /* Return NULL, if rep sharing has been disabled. */
+ *old_rep = NULL;
+ if (!ffd->rep_sharing_allowed)
+ return SVN_NO_ERROR;
+
+ /* Check and see if we already have a representation somewhere that's
+ identical to the one we just wrote out. Start with the hash lookup
+ because it is cheepest. */
+ if (reps_hash)
+ *old_rep = apr_hash_get(reps_hash,
+ rep->sha1_checksum->digest,
+ APR_SHA1_DIGESTSIZE);
+
+ /* If we haven't found anything yet, try harder and consult our DB. */
+ if (*old_rep == NULL)
+ {
+ err = svn_fs_fs__get_rep_reference(old_rep, fs, rep->sha1_checksum,
+ pool);
+ /* ### Other error codes that we shouldn't mask out? */
+ if (err == SVN_NO_ERROR
+ || err->apr_err == SVN_ERR_FS_CORRUPT
+ || SVN_ERROR_IN_CATEGORY(err->apr_err,
+ SVN_ERR_MALFUNC_CATEGORY_START))
+ {
+ /* Fatal error; don't mask it.
+
+ In particular, this block is triggered when the rep-cache refers
+ to revisions in the future. We signal that as a corruption situation
+ since, once those revisions are less than youngest (because of more
+ commits), the rep-cache would be invalid.
+ */
+ SVN_ERR(err);
+ }
+ else
+ {
+ /* Something's wrong with the rep-sharing index. We can continue
+ without rep-sharing, but warn.
+ */
+ (fs->warning)(fs->warning_baton, err);
+ svn_error_clear(err);
+ *old_rep = NULL;
+ }
+ }
+
+ /* Add information that is missing in the cached data. */
+ if (*old_rep)
+ {
+ /* Use the old rep for this content. */
+ (*old_rep)->md5_checksum = rep->md5_checksum;
+ (*old_rep)->uniquifier = rep->uniquifier;
+ }
+
+ return SVN_NO_ERROR;
+}
+
/* Close handler for the representation write stream. BATON is a
rep_write_baton. Writes out a new node-rev that correctly
references the representation we just finished writing. */
@@ -5383,7 +5458,6 @@ static svn_error_t *
rep_write_contents_close(void *baton)
{
struct rep_write_baton *b = baton;
- fs_fs_data_t *ffd = b->fs->fsap_data;
const char *unique_suffix;
representation_t *rep;
representation_t *old_rep;
@@ -5417,38 +5491,7 @@ rep_write_contents_close(void *baton)
/* Check and see if we already have a representation somewhere that's
identical to the one we just wrote out. */
- if (ffd->rep_sharing_allowed)
- {
- svn_error_t *err;
- err = svn_fs_fs__get_rep_reference(&old_rep, b->fs, rep->sha1_checksum,
- b->parent_pool);
- /* ### Other error codes that we shouldn't mask out? */
- if (err == SVN_NO_ERROR
- || err->apr_err == SVN_ERR_FS_CORRUPT
- || SVN_ERROR_IN_CATEGORY(err->apr_err,
- SVN_ERR_MALFUNC_CATEGORY_START))
- {
- /* Fatal error; don't mask it.
-
- In particular, this block is triggered when the rep-cache refers
- to revisions in the future. We signal that as a corruption situation
- since, once those revisions are less than youngest (because of more
- commits), the rep-cache would be invalid.
- */
- SVN_ERR(err);
- }
- else
- {
- /* Something's wrong with the rep-sharing index. We can continue
- without rep-sharing, but warn.
- */
- (b->fs->warning)(b->fs->warning_baton, err);
- svn_error_clear(err);
- old_rep = NULL;
- }
- }
- else
- old_rep = NULL;
+ SVN_ERR(get_shared_rep(&old_rep, b->fs, rep, NULL, b->parent_pool));
if (old_rep)
{
@@ -5456,8 +5499,6 @@ rep_write_contents_close(void *baton)
SVN_ERR(svn_io_file_trunc(b->file, b->rep_offset, b->pool));
/* Use the old rep for this content. */
- old_rep->md5_checksum = rep->md5_checksum;
- old_rep->uniquifier = rep->uniquifier;
b->noderev->data_rep = old_rep;
}
else
@@ -5624,7 +5665,8 @@ struct write_hash_baton
apr_size_t size;
- svn_checksum_ctx_t *checksum_ctx;
+ svn_checksum_ctx_t *md5_ctx;
+ svn_checksum_ctx_t *sha1_ctx;
};
/* The handler for the write_hash_rep stream. BATON is a
@@ -5637,7 +5679,8 @@ write_hash_handler(void *baton,
{
struct write_hash_baton *whb = baton;
- SVN_ERR(svn_checksum_update(whb->checksum_ctx, data, *len));
+ SVN_ERR(svn_checksum_update(whb->md5_ctx, data, *len));
+ SVN_ERR(svn_checksum_update(whb->sha1_ctx, data, *len));
SVN_ERR(svn_stream_write(whb->stream, data, len));
whb->size += *len;
@@ -5646,23 +5689,32 @@ write_hash_handler(void *baton,
}
/* Write out the hash HASH as a text representation to file FILE. In
- the process, record the total size of the dump in *SIZE, and the
- md5 digest in CHECKSUM. Perform temporary allocations in POOL. */
+ the process, record position, the total size of the dump and MD5 as
+ well as SHA1 in REP. If rep sharing has been enabled and REPS_HASH
+ is not NULL, it will be used in addition to the on-disk cache to find
+ earlier reps with the same content. When such existing reps can be
+ found, we will truncate the one just written from the file and return
+ the existing rep. Perform temporary allocations in POOL. */
static svn_error_t *
-write_hash_rep(svn_filesize_t *size,
- svn_checksum_t **checksum,
+write_hash_rep(representation_t *rep,
apr_file_t *file,
apr_hash_t *hash,
+ svn_fs_t *fs,
+ apr_hash_t *reps_hash,
apr_pool_t *pool)
{
svn_stream_t *stream;
struct write_hash_baton *whb;
+ representation_t *old_rep;
+
+ SVN_ERR(get_file_offset(&rep->offset, file, pool));
whb = apr_pcalloc(pool, sizeof(*whb));
whb->stream = svn_stream_from_aprfile2(file, TRUE, pool);
whb->size = 0;
- whb->checksum_ctx = svn_checksum_ctx_create(svn_checksum_md5, pool);
+ whb->md5_ctx = svn_checksum_ctx_create(svn_checksum_md5, pool);
+ whb->sha1_ctx = svn_checksum_ctx_create(svn_checksum_sha1, pool);
stream = svn_stream_create(whb, pool);
svn_stream_set_write(stream, write_hash_handler);
@@ -5672,15 +5724,41 @@ write_hash_rep(svn_filesize_t *size,
SVN_ERR(svn_hash_write2(hash, stream, SVN_HASH_TERMINATOR, pool));
/* Store the results. */
- SVN_ERR(svn_checksum_final(checksum, whb->checksum_ctx, pool));
- *size = whb->size;
+ SVN_ERR(svn_checksum_final(&rep->md5_checksum, whb->md5_ctx, pool));
+ SVN_ERR(svn_checksum_final(&rep->sha1_checksum, whb->sha1_ctx, pool));
+
+ /* Check and see if we already have a representation somewhere that's
+ identical to the one we just wrote out. */
+ SVN_ERR(get_shared_rep(&old_rep, fs, rep, reps_hash, pool));
+
+ if (old_rep)
+ {
+ /* We need to erase from the protorev the data we just wrote. */
+ SVN_ERR(svn_io_file_trunc(file, rep->offset, pool));
- return svn_stream_printf(whb->stream, pool, "ENDREP\n");
+ /* Use the old rep for this content. */
+ memcpy(rep, old_rep, sizeof (*rep));
+ }
+ else
+ {
+ /* Write out our cosmetic end marker. */
+ SVN_ERR(svn_stream_printf(whb->stream, pool, "ENDREP\n"));
+
+ /* update the representation */
+ rep->size = whb->size;
+ rep->expanded_size = 0;
+ }
+
+ return SVN_NO_ERROR;
}
/* Write out the hash HASH pertaining to the NODEREV in FS as a deltified
text representation to file FILE. In the process, record the total size
- and the md5 digest in REP. Perform temporary allocations in POOL. */
+ and the md5 digest in REP. If rep sharing has been enabled and REPS_HASH
+ is not NULL, it will be used in addition to the on-disk cache to find
+ earlier reps with the same content. When such existing reps can be found,
+ we will truncate the one just written from the file and return the existing
+ rep. Perform temporary allocations in POOL. */
#ifdef SVN_FS_FS_DELTIFY_DIRECTORIES
static svn_error_t *
write_hash_delta_rep(representation_t *rep,
@@ -5688,6 +5766,7 @@ write_hash_delta_rep(representation_t *r
apr_hash_t *hash,
svn_fs_t *fs,
node_revision_t *noderev,
+ apr_hash_t *reps_hash,
apr_pool_t *pool)
{
svn_txdelta_window_handler_t diff_wh;
@@ -5696,6 +5775,7 @@ write_hash_delta_rep(representation_t *r
svn_stream_t *file_stream;
svn_stream_t *stream;
representation_t *base_rep;
+ representation_t *old_rep;
svn_stream_t *source;
const char *header;
@@ -5741,7 +5821,8 @@ write_hash_delta_rep(representation_t *r
whb = apr_pcalloc(pool, sizeof(*whb));
whb->stream = svn_txdelta_target_push(diff_wh, diff_whb, source, pool);
whb->size = 0;
- whb->checksum_ctx = svn_checksum_ctx_create(svn_checksum_md5, pool);
+ whb->md5_ctx = svn_checksum_ctx_create(svn_checksum_md5, pool);
+ whb->sha1_ctx = svn_checksum_ctx_create(svn_checksum_sha1, pool);
/* serialize the hash */
stream = svn_stream_create(whb, pool);
@@ -5751,15 +5832,31 @@ write_hash_delta_rep(representation_t *r
SVN_ERR(svn_stream_close(whb->stream));
/* Store the results. */
- SVN_ERR(svn_checksum_final(&rep->md5_checksum, whb->checksum_ctx, pool));
+ SVN_ERR(svn_checksum_final(&rep->md5_checksum, whb->md5_ctx, pool));
+ SVN_ERR(svn_checksum_final(&rep->sha1_checksum, whb->sha1_ctx, pool));
+
+ /* Check and see if we already have a representation somewhere that's
+ identical to the one we just wrote out. */
+ SVN_ERR(get_shared_rep(&old_rep, fs, rep, reps_hash, pool));
- /* Write out our cosmetic end marker. */
- SVN_ERR(get_file_offset(&rep_end, file, pool));
- SVN_ERR(svn_stream_printf(file_stream, pool, "ENDREP\n"));
-
- /* update the representation */
- rep->expanded_size = whb->size;
- rep->size = rep_end - delta_start;
+ if (old_rep)
+ {
+ /* We need to erase from the protorev the data we just wrote. */
+ SVN_ERR(svn_io_file_trunc(file, rep->offset, pool));
+
+ /* Use the old rep for this content. */
+ memcpy(rep, old_rep, sizeof (*rep));
+ }
+ else
+ {
+ /* Write out our cosmetic end marker. */
+ SVN_ERR(get_file_offset(&rep_end, file, pool));
+ SVN_ERR(svn_stream_printf(file_stream, pool, "ENDREP\n"));
+
+ /* update the representation */
+ rep->expanded_size = whb->size;
+ rep->size = rep_end - delta_start;
+ }
return SVN_NO_ERROR;
}
@@ -5838,6 +5935,10 @@ validate_root_noderev(svn_fs_t *fs,
If REPS_TO_CACHE is not NULL, append to it a copy (allocated in
REPS_POOL) of each data rep that is new in this revision.
+ If REPS_HASH is not NULL, append copies (allocated in REPS_POOL)
+ of the representations of each property rep that is new in this
+ revision.
+
AT_ROOT is true if the node revision being written is the root
node-revision. It is only controls additional sanity checking
logic.
@@ -5853,6 +5954,7 @@ write_final_rev(const svn_fs_id_t **new_
const char *start_copy_id,
apr_off_t initial_offset,
apr_array_header_t *reps_to_cache,
+ apr_hash_t *reps_hash,
apr_pool_t *reps_pool,
svn_boolean_t at_root,
apr_pool_t *pool)
@@ -5891,7 +5993,7 @@ write_final_rev(const svn_fs_id_t **new_
svn_pool_clear(subpool);
SVN_ERR(write_final_rev(&new_id, file, rev, fs, dirent->id,
start_node_id, start_copy_id, initial_offset,
- reps_to_cache, reps_pool, FALSE,
+ reps_to_cache, reps_hash, reps_pool, FALSE,
subpool));
if (new_id && (svn_fs_fs__id_rev(new_id) == rev))
dirent->id = svn_fs_fs__id_copy(new_id, pool);
@@ -5908,13 +6010,11 @@ write_final_rev(const svn_fs_id_t **new_
#ifdef SVN_FS_FS_DELTIFY_DIRECTORIES
SVN_ERR(write_hash_delta_rep(noderev->data_rep, file,
- str_entries, fs, noderev, pool));
+ str_entries, fs, noderev, NULL,
+ pool));
#else
- SVN_ERR(get_file_offset(&noderev->data_rep->offset, file, pool));
- SVN_ERR(write_hash_rep(&noderev->data_rep->size,
- &noderev->data_rep->md5_checksum, file,
- str_entries, pool));
- noderev->data_rep->expanded_size = noderev->data_rep->size;
+ SVN_ERR(write_hash_rep(noderev->data_rep, file, str_entries,
+ fs, NULL, pool));
#endif
}
}
@@ -5945,17 +6045,17 @@ write_final_rev(const svn_fs_id_t **new_
apr_hash_t *proplist;
SVN_ERR(svn_fs_fs__get_proplist(&proplist, fs, noderev, pool));
+ noderev->prop_rep->txn_id = NULL;
+ noderev->prop_rep->revision = rev;
+
#ifdef SVN_FS_FS_DELTIFY_PROPS
SVN_ERR(write_hash_delta_rep(noderev->prop_rep, file,
- proplist, fs, noderev, pool));
+ proplist, fs, noderev, reps_hash,
+ pool));
#else
- SVN_ERR(get_file_offset(&noderev->prop_rep->offset, file, pool));
- SVN_ERR(write_hash_rep(&noderev->prop_rep->size,
- &noderev->prop_rep->md5_checksum, file,
- proplist, pool));
+ SVN_ERR(write_hash_rep(noderev->prop_rep, file, proplist,
+ fs, reps_hash, pool));
#endif
- noderev->prop_rep->txn_id = NULL;
- noderev->prop_rep->revision = rev;
}
@@ -5998,6 +6098,41 @@ write_final_rev(const svn_fs_id_t **new_
noderev->id = new_id;
+ if (ffd->rep_sharing_allowed)
+ {
+ /* Save the data representation's hash in the rep cache. */
+ if ( noderev->data_rep && noderev->kind == svn_node_file
+ && noderev->data_rep->revision == rev)
+ {
+ SVN_ERR_ASSERT(reps_to_cache && reps_pool);
+ APR_ARRAY_PUSH(reps_to_cache, representation_t *)
+ = svn_fs_fs__rep_copy(noderev->data_rep, reps_pool);
+ }
+
+ if (noderev->prop_rep && noderev->prop_rep->revision == rev)
+ {
+ /* Add new property reps to hash and on-disk cache. */
+ representation_t *copy
+ = svn_fs_fs__rep_copy(noderev->prop_rep, reps_pool);
+
+ SVN_ERR_ASSERT(reps_to_cache && reps_pool);
+ APR_ARRAY_PUSH(reps_to_cache, representation_t *) = copy;
+
+ apr_hash_set(reps_hash,
+ copy->sha1_checksum->digest,
+ APR_SHA1_DIGESTSIZE,
+ copy);
+ }
+ }
+
+ /* don't serialize SHA1 for dirs to disk (waste of space) */
+ if (noderev->data_rep && noderev->kind == svn_node_dir)
+ noderev->data_rep->sha1_checksum = NULL;
+
+ /* don't serialize SHA1 for props to disk (waste of space) */
+ if (noderev->prop_rep)
+ noderev->prop_rep->sha1_checksum = NULL;
+
/* Write out our new node-revision. */
if (at_root)
SVN_ERR(validate_root_noderev(fs, noderev, rev, pool));
@@ -6006,16 +6141,6 @@ write_final_rev(const svn_fs_id_t **new_
svn_fs_fs__fs_supports_mergeinfo(fs),
pool));
- /* Save the data representation's hash in the rep cache. */
- if (ffd->rep_sharing_allowed
- && noderev->data_rep && noderev->kind == svn_node_file
- && noderev->data_rep->revision == rev)
- {
- SVN_ERR_ASSERT(reps_to_cache && reps_pool);
- APR_ARRAY_PUSH(reps_to_cache, representation_t *)
- = svn_fs_fs__rep_copy(noderev->data_rep, reps_pool);
- }
-
/* Return our ID that references the revision file. */
*new_id_p = noderev->id;
@@ -6223,6 +6348,7 @@ struct commit_baton {
svn_fs_t *fs;
svn_fs_txn_t *txn;
apr_array_header_t *reps_to_cache;
+ apr_hash_t *reps_hash;
apr_pool_t *reps_pool;
};
@@ -6280,8 +6406,8 @@ commit_body(void *baton, apr_pool_t *poo
root_id = svn_fs_fs__id_txn_create("0", "0", cb->txn->id, pool);
SVN_ERR(write_final_rev(&new_root_id, proto_file, new_rev, cb->fs, root_id,
start_node_id, start_copy_id, initial_offset,
- cb->reps_to_cache, cb->reps_pool, TRUE,
- pool));
+ cb->reps_to_cache, cb->reps_hash, cb->reps_pool,
+ TRUE, pool));
/* Write the changed-path information. */
SVN_ERR(write_final_changed_path_info(&changed_path_offset, proto_file,
@@ -6455,11 +6581,13 @@ svn_fs_fs__commit(svn_revnum_t *new_rev_
if (ffd->rep_sharing_allowed)
{
cb.reps_to_cache = apr_array_make(pool, 5, sizeof(representation_t *));
+ cb.reps_hash = apr_hash_make(pool);
cb.reps_pool = pool;
}
else
{
cb.reps_to_cache = NULL;
+ cb.reps_hash = NULL;
cb.reps_pool = NULL;
}
Modified: subversion/branches/ev2-export/subversion/libsvn_ra_neon/merge.c
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/libsvn_ra_neon/merge.c?rev=1245224&r1=1245223&r2=1245224&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/libsvn_ra_neon/merge.c (original)
+++ subversion/branches/ev2-export/subversion/libsvn_ra_neon/merge.c Thu Feb 16 22:39:27 2012
@@ -576,29 +576,22 @@ svn_error_t * svn_ra_neon__assemble_lock
apr_hash_t *lock_tokens,
apr_pool_t *pool)
{
- apr_hash_index_t *hi;
- apr_size_t buf_size;
- const char *closing_tag = "</S:lock-token-list>";
- apr_size_t closing_tag_size = strlen(closing_tag);
- apr_pool_t *tmppool = svn_pool_create(pool);
- apr_hash_t *xml_locks = apr_hash_make(tmppool);
- svn_stringbuf_t *lockbuf = svn_stringbuf_create
- ("<S:lock-token-list xmlns:S=\"" SVN_XML_NAMESPACE "\">" DEBUG_CR, pool);
-
- buf_size = lockbuf->len;
-
+#define SVN_LOCK_TOKEN_LIST \
+ "<S:lock-token-list xmlns:S=\"" SVN_XML_NAMESPACE "\">" DEBUG_CR
#define SVN_LOCK "<S:lock>" DEBUG_CR
-#define SVN_LOCK_LEN sizeof(SVN_LOCK)-1
#define SVN_LOCK_CLOSE "</S:lock>" DEBUG_CR
-#define SVN_LOCK_CLOSE_LEN sizeof(SVN_LOCK_CLOSE)-1
#define SVN_LOCK_PATH "<S:lock-path>"
-#define SVN_LOCK_PATH_LEN sizeof(SVN_LOCK_PATH)-1
#define SVN_LOCK_PATH_CLOSE "</S:lock-path>" DEBUG_CR
-#define SVN_LOCK_PATH_CLOSE_LEN sizeof(SVN_LOCK_CLOSE)-1
#define SVN_LOCK_TOKEN "<S:lock-token>"
-#define SVN_LOCK_TOKEN_LEN sizeof(SVN_LOCK_TOKEN)-1
#define SVN_LOCK_TOKEN_CLOSE "</S:lock-token>" DEBUG_CR
-#define SVN_LOCK_TOKEN_CLOSE_LEN sizeof(SVN_LOCK_TOKEN_CLOSE)-1
+#define SVN_LOCK_TOKEN_LIST_CLOSE "</S:lock-token-list>"
+#define SVN_LEN(str) (sizeof(str) - 1)
+
+ apr_hash_index_t *hi;
+ apr_pool_t *tmppool = svn_pool_create(pool);
+ apr_hash_t *xml_locks = apr_hash_make(tmppool);
+ svn_stringbuf_t *lockbuf = svn_stringbuf_create(SVN_LOCK_TOKEN_LIST, pool);
+ apr_size_t buf_size = lockbuf->len;
/* First, figure out how much string data we're talking about,
and allocate a stringbuf big enough to hold it all... we *never*
@@ -622,17 +615,17 @@ svn_error_t * svn_ra_neon__assemble_lock
apr_hash_set(xml_locks, lock_path_xml->data, lock_path_xml->len, val);
/* Now, on with the stringbuf calculations. */
- buf_size += SVN_LOCK_LEN;
- buf_size += SVN_LOCK_PATH_LEN;
+ buf_size += SVN_LEN(SVN_LOCK);
+ buf_size += SVN_LEN(SVN_LOCK_PATH);
buf_size += lock_path_xml->len;
- buf_size += SVN_LOCK_PATH_CLOSE_LEN;
- buf_size += SVN_LOCK_TOKEN_LEN;
+ buf_size += SVN_LEN(SVN_LOCK_PATH_CLOSE);
+ buf_size += SVN_LEN(SVN_LOCK_TOKEN);
buf_size += strlen(val);
- buf_size += SVN_LOCK_TOKEN_CLOSE_LEN;
- buf_size += SVN_LOCK_CLOSE_LEN;
+ buf_size += SVN_LEN(SVN_LOCK_TOKEN_CLOSE);
+ buf_size += SVN_LEN(SVN_LOCK_CLOSE);
}
- buf_size += closing_tag_size;
+ buf_size += SVN_LEN(SVN_LOCK_TOKEN_LIST_CLOSE);
svn_stringbuf_ensure(lockbuf, buf_size + 1);
@@ -659,25 +652,25 @@ svn_error_t * svn_ra_neon__assemble_lock
svn_stringbuf_appendcstr(lockbuf, SVN_LOCK_CLOSE);
}
- svn_stringbuf_appendcstr(lockbuf, closing_tag);
+ svn_stringbuf_appendcstr(lockbuf, SVN_LOCK_TOKEN_LIST_CLOSE);
+
+ /* Check our size calculation was correct */
+ SVN_ERR_ASSERT(lockbuf->len == buf_size);
+ *body = lockbuf;
+
+ svn_pool_destroy(tmppool);
+ return SVN_NO_ERROR;
+
+#undef SVN_LOCK_TOKEN_LIST
#undef SVN_LOCK
-#undef SVN_LOCK_LEN
#undef SVN_LOCK_CLOSE
-#undef SVN_LOCK_CLOSE_LEN
#undef SVN_LOCK_PATH
-#undef SVN_LOCK_PATH_LEN
#undef SVN_LOCK_PATH_CLOSE
-#undef SVN_LOCK_PATH_CLOSE_LEN
#undef SVN_LOCK_TOKEN
-#undef SVN_LOCK_TOKEN_LEN
#undef SVN_LOCK_TOKEN_CLOSE
-#undef SVN_LOCK_TOKEN_CLOSE_LEN
-
- *body = lockbuf;
-
- svn_pool_destroy(tmppool);
- return SVN_NO_ERROR;
+#undef SVN_LOCK_TOKEN_LIST_CLOSE
+#undef SVN_LEN
}
Modified: subversion/branches/ev2-export/subversion/libsvn_ra_serf/update.c
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/libsvn_ra_serf/update.c?rev=1245224&r1=1245223&r2=1245224&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/libsvn_ra_serf/update.c (original)
+++ subversion/branches/ev2-export/subversion/libsvn_ra_serf/update.c Thu Feb 16 22:39:27 2012
@@ -1691,7 +1691,9 @@ start_report(svn_ra_serf__xml_parser_t *
}
else
{
- SVN_ERR_MALFUNCTION();
+ return svn_error_createf(SVN_ERR_RA_DAV_MALFORMED_DATA, NULL,
+ _("Unknown tag '%s' while at state %d"),
+ name.name, state);
}
}
@@ -1766,7 +1768,9 @@ start_report(svn_ra_serf__xml_parser_t *
}
else
{
- SVN_ERR_MALFUNCTION();
+ return svn_error_createf(SVN_ERR_RA_DAV_MALFORMED_DATA, NULL,
+ _("Unknown tag '%s' while at state %d"),
+ name.name, state);
}
}
else if (state == IGNORE_PROP_NAME)
Modified: subversion/branches/ev2-export/subversion/libsvn_repos/log.c
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/libsvn_repos/log.c?rev=1245224&r1=1245223&r2=1245224&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/libsvn_repos/log.c (original)
+++ subversion/branches/ev2-export/subversion/libsvn_repos/log.c Thu Feb 16 22:39:27 2012
@@ -264,6 +264,12 @@ detect_changed(apr_hash_t **changed,
: svn_tristate_false;
item->props_modified = change->prop_mod ? svn_tristate_true
: svn_tristate_false;
+
+ /* Pre-1.6 revision files don't store the change path kind, so fetch
+ it manually. */
+ if (item->node_kind == svn_node_unknown)
+ SVN_ERR(svn_fs_check_path(&item->node_kind, root, path, subpool));
+
if ((action == 'A') || (action == 'R'))
{
const char *copyfrom_path;
Modified: subversion/branches/ev2-export/subversion/libsvn_subr/auth.c
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/libsvn_subr/auth.c?rev=1245224&r1=1245223&r2=1245224&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/libsvn_subr/auth.c (original)
+++ subversion/branches/ev2-export/subversion/libsvn_subr/auth.c Thu Feb 16 22:39:27 2012
@@ -35,13 +35,20 @@
#include "svn_dso.h"
#include "svn_version.h"
-/* The good way to think of this machinery is as a set of tables.
+/* AN OVERVIEW
+ ===========
- - Each type of credentials selects a single table.
+ A good way to think of this machinery is as a set of tables.
- - In a given table, each row is a 'provider' capable of returning
- the same type of credentials. Each column represents a
- provider's repeated attempts to provide credentials.
+ - Each type of credentials selects a single table.
+
+ - In a given table, each row is a 'provider' capable of returning
+ the same type of credentials. Each column represents a
+ provider's repeated attempts to provide credentials.
+
+
+ Fetching Credentials from Providers
+ -----------------------------------
When the caller asks for a particular type of credentials, the
machinery in this file walks over the appropriate table. It starts
@@ -55,6 +62,23 @@
Note that the caller cannot see the table traversal, and thus has
no idea when we switch providers.
+
+
+ Storing Credentials with Providers
+ ----------------------------------
+
+ When the server has validated a set of credentials, and when
+ credential caching is enabled, we have the chance to store those
+ credentials for later use. The provider which provided the working
+ credentials is the first one given the opportunity to (re)cache
+ those credentials. Its save_credentials() function is invoked with
+ the working credentials. If that provider reports that it
+ successfully stored the credentials, we're done. Otherwise, we
+ walk the providers (rows) for that type of credentials in order
+ from the top of the table, allowing each in turn the opportunity to
+ store the credentials. When one reports that it has done so
+ successfully -- or when we run out of providers (rows) to try --
+ the table walk ends.
*/
Modified: subversion/branches/ev2-export/subversion/libsvn_subr/cache-inprocess.c
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/libsvn_subr/cache-inprocess.c?rev=1245224&r1=1245223&r2=1245224&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/libsvn_subr/cache-inprocess.c (original)
+++ subversion/branches/ev2-export/subversion/libsvn_subr/cache-inprocess.c Thu Feb 16 22:39:27 2012
@@ -213,15 +213,16 @@ inprocess_cache_get(void **value_p,
apr_pool_t *result_pool)
{
inprocess_cache_t *cache = cache_void;
- char* buffer;
+ char* buffer = NULL;
apr_size_t size;
- SVN_MUTEX__WITH_LOCK(cache->mutex,
- inprocess_cache_get_internal(&buffer,
- &size,
- cache,
- key,
- result_pool));
+ if (key)
+ SVN_MUTEX__WITH_LOCK(cache->mutex,
+ inprocess_cache_get_internal(&buffer,
+ &size,
+ cache,
+ key,
+ result_pool));
/* deserialize the buffer content. Usually, this will directly
modify the buffer content directly.
@@ -400,11 +401,12 @@ inprocess_cache_set(void *cache_void,
{
inprocess_cache_t *cache = cache_void;
- SVN_MUTEX__WITH_LOCK(cache->mutex,
- inprocess_cache_set_internal(cache,
- key,
- value,
- scratch_pool));
+ if (key)
+ SVN_MUTEX__WITH_LOCK(cache->mutex,
+ inprocess_cache_set_internal(cache,
+ key,
+ value,
+ scratch_pool));
return SVN_NO_ERROR;
}
@@ -482,14 +484,17 @@ inprocess_cache_get_partial(void **value
{
inprocess_cache_t *cache = cache_void;
- SVN_MUTEX__WITH_LOCK(cache->mutex,
- inprocess_cache_get_partial_internal(value_p,
- found,
- cache,
- key,
- func,
- baton,
- result_pool));
+ if (key)
+ SVN_MUTEX__WITH_LOCK(cache->mutex,
+ inprocess_cache_get_partial_internal(value_p,
+ found,
+ cache,
+ key,
+ func,
+ baton,
+ result_pool));
+ else
+ *found = FALSE;
return SVN_NO_ERROR;
}
@@ -526,12 +531,13 @@ inprocess_cache_set_partial(void *cache_
{
inprocess_cache_t *cache = cache_void;
- SVN_MUTEX__WITH_LOCK(cache->mutex,
- inprocess_cache_set_partial_internal(cache,
- key,
- func,
- baton,
- scratch_pool));
+ if (key)
+ SVN_MUTEX__WITH_LOCK(cache->mutex,
+ inprocess_cache_set_partial_internal(cache,
+ key,
+ func,
+ baton,
+ scratch_pool));
return SVN_NO_ERROR;
}
Modified: subversion/branches/ev2-export/subversion/libsvn_subr/cache-membuffer.c
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/libsvn_subr/cache-membuffer.c?rev=1245224&r1=1245223&r2=1245224&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/libsvn_subr/cache-membuffer.c (original)
+++ subversion/branches/ev2-export/subversion/libsvn_subr/cache-membuffer.c Thu Feb 16 22:39:27 2012
@@ -589,6 +589,9 @@ get_group_index(svn_membuffer_t **cache,
svn_checksum_t *checksum;
svn_error_t *err;
+ if (key == NULL)
+ return NO_INDEX;
+
err = svn_checksum(&checksum, svn_checksum_md5, key, len, pool);
if (err != NULL)
{
@@ -1363,11 +1366,12 @@ membuffer_cache_get_partial(svn_membuffe
group_index = get_group_index(&cache, key, key_len, to_find, result_pool);
- SVN_MUTEX__WITH_LOCK(cache->mutex,
- membuffer_cache_get_partial_internal
- (cache, group_index, to_find, item, found,
- deserializer, baton, DEBUG_CACHE_MEMBUFFER_TAG
- result_pool));
+ if (group_index != NO_INDEX)
+ SVN_MUTEX__WITH_LOCK(cache->mutex,
+ membuffer_cache_get_partial_internal
+ (cache, group_index, to_find, item, found,
+ deserializer, baton, DEBUG_CACHE_MEMBUFFER_TAG
+ result_pool));
return SVN_NO_ERROR;
}
@@ -1499,11 +1503,12 @@ membuffer_cache_set_partial(svn_membuffe
*/
group_index = get_group_index(&cache, key, key_len, to_find, scratch_pool);
- SVN_MUTEX__WITH_LOCK(cache->mutex,
- membuffer_cache_set_partial_internal
- (cache, group_index, to_find, func, baton,
- DEBUG_CACHE_MEMBUFFER_TAG_ARG
- scratch_pool));
+ if (group_index != NO_INDEX)
+ SVN_MUTEX__WITH_LOCK(cache->mutex,
+ membuffer_cache_set_partial_internal
+ (cache, group_index, to_find, func, baton,
+ DEBUG_CACHE_MEMBUFFER_TAG_ARG
+ scratch_pool));
/* done here -> unlock the cache
*/
@@ -1597,14 +1602,22 @@ combine_key(const void *prefix,
apr_size_t *full_key_len,
apr_pool_t *pool)
{
- if (key_len == APR_HASH_KEY_STRING)
- key_len = strlen((const char *) key);
+ if (key == NULL)
+ {
+ *full_key = NULL;
+ *full_key_len = 0;
+ }
+ else
+ {
+ if (key_len == APR_HASH_KEY_STRING)
+ key_len = strlen((const char *) key);
- *full_key_len = prefix_len + key_len;
- *full_key = apr_palloc(pool, *full_key_len);
+ *full_key_len = prefix_len + key_len;
+ *full_key = apr_palloc(pool, *full_key_len);
- memcpy(*full_key, prefix, prefix_len);
- memcpy((char *)*full_key + prefix_len, key, key_len);
+ memcpy(*full_key, prefix, prefix_len);
+ memcpy((char *)*full_key + prefix_len, key, key_len);
+ }
}
/* Implement svn_cache__vtable_t.get (not thread-safe)
Modified: subversion/branches/ev2-export/subversion/libsvn_subr/cache-memcache.c
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/libsvn_subr/cache-memcache.c?rev=1245224&r1=1245223&r2=1245224&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/libsvn_subr/cache-memcache.c (original)
+++ subversion/branches/ev2-export/subversion/libsvn_subr/cache-memcache.c Thu Feb 16 22:39:27 2012
@@ -141,8 +141,15 @@ memcache_internal_get(char **data,
memcache_t *cache = cache_void;
apr_status_t apr_err;
const char *mc_key;
- apr_pool_t *subpool = svn_pool_create(pool);
+ apr_pool_t *subpool;
+ if (key == NULL)
+ {
+ *found = FALSE;
+ return SVN_NO_ERROR;
+ }
+
+ subpool = svn_pool_create(pool);
SVN_ERR(build_key(&mc_key, cache, key, subpool));
apr_err = apr_memcache_getp(cache->memcache,
@@ -244,6 +251,9 @@ memcache_set(void *cache_void,
apr_size_t data_len;
svn_error_t *err;
+ if (key == NULL)
+ return SVN_NO_ERROR;
+
if (cache->serialize_func)
{
SVN_ERR((cache->serialize_func)(&data, &data_len, value, subpool));
Modified: subversion/branches/ev2-export/subversion/libsvn_subr/gpg_agent.c
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/libsvn_subr/gpg_agent.c?rev=1245224&r1=1245223&r2=1245224&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/libsvn_subr/gpg_agent.c (original)
+++ subversion/branches/ev2-export/subversion/libsvn_subr/gpg_agent.c Thu Feb 16 22:39:27 2012
@@ -154,8 +154,9 @@ send_option(int sd, char *buf, size_t n,
/* Implementation of svn_auth__password_get_t that retrieves the password
from gpg-agent */
-static svn_boolean_t
-password_get_gpg_agent(const char **password,
+static svn_error_t *
+password_get_gpg_agent(svn_boolean_t *done,
+ const char **password,
apr_hash_t *creds,
const char *realmstring,
const char *username,
@@ -182,6 +183,8 @@ password_get_gpg_agent(const char **pass
char *password_prompt;
char *realm_prompt;
+ *done = FALSE;
+
gpg_agent_info = getenv("GPG_AGENT_INFO");
if (gpg_agent_info != NULL)
{
@@ -190,7 +193,7 @@ password_get_gpg_agent(const char **pass
socket_name = APR_ARRAY_IDX(socket_details, 0, const char *);
}
else
- return FALSE;
+ return SVN_NO_ERROR;
if (socket_name != NULL)
{
@@ -200,29 +203,29 @@ password_get_gpg_agent(const char **pass
sd = socket(AF_UNIX, SOCK_STREAM, 0);
if (sd == -1)
- return FALSE;
+ return SVN_NO_ERROR;
if (connect(sd, (struct sockaddr *)&addr, sizeof(addr)) == -1)
{
close(sd);
- return FALSE;
+ return SVN_NO_ERROR;
}
}
else
- return FALSE;
+ return SVN_NO_ERROR;
/* Receive the connection status from the gpg-agent daemon. */
buffer = apr_palloc(pool, BUFFER_SIZE);
if (!receive_from_gpg_agent(sd, buffer, BUFFER_SIZE))
{
close(sd);
- return FALSE;
+ return SVN_NO_ERROR;
}
if (strncmp(buffer, "OK", 2) != 0)
{
close(sd);
- return FALSE;
+ return SVN_NO_ERROR;
}
/* The GPG-Agent documentation says:
@@ -232,19 +235,19 @@ password_get_gpg_agent(const char **pass
if (write(sd, request, strlen(request)) == -1)
{
close(sd);
- return FALSE;
+ return SVN_NO_ERROR;
}
if (!receive_from_gpg_agent(sd, buffer, BUFFER_SIZE))
{
close(sd);
- return FALSE;
+ return SVN_NO_ERROR;
}
if (strncmp(buffer, "D", 1) == 0)
p = &buffer[2];
if (!p)
{
close(sd);
- return FALSE;
+ return SVN_NO_ERROR;
}
ep = strchr(p, '\n');
if (ep != NULL)
@@ -252,18 +255,18 @@ password_get_gpg_agent(const char **pass
if (strcmp(socket_name, p) != 0)
{
close(sd);
- return FALSE;
+ return SVN_NO_ERROR;
}
/* The agent will terminate its response with "OK". */
if (!receive_from_gpg_agent(sd, buffer, BUFFER_SIZE))
{
close(sd);
- return FALSE;
+ return SVN_NO_ERROR;
}
if (strncmp(buffer, "OK", 2) != 0)
{
close(sd);
- return FALSE;
+ return SVN_NO_ERROR;
}
/* Send TTY_NAME to the gpg-agent daemon. */
@@ -273,13 +276,13 @@ password_get_gpg_agent(const char **pass
if (!send_option(sd, buffer, BUFFER_SIZE, "ttyname", tty_name, pool))
{
close(sd);
- return FALSE;
+ return SVN_NO_ERROR;
}
}
else
{
close(sd);
- return FALSE;
+ return SVN_NO_ERROR;
}
/* Send TTY_TYPE to the gpg-agent daemon. */
@@ -289,13 +292,13 @@ password_get_gpg_agent(const char **pass
if (!send_option(sd, buffer, BUFFER_SIZE, "ttytype", tty_type, pool))
{
close(sd);
- return FALSE;
+ return SVN_NO_ERROR;
}
}
else
{
close(sd);
- return FALSE;
+ return SVN_NO_ERROR;
}
/* Compute LC_CTYPE. */
@@ -311,7 +314,7 @@ password_get_gpg_agent(const char **pass
if (!send_option(sd, buffer, BUFFER_SIZE, "lc-ctype", lc_ctype, pool))
{
close(sd);
- return FALSE;
+ return SVN_NO_ERROR;
}
}
@@ -323,7 +326,7 @@ password_get_gpg_agent(const char **pass
if (!send_option(sd, buffer, BUFFER_SIZE, "display", display, pool))
{
close(sd);
- return FALSE;
+ return SVN_NO_ERROR;
}
}
@@ -348,25 +351,25 @@ password_get_gpg_agent(const char **pass
if (write(sd, request, strlen(request)) == -1)
{
close(sd);
- return FALSE;
+ return SVN_NO_ERROR;
}
if (!receive_from_gpg_agent(sd, buffer, BUFFER_SIZE))
{
close(sd);
- return FALSE;
+ return SVN_NO_ERROR;
}
close(sd);
if (strncmp(buffer, "ERR", 3) == 0)
- return FALSE;
+ return SVN_NO_ERROR;
p = NULL;
if (strncmp(buffer, "D", 1) == 0)
p = &buffer[2];
if (!p)
- return FALSE;
+ return SVN_NO_ERROR;
ep = strchr(p, '\n');
if (ep != NULL)
@@ -374,7 +377,8 @@ password_get_gpg_agent(const char **pass
*password = p;
- return TRUE;
+ *done = TRUE;
+ return SVN_NO_ERROR;
}
@@ -384,8 +388,9 @@ password_get_gpg_agent(const char **pass
the user via the pinentry program immediately upon its provision
(and regardless of its accuracy as passwords go), so there's
nothing really to do here. */
-static svn_boolean_t
-password_set_gpg_agent(apr_hash_t *creds,
+static svn_error_t *
+password_set_gpg_agent(svn_boolean_t *done,
+ apr_hash_t *creds,
const char *realmstring,
const char *username,
const char *password,
@@ -393,7 +398,9 @@ password_set_gpg_agent(apr_hash_t *creds
svn_boolean_t non_interactive,
apr_pool_t *pool)
{
- return TRUE;
+ *done = TRUE;
+
+ return SVN_NO_ERROR;
}
Modified: subversion/branches/ev2-export/subversion/libsvn_subr/macos_keychain.c
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/libsvn_subr/macos_keychain.c?rev=1245224&r1=1245223&r2=1245224&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/libsvn_subr/macos_keychain.c (original)
+++ subversion/branches/ev2-export/subversion/libsvn_subr/macos_keychain.c Thu Feb 16 22:39:27 2012
@@ -65,8 +65,9 @@
/* Implementation of svn_auth__password_set_t that stores
the password in the OS X KeyChain. */
-static svn_boolean_t
-keychain_password_set(apr_hash_t *creds,
+static svn_error_t *
+keychain_password_set(svn_boolean_t *done,
+ apr_hash_t *creds,
const char *realmstring,
const char *username,
const char *password,
@@ -106,13 +107,16 @@ keychain_password_set(apr_hash_t *creds,
if (non_interactive)
SecKeychainSetUserInteractionAllowed(TRUE);
- return status == 0;
+ *done = (status == 0);
+
+ return SVN_NO_ERROR;
}
/* Implementation of svn_auth__password_get_t that retrieves
the password from the OS X KeyChain. */
-static svn_boolean_t
-keychain_password_get(const char **password,
+static svn_error_t *
+keychain_password_get(svn_boolean_t *done,
+ const char **password,
apr_hash_t *creds,
const char *realmstring,
const char *username,
@@ -124,6 +128,8 @@ keychain_password_get(const char **passw
UInt32 length;
void *data;
+ *done = FALSE;
+
if (non_interactive)
SecKeychainSetUserInteractionAllowed(FALSE);
@@ -137,11 +143,12 @@ keychain_password_get(const char **passw
SecKeychainSetUserInteractionAllowed(TRUE);
if (status != 0)
- return FALSE;
+ return SVN_NO_ERROR;
*password = apr_pstrmemdup(pool, data, length);
SecKeychainItemFreeContent(NULL, data);
- return TRUE;
+ *done = TRUE;
+ return SVN_NO_ERROR;
}
/* Get cached encrypted credentials from the simple provider's cache. */
Modified: subversion/branches/ev2-export/subversion/libsvn_subr/simple_providers.c
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/libsvn_subr/simple_providers.c?rev=1245224&r1=1245223&r2=1245224&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/libsvn_subr/simple_providers.c (original)
+++ subversion/branches/ev2-export/subversion/libsvn_subr/simple_providers.c Thu Feb 16 22:39:27 2012
@@ -62,8 +62,9 @@ typedef struct simple_provider_baton_t
/* Implementation of svn_auth__password_get_t that retrieves
the plaintext password from CREDS. */
-svn_boolean_t
-svn_auth__simple_password_get(const char **password,
+svn_error_t *
+svn_auth__simple_password_get(svn_boolean_t *done,
+ const char **password,
apr_hash_t *creds,
const char *realmstring,
const char *username,
@@ -72,6 +73,9 @@ svn_auth__simple_password_get(const char
apr_pool_t *pool)
{
svn_string_t *str;
+
+ *done = FALSE;
+
str = apr_hash_get(creds, AUTHN_USERNAME_KEY, APR_HASH_KEY_STRING);
if (str && username && strcmp(str->data, username) == 0)
{
@@ -79,16 +83,18 @@ svn_auth__simple_password_get(const char
if (str && str->data)
{
*password = str->data;
- return TRUE;
+ *done = TRUE;
}
}
- return FALSE;
+
+ return SVN_NO_ERROR;
}
/* Implementation of svn_auth__password_set_t that stores
the plaintext password in CREDS. */
-svn_boolean_t
-svn_auth__simple_password_set(apr_hash_t *creds,
+svn_error_t *
+svn_auth__simple_password_set(svn_boolean_t *done,
+ apr_hash_t *creds,
const char *realmstring,
const char *username,
const char *password,
@@ -98,7 +104,9 @@ svn_auth__simple_password_set(apr_hash_t
{
apr_hash_set(creds, AUTHN_PASSWORD_KEY, APR_HASH_KEY_STRING,
svn_string_create(password, pool));
- return TRUE;
+ *done = TRUE;
+
+ return SVN_NO_ERROR;
}
/* Set **USERNAME to the username retrieved from CREDS; ignore
@@ -211,8 +219,12 @@ svn_auth__simple_first_creds_helper(void
{
if (have_passtype)
{
- if (!password_get(&default_password, creds_hash, realmstring,
- username, parameters, non_interactive, pool))
+ svn_boolean_t done;
+
+ SVN_ERR(password_get(&done, &default_password, creds_hash,
+ realmstring, username, parameters,
+ non_interactive, pool));
+ if (!done)
{
need_to_save = TRUE;
}
@@ -241,9 +253,12 @@ svn_auth__simple_first_creds_helper(void
password = NULL;
else
{
- if (!password_get(&password, creds_hash, realmstring,
- username, parameters, non_interactive,
- pool))
+ svn_boolean_t done;
+
+ SVN_ERR(password_get(&done, &password, creds_hash,
+ realmstring, username, parameters,
+ non_interactive, pool));
+ if (!done)
password = NULL;
/* If the auth data didn't contain a password type,
@@ -458,9 +473,9 @@ svn_auth__simple_save_creds_helper(svn_b
if (may_save_password)
{
- *saved = password_set(creds_hash, realmstring,
- creds->username, creds->password,
- parameters, non_interactive, pool);
+ SVN_ERR(password_set(saved, creds_hash, realmstring,
+ creds->username, creds->password,
+ parameters, non_interactive, pool));
if (*saved && passtype)
/* Store the password type with the auth data, so that we
know which provider owns the password. */
Modified: subversion/branches/ev2-export/subversion/libsvn_subr/skel.c
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/libsvn_subr/skel.c?rev=1245224&r1=1245223&r2=1245224&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/libsvn_subr/skel.c (original)
+++ subversion/branches/ev2-export/subversion/libsvn_subr/skel.c Thu Feb 16 22:39:27 2012
@@ -401,23 +401,16 @@ explicit_atom(const char *data,
static apr_size_t estimate_unparsed_size(const svn_skel_t *skel);
static svn_stringbuf_t *unparse(const svn_skel_t *skel,
- svn_stringbuf_t *str,
- apr_pool_t *pool);
+ svn_stringbuf_t *str);
svn_stringbuf_t *
svn_skel__unparse(const svn_skel_t *skel, apr_pool_t *pool)
{
- svn_stringbuf_t *str;
+ svn_stringbuf_t *str
+ = svn_stringbuf_create_ensure(estimate_unparsed_size(skel) + 200, pool);
- /* Allocate a string to hold the data. */
- str = apr_palloc(pool, sizeof(*str));
- str->pool = pool;
- str->blocksize = estimate_unparsed_size(skel) + 200;
- str->data = apr_palloc(pool, str->blocksize);
- str->len = 0;
-
- return unparse(skel, str, pool);
+ return unparse(skel, str);
}
@@ -486,10 +479,9 @@ use_implicit(const svn_skel_t *skel)
}
-/* Append the concrete representation of SKEL to the string STR.
- Grow S with new space from POOL as necessary. */
+/* Append the concrete representation of SKEL to the string STR. */
static svn_stringbuf_t *
-unparse(const svn_skel_t *skel, svn_stringbuf_t *str, apr_pool_t *pool)
+unparse(const svn_skel_t *skel, svn_stringbuf_t *str)
{
if (skel->is_atom)
{
@@ -508,33 +500,27 @@ unparse(const svn_skel_t *skel, svn_stri
/* Make sure we have room for the length, the space, and the
atom's contents. */
- svn_stringbuf_ensure(str, str->len + length_len + 1 + skel->len);
+ svn_stringbuf_ensure(str, str->len + length_len + 1 + skel->len + 1);
svn_stringbuf_appendbytes(str, buf, length_len);
- str->data[str->len++] = ' ';
+ svn_stringbuf_appendbyte(str, ' ');
svn_stringbuf_appendbytes(str, skel->data, skel->len);
}
}
else
{
- /* Append a list to STR. */
+ /* Append a list to STR: an opening parenthesis, the list elements
+ * separated by a space, and a closing parenthesis. */
svn_skel_t *child;
- /* Emit an opening parenthesis. */
- svn_stringbuf_ensure(str, str->len + 1);
- str->data[str->len++] = '(';
+ svn_stringbuf_appendbyte(str, '(');
- /* Append each element. Emit a space between each pair of elements. */
for (child = skel->children; child; child = child->next)
{
- unparse(child, str, pool);
+ unparse(child, str);
if (child->next)
- {
- svn_stringbuf_ensure(str, str->len + 1);
- str->data[str->len++] = ' ';
- }
+ svn_stringbuf_appendbyte(str, ' ');
}
- /* Emit a closing parenthesis. */
svn_stringbuf_appendbyte(str, ')');
}
Modified: subversion/branches/ev2-export/subversion/libsvn_subr/ssl_client_cert_pw_providers.c
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/libsvn_subr/ssl_client_cert_pw_providers.c?rev=1245224&r1=1245223&r2=1245224&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/libsvn_subr/ssl_client_cert_pw_providers.c (original)
+++ subversion/branches/ev2-export/subversion/libsvn_subr/ssl_client_cert_pw_providers.c Thu Feb 16 22:39:27 2012
@@ -63,8 +63,9 @@ typedef struct ssl_client_cert_pw_file_p
/* This implements the svn_auth__password_get_t interface.
Set **PASSPHRASE to the plaintext passphrase retrieved from CREDS;
ignore other parameters. */
-svn_boolean_t
-svn_auth__ssl_client_cert_pw_get(const char **passphrase,
+svn_error_t *
+svn_auth__ssl_client_cert_pw_get(svn_boolean_t *done,
+ const char **passphrase,
apr_hash_t *creds,
const char *realmstring,
const char *username,
@@ -77,15 +78,18 @@ svn_auth__ssl_client_cert_pw_get(const c
if (str && str->data)
{
*passphrase = str->data;
- return TRUE;
+ *done = TRUE;
+ return SVN_NO_ERROR;
}
+ *done = FALSE;
return FALSE;
}
/* This implements the svn_auth__password_set_t interface.
Store PASSPHRASE in CREDS; ignore other parameters. */
-svn_boolean_t
-svn_auth__ssl_client_cert_pw_set(apr_hash_t *creds,
+svn_error_t *
+svn_auth__ssl_client_cert_pw_set(svn_boolean_t *done,
+ apr_hash_t *creds,
const char *realmstring,
const char *username,
const char *passphrase,
@@ -95,7 +99,8 @@ svn_auth__ssl_client_cert_pw_set(apr_has
{
apr_hash_set(creds, AUTHN_PASSPHRASE_KEY, APR_HASH_KEY_STRING,
svn_string_create(passphrase, pool));
- return TRUE;
+ *done = TRUE;
+ return SVN_NO_ERROR;
}
svn_error_t *
@@ -137,8 +142,11 @@ svn_auth__ssl_client_cert_pw_file_first_
svn_error_clear(err);
if (! err && creds_hash)
{
- if (!passphrase_get(&password, creds_hash, realmstring,
- NULL, parameters, non_interactive, pool))
+ svn_boolean_t done;
+
+ SVN_ERR(passphrase_get(&done, &password, creds_hash, realmstring,
+ NULL, parameters, non_interactive, pool));
+ if (!done)
password = NULL;
}
}
@@ -305,9 +313,9 @@ svn_auth__ssl_client_cert_pw_file_save_c
if (may_save_passphrase)
{
- *saved = passphrase_set(creds_hash, realmstring,
- NULL, creds->password, parameters,
- non_interactive, pool);
+ SVN_ERR(passphrase_set(saved, creds_hash, realmstring,
+ NULL, creds->password, parameters,
+ non_interactive, pool));
if (*saved && passtype)
{
Modified: subversion/branches/ev2-export/subversion/libsvn_subr/stream.c
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/libsvn_subr/stream.c?rev=1245224&r1=1245223&r2=1245224&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/libsvn_subr/stream.c (original)
+++ subversion/branches/ev2-export/subversion/libsvn_subr/stream.c Thu Feb 16 22:39:27 2012
@@ -376,7 +376,7 @@ stream_readline_chunky(svn_stringbuf_t *
{
/* Append the next chunk to the string read so far.
*/
- svn_stringbuf_ensure(str, str->len + LINE_CHUNK_SIZE);
+ svn_stringbuf_ensure(str, str->len + LINE_CHUNK_SIZE + 1);
numbytes = LINE_CHUNK_SIZE;
SVN_ERR(svn_stream_read(stream, str->data + str->len, &numbytes));
str->len += numbytes;
Modified: subversion/branches/ev2-export/subversion/libsvn_subr/svn_base64.c
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/libsvn_subr/svn_base64.c?rev=1245224&r1=1245223&r2=1245224&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/libsvn_subr/svn_base64.c (original)
+++ subversion/branches/ev2-export/subversion/libsvn_subr/svn_base64.c Thu Feb 16 22:39:27 2012
@@ -407,10 +407,16 @@ decode_bytes(svn_stringbuf_t *str, const
signed char find;
const char *end = data + len;
- /* Resize the stringbuf to make room for the (approximate) size of
- output, to avoid repeated resizes later.
- The optimizations in decode_line rely on no resizes being necessary! */
- svn_stringbuf_ensure(str, str->len + (len / 4) * 3 + 3);
+ /* Resize the stringbuf to make room for the maximum size of output,
+ to avoid repeated resizes later. The optimizations in
+ decode_line rely on no resizes being necessary!
+
+ (*inbuflen+len) is encoded data length
+ (*inbuflen+len)/4 is the number of complete 4-bytes sets
+ (*inbuflen+len)/4*3 is the number of decoded bytes
+ (*inbuflen+len)/4*3+1 is the number of decoded bytes plus a null
+ */
+ svn_stringbuf_ensure(str, str->len + ((*inbuflen + len) / 4) * 3 + 1);
while ( !*done && p < end )
{
Modified: subversion/branches/ev2-export/subversion/libsvn_subr/win32_crypto.c
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/libsvn_subr/win32_crypto.c?rev=1245224&r1=1245223&r2=1245224&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/libsvn_subr/win32_crypto.c (original)
+++ subversion/branches/ev2-export/subversion/libsvn_subr/win32_crypto.c Thu Feb 16 22:39:27 2012
@@ -52,8 +52,9 @@ static const WCHAR description[] = L"aut
/* Implementation of svn_auth__password_set_t that encrypts
the incoming password using the Windows CryptoAPI. */
-static svn_boolean_t
-windows_password_encrypter(apr_hash_t *creds,
+static svn_error_t *
+windows_password_encrypter(svn_boolean_t *done,
+ apr_hash_t *creds,
const char *realmstring,
const char *username,
const char *in,
@@ -73,20 +74,21 @@ windows_password_encrypter(apr_hash_t *c
{
char *coded = apr_palloc(pool, apr_base64_encode_len(blobout.cbData));
apr_base64_encode(coded, (const char*)blobout.pbData, blobout.cbData);
- crypted = svn_auth__simple_password_set(creds, realmstring, username,
- coded, parameters,
- non_interactive, pool);
+ SVN_ERR(svn_auth__simple_password_set(done, creds, realmstring, username,
+ coded, parameters,
+ non_interactive, pool));
LocalFree(blobout.pbData);
}
- return crypted;
+ return SVN_NO_ERROR;
}
/* Implementation of svn_auth__password_get_t that decrypts
the incoming password using the Windows CryptoAPI and verifies its
validity. */
-static svn_boolean_t
-windows_password_decrypter(const char **out,
+static svn_error_t *
+windows_password_decrypter(svn_boolean_t *done,
+ const char **out,
apr_hash_t *creds,
const char *realmstring,
const char *username,
@@ -100,9 +102,10 @@ windows_password_decrypter(const char **
svn_boolean_t decrypted;
char *in;
- if (!svn_auth__simple_password_get(&in, creds, realmstring, username,
- parameters, non_interactive, pool))
- return FALSE;
+ SVN_ERR(svn_auth__simple_password_get(done, &in, creds, realmstring, username,
+ parameters, non_interactive, pool));
+ if (!done)
+ return SVN_NO_ERROR;
blobin.cbData = strlen(in);
blobin.pbData = apr_palloc(pool, apr_base64_decode_len(in));
@@ -119,7 +122,8 @@ windows_password_decrypter(const char **
LocalFree(descr);
}
- return decrypted;
+ *done = decrypted;
+ return SVN_NO_ERROR;
}
/* Get cached encrypted credentials from the simple provider's cache. */
@@ -186,8 +190,9 @@ svn_auth_get_windows_simple_provider(svn
/* Implementation of svn_auth__password_set_t that encrypts
the incoming password using the Windows CryptoAPI. */
-static svn_boolean_t
-windows_ssl_client_cert_pw_encrypter(apr_hash_t *creds,
+static svn_error_t *
+windows_ssl_client_cert_pw_encrypter(svn_boolean_t *done,
+ apr_hash_t *creds,
const char *realmstring,
const char *username,
const char *in,
@@ -207,20 +212,21 @@ windows_ssl_client_cert_pw_encrypter(apr
{
char *coded = apr_palloc(pool, apr_base64_encode_len(blobout.cbData));
apr_base64_encode(coded, (const char*)blobout.pbData, blobout.cbData);
- crypted = svn_auth__ssl_client_cert_pw_set(creds, realmstring, username,
- coded, parameters,
- non_interactive, pool);
+ SVN_ERR(svn_auth__ssl_client_cert_pw_set(done, creds, realmstring,
+ username, coded, parameters,
+ non_interactive, pool));
LocalFree(blobout.pbData);
}
- return crypted;
+ return SVN_NO_ERROR;
}
/* Implementation of svn_auth__password_get_t that decrypts
the incoming password using the Windows CryptoAPI and verifies its
validity. */
-static svn_boolean_t
-windows_ssl_client_cert_pw_decrypter(const char **out,
+static svn_error_t *
+windows_ssl_client_cert_pw_decrypter(svn_boolean_t *done,
+ const char **out,
apr_hash_t *creds,
const char *realmstring,
const char *username,
@@ -234,9 +240,11 @@ windows_ssl_client_cert_pw_decrypter(con
svn_boolean_t decrypted;
char *in;
- if (!svn_auth__ssl_client_cert_pw_get(&in, creds, realmstring, username,
- parameters, non_interactive, pool))
- return FALSE;
+ SVN_ERR(svn_auth__ssl_client_cert_pw_get(done, &in, creds, realmstring,
+ username, parameters,
+ non_interactive, pool));
+ if (!done)
+ return SVN_NO_ERROR;
blobin.cbData = strlen(in);
blobin.pbData = apr_palloc(pool, apr_base64_decode_len(in));
@@ -253,7 +261,8 @@ windows_ssl_client_cert_pw_decrypter(con
LocalFree(descr);
}
- return decrypted;
+ *done = decrypted;
+ return SVN_NO_ERROR;
}
/* Get cached encrypted credentials from the simple provider's cache. */
Modified: subversion/branches/ev2-export/subversion/libsvn_wc/deprecated.c
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/libsvn_wc/deprecated.c?rev=1245224&r1=1245223&r2=1245224&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/libsvn_wc/deprecated.c (original)
+++ subversion/branches/ev2-export/subversion/libsvn_wc/deprecated.c Thu Feb 16 22:39:27 2012
@@ -1907,6 +1907,43 @@ static struct svn_wc_diff_callbacks4_t d
wrap_4to3_dir_closed
};
+
+svn_error_t *
+svn_wc_get_diff_editor6(const svn_delta_editor_t **editor,
+ void **edit_baton,
+ svn_wc_context_t *wc_ctx,
+ const char *anchor_abspath,
+ const char *target,
+ svn_depth_t depth,
+ svn_boolean_t ignore_ancestry,
+ svn_boolean_t show_copies_as_adds,
+ svn_boolean_t use_git_diff_format,
+ svn_boolean_t use_text_base,
+ svn_boolean_t reverse_order,
+ svn_boolean_t server_performs_filtering,
+ const apr_array_header_t *changelist_filter,
+ const svn_wc_diff_callbacks4_t *callbacks,
+ void *callback_baton,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ return svn_error_trace(
+ svn_wc__get_diff_editor(editor, edit_baton,
+ wc_ctx,
+ anchor_abspath, target,
+ depth,
+ ignore_ancestry, show_copies_as_adds,
+ use_git_diff_format, use_text_base,
+ reverse_order, server_performs_filtering,
+ changelist_filter,
+ callbacks, callback_baton,
+ cancel_func, cancel_baton,
+ result_pool, scratch_pool));
+}
+
+
svn_error_t *
svn_wc_get_diff_editor5(svn_wc_adm_access_t *anchor,
const char *target,
@@ -2585,6 +2622,47 @@ status4_wrapper_func(void *baton,
return (*swb->old_func)(swb->old_baton, path, dup, scratch_pool);
}
+
+svn_error_t *
+svn_wc_get_status_editor5(const svn_delta_editor_t **editor,
+ void **edit_baton,
+ void **set_locks_baton,
+ svn_revnum_t *edit_revision,
+ svn_wc_context_t *wc_ctx,
+ const char *anchor_abspath,
+ const char *target_basename,
+ svn_depth_t depth,
+ svn_boolean_t get_all,
+ svn_boolean_t no_ignore,
+ svn_boolean_t depth_as_sticky,
+ svn_boolean_t server_performs_filtering,
+ const apr_array_header_t *ignore_patterns,
+ svn_wc_status_func4_t status_func,
+ void *status_baton,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ return svn_error_trace(
+ svn_wc__get_status_editor(editor, edit_baton,
+ set_locks_baton,
+ edit_revision,
+ wc_ctx,
+ anchor_abspath,
+ target_basename,
+ depth,
+ get_all, no_ignore,
+ depth_as_sticky,
+ server_performs_filtering,
+ ignore_patterns,
+ status_func, status_baton,
+ cancel_func, cancel_baton,
+ result_pool,
+ scratch_pool));
+}
+
+
svn_error_t *
svn_wc_get_status_editor4(const svn_delta_editor_t **editor,
void **edit_baton,
@@ -3154,6 +3232,59 @@ svn_wc_is_wc_root(svn_boolean_t *wc_root
return svn_error_trace(svn_wc_context_destroy(wc_ctx));
}
+
+svn_error_t *
+svn_wc_get_update_editor4(const svn_delta_editor_t **editor,
+ void **edit_baton,
+ svn_revnum_t *target_revision,
+ svn_wc_context_t *wc_ctx,
+ const char *anchor_abspath,
+ const char *target_basename,
+ svn_boolean_t use_commit_times,
+ svn_depth_t depth,
+ svn_boolean_t depth_is_sticky,
+ svn_boolean_t allow_unver_obstructions,
+ svn_boolean_t adds_as_modification,
+ svn_boolean_t server_performs_filtering,
+ svn_boolean_t clean_checkout,
+ const char *diff3_cmd,
+ const apr_array_header_t *preserved_exts,
+ svn_wc_dirents_func_t fetch_dirents_func,
+ void *fetch_dirents_baton,
+ svn_wc_conflict_resolver_func2_t conflict_func,
+ void *conflict_baton,
+ svn_wc_external_update_t external_func,
+ void *external_baton,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ svn_wc_notify_func2_t notify_func,
+ void *notify_baton,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ return svn_error_trace(
+ svn_wc__get_update_editor(editor, edit_baton,
+ target_revision,
+ wc_ctx,
+ anchor_abspath,
+ target_basename,
+ use_commit_times,
+ depth, depth_is_sticky,
+ allow_unver_obstructions,
+ adds_as_modification,
+ server_performs_filtering,
+ clean_checkout,
+ diff3_cmd,
+ preserved_exts,
+ fetch_dirents_func, fetch_dirents_baton,
+ conflict_func, conflict_baton,
+ external_func, external_baton,
+ cancel_func, cancel_baton,
+ notify_func, notify_baton,
+ result_pool, scratch_pool));
+}
+
+
svn_error_t *
svn_wc_get_update_editor3(svn_revnum_t *target_revision,
svn_wc_adm_access_t *anchor,
@@ -3288,6 +3419,56 @@ svn_wc_get_update_editor(svn_revnum_t *t
traversal_info, pool);
}
+
+svn_error_t *
+svn_wc_get_switch_editor4(const svn_delta_editor_t **editor,
+ void **edit_baton,
+ svn_revnum_t *target_revision,
+ svn_wc_context_t *wc_ctx,
+ const char *anchor_abspath,
+ const char *target_basename,
+ const char *switch_url,
+ svn_boolean_t use_commit_times,
+ svn_depth_t depth,
+ svn_boolean_t depth_is_sticky,
+ svn_boolean_t allow_unver_obstructions,
+ svn_boolean_t server_performs_filtering,
+ const char *diff3_cmd,
+ const apr_array_header_t *preserved_exts,
+ svn_wc_dirents_func_t fetch_dirents_func,
+ void *fetch_dirents_baton,
+ svn_wc_conflict_resolver_func2_t conflict_func,
+ void *conflict_baton,
+ svn_wc_external_update_t external_func,
+ void *external_baton,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ svn_wc_notify_func2_t notify_func,
+ void *notify_baton,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ return svn_error_trace(
+ svn_wc__get_switch_editor(editor, edit_baton,
+ target_revision,
+ wc_ctx,
+ anchor_abspath, target_basename,
+ switch_url,
+ use_commit_times,
+ depth, depth_is_sticky,
+ allow_unver_obstructions,
+ server_performs_filtering,
+ diff3_cmd,
+ preserved_exts,
+ fetch_dirents_func, fetch_dirents_baton,
+ conflict_func, conflict_baton,
+ external_func, external_baton,
+ cancel_func, cancel_baton,
+ notify_func, notify_baton,
+ result_pool, scratch_pool));
+}
+
+
svn_error_t *
svn_wc_get_switch_editor3(svn_revnum_t *target_revision,
svn_wc_adm_access_t *anchor,
Modified: subversion/branches/ev2-export/subversion/libsvn_wc/diff_editor.c
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/libsvn_wc/diff_editor.c?rev=1245224&r1=1245223&r2=1245224&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/libsvn_wc/diff_editor.c (original)
+++ subversion/branches/ev2-export/subversion/libsvn_wc/diff_editor.c Thu Feb 16 22:39:27 2012
@@ -1856,7 +1856,7 @@ close_edit(void *edit_baton,
/* Create a diff editor and baton. */
svn_error_t *
-svn_wc_get_diff_editor6(const svn_delta_editor_t **editor,
+svn_wc__get_diff_editor(const svn_delta_editor_t **editor,
void **edit_baton,
svn_wc_context_t *wc_ctx,
const char *anchor_abspath,
Modified: subversion/branches/ev2-export/subversion/libsvn_wc/status.c
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/libsvn_wc/status.c?rev=1245224&r1=1245223&r2=1245224&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/libsvn_wc/status.c (original)
+++ subversion/branches/ev2-export/subversion/libsvn_wc/status.c Thu Feb 16 22:39:27 2012
@@ -2425,7 +2425,7 @@ close_edit(void *edit_baton,
/*** Public API ***/
svn_error_t *
-svn_wc_get_status_editor5(const svn_delta_editor_t **editor,
+svn_wc__get_status_editor(const svn_delta_editor_t **editor,
void **edit_baton,
void **set_locks_baton,
svn_revnum_t *edit_revision,
Modified: subversion/branches/ev2-export/subversion/libsvn_wc/update_editor.c
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/libsvn_wc/update_editor.c?rev=1245224&r1=1245223&r2=1245224&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/libsvn_wc/update_editor.c (original)
+++ subversion/branches/ev2-export/subversion/libsvn_wc/update_editor.c Thu Feb 16 22:39:27 2012
@@ -5003,7 +5003,7 @@ make_editor(svn_revnum_t *target_revisio
svn_error_t *
-svn_wc_get_update_editor4(const svn_delta_editor_t **editor,
+svn_wc__get_update_editor(const svn_delta_editor_t **editor,
void **edit_baton,
svn_revnum_t *target_revision,
svn_wc_context_t *wc_ctx,
@@ -5046,7 +5046,7 @@ svn_wc_get_update_editor4(const svn_delt
}
svn_error_t *
-svn_wc_get_switch_editor4(const svn_delta_editor_t **editor,
+svn_wc__get_switch_editor(const svn_delta_editor_t **editor,
void **edit_baton,
svn_revnum_t *target_revision,
svn_wc_context_t *wc_ctx,
Modified: subversion/branches/ev2-export/subversion/mod_authz_svn/mod_authz_svn.c
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/mod_authz_svn/mod_authz_svn.c?rev=1245224&r1=1245223&r2=1245224&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/mod_authz_svn/mod_authz_svn.c (original)
+++ subversion/branches/ev2-export/subversion/mod_authz_svn/mod_authz_svn.c Thu Feb 16 22:39:27 2012
@@ -48,10 +48,11 @@
#include "private/svn_fspath.h"
-extern module AP_MODULE_DECLARE_DATA authz_svn_module;
-
#ifdef APLOG_USE_MODULE
APLOG_USE_MODULE(authz_svn);
+#else
+/* This is part of the APLOG_USE_MODULE() macro in httpd-2.3 */
+extern module AP_MODULE_DECLARE_DATA authz_svn_module;
#endif
typedef struct authz_svn_config_rec {