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. */