summaryrefslogtreecommitdiff
path: root/subversion/libsvn_client
diff options
context:
space:
mode:
Diffstat (limited to 'subversion/libsvn_client')
-rw-r--r--subversion/libsvn_client/copy.c20
-rw-r--r--subversion/libsvn_client/merge.c16
2 files changed, 30 insertions, 6 deletions
diff --git a/subversion/libsvn_client/copy.c b/subversion/libsvn_client/copy.c
index 12bbfe6cf687..af6a75b83698 100644
--- a/subversion/libsvn_client/copy.c
+++ b/subversion/libsvn_client/copy.c
@@ -1057,10 +1057,24 @@ verify_wc_dsts(const apr_array_header_t *copy_pairs,
ctx->wc_ctx, pair->dst_parent_abspath,
FALSE, TRUE,
iterpool));
- if (make_parents && dst_parent_kind == svn_node_none)
+ if (dst_parent_kind == svn_node_none)
{
- SVN_ERR(svn_client__make_local_parents(pair->dst_parent_abspath,
- TRUE, ctx, iterpool));
+ if (make_parents)
+ SVN_ERR(svn_client__make_local_parents(pair->dst_parent_abspath,
+ TRUE, ctx, iterpool));
+ else
+ {
+ SVN_ERR(svn_io_check_path(pair->dst_parent_abspath,
+ &dst_parent_kind, scratch_pool));
+ return svn_error_createf(SVN_ERR_WC_PATH_NOT_FOUND, NULL,
+ (dst_parent_kind == svn_node_dir)
+ ? _("Directory '%s' is not under "
+ "version control")
+ : _("Path '%s' is not a directory"),
+ svn_dirent_local_style(
+ pair->dst_parent_abspath,
+ scratch_pool));
+ }
}
else if (dst_parent_kind != svn_node_dir)
{
diff --git a/subversion/libsvn_client/merge.c b/subversion/libsvn_client/merge.c
index fed848904863..aaab4e002cf5 100644
--- a/subversion/libsvn_client/merge.c
+++ b/subversion/libsvn_client/merge.c
@@ -6465,6 +6465,7 @@ get_mergeinfo_paths(apr_array_header_t *children_with_mergeinfo,
{
int i;
apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+ apr_pool_t *swmi_pool;
apr_hash_t *subtrees_with_mergeinfo;
apr_hash_t *excluded_subtrees;
apr_hash_t *switched_subtrees;
@@ -6473,10 +6474,13 @@ get_mergeinfo_paths(apr_array_header_t *children_with_mergeinfo,
struct pre_merge_status_baton_t pre_merge_status_baton;
/* Case 1: Subtrees with explicit mergeinfo. */
+ /* Use a subpool for subtrees_with_mergeinfo, as it can be very large
+ and is temporary. */
+ swmi_pool = svn_pool_create(scratch_pool);
SVN_ERR(get_wc_explicit_mergeinfo_catalog(&subtrees_with_mergeinfo,
target->abspath,
depth, ctx,
- result_pool, scratch_pool));
+ swmi_pool, swmi_pool));
if (subtrees_with_mergeinfo)
{
apr_hash_index_t *hi;
@@ -6513,6 +6517,7 @@ get_mergeinfo_paths(apr_array_header_t *children_with_mergeinfo,
children_with_mergeinfo->elt_size,
compare_merge_path_t_as_paths);
}
+ svn_pool_destroy(swmi_pool);
/* Case 2: Switched subtrees
Case 10: Paths at depths of 'empty' or 'files'
@@ -12331,6 +12336,10 @@ find_last_merged_location(svn_client__pathrev_t **base_p,
svn_revnum_t youngest_merged_rev = SVN_INVALID_REVNUM;
svn_mergeinfo_catalog_t target_mergeinfo_cat = NULL;
+ /* Using a local subpool for 'target_mergeinfo_cat' can make a big
+ reduction in overall memory usage. */
+ apr_pool_t *tmic_pool = svn_pool_create(scratch_pool);
+
source_peg_rev.kind = svn_opt_revision_number;
source_peg_rev.value.number = source_branch->tip->rev;
source_start_rev.kind = svn_opt_revision_number;
@@ -12351,7 +12360,7 @@ find_last_merged_location(svn_client__pathrev_t **base_p,
operative_rev_receiver,
&youngest_merged_rev,
ctx, ra_session,
- result_pool, scratch_pool));
+ tmic_pool, tmic_pool));
if (!SVN_IS_VALID_REVNUM(youngest_merged_rev))
{
@@ -12387,7 +12396,7 @@ find_last_merged_location(svn_client__pathrev_t **base_p,
operative_rev_receiver,
&oldest_eligible_rev,
ctx, ra_session,
- scratch_pool, scratch_pool));
+ tmic_pool, tmic_pool));
/* If there are revisions eligible for merging, use the oldest one
to calculate the base. Otherwise there are no operative revisions
@@ -12409,6 +12418,7 @@ find_last_merged_location(svn_client__pathrev_t **base_p,
result_pool, scratch_pool));
}
+ svn_pool_destroy(tmic_pool);
return SVN_NO_ERROR;
}