[svn.haxx.se] · SVN Dev · SVN Users · SVN Org · TSVN Dev · TSVN Users · Subclipse Dev · Subclipse Users · this month's index

Fwd: svn commit: r22606 - trunk/subversion/mod_dav_svn

From: Justin Erenkrantz <justin_at_erenkrantz.com>
Date: 2006-12-08 16:23:34 CET

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

This is an archived mail posted to the Subversion Dev mailing list.

This site is subject to the Apache Privacy Policy and the Apache Public Forum Archive Policy.