diff options
Diffstat (limited to 'subversion/libsvn_repos/repos.h')
-rw-r--r-- | subversion/libsvn_repos/repos.h | 425 |
1 files changed, 425 insertions, 0 deletions
diff --git a/subversion/libsvn_repos/repos.h b/subversion/libsvn_repos/repos.h new file mode 100644 index 0000000..fd5b0b4 --- /dev/null +++ b/subversion/libsvn_repos/repos.h @@ -0,0 +1,425 @@ +/* repos.h : interface to Subversion repository, private to libsvn_repos + * + * ==================================================================== + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * ==================================================================== + */ + +#ifndef SVN_LIBSVN_REPOS_H +#define SVN_LIBSVN_REPOS_H + +#include <apr_pools.h> +#include <apr_hash.h> + +#include "svn_fs.h" + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + + +/* Repository format number. + + Formats 0, 1 and 2 were pre-1.0. + + Format 3 was current for 1.0 through to 1.3. + + Format 4 was an abortive experiment during the development of the + locking feature in the lead up to 1.2. + + Format 5 was new in 1.4, and is the first format which may contain + BDB or FSFS filesystems with a FS format other than 1, since prior + formats are accepted by some versions of Subversion which do not + pay attention to the FS format number. +*/ +#define SVN_REPOS__FORMAT_NUMBER SVN_REPOS__FORMAT_NUMBER_1_4 +#define SVN_REPOS__FORMAT_NUMBER_1_4 5 +#define SVN_REPOS__FORMAT_NUMBER_LEGACY 3 + + +/*** Repository layout. ***/ + +/* The top-level repository dir contains a README and various + subdirectories. */ +#define SVN_REPOS__README "README.txt" /* Explanation for trespassers. */ +#define SVN_REPOS__FORMAT "format" /* Stores the current version + of the repository. */ +#define SVN_REPOS__DB_DIR "db" /* Where Berkeley lives. */ +#define SVN_REPOS__DAV_DIR "dav" /* DAV sandbox, for pre-1.5 */ +#define SVN_REPOS__LOCK_DIR "locks" /* Lock files live here. */ +#define SVN_REPOS__HOOK_DIR "hooks" /* Hook programs. */ +#define SVN_REPOS__CONF_DIR "conf" /* Configuration files. */ + +/* Things for which we keep lockfiles. */ +#define SVN_REPOS__DB_LOCKFILE "db.lock" /* Our Berkeley lockfile. */ +#define SVN_REPOS__DB_LOGS_LOCKFILE "db-logs.lock" /* BDB logs lockfile. */ + +/* In the repository hooks directory, look for these files. */ +#define SVN_REPOS__HOOK_START_COMMIT "start-commit" +#define SVN_REPOS__HOOK_PRE_COMMIT "pre-commit" +#define SVN_REPOS__HOOK_POST_COMMIT "post-commit" +#define SVN_REPOS__HOOK_READ_SENTINEL "read-sentinels" +#define SVN_REPOS__HOOK_WRITE_SENTINEL "write-sentinels" +#define SVN_REPOS__HOOK_PRE_REVPROP_CHANGE "pre-revprop-change" +#define SVN_REPOS__HOOK_POST_REVPROP_CHANGE "post-revprop-change" +#define SVN_REPOS__HOOK_PRE_LOCK "pre-lock" +#define SVN_REPOS__HOOK_POST_LOCK "post-lock" +#define SVN_REPOS__HOOK_PRE_UNLOCK "pre-unlock" +#define SVN_REPOS__HOOK_POST_UNLOCK "post-unlock" + + +/* The extension added to the names of example hook scripts. */ +#define SVN_REPOS__HOOK_DESC_EXT ".tmpl" + +/* The file which contains a custom set of environment variables + * passed inherited to hook scripts, in the repository conf directory. */ +#define SVN_REPOS__CONF_HOOKS_ENV "hooks-env" +/* The name of the default section in the hooks-env config file. */ +#define SVN_REPOS__HOOKS_ENV_DEFAULT_SECTION "default" + +/* The configuration file for svnserve, in the repository conf directory. */ +#define SVN_REPOS__CONF_SVNSERVE_CONF "svnserve.conf" + +/* In the svnserve default configuration, these are the suggested + locations for the passwd, authz and groups files (in the repository + conf directory), and we put example templates there. */ +#define SVN_REPOS__CONF_PASSWD "passwd" +#define SVN_REPOS__CONF_AUTHZ "authz" +#define SVN_REPOS__CONF_GROUPS "groups" + +/* The Repository object, created by svn_repos_open2() and + svn_repos_create(). */ +struct svn_repos_t +{ + /* A Subversion filesystem object. */ + svn_fs_t *fs; + + /* The path to the repository's top-level directory. */ + char *path; + + /* The path to the repository's conf directory. */ + char *conf_path; + + /* The path to the repository's hooks directory. */ + char *hook_path; + + /* The path to the repository's locks directory. */ + char *lock_path; + + /* The path to the Berkeley DB filesystem environment. */ + char *db_path; + + /* The format number of this repository. */ + int format; + + /* The path to the repository's hooks enviroment file. If NULL, hooks run + * in an empty environment. */ + const char *hooks_env_path; + + /* The FS backend in use within this repository. */ + const char *fs_type; + + /* If non-null, a list of all the capabilities the client (on the + current connection) has self-reported. Each element is a + 'const char *', one of SVN_RA_CAPABILITY_*. + + Note: it is somewhat counterintuitive that we store the client's + capabilities, which are session-specific, on the repository + 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. */ + 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. + Most likely the keys and values are constants anyway (and + sufficiently well-informed internal code may just compare against + those constants' addresses, therefore). */ + apr_hash_t *repository_capabilities; + + /* Pool from which this structure was allocated. Also used for + auxiliary repository-related data that requires a matching + lifespan. (As the svn_repos_t structure tends to be relatively + long-lived, please be careful regarding this pool's usage.) */ + apr_pool_t *pool; +}; + + +/*** Hook-running Functions ***/ + +/* Set *HOOKS_ENV_P to the parsed contents of the hooks-env file + LOCAL_ABSPATH, allocated in RESULT_POOL. (This result is suitable + for delivery to the various hook wrapper functions which accept a + 'hooks_env' parameter.) If LOCAL_ABSPATH is NULL, set *HOOKS_ENV_P + to NULL. + + Use SCRATCH_POOL for temporary allocations. */ +svn_error_t * +svn_repos__parse_hooks_env(apr_hash_t **hooks_env_p, + const char *local_abspath, + apr_pool_t *result_pool, + apr_pool_t *scratch_pool); + +/* Run the start-commit hook for REPOS. Use POOL for any temporary + allocations. If the hook fails, return SVN_ERR_REPOS_HOOK_FAILURE. + + HOOKS_ENV is a hash of hook script environment information returned + via svn_repos__parse_hooks_env() (or NULL if no such information is + available). + + USER is the authenticated name of the user starting the commit. + + CAPABILITIES is a list of 'const char *' capability names (using + SVN_RA_CAPABILITY_*) that the client has self-reported. Note that + there is no guarantee the client is telling the truth: the hook + should not make security assumptions based on the capabilities. + + TXN_NAME is the name of the commit transaction that's just been + created. */ +svn_error_t * +svn_repos__hooks_start_commit(svn_repos_t *repos, + apr_hash_t *hooks_env, + const char *user, + const apr_array_header_t *capabilities, + const char *txn_name, + apr_pool_t *pool); + +/* Run the pre-commit hook for REPOS. Use POOL for any temporary + allocations. If the hook fails, return SVN_ERR_REPOS_HOOK_FAILURE. + + HOOKS_ENV is a hash of hook script environment information returned + via svn_repos__parse_hooks_env() (or NULL if no such information is + available). + + TXN_NAME is the name of the transaction that is being committed. */ +svn_error_t * +svn_repos__hooks_pre_commit(svn_repos_t *repos, + apr_hash_t *hooks_env, + const char *txn_name, + apr_pool_t *pool); + +/* Run the post-commit hook for REPOS. Use POOL for any temporary + allocations. If the hook fails, run SVN_ERR_REPOS_HOOK_FAILURE. + + HOOKS_ENV is a hash of hook script environment information returned + via svn_repos__parse_hooks_env() (or NULL if no such information is + available). + + REV is the revision that was created as a result of the commit. */ +svn_error_t * +svn_repos__hooks_post_commit(svn_repos_t *repos, + apr_hash_t *hooks_env, + svn_revnum_t rev, + const char *txn_name, + apr_pool_t *pool); + +/* Run the pre-revprop-change hook for REPOS. Use POOL for any + temporary allocations. If the hook fails, return + SVN_ERR_REPOS_HOOK_FAILURE. + + HOOKS_ENV is a hash of hook script environment information returned + via svn_repos__parse_hooks_env() (or NULL if no such information is + available). + + REV is the revision whose property is being changed. + AUTHOR is the authenticated name of the user changing the prop. + NAME is the name of the property being changed. + NEW_VALUE is the new value of the property. + ACTION is indicates if the property is being 'A'dded, 'M'odified, + or 'D'eleted. + + The pre-revprop-change hook will have the new property value + written to its stdin. If the property is being deleted, no data + will be written. */ +svn_error_t * +svn_repos__hooks_pre_revprop_change(svn_repos_t *repos, + apr_hash_t *hooks_env, + svn_revnum_t rev, + const char *author, + const char *name, + const svn_string_t *new_value, + char action, + apr_pool_t *pool); + +/* Run the pre-revprop-change hook for REPOS. Use POOL for any + temporary allocations. If the hook fails, return + SVN_ERR_REPOS_HOOK_FAILURE. + + HOOKS_ENV is a hash of hook script environment information returned + via svn_repos__parse_hooks_env() (or NULL if no such information is + available). + + REV is the revision whose property was changed. + AUTHOR is the authenticated name of the user who changed the prop. + NAME is the name of the property that was changed, and OLD_VALUE is + that property's value immediately before the change, or null if + none. ACTION indicates if the property was 'A'dded, 'M'odified, + or 'D'eleted. + + The old value will be passed to the post-revprop hook on stdin. If + the property is being created, no data will be written. */ +svn_error_t * +svn_repos__hooks_post_revprop_change(svn_repos_t *repos, + apr_hash_t *hooks_env, + svn_revnum_t rev, + const char *author, + const char *name, + const svn_string_t *old_value, + char action, + apr_pool_t *pool); + +/* Run the pre-lock hook for REPOS. Use POOL for any temporary + allocations. If the hook fails, return SVN_ERR_REPOS_HOOK_FAILURE. + + HOOKS_ENV is a hash of hook script environment information returned + via svn_repos__parse_hooks_env() (or NULL if no such information is + available). + + PATH is the path being locked, USERNAME is the person doing it, + COMMENT is the comment of the lock, and is treated as an empty + string when NULL is given. STEAL-LOCK is a flag if the user is + stealing the lock. + + If TOKEN is non-null, set *TOKEN to a new lock token generated by + the pre-lock hook, if any (see the pre-lock hook template for more + information). If TOKEN is non-null but the hook does not return + any token, then set *TOKEN to empty string. */ + +svn_error_t * +svn_repos__hooks_pre_lock(svn_repos_t *repos, + apr_hash_t *hooks_env, + const char **token, + const char *path, + const char *username, + const char *comment, + svn_boolean_t steal_lock, + apr_pool_t *pool); + +/* Run the post-lock hook for REPOS. Use POOL for any temporary + allocations. If the hook fails, return SVN_ERR_REPOS_HOOK_FAILURE. + + HOOKS_ENV is a hash of hook script environment information returned + via svn_repos__parse_hooks_env() (or NULL if no such information is + available). + + PATHS is an array of paths being locked, USERNAME is the person + who did it. */ +svn_error_t * +svn_repos__hooks_post_lock(svn_repos_t *repos, + apr_hash_t *hooks_env, + const apr_array_header_t *paths, + const char *username, + apr_pool_t *pool); + +/* Run the pre-unlock hook for REPOS. Use POOL for any temporary + allocations. If the hook fails, return SVN_ERR_REPOS_HOOK_FAILURE. + + HOOKS_ENV is a hash of hook script environment information returned + via svn_repos__parse_hooks_env() (or NULL if no such information is + available). + + PATH is the path being unlocked, USERNAME is the person doing it, + TOKEN is the lock token to be unlocked which should not be NULL, + and BREAK-LOCK is a flag if the user is breaking the lock. */ +svn_error_t * +svn_repos__hooks_pre_unlock(svn_repos_t *repos, + apr_hash_t *hooks_env, + const char *path, + const char *username, + const char *token, + svn_boolean_t break_lock, + apr_pool_t *pool); + +/* Run the post-unlock hook for REPOS. Use POOL for any temporary + allocations. If the hook fails, return SVN_ERR_REPOS_HOOK_FAILURE. + + HOOKS_ENV is a hash of hook script environment information returned + via svn_repos__parse_hooks_env() (or NULL if no such information is + available). + + PATHS is an array of paths being unlocked, USERNAME is the person + who did it. */ +svn_error_t * +svn_repos__hooks_post_unlock(svn_repos_t *repos, + apr_hash_t *hooks_env, + const apr_array_header_t *paths, + const char *username, + apr_pool_t *pool); + + +/*** Authz Functions ***/ + +/* Read authz configuration data from PATH into *AUTHZ_P, allocated + in POOL. If GROUPS_PATH is set, use the global groups parsed from it. + + PATH and GROUPS_PATH may be a dirent or a registry path and iff ACCEPT_URLS + is set it may also be an absolute file url. + + If PATH or GROUPS_PATH is not a valid authz rule file, then return + SVN_AUTHZ_INVALID_CONFIG. The contents of *AUTHZ_P is then + undefined. If MUST_EXIST is TRUE, a missing authz or global groups file + is also an error. */ +svn_error_t * +svn_repos__authz_read(svn_authz_t **authz_p, + const char *path, + const char *groups_path, + svn_boolean_t must_exist, + svn_boolean_t accept_urls, + apr_pool_t *pool); + + +/*** Utility Functions ***/ + +/* Set *CHANGED_P to TRUE if ROOT1/PATH1 and ROOT2/PATH2 have + different contents, FALSE if they have the same contents. + Use POOL for temporary allocation. */ +svn_error_t * +svn_repos__compare_files(svn_boolean_t *changed_p, + svn_fs_root_t *root1, + const char *path1, + svn_fs_root_t *root2, + const char *path2, + apr_pool_t *pool); + +/* Set *PREV_PATH and *PREV_REV to the path and revision which + represent the location at which PATH in FS was located immediately + prior to REVISION iff there was a copy operation (to PATH or one of + its parent directories) between that previous location and + PATH@REVISION, and set *APPEARED_REV to the first revision in which + PATH@REVISION appeared at PATH as a result of that copy operation. + + If there was no such copy operation in that portion + of PATH's history, set *PREV_PATH to NULL, and set *PREV_REV and + *APPEARED_REV to SVN_INVALID_REVNUM. + + NOTE: Any of PREV_PATH, PREV_REV, and APPEARED_REV may be NULL to + if that information is of no interest to the caller. */ +svn_error_t * +svn_repos__prev_location(svn_revnum_t *appeared_rev, + const char **prev_path, + svn_revnum_t *prev_rev, + svn_fs_t *fs, + svn_revnum_t revision, + const char *path, + apr_pool_t *pool); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* SVN_LIBSVN_REPOS_H */ |