svn_error_t * svn_fs_hotcopy2(const char *src_path, const char *dst_path, svn_boolean_t clean, svn_boolean_t incremental, svn_cancel_func_t cancel_func, void *cancel_baton, apr_pool_t *scratch_pool) { fs_library_vtable_t *vtable; const char *src_fs_type; svn_fs_t *src_fs; svn_fs_t *dst_fs; const char *dst_fs_type; svn_node_kind_t dst_kind; if (strcmp(src_path, dst_path) == 0) return svn_error_create(SVN_ERR_INCORRECT_PARAMS, NULL, _("Hotcopy source and destination are equal")); SVN_ERR(svn_fs_type(&src_fs_type, src_path, scratch_pool)); SVN_ERR(get_library_vtable(&vtable, src_fs_type, scratch_pool)); src_fs = fs_new(NULL, scratch_pool); dst_fs = fs_new(NULL, scratch_pool); SVN_ERR(svn_io_check_path(dst_path, &dst_kind, scratch_pool)); if (dst_kind == svn_node_file) return svn_error_createf(SVN_ERR_NODE_UNEXPECTED_KIND, NULL, _("'%s' already exists and is a file"), svn_dirent_local_style(dst_path, scratch_pool)); if (dst_kind == svn_node_unknown) return svn_error_createf(SVN_ERR_NODE_UNEXPECTED_KIND, NULL, _("'%s' already exists and has an unknown " "node kind"), svn_dirent_local_style(dst_path, scratch_pool)); if (dst_kind == svn_node_dir) { svn_node_kind_t type_file_kind; SVN_ERR(svn_io_check_path(svn_dirent_join(dst_path, FS_TYPE_FILENAME, scratch_pool), &type_file_kind, scratch_pool)); if (type_file_kind != svn_node_none) { SVN_ERR(svn_fs_type(&dst_fs_type, dst_path, scratch_pool)); if (strcmp(src_fs_type, dst_fs_type) != 0) return svn_error_createf( SVN_ERR_ILLEGAL_TARGET, NULL, _("The filesystem type of the hotcopy source " "('%s') does not match the filesystem " "type of the hotcopy destination ('%s')"), src_fs_type, dst_fs_type); } } SVN_ERR(vtable->hotcopy(src_fs, dst_fs, src_path, dst_path, clean, incremental, cancel_func, cancel_baton, scratch_pool)); return svn_error_trace(write_fs_type(dst_path, src_fs_type, scratch_pool)); }
/* Fetch the library vtable for an existing FS. */ static svn_error_t * fs_library_vtable(fs_library_vtable_t **vtable, const char *path, apr_pool_t *pool) { const char *fs_type; SVN_ERR(svn_fs_type(&fs_type, path, pool)); /* Fetch the library vtable by name, now that we've chosen one. */ return svn_error_trace(get_library_vtable(vtable, fs_type, pool)); }
svn_error_t * svn_fs_hotcopy(const char *src_path, const char *dest_path, svn_boolean_t clean, apr_pool_t *pool) { fs_library_vtable_t *vtable; const char *fs_type; SVN_ERR(svn_fs_type(&fs_type, src_path, pool)); SVN_ERR(get_library_vtable(&vtable, fs_type, pool)); SVN_ERR(vtable->hotcopy(src_path, dest_path, clean, pool)); return svn_error_trace(write_fs_type(dest_path, fs_type, pool)); }
/* Return an error unless FS is an fsfs fs. */ static svn_error_t *is_fs_fsfs(svn_fs_t *fs, apr_pool_t *scratch_pool) { const char *actual, *expected, *path; path = svn_fs_path(fs, scratch_pool); expected = SVN_FS_TYPE_FSFS; SVN_ERR(svn_fs_type(&actual, path, scratch_pool)); if (strcmp(actual, expected) != 0) return svn_error_createf(SVN_ERR_FS_UNKNOWN_FS_TYPE, NULL, "Filesystem '%s' is not of type '%s'", svn_dirent_local_style(path, scratch_pool), actual); return SVN_NO_ERROR; }