📄 dav_svn.h
字号:
/*
* dav_svn.h: types, functions, macros for the DAV/SVN Apache module
*
* ====================================================================
* Copyright (c) 2000-2004 CollabNet. All rights reserved.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
* are also available at http://subversion.tigris.org/license-1.html.
* If newer versions of this license are posted there, you may use a
* newer version instead, at your option.
*
* This software consists of voluntary contributions made by many
* individuals. For exact contribution history, see the revision
* history and logs, available at http://subversion.tigris.org/.
* ====================================================================
*/
#ifndef DAV_SVN_H
#define DAV_SVN_H
#include <httpd.h>
#include <apr_tables.h>
#include <apr_xml.h>
#include <mod_dav.h>
#include "svn_error.h"
#include "svn_fs.h"
#include "svn_repos.h"
#include "svn_path.h"
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
#define DAV_SVN_DEFAULT_VCC_NAME "default"
/* dav_svn_repos
*
* Record information about the repository that a resource belongs to.
* This structure will be shared between multiple resources so that we
* can optimized our FS access.
*
* Note that we do not refcount this structure. Presumably, we will need
* it throughout the life of the request. Therefore, we can just leave it
* for the request pool to cleanup/close.
*
* Also, note that it is possible that two resources may have distinct
* dav_svn_repos structures, yet refer to the same repository. This is
* allowed by the SVN FS interface.
*
* ### should we attempt to merge them when we detect this situation in
* ### places like is_same_resource, is_parent_resource, or copy/move?
* ### I say yes: the FS will certainly have an easier time if there is
* ### only a single FS open; otherwise, it will have to work a bit harder
* ### to keep the things in sync.
*/
typedef struct {
apr_pool_t *pool; /* request_rec -> pool */
/* Remember the root URL path of this repository (just a path; no
scheme, host, or port).
Example: the URI is "http://host/repos/file", this will be "/repos".
This always starts with "/", and if there are any components
beyond that, then it does not end with "/".
*/
const char *root_path;
/* Remember an absolute URL for constructing other URLs. In the above
example, this would be "http://host" (note: no trailing slash)
*/
const char *base_url;
/* Remember the special URI component for this repository */
const char *special_uri;
/* This records the filesystem path to the SVN FS */
const char *fs_path;
/* The name of this repository */
const char *repo_name;
/* The URI of the XSL transform for directory indexes */
const char *xslt_uri;
/* Whether autoversioning is active for this repository. */
svn_boolean_t autoversioning;
/* the open repository */
svn_repos_t *repos;
/* a cached copy of REPOS->fs above. */
svn_fs_t *fs;
/* the user operating against this repository */
const char *username;
} dav_svn_repos;
/*
** dav_svn_private_restype: identifiers for our different private resources
**
** There are some resources within mod_dav_svn that are "privately defined".
** This isn't so much to prevent other people from knowing what they are,
** but merely that mod_dav doesn't have a standard name for them.
*/
enum dav_svn_private_restype {
DAV_SVN_RESTYPE_UNSET,
DAV_SVN_RESTYPE_ROOT_COLLECTION, /* .../!svn/ */
DAV_SVN_RESTYPE_VER_COLLECTION, /* .../!svn/ver/ */
DAV_SVN_RESTYPE_HIS_COLLECTION, /* .../!svn/his/ */
DAV_SVN_RESTYPE_WRK_COLLECTION, /* .../!svn/wrk/ */
DAV_SVN_RESTYPE_ACT_COLLECTION, /* .../!svn/act/ */
DAV_SVN_RESTYPE_VCC_COLLECTION, /* .../!svn/vcc/ */
DAV_SVN_RESTYPE_BC_COLLECTION, /* .../!svn/bc/ */
DAV_SVN_RESTYPE_BLN_COLLECTION, /* .../!svn/bln/ */
DAV_SVN_RESTYPE_WBL_COLLECTION, /* .../!svn/wbl/ */
DAV_SVN_RESTYPE_VCC /* .../!svn/vcc/NAME */
};
/* store info about a root in a repository */
typedef struct {
/* If a root within the FS has been opened, the value is stored here.
Otherwise, this field is NULL. */
svn_fs_root_t *root;
/* If the root has been opened, and it was opened for a specific revision,
then it is contained in REV. If the root is unopened or corresponds to
a transaction, then REV will be SVN_INVALID_REVNUM. */
svn_revnum_t rev;
/* If this resource is an activity or part of an activity, this specifies
the ID of that activity. It may not (yet) correspond to a transaction
in the FS.
WORKING and ACTIVITY resources use this field.
*/
const char *activity_id;
/* If the root is part of a transaction, this contains the FS's tranaction
name. It may be NULL if this root corresponds to a specific revision.
It may also be NULL if we have not opened the root yet.
WORKING and ACTIVITY resources use this field.
*/
const char *txn_name;
/* If the root is part of a transaction, this contains the FS's transaction
handle. It may be NULL if this root corresponds to a specific revision.
It may also be NULL if we have not opened the transaction yet.
WORKING resources use this field.
*/
svn_fs_txn_t *txn;
} dav_svn_root;
/* internal structure to hold information about this resource */
struct dav_resource_private {
/* Path from the SVN repository root to this resource. This value has
a leading slash. It will never have a trailing slash, even if the
resource represents a collection.
For example: URI is http://host/repos/file -- path will be "/file".
NOTE: this path is from the URI and does NOT necessarily correspond
to a path within the FS repository.
*/
svn_stringbuf_t *uri_path;
/* The FS repository path to this resource, with a leading "/". Note
that this is "/" the root. This value will be NULL for resources
that have no corresponding resource within the repository (such as
the PRIVATE resources, Baselines, or Working Baselines). */
const char *repos_path;
/* the FS repository this resource is associated with */
dav_svn_repos *repos;
/* what FS root this resource occurs within */
dav_svn_root root;
/* for PRIVATE resources: the private resource type */
enum dav_svn_private_restype restype;
/* The request which created this resource. We need this to
generate subrequests. */
request_rec *r;
/* ### hack to deal with the Content-Type header on a PUT */
int is_svndiff;
/* ### record the base for computing a delta during a GET */
const char *delta_base;
/* the value of any SVN_DAV_OPTIONS_HEADER that came in the request */
const char *svn_client_options;
/* the revnum value from a possible SVN_DAV_VERSION_NAME_HEADER */
svn_revnum_t version_name;
/* Hex MD5 digests for base text and resultant fulltext.
Either or both of these may be null, in which case ignored. */
const char *base_checksum;
const char *result_checksum;
/* was this resource auto-checked-out? */
svn_boolean_t auto_checked_out;
/* Pool to allocate temporary data from */
apr_pool_t *pool;
};
/*
LIVE PROPERTY HOOKS
These are standard hooks defined by mod_dav. We implement them to expose
various live properties on the resources under our control.
gather_propsets: appends URIs into the array; the property set URIs are
used to specify which sets of custom properties we
define/expose.
find_liveprop: given a namespace and name, return the hooks for the
provider who defines that property.
insert_all_liveprops: for a given resource, insert all of the live
properties defined on that resource. The properties
are inserted according to the WHAT parameter.
*/
void dav_svn_gather_propsets(apr_array_header_t *uris);
int dav_svn_find_liveprop(const dav_resource *resource,
const char *ns_uri, const char *name,
const dav_hooks_liveprop **hooks);
void dav_svn_insert_all_liveprops(request_rec *r, const dav_resource *resource,
dav_prop_insert what, apr_text_header *phdr);
/* register our live property URIs with mod_dav. */
void dav_svn_register_uris(apr_pool_t *p);
/* generate an ETag for RESOURCE and return it, allocated in POOL. */
const char * dav_svn_getetag(const dav_resource *resource, apr_pool_t *pool);
/* our hooks structures; these are gathered into a dav_provider */
extern const dav_hooks_repository dav_svn_hooks_repos;
extern const dav_hooks_propdb dav_svn_hooks_propdb;
extern const dav_hooks_liveprop dav_svn_hooks_liveprop;
extern const dav_hooks_vsn dav_svn_hooks_vsn;
/* for the repository referred to by this request, where is the SVN FS? */
const char *dav_svn_get_fs_path(request_rec *r);
const char *dav_svn_get_fs_parent_path(request_rec *r);
/* for the repository referred to by this request, is autoversioning active? */
svn_boolean_t dav_svn_get_autoversioning_flag(request_rec *r);
/* for the repository referred to by this request, are subrequests active? */
svn_boolean_t dav_svn_get_pathauthz_flag(request_rec *r);
/* SPECIAL URI
SVN needs to create many types of "pseudo resources" -- resources
that don't correspond to the users' files/directories in the
repository. Specifically, these are:
- working resources
- activities
- version resources
- version history resources
Each of these will be placed under a portion of the URL namespace
that defines the SVN repository. For example, let's say the user
has configured an SVN repository at http://host/svn/repos. The
special resources could be configured to live at .../!svn/ under
that repository. Thus, an activity might be located at
http://host/svn/repos/!svn/act/1234.
The special URI is configurable on a per-server basis and defaults
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -