Author: stsp
Date: Thu Nov 24 19:55:12 2011
New Revision: 1205967
URL: http://svn.apache.org/viewvc?rev=1205967&view=rev
Log:
Sync the moves-scan-log branch with trunk.
Modified:
subversion/branches/moves-scan-log/ (props changed)
subversion/branches/moves-scan-log/CHANGES
subversion/branches/moves-scan-log/subversion/libsvn_client/merge.c
subversion/branches/moves-scan-log/subversion/libsvn_fs_base/bdb/locks-table.c
subversion/branches/moves-scan-log/subversion/libsvn_fs_base/reps-strings.c
subversion/branches/moves-scan-log/subversion/tests/libsvn_fs/locks-test.c
Propchange: subversion/branches/moves-scan-log/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Thu Nov 24 19:55:12 2011
@@ -57,4 +57,4 @@
/subversion/branches/tree-conflicts:868291-873154
/subversion/branches/tree-conflicts-notify:873926-874008
/subversion/branches/uris-as-urls:1060426-1064427
-/subversion/trunk:1186288-1205354
+/subversion/trunk:1186288-1205966
Modified: subversion/branches/moves-scan-log/CHANGES
URL:
http://svn.apache.org/viewvc/subversion/branches/moves-scan-log/CHANGES?rev=1205967&r1=1205966&r2=1205967&view=diff
==============================================================================
--- subversion/branches/moves-scan-log/CHANGES (original)
+++ subversion/branches/moves-scan-log/CHANGES Thu Nov 24 19:55:12 2011
@@ -38,17 +38,17 @@ Version 1.7.2
http://svn.apache.org/repos/asf/subversion/tags/1.7.2
User-visible changes:
- * fix working copy corruption (issue #4040)
+ * fix working copy corruption after interrupted update/switch (issue #4040)
* avoid segfaults against pre-1.5 servers (r1186928)
- * avoid configure error when using apr-util and bdb (r1186784)
- * make 'svn patch' ignore '/dev/null' targets (r1197998)
- * fix segfault on path that skips and deletes (r1199950)
- * omit output from 'commit --quiet' (r1200837)
- * fix authz denial when svnserve root is a repo (issue #4060)
+ * improve configure error message if apr-util uses old or no bdb (r1186784)
+ * make 'svn patch' ignore '/dev/null' targets for compat with git (r1197998)
+ * fix 'svn patch' segfault on patch that skips and deletes files (r1199950)
+ * omit "Committed revision N." output from 'svn commit --quiet' (r1200837)
+ * fix authz denial when svnserve root is a repository (issue #4060)
* fix uninitialized memory read in client diff code (r1201002)
* avoid potential segfault during merges (r1202807)
* fix an assertion failure when a symlink is updated (r1186944, -81, -83)
- * more working copy corruption protection (r1202603)
+ * make working copy operations fail if nodes have no base checksum
(r1202630)
* fix nested <Location>s when using v2 protocol (r1203546, -651, -653)
* make mod_dav_svn ignore non-Subversion POST requests (r1187695)
* avoid reading freed memory (r1204478)
Modified: subversion/branches/moves-scan-log/subversion/libsvn_client/merge.c
URL:
http://svn.apache.org/viewvc/subversion/branches/moves-scan-log/subversion/libsvn_client/merge.c?rev=1205967&r1=1205966&r2=1205967&view=diff
==============================================================================
--- subversion/branches/moves-scan-log/subversion/libsvn_client/merge.c
(original)
+++ subversion/branches/moves-scan-log/subversion/libsvn_client/merge.c Thu Nov
24 19:55:12 2011
@@ -1254,6 +1254,8 @@ merge_props_changed(svn_wc_notify_state_
else if (err)
return svn_error_trace(err);
}
+ else if (state)
+ *state = svn_wc_notify_state_unchanged;
return SVN_NO_ERROR;
}
@@ -2640,9 +2642,6 @@ typedef struct notification_receiver_bat
svn_wc_notify_func2_t wrapped_func;
void *wrapped_baton;
- /* The number of notifications received. */
- apr_uint32_t nbr_notifications;
-
/* The number of operative notifications received. */
apr_uint32_t nbr_operative_notifications;
@@ -2725,6 +2724,7 @@ find_nearest_ancestor(const apr_array_he
}
+/* Is the notification the result of a real operative merge? */
#define IS_OPERATIVE_NOTIFICATION(notify) \
(notify->content_state == svn_wc_notify_state_conflicted \
|| notify->content_state == svn_wc_notify_state_merged \
@@ -2741,7 +2741,7 @@ notification_receiver(void *baton, const
apr_pool_t *pool)
{
notification_receiver_baton_t *notify_b = baton;
- svn_boolean_t is_operative_notification = FALSE;
+ svn_boolean_t is_operative_notification = IS_OPERATIVE_NOTIFICATION(notify);
const char *notify_abspath;
/* Skip notifications if this is a --record-only merge that is adding
@@ -2753,11 +2753,9 @@ notification_receiver(void *baton, const
&& notify->action != svn_wc_notify_merge_record_info_begin))
return;
- /* Is the notification the result of a real operative merge? */
- if (IS_OPERATIVE_NOTIFICATION(notify))
+ if (is_operative_notification)
{
notify_b->nbr_operative_notifications++;
- is_operative_notification = TRUE;
}
/* If the node was moved-away, use its new path in the notification. */
@@ -2794,6 +2792,7 @@ notification_receiver(void *baton, const
notify_abspath = moved_to_abspath;
}
+ /* Update the lists of merged, skipped, tree-conflicted and added paths. */
if (notify_b->merge_b->sources_ancestral
|| notify_b->merge_b->reintegrate_merge)
{
@@ -2855,6 +2854,9 @@ notification_receiver(void *baton, const
else
{
added_path_parent = svn_dirent_dirname(added_path, pool);
+ /* ### Bug. Testing whether its immediate parent is in the
+ * hash isn't enough: this is letting every other level of
+ * the added subtree hierarchy into the hash. */
if (!apr_hash_get(notify_b->added_abspaths, added_path_parent,
APR_HASH_KEY_STRING))
is_root_of_added_subtree = TRUE;
@@ -2865,11 +2867,11 @@ notification_receiver(void *baton, const
}
}
+ /* Notify that a merge is beginning, if we haven't already done so.
+ * (A single-file merge is notified separately: see
single_file_merge_notify().) */
/* If our merge sources are ancestors of one another... */
if (notify_b->merge_b->sources_ancestral)
{
- notify_b->nbr_notifications++;
-
/* See if this is an operative directory merge. */
if (!(notify_b->is_single_file_merge) && is_operative_notification)
{
@@ -2903,6 +2905,8 @@ notification_receiver(void *baton, const
notify_b->cur_ancestor_index = new_nearest_ancestor_index;
if (!child->absent && child->remaining_ranges->nelts > 0
&& !(new_nearest_ancestor_index == 0
+ /* ### 'remaining_ranges == 0'? It was already assumed
+ * non-null earlier in this expression. See r872890. */
&& child->remaining_ranges == 0))
{
svn_wc_notify_t *notify_merge_begin;
@@ -4738,11 +4742,10 @@ record_skips(const char *mergeinfo_path,
apr_array_make(scratch_pool, 0,
sizeof(svn_merge_range_t *)));
- if (nbr_skips < notify_b->nbr_notifications)
- /* ### Use RANGELIST as the mergeinfo for all children of
+ /* if (nbr_skips < notify_b->nbr_notifications)
+ ### Use RANGELIST as the mergeinfo for all children of
### this path which were not also explicitly
### skipped? */
- ;
}
SVN_ERR(update_wc_mergeinfo(NULL, merge_b->target_abspath,
mergeinfo_path, merges,
@@ -5278,7 +5281,7 @@ single_file_merge_get_file(const char **
send the header notification before sending the state notification,
and set *HEADER_SENT to TRUE. */
static APR_INLINE void
-single_file_merge_notify(void *notify_baton,
+single_file_merge_notify(notification_receiver_baton_t *notify_baton,
const char *local_abspath,
svn_wc_notify_action_t action,
svn_wc_notify_state_t text_state,
@@ -7173,22 +7176,21 @@ process_children_with_new_mergeinfo(merg
return SVN_NO_ERROR;
}
-/* SUBTREES is one of the following notification_receiver_baton_t members:
- merged_paths, skipped_paths, or added_paths. Return true if any path in
- SUBTRESS is equal to, or is a subtree of, LOCAL_ABSPATH. Return false
- otherwise. If LOCAL_ABSPATH or SUBTREES are NULL return false. */
+/* Return true if any path in SUBTRESS is equal to, or is a subtree of,
+ LOCAL_ABSPATH. Return false otherwise. The keys of SUBTREES are
+ (const char *) absolute paths and its values are irrelevant.
+ If SUBTREES is NULL return false. */
static svn_boolean_t
path_is_subtree(const char *local_abspath,
apr_hash_t *subtrees,
apr_pool_t *pool)
{
- if (local_abspath && subtrees)
+ if (subtrees)
{
apr_hash_index_t *hi;
for (hi = apr_hash_first(pool, subtrees);
- hi;
- hi = apr_hash_next(hi))
+ hi; hi = apr_hash_next(hi))
{
const char *path_touched_by_merge = svn__apr_hash_index_key(hi);
if (svn_dirent_is_ancestor(local_abspath, path_touched_by_merge))
@@ -8310,6 +8312,9 @@ do_directory_merge(svn_mergeinfo_catalog
honor_mergeinfo = HONOR_MERGEINFO(merge_b);
record_mergeinfo = RECORD_MERGEINFO(merge_b);
+ /* Note that this is not a single-file merge. */
+ notify_b->is_single_file_merge = FALSE;
+
/* Initialize NOTIFY_B->CHILDREN_WITH_MERGEINFO. See the comment
'THE CHILDREN_WITH_MERGEINFO ARRAY' at the start of this file. */
notify_b->children_with_mergeinfo =
@@ -8674,8 +8679,9 @@ ensure_ra_session_url(svn_ra_session_t *
RECORD_MERGEINFO().
If MODIFIED_SUBTREES is not NULL and SOURCES_ANCESTRAL or
- REINTEGRATE_MERGE is true, then set *MODIFIED_SUBTREES to a hash
- containing every path modified, skipped, added, or tree-conflicted
+ REINTEGRATE_MERGE is true, then replace *MODIFIED_SUBTREES with a new
+ hash containing all the paths that *MODIFIED_SUBTREES contained before,
+ and also every path modified, skipped, added, or tree-conflicted
by the merge. Keys and values of the hash are both (const char *)
absolute paths. The contents of the hash are allocated in RESULT_POOL.
@@ -8827,7 +8833,6 @@ do_merge(apr_hash_t **modified_subtrees,
/* Build the notification receiver baton. */
notify_baton.wrapped_func = ctx->notify_func2;
notify_baton.wrapped_baton = ctx->notify_baton2;
- notify_baton.nbr_notifications = 0;
notify_baton.nbr_operative_notifications = 0;
/* Do we already know the specific subtrees with mergeinfo we want
@@ -8840,7 +8845,6 @@ do_merge(apr_hash_t **modified_subtrees,
notify_baton.skipped_abspaths = NULL;
notify_baton.added_abspaths = NULL;
notify_baton.tree_conflicted_abspaths = NULL;
- notify_baton.is_single_file_merge = FALSE;
notify_baton.children_with_mergeinfo = NULL;
notify_baton.cur_ancestor_index = -1;
notify_baton.merge_b = &merge_cmd_baton;
@@ -8923,6 +8927,7 @@ do_merge(apr_hash_t **modified_subtrees,
iterpool));
/* Does the caller want to know what the merge has done? */
+ /* ### Why only if the target is a dir and not a file? */
if (modified_subtrees)
{
if (notify_baton.merged_abspaths)
Modified:
subversion/branches/moves-scan-log/subversion/libsvn_fs_base/bdb/locks-table.c
URL:
http://svn.apache.org/viewvc/subversion/branches/moves-scan-log/subversion/libsvn_fs_base/bdb/locks-table.c?rev=1205967&r1=1205966&r2=1205967&view=diff
==============================================================================
---
subversion/branches/moves-scan-log/subversion/libsvn_fs_base/bdb/locks-table.c
(original)
+++
subversion/branches/moves-scan-log/subversion/libsvn_fs_base/bdb/locks-table.c
Thu Nov 24 19:55:12 2011
@@ -207,6 +207,7 @@ svn_fs_bdb__locks_get(svn_fs_t *fs,
svn_lock_t *lock;
svn_error_t *err;
const char *lookup_path = path;
+ apr_size_t lookup_len;
/* First, try to lookup PATH itself. */
err = svn_fs_bdb__lock_token_get(&lock_token, fs, path, trail, pool);
@@ -224,7 +225,12 @@ svn_fs_bdb__locks_get(svn_fs_t *fs,
{
SVN_ERR(get_lock(&lock, fs, path, lock_token, trail, pool));
if (lock && get_locks_func)
- SVN_ERR(get_locks_func(get_locks_baton, lock, pool));
+ {
+ SVN_ERR(get_locks_func(get_locks_baton, lock, pool));
+
+ /* Found a lock so PATH is a file and we can ignore depth */
+ return SVN_NO_ERROR;
+ }
}
/* If we're only looking at PATH itself (depth = empty), stop here. */
@@ -250,11 +256,13 @@ svn_fs_bdb__locks_get(svn_fs_t *fs,
if (!svn_fspath__is_root(path, strlen(path)))
lookup_path = apr_pstrcat(pool, path, "/", (char *)NULL);
+ lookup_len = strlen(lookup_path);
/* As long as the prefix of the returned KEY matches LOOKUP_PATH we
know it is either LOOKUP_PATH or a decendant thereof. */
while ((! db_err)
- && strncmp(lookup_path, key.data, strlen(lookup_path)) == 0)
+ && lookup_len < key.size
+ && strncmp(lookup_path, key.data, lookup_len) == 0)
{
const char *child_path;
Modified:
subversion/branches/moves-scan-log/subversion/libsvn_fs_base/reps-strings.c
URL:
http://svn.apache.org/viewvc/subversion/branches/moves-scan-log/subversion/libsvn_fs_base/reps-strings.c?rev=1205967&r1=1205966&r2=1205967&view=diff
==============================================================================
--- subversion/branches/moves-scan-log/subversion/libsvn_fs_base/reps-strings.c
(original)
+++ subversion/branches/moves-scan-log/subversion/libsvn_fs_base/reps-strings.c
Thu Nov 24 19:55:12 2011
@@ -674,8 +674,10 @@ struct rep_read_baton
is digestified. */
svn_boolean_t checksum_finalized;
- /* Used for temporary allocations, iff `trail' (above) is null. */
- apr_pool_t *pool;
+ /* Used for temporary allocations. This pool is cleared at the
+ start of each invocation of the relevant stream read function --
+ see rep_read_contents(). */
+ apr_pool_t *scratch_pool;
};
@@ -703,7 +705,7 @@ rep_read_get_baton(struct rep_read_baton
b->checksum_finalized = FALSE;
b->fs = fs;
b->trail = use_trail_for_reads ? trail : NULL;
- b->pool = pool;
+ b->scratch_pool = svn_pool_create(pool);
b->rep_key = rep_key;
b->offset = 0;
@@ -869,7 +871,7 @@ txn_body_read_rep(void *baton, trail_t *
args->buf,
args->len,
trail,
- trail->pool));
+ args->rb->scratch_pool));
args->rb->offset += *(args->len);
@@ -956,6 +958,9 @@ rep_read_contents(void *baton, char *buf
struct rep_read_baton *rb = baton;
struct read_rep_args args;
+ /* Clear the scratch pool of the results of previous invocations. */
+ svn_pool_clear(rb->scratch_pool);
+
args.rb = rb;
args.buf = buf;
args.len = len;
@@ -974,7 +979,7 @@ rep_read_contents(void *baton, char *buf
txn_body_read_rep,
&args,
TRUE,
- rb->pool));
+ rb->scratch_pool));
}
return SVN_NO_ERROR;
}
Modified:
subversion/branches/moves-scan-log/subversion/tests/libsvn_fs/locks-test.c
URL:
http://svn.apache.org/viewvc/subversion/branches/moves-scan-log/subversion/tests/libsvn_fs/locks-test.c?rev=1205967&r1=1205966&r2=1205967&view=diff
==============================================================================
--- subversion/branches/moves-scan-log/subversion/tests/libsvn_fs/locks-test.c
(original)
+++ subversion/branches/moves-scan-log/subversion/tests/libsvn_fs/locks-test.c
Thu Nov 24 19:55:12 2011
@@ -358,6 +358,18 @@ get_locks(const svn_test_opts_t *opts,
num_expected_paths, pool));
}
+ /* A path that is longer and alphabetically earlier than some locked
+ paths, this exercises the r1205848 BDB lock code. */
+ {
+ static const char *expected_paths[] = { 0 };
+ num_expected_paths = 0;
+ get_locks_baton = make_get_locks_baton(pool);
+ SVN_ERR(svn_fs_get_locks(fs, "A/D/H/ABCDEFGHIJKLMNOPQR",
get_locks_callback,
+ get_locks_baton, pool));
+ SVN_ERR(verify_matching_lock_paths(get_locks_baton, expected_paths,
+ num_expected_paths, pool));
+ }
+
return SVN_NO_ERROR;
}