dav_error * dav_svn__abort_txn(const dav_svn_repos *repos, const char *txn_name, apr_pool_t *pool) { svn_error_t *serr; svn_fs_txn_t *txn; /* If we fail only because the transaction doesn't exist, don't sweat it (but then, also don't try to remove it). */ if ((serr = svn_fs_open_txn(&txn, repos->fs, txn_name, pool))) { if (serr->apr_err == SVN_ERR_FS_NO_SUCH_TRANSACTION) { svn_error_clear(serr); serr = SVN_NO_ERROR; } else { return dav_svn__convert_err(serr, HTTP_INTERNAL_SERVER_ERROR, "could not open transaction.", pool); } } else if ((serr = svn_fs_abort_txn(txn, pool))) { return dav_svn__convert_err(serr, HTTP_INTERNAL_SERVER_ERROR, "could not abort transaction.", pool); } return NULL; }
svn_error_t * svn_fs__editor_create_for(svn_editor_t **editor, svn_fs_t *fs, const char *txn_name, svn_cancel_func_t cancel_func, void *cancel_baton, apr_pool_t *result_pool, apr_pool_t *scratch_pool) { svn_fs_txn_t *txn; SVN_ERR(svn_fs_open_txn(&txn, fs, txn_name, result_pool)); return svn_error_trace(make_editor(editor, txn, cancel_func, cancel_baton, result_pool, scratch_pool)); }
static svn_error_t * apply_revprops(svn_fs_t *fs, const char *txn_name, apr_hash_t *revprops, apr_pool_t *scratch_pool) { svn_fs_txn_t *txn; const apr_array_header_t *revprops_array; /* The FS editor has a TXN inside it, but we can't access it. Open another based on the TXN_NAME. */ SVN_ERR(svn_fs_open_txn(&txn, fs, txn_name, scratch_pool)); /* Validate and apply the revision properties. */ revprops_array = svn_prop_hash_to_array(revprops, scratch_pool); SVN_ERR(svn_repos_fs_change_txn_props(txn, revprops_array, scratch_pool)); /* ### do we need to force the txn to close, or is it enough to wait ### for the pool to be cleared? */ return SVN_NO_ERROR; }
/* Loads the authz config into *AUTHZ from the file at AUTHZ_FILE in repository at REPOS_PATH from the transaction TXN_NAME. If GROUPS_FILE is set, the resulting *AUTHZ will be constructed from AUTHZ_FILE with global groups taken from GROUPS_FILE. Using POOL for allocations. */ static svn_error_t * get_authz_from_txn(svn_authz_t **authz, const char *repos_path, const char *authz_file, const char *groups_file, const char *txn_name, apr_pool_t *pool) { svn_repos_t *repos; svn_fs_t *fs; svn_fs_txn_t *txn; svn_fs_root_t *root; svn_stream_t *authz_contents; svn_stream_t *groups_contents; svn_error_t *err; /* Open up the repository and find the transaction root */ SVN_ERR(svn_repos_open3(&repos, repos_path, NULL, pool, pool)); fs = svn_repos_fs(repos); SVN_ERR(svn_fs_open_txn(&txn, fs, txn_name, pool)); SVN_ERR(svn_fs_txn_root(&root, txn, pool)); /* Get the authz file contents. */ SVN_ERR(read_file_contents(&authz_contents, authz_file, root, pool)); /* Get the groups file contents if needed. */ if (groups_file) SVN_ERR(read_file_contents(&groups_contents, groups_file, root, pool)); else groups_contents = NULL; err = svn_repos_authz_parse(authz, authz_contents, groups_contents, pool); /* Add the filename to the error stack since the parser doesn't have it. */ if (err != SVN_NO_ERROR) return svn_error_createf(err->apr_err, err, "Error parsing authz file: '%s':", authz_file); return SVN_NO_ERROR; }
dav_error * dav_svn__delete_activity(const dav_svn_repos *repos, const char *activity_id) { dav_error *err = NULL; const char *pathname; svn_fs_txn_t *txn; const char *txn_name; svn_error_t *serr; /* gstein sez: If the activity ID is not in the database, return a 404. If the transaction is not present or is immutable, return a 204. For all other failures, return a 500. */ pathname = activity_pathname(repos, activity_id); txn_name = read_txn(pathname, repos->pool); if (txn_name == NULL) { return dav_new_error(repos->pool, HTTP_NOT_FOUND, 0, "could not find activity."); } /* After this point, we have to cleanup the value and database. */ /* An empty txn_name indicates the transaction has been committed, so don't try to clean it up. */ if (*txn_name) { /* Now, we attempt to delete TXN_NAME from the Subversion repository. If we fail only because the transaction doesn't exist, don't sweat it (but then, also don't try to remove it). */ if ((serr = svn_fs_open_txn(&txn, repos->fs, txn_name, repos->pool))) { if (serr->apr_err == SVN_ERR_FS_NO_SUCH_TRANSACTION) { svn_error_clear(serr); serr = SVN_NO_ERROR; } else { err = dav_svn__convert_err(serr, HTTP_INTERNAL_SERVER_ERROR, "could not open transaction.", repos->pool); return err; } } else { serr = svn_fs_abort_txn(txn, repos->pool); if (serr) { err = dav_svn__convert_err(serr, HTTP_INTERNAL_SERVER_ERROR, "could not abort transaction.", repos->pool); return err; } } } /* Finally, we remove the activity from the activities database. */ serr = svn_io_remove_file(pathname, repos->pool); if (serr) err = dav_svn__convert_err(serr, HTTP_INTERNAL_SERVER_ERROR, "unable to remove activity.", repos->pool); return err; }