                                 -*- text -*-

This document carries some design thoughts regarding the solution of
Issue #439[1] ("allow svn repositories to reside in web-navigable
subdirectories")

[1] http://viewvc.tigris.org/issues/show_bug.cgi?id=439


INTRODUCTION
============

Many folks have expressed the desire that ViewVC expose its configured
roots at more or less arbitrary virtual paths below the ViewVC root
URL.  An example might explain this better.

Say you have a ViewVC instance configured with roots like so:

   #              path           vc
   #              ------------   ---
   root_parents = /var/cvs/old : cvs,
                  /var/svn/dev : svn,
                  /var/svn/qa  : svn,

and say that each of these root parents has a few roots whose names
begin with the basenames of the parent directory ("dev-tools" lives in
"/var/svn/dev", "old-docs" lives in "/var/cvs/old", etc.)

Today, ViewVC will display all those roots in the "root listing" view
as if they are siblings:

   old-docs/
   old-src/
   dev-build/
   dev-libs/
   dev-tools/
   qa-scripts/
   qa-utils/

In other words, any heirarchy which might exist in the on-disk
locations of the roots, or (in the Subversion case) in the
version-control system itself, is flattened.

But sometimes you might want to preserve -- or even introduce -- some
heirarchy in those roots, exposed to the users.  For example, you
might wish that instead of a single "root listing" view, ViewVC
instead presented users with a navigable tree constructed from paths
configured by the admin.  For example, imagine if each root_parent
item also carried an "exposure path" bit of configuration:

   #              path           vc    exposure-path
   #              ------------   ---   -------------
   root_parents = /var/cvs/old : cvs : old,
                  /var/svn/dev : svn : current/dev,
                  /var/svn/qa  : svn : current/qa,

A visit to ViewVC's root URL would then show:

   old/
   current/

Clicking into "old/", you'd see:

   old-docs/
   old-src/

Alternatively, clicking into "current/" would show:

   dev/
   qa/

...and so on.

In fact, you'd have a virtual heirarchy like so:

   /
      old/
         old-docs/      => CVS root at /var/cvs/old/docs
         old-src/       => CVS root at /var/cvs/old/src
      current/
         dev/
            dev-build/  => SVN root at /var/svn/dev/dev-build
            dev-libs/   => SVN root at /var/svn/dev/dev-libs
            dev-tools/  => SVN root at /var/svn/dev/dev-tools
         qa/
            qa-scripts/ => SVN root at /var/svn/qa/qa-scripts
            qa-utils/   => SVN root at /var/svn/qa/qa-utils


CHALLENGES
==========

* Merely tacking on a new "exposure path" item in the definition of
  the root_parents, cvs_roots, and svn_roots seems clunky.  It also
  limits the the granularity of control:  you couldn't assign
  different locations to the various roots that live within a single
  root parent path.  Finally, the current code is banking on there
  being only a single colon (:) separator (since those might legally
  appear in Windows on-disk paths).  That might create a bit of a
  compatibility annoyance.

* What do you do about root_as_url_component=0?  I guess this feature
  is just simply unavailable in that case.

* Do you continue to allow cvs_roots and svn_roots members to specify
  a root name, or does the root name concept go away entirely in light
  of the new exposure path concept?
