| /* |
| * deprecated.c: holding file for all deprecated APIs. |
| * "we can't lose 'em, but we can shun 'em!" |
| * |
| * ==================================================================== |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * ==================================================================== |
| */ |
| |
| /* We define this here to remove any further warnings about the usage of |
| deprecated functions in this file. */ |
| #define SVN_DEPRECATED |
| |
| #include "svn_repos.h" |
| #include "svn_compat.h" |
| #include "svn_hash.h" |
| #include "svn_props.h" |
| |
| #include "svn_private_config.h" |
| |
| #include "repos.h" |
| |
| #include "private/svn_repos_private.h" |
| |
| |
| |
| |
| /*** From commit.c ***/ |
| |
| svn_error_t * |
| svn_repos_get_commit_editor4(const svn_delta_editor_t **editor, |
| void **edit_baton, |
| svn_repos_t *repos, |
| svn_fs_txn_t *txn, |
| const char *repos_url, |
| const char *base_path, |
| const char *user, |
| const char *log_msg, |
| svn_commit_callback2_t commit_callback, |
| void *commit_baton, |
| svn_repos_authz_callback_t authz_callback, |
| void *authz_baton, |
| apr_pool_t *pool) |
| { |
| apr_hash_t *revprop_table = apr_hash_make(pool); |
| if (user) |
| svn_hash_sets(revprop_table, SVN_PROP_REVISION_AUTHOR, |
| svn_string_create(user, pool)); |
| if (log_msg) |
| svn_hash_sets(revprop_table, SVN_PROP_REVISION_LOG, |
| svn_string_create(log_msg, pool)); |
| return svn_repos_get_commit_editor5(editor, edit_baton, repos, txn, |
| repos_url, base_path, revprop_table, |
| commit_callback, commit_baton, |
| authz_callback, authz_baton, pool); |
| } |
| |
| |
| svn_error_t * |
| svn_repos_get_commit_editor3(const svn_delta_editor_t **editor, |
| void **edit_baton, |
| svn_repos_t *repos, |
| svn_fs_txn_t *txn, |
| const char *repos_url, |
| const char *base_path, |
| const char *user, |
| const char *log_msg, |
| svn_commit_callback_t callback, |
| void *callback_baton, |
| svn_repos_authz_callback_t authz_callback, |
| void *authz_baton, |
| apr_pool_t *pool) |
| { |
| svn_commit_callback2_t callback2; |
| void *callback2_baton; |
| |
| svn_compat_wrap_commit_callback(&callback2, &callback2_baton, |
| callback, callback_baton, |
| pool); |
| |
| return svn_repos_get_commit_editor4(editor, edit_baton, repos, txn, |
| repos_url, base_path, user, |
| log_msg, callback2, |
| callback2_baton, authz_callback, |
| authz_baton, pool); |
| } |
| |
| |
| svn_error_t * |
| svn_repos_get_commit_editor2(const svn_delta_editor_t **editor, |
| void **edit_baton, |
| svn_repos_t *repos, |
| svn_fs_txn_t *txn, |
| const char *repos_url, |
| const char *base_path, |
| const char *user, |
| const char *log_msg, |
| svn_commit_callback_t callback, |
| void *callback_baton, |
| apr_pool_t *pool) |
| { |
| return svn_repos_get_commit_editor3(editor, edit_baton, repos, txn, |
| repos_url, base_path, user, |
| log_msg, callback, callback_baton, |
| NULL, NULL, pool); |
| } |
| |
| |
| svn_error_t * |
| svn_repos_get_commit_editor(const svn_delta_editor_t **editor, |
| void **edit_baton, |
| svn_repos_t *repos, |
| const char *repos_url, |
| const char *base_path, |
| const char *user, |
| const char *log_msg, |
| svn_commit_callback_t callback, |
| void *callback_baton, |
| apr_pool_t *pool) |
| { |
| return svn_repos_get_commit_editor2(editor, edit_baton, repos, NULL, |
| repos_url, base_path, user, |
| log_msg, callback, |
| callback_baton, pool); |
| } |
| |
| svn_error_t * |
| svn_repos_open2(svn_repos_t **repos_p, |
| const char *path, |
| apr_hash_t *fs_config, |
| apr_pool_t *pool) |
| { |
| return svn_repos_open3(repos_p, path, fs_config, pool, pool); |
| } |
| |
| svn_error_t * |
| svn_repos_open(svn_repos_t **repos_p, |
| const char *path, |
| apr_pool_t *pool) |
| { |
| return svn_repos_open2(repos_p, path, NULL, pool); |
| } |
| |
| |
| /*** From repos.c ***/ |
| struct recover_baton |
| { |
| svn_error_t *(*start_callback)(void *baton); |
| void *start_callback_baton; |
| }; |
| |
| static void |
| recovery_started(void *baton, |
| const svn_repos_notify_t *notify, |
| apr_pool_t *scratch_pool) |
| { |
| struct recover_baton *rb = baton; |
| |
| if (notify->action == svn_repos_notify_mutex_acquired |
| && rb->start_callback != NULL) |
| svn_error_clear(rb->start_callback(rb->start_callback_baton)); |
| } |
| |
| svn_error_t * |
| svn_repos_recover3(const char *path, |
| svn_boolean_t nonblocking, |
| svn_error_t *(*start_callback)(void *baton), |
| void *start_callback_baton, |
| svn_cancel_func_t cancel_func, void *cancel_baton, |
| apr_pool_t *pool) |
| { |
| struct recover_baton rb; |
| |
| rb.start_callback = start_callback; |
| rb.start_callback_baton = start_callback_baton; |
| |
| return svn_repos_recover4(path, nonblocking, recovery_started, &rb, |
| cancel_func, cancel_baton, pool); |
| } |
| |
| svn_error_t * |
| svn_repos_recover2(const char *path, |
| svn_boolean_t nonblocking, |
| svn_error_t *(*start_callback)(void *baton), |
| void *start_callback_baton, |
| apr_pool_t *pool) |
| { |
| return svn_repos_recover3(path, nonblocking, |
| start_callback, start_callback_baton, |
| NULL, NULL, |
| pool); |
| } |
| |
| svn_error_t * |
| svn_repos_recover(const char *path, |
| apr_pool_t *pool) |
| { |
| return svn_repos_recover2(path, FALSE, NULL, NULL, pool); |
| } |
| |
| svn_error_t * |
| svn_repos_upgrade(const char *path, |
| svn_boolean_t nonblocking, |
| svn_error_t *(*start_callback)(void *baton), |
| void *start_callback_baton, |
| apr_pool_t *pool) |
| { |
| struct recover_baton rb; |
| |
| rb.start_callback = start_callback; |
| rb.start_callback_baton = start_callback_baton; |
| |
| return svn_repos_upgrade2(path, nonblocking, recovery_started, &rb, pool); |
| } |
| |
| svn_error_t * |
| svn_repos_hotcopy2(const char *src_path, |
| const char *dst_path, |
| svn_boolean_t clean_logs, |
| svn_boolean_t incremental, |
| svn_cancel_func_t cancel_func, |
| void *cancel_baton, |
| apr_pool_t *pool) |
| { |
| return svn_error_trace(svn_repos_hotcopy3(src_path, dst_path, clean_logs, |
| incremental, NULL, NULL, |
| cancel_func, cancel_baton, pool)); |
| } |
| |
| svn_error_t * |
| svn_repos_hotcopy(const char *src_path, |
| const char *dst_path, |
| svn_boolean_t clean_logs, |
| apr_pool_t *pool) |
| { |
| return svn_error_trace(svn_repos_hotcopy2(src_path, dst_path, clean_logs, |
| FALSE, NULL, NULL, pool)); |
| } |
| |
| /*** From reporter.c ***/ |
| svn_error_t * |
| svn_repos_begin_report(void **report_baton, |
| svn_revnum_t revnum, |
| const char *username, |
| svn_repos_t *repos, |
| const char *fs_base, |
| const char *s_operand, |
| const char *switch_path, |
| svn_boolean_t text_deltas, |
| svn_boolean_t recurse, |
| svn_boolean_t ignore_ancestry, |
| const svn_delta_editor_t *editor, |
| void *edit_baton, |
| svn_repos_authz_func_t authz_read_func, |
| void *authz_read_baton, |
| apr_pool_t *pool) |
| { |
| return svn_repos_begin_report2(report_baton, |
| revnum, |
| repos, |
| fs_base, |
| s_operand, |
| switch_path, |
| text_deltas, |
| SVN_DEPTH_INFINITY_OR_FILES(recurse), |
| ignore_ancestry, |
| FALSE, /* don't send copyfrom args */ |
| editor, |
| edit_baton, |
| authz_read_func, |
| authz_read_baton, |
| pool); |
| } |
| |
| svn_error_t * |
| svn_repos_begin_report2(void **report_baton, |
| svn_revnum_t revnum, |
| svn_repos_t *repos, |
| const char *fs_base, |
| const char *target, |
| const char *tgt_path, |
| svn_boolean_t text_deltas, |
| svn_depth_t depth, |
| svn_boolean_t ignore_ancestry, |
| svn_boolean_t send_copyfrom_args, |
| const svn_delta_editor_t *editor, |
| void *edit_baton, |
| svn_repos_authz_func_t authz_read_func, |
| void *authz_read_baton, |
| apr_pool_t *pool) |
| { |
| return svn_repos_begin_report3(report_baton, |
| revnum, |
| repos, |
| fs_base, |
| target, |
| tgt_path, |
| text_deltas, |
| depth, |
| ignore_ancestry, |
| send_copyfrom_args, |
| editor, |
| edit_baton, |
| authz_read_func, |
| authz_read_baton, |
| 0, /* disable zero-copy code path */ |
| pool); |
| } |
| |
| svn_error_t * |
| svn_repos_set_path2(void *baton, const char *path, svn_revnum_t rev, |
| svn_boolean_t start_empty, const char *lock_token, |
| apr_pool_t *pool) |
| { |
| return svn_repos_set_path3(baton, path, rev, svn_depth_infinity, |
| start_empty, lock_token, pool); |
| } |
| |
| svn_error_t * |
| svn_repos_set_path(void *baton, const char *path, svn_revnum_t rev, |
| svn_boolean_t start_empty, apr_pool_t *pool) |
| { |
| return svn_repos_set_path2(baton, path, rev, start_empty, NULL, pool); |
| } |
| |
| svn_error_t * |
| svn_repos_link_path2(void *baton, const char *path, const char *link_path, |
| svn_revnum_t rev, svn_boolean_t start_empty, |
| const char *lock_token, apr_pool_t *pool) |
| { |
| return svn_repos_link_path3(baton, path, link_path, rev, svn_depth_infinity, |
| start_empty, lock_token, pool); |
| } |
| |
| svn_error_t * |
| svn_repos_link_path(void *baton, const char *path, const char *link_path, |
| svn_revnum_t rev, svn_boolean_t start_empty, |
| apr_pool_t *pool) |
| { |
| return svn_repos_link_path2(baton, path, link_path, rev, start_empty, |
| NULL, pool); |
| } |
| |
| /*** From dir-delta.c ***/ |
| svn_error_t * |
| svn_repos_dir_delta(svn_fs_root_t *src_root, |
| const char *src_parent_dir, |
| const char *src_entry, |
| svn_fs_root_t *tgt_root, |
| const char *tgt_fullpath, |
| const svn_delta_editor_t *editor, |
| void *edit_baton, |
| svn_repos_authz_func_t authz_read_func, |
| void *authz_read_baton, |
| svn_boolean_t text_deltas, |
| svn_boolean_t recurse, |
| svn_boolean_t entry_props, |
| svn_boolean_t ignore_ancestry, |
| apr_pool_t *pool) |
| { |
| return svn_repos_dir_delta2(src_root, |
| src_parent_dir, |
| src_entry, |
| tgt_root, |
| tgt_fullpath, |
| editor, |
| edit_baton, |
| authz_read_func, |
| authz_read_baton, |
| text_deltas, |
| SVN_DEPTH_INFINITY_OR_FILES(recurse), |
| entry_props, |
| ignore_ancestry, |
| pool); |
| } |
| |
| /*** From replay.c ***/ |
| svn_error_t * |
| svn_repos_replay(svn_fs_root_t *root, |
| const svn_delta_editor_t *editor, |
| void *edit_baton, |
| apr_pool_t *pool) |
| { |
| return svn_repos_replay2(root, |
| "" /* the whole tree */, |
| SVN_INVALID_REVNUM, /* no low water mark */ |
| FALSE /* no text deltas */, |
| editor, edit_baton, |
| NULL /* no authz func */, |
| NULL /* no authz baton */, |
| pool); |
| } |
| |
| /*** From fs-wrap.c ***/ |
| svn_error_t * |
| svn_repos_fs_change_rev_prop3(svn_repos_t *repos, |
| svn_revnum_t rev, |
| const char *author, |
| const char *name, |
| const svn_string_t *new_value, |
| svn_boolean_t use_pre_revprop_change_hook, |
| svn_boolean_t use_post_revprop_change_hook, |
| svn_repos_authz_func_t authz_read_func, |
| void *authz_read_baton, |
| apr_pool_t *pool) |
| { |
| return svn_repos_fs_change_rev_prop4(repos, rev, author, name, NULL, |
| new_value, |
| use_pre_revprop_change_hook, |
| use_post_revprop_change_hook, |
| authz_read_func, |
| authz_read_baton, pool); |
| } |
| |
| svn_error_t * |
| svn_repos_fs_change_rev_prop2(svn_repos_t *repos, |
| svn_revnum_t rev, |
| const char *author, |
| const char *name, |
| const svn_string_t *new_value, |
| svn_repos_authz_func_t authz_read_func, |
| void *authz_read_baton, |
| apr_pool_t *pool) |
| { |
| return svn_repos_fs_change_rev_prop3(repos, rev, author, name, new_value, |
| TRUE, TRUE, authz_read_func, |
| authz_read_baton, pool); |
| } |
| |
| |
| |
| svn_error_t * |
| svn_repos_fs_change_rev_prop(svn_repos_t *repos, |
| svn_revnum_t rev, |
| const char *author, |
| const char *name, |
| const svn_string_t *new_value, |
| apr_pool_t *pool) |
| { |
| return svn_repos_fs_change_rev_prop2(repos, rev, author, name, new_value, |
| NULL, NULL, pool); |
| } |
| |
| struct pack_notify_wrapper_baton |
| { |
| svn_fs_pack_notify_t notify_func; |
| void *notify_baton; |
| }; |
| |
| static void |
| pack_notify_wrapper_func(void *baton, |
| const svn_repos_notify_t *notify, |
| apr_pool_t *scratch_pool) |
| { |
| struct pack_notify_wrapper_baton *pnwb = baton; |
| |
| svn_error_clear(pnwb->notify_func(pnwb->notify_baton, notify->shard, |
| notify->action - 3, scratch_pool)); |
| } |
| |
| svn_error_t * |
| svn_repos_fs_pack(svn_repos_t *repos, |
| svn_fs_pack_notify_t notify_func, |
| void *notify_baton, |
| svn_cancel_func_t cancel_func, |
| void *cancel_baton, |
| apr_pool_t *pool) |
| { |
| struct pack_notify_wrapper_baton pnwb; |
| |
| pnwb.notify_func = notify_func; |
| pnwb.notify_baton = notify_baton; |
| |
| return svn_repos_fs_pack2(repos, pack_notify_wrapper_func, &pnwb, |
| cancel_func, cancel_baton, pool); |
| } |
| |
| |
| svn_error_t * |
| svn_repos_fs_get_locks(apr_hash_t **locks, |
| svn_repos_t *repos, |
| const char *path, |
| svn_repos_authz_func_t authz_read_func, |
| void *authz_read_baton, |
| apr_pool_t *pool) |
| { |
| return svn_error_trace(svn_repos_fs_get_locks2(locks, repos, path, |
| svn_depth_infinity, |
| authz_read_func, |
| authz_read_baton, pool)); |
| } |
| |
| |
| /*** From logs.c ***/ |
| svn_error_t * |
| svn_repos_get_logs4(svn_repos_t *repos, |
| const apr_array_header_t *paths, |
| svn_revnum_t start, |
| svn_revnum_t end, |
| int limit, |
| svn_boolean_t discover_changed_paths, |
| svn_boolean_t strict_node_history, |
| svn_boolean_t include_merged_revisions, |
| const apr_array_header_t *revprops, |
| svn_repos_authz_func_t authz_read_func, |
| void *authz_read_baton, |
| svn_log_entry_receiver_t receiver, |
| void *receiver_baton, |
| apr_pool_t *pool) |
| { |
| return svn_repos__get_logs_compat(repos, paths, start, end, limit, |
| discover_changed_paths, |
| strict_node_history, |
| include_merged_revisions, revprops, |
| authz_read_func, authz_read_baton, |
| receiver, receiver_baton, pool); |
| } |
| |
| svn_error_t * |
| svn_repos_get_logs3(svn_repos_t *repos, |
| const apr_array_header_t *paths, |
| svn_revnum_t start, |
| svn_revnum_t end, |
| int limit, |
| svn_boolean_t discover_changed_paths, |
| svn_boolean_t strict_node_history, |
| svn_repos_authz_func_t authz_read_func, |
| void *authz_read_baton, |
| svn_log_message_receiver_t receiver, |
| void *receiver_baton, |
| apr_pool_t *pool) |
| { |
| svn_log_entry_receiver_t receiver2; |
| void *receiver2_baton; |
| |
| svn_compat_wrap_log_receiver(&receiver2, &receiver2_baton, |
| receiver, receiver_baton, |
| pool); |
| |
| return svn_repos_get_logs4(repos, paths, start, end, limit, |
| discover_changed_paths, strict_node_history, |
| FALSE, svn_compat_log_revprops_in(pool), |
| authz_read_func, authz_read_baton, |
| receiver2, receiver2_baton, |
| pool); |
| } |
| |
| svn_error_t * |
| svn_repos_get_logs2(svn_repos_t *repos, |
| const apr_array_header_t *paths, |
| svn_revnum_t start, |
| svn_revnum_t end, |
| svn_boolean_t discover_changed_paths, |
| svn_boolean_t strict_node_history, |
| svn_repos_authz_func_t authz_read_func, |
| void *authz_read_baton, |
| svn_log_message_receiver_t receiver, |
| void *receiver_baton, |
| apr_pool_t *pool) |
| { |
| return svn_repos_get_logs3(repos, paths, start, end, 0, |
| discover_changed_paths, strict_node_history, |
| authz_read_func, authz_read_baton, receiver, |
| receiver_baton, pool); |
| } |
| |
| |
| svn_error_t * |
| svn_repos_get_logs(svn_repos_t *repos, |
| const apr_array_header_t *paths, |
| svn_revnum_t start, |
| svn_revnum_t end, |
| svn_boolean_t discover_changed_paths, |
| svn_boolean_t strict_node_history, |
| svn_log_message_receiver_t receiver, |
| void *receiver_baton, |
| apr_pool_t *pool) |
| { |
| return svn_repos_get_logs3(repos, paths, start, end, 0, |
| discover_changed_paths, strict_node_history, |
| NULL, NULL, /* no authz stuff */ |
| receiver, receiver_baton, pool); |
| } |
| |
| /*** From rev_hunt.c ***/ |
| svn_error_t * |
| svn_repos_history(svn_fs_t *fs, |
| const char *path, |
| svn_repos_history_func_t history_func, |
| void *history_baton, |
| svn_revnum_t start, |
| svn_revnum_t end, |
| svn_boolean_t cross_copies, |
| apr_pool_t *pool) |
| { |
| return svn_repos_history2(fs, path, history_func, history_baton, |
| NULL, NULL, |
| start, end, cross_copies, pool); |
| } |
| |
| svn_error_t * |
| svn_repos_get_file_revs(svn_repos_t *repos, |
| const char *path, |
| svn_revnum_t start, |
| svn_revnum_t end, |
| svn_repos_authz_func_t authz_read_func, |
| void *authz_read_baton, |
| svn_repos_file_rev_handler_t handler, |
| void *handler_baton, |
| apr_pool_t *pool) |
| { |
| svn_file_rev_handler_t handler2; |
| void *handler2_baton; |
| |
| svn_compat_wrap_file_rev_handler(&handler2, &handler2_baton, handler, |
| handler_baton, pool); |
| |
| return svn_repos_get_file_revs2(repos, path, start, end, FALSE, |
| authz_read_func, authz_read_baton, |
| handler2, handler2_baton, pool); |
| } |
| |
| /*** From dump.c ***/ |
| svn_error_t * |
| svn_repos_dump_fs(svn_repos_t *repos, |
| svn_stream_t *stream, |
| svn_stream_t *feedback_stream, |
| svn_revnum_t start_rev, |
| svn_revnum_t end_rev, |
| svn_boolean_t incremental, |
| svn_cancel_func_t cancel_func, |
| void *cancel_baton, |
| apr_pool_t *pool) |
| { |
| return svn_repos_dump_fs2(repos, stream, feedback_stream, start_rev, |
| end_rev, incremental, FALSE, cancel_func, |
| cancel_baton, pool); |
| } |
| |
| /* Implementation of svn_repos_notify_func_t to wrap the output to a |
| response stream for svn_repos_dump_fs2() and svn_repos_verify_fs() */ |
| static void |
| repos_notify_handler(void *baton, |
| const svn_repos_notify_t *notify, |
| apr_pool_t *scratch_pool) |
| { |
| svn_stream_t *feedback_stream = baton; |
| apr_size_t len; |
| |
| switch (notify->action) |
| { |
| case svn_repos_notify_warning: |
| svn_error_clear(svn_stream_puts(feedback_stream, notify->warning_str)); |
| return; |
| |
| case svn_repos_notify_dump_rev_end: |
| svn_error_clear(svn_stream_printf(feedback_stream, scratch_pool, |
| _("* Dumped revision %ld.\n"), |
| notify->revision)); |
| return; |
| |
| case svn_repos_notify_verify_rev_end: |
| svn_error_clear(svn_stream_printf(feedback_stream, scratch_pool, |
| _("* Verified revision %ld.\n"), |
| notify->revision)); |
| return; |
| |
| case svn_repos_notify_load_txn_committed: |
| if (notify->old_revision == SVN_INVALID_REVNUM) |
| { |
| svn_error_clear(svn_stream_printf(feedback_stream, scratch_pool, |
| _("\n------- Committed revision %ld >>>\n\n"), |
| notify->new_revision)); |
| } |
| else |
| { |
| svn_error_clear(svn_stream_printf(feedback_stream, scratch_pool, |
| _("\n------- Committed new rev %ld" |
| " (loaded from original rev %ld" |
| ") >>>\n\n"), notify->new_revision, |
| notify->old_revision)); |
| } |
| return; |
| |
| case svn_repos_notify_load_node_start: |
| { |
| switch (notify->node_action) |
| { |
| case svn_node_action_change: |
| svn_error_clear(svn_stream_printf(feedback_stream, scratch_pool, |
| _(" * editing path : %s ..."), |
| notify->path)); |
| break; |
| |
| case svn_node_action_delete: |
| svn_error_clear(svn_stream_printf(feedback_stream, scratch_pool, |
| _(" * deleting path : %s ..."), |
| notify->path)); |
| break; |
| |
| case svn_node_action_add: |
| svn_error_clear(svn_stream_printf(feedback_stream, scratch_pool, |
| _(" * adding path : %s ..."), |
| notify->path)); |
| break; |
| |
| case svn_node_action_replace: |
| svn_error_clear(svn_stream_printf(feedback_stream, scratch_pool, |
| _(" * replacing path : %s ..."), |
| notify->path)); |
| break; |
| |
| } |
| } |
| return; |
| |
| case svn_repos_notify_load_node_done: |
| len = 7; |
| svn_error_clear(svn_stream_write(feedback_stream, _(" done.\n"), &len)); |
| return; |
| |
| case svn_repos_notify_load_copied_node: |
| len = 9; |
| svn_error_clear(svn_stream_write(feedback_stream, "COPIED...", &len)); |
| return; |
| |
| case svn_repos_notify_load_txn_start: |
| svn_error_clear(svn_stream_printf(feedback_stream, scratch_pool, |
| _("<<< Started new transaction, based on " |
| "original revision %ld\n"), |
| notify->old_revision)); |
| return; |
| |
| case svn_repos_notify_load_normalized_mergeinfo: |
| svn_error_clear(svn_stream_printf(feedback_stream, scratch_pool, |
| _(" removing '\\r' from %s ..."), |
| SVN_PROP_MERGEINFO)); |
| return; |
| |
| default: |
| return; |
| } |
| } |
| |
| svn_error_t * |
| svn_repos_dump_fs3(svn_repos_t *repos, |
| svn_stream_t *stream, |
| svn_revnum_t start_rev, |
| svn_revnum_t end_rev, |
| svn_boolean_t incremental, |
| svn_boolean_t use_deltas, |
| svn_repos_notify_func_t notify_func, |
| void *notify_baton, |
| svn_cancel_func_t cancel_func, |
| void *cancel_baton, |
| apr_pool_t *pool) |
| { |
| return svn_error_trace(svn_repos_dump_fs4(repos, |
| stream, |
| start_rev, |
| end_rev, |
| incremental, |
| use_deltas, |
| TRUE, |
| TRUE, |
| notify_func, |
| notify_baton, |
| cancel_func, |
| cancel_baton, |
| pool)); |
| } |
| |
| svn_error_t * |
| svn_repos_dump_fs2(svn_repos_t *repos, |
| svn_stream_t *stream, |
| svn_stream_t *feedback_stream, |
| svn_revnum_t start_rev, |
| svn_revnum_t end_rev, |
| svn_boolean_t incremental, |
| svn_boolean_t use_deltas, |
| svn_cancel_func_t cancel_func, |
| void *cancel_baton, |
| apr_pool_t *pool) |
| { |
| return svn_error_trace(svn_repos_dump_fs3(repos, |
| stream, |
| start_rev, |
| end_rev, |
| incremental, |
| use_deltas, |
| feedback_stream |
| ? repos_notify_handler |
| : NULL, |
| feedback_stream, |
| cancel_func, |
| cancel_baton, |
| pool)); |
| } |
| |
| svn_error_t * |
| svn_repos_verify_fs2(svn_repos_t *repos, |
| svn_revnum_t start_rev, |
| svn_revnum_t end_rev, |
| svn_repos_notify_func_t notify_func, |
| void *notify_baton, |
| svn_cancel_func_t cancel_func, |
| void *cancel_baton, |
| apr_pool_t *pool) |
| { |
| return svn_error_trace(svn_repos_verify_fs3(repos, |
| start_rev, |
| end_rev, |
| FALSE, |
| FALSE, |
| notify_func, |
| notify_baton, |
| NULL, NULL, |
| cancel_func, |
| cancel_baton, |
| pool)); |
| } |
| |
| svn_error_t * |
| svn_repos_verify_fs(svn_repos_t *repos, |
| svn_stream_t *feedback_stream, |
| svn_revnum_t start_rev, |
| svn_revnum_t end_rev, |
| svn_cancel_func_t cancel_func, |
| void *cancel_baton, |
| apr_pool_t *pool) |
| { |
| return svn_error_trace(svn_repos_verify_fs2(repos, |
| start_rev, |
| end_rev, |
| feedback_stream |
| ? repos_notify_handler |
| : NULL, |
| feedback_stream, |
| cancel_func, |
| cancel_baton, |
| pool)); |
| } |
| |
| /*** From load.c ***/ |
| |
| svn_error_t * |
| svn_repos_load_fs4(svn_repos_t *repos, |
| svn_stream_t *dumpstream, |
| svn_revnum_t start_rev, |
| svn_revnum_t end_rev, |
| enum svn_repos_load_uuid uuid_action, |
| const char *parent_dir, |
| svn_boolean_t use_pre_commit_hook, |
| svn_boolean_t use_post_commit_hook, |
| svn_boolean_t validate_props, |
| svn_repos_notify_func_t notify_func, |
| void *notify_baton, |
| svn_cancel_func_t cancel_func, |
| void *cancel_baton, |
| apr_pool_t *pool) |
| { |
| return svn_repos_load_fs5(repos, dumpstream, start_rev, end_rev, |
| uuid_action, parent_dir, |
| use_post_commit_hook, use_post_commit_hook, |
| validate_props, FALSE, |
| notify_func, notify_baton, |
| cancel_func, cancel_baton, pool); |
| } |
| |
| svn_error_t * |
| svn_repos_load_fs3(svn_repos_t *repos, |
| svn_stream_t *dumpstream, |
| enum svn_repos_load_uuid uuid_action, |
| const char *parent_dir, |
| svn_boolean_t use_pre_commit_hook, |
| svn_boolean_t use_post_commit_hook, |
| svn_boolean_t validate_props, |
| svn_repos_notify_func_t notify_func, |
| void *notify_baton, |
| svn_cancel_func_t cancel_func, |
| void *cancel_baton, |
| apr_pool_t *pool) |
| { |
| return svn_repos_load_fs4(repos, dumpstream, |
| SVN_INVALID_REVNUM, SVN_INVALID_REVNUM, |
| uuid_action, parent_dir, |
| use_pre_commit_hook, use_post_commit_hook, |
| validate_props, notify_func, notify_baton, |
| cancel_func, cancel_baton, pool); |
| } |
| |
| svn_error_t * |
| svn_repos_load_fs2(svn_repos_t *repos, |
| svn_stream_t *dumpstream, |
| svn_stream_t *feedback_stream, |
| enum svn_repos_load_uuid uuid_action, |
| const char *parent_dir, |
| svn_boolean_t use_pre_commit_hook, |
| svn_boolean_t use_post_commit_hook, |
| svn_cancel_func_t cancel_func, |
| void *cancel_baton, |
| apr_pool_t *pool) |
| { |
| return svn_repos_load_fs3(repos, dumpstream, uuid_action, parent_dir, |
| use_pre_commit_hook, use_post_commit_hook, FALSE, |
| feedback_stream ? repos_notify_handler : NULL, |
| feedback_stream, cancel_func, cancel_baton, pool); |
| } |
| |
| |
| static svn_repos_parser_fns_t * |
| fns_from_fns2(const svn_repos_parse_fns2_t *fns2, |
| apr_pool_t *pool) |
| { |
| svn_repos_parser_fns_t *fns; |
| |
| fns = apr_palloc(pool, sizeof(*fns)); |
| fns->new_revision_record = fns2->new_revision_record; |
| fns->uuid_record = fns2->uuid_record; |
| fns->new_node_record = fns2->new_node_record; |
| fns->set_revision_property = fns2->set_revision_property; |
| fns->set_node_property = fns2->set_node_property; |
| fns->remove_node_props = fns2->remove_node_props; |
| fns->set_fulltext = fns2->set_fulltext; |
| fns->close_node = fns2->close_node; |
| fns->close_revision = fns2->close_revision; |
| return fns; |
| } |
| |
| static svn_repos_parser_fns2_t * |
| fns2_from_fns3(const svn_repos_parse_fns3_t *fns3, |
| apr_pool_t *pool) |
| { |
| svn_repos_parser_fns2_t *fns2; |
| |
| fns2 = apr_palloc(pool, sizeof(*fns2)); |
| fns2->new_revision_record = fns3->new_revision_record; |
| fns2->uuid_record = fns3->uuid_record; |
| fns2->new_node_record = fns3->new_node_record; |
| fns2->set_revision_property = fns3->set_revision_property; |
| fns2->set_node_property = fns3->set_node_property; |
| fns2->remove_node_props = fns3->remove_node_props; |
| fns2->set_fulltext = fns3->set_fulltext; |
| fns2->close_node = fns3->close_node; |
| fns2->close_revision = fns3->close_revision; |
| fns2->delete_node_property = fns3->delete_node_property; |
| fns2->apply_textdelta = fns3->apply_textdelta; |
| return fns2; |
| } |
| |
| static svn_repos_parse_fns2_t * |
| fns2_from_fns(const svn_repos_parser_fns_t *fns, |
| apr_pool_t *pool) |
| { |
| svn_repos_parse_fns2_t *fns2; |
| |
| fns2 = apr_palloc(pool, sizeof(*fns2)); |
| fns2->new_revision_record = fns->new_revision_record; |
| fns2->uuid_record = fns->uuid_record; |
| fns2->new_node_record = fns->new_node_record; |
| fns2->set_revision_property = fns->set_revision_property; |
| fns2->set_node_property = fns->set_node_property; |
| fns2->remove_node_props = fns->remove_node_props; |
| fns2->set_fulltext = fns->set_fulltext; |
| fns2->close_node = fns->close_node; |
| fns2->close_revision = fns->close_revision; |
| fns2->delete_node_property = NULL; |
| fns2->apply_textdelta = NULL; |
| return fns2; |
| } |
| |
| static svn_repos_parse_fns3_t * |
| fns3_from_fns2(const svn_repos_parser_fns2_t *fns2, |
| apr_pool_t *pool) |
| { |
| svn_repos_parse_fns3_t *fns3; |
| |
| fns3 = apr_palloc(pool, sizeof(*fns3)); |
| fns3->magic_header_record = NULL; |
| fns3->uuid_record = fns2->uuid_record; |
| fns3->new_revision_record = fns2->new_revision_record; |
| fns3->new_node_record = fns2->new_node_record; |
| fns3->set_revision_property = fns2->set_revision_property; |
| fns3->set_node_property = fns2->set_node_property; |
| fns3->remove_node_props = fns2->remove_node_props; |
| fns3->set_fulltext = fns2->set_fulltext; |
| fns3->close_node = fns2->close_node; |
| fns3->close_revision = fns2->close_revision; |
| fns3->delete_node_property = fns2->delete_node_property; |
| fns3->apply_textdelta = fns2->apply_textdelta; |
| return fns3; |
| } |
| |
| svn_error_t * |
| svn_repos_parse_dumpstream2(svn_stream_t *stream, |
| const svn_repos_parser_fns2_t *parse_fns, |
| void *parse_baton, |
| svn_cancel_func_t cancel_func, |
| void *cancel_baton, |
| apr_pool_t *pool) |
| { |
| svn_repos_parse_fns3_t *fns3 = fns3_from_fns2(parse_fns, pool); |
| |
| return svn_repos_parse_dumpstream3(stream, fns3, parse_baton, FALSE, |
| cancel_func, cancel_baton, pool); |
| } |
| |
| svn_error_t * |
| svn_repos_parse_dumpstream(svn_stream_t *stream, |
| const svn_repos_parser_fns_t *parse_fns, |
| void *parse_baton, |
| svn_cancel_func_t cancel_func, |
| void *cancel_baton, |
| apr_pool_t *pool) |
| { |
| svn_repos_parse_fns2_t *fns2 = fns2_from_fns(parse_fns, pool); |
| |
| return svn_repos_parse_dumpstream2(stream, fns2, parse_baton, |
| cancel_func, cancel_baton, pool); |
| } |
| |
| svn_error_t * |
| svn_repos_load_fs(svn_repos_t *repos, |
| svn_stream_t *dumpstream, |
| svn_stream_t *feedback_stream, |
| enum svn_repos_load_uuid uuid_action, |
| const char *parent_dir, |
| svn_cancel_func_t cancel_func, |
| void *cancel_baton, |
| apr_pool_t *pool) |
| { |
| return svn_repos_load_fs2(repos, dumpstream, feedback_stream, |
| uuid_action, parent_dir, FALSE, FALSE, |
| cancel_func, cancel_baton, pool); |
| } |
| |
| svn_error_t * |
| svn_repos_get_fs_build_parser4(const svn_repos_parse_fns3_t **callbacks, |
| void **parse_baton, |
| svn_repos_t *repos, |
| svn_revnum_t start_rev, |
| svn_revnum_t end_rev, |
| svn_boolean_t use_history, |
| svn_boolean_t validate_props, |
| enum svn_repos_load_uuid uuid_action, |
| const char *parent_dir, |
| svn_repos_notify_func_t notify_func, |
| void *notify_baton, |
| apr_pool_t *pool) |
| { |
| SVN_ERR(svn_repos_get_fs_build_parser5(callbacks, parse_baton, |
| repos, |
| start_rev, end_rev, |
| use_history, |
| validate_props, |
| uuid_action, |
| parent_dir, |
| FALSE, FALSE, /*hooks */ |
| FALSE /*ignore_dates*/, |
| notify_func, |
| notify_baton, |
| pool)); |
| return SVN_NO_ERROR; |
| } |
| |
| svn_error_t * |
| svn_repos_get_fs_build_parser3(const svn_repos_parse_fns2_t **callbacks, |
| void **parse_baton, |
| svn_repos_t *repos, |
| svn_boolean_t use_history, |
| svn_boolean_t validate_props, |
| enum svn_repos_load_uuid uuid_action, |
| const char *parent_dir, |
| svn_repos_notify_func_t notify_func, |
| void *notify_baton, |
| apr_pool_t *pool) |
| { |
| const svn_repos_parse_fns3_t *fns3; |
| |
| SVN_ERR(svn_repos_get_fs_build_parser4(&fns3, parse_baton, repos, |
| SVN_INVALID_REVNUM, |
| SVN_INVALID_REVNUM, |
| use_history, validate_props, |
| uuid_action, parent_dir, |
| notify_func, notify_baton, pool)); |
| |
| *callbacks = fns2_from_fns3(fns3, pool); |
| return SVN_NO_ERROR; |
| } |
| |
| svn_error_t * |
| svn_repos_get_fs_build_parser2(const svn_repos_parse_fns2_t **parser, |
| void **parse_baton, |
| svn_repos_t *repos, |
| svn_boolean_t use_history, |
| enum svn_repos_load_uuid uuid_action, |
| svn_stream_t *outstream, |
| const char *parent_dir, |
| apr_pool_t *pool) |
| { |
| return svn_repos_get_fs_build_parser3(parser, parse_baton, repos, use_history, |
| FALSE, uuid_action, parent_dir, |
| outstream ? repos_notify_handler : NULL, |
| outstream, pool); |
| } |
| |
| svn_error_t * |
| svn_repos_get_fs_build_parser(const svn_repos_parser_fns_t **parser_callbacks, |
| void **parse_baton, |
| svn_repos_t *repos, |
| svn_boolean_t use_history, |
| enum svn_repos_load_uuid uuid_action, |
| svn_stream_t *outstream, |
| const char *parent_dir, |
| apr_pool_t *pool) |
| { |
| const svn_repos_parse_fns2_t *fns2; |
| |
| SVN_ERR(svn_repos_get_fs_build_parser2(&fns2, parse_baton, repos, |
| use_history, uuid_action, outstream, |
| parent_dir, pool)); |
| |
| *parser_callbacks = fns_from_fns2(fns2, pool); |
| return SVN_NO_ERROR; |
| } |
| |
| |
| svn_error_t * |
| svn_repos_fs_begin_txn_for_update(svn_fs_txn_t **txn_p, |
| svn_repos_t *repos, |
| svn_revnum_t rev, |
| const char *author, |
| apr_pool_t *pool) |
| { |
| /* ### someday, we might run a read-hook here. */ |
| |
| /* Begin the transaction. */ |
| SVN_ERR(svn_fs_begin_txn2(txn_p, repos->fs, rev, 0, pool)); |
| |
| /* We pass the author to the filesystem by adding it as a property |
| on the txn. */ |
| |
| /* User (author). */ |
| if (author) |
| { |
| svn_string_t val; |
| val.data = author; |
| val.len = strlen(author); |
| SVN_ERR(svn_fs_change_txn_prop(*txn_p, SVN_PROP_REVISION_AUTHOR, |
| &val, pool)); |
| } |
| |
| return SVN_NO_ERROR; |
| } |
| |
| /*** From authz.c ***/ |
| |
| svn_error_t * |
| svn_repos_authz_read(svn_authz_t **authz_p, const char *file, |
| svn_boolean_t must_exist, apr_pool_t *pool) |
| { |
| return svn_repos__authz_read(authz_p, file, NULL, must_exist, |
| FALSE, pool); |
| } |