Hi All,
Find the attached patch and log.
With regards
Kamesh Jayachandran
[[[
Patch by: Kamesh Jayachandran <kamesh@collab.net>
get_merge_info_path fails in the cases if the path is '/a/b/c/d/e'
and the repo has the mergeinfo only for '/a/b/c' and no mergeinfo
for '/a/b/c/d'.
* subversion/libsvn_fs_util/merge-info-sqlite-index.c
(global): remove NEGATIVE_CACHE_RESULT.
(get_merge_info_for_path):
Irrespective of 'setresult' translate the hash keys of 'elided parent->path'
and set it to cache, so that we don't loose the 'mergeinfo' of '/a/b/c'
during unwinding phase of recursion with path '/a/b/c/d'.
]]]
Index: subversion/libsvn_fs_util/merge-info-sqlite-index.c
===================================================================
--- subversion/libsvn_fs_util/merge-info-sqlite-index.c (revision 21862)
+++ subversion/libsvn_fs_util/merge-info-sqlite-index.c (working copy)
@@ -37,10 +37,6 @@
/* Following are defines that specify the textual elements of the
native filesystem directories and revision files. */
-/* We want to cache that we saw no mergeinfo for a path as well,
- so we use a -1 converted to a pointer to represent this. */
-#define NEGATIVE_CACHE_RESULT ((void *)(-1))
-
/* SQLITE->SVN quick error wrap, much like SVN_ERR. */
#define SQLITE_ERR(x, db) do \
{ \
@@ -405,10 +401,9 @@
svn_boolean_t has_no_mergeinfo = FALSE;
cacheresult = apr_hash_get(cache, path, APR_HASH_KEY_STRING);
- if (cacheresult != 0)
+ if (cacheresult && setresult)
{
- if (cacheresult != NEGATIVE_CACHE_RESULT && setresult)
- apr_hash_set(result, path, APR_HASH_KEY_STRING, cacheresult);
+ apr_hash_set(result, path, APR_HASH_KEY_STRING, cacheresult);
return SVN_NO_ERROR;
}
@@ -450,8 +445,6 @@
{
svn_stringbuf_t *parentpath;
- apr_hash_set(cache, path, APR_HASH_KEY_STRING, NEGATIVE_CACHE_RESULT);
-
/* It is possible we are already at the root. */
if (strcmp(path, "") == 0)
return SVN_NO_ERROR;
@@ -467,23 +460,19 @@
SVN_ERR(get_merge_info_for_path(db, parentpath->data, rev,
result, cache, FALSE, include_parents,
pool));
- if (setresult)
+
+ /* Now translate the cache for our parent to our path */
+ cacheresult = apr_hash_get(cache, parentpath->data, APR_HASH_KEY_STRING);
+ if (cacheresult)
{
- /* Now translate the result for our parent to our path */
- cacheresult = apr_hash_get(cache, parentpath->data,
- APR_HASH_KEY_STRING);
- if (cacheresult == NEGATIVE_CACHE_RESULT)
- apr_hash_set(result, path, APR_HASH_KEY_STRING, NULL);
- else if (cacheresult)
- {
- apr_hash_t *translatedhash;
- const char *toappend = &path[parentpath->len + 1];
+ apr_hash_t *translatedhash;
+ const char *toappend = &path[parentpath->len + 1];
- append_component_to_paths(&translatedhash, cacheresult,
- toappend, pool);
- apr_hash_set(result, path, APR_HASH_KEY_STRING,
- translatedhash);
- }
+ append_component_to_paths(&translatedhash, cacheresult,
+ toappend, pool);
+ apr_hash_set(cache, path, APR_HASH_KEY_STRING, translatedhash);
+ if (setresult)
+ apr_hash_set(result, path, APR_HASH_KEY_STRING, translatedhash);
}
}
return SVN_NO_ERROR;
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@subversion.tigris.org
For additional commands, e-mail: dev-help@subversion.tigris.org
Received on Tue Oct 10 11:51:27 2006