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 2010/08/10 20:06:33 UTC
svn commit: r984153 [15/39] - in /subversion/branches/ignore-mergeinfo: ./
build/ build/ac-macros/ build/generator/ build/generator/templates/
build/hudson/ build/hudson/jobs/subversion-1.6.x-solaris/
build/hudson/jobs/subversion-1.6.x-ubuntu/ build/hu...
Modified: subversion/branches/ignore-mergeinfo/subversion/libsvn_client/mergeinfo.c
URL: http://svn.apache.org/viewvc/subversion/branches/ignore-mergeinfo/subversion/libsvn_client/mergeinfo.c?rev=984153&r1=984152&r2=984153&view=diff
==============================================================================
--- subversion/branches/ignore-mergeinfo/subversion/libsvn_client/mergeinfo.c (original)
+++ subversion/branches/ignore-mergeinfo/subversion/libsvn_client/mergeinfo.c Tue Aug 10 18:06:17 2010
@@ -91,10 +91,12 @@ svn_client__parse_mergeinfo(svn_mergeinf
svn_error_t *
svn_client__record_wc_mergeinfo(const char *local_abspath,
svn_mergeinfo_t mergeinfo,
+ svn_boolean_t do_notification,
svn_client_ctx_t *ctx,
apr_pool_t *scratch_pool)
{
svn_string_t *mergeinfo_str = NULL;
+ svn_boolean_t mergeinfo_changes = FALSE;
SVN_ERR_ASSERT(svn_dirent_is_absolute(local_abspath));
@@ -102,6 +104,10 @@ svn_client__record_wc_mergeinfo(const ch
if (mergeinfo)
SVN_ERR(svn_mergeinfo_to_string(&mergeinfo_str, mergeinfo, scratch_pool));
+ if (do_notification && ctx->notify_func2)
+ SVN_ERR(svn_client__mergeinfo_status(&mergeinfo_changes, ctx->wc_ctx,
+ local_abspath, scratch_pool));
+
/* Record the new mergeinfo in the WC. */
/* ### Later, we'll want behavior more analogous to
### svn_client__get_prop_from_wc(). */
@@ -109,13 +115,18 @@ svn_client__record_wc_mergeinfo(const ch
mergeinfo_str, TRUE /* skip checks */, NULL, NULL,
scratch_pool));
- if (ctx->notify_func2)
+ if (do_notification && ctx->notify_func2)
{
- ctx->notify_func2(ctx->notify_baton2,
- svn_wc_create_notify(local_abspath,
- svn_wc_notify_merge_record_info,
- scratch_pool),
- scratch_pool);
+ svn_wc_notify_t *notify =
+ svn_wc_create_notify(local_abspath,
+ svn_wc_notify_merge_record_info,
+ scratch_pool);
+ if (mergeinfo_changes)
+ notify->prop_state = svn_wc_notify_state_merged;
+ else
+ notify->prop_state = svn_wc_notify_state_changed;
+
+ ctx->notify_func2(ctx->notify_baton2, notify, scratch_pool);
}
return SVN_NO_ERROR;
@@ -140,8 +151,8 @@ svn_client__adjust_mergeinfo_source_path
for (hi = apr_hash_first(pool, mergeinfo); hi; hi = apr_hash_next(hi))
{
- const char *merge_source = svn_apr_hash_index_key(hi);
- apr_array_header_t *rangelist = svn_apr_hash_index_val(hi);
+ const char *merge_source = svn__apr_hash_index_key(hi);
+ apr_array_header_t *rangelist = svn__apr_hash_index_val(hi);
/* Copy inherited mergeinfo into our output hash, adjusting the
merge source as appropriate. */
@@ -449,7 +460,7 @@ svn_client__get_repos_mergeinfo(svn_ra_s
descendants. So if there is anything in the catalog it is the
mergeinfo for REL_PATH. */
*target_mergeinfo =
- svn_apr_hash_index_val(apr_hash_first(pool, tgt_mergeinfo_cat));
+ svn__apr_hash_index_val(apr_hash_first(pool, tgt_mergeinfo_cat));
}
@@ -521,7 +532,7 @@ svn_client__get_wc_or_repos_mergeinfo(sv
so we can peek into our catalog, but it ought to be the only
thing in the catalog, so we'll just fetch the first hash item. */
*target_mergeinfo =
- svn_apr_hash_index_val(apr_hash_first(pool, tgt_mergeinfo_cat));
+ svn__apr_hash_index_val(apr_hash_first(pool, tgt_mergeinfo_cat));
}
@@ -643,7 +654,7 @@ svn_client__get_wc_or_repos_mergeinfo_ca
svn_error_t *
svn_client__mergeinfo_from_segments(svn_mergeinfo_t *mergeinfo_p,
- apr_array_header_t *segments,
+ const apr_array_header_t *segments,
apr_pool_t *pool)
{
svn_mergeinfo_t mergeinfo = apr_hash_make(pool);
@@ -853,9 +864,17 @@ elide_mergeinfo(svn_mergeinfo_t parent_m
svn_wc_create_notify(
svn_dirent_join_many(scratch_pool, local_abspath,
path_suffix, NULL),
- svn_wc_notify_merge_record_info, scratch_pool);
+ svn_wc_notify_merge_elide_info, scratch_pool);
ctx->notify_func2(ctx->notify_baton2, notify, scratch_pool);
+ notify = svn_wc_create_notify(svn_dirent_join_many(scratch_pool,
+ local_abspath,
+ path_suffix,
+ NULL),
+ svn_wc_notify_update_update,
+ scratch_pool);
+ notify->prop_state = svn_wc_notify_state_changed;
+ ctx->notify_func2(ctx->notify_baton2, notify, scratch_pool);
}
}
@@ -989,7 +1008,7 @@ get_mergeinfo(svn_mergeinfo_catalog_t *m
result_pool, scratch_pool));
}
-
+
if (peg_rev.kind == svn_opt_revision_date
|| peg_rev.kind == svn_opt_revision_head
|| peg_rev.kind == svn_opt_revision_previous
@@ -1217,7 +1236,7 @@ svn_client__elide_mergeinfo_catalog(svn_
If DEPTH_FIRST_CATALOG_INDEX is NULL, empty, or no ancestor is found, then
return NULL. */
static svn_mergeinfo_t
-find_nearest_ancestor(apr_array_header_t *depth_first_catalog_index,
+find_nearest_ancestor(const apr_array_header_t *depth_first_catalog_index,
const char *abs_repos_path)
{
int i;
@@ -1251,7 +1270,7 @@ struct filter_log_entry_baton_t
/* Unsorted array of repository relative paths representing the merge
sources. There will be more than one source */
- apr_array_header_t *merge_source_paths;
+ const apr_array_header_t *merge_source_paths;
/* The repository-absolute path we are calling svn_client_log5() on. */
const char *abs_repos_target_path;
@@ -1266,7 +1285,7 @@ struct filter_log_entry_baton_t
/* A rangelist describing all the ranges merged to ABS_REPOS_TARGET_PATH
from the */
- apr_array_header_t *rangelist;
+ const apr_array_header_t *rangelist;
/* The wrapped svn_log_entry_receiver_t callback and baton which
filter_log_entry_with_rangelist() is acting as a filter for. */
@@ -1277,25 +1296,30 @@ struct filter_log_entry_baton_t
};
/* Implements the svn_log_entry_receiver_t interface. BATON is a
- `struct filter_log_entry_baton_t *' */
+ `struct filter_log_entry_baton_t *'.
+
+ Call the wrapped log receiver BATON->log_receiver (with
+ BATON->log_receiver_baton), only if the log entry falls within the
+ ranges in BATON->rangelist.
+ */
static svn_error_t *
filter_log_entry_with_rangelist(void *baton,
svn_log_entry_t *log_entry,
apr_pool_t *pool)
{
struct filter_log_entry_baton_t *fleb = baton;
- svn_merge_range_t *range;
apr_array_header_t *intersection, *this_rangelist;
if (fleb->ctx->cancel_func)
SVN_ERR(fleb->ctx->cancel_func(fleb->ctx->cancel_baton));
- this_rangelist = apr_array_make(pool, 1, sizeof(svn_merge_range_t *));
- range = apr_pcalloc(pool, sizeof(*range));
- range->start = log_entry->revision - 1;
- range->end = log_entry->revision;
- range->inheritable = TRUE;
- APR_ARRAY_PUSH(this_rangelist, svn_merge_range_t *) = range;
+ /* Ignore r0 because there can be no "change 0" in a merge range. */
+ if (log_entry->revision == 0)
+ return SVN_NO_ERROR;
+
+ this_rangelist = svn_rangelist__initialize(log_entry->revision - 1,
+ log_entry->revision,
+ TRUE, pool);
/* Don't consider inheritance yet, see if LOG_ENTRY->REVISION is
fully or partially represented in BATON->RANGELIST. */
@@ -1325,21 +1349,16 @@ filter_log_entry_with_rangelist(void *ba
apr_hash_index_t *hi;
svn_boolean_t all_subtrees_have_this_rev = TRUE;
apr_array_header_t *this_rev_rangelist =
- apr_array_make(pool, 1, sizeof(svn_merge_range_t *));
+ svn_rangelist__initialize(log_entry->revision - 1,
+ log_entry->revision, TRUE, pool);
apr_pool_t *iterpool = svn_pool_create(pool);
- range = apr_pcalloc(pool, sizeof(*range));
- range->start = log_entry->revision - 1;
- range->end = log_entry->revision;
- range->inheritable = TRUE;
- APR_ARRAY_PUSH(this_rev_rangelist, svn_merge_range_t *) = range;
-
for (hi = apr_hash_first(pool, log_entry->changed_paths2);
hi;
hi = apr_hash_next(hi))
{
- const char *path = svn_apr_hash_index_key(hi);
- svn_log_changed_path2_t *change = svn_apr_hash_index_val(hi);
+ const char *path = svn__apr_hash_index_key(hi);
+ svn_log_changed_path2_t *change = svn__apr_hash_index_val(hi);
const char *target_path_affected;
svn_mergeinfo_t nearest_ancestor_mergeinfo;
apr_hash_index_t *hi2;
@@ -1387,7 +1406,7 @@ filter_log_entry_with_rangelist(void *ba
hi2;
hi2 = apr_hash_next(hi2))
{
- apr_array_header_t *rangelist = svn_apr_hash_index_val(hi2);
+ apr_array_header_t *rangelist = svn__apr_hash_index_val(hi2);
SVN_ERR(svn_rangelist_intersect(&intersection, rangelist,
this_rev_rangelist, FALSE,
iterpool));
@@ -1426,15 +1445,15 @@ filter_log_entry_with_rangelist(void *ba
}
}
- /* Call the wrapped log reveiver which this function is filtering for. */
+ /* Call the wrapped log receiver which this function is filtering for. */
return fleb->log_receiver(fleb->log_receiver_baton, log_entry, pool);
}
static svn_error_t *
logs_for_mergeinfo_rangelist(const char *source_url,
- apr_array_header_t *merge_source_paths,
+ const apr_array_header_t *merge_source_paths,
svn_boolean_t filtering_merged,
- apr_array_header_t *rangelist,
+ const apr_array_header_t *rangelist,
svn_mergeinfo_t target_mergeinfo_catalog,
const char *abs_repos_target_path,
svn_boolean_t discover_changed_paths,
@@ -1485,13 +1504,13 @@ logs_for_mergeinfo_rangelist(const char
hi;
hi = apr_hash_next(hi))
{
- const char *path = svn_apr_hash_index_key(hi);
+ const char *path = svn__apr_hash_index_key(hi);
if (!svn_dirent_is_absolute(path))
apr_hash_set(rekeyed_catalog,
svn_dirent_join("/", path, scratch_pool),
APR_HASH_KEY_STRING,
- svn_apr_hash_index_val(hi));
+ svn__apr_hash_index_val(hi));
}
target_mergeinfo_catalog = rekeyed_catalog;
}
@@ -1623,8 +1642,8 @@ svn_client_mergeinfo_get_merged(apr_hash
full_path_mergeinfo = apr_hash_make(pool);
for (hi = apr_hash_first(pool, mergeinfo); hi; hi = apr_hash_next(hi))
{
- const char *key = svn_apr_hash_index_key(hi);
- void *val = svn_apr_hash_index_val(hi);
+ const char *key = svn__apr_hash_index_key(hi);
+ void *val = svn__apr_hash_index_val(hi);
const char *source_url;
source_url = svn_path_uri_encode(key, pool);
@@ -1640,8 +1659,8 @@ svn_client_mergeinfo_get_merged(apr_hash
svn_error_t *
-svn_client_mergeinfo_log(const char *path_or_url,
- svn_boolean_t finding_merged,
+svn_client_mergeinfo_log(svn_boolean_t finding_merged,
+ const char *path_or_url,
const svn_opt_revision_t *peg_revision,
const char *merge_source_path_or_url,
const svn_opt_revision_t *src_peg_revision,
@@ -1762,14 +1781,14 @@ svn_client_mergeinfo_log(const char *pat
hi_catalog = apr_hash_next(hi_catalog))
{
svn_mergeinfo_t subtree_mergeinfo =
- svn_apr_hash_index_val(hi_catalog);
+ svn__apr_hash_index_val(hi_catalog);
svn_mergeinfo_t subtree_history;
svn_mergeinfo_t subtree_source_history;
svn_mergeinfo_t subtree_inheritable_mergeinfo;
svn_mergeinfo_t subtree_noninheritable_mergeinfo;
svn_mergeinfo_t merged_noninheritable;
svn_mergeinfo_t merged;
- const char *subtree_path = svn_apr_hash_index_key(hi_catalog);
+ const char *subtree_path = svn__apr_hash_index_key(hi_catalog);
svn_boolean_t is_subtree = strcmp(subtree_path,
path_or_url_repos_rel) != 0;
svn_pool_clear(iterpool);
@@ -1843,7 +1862,7 @@ svn_client_mergeinfo_log(const char *pat
hi;
hi = apr_hash_next(hi))
{
- apr_array_header_t *list = svn_apr_hash_index_val(hi);
+ apr_array_header_t *list = svn__apr_hash_index_val(hi);
SVN_ERR(svn_rangelist_merge(
&master_noninheritable_rangelist,
svn_rangelist_dup(list, scratch_pool),
@@ -1871,7 +1890,7 @@ svn_client_mergeinfo_log(const char *pat
hi;
hi = apr_hash_next(hi))
{
- apr_array_header_t *list = svn_apr_hash_index_val(hi);
+ apr_array_header_t *list = svn__apr_hash_index_val(hi);
SVN_ERR(svn_rangelist_merge(&master_inheritable_rangelist,
svn_rangelist_dup(list,
@@ -1917,7 +1936,7 @@ svn_client_mergeinfo_log(const char *pat
apr_array_header_t *deleted_rangelist;
apr_array_header_t *added_rangelist;
apr_array_header_t *subtree_merged_rangelist =
- svn_apr_hash_index_val(hi);
+ svn__apr_hash_index_val(hi);
svn_pool_clear(iterpool);
@@ -1960,7 +1979,7 @@ svn_client_mergeinfo_log(const char *pat
hi = apr_hash_next(hi))
{
apr_array_header_t *subtree_merged_rangelist =
- svn_apr_hash_index_val(hi);
+ svn__apr_hash_index_val(hi);
SVN_ERR(svn_rangelist_merge(&source_master_rangelist,
subtree_merged_rangelist,
@@ -1996,22 +2015,20 @@ svn_client_mergeinfo_log(const char *pat
svn_merge_range_t *youngest_range = svn_merge_range_dup(
APR_ARRAY_IDX(master_inheritable_rangelist,
master_inheritable_rangelist->nelts - 1,
- svn_merge_range_t *), iterpool);
- apr_array_header_t *youngest_rangelist;
-
- youngest_range->start = youngest_range->end - 1;
- youngest_rangelist = apr_array_make(scratch_pool, 1,
- sizeof(svn_merge_range_t *));
- APR_ARRAY_PUSH(youngest_rangelist, svn_merge_range_t *) =
- youngest_range;
+ svn_merge_range_t *), scratch_pool);
+ apr_array_header_t *youngest_rangelist =
+ svn_rangelist__initialize(youngest_range->end - 1,
+ youngest_range->end,
+ youngest_range->inheritable,
+ scratch_pool);;
for (hi = apr_hash_first(scratch_pool, source_history);
hi;
hi = apr_hash_next(hi))
{
- const char *key = svn_apr_hash_index_key(hi);
+ const char *key = svn__apr_hash_index_key(hi);
apr_array_header_t *subtree_merged_rangelist =
- svn_apr_hash_index_val(hi);
+ svn__apr_hash_index_val(hi);
apr_array_header_t *intersecting_rangelist;
svn_pool_clear(iterpool);
SVN_ERR(svn_rangelist_intersect(&intersecting_rangelist,
@@ -2091,7 +2108,7 @@ svn_client_suggest_merge_sources(apr_arr
/* We asked only for the PATH_OR_URL's mergeinfo, not any of its
descendants. So if there is anything in the catalog it is the
mergeinfo for PATH_OR_URL. */
- mergeinfo = svn_apr_hash_index_val(apr_hash_first(pool, mergeinfo_cat));
+ mergeinfo = svn__apr_hash_index_val(apr_hash_first(pool, mergeinfo_cat));
}
else
{
@@ -2111,7 +2128,7 @@ svn_client_suggest_merge_sources(apr_arr
{
for (hi = apr_hash_first(pool, mergeinfo); hi; hi = apr_hash_next(hi))
{
- const char *rel_path = svn_apr_hash_index_key(hi);
+ const char *rel_path = svn__apr_hash_index_key(hi);
if (copyfrom_path == NULL || strcmp(rel_path, copyfrom_path) != 0)
APR_ARRAY_PUSH(list, const char *) = \
@@ -2122,3 +2139,30 @@ svn_client_suggest_merge_sources(apr_arr
*suggestions = list;
return SVN_NO_ERROR;
}
+
+svn_error_t *
+svn_client__mergeinfo_status(svn_boolean_t *mergeinfo_changes,
+ svn_wc_context_t *wc_ctx,
+ const char *local_abspath,
+ apr_pool_t *scratch_pool)
+{
+ apr_array_header_t *propchanges;
+ int i;
+
+ *mergeinfo_changes = FALSE;
+
+ SVN_ERR(svn_wc_get_prop_diffs2(&propchanges, NULL, wc_ctx,
+ local_abspath, scratch_pool, scratch_pool));
+
+ for (i = 0; i < propchanges->nelts; i++)
+ {
+ svn_prop_t prop = APR_ARRAY_IDX(propchanges, i, svn_prop_t);
+ if (strcmp(prop.name, SVN_PROP_MERGEINFO) == 0)
+ {
+ *mergeinfo_changes = TRUE;
+ break;
+ }
+ }
+
+ return SVN_NO_ERROR;
+}
Modified: subversion/branches/ignore-mergeinfo/subversion/libsvn_client/mergeinfo.h
URL: http://svn.apache.org/viewvc/subversion/branches/ignore-mergeinfo/subversion/libsvn_client/mergeinfo.h?rev=984153&r1=984152&r2=984153&view=diff
==============================================================================
--- subversion/branches/ignore-mergeinfo/subversion/libsvn_client/mergeinfo.h (original)
+++ subversion/branches/ignore-mergeinfo/subversion/libsvn_client/mergeinfo.h Tue Aug 10 18:06:17 2010
@@ -258,7 +258,7 @@ svn_client__get_history_as_mergeinfo(svn
*MERGEINFO_P, allocated in POOL. */
svn_error_t *
svn_client__mergeinfo_from_segments(svn_mergeinfo_t *mergeinfo_p,
- apr_array_header_t *segments,
+ const apr_array_header_t *segments,
apr_pool_t *pool);
/* Parse any explicit mergeinfo on LOCAL_ABSPATH and store it in
@@ -274,13 +274,15 @@ svn_client__parse_mergeinfo(svn_mergeinf
/* Write MERGEINFO into the WC for LOCAL_ABSPATH. If MERGEINFO is NULL,
remove any SVN_PROP_MERGEINFO for LOCAL_ABSPATH. If MERGEINFO is empty,
record an empty property value (e.g. ""). If CTX->NOTIFY_FUNC2 is
- not null call it with notification type svn_wc_notify_merge_record_info.
+ not null call it with notification type svn_wc_notify_update_update
+ if DO_NOTIFICATION is true.
Use WC_CTX to access the working copy, and SCRATCH_POOL for any temporary
allocations. */
svn_error_t *
svn_client__record_wc_mergeinfo(const char *local_abspath,
svn_mergeinfo_t mergeinfo,
+ svn_boolean_t do_notification,
svn_client_ctx_t *ctx,
apr_pool_t *scratch_pool);
@@ -339,4 +341,12 @@ svn_client__adjust_mergeinfo_source_path
svn_mergeinfo_t mergeinfo,
apr_pool_t *pool);
+/* Set *MERGEINFO_CHANGES to TRUE if LOCAL_ABSPATH has locally modified
+ mergeinfo, set *MERGEINFO_CHANGES to FALSE otherwise. */
+svn_error_t *
+svn_client__mergeinfo_status(svn_boolean_t *mergeinfo_changes,
+ svn_wc_context_t *wc_ctx,
+ const char *local_abspath,
+ apr_pool_t *scratch_pool);
+
#endif /* SVN_LIBSVN_CLIENT_MERGEINFO_H */
Modified: subversion/branches/ignore-mergeinfo/subversion/libsvn_client/obliterate.c
URL: http://svn.apache.org/viewvc/subversion/branches/ignore-mergeinfo/subversion/libsvn_client/obliterate.c?rev=984153&r1=984152&r2=984153&view=diff
==============================================================================
--- subversion/branches/ignore-mergeinfo/subversion/libsvn_client/obliterate.c (original)
+++ subversion/branches/ignore-mergeinfo/subversion/libsvn_client/obliterate.c Tue Aug 10 18:06:17 2010
@@ -29,10 +29,10 @@
svn_error_t *
-svn_client__obliterate(const char *url,
- svn_revnum_t rev,
- svn_client_ctx_t *ctx,
- apr_pool_t *pool)
+svn_client__obliterate_path_rev(const char *url,
+ svn_revnum_t rev,
+ svn_client_ctx_t *ctx,
+ apr_pool_t *pool)
{
svn_ra_session_t *ra_session;
const char *path;
@@ -42,7 +42,7 @@ svn_client__obliterate(const char *url,
path = ""; /* relative to URL of session */
- SVN_ERR(svn_ra__obliterate(ra_session, rev, path, pool));
+ SVN_ERR(svn_ra__obliterate_path_rev(ra_session, rev, path, pool));
if (ctx->notify_func2)
{