You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by da...@apache.org on 2010/03/30 22:58:01 UTC
svn commit: r929279 [10/20] - in
/subversion/branches/svn-patch-improvements: ./ build/ac-macros/
build/generator/ build/generator/templates/ contrib/client-side/emacs/
notes/feedback/ notes/meetings/ notes/wc-ng/ subversion/
subversion/bindings/javahl...
Modified: subversion/branches/svn-patch-improvements/subversion/libsvn_ra_local/split_url.c
URL: http://svn.apache.org/viewvc/subversion/branches/svn-patch-improvements/subversion/libsvn_ra_local/split_url.c?rev=929279&r1=929278&r2=929279&view=diff
==============================================================================
--- subversion/branches/svn-patch-improvements/subversion/libsvn_ra_local/split_url.c (original)
+++ subversion/branches/svn-patch-improvements/subversion/libsvn_ra_local/split_url.c Tue Mar 30 20:57:53 2010
@@ -106,7 +106,7 @@ svn_ra_local__split_URL(svn_repos_t **re
char *dup_path = (char *)svn_path_uri_decode(path, pool);
if (!hostname && dup_path[1] && strchr(valid_drive_letters, dup_path[1])
&& (dup_path[2] == ':' || dup_path[2] == '|')
- && dup_path[3] == '/')
+ && (dup_path[3] == '/' || dup_path[3] == '\0'))
{
/* Skip the leading slash. */
++dup_path;
@@ -114,6 +114,19 @@ svn_ra_local__split_URL(svn_repos_t **re
++path;
if (dup_path[1] == '|')
dup_path[1] = ':';
+
+ if (dup_path[3] == '\0')
+ {
+ /* A valid dirent for the driveroot must be like "C:/" instead of
+ just "C:" or svn_dirent_join() will use the current directory
+ on the drive instead */
+
+ char *new_path = apr_pcalloc(pool, 4);
+ new_path[0] = dup_path[0];
+ new_path[1] = ':';
+ new_path[2] = '/';
+ new_path[3] = '\0';
+ }
}
if (hostname)
/* We still know that the path starts with a slash. */
Modified: subversion/branches/svn-patch-improvements/subversion/libsvn_ra_neon/get_locations.c
URL: http://svn.apache.org/viewvc/subversion/branches/svn-patch-improvements/subversion/libsvn_ra_neon/get_locations.c?rev=929279&r1=929278&r2=929279&view=diff
==============================================================================
--- subversion/branches/svn-patch-improvements/subversion/libsvn_ra_neon/get_locations.c (original)
+++ subversion/branches/svn-patch-improvements/subversion/libsvn_ra_neon/get_locations.c Tue Mar 30 20:57:53 2010
@@ -122,7 +122,7 @@ svn_ra_neon__get_locations(svn_ra_sessio
apr_hash_t **locations,
const char *relative_path,
svn_revnum_t peg_revision,
- apr_array_header_t *location_revisions,
+ const apr_array_header_t *location_revisions,
apr_pool_t *pool)
{
svn_ra_neon__session_t *ras = session->priv;
Modified: subversion/branches/svn-patch-improvements/subversion/libsvn_ra_neon/log.c
URL: http://svn.apache.org/viewvc/subversion/branches/svn-patch-improvements/subversion/libsvn_ra_neon/log.c?rev=929279&r1=929278&r2=929279&view=diff
==============================================================================
--- subversion/branches/svn-patch-improvements/subversion/libsvn_ra_neon/log.c (original)
+++ subversion/branches/svn-patch-improvements/subversion/libsvn_ra_neon/log.c Tue Mar 30 20:57:53 2010
@@ -436,9 +436,9 @@ svn_error_t * svn_ra_neon__get_log(svn_r
want_custom_revprops = TRUE;
}
if (revprops->nelts == 0)
- {
- svn_stringbuf_appendcstr(request_body, "<S:no-revprops/>");
- }
+ {
+ svn_stringbuf_appendcstr(request_body, "<S:no-revprops/>");
+ }
}
else
{
Modified: subversion/branches/svn-patch-improvements/subversion/libsvn_ra_neon/props.c
URL: http://svn.apache.org/viewvc/subversion/branches/svn-patch-improvements/subversion/libsvn_ra_neon/props.c?rev=929279&r1=929278&r2=929279&view=diff
==============================================================================
--- subversion/branches/svn-patch-improvements/subversion/libsvn_ra_neon/props.c (original)
+++ subversion/branches/svn-patch-improvements/subversion/libsvn_ra_neon/props.c Tue Mar 30 20:57:53 2010
@@ -1091,7 +1091,7 @@ svn_error_t *
svn_ra_neon__do_proppatch(svn_ra_neon__session_t *ras,
const char *url,
apr_hash_t *prop_changes,
- apr_array_header_t *prop_deletes,
+ const apr_array_header_t *prop_deletes,
apr_hash_t *extra_headers,
apr_pool_t *pool)
{
Modified: subversion/branches/svn-patch-improvements/subversion/libsvn_ra_neon/ra_neon.h
URL: http://svn.apache.org/viewvc/subversion/branches/svn-patch-improvements/subversion/libsvn_ra_neon/ra_neon.h?rev=929279&r1=929278&r2=929279&view=diff
==============================================================================
--- subversion/branches/svn-patch-improvements/subversion/libsvn_ra_neon/ra_neon.h (original)
+++ subversion/branches/svn-patch-improvements/subversion/libsvn_ra_neon/ra_neon.h Tue Mar 30 20:57:53 2010
@@ -82,7 +82,7 @@ typedef struct {
-typedef struct {
+typedef struct svn_ra_neon__session_t {
apr_pool_t *pool;
svn_stringbuf_t *url; /* original, unparsed session url */
ne_uri root; /* parsed version of above */
@@ -113,6 +113,9 @@ typedef struct {
svn_ra_progress_notify_func_t progress_func;
void *progress_baton;
+ apr_off_t total_progress; /* Total number of bytes sent in this
+ session with a -1 total marker */
+
/* Maps SVN_RA_CAPABILITY_foo keys to "yes" or "no" values.
If a capability is not yet discovered, it is absent from the table.
The table itself is allocated in the svn_ra_neon__session_t's pool;
@@ -567,7 +570,7 @@ svn_error_t *svn_ra_neon__get_vcc(const
svn_error_t *svn_ra_neon__do_proppatch(svn_ra_neon__session_t *ras,
const char *url,
apr_hash_t *prop_changes,
- apr_array_header_t *prop_deletes,
+ const apr_array_header_t *prop_deletes,
apr_hash_t *extra_headers,
apr_pool_t *pool);
@@ -989,7 +992,7 @@ svn_ra_neon__get_locations(svn_ra_sessio
apr_hash_t **locations,
const char *path,
svn_revnum_t peg_revision,
- apr_array_header_t *location_revisions,
+ const apr_array_header_t *location_revisions,
apr_pool_t *pool);
@@ -1090,7 +1093,7 @@ svn_ra_neon__has_capability(svn_ra_sessi
If the server is kind enough to tell us the current youngest
revision of the target repository, set *YOUNGEST_REV to that value;
set it to SVN_INVALID_REVNUM otherwise.
-
+
NOTE: This function also expects the server to announce the
activity collection. */
svn_error_t *
Modified: subversion/branches/svn-patch-improvements/subversion/libsvn_ra_neon/session.c
URL: http://svn.apache.org/viewvc/subversion/branches/svn-patch-improvements/subversion/libsvn_ra_neon/session.c?rev=929279&r1=929278&r2=929279&view=diff
==============================================================================
--- subversion/branches/svn-patch-improvements/subversion/libsvn_ra_neon/session.c (original)
+++ subversion/branches/svn-patch-improvements/subversion/libsvn_ra_neon/session.c Tue Mar 30 20:57:53 2010
@@ -680,8 +680,8 @@ ra_neon_get_schemes(apr_pool_t *pool)
typedef struct neonprogress_baton_t
{
- svn_ra_progress_notify_func_t progress_func;
- void *progress_baton;
+ svn_ra_neon__session_t *ras;
+ apr_off_t last_progress;
apr_pool_t *pool;
} neonprogress_baton_t;
@@ -692,12 +692,36 @@ ra_neon_neonprogress(void *baton, ne_off
ra_neon_neonprogress(void *baton, off_t progress, off_t total)
#endif /* SVN_NEON_0_27 */
{
- const neonprogress_baton_t *neonprogress_baton = baton;
- if (neonprogress_baton->progress_func)
+ neonprogress_baton_t *pb = baton;
+ svn_ra_neon__session_t *ras = pb->ras;
+
+ if (ras->progress_func)
{
- neonprogress_baton->progress_func(progress, total,
- neonprogress_baton->progress_baton,
- neonprogress_baton->pool);
+ if (total < 0)
+ {
+ /* Neon sends the total number of bytes sent for this specific
+ session and there are two sessions active at once.
+
+ For this case we combine the totals to allow clients to provide
+ a better progress indicator. */
+
+ if (progress >= pb->last_progress)
+ ras->total_progress += (progress - pb->last_progress);
+ else
+ /* Session total has been reset. A new stream started */
+ ras->total_progress += pb->last_progress;
+
+ pb->last_progress = progress;
+
+ ras->progress_func(ras->total_progress, -1, ras->progress_baton,
+ pb->pool);
+ }
+ else
+ {
+ /* Neon provides total bytes to receive information. Pass literaly
+ to allow providing a percentage. */
+ ras->progress_func(progress, total, ras->progress_baton, pb->pool);
+ }
}
}
@@ -761,15 +785,14 @@ svn_ra_neon__open(svn_ra_session_t *sess
svn_boolean_t compression;
svn_config_t *cfg, *cfg_client;
const char *server_group;
- char *itr;
unsigned int neon_auth_types = 0;
const char *pkcs11_provider;
- neonprogress_baton_t *neonprogress_baton =
- apr_pcalloc(pool, sizeof(*neonprogress_baton));
const char *useragent = NULL;
const char *client_string = NULL;
svn_revnum_t ignored_revnum;
+ SVN_ERR_ASSERT(svn_uri_is_canonical(repos_URL, pool));
+
if (callbacks->get_client_string)
callbacks->get_client_string(callback_baton, &client_string, pool);
@@ -791,16 +814,7 @@ svn_ra_neon__open(svn_ra_session_t *sess
/* we want to know if the repository is actually somewhere else */
/* ### not yet: http_redirect_register(sess, ... ); */
- /* HACK! Neon uses strcmp when checking for https, but RFC 2396 says
- * we should be using case-insensitive comparisons when checking for
- * URI schemes. To allow our users to use WeIrd CasE HttPS we force
- * the scheme to lower case before we pass it on to Neon, otherwise we
- * would crash later on when we assume Neon has set up its https stuff
- * but it really didn't. */
- for (itr = uri->scheme; *itr; ++itr)
- *itr = tolower(*itr);
-
- is_ssl_session = (svn_cstring_casecmp(uri->scheme, "https") == 0);
+ is_ssl_session = (strcmp(uri->scheme, "https") == 0);
if (is_ssl_session)
{
if (ne_has_support(NE_FEATURE_SSL) == 0)
@@ -975,10 +989,10 @@ svn_ra_neon__open(svn_ra_session_t *sess
ca_cert = ne_ssl_cert_read(file);
if (ca_cert == NULL)
{
- return svn_error_createf
- (SVN_ERR_BAD_CONFIG_VALUE, NULL,
- _("Invalid config: unable to load certificate file '%s'"),
- svn_path_local_style(file, pool));
+ return svn_error_createf(
+ SVN_ERR_BAD_CONFIG_VALUE, NULL,
+ _("Invalid config: unable to load certificate file '%s'"),
+ svn_dirent_local_style(file, pool));
}
ne_ssl_trust_cert(sess, ca_cert);
ne_ssl_trust_cert(sess2, ca_cert);
@@ -1040,11 +1054,22 @@ svn_ra_neon__open(svn_ra_session_t *sess
ne_ssl_trust_default_ca(sess2);
}
}
- neonprogress_baton->pool = pool;
- neonprogress_baton->progress_baton = callbacks->progress_baton;
- neonprogress_baton->progress_func = callbacks->progress_func;
- ne_set_progress(sess, ra_neon_neonprogress, neonprogress_baton);
- ne_set_progress(sess2, ra_neon_neonprogress, neonprogress_baton);
+
+ if (ras->progress_func)
+ {
+ neonprogress_baton_t *progress1 = apr_pcalloc(pool, sizeof(*progress1));
+ neonprogress_baton_t *progress2 = apr_pcalloc(pool, sizeof(*progress2));
+
+ progress1->pool = pool;
+ progress1->ras = ras;
+ progress1->last_progress = 0;
+
+ *progress2 = *progress1;
+
+ ne_set_progress(sess, ra_neon_neonprogress, progress1);
+ ne_set_progress(sess2, ra_neon_neonprogress, progress2);
+ }
+
session->priv = ras;
return svn_ra_neon__exchange_capabilities(ras, &ignored_revnum, pool);
Modified: subversion/branches/svn-patch-improvements/subversion/libsvn_ra_serf/auth_kerb.c
URL: http://svn.apache.org/viewvc/subversion/branches/svn-patch-improvements/subversion/libsvn_ra_serf/auth_kerb.c?rev=929279&r1=929278&r2=929279&view=diff
==============================================================================
--- subversion/branches/svn-patch-improvements/subversion/libsvn_ra_serf/auth_kerb.c (original)
+++ subversion/branches/svn-patch-improvements/subversion/libsvn_ra_serf/auth_kerb.c Tue Mar 30 20:57:53 2010
@@ -199,19 +199,19 @@ gss_api_get_credentials(char *token, apr
/* Establish a security context to the server. */
maj_stat = gss_init_sec_context
- (&min_stat, /* minor_status */
- GSS_C_NO_CREDENTIAL, /* XXXXX claimant_cred_handle */
- &gss_api_ctx->gss_ctx, /* gssapi context handle */
- host_gss_name, /* HTTP@server name */
- gss_api_ctx->mech, /* mech_type (0 ininitially */
+ (&min_stat, /* minor_status */
+ GSS_C_NO_CREDENTIAL, /* XXXXX claimant_cred_handle */
+ &gss_api_ctx->gss_ctx, /* gssapi context handle */
+ host_gss_name, /* HTTP@server name */
+ gss_api_ctx->mech, /* mech_type (0 ininitially */
GSS_C_MUTUAL_FLAG, /* ensure the peer authenticates itself */
- 0, /* default validity period */
+ 0, /* default validity period */
GSS_C_NO_CHANNEL_BINDINGS, /* do not use channel bindings */
&input_buf, /* server token, initially empty */
&gss_api_ctx->mech, /* actual mech type */
- &output_buf, /* output_token */
- NULL, /* ret_flags */
- NULL /* not interested in remaining validity */
+ &output_buf, /* output_token */
+ NULL, /* ret_flags */
+ NULL /* not interested in remaining validity */
);
if(GSS_ERROR(maj_stat))
Modified: subversion/branches/svn-patch-improvements/subversion/libsvn_ra_serf/auth_kerb.h
URL: http://svn.apache.org/viewvc/subversion/branches/svn-patch-improvements/subversion/libsvn_ra_serf/auth_kerb.h?rev=929279&r1=929278&r2=929279&view=diff
==============================================================================
--- subversion/branches/svn-patch-improvements/subversion/libsvn_ra_serf/auth_kerb.h (original)
+++ subversion/branches/svn-patch-improvements/subversion/libsvn_ra_serf/auth_kerb.h Tue Mar 30 20:57:53 2010
@@ -35,25 +35,25 @@ extern "C" {
based on the response of the server. */
svn_error_t *
svn_ra_serf__handle_kerb_auth(svn_ra_serf__handler_t *ctx,
- serf_request_t *request,
- serf_bucket_t *response,
- const char *auth_hdr,
- const char *auth_attr,
- apr_pool_t *pool);
+ serf_request_t *request,
+ serf_bucket_t *response,
+ const char *auth_hdr,
+ const char *auth_attr,
+ apr_pool_t *pool);
/* Initializes a new connection based on the info stored in the session
object. */
svn_error_t *
svn_ra_serf__init_kerb_connection(svn_ra_serf__session_t *session,
- svn_ra_serf__connection_t *conn,
- apr_pool_t *pool);
+ svn_ra_serf__connection_t *conn,
+ apr_pool_t *pool);
svn_error_t *
svn_ra_serf__setup_request_kerb_auth(svn_ra_serf__connection_t *conn,
- const char *method,
- const char *uri,
- serf_bucket_t *hdrs_bkt);
+ const char *method,
+ const char *uri,
+ serf_bucket_t *hdrs_bkt);
svn_error_t *
svn_ra_serf__validate_response_kerb_auth(svn_ra_serf__handler_t *ctx,
Modified: subversion/branches/svn-patch-improvements/subversion/libsvn_ra_serf/getlocations.c
URL: http://svn.apache.org/viewvc/subversion/branches/svn-patch-improvements/subversion/libsvn_ra_serf/getlocations.c?rev=929279&r1=929278&r2=929279&view=diff
==============================================================================
--- subversion/branches/svn-patch-improvements/subversion/libsvn_ra_serf/getlocations.c (original)
+++ subversion/branches/svn-patch-improvements/subversion/libsvn_ra_serf/getlocations.c Tue Mar 30 20:57:53 2010
@@ -180,7 +180,7 @@ svn_ra_serf__get_locations(svn_ra_sessio
apr_hash_t **locations,
const char *path,
svn_revnum_t peg_revision,
- apr_array_header_t *location_revisions,
+ const apr_array_header_t *location_revisions,
apr_pool_t *pool)
{
loc_context_t *loc_ctx;
Modified: subversion/branches/svn-patch-improvements/subversion/libsvn_ra_serf/ra_serf.h
URL: http://svn.apache.org/viewvc/subversion/branches/svn-patch-improvements/subversion/libsvn_ra_serf/ra_serf.h?rev=929279&r1=929278&r2=929279&view=diff
==============================================================================
--- subversion/branches/svn-patch-improvements/subversion/libsvn_ra_serf/ra_serf.h (original)
+++ subversion/branches/svn-patch-improvements/subversion/libsvn_ra_serf/ra_serf.h Tue Mar 30 20:57:53 2010
@@ -1213,7 +1213,7 @@ svn_ra_serf__get_locations(svn_ra_sessio
apr_hash_t **locations,
const char *path,
svn_revnum_t peg_revision,
- apr_array_header_t *location_revisions,
+ const apr_array_header_t *location_revisions,
apr_pool_t *pool);
svn_error_t *
Modified: subversion/branches/svn-patch-improvements/subversion/libsvn_ra_serf/update.c
URL: http://svn.apache.org/viewvc/subversion/branches/svn-patch-improvements/subversion/libsvn_ra_serf/update.c?rev=929279&r1=929278&r2=929279&view=diff
==============================================================================
--- subversion/branches/svn-patch-improvements/subversion/libsvn_ra_serf/update.c (original)
+++ subversion/branches/svn-patch-improvements/subversion/libsvn_ra_serf/update.c Tue Mar 30 20:57:53 2010
@@ -1261,7 +1261,7 @@ start_report(svn_ra_serf__xml_parser_t *
info = push_state(parser, ctx, OPEN_DIR);
- info->base_rev = apr_atoi64(rev);
+ info->base_rev = SVN_STR_TO_REV(rev);
info->dir->base_rev = info->base_rev;
info->dir->target_rev = ctx->target_rev;
info->fetch_props = TRUE;
@@ -1308,7 +1308,7 @@ start_report(svn_ra_serf__xml_parser_t *
dir = info->dir;
- info->base_rev = apr_atoi64(rev);
+ info->base_rev = SVN_STR_TO_REV(rev);
dir->base_rev = info->base_rev;
dir->target_rev = ctx->target_rev;
@@ -1356,7 +1356,7 @@ start_report(svn_ra_serf__xml_parser_t *
info->name = dir->name;
info->copyfrom_path = cf ? apr_pstrdup(info->pool, cf) : NULL;
- info->copyfrom_rev = cr ? apr_atoi64(cr) : SVN_INVALID_REVNUM;
+ info->copyfrom_rev = cr ? SVN_STR_TO_REV(cr) : SVN_INVALID_REVNUM;
/* Mark that we don't have a base. */
info->base_rev = SVN_INVALID_REVNUM;
@@ -1390,7 +1390,7 @@ start_report(svn_ra_serf__xml_parser_t *
info = push_state(parser, ctx, OPEN_FILE);
- info->base_rev = apr_atoi64(rev);
+ info->base_rev = SVN_STR_TO_REV(rev);
info->target_rev = ctx->target_rev;
info->fetch_props = FALSE;
@@ -1425,7 +1425,7 @@ start_report(svn_ra_serf__xml_parser_t *
info->name = NULL;
info->copyfrom_path = cf ? apr_pstrdup(info->pool, cf) : NULL;
- info->copyfrom_rev = cr ? apr_atoi64(cr) : SVN_INVALID_REVNUM;
+ info->copyfrom_rev = cr ? SVN_STR_TO_REV(cr) : SVN_INVALID_REVNUM;
}
else if ((state == OPEN_DIR || state == ADD_DIR) &&
strcmp(name.name, "delete-entry") == 0)
Modified: subversion/branches/svn-patch-improvements/subversion/libsvn_ra_svn/client.c
URL: http://svn.apache.org/viewvc/subversion/branches/svn-patch-improvements/subversion/libsvn_ra_svn/client.c?rev=929279&r1=929278&r2=929279&view=diff
==============================================================================
--- subversion/branches/svn-patch-improvements/subversion/libsvn_ra_svn/client.c (original)
+++ subversion/branches/svn-patch-improvements/subversion/libsvn_ra_svn/client.c Tue Mar 30 20:57:53 2010
@@ -181,7 +181,7 @@ static svn_error_t *make_connection(cons
/* Set *DIFFS to an array of svn_prop_t, allocated in POOL, based on the
property diffs in LIST, received from the server. */
-static svn_error_t *parse_prop_diffs(apr_array_header_t *list,
+static svn_error_t *parse_prop_diffs(const apr_array_header_t *list,
apr_pool_t *pool,
apr_array_header_t **diffs)
{
@@ -206,7 +206,7 @@ static svn_error_t *parse_prop_diffs(apr
/* Parse a lockdesc, provided in LIST as specified by the protocol into
LOCK, allocated in POOL. */
-static svn_error_t *parse_lock(apr_array_header_t *list, apr_pool_t *pool,
+static svn_error_t *parse_lock(const apr_array_header_t *list, apr_pool_t *pool,
svn_lock_t **lock)
{
const char *cdate, *edate;
@@ -463,6 +463,7 @@ static svn_error_t *make_tunnel(const ch
apr_status_t status;
apr_proc_t *proc;
apr_procattr_t *attr;
+ svn_error_t *err;
status = apr_procattr_create(&attr, pool);
if (status == APR_SUCCESS)
@@ -491,13 +492,13 @@ static svn_error_t *make_tunnel(const ch
* the different opinions on this issue.
*
* On Win32, APR does not support KILL_ONLY_ONCE. It only has
- * KILL_ALWAYS and KILL_NEVER. Other modes are converted to
+ * KILL_ALWAYS and KILL_NEVER. Other modes are converted to
* KILL_ALWAYS, which immediately calls TerminateProcess().
* This instantly kills the tunnel, leaving sshd and svnserve
* on a remote machine running indefinitely. These processes
* accumulate. The problem is most often seen with a fast client
* machine and a modest internet connection, as the tunnel
- * is killed before being able to gracefully complete the
+ * is killed before being able to gracefully complete the
* session. In that case, svn is unusable 100% of the time on
* the windows machine. Thus, on Win32, we use KILL_NEVER and
* take the lesser of two evils.
@@ -516,7 +517,14 @@ static svn_error_t *make_tunnel(const ch
/* Guard against dotfile output to stdout on the server. */
*conn = svn_ra_svn_create_conn(NULL, proc->out, proc->in, pool);
- SVN_ERR(svn_ra_svn_skip_leading_garbage(*conn, pool));
+ err = svn_ra_svn_skip_leading_garbage(*conn, pool);
+ if (err)
+ return svn_error_quick_wrap(
+ err,
+ _("To better debug SSH connection problems, remove the -q "
+ "option from 'ssh' in the [tunnels] section of your "
+ "Subversion configuration file."));
+
return SVN_NO_ERROR;
}
@@ -1558,7 +1566,7 @@ static svn_error_t *ra_svn_get_locations
apr_hash_t **locations,
const char *path,
svn_revnum_t peg_revision,
- apr_array_header_t *location_revisions,
+ const apr_array_header_t *location_revisions,
apr_pool_t *pool)
{
svn_ra_svn__session_baton_t *sess_baton = session->priv;
Modified: subversion/branches/svn-patch-improvements/subversion/libsvn_ra_svn/cyrus_auth.c
URL: http://svn.apache.org/viewvc/subversion/branches/svn-patch-improvements/subversion/libsvn_ra_svn/cyrus_auth.c?rev=929279&r1=929278&r2=929279&view=diff
==============================================================================
--- subversion/branches/svn-patch-improvements/subversion/libsvn_ra_svn/cyrus_auth.c (original)
+++ subversion/branches/svn-patch-improvements/subversion/libsvn_ra_svn/cyrus_auth.c Tue Mar 30 20:57:53 2010
@@ -726,7 +726,7 @@ svn_error_t *svn_ra_svn__get_addresses(c
svn_error_t *
svn_ra_svn__do_cyrus_auth(svn_ra_svn__session_baton_t *sess,
- apr_array_header_t *mechlist,
+ const apr_array_header_t *mechlist,
const char *realm, apr_pool_t *pool)
{
apr_pool_t *subpool;
Modified: subversion/branches/svn-patch-improvements/subversion/libsvn_ra_svn/editorp.c
URL: http://svn.apache.org/viewvc/subversion/branches/svn-patch-improvements/subversion/libsvn_ra_svn/editorp.c?rev=929279&r1=929278&r2=929279&view=diff
==============================================================================
--- subversion/branches/svn-patch-improvements/subversion/libsvn_ra_svn/editorp.c (original)
+++ subversion/branches/svn-patch-improvements/subversion/libsvn_ra_svn/editorp.c Tue Mar 30 20:57:53 2010
@@ -461,7 +461,7 @@ static svn_error_t *lookup_token(ra_svn_
static svn_error_t *ra_svn_handle_target_rev(svn_ra_svn_conn_t *conn,
apr_pool_t *pool,
- apr_array_header_t *params,
+ const apr_array_header_t *params,
ra_svn_driver_state_t *ds)
{
svn_revnum_t rev;
@@ -473,7 +473,7 @@ static svn_error_t *ra_svn_handle_target
static svn_error_t *ra_svn_handle_open_root(svn_ra_svn_conn_t *conn,
apr_pool_t *pool,
- apr_array_header_t *params,
+ const apr_array_header_t *params,
ra_svn_driver_state_t *ds)
{
svn_revnum_t rev;
@@ -491,7 +491,7 @@ static svn_error_t *ra_svn_handle_open_r
static svn_error_t *ra_svn_handle_delete_entry(svn_ra_svn_conn_t *conn,
apr_pool_t *pool,
- apr_array_header_t *params,
+ const apr_array_header_t *params,
ra_svn_driver_state_t *ds)
{
const char *path, *token;
@@ -507,7 +507,7 @@ static svn_error_t *ra_svn_handle_delete
static svn_error_t *ra_svn_handle_add_dir(svn_ra_svn_conn_t *conn,
apr_pool_t *pool,
- apr_array_header_t *params,
+ const apr_array_header_t *params,
ra_svn_driver_state_t *ds)
{
const char *path, *token, *child_token, *copy_path;
@@ -531,7 +531,7 @@ static svn_error_t *ra_svn_handle_add_di
static svn_error_t *ra_svn_handle_open_dir(svn_ra_svn_conn_t *conn,
apr_pool_t *pool,
- apr_array_header_t *params,
+ const apr_array_header_t *params,
ra_svn_driver_state_t *ds)
{
const char *path, *token, *child_token;
@@ -553,7 +553,7 @@ static svn_error_t *ra_svn_handle_open_d
static svn_error_t *ra_svn_handle_change_dir_prop(svn_ra_svn_conn_t *conn,
apr_pool_t *pool,
- apr_array_header_t *params,
+ const apr_array_header_t *params,
ra_svn_driver_state_t *ds)
{
const char *token, *name;
@@ -570,7 +570,7 @@ static svn_error_t *ra_svn_handle_change
static svn_error_t *ra_svn_handle_close_dir(svn_ra_svn_conn_t *conn,
apr_pool_t *pool,
- apr_array_header_t *params,
+ const apr_array_header_t *params,
ra_svn_driver_state_t *ds)
{
const char *token;
@@ -589,7 +589,7 @@ static svn_error_t *ra_svn_handle_close_
static svn_error_t *ra_svn_handle_absent_dir(svn_ra_svn_conn_t *conn,
apr_pool_t *pool,
- apr_array_header_t *params,
+ const apr_array_header_t *params,
ra_svn_driver_state_t *ds)
{
const char *path;
@@ -607,7 +607,7 @@ static svn_error_t *ra_svn_handle_absent
static svn_error_t *ra_svn_handle_add_file(svn_ra_svn_conn_t *conn,
apr_pool_t *pool,
- apr_array_header_t *params,
+ const apr_array_header_t *params,
ra_svn_driver_state_t *ds)
{
const char *path, *token, *file_token, *copy_path;
@@ -629,7 +629,7 @@ static svn_error_t *ra_svn_handle_add_fi
static svn_error_t *ra_svn_handle_open_file(svn_ra_svn_conn_t *conn,
apr_pool_t *pool,
- apr_array_header_t *params,
+ const apr_array_header_t *params,
ra_svn_driver_state_t *ds)
{
const char *path, *token, *file_token;
@@ -649,7 +649,7 @@ static svn_error_t *ra_svn_handle_open_f
static svn_error_t *ra_svn_handle_apply_textdelta(svn_ra_svn_conn_t *conn,
apr_pool_t *pool,
- apr_array_header_t *params,
+ const apr_array_header_t *params,
ra_svn_driver_state_t *ds)
{
const char *token;
@@ -674,7 +674,7 @@ static svn_error_t *ra_svn_handle_apply_
static svn_error_t *ra_svn_handle_textdelta_chunk(svn_ra_svn_conn_t *conn,
apr_pool_t *pool,
- apr_array_header_t *params,
+ const apr_array_header_t *params,
ra_svn_driver_state_t *ds)
{
const char *token;
@@ -693,7 +693,7 @@ static svn_error_t *ra_svn_handle_textde
static svn_error_t *ra_svn_handle_textdelta_end(svn_ra_svn_conn_t *conn,
apr_pool_t *pool,
- apr_array_header_t *params,
+ const apr_array_header_t *params,
ra_svn_driver_state_t *ds)
{
const char *token;
@@ -713,7 +713,7 @@ static svn_error_t *ra_svn_handle_textde
static svn_error_t *ra_svn_handle_change_file_prop(svn_ra_svn_conn_t *conn,
apr_pool_t *pool,
- apr_array_header_t *params,
+ const apr_array_header_t *params,
ra_svn_driver_state_t *ds)
{
const char *token, *name;
@@ -729,7 +729,7 @@ static svn_error_t *ra_svn_handle_change
static svn_error_t *ra_svn_handle_close_file(svn_ra_svn_conn_t *conn,
apr_pool_t *pool,
- apr_array_header_t *params,
+ const apr_array_header_t *params,
ra_svn_driver_state_t *ds)
{
const char *token;
@@ -751,7 +751,7 @@ static svn_error_t *ra_svn_handle_close_
static svn_error_t *ra_svn_handle_absent_file(svn_ra_svn_conn_t *conn,
apr_pool_t *pool,
- apr_array_header_t *params,
+ const apr_array_header_t *params,
ra_svn_driver_state_t *ds)
{
const char *path;
@@ -769,7 +769,7 @@ static svn_error_t *ra_svn_handle_absent
static svn_error_t *ra_svn_handle_close_edit(svn_ra_svn_conn_t *conn,
apr_pool_t *pool,
- apr_array_header_t *params,
+ const apr_array_header_t *params,
ra_svn_driver_state_t *ds)
{
SVN_CMD_ERR(ds->editor->close_edit(ds->edit_baton, pool));
@@ -781,7 +781,7 @@ static svn_error_t *ra_svn_handle_close_
static svn_error_t *ra_svn_handle_abort_edit(svn_ra_svn_conn_t *conn,
apr_pool_t *pool,
- apr_array_header_t *params,
+ const apr_array_header_t *params,
ra_svn_driver_state_t *ds)
{
ds->done = TRUE;
@@ -793,7 +793,7 @@ static svn_error_t *ra_svn_handle_abort_
static svn_error_t *ra_svn_handle_finish_replay(svn_ra_svn_conn_t *conn,
apr_pool_t *pool,
- apr_array_header_t *params,
+ const apr_array_header_t *params,
ra_svn_driver_state_t *ds)
{
if (!ds->for_replay)
@@ -809,7 +809,7 @@ static svn_error_t *ra_svn_handle_finish
static const struct {
const char *cmd;
svn_error_t *(*handler)(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
- apr_array_header_t *params,
+ const apr_array_header_t *params,
ra_svn_driver_state_t *ds);
} ra_svn_edit_cmds[] = {
{ "target-rev", ra_svn_handle_target_rev },
Modified: subversion/branches/svn-patch-improvements/subversion/libsvn_ra_svn/internal_auth.c
URL: http://svn.apache.org/viewvc/subversion/branches/svn-patch-improvements/subversion/libsvn_ra_svn/internal_auth.c?rev=929279&r1=929278&r2=929279&view=diff
==============================================================================
--- subversion/branches/svn-patch-improvements/subversion/libsvn_ra_svn/internal_auth.c (original)
+++ subversion/branches/svn-patch-improvements/subversion/libsvn_ra_svn/internal_auth.c Tue Mar 30 20:57:53 2010
@@ -37,7 +37,7 @@
#include "ra_svn.h"
-svn_boolean_t svn_ra_svn__find_mech(apr_array_header_t *mechlist,
+svn_boolean_t svn_ra_svn__find_mech(const apr_array_header_t *mechlist,
const char *mech)
{
int i;
@@ -69,7 +69,7 @@ static svn_error_t *read_success(svn_ra_
svn_error_t *
svn_ra_svn__do_internal_auth(svn_ra_svn__session_baton_t *sess,
- apr_array_header_t *mechlist,
+ const apr_array_header_t *mechlist,
const char *realm, apr_pool_t *pool)
{
svn_ra_svn_conn_t *conn = sess->conn;
Modified: subversion/branches/svn-patch-improvements/subversion/libsvn_ra_svn/marshal.c
URL: http://svn.apache.org/viewvc/subversion/branches/svn-patch-improvements/subversion/libsvn_ra_svn/marshal.c?rev=929279&r1=929278&r2=929279&view=diff
==============================================================================
--- subversion/branches/svn-patch-improvements/subversion/libsvn_ra_svn/marshal.c (original)
+++ subversion/branches/svn-patch-improvements/subversion/libsvn_ra_svn/marshal.c Tue Mar 30 20:57:53 2010
@@ -84,7 +84,7 @@ svn_ra_svn_conn_t *svn_ra_svn_create_con
}
svn_error_t *svn_ra_svn_set_capabilities(svn_ra_svn_conn_t *conn,
- apr_array_header_t *list)
+ const apr_array_header_t *list)
{
int i;
svn_ra_svn_item_t *item;
@@ -679,7 +679,7 @@ svn_error_t *svn_ra_svn_skip_leading_gar
/* Parse a tuple of svn_ra_svn_item_t *'s. Advance *FMT to the end of the
* tuple specification and advance AP by the corresponding arguments. */
-static svn_error_t *vparse_tuple(apr_array_header_t *items, apr_pool_t *pool,
+static svn_error_t *vparse_tuple(const apr_array_header_t *items, apr_pool_t *pool,
const char **fmt, va_list *ap)
{
int count, nesting_level;
@@ -775,7 +775,7 @@ static svn_error_t *vparse_tuple(apr_arr
return SVN_NO_ERROR;
}
-svn_error_t *svn_ra_svn_parse_tuple(apr_array_header_t *list,
+svn_error_t *svn_ra_svn_parse_tuple(const apr_array_header_t *list,
apr_pool_t *pool,
const char *fmt, ...)
{
@@ -805,7 +805,7 @@ svn_error_t *svn_ra_svn_read_tuple(svn_r
return err;
}
-svn_error_t *svn_ra_svn_parse_proplist(apr_array_header_t *list,
+svn_error_t *svn_ra_svn_parse_proplist(const apr_array_header_t *list,
apr_pool_t *pool,
apr_hash_t **props)
{
@@ -831,7 +831,7 @@ svn_error_t *svn_ra_svn_parse_proplist(a
/* --- READING AND WRITING COMMANDS AND RESPONSES --- */
-svn_error_t *svn_ra_svn__handle_failure_status(apr_array_header_t *params,
+svn_error_t *svn_ra_svn__handle_failure_status(const apr_array_header_t *params,
apr_pool_t *pool)
{
const char *message, *file;
Modified: subversion/branches/svn-patch-improvements/subversion/libsvn_ra_svn/ra_svn.h
URL: http://svn.apache.org/viewvc/subversion/branches/svn-patch-improvements/subversion/libsvn_ra_svn/ra_svn.h?rev=929279&r1=929278&r2=929279&view=diff
==============================================================================
--- subversion/branches/svn-patch-improvements/subversion/libsvn_ra_svn/ra_svn.h (original)
+++ subversion/branches/svn-patch-improvements/subversion/libsvn_ra_svn/ra_svn.h Tue Mar 30 20:57:53 2010
@@ -126,7 +126,7 @@ svn_error_t *svn_ra_svn__cram_client(svn
* command response indicating failure). The error chain will be
* in the same order as the errors indicated in @a params. Use
* @a pool for temporary allocations. */
-svn_error_t *svn_ra_svn__handle_failure_status(apr_array_header_t *params,
+svn_error_t *svn_ra_svn__handle_failure_status(const apr_array_header_t *params,
apr_pool_t *pool);
/* Returns a stream that reads/writes from/to SOCK. */
@@ -172,7 +172,7 @@ svn_boolean_t svn_ra_svn__stream_pending
* tokens. */
svn_error_t *
svn_ra_svn__do_cyrus_auth(svn_ra_svn__session_baton_t *sess,
- apr_array_header_t *mechlist,
+ const apr_array_header_t *mechlist,
const char *realm, apr_pool_t *pool);
/* Same as svn_ra_svn__do_cyrus_auth, but uses the built-in implementation of
@@ -181,7 +181,7 @@ svn_ra_svn__do_cyrus_auth(svn_ra_svn__se
* mechanism with the server. */
svn_error_t *
svn_ra_svn__do_internal_auth(svn_ra_svn__session_baton_t *sess,
- apr_array_header_t *mechlist,
+ const apr_array_header_t *mechlist,
const char *realm, apr_pool_t *pool);
/* Having picked a mechanism, start authentication by writing out an
@@ -192,7 +192,7 @@ svn_error_t *svn_ra_svn__auth_response(s
const char *mech, const char *mech_arg);
/* Looks for MECH as a word in MECHLIST (an array of svn_ra_svn_item_t). */
-svn_boolean_t svn_ra_svn__find_mech(apr_array_header_t *mechlist,
+svn_boolean_t svn_ra_svn__find_mech(const apr_array_header_t *mechlist,
const char *mech);
/* Initialize the SASL library. */
Modified: subversion/branches/svn-patch-improvements/subversion/libsvn_repos/commit.c
URL: http://svn.apache.org/viewvc/subversion/branches/svn-patch-improvements/subversion/libsvn_repos/commit.c?rev=929279&r1=929278&r2=929279&view=diff
==============================================================================
--- subversion/branches/svn-patch-improvements/subversion/libsvn_repos/commit.c (original)
+++ subversion/branches/svn-patch-improvements/subversion/libsvn_repos/commit.c Tue Mar 30 20:57:53 2010
@@ -131,9 +131,9 @@ out_of_date(const char *path, svn_node_k
(kind == svn_node_dir
? _("Directory '%s' is out of date")
: kind == svn_node_file
- ? _("File '%s' is out of date")
- : _("'%s' is out of date")),
- path);
+ ? _("File '%s' is out of date")
+ : _("'%s' is out of date")),
+ path);
}
Modified: subversion/branches/svn-patch-improvements/subversion/libsvn_repos/fs-wrap.c
URL: http://svn.apache.org/viewvc/subversion/branches/svn-patch-improvements/subversion/libsvn_repos/fs-wrap.c?rev=929279&r1=929278&r2=929279&view=diff
==============================================================================
--- subversion/branches/svn-patch-improvements/subversion/libsvn_repos/fs-wrap.c (original)
+++ subversion/branches/svn-patch-improvements/subversion/libsvn_repos/fs-wrap.c Tue Mar 30 20:57:53 2010
@@ -230,7 +230,7 @@ svn_repos_fs_change_node_prop(svn_fs_roo
svn_error_t *
svn_repos_fs_change_txn_props(svn_fs_txn_t *txn,
- apr_array_header_t *txnprops,
+ const apr_array_header_t *txnprops,
apr_pool_t *pool)
{
int i;
@@ -586,6 +586,8 @@ svn_repos_fs_get_mergeinfo(svn_mergeinfo
void *authz_read_baton,
apr_pool_t *pool)
{
+ /* Here we cast away 'const', but won't try to write through this pointer
+ * without first allocating a new array. */
apr_array_header_t *readable_paths = (apr_array_header_t *) paths;
svn_fs_root_t *root;
apr_pool_t *iterpool = svn_pool_create(pool);
Modified: subversion/branches/svn-patch-improvements/subversion/libsvn_repos/load.c
URL: http://svn.apache.org/viewvc/subversion/branches/svn-patch-improvements/subversion/libsvn_repos/load.c?rev=929279&r1=929278&r2=929279&view=diff
==============================================================================
--- subversion/branches/svn-patch-improvements/subversion/libsvn_repos/load.c (original)
+++ subversion/branches/svn-patch-improvements/subversion/libsvn_repos/load.c Tue Mar 30 20:57:53 2010
@@ -55,7 +55,18 @@ struct parse_baton
enum svn_repos_load_uuid uuid_action;
const char *parent_dir;
apr_pool_t *pool;
+
+ /* A hash mapping copy-from revisions and mergeinfo range revisions
+ (svn_revnum_t *) in the dump stream to their corresponding revisions
+ (svn_revnum_t *) in the loaded repository. The hash and its
+ contents are allocated in POOL. */
apr_hash_t *rev_map;
+
+ /* The oldest and youngest old revisions loaded so far from the dump
+ stream. If no revisions have been loaded yet, then both are set to
+ SVN_INVALID_REVNUM. */
+ svn_revnum_t oldest_old_rev;
+ svn_revnum_t youngest_old_rev;
};
struct revision_baton
@@ -243,7 +254,7 @@ prefix_mergeinfo_paths(svn_string_t **me
/* The svn:mergeinfo property syntax demands absolute repository
paths, so prepend a leading slash if PARENT_DIR lacks one. */
if (*parent_dir != '/')
- path = svn_path_join_many(pool, "/", parent_dir,
+ path = svn_path_join_many(pool, "/", parent_dir,
merge_source + 1, NULL);
else
path = svn_path_join(parent_dir, merge_source + 1, pool);
@@ -254,9 +265,10 @@ prefix_mergeinfo_paths(svn_string_t **me
}
-/* Examine the mergeinfo in INITIAL_VAL, renumber revisions in rangelists
- as appropriate, and return the (possibly new) mergeinfo in *FINAL_VAL
- (allocated from POOL). */
+/* Examine the mergeinfo in INITIAL_VAL, if necessary remove revisions that
+ refer to history outside of the dump stream and renumber mergeinfo
+ rangelists to point to the appropriate revisions in the loaded repository.
+ Return the (possibly new) mergeinfo in *FINAL_VAL (allocated from POOL). */
static svn_error_t *
renumber_mergeinfo_revs(svn_string_t **final_val,
const svn_string_t *initial_val,
@@ -269,6 +281,16 @@ renumber_mergeinfo_revs(svn_string_t **f
apr_hash_index_t *hi;
SVN_ERR(svn_mergeinfo_parse(&mergeinfo, initial_val->data, subpool));
+
+ /* Issue #3020: If the dump stream represents only part of a repository,
+ then mergeinfo in the stream may refer to revisions outside of the
+ stream. Remove any such invalid ranges before renumbering. */
+ SVN_ERR(svn_mergeinfo__filter_mergeinfo_by_ranges(
+ &mergeinfo, mergeinfo,
+ rb->pb->youngest_old_rev, rb->pb->oldest_old_rev - 1,
+ TRUE, /* Allow only references to revs that exist in the load stream. */
+ subpool, subpool));
+
for (hi = apr_hash_first(subpool, mergeinfo); hi; hi = apr_hash_next(hi))
{
const char *merge_source;
@@ -279,8 +301,8 @@ renumber_mergeinfo_revs(svn_string_t **f
void *val;
apr_hash_this(hi, &key, NULL, &val);
- merge_source = (const char *) key;
- rangelist = (apr_array_header_t *) val;
+ merge_source = key;
+ rangelist = val;
/* Possibly renumber revisions in merge source's rangelist. */
for (i = 0; i < rangelist->nelts; i++)
@@ -291,16 +313,37 @@ renumber_mergeinfo_revs(svn_string_t **f
rev_from_map = apr_hash_get(pb->rev_map, &range->start,
sizeof(svn_revnum_t));
if (rev_from_map && SVN_IS_VALID_REVNUM(*rev_from_map))
+ {
range->start = *rev_from_map;
+ }
+ else if (range->start == pb->oldest_old_rev - 1)
+ {
+ /* Since the start revision of svn_merge_range_t are not
+ inclusive there is one possible valid start revision that
+ won't be found in the PB->REV_MAP mapping of load stream
+ revisions to loaded revisions: The revision immediately
+ preceeding the oldest revision from the load stream.
+ This is a valid revision for mergeinfo, but not a valid
+ copy from revision (which PB->REV_MAP also maps for) so it
+ will never be in the mapping.
+
+ If that is what we have here, then find the mapping for the
+ oldest rev from the load stream and subtract 1 to get the
+ renumbered, non-inclusive, start revision. */
+ rev_from_map = apr_hash_get(pb->rev_map, &pb->oldest_old_rev,
+ sizeof(svn_revnum_t));
+ if (rev_from_map && SVN_IS_VALID_REVNUM(*rev_from_map))
+ range->start = *rev_from_map - 1;
+ }
rev_from_map = apr_hash_get(pb->rev_map, &range->end,
sizeof(svn_revnum_t));
if (rev_from_map && SVN_IS_VALID_REVNUM(*rev_from_map))
- range->end = *rev_from_map;
- }
- apr_hash_set(final_mergeinfo, merge_source,
- APR_HASH_KEY_STRING, rangelist);
- }
+ range->end = *rev_from_map;
+ }
+ apr_hash_set(final_mergeinfo, merge_source,
+ APR_HASH_KEY_STRING, rangelist);
+ }
SVN_ERR(svn_mergeinfo_sort(final_mergeinfo, subpool));
SVN_ERR(svn_mergeinfo_to_string(final_val, final_mergeinfo, pool));
@@ -912,7 +955,7 @@ make_node_baton(apr_hash_t *headers,
if ((val = apr_hash_get(headers, SVN_REPOS_DUMPFILE_NODE_COPYFROM_REV,
APR_HASH_KEY_STRING)))
{
- nb->copyfrom_rev = (svn_revnum_t) atoi(val);
+ nb->copyfrom_rev = SVN_STR_TO_REV(val);
}
if ((val = apr_hash_get(headers, SVN_REPOS_DUMPFILE_NODE_COPYFROM_PATH,
APR_HASH_KEY_STRING)))
@@ -1207,19 +1250,31 @@ set_node_property(void *baton,
if (strcmp(name, SVN_PROP_MERGEINFO) == 0)
{
- /* Renumber mergeinfo as appropriate. */
- svn_string_t *renumbered_mergeinfo;
- SVN_ERR(renumber_mergeinfo_revs(&renumbered_mergeinfo, value, rb,
- nb->pool));
- value = renumbered_mergeinfo;
- if (parent_dir)
+ /* If we haven't yet committed any revisions then *any* mergeinfo
+ will refer to the wrong revisions or revisions that don't exist.
+ Either way none of this mergeinfo can be valid, so remove it all. */
+ if (apr_hash_count(rb->pb->rev_map) == 0)
+ {
+ value = NULL;
+ }
+ else
{
- /* Prefix the merge source paths with PARENT_DIR. */
- /* ASSUMPTION: All source paths are included in the dump stream. */
- svn_string_t *mergeinfo_val;
- SVN_ERR(prefix_mergeinfo_paths(&mergeinfo_val, value, parent_dir,
- nb->pool));
- value = mergeinfo_val;
+ /* Renumber mergeinfo as appropriate. */
+ svn_string_t *renumbered_mergeinfo;
+
+ SVN_ERR(renumber_mergeinfo_revs(&renumbered_mergeinfo, value, rb,
+ nb->pool));
+ value = renumbered_mergeinfo;
+ if (parent_dir)
+ {
+ /* Prefix the merge source paths with PARENT_DIR. */
+ /* ASSUMPTION: All source paths are included in the dump
+ stream. */
+ svn_string_t *mergeinfo_val;
+ SVN_ERR(prefix_mergeinfo_paths(&mergeinfo_val, value,
+ parent_dir, nb->pool));
+ value = mergeinfo_val;
+ }
}
}
@@ -1355,6 +1410,13 @@ close_revision(void *baton)
return svn_error_return(err);
}
+ /* Update the youngest revision committed from the load stream (or both
+ if this is the first revision committed). */
+ if (SVN_IS_VALID_REVNUM(pb->youngest_old_rev))
+ pb->youngest_old_rev = *old_rev;
+ else
+ pb->oldest_old_rev = pb->youngest_old_rev = *old_rev;
+
/* Run post-commit hook, if so commanded. */
if (pb->use_post_commit_hook)
{
@@ -1436,6 +1498,7 @@ svn_repos_get_fs_build_parser2(const svn
pb->parent_dir = parent_dir;
pb->pool = pool;
pb->rev_map = apr_hash_make(pool);
+ pb->youngest_old_rev = pb->oldest_old_rev = SVN_INVALID_REVNUM;
*callbacks = parser;
*parse_baton = pb;
Modified: subversion/branches/svn-patch-improvements/subversion/libsvn_repos/log.c
URL: http://svn.apache.org/viewvc/subversion/branches/svn-patch-improvements/subversion/libsvn_repos/log.c?rev=929279&r1=929278&r2=929279&view=diff
==============================================================================
--- subversion/branches/svn-patch-improvements/subversion/libsvn_repos/log.c (original)
+++ subversion/branches/svn-patch-improvements/subversion/libsvn_repos/log.c Tue Mar 30 20:57:53 2010
@@ -490,7 +490,7 @@ check_history(svn_boolean_t *changed,
/* Return the next interesting revision in our list of HISTORIES. */
static svn_revnum_t
-next_history_rev(apr_array_header_t *histories)
+next_history_rev(const apr_array_header_t *histories)
{
svn_revnum_t next_rev = SVN_INVALID_REVNUM;
int i;
@@ -1350,6 +1350,9 @@ do_logs(svn_fs_t *fs,
which revisions to report as having been merged via the commit
resulting in REV.
+ Silently ignore some failures to find the revisions mentioned in the
+ mergeinfo, as might happen if there is invalid mergeinfo.
+
Other parameters are as described by do_logs(), around which this
is a recursion wrapper. */
static svn_error_t *
Modified: subversion/branches/svn-patch-improvements/subversion/libsvn_repos/reporter.c
URL: http://svn.apache.org/viewvc/subversion/branches/svn-patch-improvements/subversion/libsvn_repos/reporter.c?rev=929279&r1=929278&r2=929279&view=diff
==============================================================================
--- subversion/branches/svn-patch-improvements/subversion/libsvn_repos/reporter.c (original)
+++ subversion/branches/svn-patch-improvements/subversion/libsvn_repos/reporter.c Tue Mar 30 20:57:53 2010
@@ -1056,7 +1056,7 @@ delta_dirs(report_baton_t *b, svn_revnum
const svn_fs_dirent_t *s_entry;
svn_pool_clear(subpool);
- s_entry = svn_apr_hash_index_val(hi);
+ s_entry = svn__apr_hash_index_val(hi);
if (apr_hash_get(t_entries, s_entry->name,
APR_HASH_KEY_STRING) == NULL)
@@ -1094,7 +1094,7 @@ delta_dirs(report_baton_t *b, svn_revnum
const svn_fs_dirent_t *s_entry, *t_entry;
svn_pool_clear(subpool);
- t_entry = svn_apr_hash_index_val(hi);
+ t_entry = svn__apr_hash_index_val(hi);
if (is_depth_upgrade(wc_depth, requested_depth, t_entry->kind))
{
Modified: subversion/branches/svn-patch-improvements/subversion/libsvn_repos/repos.c
URL: http://svn.apache.org/viewvc/subversion/branches/svn-patch-improvements/subversion/libsvn_repos/repos.c?rev=929279&r1=929278&r2=929279&view=diff
==============================================================================
--- subversion/branches/svn-patch-improvements/subversion/libsvn_repos/repos.c (original)
+++ subversion/branches/svn-patch-improvements/subversion/libsvn_repos/repos.c Tue Mar 30 20:57:53 2010
@@ -1963,7 +1963,7 @@ svn_repos_stat(svn_dirent_t **dirent,
svn_error_t *
svn_repos_remember_client_capabilities(svn_repos_t *repos,
- apr_array_header_t *capabilities)
+ const apr_array_header_t *capabilities)
{
repos->client_capabilities = capabilities;
return SVN_NO_ERROR;
Modified: subversion/branches/svn-patch-improvements/subversion/libsvn_repos/repos.h
URL: http://svn.apache.org/viewvc/subversion/branches/svn-patch-improvements/subversion/libsvn_repos/repos.h?rev=929279&r1=929278&r2=929279&view=diff
==============================================================================
--- subversion/branches/svn-patch-improvements/subversion/libsvn_repos/repos.h (original)
+++ subversion/branches/svn-patch-improvements/subversion/libsvn_repos/repos.h Tue Mar 30 20:57:53 2010
@@ -134,7 +134,7 @@ struct svn_repos_t
object. You'd think the capabilities here would represent the
*repository's* capabilities, but no, they represent the
client's -- we just don't have any other place to persist them. */
- apr_array_header_t *client_capabilities;
+ const apr_array_header_t *client_capabilities;
/* Maps SVN_REPOS_CAPABILITY_foo keys to "yes" or "no" values.
If a capability is not yet discovered, it is absent from the table.
Modified: subversion/branches/svn-patch-improvements/subversion/libsvn_repos/rev_hunt.c
URL: http://svn.apache.org/viewvc/subversion/branches/svn-patch-improvements/subversion/libsvn_repos/rev_hunt.c?rev=929279&r1=929278&r2=929279&view=diff
==============================================================================
--- subversion/branches/svn-patch-improvements/subversion/libsvn_repos/rev_hunt.c (original)
+++ subversion/branches/svn-patch-improvements/subversion/libsvn_repos/rev_hunt.c Tue Mar 30 20:57:53 2010
@@ -640,7 +640,7 @@ svn_repos_trace_node_locations(svn_fs_t
apr_hash_t **locations,
const char *fs_path,
svn_revnum_t peg_revision,
- apr_array_header_t *location_revisions_orig,
+ const apr_array_header_t *location_revisions_orig,
svn_repos_authz_func_t authz_read_func,
void *authz_read_baton,
apr_pool_t *pool)
@@ -1189,14 +1189,15 @@ compare_path_revisions(const void *a, co
static svn_error_t *
find_merged_revisions(apr_array_header_t **merged_path_revisions_out,
- apr_array_header_t *mainline_path_revisions,
+ const apr_array_header_t *mainline_path_revisions,
svn_repos_t *repos,
apr_hash_t *duplicate_path_revs,
svn_repos_authz_func_t authz_read_func,
void *authz_read_baton,
apr_pool_t *pool)
{
- apr_array_header_t *old, *new;
+ const apr_array_header_t *old;
+ apr_array_header_t *new;
apr_pool_t *iter_pool, *last_pool;
apr_array_header_t *merged_path_revisions = apr_array_make(pool, 0,
sizeof(struct path_revision *));
Modified: subversion/branches/svn-patch-improvements/subversion/libsvn_subr/atomic.c
URL: http://svn.apache.org/viewvc/subversion/branches/svn-patch-improvements/subversion/libsvn_subr/atomic.c?rev=929279&r1=929278&r2=929279&view=diff
==============================================================================
--- subversion/branches/svn-patch-improvements/subversion/libsvn_subr/atomic.c (original)
+++ subversion/branches/svn-patch-improvements/subversion/libsvn_subr/atomic.c Tue Mar 30 20:57:53 2010
@@ -33,6 +33,10 @@ svn_error_t*
svn_atomic__init_once(volatile svn_atomic_t *global_status,
svn_error_t *(*init_func)(apr_pool_t*), apr_pool_t* pool)
{
+ /* !! Don't use localizable strings in this function, because these
+ !! might cause deadlocks. This function can be used to initialize
+ !! libraries that are used for generating error messages. */
+
/* We have to call init_func exactly once. Because APR
doesn't have statically-initialized mutexes, we implement a poor
man's spinlock using svn_atomic_cas. */
@@ -51,7 +55,8 @@ svn_atomic__init_once(volatile svn_atomi
SVN_ATOMIC_INIT_FAILED,
SVN_ATOMIC_START_INIT);
#endif
- return err;
+ return svn_error_create(SVN_ERR_ATOMIC_INIT_FAILURE, err,
+ "Couldn't perform atomic initialization");
}
svn_atomic_cas(global_status,
SVN_ATOMIC_INITIALIZED,
Modified: subversion/branches/svn-patch-improvements/subversion/libsvn_subr/auth.c
URL: http://svn.apache.org/viewvc/subversion/branches/svn-patch-improvements/subversion/libsvn_subr/auth.c?rev=929279&r1=929278&r2=929279&view=diff
==============================================================================
--- subversion/branches/svn-patch-improvements/subversion/libsvn_subr/auth.c (original)
+++ subversion/branches/svn-patch-improvements/subversion/libsvn_subr/auth.c Tue Mar 30 20:57:53 2010
@@ -101,7 +101,7 @@ struct svn_auth_iterstate_t
void
svn_auth_open(svn_auth_baton_t **auth_baton,
- apr_array_header_t *providers,
+ const apr_array_header_t *providers,
apr_pool_t *pool)
{
svn_auth_baton_t *ab;
Modified: subversion/branches/svn-patch-improvements/subversion/libsvn_subr/cmdline.c
URL: http://svn.apache.org/viewvc/subversion/branches/svn-patch-improvements/subversion/libsvn_subr/cmdline.c?rev=929279&r1=929278&r2=929279&view=diff
==============================================================================
--- subversion/branches/svn-patch-improvements/subversion/libsvn_subr/cmdline.c (original)
+++ subversion/branches/svn-patch-improvements/subversion/libsvn_subr/cmdline.c Tue Mar 30 20:57:53 2010
@@ -661,7 +661,7 @@ svn_cmdline__parse_config_option(apr_arr
svn_error_t *
svn_cmdline__apply_config_options(apr_hash_t *config,
- apr_array_header_t *config_options,
+ const apr_array_header_t *config_options,
const char *prefix,
const char *argument_name)
{
Modified: subversion/branches/svn-patch-improvements/subversion/libsvn_subr/deprecated.c
URL: http://svn.apache.org/viewvc/subversion/branches/svn-patch-improvements/subversion/libsvn_subr/deprecated.c?rev=929279&r1=929278&r2=929279&view=diff
==============================================================================
--- subversion/branches/svn-patch-improvements/subversion/libsvn_subr/deprecated.c (original)
+++ subversion/branches/svn-patch-improvements/subversion/libsvn_subr/deprecated.c Tue Mar 30 20:57:53 2010
@@ -38,6 +38,7 @@
#include "svn_cmdline.h"
#include "svn_pools.h"
#include "svn_dso.h"
+#include "svn_mergeinfo.h"
#include "opt.h"
#include "private/svn_opt_private.h"
@@ -414,7 +415,7 @@ svn_opt_subcommand_help(const char *subc
svn_error_t *
svn_opt_args_to_target_array3(apr_array_header_t **targets_p,
apr_getopt_t *os,
- apr_array_header_t *known_targets,
+ const apr_array_header_t *known_targets,
apr_pool_t *pool)
{
return svn_opt__args_to_target_array(targets_p, os,known_targets, pool);
@@ -423,7 +424,7 @@ svn_opt_args_to_target_array3(apr_array_
svn_error_t *
svn_opt_args_to_target_array2(apr_array_header_t **targets_p,
apr_getopt_t *os,
- apr_array_header_t *known_targets,
+ const apr_array_header_t *known_targets,
apr_pool_t *pool)
{
svn_error_t *err = svn_opt_args_to_target_array3(targets_p, os,
@@ -441,7 +442,7 @@ svn_opt_args_to_target_array2(apr_array_
svn_error_t *
svn_opt_args_to_target_array(apr_array_header_t **targets_p,
apr_getopt_t *os,
- apr_array_header_t *known_targets,
+ const apr_array_header_t *known_targets,
svn_opt_revision_t *start_revision,
svn_opt_revision_t *end_revision,
svn_boolean_t extract_revisions,
@@ -849,6 +850,12 @@ svn_error_t *svn_stream_copy(svn_stream_
NULL, NULL, scratch_pool);
}
+svn_stream_t *
+svn_stream_from_aprfile(apr_file_t *file, apr_pool_t *pool)
+{
+ return svn_stream_from_aprfile2(file, TRUE, pool);
+}
+
/*** From path.c ***/
const char *
@@ -886,3 +893,30 @@ svn_path_is_canonical(const char *path,
svn_dirent_is_canonical(path, pool) ||
svn_relpath_is_canonical(path, pool);
}
+
+
+/*** From mergeinfo.c ***/
+
+svn_error_t *
+svn_mergeinfo_inheritable(svn_mergeinfo_t *output,
+ svn_mergeinfo_t mergeinfo,
+ const char *path,
+ svn_revnum_t start,
+ svn_revnum_t end,
+ apr_pool_t *pool)
+{
+ return svn_mergeinfo_inheritable2(output, mergeinfo, path, start, end,
+ TRUE, pool, pool);
+}
+
+svn_error_t *
+svn_rangelist_inheritable(apr_array_header_t **inheritable_rangelist,
+ const apr_array_header_t *rangelist,
+ svn_revnum_t start,
+ svn_revnum_t end,
+ apr_pool_t *pool)
+{
+ return svn_rangelist_inheritable2(inheritable_rangelist, rangelist,
+ start, end, TRUE, pool, pool);
+}
+
Modified: subversion/branches/svn-patch-improvements/subversion/libsvn_subr/io.c
URL: http://svn.apache.org/viewvc/subversion/branches/svn-patch-improvements/subversion/libsvn_subr/io.c?rev=929279&r1=929278&r2=929279&view=diff
==============================================================================
--- subversion/branches/svn-patch-improvements/subversion/libsvn_subr/io.c (original)
+++ subversion/branches/svn-patch-improvements/subversion/libsvn_subr/io.c Tue Mar 30 20:57:53 2010
@@ -3525,17 +3525,20 @@ svn_io_files_contents_same_p(svn_boolean
/* Wrapper for apr_file_mktemp(). */
svn_error_t *
-svn_io_file_mktemp(apr_file_t **new_file, char *templ,
+svn_io_file_mktemp(apr_file_t **new_file, const char *templ,
apr_int32_t flags, apr_pool_t *pool)
{
const char *templ_apr;
apr_status_t status;
- SVN_ERR(cstring_from_utf8(&templ_apr, templ, pool));
+ SVN_ERR(svn_path_cstring_from_utf8(&templ_apr, templ, pool));
- /* ### I don't want to copy the template string again just to
- * make it writable... so cast away const.
- * Should the UTF-8 conversion functions really be returning const??? */
+ /* ### svn_path_cstring_from_utf8() guarantees to make a copy of the
+ data available in POOL and we need a non-const pointer here,
+ as apr changes the template to return the new filename.
+
+ But we can't provide the filename to our caller as that might need
+ more bytes then there are XXXXs after converting it back to utf-8. */
status = apr_file_mktemp(new_file, (char *)templ_apr, flags, pool);
if (status)
Modified: subversion/branches/svn-patch-improvements/subversion/libsvn_subr/iter.c
URL: http://svn.apache.org/viewvc/subversion/branches/svn-patch-improvements/subversion/libsvn_subr/iter.c?rev=929279&r1=929278&r2=929279&view=diff
==============================================================================
--- subversion/branches/svn-patch-improvements/subversion/libsvn_subr/iter.c (original)
+++ subversion/branches/svn-patch-improvements/subversion/libsvn_subr/iter.c Tue Mar 30 20:57:53 2010
@@ -23,6 +23,7 @@
#include "svn_iter.h"
#include "svn_pools.h"
+#include "private/svn_dep_compat.h"
#include "svn_error_codes.h"
@@ -36,6 +37,30 @@ static svn_error_t internal_break_error
__LINE__ /* line number */
};
+#if APR_VERSION_AT_LEAST(1, 4, 0)
+struct hash_do_baton
+{
+ void *baton;
+ svn_iter_apr_hash_cb_t func;
+ svn_error_t *err;
+ apr_pool_t *iterpool;
+};
+
+static
+int hash_do_callback(void *baton,
+ const void *key,
+ apr_ssize_t klen,
+ const void *value)
+{
+ struct hash_do_baton *hdb = baton;
+
+ svn_pool_clear(hdb->iterpool);
+ hdb->err = (*hdb->func)(hdb->baton, key, klen, (void *)value, hdb->iterpool);
+
+ return hdb->err == SVN_NO_ERROR;
+}
+#endif
+
svn_error_t *
svn_iter_apr_hash(svn_boolean_t *completed,
apr_hash_t *hash,
@@ -43,6 +68,36 @@ svn_iter_apr_hash(svn_boolean_t *complet
void *baton,
apr_pool_t *pool)
{
+#if APR_VERSION_AT_LEAST(1, 4, 0)
+ struct hash_do_baton hdb;
+ svn_boolean_t error_received;
+
+ hdb.func = func;
+ hdb.baton = baton;
+ hdb.iterpool = svn_pool_create(pool);
+
+ error_received = !apr_hash_do(hash_do_callback, &hdb, hash);
+
+ svn_pool_destroy(hdb.iterpool);
+
+ if (completed)
+ *completed = !error_received;
+
+ if (!error_received)
+ return SVN_NO_ERROR;
+
+ if (hdb.err->apr_err == SVN_ERR_ITER_BREAK
+ && hdb.err != &internal_break_error)
+ {
+ /* Errors - except those created by svn_iter_break() -
+ need to be cleared when not further propagated. */
+ svn_error_clear(hdb.err);
+
+ hdb.err = SVN_NO_ERROR;
+ }
+
+ return hdb.err;
+#else
svn_error_t *err = SVN_NO_ERROR;
apr_pool_t *iterpool = svn_pool_create(pool);
apr_hash_index_t *hi;
@@ -78,6 +133,7 @@ svn_iter_apr_hash(svn_boolean_t *complet
svn_pool_destroy(iterpool);
return err;
+#endif
}
svn_error_t *
@@ -132,7 +188,7 @@ svn_iter__break(void)
* So these functions all take const hash indices, and we cast the const
* away when passing them down to APR to avoid compiler warnings. */
-const void *svn_apr_hash_index_key(const apr_hash_index_t *hi)
+const void *svn__apr_hash_index_key(const apr_hash_index_t *hi)
{
const void *key;
@@ -140,7 +196,7 @@ const void *svn_apr_hash_index_key(const
return key;
}
-apr_ssize_t svn_apr_hash_index_klen(const apr_hash_index_t *hi)
+apr_ssize_t svn__apr_hash_index_klen(const apr_hash_index_t *hi)
{
apr_ssize_t klen;
@@ -148,7 +204,7 @@ apr_ssize_t svn_apr_hash_index_klen(cons
return klen;
}
-void *svn_apr_hash_index_val(const apr_hash_index_t *hi)
+void *svn__apr_hash_index_val(const apr_hash_index_t *hi)
{
void *val;