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 2011/10/26 17:19:57 UTC
svn commit: r1189263 - /subversion/trunk/subversion/libsvn_repos/rev_hunt.c
Author: hwright
Date: Wed Oct 26 15:19:57 2011
New Revision: 1189263
URL: http://svn.apache.org/viewvc?rev=1189263&view=rev
Log:
A little bit of pool cleanup when fetching mergeinfo for log.
* subversion/libsvn_repos/rev_hunt.c
(get_path_mergeinfo, get_merged_mergeinfo): Add a scratch_pool, and use it.
(find_interesting_revisions): Update caller.
Modified:
subversion/trunk/subversion/libsvn_repos/rev_hunt.c
Modified: subversion/trunk/subversion/libsvn_repos/rev_hunt.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_repos/rev_hunt.c?rev=1189263&r1=1189262&r2=1189263&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_repos/rev_hunt.c (original)
+++ subversion/trunk/subversion/libsvn_repos/rev_hunt.c Wed Oct 26 15:19:57 2011
@@ -982,30 +982,27 @@ get_path_mergeinfo(apr_hash_t **mergeinf
svn_fs_t *fs,
const char *path,
svn_revnum_t revnum,
- apr_pool_t *pool)
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
{
svn_mergeinfo_catalog_t tmp_catalog;
svn_fs_root_t *root;
- apr_pool_t *subpool = svn_pool_create(pool);
- apr_array_header_t *paths = apr_array_make(subpool, 1,
+ apr_array_header_t *paths = apr_array_make(scratch_pool, 1,
sizeof(const char *));
APR_ARRAY_PUSH(paths, const char *) = path;
- SVN_ERR(svn_fs_revision_root(&root, fs, revnum, subpool));
+ SVN_ERR(svn_fs_revision_root(&root, fs, revnum, scratch_pool));
/* We do not need to call svn_repos_fs_get_mergeinfo() (which performs authz)
because we will filter out unreadable revisions in
find_interesting_revision(), above */
- SVN_ERR(svn_fs_get_mergeinfo(&tmp_catalog, root, paths,
- svn_mergeinfo_inherited, FALSE, subpool));
+ SVN_ERR(svn_fs_get_mergeinfo2(&tmp_catalog, root, paths,
+ svn_mergeinfo_inherited, FALSE, TRUE,
+ result_pool, scratch_pool));
*mergeinfo = apr_hash_get(tmp_catalog, path, APR_HASH_KEY_STRING);
- if (*mergeinfo)
- *mergeinfo = svn_mergeinfo_dup(*mergeinfo, pool);
- else
- *mergeinfo = apr_hash_make(pool);
-
- svn_pool_destroy(subpool);
+ if (!*mergeinfo)
+ *mergeinfo = apr_hash_make(result_pool);
return SVN_NO_ERROR;
}
@@ -1042,9 +1039,9 @@ static svn_error_t *
get_merged_mergeinfo(apr_hash_t **merged_mergeinfo,
svn_repos_t *repos,
struct path_revision *old_path_rev,
- apr_pool_t *pool)
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
{
- apr_pool_t *subpool = svn_pool_create(pool);
apr_hash_t *curr_mergeinfo, *prev_mergeinfo, *deleted, *changed;
svn_error_t *err;
svn_fs_root_t *root;
@@ -1054,8 +1051,8 @@ get_merged_mergeinfo(apr_hash_t **merged
/* Getting/parsing/diffing svn:mergeinfo is expensive, so only do it
if there is a property change. */
SVN_ERR(svn_fs_revision_root(&root, repos->fs, old_path_rev->revnum,
- subpool));
- SVN_ERR(svn_fs_paths_changed2(&changed_paths, root, subpool));
+ scratch_pool));
+ SVN_ERR(svn_fs_paths_changed2(&changed_paths, root, scratch_pool));
while (1)
{
svn_fs_path_change2_t *changed_path = apr_hash_get(changed_paths,
@@ -1065,17 +1062,17 @@ get_merged_mergeinfo(apr_hash_t **merged
break;
if (svn_fspath__is_root(path, strlen(path)))
{
- svn_pool_destroy(subpool);
*merged_mergeinfo = NULL;
return SVN_NO_ERROR;
}
- path = svn_fspath__dirname(path, subpool);
+ path = svn_fspath__dirname(path, scratch_pool);
}
/* First, find the mergeinfo difference for old_path_rev->revnum, and
old_path_rev->revnum - 1. */
err = get_path_mergeinfo(&curr_mergeinfo, repos->fs, old_path_rev->path,
- old_path_rev->revnum, subpool);
+ old_path_rev->revnum, scratch_pool,
+ scratch_pool);
if (err)
{
if (err->apr_err == SVN_ERR_MERGEINFO_PARSE_ERROR)
@@ -1084,7 +1081,6 @@ get_merged_mergeinfo(apr_hash_t **merged
best we can do is ignore it and act is if there are
no mergeinfo differences. */
svn_error_clear(err);
- svn_pool_destroy(subpool);
*merged_mergeinfo = NULL;
return SVN_NO_ERROR;
}
@@ -1095,14 +1091,14 @@ get_merged_mergeinfo(apr_hash_t **merged
}
err = get_path_mergeinfo(&prev_mergeinfo, repos->fs, old_path_rev->path,
- old_path_rev->revnum - 1, subpool);
+ old_path_rev->revnum - 1, scratch_pool,
+ scratch_pool);
if (err && (err->apr_err == SVN_ERR_FS_NOT_FOUND
|| err->apr_err == SVN_ERR_MERGEINFO_PARSE_ERROR))
{
/* If the path doesn't exist in the previous revision or it does exist
but has invalid mergeinfo (Issue #3896), assume no merges. */
svn_error_clear(err);
- svn_pool_destroy(subpool);
*merged_mergeinfo = NULL;
return SVN_NO_ERROR;
}
@@ -1111,8 +1107,9 @@ get_merged_mergeinfo(apr_hash_t **merged
/* Then calculate and merge the differences. */
SVN_ERR(svn_mergeinfo_diff2(&deleted, &changed, prev_mergeinfo,
- curr_mergeinfo, FALSE, pool, subpool));
- SVN_ERR(svn_mergeinfo_merge2(changed, deleted, pool, subpool));
+ curr_mergeinfo, FALSE, result_pool,
+ scratch_pool));
+ SVN_ERR(svn_mergeinfo_merge2(changed, deleted, result_pool, scratch_pool));
/* Store the result. */
if (apr_hash_count(changed))
@@ -1120,8 +1117,6 @@ get_merged_mergeinfo(apr_hash_t **merged
else
*merged_mergeinfo = NULL;
- svn_pool_destroy(subpool);
-
return SVN_NO_ERROR;
}
@@ -1204,7 +1199,7 @@ find_interesting_revisions(apr_array_hea
if (include_merged_revisions)
SVN_ERR(get_merged_mergeinfo(&path_rev->merged_mergeinfo, repos,
- path_rev, result_pool));
+ path_rev, result_pool, iterpool));
else
path_rev->merged_mergeinfo = NULL;