Author: stsp Date: Fri Jan 9 13:56:43 2015 New Revision: 1650531 URL: http://svn.apache.org/r1650531 Log: Fix a redirect handling bug in 'svn log' over HTTP.
A server config with: RedirectMatch permanent ^/svn/repoOLD$ /svn/repoNEW RedirectMatch permanent ^/svn/repoOLD/(.*)$ /svn/repoNEW/$1 would result in the following error: $ svn log http://localhost:8081/svn/repoOLD Redirecting to URL 'http://localhost:8081/svn/repoNEW': subversion/svn/log-cmd.c:876, subversion/libsvn_client/log.c:899, subversion/libsvn_client/ra.c:576, subversion/libsvn_ra/ra_loader.c:588: (apr_err=SVN_ERR_RA_ILLEGAL_URL) svn: E170000: 'http://localhost:8081/svn/repoOLD' isn't in the same repository as 'http://localhost:8081/svn/repoNEW' With this fix 'svn log' follows the redirect as expected. * subversion/libsvn_client/log.c (svn_client_log5): Don't ignore corrected RA session location returned by svn_client__ra_session_from_path2(). Modified: subversion/trunk/subversion/libsvn_client/log.c Modified: subversion/trunk/subversion/libsvn_client/log.c URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/log.c?rev=1650531&r1=1650530&r2=1650531&view=diff ============================================================================== --- subversion/trunk/subversion/libsvn_client/log.c (original) +++ subversion/trunk/subversion/libsvn_client/log.c Fri Jan 9 13:56:43 2015 @@ -852,10 +852,12 @@ svn_client_log5(const apr_array_header_t svn_ra_session_t *ra_session; const char *old_session_url; const char *ra_target; + const char *path_or_url; svn_opt_revision_t youngest_opt_rev; svn_revnum_t youngest_rev; svn_revnum_t oldest_rev; svn_opt_revision_t peg_rev; + svn_client__pathrev_t *ra_session_loc; svn_client__pathrev_t *actual_loc; apr_array_header_t *log_segments; apr_array_header_t *revision_ranges; @@ -875,7 +877,7 @@ svn_client_log5(const apr_array_header_t SVN_ERR(resolve_log_targets(&relative_targets, &ra_target, &peg_rev, targets, ctx, pool, pool)); - SVN_ERR(svn_client__ra_session_from_path2(&ra_session, NULL, + SVN_ERR(svn_client__ra_session_from_path2(&ra_session, &ra_session_loc, ra_target, NULL, &peg_rev, &peg_rev, ctx, pool)); @@ -889,11 +891,22 @@ svn_client_log5(const apr_array_header_t opt_rev_ranges, &peg_rev, ctx, pool, pool)); + /* For some peg revisions we must resolve revision and url via a local path + so use the original RA_TARGET. For others, use the potentially corrected + (redirected) ra session URL. */ + if (peg_rev.kind == svn_opt_revision_previous || + peg_rev.kind == svn_opt_revision_base || + peg_rev.kind == svn_opt_revision_committed || + peg_rev.kind == svn_opt_revision_working) + path_or_url = ra_target; + else + path_or_url = ra_session_loc->url; + /* Make ACTUAL_LOC and RA_SESSION point to the youngest operative rev. */ youngest_opt_rev.kind = svn_opt_revision_number; youngest_opt_rev.value.number = youngest_rev; SVN_ERR(svn_client__resolve_rev_and_url(&actual_loc, ra_session, - ra_target, &peg_rev, + path_or_url, &peg_rev, &youngest_opt_rev, ctx, pool)); SVN_ERR(svn_client__ensure_ra_session_url(&old_session_url, ra_session, actual_loc->url, pool));
