Modified: subversion/branches/authzperf/subversion/bindings/swig/python/tests/repository.py URL: http://svn.apache.org/viewvc/subversion/branches/authzperf/subversion/bindings/swig/python/tests/repository.py?rev=1649205&r1=1649204&r2=1649205&view=diff ============================================================================== --- subversion/branches/authzperf/subversion/bindings/swig/python/tests/repository.py (original) +++ subversion/branches/authzperf/subversion/bindings/swig/python/tests/repository.py Sat Jan 3 14:00:41 2015 @@ -18,7 +18,7 @@ # under the License. # # -import unittest, setup_path +import unittest, setup_path, os, sys from sys import version_info # For Python version check if version_info[0] >= 3: # Python >=3.0 @@ -44,6 +44,42 @@ class ChangeReceiver(delta.Editor): self.textdeltas.append(textdelta) return textdelta_handler +class DumpStreamParser(repos.ParseFns3): + def __init__(self): + repos.ParseFns3.__init__(self) + self.ops = [] + def magic_header_record(self, version, pool=None): + self.ops.append(("magic-header", version)) + def uuid_record(self, uuid, pool=None): + self.ops.append(("uuid", uuid)) + def new_revision_record(self, headers, pool=None): + rev = int(headers[repos.DUMPFILE_REVISION_NUMBER]) + self.ops.append(("new-revision", rev)) + return rev + def close_revision(self, revision_baton): + self.ops.append(("close-revision", revision_baton)) + def new_node_record(self, headers, revision_baton, pool=None): + node = headers[repos.DUMPFILE_NODE_PATH] + self.ops.append(("new-node", revision_baton, node)) + return (revision_baton, node) + def close_node(self, node_baton): + self.ops.append(("close-node", node_baton[0], node_baton[1])) + def set_revision_property(self, revision_baton, name, value): + self.ops.append(("set-revision-prop", revision_baton, name, value)) + def set_node_property(self, node_baton, name, value): + self.ops.append(("set-node-prop", node_baton[0], node_baton[1], name, value)) + def remove_node_props(self, node_baton): + self.ops.append(("remove-node-props", node_baton[0], node_baton[1])) + def delete_node_property(self, node_baton, name): + self.ops.append(("delete-node-prop", node_baton[0], node_baton[1], name)) + def apply_textdelta(self, node_baton): + self.ops.append(("apply-textdelta", node_baton[0], node_baton[1])) + return None + def set_fulltext(self, node_baton): + self.ops.append(("set-fulltext", node_baton[0], node_baton[1])) + return None + + def _authz_callback(root, path, pool): "A dummy authz callback which always returns success." return 1 @@ -139,6 +175,62 @@ class SubversionRepositoryTestCase(unitt # svn_repos_t objects, so the following call segfaults #repos.dump_fs2(None, None, None, 0, self.rev, 0, 0, None) + def test_parse_fns3(self): + self.cancel_calls = 0 + def is_cancelled(): + self.cancel_calls += 1 + return None + dump_path = os.path.join(os.path.dirname(sys.argv[0]), + "trac/versioncontrol/tests/svnrepos.dump") + stream = open(dump_path) + dsp = DumpStreamParser() + ptr, baton = repos.make_parse_fns3(dsp) + repos.parse_dumpstream3(stream, ptr, baton, False, is_cancelled) + stream.close() + self.assertEqual(self.cancel_calls, 76) + expected_list = [ + ("magic-header", 2), + ('uuid', '92ea810a-adf3-0310-b540-bef912dcf5ba'), + ('new-revision', 0), + ('set-revision-prop', 0, 'svn:date', '2005-04-01T09:57:41.312767Z'), + ('close-revision', 0), + ('new-revision', 1), + ('set-revision-prop', 1, 'svn:log', 'Initial directory layout.'), + ('set-revision-prop', 1, 'svn:author', 'john'), + ('set-revision-prop', 1, 'svn:date', '2005-04-01T10:00:52.353248Z'), + ('new-node', 1, 'branches'), + ('remove-node-props', 1, 'branches'), + ('close-node', 1, 'branches'), + ('new-node', 1, 'tags'), + ('remove-node-props', 1, 'tags'), + ('close-node', 1, 'tags'), + ('new-node', 1, 'trunk'), + ('remove-node-props', 1, 'trunk'), + ('close-node', 1, 'trunk'), + ('close-revision', 1), + ('new-revision', 2), + ('set-revision-prop', 2, 'svn:log', 'Added README.'), + ('set-revision-prop', 2, 'svn:author', 'john'), + ('set-revision-prop', 2, 'svn:date', '2005-04-01T13:12:18.216267Z'), + ('new-node', 2, 'trunk/README.txt'), + ('remove-node-props', 2, 'trunk/README.txt'), + ('set-fulltext', 2, 'trunk/README.txt'), + ('close-node', 2, 'trunk/README.txt'), + ('close-revision', 2), ('new-revision', 3), + ('set-revision-prop', 3, 'svn:log', 'Fixed README.\n'), + ('set-revision-prop', 3, 'svn:author', 'kate'), + ('set-revision-prop', 3, 'svn:date', '2005-04-01T13:24:58.234643Z'), + ('new-node', 3, 'trunk/README.txt'), + ('remove-node-props', 3, 'trunk/README.txt'), + ('set-node-prop', 3, 'trunk/README.txt', 'svn:mime-type', 'text/plain'), + ('set-node-prop', 3, 'trunk/README.txt', 'svn:eol-style', 'native'), + ('set-fulltext', 3, 'trunk/README.txt'), + ('close-node', 3, 'trunk/README.txt'), ('close-revision', 3), + ] + # Compare only the first X nodes described in the expected list - otherwise + # the comparison list gets too long. + self.assertEqual(dsp.ops[:len(expected_list)], expected_list) + def test_get_logs(self): """Test scope of get_logs callbacks""" logs = [] @@ -177,6 +269,17 @@ class SubversionRepositoryTestCase(unitt set(["This is a test.\n", "A test.\n"])) self.assertEqual(len(editor.textdeltas), 2) + def test_unnamed_editor(self): + """Test editor object without reference from interpreter""" + # Check that the delta.Editor object has proper lifetime. Without + # increment of the refcount in make_baton, the object was destroyed + # immediately because the interpreter does not hold a reference to it. + this_root = fs.revision_root(self.fs, self.rev) + prev_root = fs.revision_root(self.fs, self.rev-1) + e_ptr, e_baton = delta.make_editor(ChangeReceiver(this_root, prev_root)) + repos.dir_delta(prev_root, '', '', this_root, '', e_ptr, e_baton, + _authz_callback, 1, 1, 0, 0) + def test_retrieve_and_change_rev_prop(self): """Test playing with revprops""" self.assertEqual(repos.fs_revision_prop(self.repos, self.rev, "svn:log",
Modified: subversion/branches/authzperf/subversion/bindings/swig/svn_client.i URL: http://svn.apache.org/viewvc/subversion/branches/authzperf/subversion/bindings/swig/svn_client.i?rev=1649205&r1=1649204&r2=1649205&view=diff ============================================================================== --- subversion/branches/authzperf/subversion/bindings/swig/svn_client.i (original) +++ subversion/branches/authzperf/subversion/bindings/swig/svn_client.i Sat Jan 3 14:00:41 2015 @@ -170,13 +170,6 @@ svn_swig_rb_get_commit_log_func) #endif -#ifdef SWIGRUBY -%callback_typemap(svn_cancel_func_t cancel_func, void *cancel_baton, - , - , - svn_swig_rb_cancel_func) -#endif - %callback_typemap(svn_client_blame_receiver_t receiver, void *receiver_baton, svn_swig_py_client_blame_receiver_func, svn_swig_pl_blame_func, Modified: subversion/branches/authzperf/subversion/bindings/swig/svn_repos.i URL: http://svn.apache.org/viewvc/subversion/branches/authzperf/subversion/bindings/swig/svn_repos.i?rev=1649205&r1=1649204&r2=1649205&view=diff ============================================================================== --- subversion/branches/authzperf/subversion/bindings/swig/svn_repos.i (original) +++ subversion/branches/authzperf/subversion/bindings/swig/svn_repos.i Sat Jan 3 14:00:41 2015 @@ -147,8 +147,18 @@ svn_error_t *svn_repos_dump_fs2(svn_repo %ignore svn_repos_dump_fs2; #endif +/* ----------------------------------------------------------------------- */ +#ifdef SWIGPYTHON +/* Make swig wrap this function for us, to allow making a vtable in python */ +void svn_swig_py_make_parse_fns3(const svn_repos_parse_fns3_t **parse_fns3, + void **parse_baton, + PyObject *py_parse_fns3, + apr_pool_t *pool); +#endif + %include svn_repos_h.swg #ifdef SWIGRUBY %define_close_related_methods(repos) #endif + Modified: subversion/branches/authzperf/subversion/include/mod_dav_svn.h URL: http://svn.apache.org/viewvc/subversion/branches/authzperf/subversion/include/mod_dav_svn.h?rev=1649205&r1=1649204&r2=1649205&view=diff ============================================================================== --- subversion/branches/authzperf/subversion/include/mod_dav_svn.h (original) +++ subversion/branches/authzperf/subversion/include/mod_dav_svn.h Sat Jan 3 14:00:41 2015 @@ -40,7 +40,7 @@ extern "C" { /** Given an apache request @a r, a @a uri, and a @a root_path to the svn location block, process @a uri and return many things, allocated in - @a r->pool: + @a pool: - @a cleaned_uri: The uri with duplicate and trailing slashes removed. @@ -74,7 +74,25 @@ extern "C" { - @a relative_path: /!svn/blah/13/A/B/alpha - @a repos_path: A/B/alpha - @a trailing_slash: FALSE + + NOTE: The returned dav_error will be also allocated in @a pool, not + in @a r->pool. + + @since New in 1.9 */ +AP_MODULE_DECLARE(dav_error *) dav_svn_split_uri2(request_rec *r, + const char *uri_to_split, + const char *root_path, + const char **cleaned_uri, + int *trailing_slash, + const char **repos_basename, + const char **relative_path, + const char **repos_path, + apr_pool_t *pool); + +/** + * Same as dav_svn_split_uri2() but allocates the result in @a r->pool. + */ AP_MODULE_DECLARE(dav_error *) dav_svn_split_uri(request_rec *r, const char *uri, const char *root_path, @@ -87,7 +105,22 @@ AP_MODULE_DECLARE(dav_error *) dav_svn_s /** * Given an apache request @a r and a @a root_path to the svn location - * block, set @a *repos_path to the path of the repository on disk. */ + * block, set @a *repos_path to the path of the repository on disk. + * Perform all allocations in @a pool. + * + * NOTE: The returned dav_error will be also allocated in @a pool, not + * in @a r->pool. + * + * @since New in 1.9 + */ +AP_MODULE_DECLARE(dav_error *) dav_svn_get_repos_path2(request_rec *r, + const char *root_path, + const char **repos_path, + apr_pool_t *pool); + +/** + * Same as dav_svn_get_repos_path2() but allocates the result in@a r->pool. + */ AP_MODULE_DECLARE(dav_error *) dav_svn_get_repos_path(request_rec *r, const char *root_path, const char **repos_path); Propchange: subversion/branches/authzperf/subversion/include/private/README ------------------------------------------------------------------------------ svn:eol-style = native Propchange: subversion/branches/authzperf/subversion/include/private/svn_cert.h ------------------------------------------------------------------------------ svn:eol-style = native Modified: subversion/branches/authzperf/subversion/include/private/svn_dep_compat.h URL: http://svn.apache.org/viewvc/subversion/branches/authzperf/subversion/include/private/svn_dep_compat.h?rev=1649205&r1=1649204&r2=1649205&view=diff ============================================================================== --- subversion/branches/authzperf/subversion/include/private/svn_dep_compat.h (original) +++ subversion/branches/authzperf/subversion/include/private/svn_dep_compat.h Sat Jan 3 14:00:41 2015 @@ -47,6 +47,19 @@ extern "C" { #endif /** + * We assume that 'char' is 8 bits wide. The critical interfaces are + * our repository formats and RA encodings. E.g. a 32 bit wide char may + * mess up UTF8 parsing, how we interpret size values etc. + * + * @since New in 1.9. + */ +#if defined(CHAR_BIT) \ + && !defined(SVN_ALLOW_NON_8_BIT_CHARS) \ + && (CHAR_BIT != 8) +#error char is not 8 bits and may break Subversion. Define SVN_ALLOW_NON_8_BIT_CHARS to skip this check. +#endif + +/** * Work around a platform dependency issue. apr_thread_rwlock_trywrlock() * will make APR_STATUS_IS_EBUSY() return TRUE if the lock could not be * acquired under Unix. Under Windows, this will not work. So, provide Modified: subversion/branches/authzperf/subversion/include/private/svn_mergeinfo_private.h URL: http://svn.apache.org/viewvc/subversion/branches/authzperf/subversion/include/private/svn_mergeinfo_private.h?rev=1649205&r1=1649204&r2=1649205&view=diff ============================================================================== --- subversion/branches/authzperf/subversion/include/private/svn_mergeinfo_private.h (original) +++ subversion/branches/authzperf/subversion/include/private/svn_mergeinfo_private.h Sat Jan 3 14:00:41 2015 @@ -65,6 +65,27 @@ svn_error_t * svn_rangelist__combine_adjacent_ranges(svn_rangelist_t *rangelist, apr_pool_t *scratch_pool); +/** Canonicalize the @a rangelist: sort the ranges, and combine adjacent or + * overlapping ranges into single ranges where possible. + * + * If overlapping ranges have different inheritability, return an error. + * + * Modify @a rangelist in place. Use @a scratch_pool for temporary + * allocations. + */ +svn_error_t * +svn_rangelist__canonicalize(svn_rangelist_t *rangelist, + apr_pool_t *scratch_pool); + +/** Canonicalize the revision range lists in the @a mergeinfo. + * + * Modify @a mergeinfo in place. Use @a scratch_pool for temporary + * allocations. + */ +svn_error_t * +svn_mergeinfo__canonicalize_ranges(svn_mergeinfo_t mergeinfo, + apr_pool_t *scratch_pool); + /* Set inheritability of all rangelists in MERGEINFO to INHERITABLE. If MERGEINFO is NULL do nothing. If a rangelist in MERGEINFO is NULL leave it alone. */ Modified: subversion/branches/authzperf/subversion/include/private/svn_opt_private.h URL: http://svn.apache.org/viewvc/subversion/branches/authzperf/subversion/include/private/svn_opt_private.h?rev=1649205&r1=1649204&r2=1649205&view=diff ============================================================================== --- subversion/branches/authzperf/subversion/include/private/svn_opt_private.h (original) +++ subversion/branches/authzperf/subversion/include/private/svn_opt_private.h Sat Jan 3 14:00:41 2015 @@ -46,10 +46,6 @@ extern "C" { * UTF8_TARGET need not be canonical. *TRUE_TARGET will not be canonical * unless UTF8_TARGET is. * - * It is an error if *TRUE_TARGET results in the empty string after the - * split, which happens in case UTF8_TARGET has a leading '@' character - * with no additional '@' characters to escape the first '@'. - * * Note that *PEG_REVISION will still contain the '@' symbol as the first * character if a peg revision was found. If a trailing '@' symbol was * used to escape other '@' characters in UTF8_TARGET, *PEG_REVISION will Modified: subversion/branches/authzperf/subversion/include/private/svn_wc_private.h URL: http://svn.apache.org/viewvc/subversion/branches/authzperf/subversion/include/private/svn_wc_private.h?rev=1649205&r1=1649204&r2=1649205&view=diff ============================================================================== --- subversion/branches/authzperf/subversion/include/private/svn_wc_private.h (original) +++ subversion/branches/authzperf/subversion/include/private/svn_wc_private.h Sat Jan 3 14:00:41 2015 @@ -621,7 +621,6 @@ svn_wc__node_get_base(svn_node_kind_t *k svn_wc_context_t *wc_ctx, const char *local_abspath, svn_boolean_t ignore_enoent, - svn_boolean_t show_hidden, apr_pool_t *result_pool, apr_pool_t *scratch_pool); Modified: subversion/branches/authzperf/subversion/include/svn_client.h URL: http://svn.apache.org/viewvc/subversion/branches/authzperf/subversion/include/svn_client.h?rev=1649205&r1=1649204&r2=1649205&view=diff ============================================================================== --- subversion/branches/authzperf/subversion/include/svn_client.h (original) +++ subversion/branches/authzperf/subversion/include/svn_client.h Sat Jan 3 14:00:41 2015 @@ -1081,20 +1081,15 @@ svn_client_create_context(svn_client_ctx /** @} end group: Client context management */ /** - * @name Authentication information file names - * - * Names of files that contain authentication information. - * - * These filenames are decided by libsvn_client, since this library - * implements all the auth-protocols; libsvn_wc does nothing but - * blindly store and retrieve these files from protected areas. - * - * @defgroup clnt_auth_filenames Client authentication file names - * @{ + * @deprecated Provided for backward compatibility. This constant was never + * used in released versions. */ #define SVN_CLIENT_AUTH_USERNAME "username" +/** + * @deprecated Provided for backward compatibility. This constant was never + * used in released versions. + */ #define SVN_CLIENT_AUTH_PASSWORD "password" -/** @} group end: Authentication information file names */ /** Client argument processing * @@ -1130,6 +1125,12 @@ svn_client_create_context(svn_client_ctx * error, and if this is the only type of error encountered, complete * the operation before returning the error(s). * + * Return an error if a target is just a peg specifier with no path, such as + * "@abc". Before v1.6.5 (r878062) this form was interpreted as a literal path; + * it is now ambiguous. The form "@abc@" should now be used to refer to the + * literal path "@abc" with no peg revision, or the form ".@abc" to refer to + * the empty path with peg revision "abc". + * * @since New in 1.7 */ svn_error_t * @@ -1144,6 +1145,9 @@ svn_client_args_to_target_array2(apr_arr * Similar to svn_client_args_to_target_array2() but with * @a keep_last_origpath_on_truepath_collision always set to FALSE. * + * @since Since 1.6.5, this returns an error if a path contains a peg + * specifier with no path before it, such as "@abc". + * * @deprecated Provided for backward compatibility with the 1.6 API. */ SVN_DEPRECATED Modified: subversion/branches/authzperf/subversion/include/svn_cmdline.h URL: http://svn.apache.org/viewvc/subversion/branches/authzperf/subversion/include/svn_cmdline.h?rev=1649205&r1=1649204&r2=1649205&view=diff ============================================================================== --- subversion/branches/authzperf/subversion/include/svn_cmdline.h (original) +++ subversion/branches/authzperf/subversion/include/svn_cmdline.h Sat Jan 3 14:00:41 2015 @@ -320,15 +320,58 @@ svn_cmdline_auth_plaintext_passphrase_pr * by the command line client. * * @a non_interactive, @a username, @a password, @a config_dir, - * @a no_auth_cache, and @a trust_server_cert are the values of the - * command line options of the corresponding names. + * and @a no_auth_cache are the values of the command line options + * of the corresponding names. * + * If @a non_interactive is @c TRUE, then the following parameters + * control whether an invalid SSL certificate will be accepted + * regardless of a specific verification failure: + * + * @a trust_server_cert_unknown_ca: If @c TRUE, accept certificates + * from unknown certificate authorities. + * + * @a trust_server_cert_cn_mismatch: If @c TRUE, accept certificates + * even if the Common Name attribute of the certificate differs from + * the hostname of the server. + * + * @a trust_server_cert_expired: If @c TRUE, accept certificates even + * if they are expired. + * + * @a trust_server_cert_not_yet_valid: If @c TRUE, accept certificates + * from the future. + * + * @a trust_server_cert_other_failure: If @c TRUE, accept certificates + * even if any other verification failure than the above occured. + * * @a cfg is the @c SVN_CONFIG_CATEGORY_CONFIG configuration, and * @a cancel_func and @a cancel_baton control the cancellation of the * prompting providers that are initialized. * * Use @a pool for all allocations. * + * @since New in 1.9. + */ +svn_error_t * +svn_cmdline_create_auth_baton2(svn_auth_baton_t **ab, + svn_boolean_t non_interactive, + const char *username, + const char *password, + const char *config_dir, + svn_boolean_t no_auth_cache, + svn_boolean_t trust_server_cert_unknown_ca, + svn_boolean_t trust_server_cert_cn_mismatch, + svn_boolean_t trust_server_cert_expired, + svn_boolean_t trust_server_cert_not_yet_valid, + svn_boolean_t trust_server_cert_other_failure, + svn_config_t *cfg, + svn_cancel_func_t cancel_func, + void *cancel_baton, + apr_pool_t *pool); + +/* Like svn_cmdline_create_auth_baton2, but with only one trust_server_cert + * option which corresponds to trust_server_cert_unknown_ca. + * + * @deprecated Provided for backward compatibility with the 1.8 API. * @since New in 1.6. */ svn_error_t * Modified: subversion/branches/authzperf/subversion/include/svn_delta.h URL: http://svn.apache.org/viewvc/subversion/branches/authzperf/subversion/include/svn_delta.h?rev=1649205&r1=1649204&r2=1649205&view=diff ============================================================================== --- subversion/branches/authzperf/subversion/include/svn_delta.h (original) +++ subversion/branches/authzperf/subversion/include/svn_delta.h Sat Jan 3 14:00:41 2015 @@ -249,6 +249,7 @@ svn_txdelta_compose_windows(const svn_tx * * @since New in 1.4 * + * @since Since 1.9, @a tbuf may be NULL if @a *tlen is 0. */ void svn_txdelta_apply_instructions(svn_txdelta_window_t *window, Modified: subversion/branches/authzperf/subversion/include/svn_error_codes.h URL: http://svn.apache.org/viewvc/subversion/branches/authzperf/subversion/include/svn_error_codes.h?rev=1649205&r1=1649204&r2=1649205&view=diff ============================================================================== --- subversion/branches/authzperf/subversion/include/svn_error_codes.h (original) +++ subversion/branches/authzperf/subversion/include/svn_error_codes.h Sat Jan 3 14:00:41 2015 @@ -817,17 +817,17 @@ SVN_ERROR_START "Malformed transaction ID string.") /** @since New in 1.9. */ - SVN_ERRDEF(SVN_ERR_FS_ITEM_INDEX_CORRUPTION, + SVN_ERRDEF(SVN_ERR_FS_INDEX_CORRUPTION, SVN_ERR_FS_CATEGORY_START + 54, "Corrupt index file.") /** @since New in 1.9. */ - SVN_ERRDEF(SVN_ERR_FS_ITEM_INDEX_REVISION, + SVN_ERRDEF(SVN_ERR_FS_INDEX_REVISION, SVN_ERR_FS_CATEGORY_START + 55, "Revision not covered by index.") /** @since New in 1.9. */ - SVN_ERRDEF(SVN_ERR_FS_ITEM_INDEX_OVERFLOW, + SVN_ERRDEF(SVN_ERR_FS_INDEX_OVERFLOW, SVN_ERR_FS_CATEGORY_START + 56, "Item index too large for this revision.") @@ -837,7 +837,7 @@ SVN_ERROR_START "Container index out of range.") /** @since New in 1.9. */ - SVN_ERRDEF(SVN_ERR_FS_ITEM_INDEX_INCONSISTENT, + SVN_ERRDEF(SVN_ERR_FS_INDEX_INCONSISTENT, SVN_ERR_FS_CATEGORY_START + 58, "Index files are inconsistent.") @@ -856,6 +856,16 @@ SVN_ERROR_START SVN_ERR_FS_CATEGORY_START + 61, "Container capacity exceeded.") + /** @since New in 1.9. */ + SVN_ERRDEF(SVN_ERR_FS_MALFORMED_NODEREV_ID, + SVN_ERR_FS_CATEGORY_START + 62, + "Malformed node revision ID string.") + + /** @since New in 1.9. */ + SVN_ERRDEF(SVN_ERR_FS_INVALID_GENERATION, + SVN_ERR_FS_CATEGORY_START + 63, + "Invalid generation number data.") + /* repos errors */ SVN_ERRDEF(SVN_ERR_REPOS_LOCKED, Modified: subversion/branches/authzperf/subversion/include/svn_fs.h URL: http://svn.apache.org/viewvc/subversion/branches/authzperf/subversion/include/svn_fs.h?rev=1649205&r1=1649204&r2=1649205&view=diff ============================================================================== --- subversion/branches/authzperf/subversion/include/svn_fs.h (original) +++ subversion/branches/authzperf/subversion/include/svn_fs.h Sat Jan 3 14:00:41 2015 @@ -116,6 +116,26 @@ typedef struct svn_fs_t svn_fs_t; */ #define SVN_FS_CONFIG_FSFS_BLOCK_READ "fsfs-block-read" +/** String with a decimal representation of the FSFS format shard size. + * Zero ("0") means that a repository with linear layout should be created. + * + * This option will only be used during the creation of new repositories + * and is otherwise ignored. + * + * @since New in 1.9. + */ +#define SVN_FS_CONFIG_FSFS_SHARD_SIZE "fsfs-shard-size" + +/** Enable / disable the FSFS format 7 logical addressing feature for a + * newly created repository. + * + * This option will only be used during the creation of new repositories + * and is otherwise ignored. + * + * @since New in 1.9. + */ +#define SVN_FS_CONFIG_FSFS_LOG_ADDRESSING "fsfs-log-addressing" + /* Note to maintainers: if you add further SVN_FS_CONFIG_FSFS_CACHE_* knobs, update fs_fs.c:verify_as_revision_before_current_plus_plus(). */ @@ -1420,6 +1440,11 @@ typedef enum svn_fs_path_change_kind_t * versions. Therefore, to preserve binary compatibility, users * should not directly allocate structures of this type. * + * @note The @c text_mod, @c prop_mod and @c mergeinfo_mod flags mean the + * text, properties and mergeinfo property (respectively) were "touched" + * by the commit API; this does not mean the new value is different from + * the old value. + * * @since New in 1.6. */ typedef struct svn_fs_path_change2_t { @@ -1429,10 +1454,23 @@ typedef struct svn_fs_path_change2_t /** kind of change */ svn_fs_path_change_kind_t change_kind; - /** were there text mods? */ + /** was the text touched? + * For node_kind=dir: always false. For node_kind=file: + * modify: true iff text touched. + * add (copy): true iff text touched. + * add (plain): always true. + * delete: always false. + * replace: as for the add/copy part of the replacement. + */ svn_boolean_t text_mod; - /** were there property mods? */ + /** were the properties touched? + * modify: true iff props touched. + * add (copy): true iff props touched. + * add (plain): true iff props touched. + * delete: always false. + * replace: as for the add/copy part of the replacement. + */ svn_boolean_t prop_mod; /** what node kind is the path? @@ -1445,7 +1483,12 @@ typedef struct svn_fs_path_change2_t svn_revnum_t copyfrom_rev; const char *copyfrom_path; - /** were there mergeinfo mods? + /** was the mergeinfo property touched? + * modify: } true iff svn:mergeinfo property add/del/mod + * add (copy): } and fs format supports this flag. + * add (plain): } + * delete: always false. + * replace: as for the add/copy part of the replacement. * (Note: Pre-1.9 repositories will report #svn_tristate_unknown.) * @since New in 1.9. */ svn_tristate_t mergeinfo_mod; @@ -2219,13 +2262,13 @@ typedef svn_error_t * * upon doing so. Use @a pool for allocations. * * This function is intended to support zero copy data processing. It may - * not be implemented for all data backends or not applicable for certain - * content. In that case, @a *success will always be @c FALSE. Also, this - * is a best-effort function which means that there is no guarantee that - * @a processor gets called at all for some content. + * not be implemented for all data backends or not be applicable for certain + * content. In those cases, @a *success will always be @c FALSE. Also, + * this is a best-effort function which means that there is no guarantee + * that @a processor gets called at all. * - * @note @a processor is expected to be relatively short function with - * at most O(content size) runtime. + * @note @a processor is expected to be a relatively simple function with + * a runtime of O(content size) or less. * * @since New in 1.8. */ @@ -3002,6 +3045,9 @@ typedef struct svn_fs_fsfs_info_t { * @note Zero (0) if (but not iff) the format does not support packing. */ svn_revnum_t min_unpacked_rev; + /* TRUE if logical addressing is enabled for this repository. + * FALSE if repository uses physical addressing. */ + svn_boolean_t log_addressing; /* ### TODO: information about fsfs.conf? rep-cache.db? write locks? */ /* If you add fields here, check whether you need to extend svn_fs_info() Modified: subversion/branches/authzperf/subversion/include/svn_io.h URL: http://svn.apache.org/viewvc/subversion/branches/authzperf/subversion/include/svn_io.h?rev=1649205&r1=1649204&r2=1649205&view=diff ============================================================================== --- subversion/branches/authzperf/subversion/include/svn_io.h (original) +++ subversion/branches/authzperf/subversion/include/svn_io.h Sat Jan 3 14:00:41 2015 @@ -1265,6 +1265,8 @@ svn_stream_read(svn_stream_t *stream, * of reads or a simple seek operation. If the stream implementation has * not provided a skip function, this will read from the stream and * discard the data. + * + * @since New in 1.7. */ svn_error_t * svn_stream_skip(svn_stream_t *stream, @@ -1534,6 +1536,10 @@ typedef svn_error_t * * If the only "access" the returned stream gets is to close it * then @a open_func will only be called if @a open_on_close is TRUE. * + * Allocate the returned stream in @a result_pool. Also arrange for + * @a result_pool to be passed as the @c result_pool parameter to + * @a open_func when it is called. + * * @since New in 1.8. */ svn_stream_t * Modified: subversion/branches/authzperf/subversion/include/svn_opt.h URL: http://svn.apache.org/viewvc/subversion/branches/authzperf/subversion/include/svn_opt.h?rev=1649205&r1=1649204&r2=1649205&view=diff ============================================================================== --- subversion/branches/authzperf/subversion/include/svn_opt.h (original) +++ subversion/branches/authzperf/subversion/include/svn_opt.h Sat Jan 3 14:00:41 2015 @@ -656,6 +656,10 @@ svn_opt_parse_all_args(apr_array_header_ * canonical form if @a path is in canonical form. * * @since New in 1.1. + * @since Since 1.6.5, this returns an error if @a path contains a peg + * specifier with no path before it, such as "@abc". + * @since Since 1.9.0, this no longer returns an error if @a path contains a peg + * specifier with no path before it, such as "@abc". */ svn_error_t * svn_opt_parse_path(svn_opt_revision_t *rev, Modified: subversion/branches/authzperf/subversion/include/svn_repos.h URL: http://svn.apache.org/viewvc/subversion/branches/authzperf/subversion/include/svn_repos.h?rev=1649205&r1=1649204&r2=1649205&view=diff ============================================================================== --- subversion/branches/authzperf/subversion/include/svn_repos.h (original) +++ subversion/branches/authzperf/subversion/include/svn_repos.h Sat Jan 3 14:00:41 2015 @@ -287,7 +287,14 @@ typedef enum svn_repos_notify_warning_t * * @since New in 1.9. */ - svn_repos_notify_warning_mergeinfo_collision + svn_repos_notify_warning_mergeinfo_collision, + + /** + * Detected invalid mergeinfo. + * + * @since New in 1.9. + */ + svn_repos_notify_warning_invalid_mergeinfo } svn_repos_notify_warning_t; /** @@ -3086,7 +3093,7 @@ svn_repos_load_fs5(svn_repos_t *repos, /** Similar to svn_repos_load_fs5(), but with @a ignore_dates * always passed as FALSE. * - * @since New in 1.9. + * @since New in 1.8. * @deprecated Provided for backward compatibility with the 1.8 API. */ SVN_DEPRECATED @@ -3336,17 +3343,56 @@ svn_repos_parse_dumpstream3(svn_stream_t * If @a use_history is set, then the parser will require relative * 'copyfrom' history to exist in the repository when it encounters * nodes that are added-with-history. + * ### What does 'require relative copyfrom history to exist' mean? + * ### What happens if @a use_history is false? + * + * If @a use_pre_commit_hook is set, call the repository's pre-commit + * hook before committing each loaded revision. + * + * If @a use_post_commit_hook is set, call the repository's + * post-commit hook after committing each loaded revision. * * If @a validate_props is set, then validate Subversion revision and * node properties (those in the svn: namespace) against established * rules for those things. * + * If @a ignore_dates is set, ignore any revision datestamps found in + * @a dumpstream, allowing the revisions created by the load process + * to be stamped as if they were newly created via the normal commit + * process. + * * If @a parent_dir is not NULL, then the parser will reparent all the * loaded nodes, from root to @a parent_dir. The directory @a parent_dir * must be an existing directory in the repository. * + * @since New in 1.9. + */ +svn_error_t * +svn_repos_get_fs_build_parser5(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_boolean_t use_pre_commit_hook, + svn_boolean_t use_post_commit_hook, + svn_boolean_t ignore_dates, + svn_repos_notify_func_t notify_func, + void *notify_baton, + apr_pool_t *pool); + +/** + * Similar to svn_repos_get_fs_build_parser5(), but with the + * @c use_pre_commit_hook, @c use_post_commit_hook and @c ignore_dates + * arguments all false. + * * @since New in 1.8. + * @deprecated Provided for backward compatibility with the 1.8 API. */ +SVN_DEPRECATED svn_error_t * svn_repos_get_fs_build_parser4(const svn_repos_parse_fns3_t **parser, void **parse_baton, Modified: subversion/branches/authzperf/subversion/include/svn_string.h URL: http://svn.apache.org/viewvc/subversion/branches/authzperf/subversion/include/svn_string.h?rev=1649205&r1=1649204&r2=1649205&view=diff ============================================================================== --- subversion/branches/authzperf/subversion/include/svn_string.h (original) +++ subversion/branches/authzperf/subversion/include/svn_string.h Sat Jan 3 14:00:41 2015 @@ -140,6 +140,8 @@ svn_string_create_empty(apr_pool_t *pool /** Create a new string copied from a generic string of bytes, @a bytes, of * length @a size bytes. @a bytes is NOT assumed to be null-terminated, but * the new string will be. + * + * @since Since 1.9, @a bytes can be NULL if @a size is zero. */ svn_string_t * svn_string_ncreate(const char *bytes, apr_size_t size, apr_pool_t *pool); @@ -205,6 +207,8 @@ svn_stringbuf_create(const char *cstring /** Create a new stringbuf copied from the generic string of bytes, @a bytes, * of length @a size bytes. @a bytes is NOT assumed to be null-terminated, * but the new stringbuf will be. + * + * @since Since 1.9, @a bytes can be NULL if @a size is zero. */ svn_stringbuf_t * svn_stringbuf_ncreate(const char *bytes, apr_size_t size, apr_pool_t *pool); @@ -313,6 +317,8 @@ svn_stringbuf_appendbyte(svn_stringbuf_t /** Append an array of bytes onto @a targetstr. * * reallocs if necessary. @a targetstr is affected, nothing else is. + * + * @since 1.9 @a bytes can be NULL if @a count is zero. */ void svn_stringbuf_appendbytes(svn_stringbuf_t *targetstr, @@ -355,6 +361,8 @@ svn_stringbuf_appendcstr(svn_stringbuf_t * @note The inserted string may be a sub-range if @a str. * * @since New in 1.8. + * + * @since Since 1.9, @a bytes can be NULL if @a count is zero. */ void svn_stringbuf_insert(svn_stringbuf_t *str, @@ -386,6 +394,8 @@ svn_stringbuf_remove(svn_stringbuf_t *st * @endcode * * @since New in 1.8. + * + * @since Since 1.9, @a bytes can be NULL if @a new_count is zero. */ void svn_stringbuf_replace(svn_stringbuf_t *str, Modified: subversion/branches/authzperf/subversion/include/svn_wc.h URL: http://svn.apache.org/viewvc/subversion/branches/authzperf/subversion/include/svn_wc.h?rev=1649205&r1=1649204&r2=1649205&view=diff ============================================================================== --- subversion/branches/authzperf/subversion/include/svn_wc.h (original) +++ subversion/branches/authzperf/subversion/include/svn_wc.h Sat Jan 3 14:00:41 2015 @@ -907,13 +907,15 @@ svn_wc_external_item_dup(const svn_wc_ex * * Allocate the table, keys, and values in @a pool. * - * Use @a parent_directory only in constructing error strings. + * @a defining_directory is the path or URL of the directory on which + * the svn:externals property corresponding to @a desc is set. + * @a defining_directory is only used when constructing error strings. * * @since New in 1.5. */ svn_error_t * svn_wc_parse_externals_description3(apr_array_header_t **externals_p, - const char *parent_directory, + const char *defining_directory, const char *desc, svn_boolean_t canonicalize_url, apr_pool_t *pool); @@ -5167,6 +5169,12 @@ svn_wc_committed_queue_create(apr_pool_t * ### seems to be not a set of changes but rather the new complete set of * ### props. And it's renamed to 'new_dav_cache' inside; why? * + * If @a is_committed is @c TRUE, the node will be processed as committed. This + * turns the node and its implied descendants as the new unmodified state at + * the new specified revision. Unless @a recurse is TRUE, changes on + * descendants are not committed as changes directly. In this case they should + * be queueud as their own changes. + * * If @a remove_lock is @c TRUE, any entryprops related to a repository * lock will be removed. * @@ -5204,7 +5212,25 @@ svn_wc_committed_queue_create(apr_pool_t * Temporary allocations will be performed in @a scratch_pool, and persistent * allocations will use the same pool as @a queue used when it was created. * + * @since New in 1.9. + */ +svn_error_t * +svn_wc_queue_committed4(svn_wc_committed_queue_t *queue, + svn_wc_context_t *wc_ctx, + const char *local_abspath, + svn_boolean_t recurse, + svn_boolean_t is_committed, + const apr_array_header_t *wcprop_changes, + svn_boolean_t remove_lock, + svn_boolean_t remove_changelist, + const svn_checksum_t *sha1_checksum, + apr_pool_t *scratch_pool); + +/** Similar to svn_wc_queue_committed4, but with is_committed always + * TRUE. + * * @since New in 1.7. + * @deprecated Provided for backwards compatibility with the 1.8 API. */ svn_error_t * svn_wc_queue_committed3(svn_wc_committed_queue_t *queue, @@ -7190,7 +7216,7 @@ svn_wc_merge_prop_diffs(svn_wc_notify_st * the copy/move source (even if the copy-/move-here replaces a locally * deleted file). * - * If @a local_abspath refers to an unversioned or non-existing path, return + * If @a local_abspath refers to an unversioned or non-existent path, return * @c SVN_ERR_WC_PATH_NOT_FOUND. Use @a wc_ctx to access the working copy. * @a contents may not be @c NULL (unlike @a *contents). * @@ -8175,7 +8201,17 @@ typedef svn_error_t *(*svn_changelist_re /** - * ### TODO: Doc string, please. + * Beginning at @a local_abspath, crawl to @a depth to discover every path in + * or under @a local_abspath which belongs to one of the changelists in @a + * changelist_filter (an array of <tt>const char *</tt> changelist names). + * If @a changelist_filter is @c NULL, discover paths with any changelist. + * Call @a callback_func (with @a callback_baton) each time a + * changelist-having path is discovered. + * + * @a local_abspath is a local WC path. + * + * If @a cancel_func is not @c NULL, invoke it passing @a cancel_baton + * during the recursive walk. * * @since New in 1.7. */ Modified: subversion/branches/authzperf/subversion/libsvn_auth_gnome_keyring/gnome_keyring.c URL: http://svn.apache.org/viewvc/subversion/branches/authzperf/subversion/libsvn_auth_gnome_keyring/gnome_keyring.c?rev=1649205&r1=1649204&r2=1649205&view=diff ============================================================================== --- subversion/branches/authzperf/subversion/libsvn_auth_gnome_keyring/gnome_keyring.c (original) +++ subversion/branches/authzperf/subversion/libsvn_auth_gnome_keyring/gnome_keyring.c Sat Jan 3 14:00:41 2015 @@ -49,120 +49,19 @@ /*-----------------------------------------------------------------------*/ -struct gnome_keyring_baton -{ - const char *keyring_name; - GnomeKeyringInfo *info; - GMainLoop *loop; -}; - - -/* Callback function to destroy gnome_keyring_baton. */ -static void -callback_destroy_data_keyring(void *data) -{ - struct gnome_keyring_baton *key_info = data; - - if (data == NULL) - return; - - free((void*)key_info->keyring_name); - key_info->keyring_name = NULL; - - if (key_info->info) - { - gnome_keyring_info_free(key_info->info); - key_info->info = NULL; - } - - return; -} - - -/* Callback function to complete the keyring operation. */ -static void -callback_done(GnomeKeyringResult result, - gpointer data) -{ - struct gnome_keyring_baton *key_info = data; - - g_main_loop_quit(key_info->loop); - return; -} - - -/* Callback function to get the keyring info. */ -static void -callback_get_info_keyring(GnomeKeyringResult result, - GnomeKeyringInfo *info, - void *data) -{ - struct gnome_keyring_baton *key_info = data; - - if (result == GNOME_KEYRING_RESULT_OK && info != NULL) - { - key_info->info = gnome_keyring_info_copy(info); - } - else - { - if (key_info->info != NULL) - gnome_keyring_info_free(key_info->info); - - key_info->info = NULL; - } - - g_main_loop_quit(key_info->loop); - - return; -} - - -/* Callback function to get the default keyring string name. */ -static void -callback_default_keyring(GnomeKeyringResult result, - const char *string, - void *data) -{ - struct gnome_keyring_baton *key_info = data; - - if (result == GNOME_KEYRING_RESULT_OK && string != NULL) - { - key_info->keyring_name = strdup(string); - } - else - { - free((void*)key_info->keyring_name); - key_info->keyring_name = NULL; - } - - g_main_loop_quit(key_info->loop); - - return; -} - /* Returns the default keyring name, allocated in RESULT_POOL. */ static char* get_default_keyring_name(apr_pool_t *result_pool) { - char *def = NULL; - struct gnome_keyring_baton key_info; - - key_info.info = NULL; - key_info.keyring_name = NULL; + char *name, *def; + GnomeKeyringResult gkr; - /* Finds default keyring. */ - key_info.loop = g_main_loop_new(NULL, FALSE); - gnome_keyring_get_default_keyring(callback_default_keyring, &key_info, NULL); - g_main_loop_run(key_info.loop); - - if (key_info.keyring_name == NULL) - { - callback_destroy_data_keyring(&key_info); - return NULL; - } + gkr = gnome_keyring_get_default_keyring_sync(&name); + if (gkr != GNOME_KEYRING_RESULT_OK) + return NULL; - def = apr_pstrdup(result_pool, key_info.keyring_name); - callback_destroy_data_keyring(&key_info); + def = apr_pstrdup(result_pool, name); + g_free(name); return def; } @@ -171,28 +70,22 @@ get_default_keyring_name(apr_pool_t *res static svn_boolean_t check_keyring_is_locked(const char *keyring_name) { - struct gnome_keyring_baton key_info; + GnomeKeyringInfo *info; + svn_boolean_t locked; + GnomeKeyringResult gkr; - key_info.info = NULL; - key_info.keyring_name = NULL; + gkr = gnome_keyring_get_info_sync(keyring_name, &info); + if (gkr != GNOME_KEYRING_RESULT_OK) + return FALSE; - /* Get details about the default keyring. */ - key_info.loop = g_main_loop_new(NULL, FALSE); - gnome_keyring_get_info(keyring_name, callback_get_info_keyring, &key_info, - NULL); - g_main_loop_run(key_info.loop); - - if (key_info.info == NULL) - { - callback_destroy_data_keyring(&key_info); - return FALSE; - } - - /* Check if keyring is locked. */ - if (gnome_keyring_info_get_is_locked(key_info.info)) - return TRUE; + if (gnome_keyring_info_get_is_locked(info)) + locked = TRUE; else - return FALSE; + locked = FALSE; + + gnome_keyring_info_free(info); + + return locked; } /* Unlock the KEYRING_NAME with the KEYRING_PASSWORD. If KEYRING was @@ -202,34 +95,19 @@ unlock_gnome_keyring(const char *keyring const char *keyring_password, apr_pool_t *pool) { - struct gnome_keyring_baton key_info; + GnomeKeyringInfo *info; + GnomeKeyringResult gkr; - key_info.info = NULL; - key_info.keyring_name = NULL; + gkr = gnome_keyring_get_info_sync(keyring_name, &info); + if (gkr != GNOME_KEYRING_RESULT_OK) + return FALSE; - /* Get details about the default keyring. */ - key_info.loop = g_main_loop_new(NULL, FALSE); - gnome_keyring_get_info(keyring_name, callback_get_info_keyring, - &key_info, NULL); - g_main_loop_run(key_info.loop); - - if (key_info.info == NULL) - { - callback_destroy_data_keyring(&key_info); - return FALSE; - } - else - { - key_info.loop = g_main_loop_new(NULL, FALSE); - gnome_keyring_unlock(keyring_name, keyring_password, - callback_done, &key_info, NULL); - g_main_loop_run(key_info.loop); - } - callback_destroy_data_keyring(&key_info); - if (check_keyring_is_locked(keyring_name)) + gkr = gnome_keyring_unlock_sync(keyring_name, keyring_password); + gnome_keyring_info_free(info); + if (gkr != GNOME_KEYRING_RESULT_OK) return FALSE; - return TRUE; + return check_keyring_is_locked(keyring_name); } Modified: subversion/branches/authzperf/subversion/libsvn_client/checkout.c URL: http://svn.apache.org/viewvc/subversion/branches/authzperf/subversion/libsvn_client/checkout.c?rev=1649205&r1=1649204&r2=1649205&view=diff ============================================================================== --- subversion/branches/authzperf/subversion/libsvn_client/checkout.c (original) +++ subversion/branches/authzperf/subversion/libsvn_client/checkout.c Sat Jan 3 14:00:41 2015 @@ -67,6 +67,7 @@ initialize_area(const char *local_abspat svn_error_t * svn_client__checkout_internal(svn_revnum_t *result_rev, + svn_boolean_t *timestamp_sleep, const char *url, const char *local_abspath, const svn_opt_revision_t *peg_revision, @@ -74,16 +75,16 @@ svn_client__checkout_internal(svn_revnum svn_depth_t depth, svn_boolean_t ignore_externals, svn_boolean_t allow_unver_obstructions, - svn_boolean_t *timestamp_sleep, + svn_ra_session_t *ra_session, svn_client_ctx_t *ctx, - apr_pool_t *pool) + apr_pool_t *scratch_pool) { svn_node_kind_t kind; svn_client__pathrev_t *pathrev; /* Sanity check. Without these, the checkout is meaningless. */ SVN_ERR_ASSERT(local_abspath != NULL); - SVN_ERR_ASSERT(svn_uri_is_canonical(url, pool)); + SVN_ERR_ASSERT(svn_uri_is_canonical(url, scratch_pool)); SVN_ERR_ASSERT(svn_dirent_is_absolute(local_abspath)); /* Fulfill the docstring promise of svn_client_checkout: */ @@ -92,21 +93,38 @@ svn_client__checkout_internal(svn_revnum && (revision->kind != svn_opt_revision_head)) return svn_error_create(SVN_ERR_CLIENT_BAD_REVISION, NULL, NULL); - { - apr_pool_t *session_pool = svn_pool_create(pool); - svn_ra_session_t *ra_session; - - /* Get the RA connection. */ - SVN_ERR(svn_client__ra_session_from_path2(&ra_session, &pathrev, - url, NULL, peg_revision, - revision, ctx, session_pool)); - - pathrev = svn_client__pathrev_dup(pathrev, pool); - SVN_ERR(svn_ra_check_path(ra_session, "", pathrev->rev, &kind, - session_pool)); + /* Get the RA connection, if needed. */ + if (ra_session) + { + svn_error_t *err = svn_ra_reparent(ra_session, url, scratch_pool); - svn_pool_destroy(session_pool); - } + if (err) + { + if (err->apr_err == SVN_ERR_RA_ILLEGAL_URL) + { + svn_error_clear(err); + ra_session = NULL; + } + else + return svn_error_trace(err); + } + else + { + SVN_ERR(svn_client__resolve_rev_and_url(&pathrev, + ra_session, url, + peg_revision, revision, + ctx, scratch_pool)); + } + } + + if (!ra_session) + { + SVN_ERR(svn_client__ra_session_from_path2(&ra_session, &pathrev, + url, NULL, peg_revision, + revision, ctx, scratch_pool)); + } + + SVN_ERR(svn_ra_check_path(ra_session, "", pathrev->rev, &kind, scratch_pool)); if (kind == svn_node_none) return svn_error_createf(SVN_ERR_RA_ILLEGAL_URL, NULL, @@ -116,31 +134,35 @@ svn_client__checkout_internal(svn_revnum (SVN_ERR_UNSUPPORTED_FEATURE , NULL, _("URL '%s' refers to a file, not a directory"), pathrev->url); - SVN_ERR(svn_io_check_path(local_abspath, &kind, pool)); + SVN_ERR(svn_io_check_path(local_abspath, &kind, scratch_pool)); if (kind == svn_node_none) { /* Bootstrap: create an incomplete working-copy root dir. Its entries file should only have an entry for THIS_DIR with a URL, revnum, and an 'incomplete' flag. */ - SVN_ERR(svn_io_make_dir_recursively(local_abspath, pool)); - SVN_ERR(initialize_area(local_abspath, pathrev, depth, ctx, pool)); + SVN_ERR(svn_io_make_dir_recursively(local_abspath, scratch_pool)); + SVN_ERR(initialize_area(local_abspath, pathrev, depth, ctx, + scratch_pool)); } else if (kind == svn_node_dir) { int wc_format; const char *entry_url; - SVN_ERR(svn_wc_check_wc2(&wc_format, ctx->wc_ctx, local_abspath, pool)); + SVN_ERR(svn_wc_check_wc2(&wc_format, ctx->wc_ctx, local_abspath, + scratch_pool)); + if (! wc_format) { - SVN_ERR(initialize_area(local_abspath, pathrev, depth, ctx, pool)); + SVN_ERR(initialize_area(local_abspath, pathrev, depth, ctx, + scratch_pool)); } else { /* Get PATH's URL. */ SVN_ERR(svn_wc__node_get_url(&entry_url, ctx->wc_ctx, local_abspath, - pool, pool)); + scratch_pool, scratch_pool)); /* If PATH's existing URL matches the incoming one, then just update. This allows 'svn co' to restart an @@ -150,24 +172,25 @@ svn_client__checkout_internal(svn_revnum SVN_ERR_WC_OBSTRUCTED_UPDATE, NULL, _("'%s' is already a working copy for a" " different URL"), - svn_dirent_local_style(local_abspath, pool)); + svn_dirent_local_style(local_abspath, scratch_pool)); } } else { return svn_error_createf(SVN_ERR_WC_NODE_KIND_CHANGE, NULL, _("'%s' already exists and is not a directory"), - svn_dirent_local_style(local_abspath, pool)); + svn_dirent_local_style(local_abspath, + scratch_pool)); } /* Have update fix the incompleteness. */ - SVN_ERR(svn_client__update_internal(result_rev, local_abspath, - revision, depth, TRUE, + SVN_ERR(svn_client__update_internal(result_rev, timestamp_sleep, + local_abspath, revision, depth, TRUE, ignore_externals, allow_unver_obstructions, TRUE /* adds_as_modification */, - FALSE, FALSE, - timestamp_sleep, ctx, pool)); + FALSE, FALSE, ra_session, + ctx, scratch_pool)); return SVN_NO_ERROR; } @@ -190,10 +213,12 @@ svn_client_checkout3(svn_revnum_t *resul SVN_ERR(svn_dirent_get_absolute(&local_abspath, path, pool)); - err = svn_client__checkout_internal(result_rev, URL, local_abspath, + err = svn_client__checkout_internal(result_rev, &sleep_here, + URL, local_abspath, peg_revision, revision, depth, ignore_externals, - allow_unver_obstructions, &sleep_here, + allow_unver_obstructions, + NULL /* ra_session */, ctx, pool); if (sleep_here) svn_io_sleep_for_timestamps(local_abspath, pool); Modified: subversion/branches/authzperf/subversion/libsvn_client/cleanup.c URL: http://svn.apache.org/viewvc/subversion/branches/authzperf/subversion/libsvn_client/cleanup.c?rev=1649205&r1=1649204&r2=1649205&view=diff ============================================================================== --- subversion/branches/authzperf/subversion/libsvn_client/cleanup.c (original) +++ subversion/branches/authzperf/subversion/libsvn_client/cleanup.c Sat Jan 3 14:00:41 2015 @@ -148,8 +148,8 @@ cleanup_status_walk(void *baton, notify = svn_wc_create_notify(local_abspath, svn_wc_notify_cleanup_external, scratch_pool); - (*b->ctx->notify_func2)(b->ctx->notify_baton2, notify, - scratch_pool); + b->ctx->notify_func2(b->ctx->notify_baton2, notify, + scratch_pool); } err = do_cleanup(local_abspath, @@ -208,7 +208,7 @@ cleanup_status_walk(void *baton, notify = svn_wc_create_notify(local_abspath, svn_wc_notify_delete, scratch_pool); notify->kind = kind_on_disk; - (*b->ctx->notify_func2)(b->ctx->notify_baton2, notify, scratch_pool); + b->ctx->notify_func2(b->ctx->notify_baton2, notify, scratch_pool); } return SVN_NO_ERROR; Modified: subversion/branches/authzperf/subversion/libsvn_client/client.h URL: http://svn.apache.org/viewvc/subversion/branches/authzperf/subversion/libsvn_client/client.h?rev=1649205&r1=1649204&r2=1649205&view=diff ============================================================================== --- subversion/branches/authzperf/subversion/libsvn_client/client.h (original) +++ subversion/branches/authzperf/subversion/libsvn_client/client.h Sat Jan 3 14:00:41 2015 @@ -523,10 +523,14 @@ svn_client__make_local_parents(const cha (with depth=empty) any parent directories of the requested update target which are missing from the working copy. + If RA_SESSION is NOT NULL, it may be used to avoid creating a new + session. The session may point to a different URL after returning. + NOTE: You may not specify both INNERUPDATE and MAKE_PARENTS as true. */ svn_error_t * svn_client__update_internal(svn_revnum_t *result_rev, + svn_boolean_t *timestamp_sleep, const char *local_abspath, const svn_opt_revision_t *revision, svn_depth_t depth, @@ -536,7 +540,7 @@ svn_client__update_internal(svn_revnum_t svn_boolean_t adds_as_modification, svn_boolean_t make_parents, svn_boolean_t innerupdate, - svn_boolean_t *timestamp_sleep, + svn_ra_session_t *ra_session, svn_client_ctx_t *ctx, apr_pool_t *pool); @@ -552,11 +556,6 @@ svn_client__update_internal(svn_revnum_t DEPTH must be a definite depth, not (e.g.) svn_depth_unknown. - RA_CACHE is a pointer to a cache of information for the URL at - REVISION based on the PEG_REVISION. Any information not in - *RA_CACHE is retrieved by a round-trip to the repository. RA_CACHE - may be NULL which indicates that no cache information is available. - If IGNORE_EXTERNALS is true, do no externals processing. Set *TIMESTAMP_SLEEP to TRUE if a sleep is required; otherwise do not @@ -567,9 +566,13 @@ svn_client__update_internal(svn_revnum_t unversioned children of LOCAL_ABSPATH that obstruct items added from the repos are tolerated; if FALSE, these obstructions cause the checkout to fail. + + If RA_SESSION is NOT NULL, it may be used to avoid creating a new + session. The session may point to a different URL after returning. */ svn_error_t * svn_client__checkout_internal(svn_revnum_t *result_rev, + svn_boolean_t *timestamp_sleep, const char *URL, const char *local_abspath, const svn_opt_revision_t *peg_revision, @@ -577,7 +580,7 @@ svn_client__checkout_internal(svn_revnum svn_depth_t depth, svn_boolean_t ignore_externals, svn_boolean_t allow_unver_obstructions, - svn_boolean_t *timestamp_sleep, + svn_ra_session_t *ra_session, svn_client_ctx_t *ctx, apr_pool_t *pool); @@ -1010,6 +1013,9 @@ svn_client__do_commit(const char *base_u change *TIMESTAMP_SLEEP. The output will be valid even if the function returns an error. + If RA_SESSION is NOT NULL, it may be used to avoid creating a new + session. The session may point to a different URL after returning. + Use POOL for temporary allocation. */ svn_error_t * svn_client__handle_externals(apr_hash_t *externals_new, @@ -1018,6 +1024,7 @@ svn_client__handle_externals(apr_hash_t const char *target_abspath, svn_depth_t requested_depth, svn_boolean_t *timestamp_sleep, + svn_ra_session_t *ra_session, svn_client_ctx_t *ctx, apr_pool_t *pool); Modified: subversion/branches/authzperf/subversion/libsvn_client/cmdline.c URL: http://svn.apache.org/viewvc/subversion/branches/authzperf/subversion/libsvn_client/cmdline.c?rev=1649205&r1=1649204&r2=1649205&view=diff ============================================================================== --- subversion/branches/authzperf/subversion/libsvn_client/cmdline.c (original) +++ subversion/branches/authzperf/subversion/libsvn_client/cmdline.c Sat Jan 3 14:00:41 2015 @@ -200,6 +200,15 @@ svn_client_args_to_target_array2(apr_arr SVN_ERR(svn_opt__split_arg_at_peg_revision(&true_target, &peg_rev, utf8_target, pool)); + /* Reject the form "@abc", a peg specifier with no path. */ + if (true_target[0] == '\0' && peg_rev[0] != '\0') + { + return svn_error_createf(SVN_ERR_BAD_FILENAME, NULL, + _("'%s' is just a peg revision. " + "Maybe try '%s@' instead?"), + utf8_target, utf8_target); + } + /* URLs and wc-paths get treated differently. */ if (svn_path_is_url(true_target)) { Modified: subversion/branches/authzperf/subversion/libsvn_client/commit.c URL: http://svn.apache.org/viewvc/subversion/branches/authzperf/subversion/libsvn_client/commit.c?rev=1649205&r1=1649204&r2=1649205&view=diff ============================================================================== --- subversion/branches/authzperf/subversion/libsvn_client/commit.c (original) +++ subversion/branches/authzperf/subversion/libsvn_client/commit.c Sat Jan 3 14:00:41 2015 @@ -250,39 +250,18 @@ post_process_commit_item(svn_wc_committe remove_lock = TRUE; return svn_error_trace( - svn_wc_queue_committed3(queue, wc_ctx, item->path, + svn_wc_queue_committed4(queue, wc_ctx, item->path, loop_recurse, + 0 != (item->state_flags & + (SVN_CLIENT_COMMIT_ITEM_ADD + | SVN_CLIENT_COMMIT_ITEM_DELETE + | SVN_CLIENT_COMMIT_ITEM_TEXT_MODS + | SVN_CLIENT_COMMIT_ITEM_PROP_MODS)), item->incoming_prop_changes, remove_lock, !keep_changelists, sha1_checksum, scratch_pool)); } -/* Do similar handling as post_process_commit_item() but for items that - * are commit items, but aren't actual changes. Most importantly - * remove lock tokens. */ -static svn_error_t * -post_process_no_commit_item(const svn_client_commit_item3_t *item, - svn_wc_context_t *wc_ctx, - svn_boolean_t keep_changelists, - svn_boolean_t keep_locks, - apr_pool_t *scratch_pool) -{ - if ((item->state_flags & SVN_CLIENT_COMMIT_ITEM_LOCK_TOKEN) - && !keep_locks) - { - SVN_ERR(svn_wc_remove_lock2(wc_ctx, item->path, scratch_pool)); - } - - if (!keep_changelists) - SVN_ERR(svn_wc_set_changelist2(wc_ctx, item->path, NULL, - svn_depth_empty, NULL, - NULL, NULL, - NULL, NULL, - scratch_pool)); - - return SVN_NO_ERROR; -} - /* Given a list of committables described by their common base abspath BASE_ABSPATH and a list of relative dirents TARGET_RELPATHS determine which absolute paths must be locked to commit all these targets and @@ -943,11 +922,6 @@ svn_client_commit6(const apr_array_heade svn_client_commit_item3_t *item = APR_ARRAY_IDX(commit_items, i, svn_client_commit_item3_t *); - if (! (item->state_flags & ~ SVN_CLIENT_COMMIT_ITEM_LOCK_TOKEN)) - { - continue; /* Nothing to post process via the queue */ - } - svn_pool_clear(iterpool); bump_err = post_process_commit_item( queue, item, ctx->wc_ctx, @@ -969,23 +943,6 @@ svn_client_commit6(const apr_array_heade if (bump_err) goto cleanup; - - for (i = 0; i < commit_items->nelts; i++) - { - svn_client_commit_item3_t *item - = APR_ARRAY_IDX(commit_items, i, svn_client_commit_item3_t *); - - if (item->state_flags & ~ SVN_CLIENT_COMMIT_ITEM_LOCK_TOKEN) - continue; /* Already processed via the queue */ - - svn_pool_clear(iterpool); - bump_err = post_process_no_commit_item( - item, ctx->wc_ctx, - keep_changelists, keep_locks, - iterpool); - if (bump_err) - goto cleanup; - } } cleanup: Modified: subversion/branches/authzperf/subversion/libsvn_client/commit_util.c URL: http://svn.apache.org/viewvc/subversion/branches/authzperf/subversion/libsvn_client/commit_util.c?rev=1649205&r1=1649204&r2=1649205&view=diff ============================================================================== --- subversion/branches/authzperf/subversion/libsvn_client/commit_util.c (original) +++ subversion/branches/authzperf/subversion/libsvn_client/commit_util.c Sat Jan 3 14:00:41 2015 @@ -779,7 +779,6 @@ harvest_status_callback(void *status_bat wc_ctx, svn_dirent_dirname(local_abspath, scratch_pool), FALSE /* ignore_enoent */, - FALSE /* show_hidden */, scratch_pool, scratch_pool)); if (copy_mode_root || status->switched || node_rev != dir_rev) @@ -1650,7 +1649,7 @@ do_item_commit(void **dir_baton, { notify->kind = item->kind; notify->path_prefix = icb->notify_path_prefix; - (*ctx->notify_func2)(ctx->notify_baton2, notify, pool); + ctx->notify_func2(ctx->notify_baton2, notify, pool); } } Modified: subversion/branches/authzperf/subversion/libsvn_client/copy.c URL: http://svn.apache.org/viewvc/subversion/branches/authzperf/subversion/libsvn_client/copy.c?rev=1649205&r1=1649204&r2=1649205&view=diff ============================================================================== --- subversion/branches/authzperf/subversion/libsvn_client/copy.c (original) +++ subversion/branches/authzperf/subversion/libsvn_client/copy.c Sat Jan 3 14:00:41 2015 @@ -1058,8 +1058,13 @@ repos_to_repos_copy(const apr_array_head SVN_ERR(svn_ra_check_path(ra_session, dst_rel, SVN_INVALID_REVNUM, &dst_kind, pool)); if (dst_kind != svn_node_none) - return svn_error_createf(SVN_ERR_FS_ALREADY_EXISTS, NULL, - _("Path '%s' already exists"), dst_rel); + { + const char *path = svn_uri_skip_ancestor(repos_root, + pair->dst_abspath_or_url, + pool); + return svn_error_createf(SVN_ERR_FS_ALREADY_EXISTS, NULL, + _("Path '/%s' already exists"), path); + } /* More info for our INFO structure. */ info->src_path = src_rel; @@ -1101,12 +1106,15 @@ repos_to_repos_copy(const apr_array_head item = svn_client_commit_item3_create(pool); item->url = svn_path_url_add_component2(top_url, info->dst_path, pool); - item->state_flags = SVN_CLIENT_COMMIT_ITEM_ADD; + item->state_flags = SVN_CLIENT_COMMIT_ITEM_ADD + | SVN_CLIENT_COMMIT_ITEM_IS_COPY; + item->copyfrom_url = info->src_url; + item->copyfrom_rev = info->src_revnum; APR_ARRAY_PUSH(commit_items, svn_client_commit_item3_t *) = item; if (is_move && (! info->resurrection)) { - item = apr_pcalloc(pool, sizeof(*item)); + item = svn_client_commit_item3_create(pool); item->url = svn_path_url_add_component2(top_url, info->src_path, pool); item->state_flags = SVN_CLIENT_COMMIT_ITEM_DELETE; @@ -1609,7 +1617,6 @@ repos_to_wc_copy_single(svn_boolean_t *t { if (same_repositories) { - svn_boolean_t sleep_needed = FALSE; const char *tmpdir_abspath, *tmp_abspath; /* Find a temporary location in which to check out the copy source. */ @@ -1638,14 +1645,14 @@ repos_to_wc_copy_single(svn_boolean_t *t ctx->notify_func2 = notification_adjust_func; ctx->notify_baton2 = &nb; - err = svn_client__checkout_internal(&pair->src_revnum, + err = svn_client__checkout_internal(&pair->src_revnum, timestamp_sleep, pair->src_original, tmp_abspath, &pair->src_peg_revision, &pair->src_op_revision, svn_depth_infinity, ignore_externals, FALSE, - &sleep_needed, ctx, pool); + ra_session, ctx, pool); ctx->notify_func2 = old_notify_func2; ctx->notify_baton2 = old_notify_baton2; @@ -1738,7 +1745,7 @@ repos_to_wc_copy_single(svn_boolean_t *t svn_wc_notify_t *notify = svn_wc_create_notify( dst_abspath, svn_wc_notify_add, pool); notify->kind = pair->src_kind; - (*ctx->notify_func2)(ctx->notify_baton2, notify, pool); + ctx->notify_func2(ctx->notify_baton2, notify, pool); } return SVN_NO_ERROR; Modified: subversion/branches/authzperf/subversion/libsvn_client/diff.c URL: http://svn.apache.org/viewvc/subversion/branches/authzperf/subversion/libsvn_client/diff.c?rev=1649205&r1=1649204&r2=1649205&view=diff ============================================================================== --- subversion/branches/authzperf/subversion/libsvn_client/diff.c (original) +++ subversion/branches/authzperf/subversion/libsvn_client/diff.c Sat Jan 3 14:00:41 2015 @@ -154,9 +154,6 @@ adjust_paths_for_diff_labels(const char new_path = "."; else return MAKE_ERR_BAD_RELATIVE_PATH(new_path, relative_to_dir); - - child_path = svn_dirent_is_child(relative_to_dir, new_path1, - result_pool); } { Modified: subversion/branches/authzperf/subversion/libsvn_client/diff_local.c URL: http://svn.apache.org/viewvc/subversion/branches/authzperf/subversion/libsvn_client/diff_local.c?rev=1649205&r1=1649204&r2=1649205&view=diff ============================================================================== --- subversion/branches/authzperf/subversion/libsvn_client/diff_local.c (original) +++ subversion/branches/authzperf/subversion/libsvn_client/diff_local.c Sat Jan 3 14:00:41 2015 @@ -42,6 +42,7 @@ #include "svn_pools.h" #include "svn_props.h" #include "svn_sorts.h" +#include "svn_subst.h" #include "client.h" #include "private/svn_sorts_private.h" @@ -291,6 +292,68 @@ inner_dir_diff(const char *left_abspath, return SVN_NO_ERROR; } + +/* Translates *LEFT_ABSPATH to a temporary file if PROPS specify that the + file needs translation. *LEFT_ABSPATH is updated to point to a file that + lives at least as long as RESULT_POOL when translation is necessary. + Otherwise the value is not updated */ +static svn_error_t * +translate_if_necessary(const char **local_abspath, + apr_hash_t *props, + svn_cancel_func_t cancel_func, + void *cancel_baton, + apr_pool_t *result_pool, + apr_pool_t *scratch_pool) +{ + const svn_string_t *eol_style_val; + const svn_string_t *keywords_val; + svn_subst_eol_style_t eol_style; + const char *eol; + apr_hash_t *keywords; + svn_stream_t *contents; + svn_stream_t *dst; + + /* if (svn_hash_gets(props, SVN_PROP_SPECIAL)) + ### TODO: Implement */ + + eol_style_val = svn_hash_gets(props, SVN_PROP_EOL_STYLE); + keywords_val = svn_hash_gets(props, SVN_PROP_KEYWORDS); + + if (eol_style_val) + svn_subst_eol_style_from_value(&eol_style, &eol, eol_style_val->data); + else + { + eol = NULL; + eol_style = svn_subst_eol_style_none; + } + + if (keywords_val) + SVN_ERR(svn_subst_build_keywords3(&keywords, keywords_val->data, + APR_STRINGIFY(SVN_INVALID_REVNUM), + "", "", 0, "", scratch_pool)); + else + keywords = NULL; + + if (!svn_subst_translation_required(eol_style, eol, keywords, FALSE, FALSE)) + return SVN_NO_ERROR; + + SVN_ERR(svn_stream_open_readonly(&contents, *local_abspath, + scratch_pool, scratch_pool)); + + SVN_ERR(svn_stream_open_unique(&dst, local_abspath, NULL, + svn_io_file_del_on_pool_cleanup, + result_pool, scratch_pool)); + + dst = svn_subst_stream_translated(dst, eol, TRUE /* repair */, + keywords, FALSE /* expand */, + scratch_pool); + + SVN_ERR(svn_stream_copy3(contents, dst, cancel_func, cancel_baton, + scratch_pool)); + + return SVN_NO_ERROR; +} + /* Handles reporting of a file for inner_dir_diff */ static svn_error_t * do_file_diff(const char *left_abspath, @@ -356,6 +419,10 @@ do_file_diff(const char *left_abspath, svn_hash_sets(left_props, SVN_PROP_MIME_TYPE, svn_string_create(mime_type, scratch_pool)); } + + SVN_ERR(translate_if_necessary(&left_abspath, left_props, + ctx->cancel_func, ctx->cancel_baton, + scratch_pool, scratch_pool)); } else left_props = NULL; @@ -379,6 +446,11 @@ do_file_diff(const char *left_abspath, svn_hash_sets(right_props, SVN_PROP_MIME_TYPE, svn_string_create(mime_type, scratch_pool)); } + + SVN_ERR(translate_if_necessary(&right_abspath, right_props, + ctx->cancel_func, ctx->cancel_baton, + scratch_pool, scratch_pool)); + } else right_props = NULL; Modified: subversion/branches/authzperf/subversion/libsvn_client/export.c URL: http://svn.apache.org/viewvc/subversion/branches/authzperf/subversion/libsvn_client/export.c?rev=1649205&r1=1649204&r2=1649205&view=diff ============================================================================== --- subversion/branches/authzperf/subversion/libsvn_client/export.c (original) +++ subversion/branches/authzperf/subversion/libsvn_client/export.c Sat Jan 3 14:00:41 2015 @@ -1581,7 +1581,7 @@ svn_client_export5(svn_revnum_t *result_ = svn_wc_create_notify(to_path, svn_wc_notify_update_completed, pool); notify->revision = edit_revision; - (*ctx->notify_func2)(ctx->notify_baton2, notify, pool); + ctx->notify_func2(ctx->notify_baton2, notify, pool); } if (result_rev)
