diff options
Diffstat (limited to 'contrib/subversion/subversion/svnserve/serve.c')
-rw-r--r-- | contrib/subversion/subversion/svnserve/serve.c | 44 |
1 files changed, 30 insertions, 14 deletions
diff --git a/contrib/subversion/subversion/svnserve/serve.c b/contrib/subversion/subversion/svnserve/serve.c index a3fd938b1c30..23ef6ed1d809 100644 --- a/contrib/subversion/subversion/svnserve/serve.c +++ b/contrib/subversion/subversion/svnserve/serve.c @@ -1710,6 +1710,11 @@ static svn_error_t *get_dir(svn_ra_svn_conn_t *conn, apr_pool_t *pool, &ab, root, full_path, pool)); + /* Fetch the directories' entries before starting the response, to allow + proper error handling in cases like when FULL_PATH doesn't exist */ + if (want_contents) + SVN_CMD_ERR(svn_fs_dir_entries(&entries, root, full_path, pool)); + /* Begin response ... */ SVN_ERR(svn_ra_svn__write_tuple(conn, pool, "w(r(!", "success", rev)); SVN_ERR(svn_ra_svn__write_proplist(conn, pool, props)); @@ -1721,8 +1726,6 @@ static svn_error_t *get_dir(svn_ra_svn_conn_t *conn, apr_pool_t *pool, /* Use epoch for a placeholder for a missing date. */ const char *missing_date = svn_time_to_cstring(0, pool); - SVN_CMD_ERR(svn_fs_dir_entries(&entries, root, full_path, pool)); - /* Transform the hash table's FS entries into dirents. This probably * belongs in libsvn_repos. */ subpool = svn_pool_create(pool); @@ -2465,9 +2468,30 @@ static svn_error_t *get_location_segments(svn_ra_svn_conn_t *conn, abs_path = svn_fspath__join(b->fs_path->data, relative_path, pool); - if (SVN_IS_VALID_REVNUM(start_rev) - && SVN_IS_VALID_REVNUM(end_rev) - && (end_rev > start_rev)) + SVN_ERR(trivial_auth_request(conn, pool, b)); + SVN_ERR(log_command(baton, conn, pool, "%s", + svn_log__get_location_segments(abs_path, peg_revision, + start_rev, end_rev, + pool))); + + /* No START_REV or PEG_REVISION? We'll use HEAD. */ + if (!SVN_IS_VALID_REVNUM(start_rev) || !SVN_IS_VALID_REVNUM(peg_revision)) + { + svn_revnum_t youngest; + + SVN_CMD_ERR(svn_fs_youngest_rev(&youngest, b->fs, pool)); + + if (!SVN_IS_VALID_REVNUM(start_rev)) + start_rev = youngest; + if (!SVN_IS_VALID_REVNUM(peg_revision)) + peg_revision = youngest; + } + + /* No END_REV? We'll use 0. */ + if (!SVN_IS_VALID_REVNUM(end_rev)) + end_rev = 0; + + if (end_rev > start_rev) { err = svn_error_createf(SVN_ERR_INCORRECT_PARAMS, NULL, "Get-location-segments end revision must not be " @@ -2475,9 +2499,7 @@ static svn_error_t *get_location_segments(svn_ra_svn_conn_t *conn, return log_fail_and_flush(err, b, conn, pool); } - if (SVN_IS_VALID_REVNUM(peg_revision) - && SVN_IS_VALID_REVNUM(start_rev) - && (start_rev > peg_revision)) + if (start_rev > peg_revision) { err = svn_error_createf(SVN_ERR_INCORRECT_PARAMS, NULL, "Get-location-segments start revision must not " @@ -2485,12 +2507,6 @@ static svn_error_t *get_location_segments(svn_ra_svn_conn_t *conn, return log_fail_and_flush(err, b, conn, pool); } - SVN_ERR(trivial_auth_request(conn, pool, b)); - SVN_ERR(log_command(baton, conn, pool, "%s", - svn_log__get_location_segments(abs_path, peg_revision, - start_rev, end_rev, - pool))); - /* All the parameters are fine - let's perform the query against the * repository. */ |