> -----Original Message----- > From: br...@apache.org [mailto:br...@apache.org] > Sent: dinsdag 1 april 2014 12:41 > To: comm...@subversion.apache.org > Subject: svn commit: r1583599 - in /subversion/branches/remote-only- > status/subversion: include/svn_client.h libsvn_wc/status.c > tests/libsvn_client/client-test.c > > Author: brane > Date: Tue Apr 1 10:41:29 2014 > New Revision: 1583599 > > URL: http://svn.apache.org/r1583599 > Log: > On the remote-only-status branch: Do not report local replacements. > > * subversion/include/svn_client.h (svn_client_status6): Update docstring. > * subversion/libsvn_wc/status.c (assemble_status): Ignore local adds. > Report local replacements as deletions of the working node. > (get_dir_status): Remove redundant (and incorrect) filter for additions. > * subversion/tests/libsvn_client/client-test.c (test_remote_only_status): > Extend test case with an example of a local replacement. > > Modified: > subversion/branches/remote-only-status/subversion/include/svn_client.h > subversion/branches/remote-only-status/subversion/libsvn_wc/status.c > subversion/branches/remote-only- > status/subversion/tests/libsvn_client/client-test.c > > Modified: subversion/branches/remote-only- > status/subversion/include/svn_client.h > URL: http://svn.apache.org/viewvc/subversion/branches/remote-only- > status/subversion/include/svn_client.h?rev=1583599&r1=1583598&r2=15835 > 99&view=diff > ========================================================== > ==================== > --- subversion/branches/remote-only- > status/subversion/include/svn_client.h (original) > +++ subversion/branches/remote-only- > status/subversion/include/svn_client.h Tue Apr 1 10:41:29 2014 > @@ -2512,6 +2512,13 @@ typedef svn_error_t *(*svn_client_status > * - If @a check_working_copy is not set, do not scan the working > * copy for locally modified and missing files. This parameter > * will be ignored unless @a check_out_of_date is set. > + * When set, the status report will be different in the following > + * details: > + * > + * -- Local modifications, missing nodes and locally added nodes > + * will not be reported. > + * -- Locally replaced nodes will be reported as deletions of > + * the original node instead of as replacements. > * > * If @a no_ignore is @c FALSE, don't report any file or directory (or > * recurse into any directory) that is found by recursion (as opposed to > > Modified: subversion/branches/remote-only- > status/subversion/libsvn_wc/status.c > URL: http://svn.apache.org/viewvc/subversion/branches/remote-only- > status/subversion/libsvn_wc/status.c?rev=1583599&r1=1583598&r2=158359 > 9&view=diff > ========================================================== > ==================== > --- subversion/branches/remote-only-status/subversion/libsvn_wc/status.c > (original) > +++ subversion/branches/remote-only- > status/subversion/libsvn_wc/status.c Tue Apr 1 10:41:29 2014 > @@ -573,7 +573,42 @@ assemble_status(svn_wc_status3_t **statu > if (below_working != svn_wc__db_status_not_present > && below_working != svn_wc__db_status_deleted) > { > - node_status = svn_wc_status_replaced; > + if (check_working_copy) > + node_status = svn_wc_status_replaced; > + else > + { > + /* This is a remote-only walk; report the > + base node info instead of the replacement. */ > + const char *target; > + const svn_checksum_t *checksum; > + struct svn_wc__db_info_t *base_info = > + apr_palloc(scratch_pool, sizeof(*base_info)); > + memcpy(base_info, info, sizeof(*base_info)); > + SVN_ERR(svn_wc__db_read_pristine_info( > + &base_info->status, > + &base_info->kind, > + &base_info->changed_rev, > + &base_info->changed_date, > + &base_info->changed_author, > + &base_info->depth, > + &checksum, &target, > + &base_info->had_props, NULL, > + db, local_abspath, > + scratch_pool, scratch_pool)); > + SVN_ERR(svn_wc__db_base_get_info( > + NULL, NULL, &base_info->revnum, > + NULL, NULL, NULL, NULL, NULL, > + NULL, NULL, NULL, NULL, > + NULL, NULL, NULL, NULL, > + db, local_abspath, > + scratch_pool, scratch_pool));
If you really want the repository information you should read all the values using svn_wc__db_base_get_info as the changed* values read by svn_wc__db_read_pristine_info are those of the highest layer... Only in case of a BASE-delete (not in case of a working delete, or a replacement!) do they represent the information you want. > + base_info->has_checksum = (checksum != NULL); > +#ifdef HAVE_SYMLINK > + base_info->special = (target != NULL); Target is not used (yet)... you must read the properties to determine if a node is a symlink or not. I think you can get the property values from svn_wc__db_base_get_info() now. > +#endif Bert > + node_status = svn_wc_status_deleted; > + info = base_info; > + } > } > else > node_status = svn_wc_status_added; > @@ -610,6 +645,16 @@ assemble_status(svn_wc_status3_t **statu > && prop_status != svn_wc_status_none) > node_status = prop_status; > > + > + /* Ignore local additions in remote-only mode */ > + if (!check_working_copy > + && node_status == svn_wc_status_added > + && !moved_from_abspath) > + { > + *status = NULL; > + return SVN_NO_ERROR; > + } I don't think this really checks what you want to check here... I would guess you want to check the have_base value (too?), as replaced nodes will also have an added status. (And even with that you might still miss a few edge cases in case parent directories are replaced with files, or the other way around) Bert