diff options
author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-08-05 16:22:51 +0000 |
---|---|---|
committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-08-05 16:22:51 +0000 |
commit | cf46733632c7279a9fd0fe6ce26f9185a4ae82a9 (patch) | |
tree | da27775a2161723ef342e91af41a8b51fedef405 /subversion/libsvn_repos/commit.c | |
parent | bb0ef45f7c46b0ae221b26265ef98a768c33f820 (diff) | |
download | subversion-tarball-master.tar.gz |
subversion-1.9.7HEADsubversion-1.9.7master
Diffstat (limited to 'subversion/libsvn_repos/commit.c')
-rw-r--r-- | subversion/libsvn_repos/commit.c | 52 |
1 files changed, 23 insertions, 29 deletions
diff --git a/subversion/libsvn_repos/commit.c b/subversion/libsvn_repos/commit.c index 22cf873..1190acc 100644 --- a/subversion/libsvn_repos/commit.c +++ b/subversion/libsvn_repos/commit.c @@ -73,7 +73,7 @@ struct edit_baton svn_repos_t *repos; /* URL to the root of the open repository. */ - const char *repos_url; + const char *repos_url_decoded; /* The name of the repository (here for convenience). */ const char *repos_name; @@ -201,6 +201,7 @@ invoke_commit_cb(svn_commit_callback2_t commit_cb, commit_info->date = date ? date->data : NULL; commit_info->author = author ? author->data : NULL; commit_info->post_commit_err = post_commit_errstr; + /* commit_info->repos_root is not set by the repos layer, only by RA layers */ return svn_error_trace(commit_cb(commit_info, commit_baton, scratch_pool)); } @@ -262,7 +263,9 @@ make_dir_baton(struct edit_baton *edit_baton, /* This function is the shared guts of add_file() and add_directory(), which see for the meanings of the parameters. The only extra parameter here is IS_DIR, which is TRUE when adding a directory, - and FALSE when adding a file. */ + and FALSE when adding a file. + + COPY_PATH must be a full URL, not a relative path. */ static svn_error_t * add_file_or_directory(const char *path, void *parent_baton, @@ -317,8 +320,8 @@ add_file_or_directory(const char *path, /* For now, require that the url come from the same repository that this commit is operating on. */ copy_path = svn_path_uri_decode(copy_path, subpool); - repos_url_len = strlen(eb->repos_url); - if (strncmp(copy_path, eb->repos_url, repos_url_len) != 0) + repos_url_len = strlen(eb->repos_url_decoded); + if (strncmp(copy_path, eb->repos_url_decoded, repos_url_len) != 0) return svn_error_createf (SVN_ERR_FS_GENERAL, NULL, _("Source url '%s' is from different repository"), copy_path); @@ -394,6 +397,11 @@ open_root(void *edit_baton, dateness checks. */ SVN_ERR(svn_fs_youngest_rev(&youngest, eb->fs, eb->pool)); + if (base_revision > youngest) + return svn_error_createf(SVN_ERR_FS_NO_SUCH_REVISION, NULL, + _("No such revision %ld (HEAD is %ld)"), + base_revision, youngest); + /* Unless we've been instructed to use a specific transaction, we'll make our own. */ if (eb->txn_owner) @@ -939,7 +947,7 @@ svn_repos_get_commit_editor5(const svn_delta_editor_t **editor, void **edit_baton, svn_repos_t *repos, svn_fs_txn_t *txn, - const char *repos_url, + const char *repos_url_decoded, const char *base_path, apr_hash_t *revprop_table, svn_commit_callback2_t commit_callback, @@ -953,6 +961,7 @@ svn_repos_get_commit_editor5(const svn_delta_editor_t **editor, struct edit_baton *eb; svn_delta_shim_callbacks_t *shim_callbacks = svn_delta_shim_callbacks_default(pool); + const char *repos_url = svn_path_uri_encode(repos_url_decoded, pool); /* Do a global authz access lookup. Users with no write access whatsoever to the repository don't get a commit editor. */ @@ -994,7 +1003,7 @@ svn_repos_get_commit_editor5(const svn_delta_editor_t **editor, eb->authz_baton = authz_baton; eb->base_path = svn_fspath__canonicalize(base_path, subpool); eb->repos = repos; - eb->repos_url = repos_url; + eb->repos_url_decoded = repos_url_decoded; eb->repos_name = svn_dirent_basename(svn_repos_path(repos, subpool), subpool); eb->fs = svn_repos_fs(repos); @@ -1010,7 +1019,7 @@ svn_repos_get_commit_editor5(const svn_delta_editor_t **editor, shim_callbacks->fetch_baton = eb; SVN_ERR(svn_editor__insert_shims(editor, edit_baton, *editor, *edit_baton, - eb->repos_url, eb->base_path, + repos_url, eb->base_path, shim_callbacks, pool, pool)); return SVN_NO_ERROR; @@ -1031,7 +1040,7 @@ ev2_check_authz(const struct ev2_baton *eb, return SVN_NO_ERROR; if (relpath) - fspath = apr_pstrcat(scratch_pool, "/", relpath, NULL); + fspath = apr_pstrcat(scratch_pool, "/", relpath, SVN_VA_NULL); else fspath = NULL; @@ -1138,15 +1147,15 @@ static svn_error_t * alter_file_cb(void *baton, const char *relpath, svn_revnum_t revision, - apr_hash_t *props, const svn_checksum_t *checksum, svn_stream_t *contents, + apr_hash_t *props, apr_pool_t *scratch_pool) { struct ev2_baton *eb = baton; - SVN_ERR(svn_editor_alter_file(eb->inner, relpath, revision, props, - checksum, contents)); + SVN_ERR(svn_editor_alter_file(eb->inner, relpath, revision, + checksum, contents, props)); return SVN_NO_ERROR; } @@ -1156,14 +1165,14 @@ static svn_error_t * alter_symlink_cb(void *baton, const char *relpath, svn_revnum_t revision, - apr_hash_t *props, const char *target, + apr_hash_t *props, apr_pool_t *scratch_pool) { struct ev2_baton *eb = baton; - SVN_ERR(svn_editor_alter_symlink(eb->inner, relpath, revision, props, - target)); + SVN_ERR(svn_editor_alter_symlink(eb->inner, relpath, revision, + target, props)); return SVN_NO_ERROR; } @@ -1216,20 +1225,6 @@ move_cb(void *baton, } -/* This implements svn_editor_cb_rotate_t */ -static svn_error_t * -rotate_cb(void *baton, - const apr_array_header_t *relpaths, - const apr_array_header_t *revisions, - apr_pool_t *scratch_pool) -{ - struct ev2_baton *eb = baton; - - SVN_ERR(svn_editor_rotate(eb->inner, relpaths, revisions)); - return SVN_NO_ERROR; -} - - /* This implements svn_editor_cb_complete_t */ static svn_error_t * complete_cb(void *baton, @@ -1351,7 +1346,6 @@ svn_repos__get_commit_ev2(svn_editor_t **editor, delete_cb, copy_cb, move_cb, - rotate_cb, complete_cb, abort_cb }; |