ViewCVS can browse directories, change logs, and specific
revisions of files. It can display diffs between versions and
show selections of files based on tags or branches. In addition,
ViewCVS has "annotation" or "blame" support, Bonsai-like query
facilities, template-based page generation, and support for
individually configuring virtual hosts.
It also includes support for
-- a program to display the tree of revisions and branches
Currently, the functionality of ViewCVS surpasses that of cvsweb.
See below for a list of additional features.
The ViewCVS software was inspired by
(originally written by Bill Fenner and then further developed by
Greg Stein wanted to make some changes and updates, but cvsweb was
implemented in Perl. He wrote:
While I can manage some Perl, cvsweb was
rather unmaintainable for me. So I undertook the
task to convert the software to
Python. As a result,
I've actually been able to go way beyond the simple
changes that I had envisioned.
ViewCVS started as a port of the cvsweb script, but has had
numerous cleanups and other modifications, based on some of
Python's strengths. There is still some minor "badness"
remaining from the Perl code, but Greg has been working on
flushing that out, while adding new features.
ViewCVS has been developed by the ViewCVS
Group and is made available under a
ViewCVS requires Python 1.5 or later (Python
1.5 has been out for a couple years and is readily available for
your favorite operating system). If you choose to use the SQL Checkin
Database feature, then you must use Python 1.5.2
or later and have the
If you have any comments, questions, or suggestions,
then please send them to the
mailing list, which is also
list for ViewCVS developers is also available
ViewCVS is an Open
Source project, and all
contributions are welcome.
Template support: you can now customize the look and feel of
ViewCVS by editing the provided EZT templates, which are used
to generate the pages.
Internationalization support: ViewCVS will parse and handle
the Accept-Language request header, and can select different
inputs for localized page generation.
Colorization for many file types via
Bonsai-like query features. (Requires MySQL and some other
Annotation/blame viewing support against a read-only
Configuration on a per-virtual-host basis. This allows you
to share the configuration file and ViewCVS installation
across virtual hosts, yet still be able to fine-tune the
options when necessary.
Automatic generation of tarballs for the HEAD or a specified
Runs either as CGI script, called from an installed web server
(such as Apache),
or as a standalone server.
Searching files for matches for a regular expression.
- Better reporting for unreadable files.
More robust when given varying
- Hard breaks in human-readable diffs.
The configuration file is optional (you can change the values
right in the CGI script and avoid the config file, if you so
choose). The config file syntax is also cleaner, since it is
human-manageable rather than source code.
Directories with a large number of files can be viewed.
Support for browsing Subversion
repositories. (requires Subversion's Python bindings)
Security: ViewCVS only requires read access
to the CVS repository (not read/write). With the correct
security partitioning, this means that even if ViewCVS were to
be subverted, your source code is safe. Further, ViewCVS does
not use any
calls, which are very susceptible to abuse.
(cvsweb had a hole due to a popen() call)
Last but not least: it doesn't suffer from the "unmaintainable
code effect" that hits most Perl projects sooner or later:
[Perl] combines all the worst aspects of C and Lisp:
a billion different sublanguages in one monolithic executable.
It combines the power of C with the readability of PostScript.
-- Jamie Zawinski
The changes present in each release are available in
The software is available for download:
Version 0.9.2 of ViewCVS as a gzipped
Version 0.9.2 of ViewCVS as a ZIP
Of course the current development version is also available
through ViewCVS itself:
You can also
the changes for this release.
ViewCVS is a Open Source project. So any future development depends
on the contributions that will be made by its user community.
Certainly working patches have a greater chance to become realized
quickly than feature requests. But don't hesitate to submit your
suggestions! Send mail to the
mailing list or even better use the
- See the feature requests already submitted through
the SF feature request tracker
- UI streamlining/simplification
- Integration with CVS checkin auto-mail scripts
- Tighter integration with the query features
And another longer term pet of Greg Stein:
- Integration with an indexer such as LXR
ViewCVS can make use of the
enscript program to
colorize files in the CVS repository. If
is present on your system, then set the
use_enscript option in the
viewcvs.conf configuration file to
enscript_path option to point to your
installation directory. ... That's it! Now, as you view files
through ViewCVS, they will be colored.
Colorization of Python files
ViewCVS currently also comes with a builtin colorizer for Python
source files. This may go away in a future version, given the new
Christophe Pelte suggested this feature: colorize Python source
(by Marc-Andrew Lemburg, based on
by Just van Rossum). I've added this feature to ViewCVS 0.3,
along with a generalized plugin mechanism for custom coloring other
types of files. See the instructions within the viewcvs.cgi for
py2html_path configuration variable if
you want to use this feature.
Finally we compiled a list of links to related
software projects that might be also of interest to you:
Python : The programming
language ViewCVS is written in.
CVS : CVS is the
Concurrent Versions System, the dominant open-source
network-transparent version control system.
Revision Control System; the backend to CVS.
a CVS-like open source version control system.
Apache : A (The?) web server.
used to colorize code displayed from the CVS repository
server side software used to display revisions graphically. Called from
MySQL : to create
and query a commit database. To make use of it you also need:
the Python language binding to access MySQL databases.
client software used to grab from a public repository using ViewCVS
and HTTP (useful if you are behind a firewall).