You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by rh...@apache.org on 2013/11/04 18:30:03 UTC
svn commit: r1538687 -
/subversion/trunk/subversion/libsvn_wc/wc_db_update_move.c
Author: rhuijben
Date: Mon Nov 4 17:30:03 2013
New Revision: 1538687
URL: http://svn.apache.org/r1538687
Log:
When obtaining information on moved away nodes, properly ignore rows that are
not moves, but just representations of deletes of lower layers.
* subversion/libsvn_wc/wc_db_update_move.c
(get_info): Add filtering. Update documentation.
Modified:
subversion/trunk/subversion/libsvn_wc/wc_db_update_move.c
Modified: subversion/trunk/subversion/libsvn_wc/wc_db_update_move.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/wc_db_update_move.c?rev=1538687&r1=1538686&r2=1538687&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/wc_db_update_move.c (original)
+++ subversion/trunk/subversion/libsvn_wc/wc_db_update_move.c Mon Nov 4 17:30:03 2013
@@ -1410,9 +1410,9 @@ get_tc_info(svn_wc_operation_t *operatio
/* Return *PROPS, *CHECKSUM, *CHILDREN and *KIND for LOCAL_RELPATH at
OP_DEPTH provided the row exists. Return *KIND of svn_node_none if
- the row does not exist. *CHILDREN is a sorted array of basenames of
- type 'const char *', rather than a hash, to allow the driver to
- process children in a defined order. */
+ the row does not exist, or only describes a delete of a lower op-depth.
+ *CHILDREN is a sorted array of basenames of type 'const char *', rather
+ than a hash, to allow the driver to process children in a defined order. */
static svn_error_t *
get_info(apr_hash_t **props,
const svn_checksum_t **checksum,
@@ -1427,16 +1427,36 @@ get_info(apr_hash_t **props,
apr_hash_t *hash_children;
apr_array_header_t *sorted_children;
svn_error_t *err;
+ svn_wc__db_status_t status;
+ const char *repos_relpath;
int i;
- err = svn_wc__db_depth_get_info(NULL, kind, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, checksum, NULL, NULL, props,
+ err = svn_wc__db_depth_get_info(&status, kind, NULL, &repos_relpath, NULL,
+ NULL, NULL, NULL, NULL, checksum, NULL,
+ NULL, props,
wcroot, local_relpath, op_depth,
result_pool, scratch_pool);
- if (err && err->apr_err == SVN_ERR_WC_PATH_NOT_FOUND)
+
+ /* If there is no node at this depth, or only a node that describes a delete
+ of a lower layer we report this node as not existing.
+
+ But when a node is reported as DELETED, but has a repository location it
+ is really a not-present node that must be reported as being there */
+ if ((err && err->apr_err == SVN_ERR_WC_PATH_NOT_FOUND)
+ || (!err && status == svn_wc__db_status_deleted))
{
svn_error_clear(err);
- *kind = svn_node_none;
+
+ if (kind && (err || !repos_relpath))
+ *kind = svn_node_none;
+ if (checksum)
+ *checksum = NULL;
+ if (props)
+ *props = NULL;
+ if (children)
+ *children = apr_array_make(result_pool, 0, sizeof(const char *));
+
+ return SVN_NO_ERROR;
}
else
SVN_ERR(err);