Author: julianfoad Date: Tue Jan 8 09:40:32 2019 New Revision: 1850720 URL: http://svn.apache.org/viewvc?rev=1850720&view=rev Log: Implement an experimental 'x-wc-copy-mods' command.
This can be used to comprehensively test the WC editor (issue #4786). * subversion/include/private/svn_client_private.h, subversion/libsvn_client/wc_editor.c (svn_client__wc_copy_mods): New. * subversion/svn/svn.c (svn_cl__cmd_table): Add 'x-wc-copy-mods' command. * subversion/svn/cl.h (svn_opt_subcommand_t): Declare 'svn_cl__wc_copy_mods'. * subversion/svn/shelf-cmd.c (svn_cl__wc_copy_mods): New. Modified: subversion/trunk/subversion/include/private/svn_client_private.h subversion/trunk/subversion/libsvn_client/wc_editor.c subversion/trunk/subversion/svn/cl.h subversion/trunk/subversion/svn/shelf-cmd.c subversion/trunk/subversion/svn/svn.c Modified: subversion/trunk/subversion/include/private/svn_client_private.h URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/include/private/svn_client_private.h?rev=1850720&r1=1850719&r2=1850720&view=diff ============================================================================== --- subversion/trunk/subversion/include/private/svn_client_private.h (original) +++ subversion/trunk/subversion/include/private/svn_client_private.h Tue Jan 8 09:40:32 2019 @@ -529,6 +529,12 @@ svn_client__wc_replay(const char *src_wc svn_client_ctx_t *ctx, apr_pool_t *scratch_pool); +svn_error_t * +svn_client__wc_copy_mods(const char *src_wc_abspath, + const char *dst_wc_abspath, + svn_client_ctx_t *ctx, + apr_pool_t *scratch_pool); + #ifdef __cplusplus } #endif /* __cplusplus */ Modified: subversion/trunk/subversion/libsvn_client/wc_editor.c URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/wc_editor.c?rev=1850720&r1=1850719&r2=1850720&view=diff ============================================================================== --- subversion/trunk/subversion/libsvn_client/wc_editor.c (original) +++ subversion/trunk/subversion/libsvn_client/wc_editor.c Tue Jan 8 09:40:32 2019 @@ -632,3 +632,40 @@ svn_client__wc_editor(const svn_delta_ed ctx, result_pool)); return SVN_NO_ERROR; } + +svn_error_t * +svn_client__wc_copy_mods(const char *src_wc_abspath, + const char *dst_wc_abspath, + svn_client_ctx_t *ctx, + apr_pool_t *scratch_pool) +{ + svn_client__pathrev_t *base; + const char *dst_wc_url; + svn_ra_session_t *ra_session; + const svn_delta_editor_t *editor; + void *edit_baton; + apr_array_header_t *src_targets = apr_array_make(scratch_pool, 1, + sizeof(char *)); + + /* We'll need an RA session to obtain the base of any copies */ + SVN_ERR(svn_client__wc_node_get_base(&base, + src_wc_abspath, ctx->wc_ctx, + scratch_pool, scratch_pool)); + dst_wc_url = base->url; + SVN_ERR(svn_client_open_ra_session2(&ra_session, + dst_wc_url, dst_wc_abspath, + ctx, scratch_pool, scratch_pool)); + SVN_ERR(svn_client__wc_editor(&editor, &edit_baton, + dst_wc_abspath, + NULL, NULL, + ra_session, ctx, scratch_pool)); + + APR_ARRAY_PUSH(src_targets, const char *) = src_wc_abspath; + SVN_WC__CALL_WITH_WRITE_LOCK( + svn_client__wc_replay(src_wc_abspath, + src_targets, svn_depth_infinity, NULL, + editor, edit_baton, ctx, scratch_pool), + ctx->wc_ctx, dst_wc_abspath, FALSE, scratch_pool); + + return SVN_NO_ERROR; +} Modified: subversion/trunk/subversion/svn/cl.h URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/svn/cl.h?rev=1850720&r1=1850719&r2=1850720&view=diff ============================================================================== --- subversion/trunk/subversion/svn/cl.h (original) +++ subversion/trunk/subversion/svn/cl.h Tue Jan 8 09:40:32 2019 @@ -330,6 +330,7 @@ svn_opt_subcommand_t svn_cl__shelf_save, svn_cl__shelf_shelve, svn_cl__shelf_unshelve, + svn_cl__wc_copy_mods, svn_cl__status, svn_cl__switch, svn_cl__unlock, Modified: subversion/trunk/subversion/svn/shelf-cmd.c URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/svn/shelf-cmd.c?rev=1850720&r1=1850719&r2=1850720&view=diff ============================================================================== --- subversion/trunk/subversion/svn/shelf-cmd.c (original) +++ subversion/trunk/subversion/svn/shelf-cmd.c Tue Jan 8 09:40:32 2019 @@ -1207,3 +1207,26 @@ svn_cl__shelf_log(apr_getopt_t *os, return SVN_NO_ERROR; } + +/**************************************************************************/ + +/* This implements the `svn_opt_subcommand_t' interface. */ +svn_error_t * +svn_cl__wc_copy_mods(apr_getopt_t *os, + void *baton, + apr_pool_t *pool) +{ + svn_client_ctx_t *ctx = ((svn_cl__cmd_baton_t *) baton)->ctx; + const char *src_wc_abspath, *dst_wc_abspath; + + SVN_ERR(get_next_argument(&src_wc_abspath, os, pool, pool)); + SVN_ERR(svn_dirent_get_absolute(&src_wc_abspath, src_wc_abspath, pool)); + + SVN_ERR(get_next_argument(&dst_wc_abspath, os, pool, pool)); + SVN_ERR(svn_dirent_get_absolute(&dst_wc_abspath, dst_wc_abspath, pool)); + + SVN_ERR(svn_client__wc_copy_mods(src_wc_abspath, dst_wc_abspath, + ctx, pool)); + + return SVN_NO_ERROR; +} Modified: subversion/trunk/subversion/svn/svn.c URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/svn/svn.c?rev=1850720&r1=1850719&r2=1850720&view=diff ============================================================================== --- subversion/trunk/subversion/svn/svn.c (original) +++ subversion/trunk/subversion/svn/svn.c Tue Jan 8 09:40:32 2019 @@ -2138,6 +2138,19 @@ const svn_opt_subcommand_desc3_t svn_cl_ )}, {opt_drop, 'q', opt_dry_run, opt_force} }, + { "x-wc-copy-mods", svn_cl__wc_copy_mods, {0}, {N_( + "Copy local modifications from one WC to another.\n" + "usage: x-wc-copy-mods SRC_WC_PATH DST_WC_PATH\n" + "\n"), N_( + " The source and destination WC paths may be in the same WC or in different" + " WCs.\n" + "\n"), N_( + " This feature is EXPERIMENTAL. This command is likely to change\n" + " in the next release, and there is no promise of backward compatibility.\n" + )}, + {} + }, + { NULL, NULL, {0}, {NULL}, {0} } };