mirror of
https://github.com/vitalif/viewvc-4intranet
synced 2019-04-16 04:14:59 +03:00
Compare commits
41 Commits
orig-r2243
...
1.1.0
Author | SHA1 | Date | |
---|---|---|---|
![]() |
6956afae73 | ||
![]() |
80a5efb953 | ||
![]() |
8843044571 | ||
![]() |
8b426f6fb3 | ||
![]() |
19ee8b32df | ||
![]() |
a5389019fa | ||
![]() |
7f272fbe04 | ||
![]() |
89edf0ac04 | ||
![]() |
71fbec8871 | ||
![]() |
504b1e1a8a | ||
![]() |
cf9381e0ee | ||
![]() |
3907172131 | ||
![]() |
c34752ce92 | ||
![]() |
40cc23f12a | ||
![]() |
9b7fea99d4 | ||
![]() |
85949a6464 | ||
![]() |
d5291a6b98 | ||
![]() |
9e41d171c9 | ||
![]() |
da54e91dea | ||
![]() |
41b2ae2c7a | ||
![]() |
1815220abe | ||
![]() |
a080d8eef4 | ||
![]() |
8c4af42d56 | ||
![]() |
7f1d0952fc | ||
![]() |
222aa4ec1f | ||
![]() |
c03bfd4b89 | ||
![]() |
6fa8cdf117 | ||
![]() |
c4c777ffe6 | ||
![]() |
3680903ed4 | ||
![]() |
6fe61a11bb | ||
![]() |
437975652f | ||
![]() |
7ff75bec7b | ||
![]() |
ea03f20f46 | ||
![]() |
a5df515d79 | ||
![]() |
fabe8e8a66 | ||
![]() |
f01fcc4ec4 | ||
![]() |
05e99f4c7b | ||
![]() |
d8aff4e58f | ||
![]() |
e8d3d6ad89 | ||
![]() |
1317088e3c | ||
![]() |
fe81ee5969 |
26
CHANGES
26
CHANGES
@@ -1,24 +1,3 @@
|
||||
Version 1.2.0 (released ??-???-????)
|
||||
|
||||
* allow user-configurable cvsgraph display (issue #336)
|
||||
|
||||
Version 1.1.2 (released 11-Aug-2009)
|
||||
|
||||
* security fix: validate the 'view' parameter to avoid XSS attack
|
||||
* security fix: avoid printing illegal parameter names and values
|
||||
* add optional support for character encoding detection (issue #400)
|
||||
* fix username case handling in svnauthz module (issue #419)
|
||||
* fix cvsdbadmin/svnadmin rebuild error on missing repos (issue #420)
|
||||
* don't drop leading blank lines from colorized file contents (issue #422)
|
||||
* add file.ezt template logic for optionally hiding binary file contents
|
||||
|
||||
Version 1.1.1 (released 03-Jun-2009)
|
||||
|
||||
* fix broken query form (missing required template variables) (issue #416)
|
||||
* fix bug in cvsdb which caused rebuild operations to lose data (issue #417)
|
||||
* fix cvsdb purge/rebuild repos lookup to error on missing repos
|
||||
* fix misleading file contents view page title
|
||||
|
||||
Version 1.1.0 (released 13-May-2009)
|
||||
|
||||
* add support for full content diffs (issue #153)
|
||||
@@ -62,11 +41,6 @@ Version 1.1.0 (released 13-May-2009)
|
||||
* fix exception in rev-sorted remote Subversion directory views (issue #409)
|
||||
* allow setting of page sizes for log and dir views individually (issue #402)
|
||||
|
||||
Version 1.0.9 (released 11-Aug-2009)
|
||||
|
||||
* security fix: validate the 'view' parameter to avoid XSS attack
|
||||
* security fix: avoid printing illegal parameter names and values
|
||||
|
||||
Version 1.0.8 (released 05-May-2009)
|
||||
|
||||
* fix directory view sorting UI
|
||||
|
@@ -177,12 +177,7 @@ if __name__ == '__main__':
|
||||
if command in ('rebuild', 'purge'):
|
||||
if quiet_level < 2:
|
||||
print "Purging existing data for repository root `%s'" % root
|
||||
try:
|
||||
db.PurgeRepository(root)
|
||||
except cvsdb.UnknownRepositoryError, e:
|
||||
if command == 'purge':
|
||||
sys.stderr.write("ERROR: " + str(e) + "\n")
|
||||
sys.exit(1)
|
||||
db.PurgeRepository(root)
|
||||
|
||||
if command in ('rebuild', 'update'):
|
||||
repository = vclib.ccvs.CVSRepository(None, rootpath, None,
|
||||
|
@@ -245,12 +245,7 @@ def main(command, repository, revs=[], verbose=0, force=0):
|
||||
if command in ('rebuild', 'purge'):
|
||||
if verbose:
|
||||
print "Purging commit info for repository root `%s'" % repository
|
||||
try:
|
||||
db.PurgeRepository(repository)
|
||||
except cvsdb.UnknownRepositoryError, e:
|
||||
if command == 'purge':
|
||||
sys.stderr.write("ERROR: " + str(e) + "\n")
|
||||
sys.exit(1)
|
||||
db.PurgeRepository(repository)
|
||||
|
||||
repo = SvnRepo(repository)
|
||||
if command == 'rebuild' or (command == 'update' and not revs):
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -1,211 +0,0 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
|
||||
<html>
|
||||
<head>
|
||||
<title>ViewVC: 1.1.0 Release Notes</title>
|
||||
<style>
|
||||
.h2, .h3 {
|
||||
padding: 0.25em 0em;
|
||||
background: white;
|
||||
}
|
||||
.warning {
|
||||
font-style: italic;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<h1>ViewVC 1.1.0 Release Notes</h1>
|
||||
|
||||
<div class="h2">
|
||||
<h2 id="introduction">Introduction</h2>
|
||||
|
||||
<p>ViewVC 1.1.0 is the superset of all previous ViewVC releases.</p>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="h2">
|
||||
<h2 id="compatibility">Compatibility</h2>
|
||||
|
||||
<p>Each ViewVC release strives to maintain URL stability with previous
|
||||
releases, and 1.1.0 is no exception. All URLs considered valid for
|
||||
previous ViewVC releases should continue to work correctly in this
|
||||
release, though possibly only via the use of HTTP redirects
|
||||
(generated by ViewVC itself).</p>
|
||||
|
||||
<p>The commits database functionality has changed in ViewVC 1.1.0 in
|
||||
way that breaks compatibility with prior ViewVC releases, but only
|
||||
for new database instantiations. ViewVC 1.1.0 will continue to
|
||||
understand (for both read and write operations) the previous
|
||||
schema, so you are not required to rebuild your commits database
|
||||
for ViewVC 1.1.0 compatibility. By default, new commits databases
|
||||
created using the 1.1.0 version of the <code>make-database</code>
|
||||
script will use a new database schema that is unreadable by
|
||||
previous ViewVC versions. However, if you need a database which
|
||||
can co-exist with a previous ViewVC version, you can use
|
||||
the <code>--version=1.0</code> option
|
||||
to <code>make-database</code>.</p>
|
||||
|
||||
<p>The ViewVC configuration files and template language have changed
|
||||
dramatically. See the file <code>docs/upgrading-howto.html</code>
|
||||
in the release for information on porting existing versions of
|
||||
those items for use with ViewVC 1.1.0.</p>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="h2">
|
||||
<h2 id="compatibility">Features and Fixes</h2>
|
||||
|
||||
<div class="h3">
|
||||
<h3 id="">Extensible path-based authorization w/ Subversion authz support</h3>
|
||||
|
||||
<p>In a nutshell, ViewVC is now able to do path-based authorization.
|
||||
ViewVC 1.0 has a configuration option for naming 'forbidden'
|
||||
modules, but it is really limited — it basically just makes a
|
||||
universal decision about which top-level directories in every
|
||||
hosted repository should be hidden by ViewVC. People want
|
||||
more, and specifically requested that ViewVC learn how to honor
|
||||
Subversion's authz files and semantics. So, along with some other
|
||||
types of authorization approaches, that's what ViewVC 1.1 can now
|
||||
do. If you are using mod_authz_svn with Apache today, or
|
||||
svnserve's built-in authorization support, then you can now point
|
||||
ViewVC to the same authz configuration file and have it honor the
|
||||
access rules you've defined for your repositories.</p>
|
||||
|
||||
<p>Note that ViewVC does <strong>not</strong> handle authentication,
|
||||
though. You'll need to configure your web server to demand login
|
||||
credentials from users, which the web server itself can then hand
|
||||
off to ViewVC for application against the authorization rules
|
||||
you've defined.</p>
|
||||
|
||||
<p class="warning">WARNING: The root listing view does not consult the
|
||||
authorization subsystem when deciding what roots to display to a
|
||||
given user. If you need to protect your root names, consider
|
||||
disabling it by removing <code>roots</code> from the set of views
|
||||
listed in the
|
||||
<code>allowed_views</code> configuration option.</p>
|
||||
|
||||
<p class="warning">WARNING: Support for path-based authorization is
|
||||
incomplete in the experimental version control backend modules,
|
||||
including the one that permits display of remote Subversion
|
||||
repositories.</p>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="h3">
|
||||
<h3 id="">Subversion versioned properties display</h3>
|
||||
|
||||
<p>ViewVC 1.1 displays the properties that Subversion lets you store
|
||||
on files and directories
|
||||
(<code>svn:mime-type</code>, <code>svn:mergeinfo</code>,
|
||||
<code>svn:ignore</code>, etc.). Directory properties are shown by
|
||||
default at the bottom of that directory's entry listing. File
|
||||
properties are displayed at the bottom of that file's
|
||||
markup/annotate view.</p>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="h3">
|
||||
<h3 id="">Unified markup and annotation views</h3>
|
||||
|
||||
<p>The "markup" and "annotate" views in ViewVC now have a unified look
|
||||
and feel (driven by a single EZT template). Both views support
|
||||
syntax highlighting and Subversion file property display.</p>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="h3">
|
||||
<h3 id="">Unified, hassle-free Pygments-based syntax highlighting</h3>
|
||||
|
||||
<p>ViewVC 1.0 does syntax highlighting by working with GNU enscript, or
|
||||
highlight, or php, or py2html — all these external tools just
|
||||
to accomplish a single task. But they all do things in slightly
|
||||
different ways. And if you configure them wrongly, you get strange
|
||||
errors. <a href="http://www.pygments.org/">Pygments</a> (which is
|
||||
also used by <a href="http://trac.edgewall.org/">Trac</a> for
|
||||
syntax highlighting) is a Python package that requires no
|
||||
configuration, is easier to use inside ViewVC, and so on. So
|
||||
ViewVC 1.1 drops support for all those various old integrations,
|
||||
and just uses Pygments for everything now. This change was about
|
||||
developer and administrator sanity. There will be complaints, to
|
||||
be sure, about how various color schemes differ and what file types
|
||||
now are and aren't understood by the syntax highlighting engine,
|
||||
but this change should vastly simplify the discussions of such
|
||||
things.</p>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="h3">
|
||||
<h3 id="">Better MIME detection and handling</h3>
|
||||
|
||||
<p>ViewVC typically consults a MIME types file to determine what kind
|
||||
of file a given document is, based on its filename extension
|
||||
(<code>.jpg</code> = <code>image/jpeg</code>, …). But
|
||||
Subversion lets you dictate a file's MIME type using
|
||||
the <code>svn:mime-type</code> property. ViewVC now recognizes and
|
||||
honors that property as the preferred source of a file's MIME type.
|
||||
This can be disabled in the configuration, though, which might be
|
||||
desirable if many of your Subversion-versioned files carry the
|
||||
generic <code>application/octet-stream</code> MIME type that
|
||||
Subversion uses by default for non-human-readable files.</p>
|
||||
|
||||
<p>Also, ViewVC now allows you to specify multiple MIME type mapping
|
||||
files that you'd like it to consult when determine the MIME type of
|
||||
files based on their extensions. This allows administrators to
|
||||
easily define their own custom mappings for ViewVC's benefit
|
||||
without potentially affecting the mappings used by other site
|
||||
services.</p>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="h3">
|
||||
<h3 id="">Support for full content diffs</h3>
|
||||
|
||||
<p>ViewVC 1.1 expands the previously existing options of "colored
|
||||
diff" and "long colored diff" with a new "full colored diff", which
|
||||
shows the full contents of the changed file (instead of only the 3
|
||||
or 15 lines of context shown via the older diff display types).</p>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="h3">
|
||||
<h3 id="">Support for per-root configuration overrides</h3>
|
||||
|
||||
<p>In ViewVC 1.1, you can setup configuration option overrides on a
|
||||
per-root (per-repository) basis (if you need/care to do so). See
|
||||
the comments in the <code>viewvc.conf.dist</code> file for more on
|
||||
how to do this.</p>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="h3">
|
||||
<h3 id="">Optional email address obfuscation/mangling</h3>
|
||||
|
||||
<p>ViewVC can, when displaying revision metadata, munge strings that
|
||||
look like email addresses to protect them from screen-scraping
|
||||
spammers. For example, a log message that says, "Patch by:
|
||||
cmpilato@red-bean.com" can optionally be displayed by ViewVC using
|
||||
HTML entity encoding for the characters (a trick that causes no
|
||||
visible change to the output, but that might confuse
|
||||
unsophisticated spam bot crawlers) or as "Patch by: cmpilato@..."
|
||||
(which isn't a complete email address at all, but might be enough
|
||||
information for the human reading the log message to know who to
|
||||
blame for the patch).</p>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="h3">
|
||||
<h3 id="">Pagination improvements</h3>
|
||||
|
||||
<p>The way that ViewVC splits directory and log views across pages has
|
||||
been reworked. The old way was "Fetch all the information you can
|
||||
find, then display only one page's worth." The new way is "Fetch
|
||||
only what you need to display the page requested, plus a little bit
|
||||
of border information." This provides a large performance
|
||||
enhancement for the default sort orderings.</p>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</body>
|
||||
</html>
|
@@ -315,7 +315,7 @@ td {
|
||||
<tr class="varlevel1">
|
||||
<td class="varname">pathrev_hidden_values</td>
|
||||
<td>List</td>
|
||||
<td>Hidden field name/value pairs for the revision/tag selection form.</td>
|
||||
<td>Hidden value name/value pairs for the revision/tag selection form.</td>
|
||||
</tr>
|
||||
<tr class="varlevel1">
|
||||
<td class="varname">pathrev_clear_action</td>
|
||||
@@ -325,7 +325,7 @@ td {
|
||||
<tr class="varlevel1">
|
||||
<td class="varname">pathrev_clear_hidden_values</td>
|
||||
<td>List</td>
|
||||
<td>Hidden field name/value pairs for the path revision clear button.</td>
|
||||
<td>Hidden value name/value pairs for the path revision clear button.</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
@@ -598,45 +598,6 @@ td {
|
||||
<td colspan="3">Includes all variables from the
|
||||
<a href="#variables-common">COMMON</a> variable set</td>
|
||||
</tr>
|
||||
<tr class="varlevel1">
|
||||
<td class="varname">gbbox</td>
|
||||
<td>Boolean</td>
|
||||
<td>Toggle generation of a branch box at the tip of all branches in
|
||||
the revision graph.</td>
|
||||
</tr>
|
||||
<tr class="varlevel1">
|
||||
<td class="varname">gflip</td>
|
||||
<td>Boolean</td>
|
||||
<td>Toggle the direction of the revision graph.</td>
|
||||
</tr>
|
||||
<tr class="varlevel1">
|
||||
<td class="varname">gleft</td>
|
||||
<td>Boolean</td>
|
||||
<td>Toggle the orientation of the revision graph.</td>
|
||||
</tr>
|
||||
<tr class="varlevel1">
|
||||
<td class="varname">gmaxtag</td>
|
||||
<td>String</td>
|
||||
<td>Number of tags per revision to display in the revision graph.</td>
|
||||
</tr>
|
||||
<tr class="varlevel1">
|
||||
<td class="varname">graph_action</td>
|
||||
<td>String</td>
|
||||
<td>Form action URL for the graph customization form.</td>
|
||||
</tr>
|
||||
<tr class="varlevel1">
|
||||
<td class="varname">graph_hidden_values</td>
|
||||
<td>String</td>
|
||||
<td>Hidden value name/value pairs for the graph customization form.</td>
|
||||
</tr>
|
||||
<tr class="varlevel1">
|
||||
<td class="varname">gshow</td>
|
||||
<td>String</td>
|
||||
<td>Classes of revisions to show in the revision graph. Valid values
|
||||
are <tt>all</tt> (all revision), <tt>inittagged</tt> (initial
|
||||
revision(s) and tagged revisions), and <tt>tagged</tt> (tagged
|
||||
revisions only).</td>
|
||||
</tr>
|
||||
<tr class="varlevel1">
|
||||
<td class="varname">imagemap</td>
|
||||
<td>String</td>
|
||||
@@ -649,37 +610,6 @@ td {
|
||||
<td>URL of the ViewVC revision graph image for the current
|
||||
resource.</td>
|
||||
</tr>
|
||||
<tr class="varlevel1">
|
||||
<td class="varname">opt_gbbox</td>
|
||||
<td>Boolean</td>
|
||||
<td>Specifies whether the user is allowed to toggle the generation
|
||||
of branch boxes at the tip of all branches in the revision
|
||||
graph.</td>
|
||||
</tr>
|
||||
<tr class="varlevel1">
|
||||
<td class="varname">opt_gflip</td>
|
||||
<td>Boolean</td>
|
||||
<td>Specifies whether the user is allowed to toggle the direction
|
||||
of the revision graph.</td>
|
||||
</tr>
|
||||
<tr class="varlevel1">
|
||||
<td class="varname">opt_gleft</td>
|
||||
<td>Boolean</td>
|
||||
<td>Specifies whether the user is allowed to toggle the orientation
|
||||
of the revision graph.</td>
|
||||
</tr>
|
||||
<tr class="varlevel1">
|
||||
<td class="varname">opt_gmaxtag</td>
|
||||
<td>Boolean</td>
|
||||
<td>Specifies whether the user is allowed to configure the maximum
|
||||
number of tags per revision show in the revision graph.</td>
|
||||
</tr>
|
||||
<tr class="varlevel1">
|
||||
<td class="varname">opt_gshow</td>
|
||||
<td>Boolean</td>
|
||||
<td>Specifies whether the user is allowed to configure which
|
||||
classes of revisions are shown in the revision graph.</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
@@ -789,7 +719,7 @@ td {
|
||||
<tr class="varlevel1">
|
||||
<td class="varname">diff_format_hidden_values</td>
|
||||
<td>List</td>
|
||||
<td>Hidden field name/value pairs for the diff format selection form.</td>
|
||||
<td>Hidden value name/value pairs for the diff format selection form.</td>
|
||||
</tr>
|
||||
<tr class="varlevel1">
|
||||
<td class="varname">left</td>
|
||||
@@ -969,7 +899,7 @@ td {
|
||||
<tr class="varlevel1">
|
||||
<td class="varname">dir_paging_hidden_values</td>
|
||||
<td>List</td>
|
||||
<td>Hidden field name/value pairs for the page selection form.</td>
|
||||
<td>Hidden value name/value pairs for the page selection form.</td>
|
||||
</tr>
|
||||
<tr class="varlevel1">
|
||||
<td class="varname">entries</td>
|
||||
@@ -1160,7 +1090,7 @@ td {
|
||||
<tr class="varlevel1">
|
||||
<td class="varname">search_re_hidden_values</td>
|
||||
<td>List</td>
|
||||
<td>Hidden field name/value pairs for the regular expression search form.</td>
|
||||
<td>Hidden value name/value pairs for the regular expression search form.</td>
|
||||
</tr>
|
||||
<tr class="varlevel1">
|
||||
<td class="varname">show_attic_href</td>
|
||||
@@ -1306,7 +1236,7 @@ td {
|
||||
<tr class="varlevel1">
|
||||
<td class="varname">diff_select_hidden_values</td>
|
||||
<td>List</td>
|
||||
<td>Hidden field name/value pairs for the diff selection form.</td>
|
||||
<td>Hidden value name/value pairs for the diff selection form.</td>
|
||||
</tr>
|
||||
<tr class="varlevel1">
|
||||
<td class="varname">entries</td>
|
||||
@@ -1587,7 +1517,7 @@ td {
|
||||
<tr class="varlevel1">
|
||||
<td class="varname">log_paging_hidden_values</td>
|
||||
<td>List</td>
|
||||
<td>Hidden field name/value pairs for the page selection form.</td>
|
||||
<td>Hidden value name/value pairs for the page selection form.</td>
|
||||
</tr>
|
||||
<tr class="varlevel1">
|
||||
<td class="varname">logsort</td>
|
||||
@@ -1603,7 +1533,7 @@ td {
|
||||
<tr class="varlevel1">
|
||||
<td class="varname">logsort_hidden_values</td>
|
||||
<td>List</td>
|
||||
<td>Hidden field name/value pairs for the log sort drop down box</td>
|
||||
<td>Hidden value name/value pairs for the log sort drop down box</td>
|
||||
</tr>
|
||||
<tr class="varlevel1">
|
||||
<td class="varname">mime_type</td>
|
||||
@@ -1967,7 +1897,7 @@ td {
|
||||
<tr class="varlevel1">
|
||||
<td class="varname">query_hidden_values</td>
|
||||
<td>List</td>
|
||||
<td>Hidden field name/value pairs for query form.</td>
|
||||
<td>Hidden value name/value pairs for query form.</td>
|
||||
</tr>
|
||||
<tr class="varlevel1">
|
||||
<td class="varname">querysort</td>
|
||||
@@ -2107,7 +2037,7 @@ td {
|
||||
<tr class="varlevel1">
|
||||
<td class="varname">jump_rev_hidden_values</td>
|
||||
<td>List</td>
|
||||
<td>Hidden field name/value pairs for revision jump form.</td>
|
||||
<td>Hidden value name/value pairs for revision jump form.</td>
|
||||
</tr>
|
||||
<tr class="varlevel1">
|
||||
<td class="varname">limit_changes</td>
|
||||
|
@@ -654,35 +654,6 @@ th.caption {
|
||||
<td>depends</td>
|
||||
<td><a href="#root-param"><code>root</code> parameter</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>gflip=<var>GFLIP</var></code></td>
|
||||
<td>optional</td>
|
||||
<td>"1" if the revisions in the graph should run
|
||||
youngest-to-oldest; "0" for the reverse</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>gbbox=<var>GBBOX</var></code></td>
|
||||
<td>optional</td>
|
||||
<td>"1" if the revision graph should contain branch boxes at the
|
||||
tip of each branch; "0" otherwise</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>gleft=<var>GLEFT</var></code></td>
|
||||
<td>optional</td>
|
||||
<td>"1" if the revision graph should be orientated left-to-right;
|
||||
"0" otherwise</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>gmaxtag=<var>GMAXTAG</var></code></td>
|
||||
<td>optional</td>
|
||||
<td>maximum number of per-revision tags to show in the revision graph</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>gshow=<var>GSHOW</var></code></td>
|
||||
<td>optional</td>
|
||||
<td>"all", "inittagged", or "tagged" — user-selected classes
|
||||
of revision to show in the graph</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<h3 id="graphimg-view">Graph Image View</h3>
|
||||
@@ -729,35 +700,6 @@ th.caption {
|
||||
<td>depends</td>
|
||||
<td><a href="#root-param"><code>root</code> parameter</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>gflip=<var>GFLIP</var></code></td>
|
||||
<td>optional</td>
|
||||
<td>"1" if the revisions in the graph should run
|
||||
youngest-to-oldest; "0" for the reverse</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>gbbox=<var>GBBOX</var></code></td>
|
||||
<td>optional</td>
|
||||
<td>"1" if the revision graph should contain branch boxes at the
|
||||
tip of each branch; "0" otherwise</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>gleft=<var>GLEFT</var></code></td>
|
||||
<td>optional</td>
|
||||
<td>"1" if the revision graph should be orientated left-to-right;
|
||||
"0" otherwise</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>gmaxtag=<var>GMAXTAG</var></code></td>
|
||||
<td>optional</td>
|
||||
<td>maximum number of per-revision tags to show in the revision graph</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>gshow=<var>GSHOW</var></code></td>
|
||||
<td>optional</td>
|
||||
<td>"all", "inittagged", or "tagged" — user-selected classes
|
||||
of revision to show in the graph</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<h3 id="log-view">Log View</h3>
|
||||
@@ -1054,7 +996,7 @@ th.caption {
|
||||
<td>file query string</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>file_match=<var>FILE_MATCH</var></code></td>
|
||||
<td><code>file_match=FILE_MATCH</code></td>
|
||||
<td>optional</td>
|
||||
<td>"exact" "like" "glob" "regex" or "notregex" determining type
|
||||
of file match</td>
|
||||
@@ -1065,7 +1007,7 @@ th.caption {
|
||||
<td>author query string</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>who_match=<var>WHO_MATCH</var></code></td>
|
||||
<td><code>who_match=WHO_MATCH</code></td>
|
||||
<td>optional</td>
|
||||
<td>"exact" "like" "glob" "regex" or "notregex" determining type
|
||||
of author match</td>
|
||||
@@ -1082,36 +1024,36 @@ th.caption {
|
||||
of log message match</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>querysort=<var>SORT</var></code></td>
|
||||
<td><code>querysort=SORT</code></td>
|
||||
<td>optional</td>
|
||||
<td>"date" "author" or "file" determining order of query results</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>date=<var>DATE</var></code></td>
|
||||
<td><code>date=DATE</code></td>
|
||||
<td>optional</td>
|
||||
<td>"hours" "day" "week" "month" "all" or "explicit" to filter
|
||||
query results by date</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>hours=<var>HOURS</var></code></td>
|
||||
<td><code>hours=HOURS</code></td>
|
||||
<td>optional</td>
|
||||
<td>number of hours back to include results from when
|
||||
<code><var>DATE</var></code> is "hours"</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>mindate=<var>MINDATE</var></code></td>
|
||||
<td><code>mindate=MINDATE</code></td>
|
||||
<td>optional</td>
|
||||
<td>earliest date to include results from when
|
||||
<code><var>DATE</var></code> is "explicit"</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>maxdate=<var>MAXDATE</var></code></td>
|
||||
<td><code>maxdate=MAXDATE</code></td>
|
||||
<td>optional</td>
|
||||
<td>latest date to include results from when
|
||||
<code><var>DATE</var></code> is "explicit"</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>limit_changes=<var>LIMIT_CHANGES</var></code></td>
|
||||
<td><code>limit_changes=LIMIT_CHANGES</code></td>
|
||||
<td>optional</td>
|
||||
<td>maximum number of files to list per commit in query
|
||||
results. Default is value of <code>limit_changes</code>
|
||||
@@ -1171,7 +1113,7 @@ th.caption {
|
||||
<td>branch query string</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>branch_match=<var>BRANCH_MATCH</var></code></td>
|
||||
<td><code>branch_match=BRANCH_MATCH</code></td>
|
||||
<td>optional</td>
|
||||
<td>"exact" "like" "glob" "regex" or "notregex" determining type
|
||||
of branch match</td>
|
||||
@@ -1187,7 +1129,7 @@ th.caption {
|
||||
<td>file query string</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>file_match=<var>FILE_MATCH</var></code></td>
|
||||
<td><code>file_match=FILE_MATCH</code></td>
|
||||
<td>optional</td>
|
||||
<td>"exact" "like" "glob" "regex" or "notregex" determining type
|
||||
of file match</td>
|
||||
@@ -1198,7 +1140,7 @@ th.caption {
|
||||
<td>author query string</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>who_match=<var>WHO_MATCH</var></code></td>
|
||||
<td><code>who_match=WHO_MATCH</code></td>
|
||||
<td>optional</td>
|
||||
<td>"exact" "like" "glob" "regex" or "notregex" determining type
|
||||
of author match</td>
|
||||
@@ -1215,50 +1157,50 @@ th.caption {
|
||||
of log message match</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>querysort=<var>SORT</var></code></td>
|
||||
<td><code>querysort=SORT</code></td>
|
||||
<td>optional</td>
|
||||
<td>"date" "author" or "file" determining order of query results</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>date=<var>DATE</var></code></td>
|
||||
<td><code>date=DATE</code></td>
|
||||
<td>optional</td>
|
||||
<td>"hours" "day" "week" "month" "all" or "explicit" to filter
|
||||
query results by date</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>hours=<var>HOURS</var></code></td>
|
||||
<td><code>hours=HOURS</code></td>
|
||||
<td>optional</td>
|
||||
<td>number of hours back to include results from when
|
||||
<code><var>DATE</var></code> is "hours"</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>mindate=<var>MINDATE</var></code></td>
|
||||
<td><code>mindate=MINDATE</code></td>
|
||||
<td>optional</td>
|
||||
<td>earliest date to include results from when
|
||||
<code><var>DATE</var></code> is "explicit"</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>maxdate=<var>MAXDATE</var></code></td>
|
||||
<td><code>maxdate=MAXDATE</code></td>
|
||||
<td>optional</td>
|
||||
<td>latest date to include results from when
|
||||
<code><var>DATE</var></code> is "explicit"</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>format=<var>FORMAT</var></code></td>
|
||||
<td><code>format=FORMAT</code></td>
|
||||
<td>optional</td>
|
||||
<td>"rss" or "backout" values to generate an rss feed or list of
|
||||
commands to back out changes instead showing a normal query result
|
||||
page</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>limit=<var>LIMIT</var></code></td>
|
||||
<td><code>limit=LIMIT</code></td>
|
||||
<td>optional</td>
|
||||
<td>maximum number of file-revisions to process during a
|
||||
query. Default is value of <code>row_limit</code> configuration
|
||||
option</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>limit_changes=<var>LIMIT_CHANGES</var></code></td>
|
||||
<td><code>limit_changes=LIMIT_CHANGES</code></td>
|
||||
<td>optional</td>
|
||||
<td>maximum number of files to list per commit in query
|
||||
results. Default is value of <code>limit_changes</code>
|
||||
@@ -1312,7 +1254,7 @@ th.caption {
|
||||
<td><a href="#revision-param"><code>revision</code> parameter</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>limit_changes=<var>LIMIT_CHANGES</var></code></td>
|
||||
<td><code>limit_changes=LIMIT_CHANGES</code></td>
|
||||
<td>optional</td>
|
||||
<td>maximum number of files to list per commit. Default is value
|
||||
of <code>limit_changes</code> configuration option</td>
|
||||
|
@@ -244,10 +244,8 @@ class Config:
|
||||
self.options.use_localtime = 0
|
||||
self.options.short_log_len = 80
|
||||
self.options.enable_syntax_coloration = 1
|
||||
self.options.detect_encoding = 0
|
||||
self.options.use_cvsgraph = 0
|
||||
self.options.cvsgraph_conf = "cvsgraph.conf"
|
||||
self.options.allowed_cvsgraph_useropts = []
|
||||
self.options.use_re_search = 0
|
||||
self.options.dir_pagesize = 0
|
||||
self.options.log_pagesize = 0
|
||||
|
24
lib/cvsdb.py
24
lib/cvsdb.py
@@ -67,9 +67,9 @@ class CheckinDatabase:
|
||||
else:
|
||||
self._version = 0
|
||||
if self._version > CURRENT_SCHEMA_VERSION:
|
||||
raise DatabaseVersionError("Database version %d is newer than the "
|
||||
"last version supported by this "
|
||||
"software." % (self._version))
|
||||
raise Exception("Database version %d is newer than the last "
|
||||
"version supported by this software."
|
||||
% (self._version))
|
||||
|
||||
def sql_get_id(self, table, column, value, auto_set):
|
||||
sql = "SELECT id FROM %s WHERE %s=%%s" % (table, column)
|
||||
@@ -542,10 +542,9 @@ class CheckinDatabase:
|
||||
cursor.execute(sql)
|
||||
|
||||
def PurgeRepository(self, repository):
|
||||
rep_id = self.GetRepositoryID(repository, auto_set=0)
|
||||
rep_id = self.GetRepositoryID(repository)
|
||||
if not rep_id:
|
||||
raise UnknownRepositoryError("Unknown repository '%s'"
|
||||
% (repository))
|
||||
raise Exception, "Unknown repository '%s'" % (repository)
|
||||
|
||||
if (self._version >= 1):
|
||||
self.sql_delete('repositories', 'id', rep_id)
|
||||
@@ -581,19 +580,6 @@ class CheckinDatabase:
|
||||
self.sql_delete('descs', 'id', checkin[3], 'descid')
|
||||
self.sql_delete('people', 'id', checkin[4], 'whoid')
|
||||
|
||||
# Reset all internal id caches. We could be choosier here,
|
||||
# but let's just be as safe as possible.
|
||||
self._get_cache = {}
|
||||
self._get_id_cache = {}
|
||||
self._desc_id_cache = {}
|
||||
|
||||
|
||||
class DatabaseVersionError(Exception):
|
||||
pass
|
||||
class UnknownRepositoryError(Exception):
|
||||
pass
|
||||
|
||||
|
||||
## the Commit class holds data on one commit, the representation is as
|
||||
## close as possible to how it should be committed and retrieved to the
|
||||
## database engine
|
||||
|
@@ -158,7 +158,8 @@ class CgiServer(Server):
|
||||
if self.iis: url = fix_iis_url(self, url)
|
||||
self.addheader('Location', url)
|
||||
self.header(status='301 Moved')
|
||||
sys.stdout.write('This document is located <a href="%s">here</a>.\n' % url)
|
||||
print 'This document is located <a href="%s">here</a>.' % url
|
||||
sys.exit(0)
|
||||
|
||||
def escape(self, s, quote = None):
|
||||
return cgi.escape(s, quote)
|
||||
@@ -218,6 +219,7 @@ class AspServer(ThreadedServer):
|
||||
|
||||
def redirect(self, url):
|
||||
self.response.Redirect(url)
|
||||
sys.exit()
|
||||
|
||||
def escape(self, s, quote = None):
|
||||
return self.server.HTMLEncode(str(s))
|
||||
@@ -306,7 +308,8 @@ class ModPythonServer(ThreadedServer):
|
||||
self.request.headers_out['Location'] = url
|
||||
self.request.status = mod_python.apache.HTTP_MOVED_TEMPORARILY
|
||||
self.request.write("You are being redirected to <a href=\"%s\">%s</a>"
|
||||
% (url, url))
|
||||
% (url, url))
|
||||
sys.exit()
|
||||
|
||||
def escape(self, s, quote = None):
|
||||
return cgi.escape(s, quote)
|
||||
|
@@ -22,6 +22,7 @@ class ViewVCAuthorizer(vcauth.GenericViewVCAuthorizer):
|
||||
"""Subversion authz authorizer module"""
|
||||
|
||||
def __init__(self, username, params={}):
|
||||
self.username = username
|
||||
self.rootpaths = { } # {root -> { paths -> access boolean for USERNAME }}
|
||||
|
||||
# Get the authz file location from a passed-in parameter.
|
||||
@@ -31,29 +32,14 @@ class ViewVCAuthorizer(vcauth.GenericViewVCAuthorizer):
|
||||
if not os.path.exists(self.authz_file):
|
||||
raise debug.ViewVCException("Configured authzfile file not found")
|
||||
|
||||
# See if the admin wants us to do case normalization of usernames.
|
||||
self.force_username_case = params.get('force_username_case')
|
||||
if self.force_username_case == "upper":
|
||||
self.username = username.upper()
|
||||
elif self.force_username_case == "lower":
|
||||
self.username = username.lower()
|
||||
elif not self.force_username_case:
|
||||
self.username = username
|
||||
else:
|
||||
raise debug.ViewVCException("Invalid value for force_username_case "
|
||||
"option")
|
||||
|
||||
def _get_paths_for_root(self, rootname):
|
||||
if self.rootpaths.has_key(rootname):
|
||||
return self.rootpaths[rootname]
|
||||
|
||||
paths_for_root = { }
|
||||
|
||||
# Parse the authz file, replacing ConfigParser's optionxform()
|
||||
# method with something that won't futz with the case of the
|
||||
# option names.
|
||||
# Parse the authz file.
|
||||
cp = ConfigParser()
|
||||
cp.optionxform = lambda x: x
|
||||
cp.read(self.authz_file)
|
||||
|
||||
# Figure out if there are any aliases for the current username
|
||||
|
193
lib/viewvc.py
193
lib/viewvc.py
@@ -14,7 +14,7 @@
|
||||
#
|
||||
# -----------------------------------------------------------------------
|
||||
|
||||
__version__ = '1.2-dev'
|
||||
__version__ = '1.1.0'
|
||||
|
||||
# this comes from our library; measure the startup time
|
||||
import debug
|
||||
@@ -151,9 +151,6 @@ class Request:
|
||||
|
||||
# Process the query params
|
||||
for name, values in self.server.params().items():
|
||||
# we only care about the first value
|
||||
value = values[0]
|
||||
|
||||
# patch up old queries that use 'cvsroot' to look like they used 'root'
|
||||
if name == 'cvsroot':
|
||||
name = 'root'
|
||||
@@ -164,18 +161,25 @@ class Request:
|
||||
name = 'pathrev'
|
||||
needs_redirect = 1
|
||||
|
||||
# redirect view=rev to view=revision, too
|
||||
if name == 'view' and value == 'rev':
|
||||
value = 'revision'
|
||||
needs_redirect = 1
|
||||
|
||||
# validate the parameter
|
||||
_validate_param(name, value)
|
||||
_validate_param(name, values[0])
|
||||
|
||||
# Only allow the magic ViewVC MIME types (the ones used for
|
||||
# requesting the markup as as-text views) to be declared via CGI
|
||||
# params. Ignore disallowed values.
|
||||
if (name == 'content-type') and \
|
||||
(not values[0] in (viewcvs_mime_type,
|
||||
alt_mime_type,
|
||||
'text/plain')):
|
||||
continue
|
||||
|
||||
# if we're here, then the parameter is okay
|
||||
self.query_dict[name] = value
|
||||
self.query_dict[name] = values[0]
|
||||
|
||||
# Resolve the view parameter into a handler function.
|
||||
# handle view parameter, redirecting old view=rev URLs to view=revision
|
||||
if self.query_dict.get('view') == 'rev':
|
||||
self.query_dict['view'] = 'revision'
|
||||
needs_redirect = 1
|
||||
self.view_func = _views.get(self.query_dict.get('view', None),
|
||||
self.view_func)
|
||||
|
||||
@@ -388,14 +392,15 @@ class Request:
|
||||
and self.view_func is not redirect_pathrev):
|
||||
needs_redirect = 1
|
||||
|
||||
# startup is done now.
|
||||
debug.t_end('startup')
|
||||
|
||||
# If we need to redirect, do so. Otherwise, handle our requested view.
|
||||
# redirect now that we know the URL is valid
|
||||
if needs_redirect:
|
||||
self.server.redirect(self.get_url())
|
||||
else:
|
||||
self.view_func(self)
|
||||
|
||||
# startup is done now.
|
||||
debug.t_end('startup')
|
||||
|
||||
# Call the function for the selected view.
|
||||
self.view_func(self)
|
||||
|
||||
def get_url(self, escape=0, partial=0, prefix=0, **args):
|
||||
"""Constructs a link to another ViewVC page just like the get_link
|
||||
@@ -608,29 +613,26 @@ def _validate_param(name, value):
|
||||
this function throws an exception. Otherwise, it simply returns None.
|
||||
"""
|
||||
|
||||
# First things first -- check that we have a legal parameter name.
|
||||
try:
|
||||
validator = _legal_params[name]
|
||||
except KeyError:
|
||||
raise debug.ViewVCException(
|
||||
'An illegal parameter name was provided.',
|
||||
'An illegal parameter name ("%s") was passed.' % name,
|
||||
'400 Bad Request')
|
||||
|
||||
# Is there a validator? Is it a regex or a function? Validate if
|
||||
# we can, returning without incident on valid input.
|
||||
if validator is None:
|
||||
return
|
||||
elif hasattr(validator, 'match'):
|
||||
if validator.match(value):
|
||||
return
|
||||
else:
|
||||
if validator(value):
|
||||
return
|
||||
|
||||
# If we get here, the input value isn't valid.
|
||||
raise debug.ViewVCException(
|
||||
'An illegal value was provided for the "%s" parameter.' % (name),
|
||||
'400 Bad Request')
|
||||
# is the validator a regex?
|
||||
if hasattr(validator, 'match'):
|
||||
if not validator.match(value):
|
||||
raise debug.ViewVCException(
|
||||
'An illegal value ("%s") was passed as a parameter.' %
|
||||
value, '400 Bad Request')
|
||||
return
|
||||
|
||||
# the validator must be a function
|
||||
validator(value)
|
||||
|
||||
def _validate_regex(value):
|
||||
# hmm. there isn't anything that we can do here.
|
||||
@@ -640,23 +642,17 @@ def _validate_regex(value):
|
||||
### parameters could constitute a CSS attack.
|
||||
pass
|
||||
|
||||
def _validate_view(value):
|
||||
# Return true iff VALUE is one of our allowed views.
|
||||
return _views.has_key(value)
|
||||
|
||||
def _validate_mimetype(value):
|
||||
# For security purposes, we only allow mimetypes from a predefined set
|
||||
# thereof.
|
||||
return value in (viewcvs_mime_type, alt_mime_type, 'text/plain')
|
||||
|
||||
# obvious things here. note that we don't need uppercase for alpha.
|
||||
_re_validate_alpha = re.compile('^[a-z]+$')
|
||||
_re_validate_number = re.compile('^[0-9]+$')
|
||||
_re_validate_boolint = re.compile('^[01]$')
|
||||
|
||||
# when comparing two revs, we sometimes construct REV:SYMBOL, so ':' is needed
|
||||
_re_validate_revnum = re.compile('^[-_.a-zA-Z0-9:~\\[\\]/]*$')
|
||||
|
||||
# it appears that RFC 2045 also says these chars are legal: !#$%&'*+^{|}~`
|
||||
# but woah... I'll just leave them out for now
|
||||
_re_validate_mimetype = re.compile('^[-_.a-zA-Z0-9/]+$')
|
||||
|
||||
# date time values
|
||||
_re_validate_datetime = re.compile(r'^(\d\d\d\d-\d\d-\d\d(\s+\d\d:\d\d'
|
||||
'(:\d\d)?)?)?$')
|
||||
@@ -664,12 +660,12 @@ _re_validate_datetime = re.compile(r'^(\d\d\d\d-\d\d-\d\d(\s+\d\d:\d\d'
|
||||
# the legal query parameters and their validation functions
|
||||
_legal_params = {
|
||||
'root' : None,
|
||||
'view' : _validate_view,
|
||||
'view' : None,
|
||||
'search' : _validate_regex,
|
||||
'p1' : None,
|
||||
'p2' : None,
|
||||
|
||||
'hideattic' : _re_validate_boolint,
|
||||
'hideattic' : _re_validate_number,
|
||||
'limit_changes' : _re_validate_number,
|
||||
'sortby' : _re_validate_alpha,
|
||||
'sortdir' : _re_validate_alpha,
|
||||
@@ -680,20 +676,13 @@ _legal_params = {
|
||||
'log_pagestart' : _re_validate_number,
|
||||
'annotate' : _re_validate_revnum,
|
||||
'graph' : _re_validate_revnum,
|
||||
'makeimage' : _re_validate_boolint,
|
||||
'makeimage' : _re_validate_number,
|
||||
'r1' : _re_validate_revnum,
|
||||
'tr1' : _re_validate_revnum,
|
||||
'r2' : _re_validate_revnum,
|
||||
'tr2' : _re_validate_revnum,
|
||||
'revision' : _re_validate_revnum,
|
||||
'content-type' : _validate_mimetype,
|
||||
|
||||
# for cvsgraph
|
||||
'gflip' : _re_validate_boolint,
|
||||
'gbbox' : _re_validate_boolint,
|
||||
'gshow' : _re_validate_alpha,
|
||||
'gleft' : _re_validate_boolint,
|
||||
'gmaxtag' : _re_validate_number,
|
||||
'content-type' : _re_validate_mimetype,
|
||||
|
||||
# for query
|
||||
'branch' : _validate_regex,
|
||||
@@ -720,10 +709,10 @@ _legal_params = {
|
||||
'orig_view' : None,
|
||||
|
||||
# deprecated
|
||||
'parent' : _re_validate_boolint,
|
||||
'parent' : _re_validate_number,
|
||||
'rev' : _re_validate_revnum,
|
||||
'tarball' : _re_validate_boolint,
|
||||
'hidecvsroot' : _re_validate_boolint,
|
||||
'tarball' : _re_validate_number,
|
||||
'hidecvsroot' : _re_validate_number,
|
||||
}
|
||||
|
||||
def _path_join(path_parts):
|
||||
@@ -1373,22 +1362,11 @@ def markup_stream_pygments(request, cfg, blame_data, fp, filename, mime_type):
|
||||
get_lexer_by_name, \
|
||||
get_lexer_for_mimetype, \
|
||||
get_lexer_for_filename
|
||||
encoding = 'guess'
|
||||
if cfg.options.detect_encoding:
|
||||
try:
|
||||
import chardet
|
||||
encoding = 'chardet'
|
||||
except (SyntaxError, ImportError):
|
||||
pass
|
||||
try:
|
||||
lexer = get_lexer_for_mimetype(mime_type,
|
||||
encoding=encoding,
|
||||
stripnl=False)
|
||||
lexer = get_lexer_for_mimetype(mime_type)
|
||||
except ClassNotFound:
|
||||
try:
|
||||
lexer = get_lexer_for_filename(filename,
|
||||
encoding=encoding,
|
||||
stripnl=False)
|
||||
lexer = get_lexer_for_filename(filename)
|
||||
except ClassNotFound:
|
||||
use_pygments = 0
|
||||
except ImportError:
|
||||
@@ -2436,59 +2414,6 @@ def view_checkout(request):
|
||||
copy_stream(fp, server_fp, cfg)
|
||||
fp.close()
|
||||
|
||||
def cvsgraph_make_reqopt(request, cfgname, queryparam, optvalue):
|
||||
# Return a cvsgraph custom option substring bit OPTVALUE based on
|
||||
# CFGNAME's presence in the allowed list of user-configurable
|
||||
# options and QUERYPARAM's presence and boolean interpretation in
|
||||
# the actual request; otherwise, return the empty string for options
|
||||
# that either aren't overridden or aren't allowed to be overridden.
|
||||
|
||||
if (cfgname in request.cfg.options.allowed_cvsgraph_useropts) \
|
||||
and (int(request.query_dict.get(queryparam, 0))):
|
||||
return optvalue
|
||||
return ''
|
||||
|
||||
def cvsgraph_normalize_gshow(request):
|
||||
# Return the effective value of the 'gshow' query parameter, noting
|
||||
# that a missing parameter is the same as gshow=all, and treating a
|
||||
# bogus parameter value as the same as gshow=all, too.
|
||||
gshow = request.query_dict.get('gshow', 'all')
|
||||
if gshow not in ('all', 'inittagged', 'tagged'):
|
||||
gshow = 'all'
|
||||
return gshow
|
||||
|
||||
def cvsgraph_extraopts(request):
|
||||
# Build a set of -O options for controlling cvsgraph's behavior,
|
||||
# based on what the user has requested and filtered against what the
|
||||
# user is allowed to request.
|
||||
|
||||
cfg = request.cfg
|
||||
|
||||
ep = '-O'
|
||||
|
||||
# Simple mappings of boolean flags
|
||||
ep = ep + cvsgraph_make_reqopt(request, 'invert', 'gflip',
|
||||
';upside_down=true')
|
||||
ep = ep + cvsgraph_make_reqopt(request, 'branchbox', 'gbbox',
|
||||
';branch_dupbox=true')
|
||||
ep = ep + cvsgraph_make_reqopt(request, 'rotate', 'gleft',
|
||||
';left_right=true')
|
||||
|
||||
# Stripping is a little more complex.
|
||||
if ('show' in request.cfg.options.allowed_cvsgraph_useropts):
|
||||
gshow = cvsgraph_normalize_gshow(request)
|
||||
if gshow == 'inittagged':
|
||||
ep = ep + ';strip_untagged=true'
|
||||
elif gshow == 'tagged':
|
||||
ep = ep + ';strip_untagged=true;strip_first_rev=true'
|
||||
|
||||
# And tag limitation has a user-supplied value to mess with.
|
||||
if ('limittags' in request.cfg.options.allowed_cvsgraph_useropts) \
|
||||
and request.query_dict.has_key('gmaxtag'):
|
||||
ep = ep + ';rev_maxtags=' + request.query_dict['gmaxtag']
|
||||
|
||||
return ep + ';'
|
||||
|
||||
def view_cvsgraph_image(request):
|
||||
"output the image rendered by cvsgraph"
|
||||
# this function is derived from cgi/cvsgraphmkimg.cgi
|
||||
@@ -2506,7 +2431,6 @@ def view_cvsgraph_image(request):
|
||||
fp = popen.popen(cfg.utilities.cvsgraph or 'cvsgraph',
|
||||
("-c", cfg.path(cfg.options.cvsgraph_conf),
|
||||
"-r", request.repos.rootpath,
|
||||
cvsgraph_extraopts(request),
|
||||
rcsfile), 'rb', 0)
|
||||
|
||||
copy_stream(fp, get_writeready_server_file(request, 'image/png'), cfg)
|
||||
@@ -2549,28 +2473,12 @@ def view_cvsgraph(request):
|
||||
pathtype=vclib.DIR,
|
||||
params={'pathrev': None},
|
||||
escape=1, partial=1),
|
||||
cvsgraph_extraopts(request),
|
||||
rcsfile), 'rb', 0)
|
||||
|
||||
graph_action, graph_hidden_values = \
|
||||
request.get_form(view_func=view_cvsgraph, params={})
|
||||
|
||||
data = common_template_data(request)
|
||||
data.merge(ezt.TemplateData({
|
||||
'imagemap' : fp,
|
||||
'imagesrc' : imagesrc,
|
||||
'graph_action' : graph_action,
|
||||
'graph_hidden_values' : graph_hidden_values,
|
||||
'opt_gflip' : ezt.boolean('invert' in cfg.options.allowed_cvsgraph_useropts),
|
||||
'opt_gbbox' : ezt.boolean('branchbox' in cfg.options.allowed_cvsgraph_useropts),
|
||||
'opt_gshow' : ezt.boolean('show' in cfg.options.allowed_cvsgraph_useropts),
|
||||
'opt_gleft' : ezt.boolean('rotate' in cfg.options.allowed_cvsgraph_useropts),
|
||||
'opt_gmaxtag' : ezt.boolean('limittags' in cfg.options.allowed_cvsgraph_useropts),
|
||||
'gflip' : ezt.boolean(int(request.query_dict.get('gflip', 0))),
|
||||
'gbbox' : ezt.boolean(int(request.query_dict.get('gbbox', 0))),
|
||||
'gleft' : ezt.boolean(int(request.query_dict.get('gleft', 0))),
|
||||
'gmaxtag' : request.query_dict.get('gmaxtag', 0),
|
||||
'gshow' : cvsgraph_normalize_gshow(request),
|
||||
}))
|
||||
generate_page(request, "graph", data)
|
||||
|
||||
@@ -3517,8 +3425,6 @@ def view_queryform(request):
|
||||
'hours' : request.query_dict.get('hours', '2'),
|
||||
'mindate' : request.query_dict.get('mindate', ''),
|
||||
'maxdate' : request.query_dict.get('maxdate', ''),
|
||||
'query_action' : query_action,
|
||||
'query_hidden_values' : query_hidden_values,
|
||||
'limit_changes' : limit_changes,
|
||||
'dir_href' : request.get_url(view_func=view_directory, params={},
|
||||
escape=1),
|
||||
@@ -4162,9 +4068,10 @@ def view_error(server, cfg):
|
||||
exc_dict = debug.GetExceptionData()
|
||||
status = exc_dict['status']
|
||||
if exc_dict['msg']:
|
||||
exc_dict['msg'] = server.escape(exc_dict['msg'])
|
||||
exc_dict['msg'] = htmlify(exc_dict['msg'], mangle_email_addrs=0)
|
||||
if exc_dict['stacktrace']:
|
||||
exc_dict['stacktrace'] = server.escape(exc_dict['stacktrace'])
|
||||
exc_dict['stacktrace'] = htmlify(exc_dict['stacktrace'],
|
||||
mangle_email_addrs=0)
|
||||
handled = 0
|
||||
|
||||
# use the configured error template if possible
|
||||
|
@@ -272,8 +272,3 @@ table.vc_idiff tbody th {
|
||||
.vc_query_form {
|
||||
background-color: #e6e6e6;
|
||||
}
|
||||
|
||||
|
||||
/*** Graph Display Form ***/
|
||||
.vc_graph_form {
|
||||
}
|
||||
|
@@ -1,15 +1,5 @@
|
||||
[# ------------------------------------------------------------------------- ]
|
||||
[# CUSTOMIZE ME: To avoid displaying "binary garbage" -- the contents of ]
|
||||
[# files with non-human-readable file formats -- change the value of the ]
|
||||
[# hide_binary_garbage variable below to 1. ]
|
||||
[# ------------------------------------------------------------------------- ]
|
||||
|
||||
[define hide_binary_garbage]0[end]
|
||||
|
||||
[# ------------------------------------------------------------------------- ]
|
||||
|
||||
[# setup page definitions]
|
||||
[define page_title]Contents of /[where][end]
|
||||
[define page_title]Annotate of /[where][end]
|
||||
[define help_href][docroot]/help_rootview.html[end]
|
||||
[# end]
|
||||
|
||||
@@ -67,14 +57,6 @@ Revision [if-any revision_href]<a href="[revision_href]"><strong>[rev]</strong><
|
||||
[end]
|
||||
</div>
|
||||
|
||||
[if-any prefer_markup][define hide_binary_garbage]0[end][end]
|
||||
[if-any image_src_href][define hide_binary_garbage]0[end][end]
|
||||
|
||||
[is hide_binary_garbage "1"]
|
||||
<p><strong>This file's contents are not viewable. Please
|
||||
<a href="[download_href]">download</a> this version of the
|
||||
file in order to view it.</strong></p>
|
||||
[else]
|
||||
|
||||
[define last_rev]0[end]
|
||||
[define rowclass]vc_row_even[end]
|
||||
@@ -117,7 +99,6 @@ Revision [if-any revision_href]<a href="[revision_href]"><strong>[rev]</strong><
|
||||
</div>
|
||||
[end]
|
||||
[end]
|
||||
[end]
|
||||
|
||||
[include "include/props.ezt"]
|
||||
[include "include/footer.ezt"]
|
||||
|
@@ -15,78 +15,4 @@
|
||||
alt="Revisions of [where]" />
|
||||
</div>
|
||||
|
||||
[define graph_disp_opts][end]
|
||||
[if-any opt_gflip][define graph_disp_opts]1[end][end]
|
||||
[if-any opt_gbbox][define graph_disp_opts]1[end][end]
|
||||
[if-any opt_gleft][define graph_disp_opts]1[end][end]
|
||||
|
||||
[define graph_user_opts][end]
|
||||
[if-any graph_disp_opts][define graph_user_opts]1[end][end]
|
||||
[if-any opt_gshow][define graph_user_opts]1[end][end]
|
||||
[if-any opt_gmaxtag][define graph_user_opts]1[end][end]
|
||||
|
||||
[if-any graph_user_opts]
|
||||
|
||||
<form method="get" action="[graph_action]">
|
||||
<div class="vc_graph_form">
|
||||
[for graph_hidden_values]<input type="hidden" name="[graph_hidden_values.name]" value="[graph_hidden_values.value]"/>[end]
|
||||
|
||||
[is graph_disp_opts "1"]
|
||||
<p><strong>Graph display options:</strong></p>
|
||||
<table class="auto">
|
||||
[if-any opt_gflip]
|
||||
<tr>
|
||||
<td><input id="gflip" type="checkbox" name="gflip" value="1"[if-any gflip] checked="checked"[end] /></td>
|
||||
<td style="text-align: left;"><label for="gflip">Flip the graph</label></td>
|
||||
</tr>
|
||||
[end]
|
||||
[if-any opt_gbbox]
|
||||
<tr>
|
||||
<td><input id="gbbox" type="checkbox" name="gbbox" value="1"[if-any gbbox] checked="checked"[end] /></td>
|
||||
<td style="text-align: left;"><label for="gbbox">Add a branch box at the tip of each branch</label></td>
|
||||
</tr>
|
||||
[end]
|
||||
[if-any opt_gleft]
|
||||
<tr>
|
||||
<td><input id="gleft" type="checkbox" name="gleft" value="1"[if-any gleft] checked="checked"[end] /></td>
|
||||
<td style="text-align: left;"><label for="gleft">Draw tree left-to-right (instead of top-to-bottom)</label></td>
|
||||
</tr>
|
||||
[end]
|
||||
</table>
|
||||
[end]
|
||||
|
||||
[if-any opt_gshow]
|
||||
<p><strong>Revision display options:</strong></p>
|
||||
<table class="auto">
|
||||
<tr>
|
||||
<td><input id="gshow_all" type="radio" name="gshow" value="all"[is gshow "all"] checked="checked"[end] /></td>
|
||||
<td style="text-align: left;"><label for="gshow_all">Show all revisions</label></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><input id="gshow_inittagged" type="radio" name="gshow" value="inittagged"[is gshow "inittagged"] checked="checked"[end] /></td>
|
||||
<td style="text-align: left;"><label for="gshow_inittagged">Show only tagged and initial untagged revisions</label></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><input id="gshow_tagged" type="radio" name="gshow" value="tagged"[is gshow "tagged"] checked="checked"[end] /></td>
|
||||
<td style="text-align: left;"><label for="gshow_tagged">Show only tagged revisions</label></td>
|
||||
</tr>
|
||||
</table>
|
||||
[end]
|
||||
|
||||
[if-any opt_gmaxtag]
|
||||
<p><strong>Tag limitation:</strong></p>
|
||||
<table class="auto">
|
||||
<tr>
|
||||
<td><input id="gmaxtag" type="text" size="3" name="gmaxtag" value="[gmaxtag]" /></td>
|
||||
<td style="text-align: left;"><label for="gmaxtag">Maximum number of tags to display (0=all)</label></td>
|
||||
</tr>
|
||||
</table>
|
||||
[end]
|
||||
|
||||
<input type="submit" value="Refresh" />
|
||||
|
||||
</div>
|
||||
</form>
|
||||
[end]
|
||||
|
||||
[include "include/footer.ezt"]
|
||||
|
@@ -228,9 +228,8 @@
|
||||
which describes the directives used in the HTML templates used by
|
||||
ViewVC. The templates themselves can be found in the
|
||||
<code>templates</code> subdirectory. We're currently developing a
|
||||
how-to guide for
|
||||
<a href="http://viewvc.tigris.org/source/browse/viewvc/trunk/docs/template-authoring-guide.html?rev=HEAD"
|
||||
>ViewVC template customization</a>.</p>
|
||||
how-to guide for <a href="./template-authoring-guide.html">ViewVC
|
||||
template customization</a>.</p>
|
||||
|
||||
</div> <!-- section-body -->
|
||||
</div> <!-- section -->
|
||||
|
@@ -35,8 +35,7 @@
|
||||
|
||||
<ul id="bookmarks">
|
||||
<li><a href="#sec-download">Downloading</a></li>
|
||||
<li><a href="#sec-subversion">Subversion Checkout</a></li>
|
||||
<li><a href="#sec-upgrading">Upgrading</a></li>
|
||||
<li><a href="#sec-subversion">Subversion</a></li>
|
||||
</ul>
|
||||
|
||||
<p><a href="http://validator.w3.org/check?uri=referer"><img
|
||||
@@ -69,7 +68,7 @@
|
||||
|
||||
<div class="section">
|
||||
|
||||
<h2 id="sec-subversion">Subversion Checkout</h2>
|
||||
<h2 id="sec-subversion">Subversion</h2>
|
||||
|
||||
<div class="section-body">
|
||||
|
||||
@@ -84,36 +83,6 @@
|
||||
</div> <!-- section-body -->
|
||||
</div> <!-- section -->
|
||||
|
||||
<div class="section">
|
||||
|
||||
<h2 id="sec-upgrading">Upgrading</h2>
|
||||
|
||||
<div class="section-body">
|
||||
|
||||
<p>We've tried to ensure that ViewVC URLs are stable, and that even
|
||||
when we deprecate a particular URL syntax, we continue to support
|
||||
the handling of it (using HTTP redirects to point browsers to the
|
||||
new form of that URL). We know that ViewVC URLs get bookmarked,
|
||||
and nobody likes when their bookmarked URLs suddenly stop working.</p>
|
||||
|
||||
<p>Across patch releases of ViewVC (when only the <em>Z</em> component
|
||||
of <em>version X.Y.Z</em> changes), we do our best to keep the
|
||||
configuration file syntax and template data dictionary unchanged,
|
||||
too. This makes it much easier for folks who need to upgrade
|
||||
quickly to get security or other bug fixes. But across major and
|
||||
minor releases, all bets are off, and chances are good that we've
|
||||
done some major plumbing. When upgrading your ViewVC instance
|
||||
across major or minor version numbers, you'll almost certainly want
|
||||
to consult our
|
||||
<a href="http://viewvc.tigris.org/source/browse/viewvc/trunk/docs/upgrading-howto.html?rev=HEAD"
|
||||
>upgrading HOWTO</a> for tips on how to migrate your configuration
|
||||
files and any template customizations you've made into their new
|
||||
formats.</p>
|
||||
|
||||
</div> <!-- section-body -->
|
||||
</div> <!-- section -->
|
||||
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
@@ -63,9 +63,6 @@
|
||||
<li><a href="#installation">Where does the installation documentation,
|
||||
if any, live?</a></li>
|
||||
|
||||
<li><a href="#vhost-root">How can I expose ViewVC at the root of a
|
||||
virtual host on my webserver?</a></li>
|
||||
|
||||
<li><a href="#authz-support">Does ViewVC support path-based
|
||||
authorization, such as Subversion's authz-file mechanism?</a></li>
|
||||
|
||||
@@ -87,9 +84,6 @@
|
||||
|
||||
<ul>
|
||||
|
||||
<li><a href="#error-displaying-cvs-files">Why can I navigate only those CVS
|
||||
directories that have no files in them?</a></li>
|
||||
|
||||
<li><a href="#rlog-output-ended-early">What causes "Error: Rlog output ended
|
||||
early. Expected RCS file "/opt/cvs/project/file,v""?</a></li>
|
||||
|
||||
@@ -153,40 +147,25 @@
|
||||
>http://viewvc.tigris.org/source/browse/*checkout*/viewvc/trunk/docs/upgrading-howto.html</a>.</p>
|
||||
</div>
|
||||
|
||||
<div id="vhost-root">
|
||||
<p class="faq-atitle">How can I expose ViewVC at the root of a virtual
|
||||
host on my webserver?</p>
|
||||
|
||||
<p>If you want to dedicate a virtual host on your server just to
|
||||
ViewVC, such the root directory of that host maps to ViewVC's root
|
||||
display, you can do so by placing the following lines inside
|
||||
the <code>VirtualHost</code>Apache configuration:</p>
|
||||
|
||||
<blockquote><pre>Alias /docroot /usr/local/viewvc/templates/docroot
|
||||
ScriptAlias / /usr/local/viewvc/bin/cgi/viewvc.cgi/</pre></blockquote>
|
||||
|
||||
<p>The trick appears to be the presence of the trailing slash
|
||||
character on the <code>ScriptAlias</code> directive.</p>
|
||||
|
||||
</div>
|
||||
|
||||
<div id="authz-support">
|
||||
<p class="faq-atitle">Does ViewVC support path-based authorization,
|
||||
such as Subversion's authz-file mechanism?</p>
|
||||
|
||||
<p>This feature is available in ViewVC 1.1.0, which you can get from
|
||||
our <a href="http://viewvc.org/download.html" >Download</a>
|
||||
page.</p>
|
||||
<p>There are no released versions of ViewVC which have this support
|
||||
built-in. The feature request is being tracking in <a
|
||||
href="http://viewvc.tigris.org/issues/show_bug.cgi?id=268">issue
|
||||
#268</a>, and we're working to complete it for release in ViewVC
|
||||
1.1.</p>
|
||||
|
||||
<p>If you prefer to use only final releases, there are some available
|
||||
workarounds. For example, if you are running ViewVC under Apache,
|
||||
you can use regular Apache configuration directives to
|
||||
authz-protect areas of your repository — see
|
||||
the <a href="http://httpd.apache.org/docs/2.2/mod/core.html#location"
|
||||
>Location</a>
|
||||
and <a href="http://httpd.apache.org/docs/2.2/mod/core.html#locationmatch"
|
||||
>LocationMatch</a> directives, as well as
|
||||
the <a href="http://httpd.apache.org/docs/2.2/howto/auth.html"
|
||||
<p>In the meantime, there are some available workarounds. For
|
||||
example, if you are running ViewVC under Apache, you can use
|
||||
regular Apache configuration directives to authz-protect areas of
|
||||
your repository — see the <a
|
||||
href="http://httpd.apache.org/docs/2.2/mod/core.html#location"
|
||||
>Location</a> and <a
|
||||
href="http://httpd.apache.org/docs/2.2/mod/core.html#locationmatch"
|
||||
>LocationMatch</a> directives, as well as the <a
|
||||
href="http://httpd.apache.org/docs/2.2/howto/auth.html"
|
||||
>Authentication, Authorization and Access Control</a> portions of
|
||||
the Apache HTTP Server documentation. This works best when ViewVC
|
||||
is only serving up a single repository, or when the
|
||||
@@ -244,34 +223,20 @@ ScriptAlias / /usr/local/viewvc/bin/cgi/viewvc.cgi/</pre></blockquote>
|
||||
<h3 class="faq-section" id="faq-a-cvs">CVS Browsing</h3>
|
||||
<!-- #- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -# -->
|
||||
|
||||
<div id="error-displaying-cvs-files">
|
||||
|
||||
<p class="faq-atitle">Why can I navigate only those CVS directories
|
||||
that have no files in them?</p>
|
||||
|
||||
<p>ViewVC can generally display CVS directories without the use of any
|
||||
external tools. But unless configured to use the incomplete,
|
||||
experimental rcsparse module (via the <code>use_rcsparse</code>
|
||||
configuration option), it relies on either the RCS toolchain or the
|
||||
CVSNT tool (on Windows) to get information about versioned files.
|
||||
If the system is missing both of these, you'll need to remedy that.
|
||||
If ViewVC simply cannot find the installed tools, ensure that they
|
||||
are available in the system <code>$PATH</code>, or specify their
|
||||
location in the <code>viewvc.conf</code> file using
|
||||
the <code>utilities/rcs_dir</code> or <code>utilities/cvsnt</code>
|
||||
options. (Note that prior to ViewVC 1.1.0, these options were found
|
||||
at <code>general/rcs_path</code>
|
||||
and <code>general/cvsnt_exe_path</code>.)</p>
|
||||
|
||||
</div>
|
||||
|
||||
<div id="rlog-output-ended-early">
|
||||
|
||||
<p class="faq-atitle">What causes "Error: Rlog output ended
|
||||
early. Expected RCS file "/opt/cvs/project/file,v""?</p>
|
||||
|
||||
<p>This is another symptom of the basic problem described <a
|
||||
href="#error-displaying-cvs-files">here</a>.</p>
|
||||
<p>This error generally occurs when ViewVC is unable to locate the
|
||||
rlog tool, one of several in the RCS toolchain. If the system
|
||||
doesn't have the RCS toolchain installed, you'll need to install
|
||||
it. If the RCS toolchain is installed, but ViewVC simply can't
|
||||
locate the RCS programs, either ensure that the programs are
|
||||
in the system <code>$PATH</code>, or specify their location in
|
||||
the <code>viewvc.conf</code> file — the option is
|
||||
<code>utilities/rcs_dir</code> as of ViewVC 1.1,
|
||||
<code>general/rcs_path</code> in earlier versions.</p>
|
||||
|
||||
</div>
|
||||
|
||||
@@ -281,7 +246,7 @@ ScriptAlias / /usr/local/viewvc/bin/cgi/viewvc.cgi/</pre></blockquote>
|
||||
find filename in co output stream"?</p>
|
||||
|
||||
<p>This is another symptom of the basic problem described <a
|
||||
href="#error-displaying-cvs-files">here</a>.</p>
|
||||
href="#rlog-output-ended-early">here</a>.</p>
|
||||
|
||||
</div>
|
||||
|
||||
|
@@ -36,6 +36,7 @@
|
||||
<ul id="bookmarks">
|
||||
<li><a href="#sec-what-is-viewvc">What Is ViewVC?</a></li>
|
||||
<li><a href="#sec-requirements">Requirements</a></li>
|
||||
<li><a href="#sec-future">Future Plans</a></li>
|
||||
</ul>
|
||||
|
||||
<p><a href="http://validator.w3.org/check?uri=referer"><img
|
||||
@@ -65,14 +66,7 @@
|
||||
|
||||
<ul>
|
||||
|
||||
<li>Support for filesystem-accessible CVS and Subversion
|
||||
repositories.</li>
|
||||
|
||||
<li>Support for path-based authorization, including parsing and
|
||||
honoring Subversion authz configuration files.</li>
|
||||
|
||||
<li>RSS feed generation for tracking changes to repositories or
|
||||
individual items within repositories.</li>
|
||||
<li>Support for filesystem-accessible CVS and Subversion repositories.</li>
|
||||
|
||||
<li>Individually configurable virtual host support.</li>
|
||||
|
||||
@@ -94,8 +88,7 @@
|
||||
<li>Tarball generation (by tag/branch for CVS, by revision for
|
||||
Subversion).</li>
|
||||
|
||||
<li>Localization support based on the Accept-Language request
|
||||
header.</li>
|
||||
<li>I18N support based on the Accept-Language request header.</li>
|
||||
|
||||
<li>Ability to run either as CGI script or as a standalone
|
||||
server.</li>
|
||||
@@ -125,21 +118,6 @@
|
||||
href="http://www.python.org/">Python 1.5.2</a> or later. All other
|
||||
requirements depend on what you want to do with the tool.</p>
|
||||
|
||||
<p>For use with Subversion repositories, you need these things:</p>
|
||||
|
||||
<ul>
|
||||
|
||||
<li><a href="http://subversion.tigris.org/">Subversion</a> 1.2 or
|
||||
later and its SWIG Python bindings.</li>
|
||||
|
||||
<li><a href="http://www.gnu.org/software/diffutils/diffutils.html">GNU
|
||||
diff</a></li>
|
||||
|
||||
<li>Physical access to a Subversion repository (though there is
|
||||
limited, use-at-your-risk support for remote access, too).</li>
|
||||
|
||||
</ul>
|
||||
|
||||
<p>If you plan to use ViewVC with CVS repositories, you need the
|
||||
following things:</p>
|
||||
|
||||
@@ -155,25 +133,65 @@
|
||||
|
||||
</ul>
|
||||
|
||||
<p>For use with Subversion repositories, you need these things:</p>
|
||||
|
||||
<ul>
|
||||
|
||||
<li><a href="http://subversion.tigris.org/">Subversion</a> 1.2 or
|
||||
later and its SWIG Python bindings.</li>
|
||||
|
||||
<li><a href="http://www.gnu.org/software/diffutils/diffutils.html">GNU
|
||||
diff</a></li>
|
||||
|
||||
<li>Physical access to a Subversion repository (though there is
|
||||
limited, use-at-your-risk support for remote access, too).</li>
|
||||
|
||||
</ul>
|
||||
|
||||
<p>ViewVC integrates with additional pieces of software to provide
|
||||
certain bits of optional functionality:</p>
|
||||
|
||||
<ul>
|
||||
|
||||
<li><a href="http://httpd.apache.org/">Apache HTTP Server</a>, or
|
||||
another server capable of running CGI programs — unless
|
||||
you just want ViewVC to run in standalone server mode.</li>
|
||||
|
||||
<li><a href="http://www.mysql.com/">MySQL</a> — Needed to use
|
||||
the commit database query functionality.</li>
|
||||
|
||||
<li><a href="http://pygments.org/">Pygments</a> — Needed for
|
||||
syntax highlighting in versioned file contents
|
||||
displays.</li>
|
||||
<li><a href="http://www.codento.com/people/mtr/genscript/">GNU
|
||||
enscript</a> — Needed for syntax highlighting in versioned
|
||||
file contents displays</li>
|
||||
|
||||
<li><a href="http://www.akhphd.au.dk/~bertho/cvsgraph/">CvsGraph</a>
|
||||
— Needed for version graph displays.</li>
|
||||
|
||||
<li><a href="http://httpd.apache.org/">Apache HTTP Server</a>, or
|
||||
another server capable of running CGI programs — unless
|
||||
you just want ViewVC to run in standalone server mode.</li>
|
||||
|
||||
</ul>
|
||||
|
||||
</div> <!-- section-body -->
|
||||
</div> <!-- section -->
|
||||
|
||||
<div class="section">
|
||||
|
||||
<h2 id="sec-future">Future Plans</h2>
|
||||
|
||||
<div class="section-body">
|
||||
|
||||
<p>ViewVC is an Open Source project. So any future development
|
||||
depends on the <a href="./contributing.html">contributions</a> that
|
||||
will be made by its user community. Certainly working patches have
|
||||
a greater chance to become realized quickly than feature requests,
|
||||
but please don't hesitate to submit your suggestions to our <a
|
||||
href="http://viewvc.tigris.org/servlets/ProjectIssues">issue
|
||||
tracker</a>.</p>
|
||||
|
||||
<p>Some things we're thinking about include:</p>
|
||||
|
||||
<ul>
|
||||
<li>UI streamlining/simplification.</li>
|
||||
<li>Integration with CVS and Subversion commit mail scripts.</li>
|
||||
<li>Integration with an indexer such as LXR.</li>
|
||||
</ul>
|
||||
|
||||
</div> <!-- section-body -->
|
||||
|
@@ -46,7 +46,7 @@ def make_release(branch, export_dir, publish_dir, root_url, username, password):
|
||||
curdir = os.getcwd()
|
||||
try:
|
||||
os.chdir(os.path.join(export_dir, 'tools'))
|
||||
os.system('./make-release %s %s' % (distname, branch))
|
||||
os.system('./make-release %s' % (distname))
|
||||
finally:
|
||||
os.chdir(curdir)
|
||||
|
||||
|
@@ -8,7 +8,6 @@
|
||||
#longdescription { border: none; }
|
||||
#longdescription h2 { display: none; }
|
||||
#customcontent h2 { display: block; }
|
||||
.h2 { margin-bottom: 2em; }
|
||||
</style>
|
||||
<!-- End custom stylations -->
|
||||
</head>
|
||||
@@ -19,27 +18,10 @@
|
||||
|
||||
<h1>ViewVC — Web-based Version Control Repository Browsing</h1>
|
||||
|
||||
<div class="h2"
|
||||
style="border-style: solid;
|
||||
border-width: 1px 2px 2px 1px;
|
||||
border-color: black;
|
||||
background: #eed;
|
||||
padding: 0.5em;">
|
||||
<div class="h2">
|
||||
<h2>Latest Release</h2>
|
||||
|
||||
<h2>Latest Release(s)</h2>
|
||||
|
||||
<p>The most recent stable release of ViewVC is: <strong>1.1.2</strong></p>
|
||||
|
||||
<ul>
|
||||
<li><a href="http://www.viewvc.org/download.html"
|
||||
>Download or checkout</a> this release</li>
|
||||
<li>See the
|
||||
<a href="http://viewvc.tigris.org/source/browse/*checkout*/viewvc/tags/1.1.2/CHANGES"
|
||||
>CHANGES</a> in this release.</li>
|
||||
<li>Read the
|
||||
<a href="http://viewvc.tigris.org/source/browse/*checkout*/viewvc/trunk/docs/release-notes/1.1.0.html"
|
||||
>release notes</a> for this version line.</li>
|
||||
</ul>
|
||||
<p>The most recent release of ViewVC is: <strong>1.0.7</strong></p>
|
||||
|
||||
</div>
|
||||
|
||||
@@ -63,16 +45,15 @@
|
||||
<li>Line-based annotation/blame display</li>
|
||||
<li>Revision graph capabilities (<em>CVS only</em>)</li>
|
||||
<li>Syntax highlighting support</li>
|
||||
<li>Path-based authorization</li>
|
||||
<li>Commit metadata query facilities</li>
|
||||
<li>Template-driven output generation</li>
|
||||
<li>Colorized, side-by-side differences</li>
|
||||
<li>Tarball generation (by tag for CVS, by revision for Subversion)</li>
|
||||
<li>Ability to run as CGI script, under mod_python, or as a
|
||||
standalone server application</li>
|
||||
<li>Regexp-based file searching</li>
|
||||
<li>INI-like configuration file (no code tweaking required)</li>
|
||||
<li>Localization support based on the Accept-Language request header</li>
|
||||
<li>Ability to run either as CGI script or as a standalone server</li>
|
||||
<li>Regexp-based file searching</li>
|
||||
<li>INI-like configuration file (as opposed to requiring actual code
|
||||
tweaks)</li>
|
||||
</ul>
|
||||
|
||||
<p>For a complete list of changes present in each release, see
|
||||
@@ -85,28 +66,20 @@
|
||||
<div class="h2">
|
||||
<h2>Wanna Talk About ViewVC?</h2>
|
||||
|
||||
<table border="0" cellpadding="10" cellspacing="10" style="margin: 0 5%;">
|
||||
<thead>
|
||||
<tr style="vertical-align: top;">
|
||||
<th style="width: 50%;">User/Admin Discussion</th>
|
||||
<th style="width: 50%;">Developer Discussion</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr style="vertical-align: top;">
|
||||
<td>If you have questions about ViewVC — how to configure it, if
|
||||
some behavior you are seeing is expected or not, and so on —
|
||||
send email to <a href="mailto:users@viewvc.tigris.org"
|
||||
>users@viewvc.tigris.org</a> or use your favorite IRC client to
|
||||
pop into <tt><a href="irc://irc.freenode.net/viewvc"
|
||||
>#viewvc</a></tt> on irc.freenode.net.</td>
|
||||
<td>If you'd like to discuss the actual development of ViewVC itself,
|
||||
or submit a patch to ViewVC's sources, you can do so on our
|
||||
development list, <a href="mailto:dev@viewvc.tigris.org"
|
||||
>dev@viewvc.tigris.org</a>.</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<p>If you have questions about ViewVC — how to configure it, if
|
||||
some behavior you are seeing is expected or not, and so on —
|
||||
send email to our users list: <a
|
||||
href="mailto:users@viewvc.tigris.org"
|
||||
>users@viewvc.tigris.org</a>.</p>
|
||||
|
||||
<p>If you'd like to discuss the actual development of ViewVC itself,
|
||||
or submit a patch to ViewVC's sources, you can do so on our
|
||||
development list: <a href="mailto:dev@viewvc.tigris.org"
|
||||
>dev@viewvc.tigris.org</a>.</p>
|
||||
|
||||
<p>Finally, if you prefer realtime chatter, use your favorite IRC
|
||||
client to pop into <tt><a href="irc://irc.freenode.net/viewvc"
|
||||
>#viewvc</a></tt> on irc.freenode.net.</p>
|
||||
|
||||
</div>
|
||||
|
||||
|
@@ -13,14 +13,12 @@
|
||||
|
||||
<li><a href="http://viewvc.tigris.org/servlets/ProjectNewsList"
|
||||
>Announcements</a></li>
|
||||
<li><a href="http://viewvc.tigris.org/ds/viewForums.do"
|
||||
>Discussions</a></li>
|
||||
<li><a href="http://viewvc.tigris.org/servlets/ProjectMailingListList"
|
||||
>Mailing lists</a></li>
|
||||
<li><a href="http://viewvc.tigris.org/source/browse/viewvc/"
|
||||
>Source Code</a></li>
|
||||
>Subversion</a></li>
|
||||
<li><a href="http://viewvc.tigris.org/issues/buglist.cgi?component=viewvc&issue_status=UNCONFIRMED&issue_status=NEW&issue_status=STARTED&issue_status=REOPENED"
|
||||
>Issue tracker</a></li>
|
||||
<li><a href="http://viewvc.tigris.org/servlets/ProjectDocumentList?folderID=6004"
|
||||
>Downloads</a></li>
|
||||
|
||||
</ul></dd>
|
||||
<!-- .................................................................. -->
|
||||
|
Reference in New Issue
Block a user