Modified: subversion/branches/invoke-diff-cmd-feature/subversion/libsvn_fs_fs/tree.c URL: http://svn.apache.org/viewvc/subversion/branches/invoke-diff-cmd-feature/subversion/libsvn_fs_fs/tree.c?rev=1533871&r1=1533870&r2=1533871&view=diff ============================================================================== --- subversion/branches/invoke-diff-cmd-feature/subversion/libsvn_fs_fs/tree.c (original) +++ subversion/branches/invoke-diff-cmd-feature/subversion/libsvn_fs_fs/tree.c Sun Oct 20 10:11:04 2013 @@ -1241,15 +1241,14 @@ get_dag(dag_node_t **dag_node_p, if (! node) { - /* Canonicalize the input PATH. */ - if (! svn_fs__is_canonical_abspath(path)) - { - path = svn_fs__canonicalize_abspath(path, pool); - - /* Try again with the corrected path. */ - SVN_ERR(dag_node_cache_get(&node, root, path, needs_lock_cache, - pool)); - } + /* Canonicalize the input PATH. As it turns out, >95% of all paths + * seen here during e.g. svnadmin verify are non-canonical, i.e. + * miss the leading '/'. Unconditional canonicalization has a net + * performance benefit over previously checking path for being + * canonical. */ + path = svn_fs__canonicalize_abspath(path, pool); + SVN_ERR(dag_node_cache_get(&node, root, path, needs_lock_cache, + pool)); if (! node) {
Modified: subversion/branches/invoke-diff-cmd-feature/subversion/libsvn_ra_svn/client.c URL: http://svn.apache.org/viewvc/subversion/branches/invoke-diff-cmd-feature/subversion/libsvn_ra_svn/client.c?rev=1533871&r1=1533870&r2=1533871&view=diff ============================================================================== --- subversion/branches/invoke-diff-cmd-feature/subversion/libsvn_ra_svn/client.c (original) +++ subversion/branches/invoke-diff-cmd-feature/subversion/libsvn_ra_svn/client.c Sun Oct 20 10:11:04 2013 @@ -564,8 +564,8 @@ static svn_error_t *parse_url(const char /* This structure is used as a baton for the pool cleanup function to store tunnel parameters used by the close-tunnel callback. */ struct tunnel_data_t { + void *tunnel_context; void *tunnel_baton; - void *open_baton; const char *tunnel_name; const char *user; const char *hostname; @@ -578,7 +578,7 @@ static apr_status_t close_tunnel_cleanup { const struct tunnel_data_t *const td = baton; svn_error_t *const err = - svn_error_root_cause(td->close_tunnel(td->tunnel_baton, td->open_baton, + svn_error_root_cause(td->close_tunnel(td->tunnel_context, td->tunnel_baton, td->tunnel_name, td->user, td->hostname, td->port)); const apr_status_t ret = (err ? err->apr_err : 0); @@ -625,27 +625,28 @@ static svn_error_t *open_session(svn_ra_ if (tunnel_name) { - if (!callbacks->open_tunnel) + if (tunnel_argv) SVN_ERR(make_tunnel(tunnel_argv, &conn, pool)); else { - void *tunnel_baton; + void *tunnel_context; apr_file_t *request; apr_file_t *response; - SVN_ERR(callbacks->open_tunnel(&request, &response, &tunnel_baton, - callbacks_baton, tunnel_name, - uri->user, uri->hostname, uri->port, - pool)); - if (callbacks->close_tunnel) + SVN_ERR(callbacks->open_tunnel_func( + &request, &response, &tunnel_context, + callbacks->tunnel_baton, tunnel_name, + uri->user, uri->hostname, uri->port, + pool)); + if (callbacks->close_tunnel_func) { struct tunnel_data_t *const td = apr_palloc(pool, sizeof(*td)); - td->tunnel_baton = tunnel_baton; - td->open_baton = callbacks_baton; + td->tunnel_context = tunnel_context; + td->tunnel_baton = callbacks->tunnel_baton; td->tunnel_name = apr_pstrdup(pool, tunnel_name); td->user = apr_pstrdup(pool, uri->user); td->hostname = apr_pstrdup(pool, uri->hostname); td->port = uri->port; - td->close_tunnel = callbacks->close_tunnel; + td->close_tunnel = callbacks->close_tunnel_func; apr_pool_cleanup_register(pool, td, close_tunnel_cleanup, apr_pool_cleanup_null); } @@ -798,7 +799,14 @@ static svn_error_t *ra_svn_open(svn_ra_s parse_tunnel(url, &tunnel, pool); - if (tunnel && !callbacks->open_tunnel) + /* Use the default tunnel implementation if we got a tunnel name, + but either do not have tunnel handler callbacks installed, or + the handlers don't like the tunnel name. */ + if (tunnel + && (!callbacks->open_tunnel_func + || (callbacks->check_tunnel_func && callbacks->open_tunnel_func + && !callbacks->check_tunnel_func(callbacks->tunnel_baton, + tunnel)))) SVN_ERR(find_tunnel_agent(tunnel, uri.hostinfo, &tunnel_argv, config, pool)); else @@ -1332,7 +1340,14 @@ static svn_error_t *ra_svn_get_dir(svn_r SVN_ERR(svn_ra_svn__parse_tuple(elt->u.list, pool, "cwnbr(?c)(?c)", &name, &kind, &size, &has_props, &crev, &cdate, &cauthor)); - name = svn_relpath_canonicalize(name, pool); + + /* Nothing to sanitize here. Any multi-segment path is simply + illegal in the hash returned by svn_ra_get_dir2. */ + if (strchr(name, '/')) + return svn_error_createf(SVN_ERR_RA_SVN_MALFORMED_DATA, NULL, + _("Invalid directory entry name '%s'"), + name); + dirent = svn_dirent_create(pool); dirent->kind = svn_node_kind_from_word(kind); dirent->size = size;/* FIXME: svn_filesize_t */ Modified: subversion/branches/invoke-diff-cmd-feature/subversion/libsvn_ra_svn/marshal.c URL: http://svn.apache.org/viewvc/subversion/branches/invoke-diff-cmd-feature/subversion/libsvn_ra_svn/marshal.c?rev=1533871&r1=1533870&r2=1533871&view=diff ============================================================================== --- subversion/branches/invoke-diff-cmd-feature/subversion/libsvn_ra_svn/marshal.c (original) +++ subversion/branches/invoke-diff-cmd-feature/subversion/libsvn_ra_svn/marshal.c Sun Oct 20 10:11:04 2013 @@ -119,6 +119,16 @@ svn_ra_svn_conn_t *svn_ra_svn_create_con && apr_sockaddr_ip_get(&conn->remote_ip, sa) == APR_SUCCESS)) conn->remote_ip = NULL; svn_ra_svn__stream_timeout(conn->stream, get_timeout(conn)); + + /* We are using large r/w buffers already. + * So, once we decide to actually send data, we want it to go over + * the wire a.s.a.p.. So disable Nagle's algorithm. + * + * We ignore the result of this call since it safe to continue even + * if we keep delaying. The only negative effect is increased + * latency (can be additional 5 .. 10ms depending on circumstances). + */ + apr_socket_opt_set(sock, APR_TCP_NODELAY, 1); } else { @@ -1017,7 +1027,7 @@ static svn_error_t *read_string(svn_ra_s /* Given the first non-whitespace character FIRST_CHAR, read an item * into the already allocated structure ITEM. LEVEL should be set - * to 0 for the first call and is used to enforce a recurssion limit + * to 0 for the first call and is used to enforce a recursion limit * on the parser. */ static svn_error_t *read_item(svn_ra_svn_conn_t *conn, apr_pool_t *pool, svn_ra_svn_item_t *item, char first_char, Modified: subversion/branches/invoke-diff-cmd-feature/subversion/libsvn_repos/authz.c URL: http://svn.apache.org/viewvc/subversion/branches/invoke-diff-cmd-feature/subversion/libsvn_repos/authz.c?rev=1533871&r1=1533870&r2=1533871&view=diff ============================================================================== --- subversion/branches/invoke-diff-cmd-feature/subversion/libsvn_repos/authz.c (original) +++ subversion/branches/invoke-diff-cmd-feature/subversion/libsvn_repos/authz.c Sun Oct 20 10:11:04 2013 @@ -36,6 +36,7 @@ #include "svn_config.h" #include "svn_ctype.h" #include "private/svn_fspath.h" +#include "private/svn_repos_private.h" #include "repos.h" @@ -854,23 +855,9 @@ authz_retrieve_config_repo(svn_config_t return SVN_NO_ERROR; } -/* Given a PATH which might be a relative repo URL (^/), an absolute - * local repo URL (file://), an absolute path outside of the repo - * or a location in the Windows registry. - * - * Retrieve the configuration data that PATH points at and parse it into - * CFG_P allocated in POOL. - * - * If PATH cannot be parsed as a config file then an error is returned. The - * contents of CFG_P is then undefined. If MUST_EXIST is TRUE, a missing - * authz file is also an error. - * - * REPOS_ROOT points at the root of the repos you are - * going to apply the authz against, can be NULL if you are sure that you - * don't have a repos relative URL in PATH. */ -static svn_error_t * -authz_retrieve_config(svn_config_t **cfg_p, const char *path, - svn_boolean_t must_exist, apr_pool_t *pool) +svn_error_t * +svn_repos__retrieve_config(svn_config_t **cfg_p, const char *path, + svn_boolean_t must_exist, apr_pool_t *pool) { if (svn_path_is_url(path)) { @@ -943,7 +930,7 @@ svn_repos__authz_read(svn_authz_t **auth /* Load the authz file */ if (accept_urls) - SVN_ERR(authz_retrieve_config(&authz->cfg, path, must_exist, pool)); + SVN_ERR(svn_repos__retrieve_config(&authz->cfg, path, must_exist, pool)); else SVN_ERR(svn_config_read3(&authz->cfg, path, must_exist, TRUE, TRUE, pool)); @@ -954,8 +941,8 @@ svn_repos__authz_read(svn_authz_t **auth /* Load the groups file */ if (accept_urls) - SVN_ERR(authz_retrieve_config(&groups_cfg, groups_path, must_exist, - pool)); + SVN_ERR(svn_repos__retrieve_config(&groups_cfg, groups_path, + must_exist, pool)); else SVN_ERR(svn_config_read3(&groups_cfg, groups_path, must_exist, TRUE, TRUE, pool)); Modified: subversion/branches/invoke-diff-cmd-feature/subversion/libsvn_repos/dump.c URL: http://svn.apache.org/viewvc/subversion/branches/invoke-diff-cmd-feature/subversion/libsvn_repos/dump.c?rev=1533871&r1=1533870&r2=1533871&view=diff ============================================================================== --- subversion/branches/invoke-diff-cmd-feature/subversion/libsvn_repos/dump.c (original) +++ subversion/branches/invoke-diff-cmd-feature/subversion/libsvn_repos/dump.c Sun Oct 20 10:11:04 2013 @@ -1313,7 +1313,7 @@ verify_directory_entry(void *baton, cons type defined in the DIRENT. */ if (db->edit_baton->verified_dirents_cache) { - svn_node_kind_t kind; + svn_node_kind_t *kind; svn_boolean_t found; unparsed_id = svn_fs_unparse_id(dirent->id, pool); @@ -1323,7 +1323,7 @@ verify_directory_entry(void *baton, cons if (found) { - if (kind == dirent->kind) + if (*kind == dirent->kind) return SVN_NO_ERROR; else { @@ -1333,7 +1333,7 @@ verify_directory_entry(void *baton, cons svn_error_createf(SVN_ERR_NODE_UNEXPECTED_KIND, NULL, _("Unexpected node kind %d for '%s'. " "Expected kind was %d."), - dirent->kind, path, kind); + dirent->kind, path, *kind); } } } @@ -1494,7 +1494,7 @@ deserialize_node_kind(void **out, apr_size_t data_len, apr_pool_t *pool) { - *(svn_node_kind_t *)out = *(svn_node_kind_t *)data; + *out = data; return SVN_NO_ERROR; } Modified: subversion/branches/invoke-diff-cmd-feature/subversion/libsvn_subr/config.c URL: http://svn.apache.org/viewvc/subversion/branches/invoke-diff-cmd-feature/subversion/libsvn_subr/config.c?rev=1533871&r1=1533870&r2=1533871&view=diff ============================================================================== --- subversion/branches/invoke-diff-cmd-feature/subversion/libsvn_subr/config.c (original) +++ subversion/branches/invoke-diff-cmd-feature/subversion/libsvn_subr/config.c Sun Oct 20 10:11:04 2013 @@ -23,6 +23,8 @@ +#include <assert.h> + #define APR_WANT_STRFUNC #define APR_WANT_MEMFUNC #include <apr_want.h> @@ -93,6 +95,7 @@ svn_config_create2(svn_config_t **cfgp, cfg->tmp_value = svn_stringbuf_create_empty(result_pool); cfg->section_names_case_sensitive = section_names_case_sensitive; cfg->option_names_case_sensitive = option_names_case_sensitive; + cfg->read_only = FALSE; *cfgp = cfg; return SVN_NO_ERROR; @@ -484,7 +487,13 @@ make_string_from_option(const char **val */ if (opt->value && strchr(opt->value, '%')) { - apr_pool_t *tmp_pool = (x_pool ? x_pool : svn_pool_create(cfg->x_pool)); + apr_pool_t *tmp_pool; + + /* setting read-only mode should have expanded all values + * automatically. */ + assert(!cfg->read_only); + + tmp_pool = (x_pool ? x_pool : svn_pool_create(cfg->x_pool)); expand_option_value(cfg, section, opt->value, &opt->x_value, tmp_pool); opt->expanded = TRUE; @@ -687,6 +696,15 @@ svn_config_set(svn_config_t *cfg, cfg_section_t *sec; cfg_option_t *opt; + /* Ignore write attempts to r/o configurations. + * + * Since we should never try to modify r/o data, trigger an assertion + * in debug mode. + */ + assert(!cfg->read_only); + if (cfg->read_only) + return; + remove_expansions(cfg); opt = find_option(cfg, section, option, &sec); Modified: subversion/branches/invoke-diff-cmd-feature/subversion/libsvn_subr/config_file.c URL: http://svn.apache.org/viewvc/subversion/branches/invoke-diff-cmd-feature/subversion/libsvn_subr/config_file.c?rev=1533871&r1=1533870&r2=1533871&view=diff ============================================================================== --- subversion/branches/invoke-diff-cmd-feature/subversion/libsvn_subr/config_file.c (original) +++ subversion/branches/invoke-diff-cmd-feature/subversion/libsvn_subr/config_file.c Sun Oct 20 10:11:04 2013 @@ -37,6 +37,7 @@ #include "svn_ctype.h" #include "svn_private_config.h" +#include "private/svn_subr_private.h" #ifdef __HAIKU__ # include <FindDirectory.h> @@ -418,9 +419,48 @@ svn_config__sys_config_path(const char * return SVN_NO_ERROR; } +/* Callback for svn_config_enumerate2: Continue to next value. */ +static svn_boolean_t +expand_value(const char *name, + const char *value, + void *baton, + apr_pool_t *pool) +{ + return TRUE; +} + +/* Callback for svn_config_enumerate_sections2: + * Enumerate and implicitly expand all values in this section. + */ +static svn_boolean_t +expand_values_in_section(const char *name, + void *baton, + apr_pool_t *pool) +{ + svn_config_t *cfg = baton; + svn_config_enumerate2(cfg, name, expand_value, NULL, pool); + + return TRUE; +} + /*** Exported interfaces. ***/ +void +svn_config__set_read_only(svn_config_t *cfg, + apr_pool_t *scratch_pool) +{ + /* expand all items such that later calls to getters won't need to + * change internal state */ + svn_config_enumerate_sections2(cfg, expand_values_in_section, + cfg, scratch_pool); + + /* now, any modification attempt will be ignored / trigger an assertion + * in debug mode */ + cfg->read_only = TRUE; +} + + svn_error_t * svn_config__parse_file(svn_config_t *cfg, const char *file, Modified: subversion/branches/invoke-diff-cmd-feature/subversion/libsvn_subr/config_impl.h URL: http://svn.apache.org/viewvc/subversion/branches/invoke-diff-cmd-feature/subversion/libsvn_subr/config_impl.h?rev=1533871&r1=1533870&r2=1533871&view=diff ============================================================================== --- subversion/branches/invoke-diff-cmd-feature/subversion/libsvn_subr/config_impl.h (original) +++ subversion/branches/invoke-diff-cmd-feature/subversion/libsvn_subr/config_impl.h Sun Oct 20 10:11:04 2013 @@ -70,8 +70,11 @@ struct svn_config_t /* Specifies whether option names are populated case sensitively. */ svn_boolean_t option_names_case_sensitive; -}; + /* When set, all modification attempts will be ignored. + * In debug mode, we will trigger an assertion. */ + svn_boolean_t read_only; +}; /* Read sections and options from a file. */ svn_error_t *svn_config__parse_file(svn_config_t *cfg, Modified: subversion/branches/invoke-diff-cmd-feature/subversion/libsvn_subr/file.c URL: http://svn.apache.org/viewvc/subversion/branches/invoke-diff-cmd-feature/subversion/libsvn_subr/file.c?rev=1533871&r1=1533870&r2=1533871&view=diff ============================================================================== --- subversion/branches/invoke-diff-cmd-feature/subversion/libsvn_subr/file.c (original) +++ subversion/branches/invoke-diff-cmd-feature/subversion/libsvn_subr/file.c Sun Oct 20 10:11:04 2013 @@ -184,7 +184,7 @@ reclaim_shared_handle(shared_handle_pool shared_handle_t *) = NULL; /* implicitly closes the file */ - apr_pool_clear(result->pool); + svn_pool_clear(result->pool); return result; } @@ -331,7 +331,7 @@ close_handle(shared_handle_pool_t *handl shared_handle_t *handle) { /* implicitly closes the file */ - apr_pool_clear(handle->pool); + svn_pool_clear(handle->pool); handle_pool->last_open = handle->previous; handle->next = handle_pool->first_unused; Modified: subversion/branches/invoke-diff-cmd-feature/subversion/libsvn_subr/prefix_string.c URL: http://svn.apache.org/viewvc/subversion/branches/invoke-diff-cmd-feature/subversion/libsvn_subr/prefix_string.c?rev=1533871&r1=1533870&r2=1533871&view=diff ============================================================================== --- subversion/branches/invoke-diff-cmd-feature/subversion/libsvn_subr/prefix_string.c (original) +++ subversion/branches/invoke-diff-cmd-feature/subversion/libsvn_subr/prefix_string.c Sun Oct 20 10:11:04 2013 @@ -219,7 +219,7 @@ svn_prefix_string__create(svn_prefix_tre new_node->sub_nodes = apr_palloc(tree->pool, sizeof(node_t *)); new_node->sub_nodes[0] = sub_node; - memcpy(sub_node->key.data, sub_node->key.data + match, 8 - match); + memmove(sub_node->key.data, sub_node->key.data + match, 8 - match); /* replace old sub-node with new one and continue lookup */ sub_node->key.prefix = new_node; Propchange: subversion/branches/invoke-diff-cmd-feature/subversion/libsvn_subr/root_pools.c ------------------------------------------------------------------------------ svn:eol-style = native Modified: subversion/branches/invoke-diff-cmd-feature/subversion/libsvn_subr/stream.c URL: http://svn.apache.org/viewvc/subversion/branches/invoke-diff-cmd-feature/subversion/libsvn_subr/stream.c?rev=1533871&r1=1533870&r2=1533871&view=diff ============================================================================== --- subversion/branches/invoke-diff-cmd-feature/subversion/libsvn_subr/stream.c (original) +++ subversion/branches/invoke-diff-cmd-feature/subversion/libsvn_subr/stream.c Sun Oct 20 10:11:04 2013 @@ -1379,6 +1379,36 @@ svn_stream_checksummed(svn_stream_t *str /* Miscellaneous stream functions. */ + +svn_error_t * +svn_stringbuf_from_stream(svn_stringbuf_t **str, + svn_stream_t *stream, + apr_size_t len_hint, + apr_pool_t *pool) +{ +#define MIN_READ_SIZE 64 + + apr_size_t to_read = 0; + svn_stringbuf_t *text + = svn_stringbuf_create_ensure(len_hint ? len_hint : MIN_READ_SIZE, pool); + + do + { + to_read = text->blocksize - 1 - text->len; + SVN_ERR(svn_stream_read(stream, text->data + text->len, &to_read)); + text->len += to_read; + + if (to_read && text->blocksize < text->len + MIN_READ_SIZE) + svn_stringbuf_ensure(text, text->blocksize * 2); + } + while (to_read); + + text->data[text->len] = '\0'; + *str = text; + + return SVN_NO_ERROR; +} + struct stringbuf_stream_baton { svn_stringbuf_t *str; Modified: subversion/branches/invoke-diff-cmd-feature/subversion/libsvn_subr/string.c URL: http://svn.apache.org/viewvc/subversion/branches/invoke-diff-cmd-feature/subversion/libsvn_subr/string.c?rev=1533871&r1=1533870&r2=1533871&view=diff ============================================================================== --- subversion/branches/invoke-diff-cmd-feature/subversion/libsvn_subr/string.c (original) +++ subversion/branches/invoke-diff-cmd-feature/subversion/libsvn_subr/string.c Sun Oct 20 10:11:04 2013 @@ -53,9 +53,9 @@ membuf_create(void **data, apr_size_t *s /* apr_palloc will allocate multiples of 8. * Thus, we would waste some of that memory if we stuck to the * smaller size. Note that this is safe even if apr_palloc would - * use some other aligment or none at all. */ + * use some other alignment or none at all. */ minimum_size = APR_ALIGN_DEFAULT(minimum_size); - *data = (!minimum_size ? NULL : apr_palloc(pool, minimum_size)); + *data = apr_palloc(pool, minimum_size); *size = minimum_size; } @@ -121,7 +121,10 @@ svn_membuf__resize(svn_membuf_t *membuf, const apr_size_t old_size = membuf->size; membuf_ensure(&membuf->data, &membuf->size, size, membuf->pool); - if (membuf->data && old_data && old_data != membuf->data) + + /* If we re-allocated MEMBUF->DATA, it cannot be NULL. + * Statically initialized membuffers (OLD_DATA) may be NULL, though. */ + if (old_data && old_data != membuf->data) memcpy(membuf->data, old_data, old_size); } Modified: subversion/branches/invoke-diff-cmd-feature/subversion/libsvn_subr/time.c URL: http://svn.apache.org/viewvc/subversion/branches/invoke-diff-cmd-feature/subversion/libsvn_subr/time.c?rev=1533871&r1=1533870&r2=1533871&view=diff ============================================================================== --- subversion/branches/invoke-diff-cmd-feature/subversion/libsvn_subr/time.c (original) +++ subversion/branches/invoke-diff-cmd-feature/subversion/libsvn_subr/time.c Sun Oct 20 10:11:04 2013 @@ -34,6 +34,8 @@ #include "svn_error.h" #include "svn_private_config.h" +#include "private/svn_string_private.h" + /*** Code. ***/ @@ -82,7 +84,7 @@ /* Machine parseable part, generated by apr_snprintf. */ #define HUMAN_TIMESTAMP_FORMAT "%.4d-%.2d-%.2d %.2d:%.2d:%.2d %+.2d%.2d" /* Human explanatory part, generated by apr_strftime as "Sat, 01 Jan 2000" */ -#define human_timestamp_format_suffix _(" (%a, %d %b %Y)") +#define HUMAN_TIMESTAMP_FORMAT_SUFFIX _(" (%a, %d %b %Y)") const char * svn_time_to_cstring(apr_time_t when, apr_pool_t *pool) @@ -135,24 +137,24 @@ svn_time_from_cstring(apr_time_t *when, apr_time_exp_t exploded_time; apr_status_t apr_err; char wday[4], month[4]; - char *c; + const char *c; /* Open-code parsing of the new timestamp format, as this is a hot path for reading the entries file. This format looks like: "2001-08-31T04:24:14.966996Z" */ - exploded_time.tm_year = (apr_int32_t) strtol(data, &c, 10); + exploded_time.tm_year = (apr_int32_t) svn__strtoul(data, &c); if (*c++ != '-') goto fail; - exploded_time.tm_mon = (apr_int32_t) strtol(c, &c, 10); + exploded_time.tm_mon = (apr_int32_t) svn__strtoul(c, &c); if (*c++ != '-') goto fail; - exploded_time.tm_mday = (apr_int32_t) strtol(c, &c, 10); + exploded_time.tm_mday = (apr_int32_t) svn__strtoul(c, &c); if (*c++ != 'T') goto fail; - exploded_time.tm_hour = (apr_int32_t) strtol(c, &c, 10); + exploded_time.tm_hour = (apr_int32_t) svn__strtoul(c, &c); if (*c++ != ':') goto fail; - exploded_time.tm_min = (apr_int32_t) strtol(c, &c, 10); + exploded_time.tm_min = (apr_int32_t) svn__strtoul(c, &c); if (*c++ != ':') goto fail; - exploded_time.tm_sec = (apr_int32_t) strtol(c, &c, 10); + exploded_time.tm_sec = (apr_int32_t) svn__strtoul(c, &c); if (*c++ != '.') goto fail; - exploded_time.tm_usec = (apr_int32_t) strtol(c, &c, 10); + exploded_time.tm_usec = (apr_int32_t) svn__strtoul(c, &c); if (*c++ != 'Z') goto fail; exploded_time.tm_year -= 1900; @@ -245,7 +247,7 @@ svn_time_to_human_cstring(apr_time_t whe ret = apr_strftime(human_datestr, &retlen, SVN_TIME__MAX_LENGTH - len, - human_timestamp_format_suffix, + HUMAN_TIMESTAMP_FORMAT_SUFFIX, &exploded_time); /* If there was an error, ensure that the string is zero-terminated. */ Modified: subversion/branches/invoke-diff-cmd-feature/subversion/libsvn_subr/win32_crashrpt.c URL: http://svn.apache.org/viewvc/subversion/branches/invoke-diff-cmd-feature/subversion/libsvn_subr/win32_crashrpt.c?rev=1533871&r1=1533870&r2=1533871&view=diff ============================================================================== --- subversion/branches/invoke-diff-cmd-feature/subversion/libsvn_subr/win32_crashrpt.c (original) +++ subversion/branches/invoke-diff-cmd-feature/subversion/libsvn_subr/win32_crashrpt.c Sun Oct 20 10:11:04 2013 @@ -427,13 +427,15 @@ write_var_values(PSYMBOL_INFO sym_info, format_value(value_str, sym_info->ModBase, sym_info->TypeIndex, (void *)var_data); - fprintf(log_file, "%s=%s", sym_info->Name, value_str); + fprintf(log_file, "%.*s=%s", (int)sym_info->NameLen, sym_info->Name, + value_str); } if (!log_params && sym_info->Flags & SYMFLAG_LOCAL) { format_value(value_str, sym_info->ModBase, sym_info->TypeIndex, (void *)var_data); - fprintf(log_file, " %s = %s\n", sym_info->Name, value_str); + fprintf(log_file, " %.*s = %s\n", (int)sym_info->NameLen, + sym_info->Name, value_str); } return TRUE; @@ -466,8 +468,10 @@ write_function_detail(STACKFRAME64 stack if (SymFromAddr_(proc, stack_frame.AddrPC.Offset, &func_disp, pIHS)) { fprintf(log_file, - "#%d 0x%08I64x in %.200s(", - nr_of_frame, stack_frame.AddrPC.Offset, pIHS->Name); + "#%d 0x%08I64x in %.*s(", + nr_of_frame, stack_frame.AddrPC.Offset, + pIHS->NameLen > 200 ? 200 : (int)pIHS->NameLen, + pIHS->Name); /* restrict symbol enumeration to this frame only */ ih_stack_frame.InstructionOffset = stack_frame.AddrPC.Offset; Modified: subversion/branches/invoke-diff-cmd-feature/subversion/libsvn_wc/wc_db.c URL: http://svn.apache.org/viewvc/subversion/branches/invoke-diff-cmd-feature/subversion/libsvn_wc/wc_db.c?rev=1533871&r1=1533870&r2=1533871&view=diff ============================================================================== --- subversion/branches/invoke-diff-cmd-feature/subversion/libsvn_wc/wc_db.c (original) +++ subversion/branches/invoke-diff-cmd-feature/subversion/libsvn_wc/wc_db.c Sun Oct 20 10:11:04 2013 @@ -6560,12 +6560,12 @@ op_revert_recursive_txn(void *baton, while (have_row) { const char *move_src_relpath = svn_sqlite__column_text(stmt, 0, NULL); - int op_depth = svn_sqlite__column_int(stmt, 2); + int move_op_depth = svn_sqlite__column_int(stmt, 2); svn_error_t *err; err = svn_wc__db_resolve_break_moved_away_internal(wcroot, move_src_relpath, - op_depth, + move_op_depth, scratch_pool); if (err) return svn_error_compose_create(err, svn_sqlite__reset(stmt)); Propchange: subversion/branches/invoke-diff-cmd-feature/subversion/svnserve/logger.c ------------------------------------------------------------------------------ svn:eol-style = native Propchange: subversion/branches/invoke-diff-cmd-feature/subversion/svnserve/logger.h ------------------------------------------------------------------------------ svn:eol-style = native Modified: subversion/branches/invoke-diff-cmd-feature/subversion/tests/libsvn_ra/ra-test.c URL: http://svn.apache.org/viewvc/subversion/branches/invoke-diff-cmd-feature/subversion/tests/libsvn_ra/ra-test.c?rev=1533871&r1=1533870&r2=1533871&view=diff ============================================================================== --- subversion/branches/invoke-diff-cmd-feature/subversion/tests/libsvn_ra/ra-test.c (original) +++ subversion/branches/invoke-diff-cmd-feature/subversion/tests/libsvn_ra/ra-test.c Sun Oct 20 10:11:04 2013 @@ -94,11 +94,23 @@ commit_changes(svn_ra_session_t *session return SVN_NO_ERROR; } +static svn_boolean_t last_tunnel_check; static int tunnel_open_count; +static void *check_tunnel_baton; +static void *open_tunnel_context; + +static svn_boolean_t +check_tunnel(void *tunnel_baton, const char *tunnel_name) +{ + if (tunnel_baton != check_tunnel_baton) + abort(); + last_tunnel_check = (0 == strcmp(tunnel_name, "test")); + return last_tunnel_check; +} static svn_error_t * open_tunnel(apr_file_t **request, apr_file_t **response, - void **tunnel_baton, void *callbacks_baton, + void **tunnel_context, void *tunnel_baton, const char *tunnel_name, const char *user, const char *hostname, int port, apr_pool_t *pool) @@ -110,6 +122,8 @@ open_tunnel(apr_file_t **request, apr_fi const char *args[] = { "svnserve", "-t", "-r", ".", NULL }; const char *svnserve; + SVN_TEST_ASSERT(tunnel_baton == check_tunnel_baton); + SVN_ERR(svn_dirent_get_absolute(&svnserve, "../../svnserve/svnserve", pool)); #ifdef WIN32 svnserve = apr_pstrcat(pool, svnserve, ".exe", NULL); @@ -146,16 +160,18 @@ open_tunnel(apr_file_t **request, apr_fi *request = proc->in; *response = proc->out; - *tunnel_baton = NULL; + open_tunnel_context = *tunnel_context = &kind; ++tunnel_open_count; return SVN_NO_ERROR; } static svn_error_t * -close_tunnel(void *tunnel_baton, void *callbacks_baton, +close_tunnel(void *tunnel_context, void *tunnel_baton, const char *tunnel_name, const char *user, const char *hostname, int port) { + SVN_TEST_ASSERT(tunnel_context == open_tunnel_context); + SVN_TEST_ASSERT(tunnel_baton == check_tunnel_baton); --tunnel_open_count; return SVN_NO_ERROR; } @@ -227,6 +243,38 @@ location_segments_test(const svn_test_op /* Test ra_svn tunnel callbacks. */ + +static svn_error_t * +check_tunnel_callback_test(const svn_test_opts_t *opts, + apr_pool_t *pool) +{ + svn_ra_callbacks2_t *cbtable; + svn_ra_session_t *session; + svn_error_t *err; + + SVN_ERR(svn_ra_create_callbacks(&cbtable, pool)); + cbtable->check_tunnel_func = check_tunnel; + cbtable->open_tunnel_func = open_tunnel; + cbtable->close_tunnel_func = close_tunnel; + cbtable->tunnel_baton = check_tunnel_baton = &cbtable; + SVN_ERR(svn_cmdline_create_auth_baton(&cbtable->auth_baton, + TRUE /* non_interactive */, + "jrandom", "rayjandom", + NULL, + TRUE /* no_auth_cache */, + FALSE /* trust_server_cert */, + NULL, NULL, NULL, pool)); + + last_tunnel_check = TRUE; + open_tunnel_context = NULL; + err = svn_ra_open4(&session, NULL, "svn+foo://localhost/no-repo", + NULL, cbtable, NULL, NULL, pool); + svn_error_clear(err); + SVN_TEST_ASSERT(err); + SVN_TEST_ASSERT(!last_tunnel_check); + return SVN_NO_ERROR; +} + static svn_error_t * tunel_callback_test(const svn_test_opts_t *opts, apr_pool_t *pool) @@ -242,8 +290,10 @@ tunel_callback_test(const svn_test_opts_ url = apr_pstrcat(pool, "svn+test://localhost/", tunnel_repos_name, NULL); SVN_ERR(svn_ra_create_callbacks(&cbtable, pool)); - cbtable->open_tunnel = open_tunnel; - cbtable->close_tunnel = close_tunnel; + cbtable->check_tunnel_func = check_tunnel; + cbtable->open_tunnel_func = open_tunnel; + cbtable->close_tunnel_func = close_tunnel; + cbtable->tunnel_baton = check_tunnel_baton = &cbtable; SVN_ERR(svn_cmdline_create_auth_baton(&cbtable->auth_baton, TRUE /* non_interactive */, "jrandom", "rayjandom", @@ -252,6 +302,8 @@ tunel_callback_test(const svn_test_opts_ FALSE /* trust_server_cert */, NULL, NULL, NULL, pool)); + last_tunnel_check = FALSE; + open_tunnel_context = NULL; tunnel_open_count = 0; connection_pool = svn_pool_create(pool); err = svn_ra_open4(&session, NULL, url, NULL, cbtable, NULL, NULL, @@ -263,6 +315,7 @@ tunel_callback_test(const svn_test_opts_ return SVN_NO_ERROR; } SVN_ERR(err); + SVN_TEST_ASSERT(last_tunnel_check); SVN_TEST_ASSERT(tunnel_open_count > 0); svn_pool_destroy(connection_pool); SVN_TEST_ASSERT(tunnel_open_count == 0); @@ -277,6 +330,8 @@ struct svn_test_descriptor_t test_funcs[ SVN_TEST_NULL, SVN_TEST_OPTS_PASS(location_segments_test, "test svn_ra_get_location_segments"), + SVN_TEST_OPTS_PASS(check_tunnel_callback_test, + "test ra_svn tunnel callback check"), SVN_TEST_OPTS_PASS(tunel_callback_test, "test ra_svn tunnel creation callbacks"), SVN_TEST_NULL Propchange: subversion/branches/invoke-diff-cmd-feature/subversion/tests/libsvn_subr/root-pools-test.c ------------------------------------------------------------------------------ svn:eol-style = native Modified: subversion/branches/invoke-diff-cmd-feature/subversion/tests/libsvn_subr/stream-test.c URL: http://svn.apache.org/viewvc/subversion/branches/invoke-diff-cmd-feature/subversion/tests/libsvn_subr/stream-test.c?rev=1533871&r1=1533870&r2=1533871&view=diff ============================================================================== --- subversion/branches/invoke-diff-cmd-feature/subversion/tests/libsvn_subr/stream-test.c (original) +++ subversion/branches/invoke-diff-cmd-feature/subversion/tests/libsvn_subr/stream-test.c Sun Oct 20 10:11:04 2013 @@ -727,6 +727,50 @@ test_stream_base64_2(apr_pool_t *pool) return SVN_NO_ERROR; } +static svn_error_t * +test_stringbuf_from_stream(apr_pool_t *pool) +{ + const char *test_cases[] = + { + "", + "x", + "this string is longer than the default 64 minimum block size used" + "by the function under test", + NULL + }; + + const char **test_case; + for (test_case = test_cases; *test_case; ++test_case) + { + svn_stringbuf_t *result1, *result2, *result3, *result4; + svn_stringbuf_t *original = svn_stringbuf_create(*test_case, pool); + + svn_stream_t *stream1 = svn_stream_from_stringbuf(original, pool); + svn_stream_t *stream2 = svn_stream_from_stringbuf(original, pool); + + SVN_ERR(svn_stringbuf_from_stream(&result1, stream1, 0, pool)); + SVN_ERR(svn_stringbuf_from_stream(&result2, stream1, 0, pool)); + SVN_ERR(svn_stringbuf_from_stream(&result3, stream2, original->len, + pool)); + SVN_ERR(svn_stringbuf_from_stream(&result4, stream2, original->len, + pool)); + + /* C-string contents must match */ + SVN_TEST_STRING_ASSERT(result1->data, original->data); + SVN_TEST_STRING_ASSERT(result2->data, ""); + SVN_TEST_STRING_ASSERT(result3->data, original->data); + SVN_TEST_STRING_ASSERT(result4->data, ""); + + /* assumed length must match */ + SVN_TEST_ASSERT(result1->len == original->len); + SVN_TEST_ASSERT(result2->len == 0); + SVN_TEST_ASSERT(result3->len == original->len); + SVN_TEST_ASSERT(result4->len == 0); + } + + return SVN_NO_ERROR; +} + /* The test table. */ struct svn_test_descriptor_t test_funcs[] = @@ -752,5 +796,7 @@ struct svn_test_descriptor_t test_funcs[ "test base64 encoding/decoding streams"), SVN_TEST_PASS2(test_stream_base64_2, "base64 decoding allocation problem"), + SVN_TEST_PASS2(test_stringbuf_from_stream, + "test svn_stringbuf_from_stream"), SVN_TEST_NULL }; Modified: subversion/branches/invoke-diff-cmd-feature/subversion/tests/libsvn_wc/op-depth-test.c URL: http://svn.apache.org/viewvc/subversion/branches/invoke-diff-cmd-feature/subversion/tests/libsvn_wc/op-depth-test.c?rev=1533871&r1=1533870&r2=1533871&view=diff ============================================================================== --- subversion/branches/invoke-diff-cmd-feature/subversion/tests/libsvn_wc/op-depth-test.c (original) +++ subversion/branches/invoke-diff-cmd-feature/subversion/tests/libsvn_wc/op-depth-test.c Sun Oct 20 10:11:04 2013 @@ -8314,11 +8314,11 @@ move_child_to_parent_revert(const svn_te } static svn_error_t * -move_abspath_more_than_once(const svn_test_opts_t *opts, apr_pool_t *pool) +move_delete_intermediate(const svn_test_opts_t *opts, apr_pool_t *pool) { svn_test__sandbox_t b; - SVN_ERR(svn_test__sandbox_create(&b, "move_child_to_parent_revert", opts, + SVN_ERR(svn_test__sandbox_create(&b, "move_delete_intermediate", opts, pool)); SVN_ERR(sbox_wc_mkdir(&b, "A")); @@ -8396,6 +8396,146 @@ move_abspath_more_than_once(const svn_te {2, "C/A/A", "base-deleted", NO_COPY_FROM}, {2, "C/A/A/A", "base-deleted", NO_COPY_FROM}, + {0}, + }; + SVN_ERR(check_db_rows(&b, "", nodes)); + } + + /* Ok, now we are in the very ugly case where A/A/A is moved away 3 times */ + + /* Let's delete A */ + SVN_ERR(sbox_wc_delete(&b, "A")); + + /* AAA_1 should now be a copy, but AAA_2 and AAA_3 should still be moves, + but now from the original location instead of from "A/A/A" */ + { + nodes_row_t nodes[] = { + + {0, "", "normal", 0, ""}, + + {1, "AAA_1", "normal", 1, "A/A/A",}, + {1, "AAA_1/A", "normal", 1, "A/A/A/A"}, + {1, "AAA_2", "normal", 1, "B/A/A", MOVED_HERE}, + {1, "AAA_2/A", "normal", 1, "B/A/A/A", MOVED_HERE}, + {1, "AAA_3", "normal", 1, "C/A/A", MOVED_HERE}, + {1, "AAA_3/A", "normal", 1, "C/A/A/A", MOVED_HERE}, + + {0, "A", "normal", 1, "A"}, + {0, "A/A", "normal", 1, "A/A"}, + {0, "A/A/A", "normal", 1, "A/A/A"}, + {0, "A/A/A/A", "normal", 1, "A/A/A/A"}, + + {0, "B", "normal", 1, "B"}, + {0, "B/A", "normal", 1, "B/A"}, + {0, "B/A/A", "normal", 1, "B/A/A"}, + {0, "B/A/A/A", "normal", 1, "B/A/A/A"}, + + {1, "B", "base-deleted", NO_COPY_FROM}, + {1, "B/A", "base-deleted", NO_COPY_FROM}, + {1, "B/A/A", "base-deleted", NO_COPY_FROM, "AAA_2"}, + {1, "B/A/A/A", "base-deleted", NO_COPY_FROM}, + + {0, "C", "normal", 1, "C"}, + {0, "C/A", "normal", 1, "C/A"}, + {0, "C/A/A", "normal", 1, "C/A/A"}, + {0, "C/A/A/A", "normal", 1, "C/A/A/A"}, + + {2, "C/A", "base-deleted", NO_COPY_FROM}, + {2, "C/A/A", "base-deleted", NO_COPY_FROM, "AAA_3"}, + {2, "C/A/A/A", "base-deleted", NO_COPY_FROM}, + + {0}, + }; + SVN_ERR(check_db_rows(&b, "", nodes)); + } + + return SVN_NO_ERROR; +} + +static svn_error_t * +move_revert_intermediate(const svn_test_opts_t *opts, apr_pool_t *pool) +{ + svn_test__sandbox_t b; + + SVN_ERR(svn_test__sandbox_create(&b, "move_revert_intermediate", opts, + pool)); + + SVN_ERR(sbox_wc_mkdir(&b, "A")); + SVN_ERR(sbox_wc_mkdir(&b, "A/A")); + SVN_ERR(sbox_wc_mkdir(&b, "A/A/A")); + SVN_ERR(sbox_wc_mkdir(&b, "A/A/A/A")); + SVN_ERR(sbox_wc_mkdir(&b, "B")); + SVN_ERR(sbox_wc_mkdir(&b, "B/A")); + SVN_ERR(sbox_wc_mkdir(&b, "B/A/A")); + SVN_ERR(sbox_wc_mkdir(&b, "B/A/A/A")); + SVN_ERR(sbox_wc_mkdir(&b, "C")); + SVN_ERR(sbox_wc_mkdir(&b, "C/A")); + SVN_ERR(sbox_wc_mkdir(&b, "C/A/A")); + SVN_ERR(sbox_wc_mkdir(&b, "C/A/A/A")); + SVN_ERR(sbox_wc_commit(&b, "")); + + SVN_ERR(sbox_wc_move(&b, "A/A/A", "AAA_1")); + + SVN_ERR(sbox_wc_delete(&b, "A")); + SVN_ERR(sbox_wc_move(&b, "B", "A")); + + SVN_ERR(sbox_wc_move(&b, "A/A/A", "AAA_2")); + + SVN_ERR(sbox_wc_delete(&b, "A/A")); + SVN_ERR(sbox_wc_move(&b, "C/A", "A/A")); + + SVN_ERR(sbox_wc_move(&b, "A/A/A", "AAA_3")); + + /* Verify that the move is still recorded correctly */ + { + nodes_row_t nodes[] = { + + {0, "", "normal", 0, ""}, + + {1, "AAA_1", "normal", 1, "A/A/A", MOVED_HERE}, + {1, "AAA_1/A", "normal", 1, "A/A/A/A", MOVED_HERE}, + {1, "AAA_2", "normal", 1, "B/A/A", MOVED_HERE}, + {1, "AAA_2/A", "normal", 1, "B/A/A/A", MOVED_HERE}, + {1, "AAA_3", "normal", 1, "C/A/A", MOVED_HERE}, + {1, "AAA_3/A", "normal", 1, "C/A/A/A", MOVED_HERE}, + + {0, "A", "normal", 1, "A"}, + {0, "A/A", "normal", 1, "A/A"}, + {0, "A/A/A", "normal", 1, "A/A/A"}, + {0, "A/A/A/A", "normal", 1, "A/A/A/A"}, + + {1, "A", "normal", 1, "B", MOVED_HERE}, + {1, "A/A", "normal", 1, "B/A", MOVED_HERE}, + {1, "A/A/A", "normal", 1, "B/A/A", FALSE, "AAA_1", TRUE}, + {1, "A/A/A/A", "normal", 1, "B/A/A/A", MOVED_HERE}, + + {2, "A/A", "normal", 1, "C/A", MOVED_HERE}, + {2, "A/A/A", "normal", 1, "C/A/A", FALSE, "AAA_2", TRUE}, + {2, "A/A/A/A", "normal", 1, "C/A/A/A", MOVED_HERE}, + + {3, "A/A/A", "base-deleted", NO_COPY_FROM, "AAA_3"}, + {3, "A/A/A/A", "base-deleted", NO_COPY_FROM}, + + {0, "B", "normal", 1, "B"}, + {0, "B/A", "normal", 1, "B/A"}, + {0, "B/A/A", "normal", 1, "B/A/A"}, + {0, "B/A/A/A", "normal", 1, "B/A/A/A"}, + + {1, "B", "base-deleted", NO_COPY_FROM, "A"}, + {1, "B/A", "base-deleted", NO_COPY_FROM}, + {1, "B/A/A", "base-deleted", NO_COPY_FROM}, + {1, "B/A/A/A", "base-deleted", NO_COPY_FROM}, + + {0, "C", "normal", 1, "C"}, + {0, "C/A", "normal", 1, "C/A"}, + {0, "C/A/A", "normal", 1, "C/A/A"}, + {0, "C/A/A/A", "normal", 1, "C/A/A/A"}, + + {2, "C/A", "base-deleted", NO_COPY_FROM, "A/A"}, + {2, "C/A/A", "base-deleted", NO_COPY_FROM}, + {2, "C/A/A/A", "base-deleted", NO_COPY_FROM}, + + {0}, }; SVN_ERR(check_db_rows(&b, "", nodes)); } @@ -8443,6 +8583,7 @@ move_abspath_more_than_once(const svn_te {2, "C/A/A", "base-deleted", NO_COPY_FROM, "AAA_3"}, {2, "C/A/A/A", "base-deleted", NO_COPY_FROM}, + {0}, }; SVN_ERR(check_db_rows(&b, "", nodes)); } @@ -8610,7 +8751,9 @@ struct svn_test_descriptor_t test_funcs[ "copy mixed-rev with mods"), SVN_TEST_OPTS_PASS(move_child_to_parent_revert, "move child to parent and revert (issue 4436)"), - SVN_TEST_OPTS_XFAIL(move_abspath_more_than_once, - "move one abspath more than once"), + SVN_TEST_OPTS_XFAIL(move_delete_intermediate, + "move more than once, delete intermediate"), + SVN_TEST_OPTS_XFAIL(move_revert_intermediate, + "move more than once, revert intermediate"), SVN_TEST_NULL }; Modified: subversion/branches/invoke-diff-cmd-feature/tools/client-side/svn-bench/cl.h URL: http://svn.apache.org/viewvc/subversion/branches/invoke-diff-cmd-feature/tools/client-side/svn-bench/cl.h?rev=1533871&r1=1533870&r2=1533871&view=diff ============================================================================== --- subversion/branches/invoke-diff-cmd-feature/tools/client-side/svn-bench/cl.h (original) +++ subversion/branches/invoke-diff-cmd-feature/tools/client-side/svn-bench/cl.h Sun Oct 20 10:11:04 2013 @@ -90,6 +90,7 @@ typedef struct svn_cl__opt_state_t svn_boolean_t no_revprops; /* retrieve no revprops */ apr_hash_t *revprop_table; /* table of revision properties to get/set */ svn_boolean_t use_merge_history; /* use/display extra merge information */ + svn_boolean_t auto_moves; /* interpret unique DEL/ADD pairs as moves */ svn_boolean_t trust_server_cert; /* trust server SSL certs that would otherwise be rejected as "untrusted" */ } svn_cl__opt_state_t; @@ -107,7 +108,8 @@ svn_opt_subcommand_t svn_cl__help, svn_cl__null_export, svn_cl__null_list, - svn_cl__null_log; + svn_cl__null_log, + svn_cl__null_info; /* See definition in main.c for documentation. */ Modified: subversion/branches/invoke-diff-cmd-feature/tools/client-side/svn-bench/null-log-cmd.c URL: http://svn.apache.org/viewvc/subversion/branches/invoke-diff-cmd-feature/tools/client-side/svn-bench/null-log-cmd.c?rev=1533871&r1=1533870&r2=1533871&view=diff ============================================================================== --- subversion/branches/invoke-diff-cmd-feature/tools/client-side/svn-bench/null-log-cmd.c (original) +++ subversion/branches/invoke-diff-cmd-feature/tools/client-side/svn-bench/null-log-cmd.c Sun Oct 20 10:11:04 2013 @@ -140,6 +140,9 @@ svn_cl__null_log(apr_getopt_t *os, apr_array_header_t *revprops; svn_opt_revision_t target_peg_revision; const char *target_path_or_url; + svn_move_behavior_t move_behavior = opt_state->auto_moves + ? svn_move_behavior_auto_moves + : svn_move_behavior_explicit_moves; SVN_ERR(svn_cl__args_to_target_array_print_reserved(&targets, os, opt_state->targets, @@ -202,13 +205,14 @@ svn_cl__null_log(apr_getopt_t *os, APR_ARRAY_PUSH(revprops, const char *) = SVN_PROP_REVISION_DATE; if (!opt_state->quiet) APR_ARRAY_PUSH(revprops, const char *) = SVN_PROP_REVISION_LOG; - SVN_ERR(svn_client_log5(targets, + SVN_ERR(svn_client_log6(targets, &target_peg_revision, opt_state->revision_ranges, opt_state->limit, opt_state->verbose, opt_state->stop_on_copy, opt_state->use_merge_history, + move_behavior, revprops, log_entry_receiver, &lb, Modified: subversion/branches/invoke-diff-cmd-feature/tools/client-side/svn-bench/svn-bench.c URL: http://svn.apache.org/viewvc/subversion/branches/invoke-diff-cmd-feature/tools/client-side/svn-bench/svn-bench.c?rev=1533871&r1=1533870&r2=1533871&view=diff ============================================================================== --- subversion/branches/invoke-diff-cmd-feature/tools/client-side/svn-bench/svn-bench.c (original) +++ subversion/branches/invoke-diff-cmd-feature/tools/client-side/svn-bench/svn-bench.c Sun Oct 20 10:11:04 2013 @@ -66,7 +66,9 @@ typedef enum svn_cl__longopt_t { opt_with_revprop, opt_with_all_revprops, opt_with_no_revprops, - opt_trust_server_cert + opt_auto_moves, + opt_trust_server_cert, + opt_changelist } svn_cl__longopt_t; @@ -147,6 +149,10 @@ const apr_getopt_option_t svn_cl__option N_("set revision property ARG in new revision\n" " " "using the name[=value] format")}, + {"auto-moves", opt_auto_moves, 0, + N_("attempt to interpret matching unique DEL+ADD\n" + " " + "pairs as moves")}, {"use-merge-history", 'g', 0, N_("use/display additional information from merge\n" " " @@ -255,10 +261,20 @@ const svn_opt_subcommand_desc2_t svn_cl_ " behavior, which can be useful for determining branchpoints.\n"), {'r', 'q', 'v', 'g', 'c', opt_targets, opt_stop_on_copy, 'l', opt_with_all_revprops, opt_with_no_revprops, opt_with_revprop, - 'x',}, + opt_auto_moves, 'x',}, {{opt_with_revprop, N_("retrieve revision property ARG")}, {'c', N_("the change made in revision ARG")}} }, + { "null-info", svn_cl__null_info, {0}, N_ + ("Display information about a local or remote item.\n" + "usage: info [TARGET[@REV]...]\n" + "\n" + " Print information about each TARGET (default: '.').\n" + " TARGET may be either a working-copy path or URL. If specified, REV\n" + " determines in which revision the target is first looked up.\n"), + {'r', 'R', opt_depth, opt_targets, opt_changelist} + }, + { NULL, NULL, {0}, NULL, {0} } }; @@ -534,6 +550,9 @@ sub_main(int argc, const char *argv[], a TRUE, pool); } break; + case 'R': + opt_state.depth = svn_depth_infinity; + break; case 'N': descend = FALSE; break; @@ -618,6 +637,9 @@ sub_main(int argc, const char *argv[], a case 'g': opt_state.use_merge_history = TRUE; break; + case opt_auto_moves: + opt_state.auto_moves = TRUE; + break; default: /* Hmmm. Perhaps this would be a good place to squirrel away opts that commands like svn diff might need. Hmmm indeed. */
