FYI, as we discussed briefly at the summit, I finally integrated the
dav-mirror stuff into trunk. So, this allows cheap transparent
read-only SVN WebDAV-based servers to be deployed.
I also updated notes/webdav-proxy
(http://svn.collab.net/repos/svn/trunk/notes/webdav-proxy) so people
can figure out what it's all about.
Enjoy! -- justin
---------- Forwarded message ----------
From: jerenkrantz@tigris.org <jerenkrantz@tigris.org>
Date: Dec 8, 2006 4:02 PM
Subject: svn commit: r22606 - trunk/subversion/mod_dav_svn
To: svn@subversion.tigris.org
Author: jerenkrantz
Date: Fri Dec 8 07:02:26 2006
New Revision: 22606
Log:
mod_dav_svn: Merge in dav-mirror branch into trunk.
This was discussed at the summit, but I haven't had a tuit until now.
* subversion/mod_dav_svn/mod_dav_svn.c
(dir_conf_t): Add in root_dir and master_uri fields.
(create_dir_config): Track our root directories.
(merge_dir_config): Merge in root_dir and master_uri fields.
(SVNMasterURI_cmd): Implement SVNMasterURI directive.
(dav_svn__get_root_dir, dav_svn__get_master_uri): Expose new fields.
(cmds): Declare SVNMasterURI directive.
(register_hooks): Register the dav-mirror hooks.
* subversion/mod_dav_svn/dav_svn.h
(dav_svn__get_root_dir, dav_svn__get_master_uri,
dav_svn__proxy_merge_fixup, dav_svn__location_in_filter,
dav_svn__location_header_filter, dav_svn__location_body_filter): Declare.
* subversion/mod_dav_svn/mirror.c: New file.
(dav_svn__proxy_merge_fixup, dav_svn__location_in_filter,
dav_svn__location_header_filter, dav_svn__location_body_filter): Implement.
(This log message describes the diff from trunk; for history see the branch.)
Added:
trunk/subversion/mod_dav_svn/mirror.c
- copied unchanged from r22605,
/branches/dav-mirror/subversion/mod_dav_svn/mirror.c
Modified:
trunk/subversion/mod_dav_svn/dav_svn.h
trunk/subversion/mod_dav_svn/mod_dav_svn.c
Modified: trunk/subversion/mod_dav_svn/dav_svn.h
URL: http://svn.collab.net/viewvc/svn/trunk/subversion/mod_dav_svn/dav_svn.h?pathrev=22606&r1=22605&r2=22606
==============================================================================
--- trunk/subversion/mod_dav_svn/dav_svn.h (original)
+++ trunk/subversion/mod_dav_svn/dav_svn.h Fri Dec 8 07:02:26 2006
@@ -292,6 +292,11 @@
/* Return the URI of an XSL transform stylesheet */
const char *dav_svn__get_xslt_uri(request_rec *r);
+/* Return the master URI (for mirroring) */
+const char * dav_svn__get_master_uri(request_rec *r);
+
+/* Return the root directory */
+const char * dav_svn__get_root_dir(request_rec *r);
/*** activity.c ***/
@@ -686,6 +691,30 @@
ap_filter_t *output,
apr_pool_t *pool);
+/*** mirror.c ***/
+
+/* Perform the fixup hook for the R request. */
+int dav_svn__proxy_merge_fixup(request_rec *r);
+
+/* An Apache input filter which rewrites the locations in headers and
+ request body. It reads from filter F using BB data, MODE mode, BLOCK
+ blocking strategy, and READBYTES. */
+apr_status_t dav_svn__location_in_filter(ap_filter_t *f,
+ apr_bucket_brigade *bb,
+ ap_input_mode_t mode,
+ apr_read_type_e block,
+ apr_off_t readbytes);
+
+/* An Apache output filter F which rewrites the response headers for
+ * location headers. It will modify the stream in BB. */
+apr_status_t dav_svn__location_header_filter(ap_filter_t *f,
+ apr_bucket_brigade *bb);
+
+/* An Apache output filter F which rewrites the response body for
+ * location headers. It will modify the stream in BB. */
+apr_status_t dav_svn__location_body_filter(ap_filter_t *f,
+ apr_bucket_brigade *bb);
+
#ifdef __cplusplus
}
Modified: trunk/subversion/mod_dav_svn/mod_dav_svn.c
URL: http://svn.collab.net/viewvc/svn/trunk/subversion/mod_dav_svn/mod_dav_svn.c?pathrev=22606&r1=22605&r2=22606
==============================================================================
--- trunk/subversion/mod_dav_svn/mod_dav_svn.c (original)
+++ trunk/subversion/mod_dav_svn/mod_dav_svn.c Fri Dec 8 07:02:26 2006
@@ -65,6 +65,8 @@
enum conf_flag autoversioning; /* whether autoversioning is active */
enum conf_flag do_path_authz; /* whether GET subrequests are active */
enum conf_flag list_parentpath; /* whether to allow GET of parentpath */
+ const char *root_dir; /* our top-level directory */
+ const char *master_uri; /* URI to the master SVN repos */
} dir_conf_t;
@@ -137,6 +139,8 @@
/* NOTE: dir==NULL creates the default per-dir config */
dir_conf_t *conf = apr_pcalloc(p, sizeof(*conf));
+ conf->root_dir = dir;
+
return conf;
}
@@ -151,12 +155,15 @@
newconf = apr_pcalloc(p, sizeof(*newconf));
newconf->fs_path = INHERIT_VALUE(parent, child, fs_path);
+ newconf->master_uri = INHERIT_VALUE(parent, child, master_uri);
newconf->repo_name = INHERIT_VALUE(parent, child, repo_name);
newconf->xslt_uri = INHERIT_VALUE(parent, child, xslt_uri);
newconf->fs_parent_path = INHERIT_VALUE(parent, child, fs_parent_path);
newconf->autoversioning = INHERIT_VALUE(parent, child, autoversioning);
newconf->do_path_authz = INHERIT_VALUE(parent, child, do_path_authz);
newconf->list_parentpath = INHERIT_VALUE(parent, child, list_parentpath);
+ /* Prefer our parent's value over our new one - hence the swap. */
+ newconf->root_dir = INHERIT_VALUE(child, parent, root_dir);
return newconf;
}
@@ -174,6 +181,17 @@
static const char *
+SVNMasterURI_cmd(cmd_parms *cmd, void *config, const char *arg1)
+{
+ dir_conf_t *conf = config;
+
+ conf->master_uri = apr_pstrdup(cmd->pool, arg1);
+
+ return NULL;
+}
+
+
+static const char *
SVNIndexXSLT_cmd(cmd_parms *cmd, void *config, const char *arg1)
{
dir_conf_t *conf = config;
@@ -366,6 +384,26 @@
const char *
+dav_svn__get_root_dir(request_rec *r)
+{
+ dir_conf_t *conf;
+
+ conf = ap_get_module_config(r->per_dir_config, &dav_svn_module);
+ return conf->root_dir;
+}
+
+
+const char *
+dav_svn__get_master_uri(request_rec *r)
+{
+ dir_conf_t *conf;
+
+ conf = ap_get_module_config(r->per_dir_config, &dav_svn_module);
+ return conf->master_uri;
+}
+
+
+const char *
dav_svn__get_xslt_uri(request_rec *r)
{
dir_conf_t *conf;
@@ -577,6 +615,10 @@
AP_INIT_FLAG("SVNListParentPath", SVNListParentPath_cmd, NULL,
ACCESS_CONF|RSRC_CONF, "allow GET of SVNParentPath."),
+ /* per directory/location */
+ AP_INIT_TAKE1("SVNMasterURI", SVNMasterURI_cmd, NULL, ACCESS_CONF,
+ "specifies a URI to access a master Subversion repository"),
+
{ NULL }
};
@@ -614,6 +656,15 @@
dav_hook_insert_all_liveprops(dav_svn__insert_all_liveprops, NULL, NULL,
APR_HOOK_MIDDLE);
dav_register_liveprop_group(pconf, &dav_svn__liveprop_group);
+
+ /* Proxy / mirroring filters and fixups */
+ ap_register_output_filter("LocationRewrite", dav_svn__location_header_filter,
+ NULL, AP_FTYPE_CONTENT_SET);
+ ap_register_output_filter("ReposRewrite", dav_svn__location_body_filter,
+ NULL, AP_FTYPE_CONTENT_SET);
+ ap_register_input_filter("IncomingRewrite", dav_svn__location_in_filter,
+ NULL, AP_FTYPE_CONTENT_SET);
+ ap_hook_fixups(dav_svn__proxy_merge_fixup, NULL, NULL, APR_HOOK_MIDDLE);
}
---------------------------------------------------------------------
To unsubscribe, e-mail: svn-unsubscribe@subversion.tigris.org
For additional commands, e-mail: svn-help@subversion.tigris.org
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@subversion.tigris.org
For additional commands, e-mail: dev-help@subversion.tigris.org
Received on Fri Dec 8 16:23:55 2006