| <!-- -*-markdown-*- --> |
| |
| Contents |
| ======== |
| |
| * [To the Impatient](#to-the-impatient) |
| - [Required packages](#required-packages) |
| - [Basic installation](#basic-installation) |
| * [Installing ViewVC](#installing-viewvc) |
| * [Configuring ViewVC](#configuring-viewvc)- |
| * [Serving CVS Repositories](#serving-cvs-repositories) |
| * [Serving Subversion Repositories](#serving-cvs-repositories) |
| * [Running ViewVC Under Apache](#running-viewvc-under-apache) |
| - [CGI Mode](#cgi-mode) |
| - [WSGI Mode](#wsgi-mode) |
| - [FastCGI Mode](#fastcgi-mode) |
| * [Additional Apache Considerations](#additional-apache-considerations) |
| * [ViewVC Standalone Server](#viewvc-standalone-server) |
| * [Commits Database](#commits-database) |
| - [Publishing CVS commits](#publishing-cvs-commits) |
| - [Publishing Subversion commits](#publishing-subversion-commits) |
| * [Upgrading ViewVC](#upgrading-viewvc) |
| * [Getting Help](#getting-help) |
| |
| |
| To The Impatient |
| ================ |
| |
| Congratulations on getting this far. :-) |
| |
| |
| Required packages |
| ----------------- |
| |
| ViewVC requires some additional software in order to operate, |
| depending on what you want to do with it. |
| |
| Minimum requirements: |
| |
| * Python 3.6+ |
| (http://www.python.org/) |
| |
| For CVS support: |
| |
| * RCS, Revision Control System |
| (http://www.cs.purdue.edu/homes/trinkle/RCS/) |
| * GNU diff |
| (http://www.gnu.org/software/diffutils/diffutils.html) |
| * CvsGraph 1.5.0+ (for optional CVS graphical tree generation) |
| (formerly at http://www.akhphd.au.dk/~bertho/cvsgraph/) |
| |
| For Subversion support: |
| |
| * Subversion 1.14.0+ (binaries and Python bindings) |
| (http://subversion.apache.org/) |
| |
| Strongly recommended: |
| |
| * Pygments 1.1+ syntax highlighting engine |
| (https://pygments.org/) |
| * chardet character encoding detection library |
| (https://chardet.github.io/) |
| |
| There are a number of additional packages that you might need in order |
| to enable additional features of ViewVC. Please see the relevant |
| sections of this document for details. |
| |
| |
| Basic installation |
| ------------------ |
| |
| To start installing right away (on UNIX), run `./viewvc-install` from |
| the top directory of the ViewVC software package (or source code |
| checkout), answering the prompts as appropriate. |
| |
| $ ./viewvc-install |
| |
| When it finishes, edit the file `viewvc.conf` that gets created in the |
| installation directory. At a minimum, you'll want to tell ViewVC |
| where to find your repositories. (We'll assume hereafter for the |
| purpose of our examples that you've installed ViewVC into |
| `<VIEWVC_DIR>`.) |
| |
| Once installed, you need to expose your ViewVC installation as a |
| web-accessible service. ViewVC ships with a simple standalone server |
| program. While we don't recommend using it for a production |
| deployment, it can be useful for quickly testing that ViewVC is |
| operational and properly configured. You can run that server from the |
| command-line, pointing it to your configuration file: |
| |
| $ <VIEWVC_DIR>/bin/standalone.py |
| |
| For production-quality hosting of ViewVC as a service, you'll want to |
| integrate ViewVC with a web server capable of running CGI or WSGI |
| programs (such as Apache HTTP Server). We'll discuss the various |
| options for doing so in subsequent sections of this document. |
| |
| |
| Installing ViewVC |
| ================= |
| |
| Installation of ViewVC is handled by the `viewvc-install` script. |
| When you run this script, you will be prompted for an installation |
| root path. The default is `/usr/local/viewvc-VERSION` (where VERSION |
| is the version of this ViewVC release). Be advised that the installer |
| actually writes the installation path into some of the installed |
| files, so ViewVC cannot be trivially moved to a different path after |
| the install. |
| |
| `viewvc-install` will create any intermediate directories required. It |
| will prompt before overwriting user-managed configuration files that |
| may have been modified (such as `viewvc.conf` or the view templates), |
| thus making it safe to install over the top of a previous |
| installation. It will always overwrite program files, however. |
| |
| While installation into `/usr/local` typically requires superuser |
| priveleges ('root'), ViewVC does not have to be installed as root, nor |
| does it run as root. It is just as valid to place ViewVC in a |
| specific user's home directory, too. |
| |
| NOTE: If your system uses a restrictive umask, you might need to |
| adjust the permissions of the directory structure that |
| `viewvc-install` creates so that, for example, the modules in the |
| `lib/` subdirectory are actually readable by the main programs in the |
| `bin/` subdirectory. |
| |
| |
| Configuring ViewVC |
| ================== |
| |
| ViewVC configuration lives in the file `viewvc.conf`, generally |
| located in the root of your installation directory. Edit this file |
| with the text editor of your choice in order to modify ViewVC's |
| behavior. |
| |
| In particular, you'll want to examine the following configuration |
| options: |
| |
| * `cvs_roots` (for individual CVS repositories) |
| * `svn_roots` (for individual Subversion repositories) |
| * `root_parents` (for collections of CVS or Subversion repositories) |
| * `rcs_dir` (for CVS support) |
| |
| There are some other options that are usually nice to change. See |
| `viewvc.conf` for more information. ViewVC provides a working, |
| default look. However, if you want to customize the look of ViewVC, |
| edit the files in `<VIEWVC_DIR>/templates`. You need knowledge about |
| HTML to edit the templates. |
| |
| NOTE: For security reasons, don't install ViewVC in such a way that |
| its configuration file becomes itself web-accessible, as that file may |
| contain system path information as well as database authentication |
| credentials that should not be public knowledge! |
| |
| |
| Serving CVS Repositories |
| ======================== |
| |
| In order to server CVS repositories, ViewVC needs to be able to run |
| the RCS utility binaries (`co`, `rlog`, etc.). If these programs |
| aren't installed in the typical system executable path locations, use |
| the `rcs_bin` configuration option in `viewvc.conf` to tell ViewVC |
| where to look for them. |
| |
| You'll also need to tell ViewVC where to find your CVS repositories. |
| Use the `cvs_roots` configuration option to list individual CVS |
| repositories that you wish to expose through ViewVC, or see the |
| `root_parents` option for a quick way to tell ViewVC to consider all |
| the subdirecties of a given "parent" directory as CVS repositories. |
| |
| NOTE: It is common to find on a given system a single monolithic CVS |
| repository, with dozens of individual top-level modules for each |
| distinct project. If you point ViewVC to that repository directory |
| using `cvs_roots`, it will show a single repository to your users. |
| However, you can choose instead to use the `root_parents` |
| configuration option, pointing at the same repository directory, to |
| cause ViewVC to present those top-level modules as if they were |
| instead each their own CVS repository. |
| |
| |
| Serving Subversion Repositories |
| =============================== |
| |
| Unlike the CVS integration, which simply wraps the RCS and CVS utility |
| programs, the Subversion integration requires additional Python |
| libraries. To use ViewVC with Subversion, make sure you have both |
| Subversion itself and the Subversion Python bindings installed. These |
| can be obtained through typical package distribution mechanisms, or |
| may be build from source. (See the files `INSTALL` and |
| `subversion/bindings/swig/INSTALL` in the Subversion source tree for |
| more details on how to build and install Subversion and its Python |
| bindings.) |
| |
| Generally speaking, you'll know that your installation of Subversion's |
| bindings has been successful if you can import the `svn.core` module |
| from within your Python interpreter. Here's an example of doing so |
| which doubles as a quick way to check what version of the Subversion |
| Python binding you have: |
| |
| % python |
| Python 3.6.9 (default, Nov 7 2019, 10:44:02) |
| [GCC 8.3.0] on linux |
| Type "help", "copyright", "credits" or "license" for more information. |
| >>> from svn.core import * |
| >>> "%s.%s.%s" % (SVN_VER_MAJOR, SVN_VER_MINOR, SVN_VER_PATCH) |
| '1.14.0' |
| >>> |
| |
| Note that by default, Subversion installs its bindings in a location |
| that is not in Python's default module search path (for example, on |
| Linux systems the default is usually `/usr/local/lib/svn-python`). |
| You need to remedy this, either by adding this path to Python's module |
| search path, or by relocating the bindings to some place in that |
| search path. |
| |
| For example, you might want to create a `.pth` file in your Python |
| installation directory's site-packages area which tells Python where |
| to find additional modules (in this case, your Subversion Python |
| bindings). You would do this as follows (and as root): |
| |
| $ echo "/path/to/svn/bindings" > /path/to/python/site-packages/svn.pth |
| |
| (Though, obviously, with the correct paths specified.) |
| |
| Configuration of the Subversion repositories happens in much the same |
| way as with CVS repositories, except with the `svn_roots` |
| configuration variable instead of the `cvs_roots` one. |
| |
| |
| Running ViewVC Under Apache |
| =========================== |
| |
| Requires: |
| |
| * Apache HTTP Server 2.2+ (https://httpd.apache.org/) |
| |
| By far, the most common way to deploy ViewVC is as a script running |
| behind a gateway interface of a web server such as Apache HTTP Server. |
| In this section, we'll discuss the various ways in which you can do |
| precisely that. Before we continue, though, there are a few |
| requirements common to all of these approaches. |
| |
| First, you'll need to be familiar with how to configure Apache HTTP |
| Server in general on your platform. This web server product is highly |
| modularized. Its configuration is often segmented across many files. |
| Additionally, each of the binary modules that breathe life into |
| Apache's vast feature set is typically installed as a separate |
| package, with its own configuration stub(s) making up some of that |
| segmented configuration. But the _details_ of that segmentation |
| differ across various operating system flavors. |
| |
| For example, a common modern installation of Apache on a CentOS system |
| will have its basic configuration in `/etc/httpd/conf/httpd.conf`. |
| But that file will "include" additional module-specific configuration |
| files from `/etc/httpd/conf.modules.d/`, plus higher-level |
| configuration from `/etc/httpd/conf.d/`. |
| |
| On a Debian-based system, you'll often find the primary configuration |
| in `/etc/apache2/apache2.conf`, with a symlink-driven system for |
| managing the optional pieces in `/etc/apache2/conf-available` and |
| `/etc/apache2/conf-enabled`; `/etc/apache2/mods-available` and |
| `/etc/apache2/mods-enabled`; and `/etc/apache2/sites-available` and |
| `/etc/apache2/sites-enabled`. |
| |
| As you can imagine, it's hard to write specific configuration |
| instructions here with that much variation. For the purposes of our |
| instructions, we'll simply refer to `httpd.conf` as a generic name for |
| "the set of all files that make up your Apache HTTP Server |
| configuration". |
| |
| One thing common to all of the various ViewVC deployment options under |
| Apache, though, is that you need to grant permission for site visitors |
| to access anything at all associated with your ViewVC installation |
| directory. So, in your `httpd.conf`, add configuration such as this: |
| |
| <Directory <VIEWVC_DIR>> |
| ### For Apache 2.4.x, uncomment this: |
| # Require all granted |
| |
| ### For Apache 2.2.x, uncomment these instead: |
| # Order allow,deny |
| # Allow from all |
| </Directory> |
| |
| ...where, again, `<VIEWVC_DIR>` is the directory into which you've |
| install ViewVC. |
| |
| In the subsections below, we'll discuss the various options you have |
| for running ViewVC in specific ways under Apache. After you've |
| configured Apache using the approach you desire, be sure to restart |
| the Apache service. |
| |
| You should also consider protecting your ViewVC instance from |
| server-whacking webcrawlers. As ViewVC is a web-based application |
| which each page containing various links to other pages and views, you |
| can expect your server's performance to suffer if a webcrawler finds |
| your ViewVC instance and begins traversing those links. We highly |
| recommend that you add your ViewVC location to a site-wide robots.txt |
| file. See [Robots.txt](http://en.wikipedia.org/wiki/Robots.txt) for |
| more information. |
| |
| |
| CGI Mode |
| -------- |
| |
| Requires: |
| |
| * mod_cgi (generally included with Apache itself) |
| |
| To run ViewVC under Apache HTTP Server in CGI mode, you need to first |
| ensure that Apache can execute CGI scripts at all. In your |
| `httpd.conf` (or one of its included files), load the CGI module if it |
| isn't already loaded. |
| |
| LoadModule cgi_module libexec/mod_cgi.so |
| |
| There are a handful of different ways now to tell Apache where and how |
| to expose your ViewVC service. The easiest is to use the |
| `ScriptAlias` directive: |
| |
| ScriptAlias /viewvc <VIEWVC_DIR>/bin/cgi/viewvc.cgi |
| |
| This tells Apache that incoming requests aimed at the URL /viewvc (or |
| any children thereof) should be passed off to ViewVC's CGI wrapper |
| script for handling. |
| |
| Another way to expose ViewVC as a CGI script is to copy the |
| `bin/cgi/viewvc.cgi` script into a server-wide common `cgi-bin` |
| location was has been configured to treat the executable files found |
| therein as programs. Another is to expose it using the Apache |
| `Options +ExecCGI` and `AddHandler cgi-script .cgi` directives when |
| it's been installed in a more generally web-accessible server |
| location. Consult the wealth of knowledge around these approaches |
| available online for details. |
| |
| |
| WSGI mode |
| --------- |
| |
| Requires: |
| |
| * mod_wsgi, compiled for Python 3 (https://github.com/GrahamDumpleton/mod_wsgi) |
| |
| To run ViewVC under Apache HTTP Server in WSGI mode, you need to first |
| ensure that Apache can execute WSGI programs. It does this using |
| `mod_wsgi`, which is typically not included in the main Apache |
| installation package. So first, ensure that `mod_wsgi` is installed |
| on your system. |
| |
| Then, in your `httpd.conf` (or one of its included files), load the |
| WSGI module if it isn't already loaded. |
| |
| LoadModule wsgi_module libexec/mod_wsgi.so |
| |
| Now, again in `httpd.conf`, expose ViewVC's WSGI wrapper program at |
| the URL of your choice: |
| |
| WSGIScriptAlias /viewvc <VIEWVC_DIR>/bin/wsgi/viewvc.wsgi |
| |
| You'll probably also need the following directive because of the |
| not-quite-sanctioned way that ViewVC manipulates Python objects. |
| |
| WSGIApplicationGroup %{GLOBAL} |
| |
| |
| FastCGI mode |
| ------------ |
| |
| Requires: |
| |
| * mod_fcgid (http://httpd.apache.org/mod_fcgid/) |
| * Flup (https://www.saddi.com/software/flup/) |
| |
| FastCGI mode uses ViewVC's WSGI support, but supports using FastCGI, |
| and is a somewhat hybrid approach of several of the above methods. |
| Using this mode is convenient if you are already using FastCGI to |
| serve up other types of services (such as PHP-based ones) from your |
| web server and don't wish to load additional modules. |
| |
| In your `httpd.conf` (or one of its included files), load the FastCGI |
| daemon module if it isn't already loaded. |
| |
| LoadModule fcgid_module libexec/mod_fcgid.so |
| |
| Now, again in `httpd.conf`, expose ViewVC's FastCGI wrapper program at |
| the URL of your choice: |
| |
| ScriptAlias /viewvc <VIEWVC_DIR>/bin/wsgi/viewvc.fcgi |
| |
| |
| Additional Apache Considerations |
| ================================ |
| |
| There are a number of other things you can do to improve your |
| Apache-based ViewVC deployment. We'll cover some of them here. |
| |
| |
| Direct static document access |
| ------------------------------ |
| |
| ViewVC's HTML templates reference various stylesheets and icons |
| provided by ViewVC itself. By default, ViewVC generates URLs to those |
| artifacts which point back into ViewVC (using a magic syntax); ViewVC |
| in turn handles such magic URL requests by streaming back the contents |
| of the requested icon or stylesheet file. While this simplifies the |
| configuration and initial deployment of ViewVC, it's not the most |
| efficient approach to deliver what is essentially static content. |
| |
| To improve performance, consider carving out a URL space in your |
| webserver's configuration solely for this static content and instruct |
| ViewVC to use that space when generating URLs for that content. For |
| example, you might add an Alias such as the following to your |
| `httpd.conf`: |
| |
| Alias /viewvc-docroot <VIEWVC_DIR>/templates/default/docroot |
| |
| And then, in `viewvc.conf`, set the `docroot` option to the same |
| location: |
| |
| docroot = /viewvc-docroot |
| |
| WARNING: As always when using Alias directives, be careful that you |
| have them in the correct order. For example, if you use an ordering |
| such as the following, Apache will hand requests for your static |
| documents off to ViewVC as if they were versioned resources: |
| |
| ScriptAlias /viewvc <VIEWVC_DIR>/bin/wsgi/viewvc.wsgi |
| Alias /viewvc/static <VIEWVC_DIR>/templates/default/docroot |
| |
| The correct order would be: |
| |
| Alias /viewvc/static <VIEWVC_DIR>/templates/default/docroot |
| ScriptAlias /viewvc <VIEWVC_DIR>/bin/wsgi/viewvc.wsgi |
| |
| (Of course, it's best to avoid such namespace nesting altogether if |
| you can.) |
| |
| |
| Access control |
| -------------- |
| |
| ViewVC support a number of path-based authorization approaches for |
| your repositories, some of which require knowledge of username of the |
| person who is accessing your ViewVC instance. You can configure |
| Apache to require a username and password for ViewVC site visitors |
| using it's password-file-based (or another) authentication feature: |
| |
| <Location /viewvc> |
| AllowOverride None |
| AuthUserFile /path/to/passwd/file |
| AuthName "ViewVC Access" |
| AuthType Basic |
| require valid-user |
| </Location> |
| |
| With such configuration in place, your ViewVC users will be required |
| to successfully complete a password challenge before getting access to |
| your ViewVC-exposed version control repository information. Also, |
| you're well-positioned to enable ViewVC's path-based authorization |
| features (see the `authorizer` configuration option in `viewvc.conf`), |
| by which you can customize which bits of your version control |
| repositories are exposed to which of your ViewVC users. |
| |
| |
| ViewVC Standalone Server |
| ======================== |
| |
| ViewVC can be run as a standalone script which uses a simplistic, |
| built-in Python HTTP server. We don't recommend that you use this |
| mode for a production deployment, but it is a handy way to test our |
| your ViewVC configuration without all the additional overhead of |
| installing, configuring, and maintaining a full-fledged web server |
| package. |
| |
| To run ViewVC's standalone server, simply execute the script from the |
| ViewVC installation directory. |
| |
| $ <VIEWVC_DIR>/bin/standalone.py |
| server ready at http://localhost:49152/viewvc |
| |
| By default, the script will expose ViewVC at the above URL. But you |
| can modify the hostname and port to which it binds using the `--host` |
| and `--port` command-line options. You can also change the virtual |
| path location from `/viewvc` to something else with the |
| `--script-alias` command-line option. |
| |
| For a full listing of supported command-line options, run the |
| standalone server with `--help`. |
| |
| |
| Commits Database |
| ================ |
| |
| Requires: |
| |
| * MySQL (or MariaDB) 3.22+ (https://www.mysql.com/, https://mariadb.org/) |
| * mysqlclient-python 0.9+ (https://github.com/PyMySQL/mysqlclient-python) |
| |
| This feature is a clone of the Mozilla Project's Bonsai database. It |
| catalogs every commit in the CVS or Subversion repository into a SQL |
| database. In fact, the databases are 100% compatible. |
| |
| Various queries can be performed on the database. After installing |
| ViewVC, there are some additional steps required to get the database |
| working. |
| |
| First, *create a MySQL user* who has permission to create databases. |
| Optionally, you can create a second user with read-only access to the |
| database. |
| |
| *Create your database* using the `<VIEWVC_DIR>/bin/make-database` |
| script. It will prompt you for your MySQL user, password, and the |
| name of database you want to create. The database name defaults to |
| "ViewVC". This script creates the database and sets up the empty |
| tables. |
| |
| *Tell ViewVC about your database* in your `<VIEWVC_DIR>/viewvc.conf` |
| file. In the `[cvsdb]` section, set the following option values: |
| |
| enabled = 1 # Whether to enable query support in viewvc.cgi |
| host = # MySQL database server host |
| port = # MySQL database server port (default is 3306) |
| database_name = # name of database you created with make-database |
| user = # read/write database user |
| passwd = # password for read/write database user |
| readonly_user = # read-only database user |
| readonly_passwd = # password for the read-only user |
| |
| Note that it's pretty safe in this instance for your read-only user |
| and your read-write user to be the same. |
| |
| *Configure your version control system(s)* to publish their commit |
| information to the database. This is done using utilities that ViewVC |
| provides. See the following sections for details. |
| |
| |
| Publishing CVS commits |
| ---------------------- |
| |
| Two programs are provided for updating the commits database from a CVS |
| repository, `cvsdbadmin` and `loginfo-handler`. They serve two |
| different purposes. The `cvsdbadmin` program walks through your CVS |
| repository and adds every commit found in every versioned file. This |
| is commonly used for initializing the database from a repository which |
| has been in use. The `loginfo-handler` script is executed by the CVS |
| server's `CVSROOT/loginfo` system upon each commit. It makes real-time |
| updates to the commits database as commits are made to the repository. |
| |
| To build a database of all the commits in the CVS repository located |
| at, say, `/opt/cvs/repo`, invoke: |
| |
| $ ./cvsdbadmin rebuild /opt/cvs/repo |
| |
| If you want to update the commits database with new commits made since |
| your last update thereof, invoke |
| |
| $ ./cvsdbadmin update /opt/cvs/repo |
| |
| The update mode checks to see if a commit is already in the database, |
| and only adds it if it is absent. |
| |
| To get real-time updates, you'll want to checkout the `CVSROOT` module |
| from your CVS repository and edit `CVSROOT/loginfo`. For folks running |
| CVS 1.12 or better, add this line: |
| |
| ALL <VIEWVC_DIR>/bin/loginfo-handler %p %{sVv} |
| |
| If you are running CVS 1.11 or earlier, you'll want a slightly |
| different command line in CVSROOT/loginfo: |
| |
| ALL <VIEWVC_DIR>/bin/loginfo-handler %{sVv} |
| |
| If you have other scripts invoked by `CVSROOT/loginfo`, you will want |
| to make sure to change any running under the "DEFAULT" keyword to |
| "ALL" like the loginfo handler, and carefully read the execution rules |
| for `CVSROOT/loginfo` from the CVS manual. |
| |
| If you are running the Unix port of CVS-NT, the handler script need to |
| know about it. CVS-NT delivers commit information to loginfo scripts |
| differently than the way mainstream CVS does. Your command line |
| should look like this: |
| |
| ALL <VIEWVC_DIR>/bin/loginfo-handler %{sVv} cvsnt |
| |
| |
| Publishing Subversion commits |
| ----------------------------- |
| |
| To build a database of all the commits in the Subversion repository |
| located at, say, `/opt/svn/repo`, invoke: |
| |
| ./svndbadmin rebuild /opt/svn/repo |
| |
| If you want to update the database with commits made since the last |
| update thereof, invoke: |
| |
| ./svndbadmin update /opt/svn/repo |
| |
| To get real time updates, you will need to add more modify the |
| repository's post-commit hook (`/opt/svn/repo/hooks/post-commit`) to |
| invoke the `svndbadmin` command. |
| |
| #!/bin/sh |
| REPOS="$1" |
| REV="$2" |
| <VIEWVC_DIR>/bin/svndbadmin update "$REPOS" "$REV" |
| |
| If you allow revision property changes in your repository, create a |
| post-revprop-change hook script which uses the same `svndbadmin |
| update` command as the post-commit script, except with the addition of |
| the `--force` option: |
| |
| #!/bin/sh |
| REPOS="$1" |
| REV="$2" |
| <VIEWVC_DIR>/bin/svndbadmin update --force "$REPOS" "$REV" |
| |
| This will make sure that the commits database stays consistent when |
| you change the "svn:log", "svn:author" or "svn:date" revision |
| properties. |
| |
| |
| Upgrading ViewVC |
| ================ |
| |
| See the file `upgrading-howto.html` in the `docs/` subdirectory for |
| information on changes you might need to make as you upgrade from one |
| major version of ViewVC to another. |
| |
| |
| Getting Help |
| ============ |
| |
| If nothing seems to work: |
| |
| * Verify that you can execute CGI scripts at all. Apache needs to |
| have an ScriptAlias /cgi-bin or cgi-script Handler defined, for |
| example, which are often overlooked. Try to execute a simple |
| CGI-script that often comes with the distribution of the |
| webserver. |
| |
| * Review any entries in the webserver's error log. |
| |
| If ViewVC seems to work, but doesn't show the expected result (for |
| example, your repositories appear empty): |
| |
| * Check whether the user as whom ViewVC is running has the required |
| read permission to your repositories. ViewVC generally runs as |
| the same user that the web server does, often user 'nobody' or |
| 'httpd'. |
| |
| * Make sure that ViewVC can located your RCS utilities? (edit rcs_dir) |
| |
| See if your problem has been addressed by the [ViewVC |
| FAQ](http://viewvc.org/faq.html). |
| |
| Finally, if all else fails, contact the ViewVC development community |
| at https://github.com/viewvc/viewvc/issues. |