svn commit: r205774 - in user/des/svnsup/src: distill libsvnsup

Dag-Erling Smorgrav des at FreeBSD.org
Sat Mar 27 18:40:09 UTC 2010


Author: des
Date: Sat Mar 27 18:40:08 2010
New Revision: 205774
URL: http://svn.freebsd.org/changeset/base/205774

Log:
  Canonicalize the session URL.  Split it into root + subdir and use that
  information to rewrite file and directory paths from absolute to relative
  to the session URL.

Modified:
  user/des/svnsup/src/distill/distill.c
  user/des/svnsup/src/distill/distill.h
  user/des/svnsup/src/libsvnsup/svnsup.h
  user/des/svnsup/src/libsvnsup/svnsup_delta.c

Modified: user/des/svnsup/src/distill/distill.c
==============================================================================
--- user/des/svnsup/src/distill/distill.c	Sat Mar 27 18:24:27 2010	(r205773)
+++ user/des/svnsup/src/distill/distill.c	Sat Mar 27 18:40:08 2010	(r205774)
@@ -31,6 +31,7 @@
 #include "config.h"
 #endif
 
+#include <assert.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <unistd.h>
@@ -49,6 +50,7 @@ distill(const char *url, unsigned long r
 	svn_auth_provider_object_t *auth_provider;
 	apr_array_header_t *auth_providers;
 	svn_ra_session_t *ra_session;
+	const char *root, *subdir, *uuid;
 	svn_error_t *error;
 	svnsup_delta_t sd;
 	svnsup_err_t err;
@@ -57,6 +59,9 @@ distill(const char *url, unsigned long r
 	status = apr_pool_create(&pool, NULL);
 	SVNSUP_APR_ERROR(status, "apr_pool_create()");
 
+	/* canonicalize URL */
+	url = svn_path_canonicalize(url, pool);
+
 	/* set up our authentication system */
 	/* XXX check for errors */
 	auth_providers = apr_array_make(pool, 1, sizeof auth_provider);
@@ -72,9 +77,30 @@ distill(const char *url, unsigned long r
 	    NULL, config, pool);
 	SVNSUP_SVN_ERROR(error, "svn_ra_open3()");
 
+	/* get repo uuid */
+	error = svn_ra_get_uuid2(ra_session, &uuid, pool);
+	SVNSUP_SVN_ERROR(error, "svn_ra_get_uuid2()");
+
+	/* get repo root */
+	error = svn_ra_get_repos_root2(ra_session, &root, pool);
+	SVNSUP_SVN_ERROR(error, "svn_ra_get_repos_root2()");
+
+	/* get subdirectory; libsvn guarantees root is a prefix of url */
+	assert(strstr(url, root) == url);
+	subdir = url + strlen(root);
+	assert(*subdir == '/' || *subdir == '\0');
+	if (*subdir == '/')
+		++subdir;
+
 	/* XXX create delta */
 	err = svnsup_create_delta(&sd);
 	SVNSUP_SVNSUP_ERROR(err, "svnsup_delta_create()");
+	err = svnsup_delta_root(sd, root);
+	SVNSUP_SVNSUP_ERROR(err, "svnsup_delta_root()");
+	err = svnsup_delta_uuid(sd, uuid);
+	SVNSUP_SVNSUP_ERROR(err, "svnsup_delta_uuid()");
+	err = svnsup_delta_path(sd, subdir);
+	SVNSUP_SVNSUP_ERROR(err, "svnsup_delta_path()");
 
 	/* get revision metadata */
 	error = svn_ra_get_log2(ra_session, NULL, revision, revision, 0,

Modified: user/des/svnsup/src/distill/distill.h
==============================================================================
--- user/des/svnsup/src/distill/distill.h	Sat Mar 27 18:24:27 2010	(r205773)
+++ user/des/svnsup/src/distill/distill.h	Sat Mar 27 18:40:08 2010	(r205774)
@@ -40,6 +40,7 @@
 #include <subversion-1/svn_client.h>
 #include <subversion-1/svn_delta.h>
 #include <subversion-1/svn_error.h>
+#include <subversion-1/svn_path.h>
 #include <subversion-1/svn_ra.h>
 
 #include "svnsup.h"

Modified: user/des/svnsup/src/libsvnsup/svnsup.h
==============================================================================
--- user/des/svnsup/src/libsvnsup/svnsup.h	Sat Mar 27 18:24:27 2010	(r205773)
+++ user/des/svnsup/src/libsvnsup/svnsup.h	Sat Mar 27 18:40:08 2010	(r205774)
@@ -46,6 +46,9 @@ typedef struct svnsup_delta_file *svnsup
 int svnsup_create_delta(svnsup_delta_t *);
 int svnsup_close_delta(svnsup_delta_t);
 
+int svnsup_delta_root(svnsup_delta_t, const char *);
+int svnsup_delta_uuid(svnsup_delta_t, const char *);
+int svnsup_delta_path(svnsup_delta_t, const char *);
 int svnsup_delta_comment(svnsup_delta_t, const char *, ...);
 int svnsup_delta_meta(svnsup_delta_t, const char *, const char *, ...);
 int svnsup_delta_create_directory(svnsup_delta_t, const char *);

Modified: user/des/svnsup/src/libsvnsup/svnsup_delta.c
==============================================================================
--- user/des/svnsup/src/libsvnsup/svnsup_delta.c	Sat Mar 27 18:24:27 2010	(r205773)
+++ user/des/svnsup/src/libsvnsup/svnsup_delta.c	Sat Mar 27 18:40:08 2010	(r205774)
@@ -45,6 +45,9 @@
 
 struct svnsup_delta {
 	FILE *f;
+	const char *root;
+	const char *uuid;
+	const char *path;
 	struct svnsup_delta_file *sdf;
 	unsigned int ntxt;
 };
@@ -72,7 +75,7 @@ svnsup_delta_file_alloc(svnsup_delta_t s
 	return (sdf);
 }
 
-void
+static void
 svnsup_delta_file_free(svnsup_delta_file_t sdf)
 {
 
@@ -81,6 +84,18 @@ svnsup_delta_file_free(svnsup_delta_file
 	free(sdf);
 }
 
+static const char *
+svnsup_delta_shorten_path(svnsup_delta_t sd, const char *pn)
+{
+
+	assert(strstr(pn, sd->path) == pn);
+	pn += strlen(sd->path);
+	assert(*pn == '/' || *pn == '\0');
+	if (*pn == '/')
+		++pn;
+	return (pn);
+}
+
 /*
  * Create an svnsup delta.
  */
@@ -144,10 +159,71 @@ svnsup_delta_comment(svnsup_delta_t sd, 
 int
 svnsup_delta_meta(svnsup_delta_t sd, const char *key, const char *fmt, ...)
 {
+	va_list ap;
+	char *value;
+
+	assert(sd != NULL);
+	assert(key != NULL);
+	assert(fmt != NULL);
+	va_start(ap, fmt);
+	vasprintf(&value, fmt, ap);
+	va_end(ap);
+	fprintf(sd->f, "@meta ");
+	svnsup_string_fencode(sd->f, key);
+	fprintf(sd->f, " ");
+	svnsup_string_fencode(sd->f, value);
+	fprintf(sd->f, "\n");
+	return (SVNSUP_ERR_NONE);
+}
+
+/*
+ * Repository root
+ */
+int
+svnsup_delta_root(svnsup_delta_t sd, const char *root)
+{
 
-	(void)sd;
-	(void)key;
-	(void)fmt;
+	assert(sd->root == NULL);
+	sd->root = strdup(root);
+	if (sd->root == NULL)
+		return (SVNSUP_ERR_MEMORY);
+	fprintf(sd->f, "@root ");
+	svnsup_string_fencode(sd->f, sd->root);
+	fprintf(sd->f, "\n");
+	return (SVNSUP_ERR_NONE);
+}
+
+/*
+ * Repository UUID
+ */
+int
+svnsup_delta_uuid(svnsup_delta_t sd, const char *uuid)
+{
+
+	assert(sd->uuid == NULL);
+	sd->uuid = strdup(uuid);
+	if (sd->uuid == NULL)
+		return (SVNSUP_ERR_MEMORY);
+	fprintf(sd->f, "@uuid ");
+	svnsup_string_fencode(sd->f, sd->uuid);
+	fprintf(sd->f, "\n");
+	return (SVNSUP_ERR_NONE);
+}
+
+/*
+ * Repository path (branch / subdir)
+ */
+int
+svnsup_delta_path(svnsup_delta_t sd, const char *path)
+{
+
+	assert(sd->path == NULL);
+	sd->path = strdup(path);
+	if (sd->path == NULL)
+		return (SVNSUP_ERR_MEMORY);
+	fprintf(sd->f, "@path ");
+	svnsup_string_fencode(sd->f, sd->path);
+	fprintf(sd->f, "\n");
 	return (SVNSUP_ERR_NONE);
 }
 
@@ -161,6 +237,7 @@ svnsup_delta_create_directory(svnsup_del
 	assert(sd != NULL);
 	assert(dn != NULL && *dn != '\0');
 	assert(sd->sdf == NULL);
+	dn = svnsup_delta_shorten_path(sd, dn);
 	fprintf(sd->f, "@mkdir ");
 	svnsup_string_fencode(sd->f, dn);
 	fprintf(sd->f, "\n");
@@ -177,6 +254,7 @@ svnsup_delta_remove(svnsup_delta_t sd, c
 	assert(sd != NULL);
 	assert(fn != NULL && *fn != '\0');
 	assert(sd->sdf == NULL);
+	fn = svnsup_delta_shorten_path(sd, fn);
 	fprintf(sd->f, "@remove ");
 	svnsup_string_fencode(sd->f, fn);
 	fprintf(sd->f, "\n");
@@ -215,6 +293,7 @@ svnsup_delta_create_file(svnsup_delta_t 
 	assert(sd->sdf == NULL);
 	assert(sdfp != NULL);
 	assert(fn != NULL && *fn != '\0');
+	fn = svnsup_delta_shorten_path(sd, fn);
 	if ((sdf = svnsup_delta_file_alloc(sd, fn)) == NULL)
 		return (SVNSUP_ERR_MEMORY);
 	sdf->create = 1;
@@ -238,6 +317,7 @@ svnsup_delta_open_file(svnsup_delta_t sd
 	assert(sd->sdf == NULL);
 	assert(sdfp != NULL);
 	assert(fn != NULL && *fn != '\0');
+	fn = svnsup_delta_shorten_path(sd, fn);
 	if ((sdf = svnsup_delta_file_alloc(sd, fn)) == NULL)
 		return (SVNSUP_ERR_MEMORY);
 	*sdfp = sdf;


More information about the svn-src-user mailing list