Author: julianfoad Date: Mon Jan 21 15:08:26 2019 New Revision: 1851746 URL: http://svn.apache.org/viewvc?rev=1851746&view=rev Log: A follow-up to r1851739: teach 'unshelve' to do adds through the WC editor.
* subversion/libsvn_client/shelf.c (apply_prop_mods): Update doc string. (apply_file_mods): Ensure null arguments are acceptable. (path_driver_cb_func): Implement 'add' through the WC editor. Modified: subversion/trunk/subversion/libsvn_client/shelf.c Modified: subversion/trunk/subversion/libsvn_client/shelf.c URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/shelf.c?rev=1851746&r1=1851745&r2=1851746&view=diff ============================================================================== --- subversion/trunk/subversion/libsvn_client/shelf.c (original) +++ subversion/trunk/subversion/libsvn_client/shelf.c Mon Jan 21 15:08:26 2019 @@ -1365,6 +1365,8 @@ send_notification(const char *local_absp /* Apply a set of property changes to one node through EDITOR. If * FILE_BATON is non-null, apply to that file, else to the dir at DIR_BATON. + * + * When any of the properties inputs is null, it means no properties. */ static svn_error_t * apply_prop_mods(apr_hash_t *base_props, @@ -1401,7 +1403,12 @@ apply_prop_mods(apr_hash_t *base_props, return SVN_NO_ERROR; } -/* */ +/* Send edits to EDITOR : FILE_BATON representing the delta from BASE_PROPS + * to WORK_PROPS and the delta from the file at STORED_BASE_ABSPATH to the + * file at STORED_WORK_ABSPATH. + * + * When any of the inputs is null, it means no properties or empty text. + */ static svn_error_t * apply_file_mods(apr_hash_t *base_props, apr_hash_t *work_props, @@ -1417,10 +1424,16 @@ apply_file_mods(apr_hash_t *base_props, svn_txdelta_stream_t *txdelta_stream; /* text mods */ - SVN_ERR(svn_stream_open_readonly(&source_stream, stored_base_abspath, - scratch_pool, scratch_pool)); - SVN_ERR(svn_stream_open_readonly(&target_stream, stored_work_abspath, - scratch_pool, scratch_pool)); + if (stored_base_abspath) + SVN_ERR(svn_stream_open_readonly(&source_stream, stored_base_abspath, + scratch_pool, scratch_pool)); + else + source_stream = svn_stream_empty(scratch_pool); + if (stored_work_abspath) + SVN_ERR(svn_stream_open_readonly(&target_stream, stored_work_abspath, + scratch_pool, scratch_pool)); + else + target_stream = svn_stream_empty(scratch_pool); SVN_ERR(editor->apply_textdelta(file_baton, NULL /*base_checksum*/, scratch_pool, &handler, &handler_baton)); svn_txdelta2(&txdelta_stream, source_stream, target_stream, @@ -1546,21 +1559,24 @@ path_driver_cb_func(void **dir_baton_p, SVN_ERR(b->editor->add_directory(relpath, parent_baton, NULL, SVN_INVALID_REVNUM, scratch_pool, dir_baton_p)); + SVN_ERR(apply_prop_mods(NULL /*base*/, work_props, + b->editor, file_baton, *dir_baton_p, + scratch_pool)); } else if (s->kind == svn_node_file) { - /* ### should send file content through the editor instead */ - SVN_ERR(svn_io_copy_file(stored_work_abspath, to_wc_abspath, - TRUE /*copy_perms*/, scratch_pool)); + /* add */ SVN_ERR(b->editor->add_file(relpath, parent_baton, NULL, SVN_INVALID_REVNUM, scratch_pool, &file_baton)); + /* modifications */ + SVN_ERR(apply_file_mods(NULL /*base*/, work_props, + NULL /*base*/, stored_work_abspath, + b->editor, file_baton, + scratch_pool)); + /* close */ + SVN_ERR(b->editor->close_file(file_baton, NULL, scratch_pool)); } - SVN_ERR(apply_prop_mods(base_props, work_props, - b->editor, file_baton, *dir_baton_p, - scratch_pool)); - if (file_baton) - SVN_ERR(b->editor->close_file(file_baton, NULL, scratch_pool)); SVN_ERR(send_notification(to_wc_abspath, (s->node_status == svn_wc_status_replaced) ? svn_wc_notify_update_replace