This is crude, but it lets you use "tag:foo/bar/grill"
as a repository, and it replaces the "tag:foo" with a matching
entry in ~/.svnrc like this:
tag foo svn://gcc.gnu.org/svn/gcc/trunk/whatever
So, with a .svnrc like this:
tag trunk svn://gcc.gnu.org/svn/gcc/trunk
tag 4.0 svn://gcc.gnu.org/svn/gcc/branches/gcc-4_0-branch
You could just "svn co tag:4.0/gcc/config/i386"
It probably screams for lots more prettying up, but at least I did
something about it ;-)
If you want it shorter, I could rewrite this so that the tag name goes
before the colon, like "4.0:gcc/config/i386"
DJ
Index: subversion/libsvn_subr/path.c
===================================================================
--- subversion/libsvn_subr/path.c (revision 17180)
+++ subversion/libsvn_subr/path.c (working copy)
@@ -1103,6 +1103,50 @@
}
+
+static const char *
+replace_tag (const char *path, apr_pool_t *pool)
+{
+ FILE *svnrc;
+ char *svnrc_name;
+ const char *home;
+ const char *tb, *te;
+ char *newpath;
+ char line[1000];
+
+ tb = path + 4;
+ te = strchr (tb, '/');
+ if (!te)
+ te = tb + strlen(tb);
+ home = getenv("HOME");
+ if (!home)
+ return path;
+ svnrc_name = apr_pcalloc (pool, strlen(home) + 8);
+ strcpy (svnrc_name, home);
+ strcat(svnrc_name, "/.svnrc");
+ svnrc = fopen(svnrc_name, "r");
+ if (!svnrc)
+ return path;
+ while (fgets(line, 1000, svnrc))
+ {
+ if (memcmp (line, "tag ", 4))
+ continue;
+ if (strncmp (line+4, tb, te-tb))
+ continue;
+ if (line[4+te-tb] != ' ')
+ continue;
+ newpath = apr_pcalloc (pool, strlen(line+4+(te-tb)+1) + strlen(te) + 1);
+ strcpy (newpath, line+4+(te-tb)+1);
+ while (newpath[strlen(newpath)-1] == '\n')
+ newpath[strlen(newpath)-1] = 0;
+ strcat (newpath, te);
+ fclose(svnrc);
+ return newpath;
+ }
+ fclose(svnrc);
+ return path;
+}
+
const char *
svn_path_canonicalize (const char *path, apr_pool_t *pool)
{
@@ -1112,6 +1156,9 @@
apr_size_t canon_segments = 0;
svn_boolean_t uri;
+ if (strncmp (path, "tag:", 4) == 0)
+ path = replace_tag (path, pool);
+
dst = canon = apr_pcalloc (pool, strlen (path) + 1);
/* Copy over the URI scheme if present. */