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;