mirror of
https://github.com/vitalif/viewvc-4intranet
synced 2019-04-16 04:14:59 +03:00
Compare commits
4 Commits
orig-r2243
...
1.1.0-beta
Author | SHA1 | Date | |
---|---|---|---|
![]() |
fab88fb6c3 | ||
![]() |
cc1cf127a3 | ||
![]() |
c3ba043654 | ||
![]() |
fe81ee5969 |
46
CHANGES
46
CHANGES
@@ -1,25 +1,4 @@
|
|||||||
Version 1.2.0 (released ??-???-????)
|
Version 1.1.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)
|
* add support for full content diffs (issue #153)
|
||||||
* make many more data dictionary items available to all views
|
* make many more data dictionary items available to all views
|
||||||
@@ -33,7 +12,9 @@ Version 1.1.0 (released 13-May-2009)
|
|||||||
* add support for query by log message (issues #22, #121)
|
* add support for query by log message (issues #22, #121)
|
||||||
* fix bug parsing 'svn blame' output with too-long author names (issue #221)
|
* fix bug parsing 'svn blame' output with too-long author names (issue #221)
|
||||||
* fix default standalone.py port to be within private IANA range (issue #234)
|
* fix default standalone.py port to be within private IANA range (issue #234)
|
||||||
* add unified configury of allowed views; checkout view disabled by default
|
* add support for integration with GNU source-highlight (issue #285)
|
||||||
|
* add unified configury of allowed views
|
||||||
|
* add support for disabling the checkout view (now the default state)
|
||||||
* add support for ranges of revisions to svndbadmin (issue #224)
|
* add support for ranges of revisions to svndbadmin (issue #224)
|
||||||
* make the query handling more forgiving of malformatted subdirs (issue #244)
|
* make the query handling more forgiving of malformatted subdirs (issue #244)
|
||||||
* add support for per-root configuration overrides (issue #371)
|
* add support for per-root configuration overrides (issue #371)
|
||||||
@@ -55,24 +36,7 @@ Version 1.1.0 (released 13-May-2009)
|
|||||||
* show RSS/query links only for roots found in commits database (issue #357)
|
* show RSS/query links only for roots found in commits database (issue #357)
|
||||||
* recognize Subversion svn:mime-type property values (issue #364)
|
* recognize Subversion svn:mime-type property values (issue #364)
|
||||||
* hide CVS files when viewing tags/branches on which they don't exist
|
* hide CVS files when viewing tags/branches on which they don't exist
|
||||||
* allow hiding of errorful entries from the directory view (issue #105)
|
* add support for hiding errorful entries from the directory view (issue #105)
|
||||||
* fix directory view sorting UI
|
|
||||||
* tolerate malformed Accept-Language headers (issue #396)
|
|
||||||
* allow MIME type mapping overrides in ViewVC configuration (issue #401)
|
|
||||||
* 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
|
|
||||||
* tolerate malformed Accept-Language headers (issue #396)
|
|
||||||
* fix directory log views in revision-less Subversion repositories
|
|
||||||
* fix exception in rev-sorted remote Subversion directory views (issue #409)
|
|
||||||
|
|
||||||
Version 1.0.7 (released 14-Oct-2008)
|
Version 1.0.7 (released 14-Oct-2008)
|
||||||
|
|
||||||
|
2
INSTALL
2
INSTALL
@@ -139,7 +139,7 @@ installation instructions.
|
|||||||
default_root
|
default_root
|
||||||
root_as_url_component
|
root_as_url_component
|
||||||
rcs_dir
|
rcs_dir
|
||||||
mime_types_files
|
mime_types_file
|
||||||
|
|
||||||
There are some other options that are usually nice to change. See
|
There are some other options that are usually nice to change. See
|
||||||
viewvc.conf for more information. ViewVC provides a working,
|
viewvc.conf for more information. ViewVC provides a working,
|
||||||
|
@@ -15,7 +15,7 @@
|
|||||||
|
|
||||||
<blockquote>
|
<blockquote>
|
||||||
|
|
||||||
<p><strong>Copyright © 1999-2009 The ViewCVS Group. All rights
|
<p><strong>Copyright © 1999-2008 The ViewCVS Group. All rights
|
||||||
reserved.</strong></p>
|
reserved.</strong></p>
|
||||||
|
|
||||||
<p>By using ViewVC, you agree to the terms and conditions set forth
|
<p>By using ViewVC, you agree to the terms and conditions set forth
|
||||||
@@ -59,7 +59,6 @@
|
|||||||
<li>March 17, 2006 — software renamed from "ViewCVS"</li>
|
<li>March 17, 2006 — software renamed from "ViewCVS"</li>
|
||||||
<li>April 10, 2007 — copyright years updated</li>
|
<li>April 10, 2007 — copyright years updated</li>
|
||||||
<li>February 22, 2008 — copyright years updated</li>
|
<li>February 22, 2008 — copyright years updated</li>
|
||||||
<li>March 18, 2009 — copyright years updated</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
|
@@ -177,12 +177,7 @@ if __name__ == '__main__':
|
|||||||
if command in ('rebuild', 'purge'):
|
if command in ('rebuild', 'purge'):
|
||||||
if quiet_level < 2:
|
if quiet_level < 2:
|
||||||
print "Purging existing data for repository root `%s'" % root
|
print "Purging existing data for repository root `%s'" % root
|
||||||
try:
|
db.PurgeRepository(root)
|
||||||
db.PurgeRepository(root)
|
|
||||||
except cvsdb.UnknownRepositoryError, e:
|
|
||||||
if command == 'purge':
|
|
||||||
sys.stderr.write("ERROR: " + str(e) + "\n")
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
if command in ('rebuild', 'update'):
|
if command in ('rebuild', 'update'):
|
||||||
repository = vclib.ccvs.CVSRepository(None, rootpath, None,
|
repository = vclib.ccvs.CVSRepository(None, rootpath, None,
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
# -*-python-*-
|
# -*-python-*-
|
||||||
#
|
#
|
||||||
# Copyright (C) 1999-2009 The ViewCVS Group. All Rights Reserved.
|
# Copyright (C) 1999-2007 The ViewCVS Group. All Rights Reserved.
|
||||||
#
|
#
|
||||||
# By using this file, you agree to the terms and conditions set forth in
|
# By using this file, you agree to the terms and conditions set forth in
|
||||||
# the LICENSE.html file which can be found at the top level of the ViewVC
|
# the LICENSE.html file which can be found at the top level of the ViewVC
|
||||||
@@ -18,22 +18,22 @@
|
|||||||
|
|
||||||
import os, sys, string
|
import os, sys, string
|
||||||
import popen2
|
import popen2
|
||||||
import getopt
|
|
||||||
|
|
||||||
## ------------------------------------------------------------------------
|
INTRO_TEXT = """\
|
||||||
## Stuff common to all schemas
|
This script creates the database and tables in MySQL used by the
|
||||||
##
|
ViewVC checkin database. You will be prompted for: database server
|
||||||
DATABASE_SCRIPT_COMMON="""\
|
hostname, database user, database user password, and database name.
|
||||||
|
This script will use the 'mysql' program to create the database for
|
||||||
|
you. You will then need to set the appropriate parameters in the
|
||||||
|
[cvsdb] section of your viewvc.conf file.
|
||||||
|
"""
|
||||||
|
|
||||||
|
DATABASE_SCRIPT="""\
|
||||||
DROP DATABASE IF EXISTS <dbname>;
|
DROP DATABASE IF EXISTS <dbname>;
|
||||||
CREATE DATABASE <dbname>;
|
CREATE DATABASE <dbname>;
|
||||||
|
|
||||||
USE <dbname>;
|
USE <dbname>;
|
||||||
"""
|
|
||||||
|
|
||||||
## ------------------------------------------------------------------------
|
|
||||||
## Version 0: The original, Bonsai-compatible schema.
|
|
||||||
##
|
|
||||||
DATABASE_SCRIPT_VERSION_0="""\
|
|
||||||
DROP TABLE IF EXISTS branches;
|
DROP TABLE IF EXISTS branches;
|
||||||
CREATE TABLE branches (
|
CREATE TABLE branches (
|
||||||
id mediumint(9) NOT NULL auto_increment,
|
id mediumint(9) NOT NULL auto_increment,
|
||||||
@@ -121,213 +121,28 @@ CREATE TABLE tags (
|
|||||||
) TYPE=MyISAM;
|
) TYPE=MyISAM;
|
||||||
"""
|
"""
|
||||||
|
|
||||||
## ------------------------------------------------------------------------
|
|
||||||
## Version 1: Adds the 'metadata' table. Adds 'descid' index to
|
|
||||||
## 'checkins' table, and renames that table to 'commits'.
|
|
||||||
##
|
|
||||||
DATABASE_SCRIPT_VERSION_1="""\
|
|
||||||
DROP TABLE IF EXISTS branches;
|
|
||||||
CREATE TABLE branches (
|
|
||||||
id mediumint(9) NOT NULL auto_increment,
|
|
||||||
branch varchar(64) binary DEFAULT '' NOT NULL,
|
|
||||||
PRIMARY KEY (id),
|
|
||||||
UNIQUE branch (branch)
|
|
||||||
) TYPE=MyISAM;
|
|
||||||
|
|
||||||
DROP TABLE IF EXISTS commits;
|
|
||||||
CREATE TABLE commits (
|
|
||||||
type enum('Change','Add','Remove'),
|
|
||||||
ci_when datetime DEFAULT '0000-00-00 00:00:00' NOT NULL,
|
|
||||||
whoid mediumint(9) DEFAULT '0' NOT NULL,
|
|
||||||
repositoryid mediumint(9) DEFAULT '0' NOT NULL,
|
|
||||||
dirid mediumint(9) DEFAULT '0' NOT NULL,
|
|
||||||
fileid mediumint(9) DEFAULT '0' NOT NULL,
|
|
||||||
revision varchar(32) binary DEFAULT '' NOT NULL,
|
|
||||||
stickytag varchar(255) binary DEFAULT '' NOT NULL,
|
|
||||||
branchid mediumint(9) DEFAULT '0' NOT NULL,
|
|
||||||
addedlines int(11) DEFAULT '0' NOT NULL,
|
|
||||||
removedlines int(11) DEFAULT '0' NOT NULL,
|
|
||||||
descid mediumint(9),
|
|
||||||
UNIQUE repositoryid (repositoryid,dirid,fileid,revision),
|
|
||||||
KEY ci_when (ci_when),
|
|
||||||
KEY whoid (whoid),
|
|
||||||
KEY repositoryid_2 (repositoryid),
|
|
||||||
KEY dirid (dirid),
|
|
||||||
KEY fileid (fileid),
|
|
||||||
KEY branchid (branchid),
|
|
||||||
KEY descid (descid)
|
|
||||||
) TYPE=MyISAM;
|
|
||||||
|
|
||||||
DROP TABLE IF EXISTS descs;
|
|
||||||
CREATE TABLE descs (
|
|
||||||
id mediumint(9) NOT NULL auto_increment,
|
|
||||||
description text,
|
|
||||||
hash bigint(20) DEFAULT '0' NOT NULL,
|
|
||||||
PRIMARY KEY (id),
|
|
||||||
KEY hash (hash)
|
|
||||||
) TYPE=MyISAM;
|
|
||||||
|
|
||||||
DROP TABLE IF EXISTS dirs;
|
|
||||||
CREATE TABLE dirs (
|
|
||||||
id mediumint(9) NOT NULL auto_increment,
|
|
||||||
dir varchar(255) binary DEFAULT '' NOT NULL,
|
|
||||||
PRIMARY KEY (id),
|
|
||||||
UNIQUE dir (dir)
|
|
||||||
) TYPE=MyISAM;
|
|
||||||
|
|
||||||
DROP TABLE IF EXISTS files;
|
|
||||||
CREATE TABLE files (
|
|
||||||
id mediumint(9) NOT NULL auto_increment,
|
|
||||||
file varchar(255) binary DEFAULT '' NOT NULL,
|
|
||||||
PRIMARY KEY (id),
|
|
||||||
UNIQUE file (file)
|
|
||||||
) TYPE=MyISAM;
|
|
||||||
|
|
||||||
DROP TABLE IF EXISTS people;
|
|
||||||
CREATE TABLE people (
|
|
||||||
id mediumint(9) NOT NULL auto_increment,
|
|
||||||
who varchar(128) binary DEFAULT '' NOT NULL,
|
|
||||||
PRIMARY KEY (id),
|
|
||||||
UNIQUE who (who)
|
|
||||||
) TYPE=MyISAM;
|
|
||||||
|
|
||||||
DROP TABLE IF EXISTS repositories;
|
|
||||||
CREATE TABLE repositories (
|
|
||||||
id mediumint(9) NOT NULL auto_increment,
|
|
||||||
repository varchar(64) binary DEFAULT '' NOT NULL,
|
|
||||||
PRIMARY KEY (id),
|
|
||||||
UNIQUE repository (repository)
|
|
||||||
) TYPE=MyISAM;
|
|
||||||
|
|
||||||
DROP TABLE IF EXISTS tags;
|
|
||||||
CREATE TABLE tags (
|
|
||||||
repositoryid mediumint(9) DEFAULT '0' NOT NULL,
|
|
||||||
branchid mediumint(9) DEFAULT '0' NOT NULL,
|
|
||||||
dirid mediumint(9) DEFAULT '0' NOT NULL,
|
|
||||||
fileid mediumint(9) DEFAULT '0' NOT NULL,
|
|
||||||
revision varchar(32) binary DEFAULT '' NOT NULL,
|
|
||||||
UNIQUE repositoryid (repositoryid,dirid,fileid,branchid,revision),
|
|
||||||
KEY repositoryid_2 (repositoryid),
|
|
||||||
KEY dirid (dirid),
|
|
||||||
KEY fileid (fileid),
|
|
||||||
KEY branchid (branchid)
|
|
||||||
) TYPE=MyISAM;
|
|
||||||
|
|
||||||
DROP TABLE IF EXISTS metadata;
|
|
||||||
CREATE TABLE metadata (
|
|
||||||
name varchar(255) binary DEFAULT '' NOT NULL,
|
|
||||||
value text,
|
|
||||||
PRIMARY KEY (name),
|
|
||||||
UNIQUE name (name)
|
|
||||||
) TYPE=MyISAM;
|
|
||||||
INSERT INTO metadata (name, value) VALUES ('version', '1');
|
|
||||||
"""
|
|
||||||
|
|
||||||
BONSAI_COMPAT="""
|
|
||||||
WARNING: Creating Bonsai-compatible legacy database version. Some ViewVC
|
|
||||||
features may not be available, or may not perform especially well.
|
|
||||||
|
|
||||||
"""
|
|
||||||
|
|
||||||
## ------------------------------------------------------------------------
|
|
||||||
|
|
||||||
def usage_and_exit(errmsg=None):
|
|
||||||
stream = errmsg is None and sys.stdout or sys.stderr
|
|
||||||
stream.write("""\
|
|
||||||
Usage: %s [OPTIONS]
|
|
||||||
|
|
||||||
This script creates the database and tables in MySQL used by the
|
|
||||||
ViewVC checkin database. In order to operate correctly, it needs to
|
|
||||||
know the following: your database server hostname, database user,
|
|
||||||
database user password, and database name. (You will be prompted for
|
|
||||||
any of this information that you do not provide via command-line
|
|
||||||
options.) This script will use the 'mysql' program to create the
|
|
||||||
database for you. You will then need to set the appropriate
|
|
||||||
parameters in the [cvsdb] section of your viewvc.conf file.
|
|
||||||
|
|
||||||
Options:
|
|
||||||
|
|
||||||
--dbname=ARG Use ARG as the ViewVC database name to create.
|
|
||||||
[Default: ViewVC]
|
|
||||||
|
|
||||||
--help Show this usage message.
|
|
||||||
|
|
||||||
--hostname=ARG Use ARG as the hostname for the MySQL connection.
|
|
||||||
[Default: localhost]
|
|
||||||
|
|
||||||
--password=ARG Use ARG as the password for the MySQL connection.
|
|
||||||
|
|
||||||
--username=ARG Use ARG as the username for the MySQL connection.
|
|
||||||
|
|
||||||
--version=ARG Create the database using the schema employed by
|
|
||||||
version ARG of ViewVC. Valid values are:
|
|
||||||
[ "1.0" ]
|
|
||||||
|
|
||||||
""" % (os.path.basename(sys.argv[0])))
|
|
||||||
if errmsg is not None:
|
|
||||||
stream.write("[ERROR] %s.\n" % (errmsg))
|
|
||||||
sys.exit(1)
|
|
||||||
sys.exit(0)
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
try:
|
try:
|
||||||
# Parse the command-line options, if any.
|
print INTRO_TEXT
|
||||||
dbname = version = hostname = username = password = None
|
|
||||||
opts, args = getopt.getopt(sys.argv[1:], '', [ 'dbname=',
|
|
||||||
'help',
|
|
||||||
'hostname=',
|
|
||||||
'password=',
|
|
||||||
'username=',
|
|
||||||
'version=',
|
|
||||||
])
|
|
||||||
if len(args) > 0:
|
|
||||||
usage_and_exit("Unexpected command-line parameters")
|
|
||||||
for name, value in opts:
|
|
||||||
if name == '--help':
|
|
||||||
usage_and_exit(0)
|
|
||||||
elif name == '--dbname':
|
|
||||||
dbname = value
|
|
||||||
elif name == '--hostname':
|
|
||||||
hostname = value
|
|
||||||
elif name == '--username':
|
|
||||||
username = value
|
|
||||||
elif name == '--password':
|
|
||||||
password = value
|
|
||||||
elif name == '--version':
|
|
||||||
if value in ["1.0"]:
|
|
||||||
version = value
|
|
||||||
else:
|
|
||||||
usage_and_exit("Invalid version specified")
|
|
||||||
|
|
||||||
# Prompt for information not provided via command-line options.
|
# Prompt for necessary information
|
||||||
if hostname is None:
|
host = raw_input("MySQL Hostname [default: localhost]: ") or ""
|
||||||
hostname = raw_input("MySQL Hostname [default: localhost]: ") or ""
|
user = raw_input("MySQL User: ")
|
||||||
if username is None:
|
passwd = raw_input("MySQL Password: ")
|
||||||
username = raw_input("MySQL User: ")
|
dbase = raw_input("ViewVC Database Name [default: ViewVC]: ") or "ViewVC"
|
||||||
if password is None:
|
|
||||||
password = raw_input("MySQL Password: ")
|
|
||||||
if dbname is None:
|
|
||||||
dbname = raw_input("ViewVC Database Name [default: ViewVC]: ") or "ViewVC"
|
|
||||||
|
|
||||||
# Create the database
|
# Create the database
|
||||||
dscript = string.replace(DATABASE_SCRIPT_COMMON, "<dbname>", dbname)
|
dscript = string.replace(DATABASE_SCRIPT, "<dbname>", dbase)
|
||||||
if version == "1.0":
|
host_option = host and "--host=%s" % (host) or ""
|
||||||
print BONSAI_COMPAT
|
|
||||||
dscript = dscript + DATABASE_SCRIPT_VERSION_0
|
|
||||||
else:
|
|
||||||
dscript = dscript + DATABASE_SCRIPT_VERSION_1
|
|
||||||
|
|
||||||
host_option = hostname and "--host=%s" % (hostname) or ""
|
|
||||||
if sys.platform == "win32":
|
if sys.platform == "win32":
|
||||||
cmd = "mysql --user=%s --password=%s %s "\
|
cmd = "mysql --user=%s --password=%s %s "\
|
||||||
% (username, password, host_option)
|
% (user, passwd, host_option)
|
||||||
mysql = os.popen(cmd, "w") # popen2.Popen3 is not provided on windows
|
mysql = os.popen(cmd, "w") # popen2.Popen3 is not provided on windows
|
||||||
mysql.write(dscript)
|
mysql.write(dscript)
|
||||||
status = mysql.close()
|
status = mysql.close()
|
||||||
else:
|
else:
|
||||||
cmd = "{ mysql --user=%s --password=%s %s ; } 2>&1" \
|
cmd = "{ mysql --user=%s --password=%s %s ; } 2>&1" \
|
||||||
% (username, password, host_option)
|
% (user, passwd, host_option)
|
||||||
pipes = popen2.Popen3(cmd)
|
pipes = popen2.Popen3(cmd)
|
||||||
pipes.tochild.write(dscript)
|
pipes.tochild.write(dscript)
|
||||||
pipes.tochild.close()
|
pipes.tochild.close()
|
||||||
@@ -335,11 +150,10 @@ if __name__ == "__main__":
|
|||||||
status = pipes.wait()
|
status = pipes.wait()
|
||||||
|
|
||||||
if status:
|
if status:
|
||||||
print "[ERROR] The database did not create sucessfully."
|
print "[ERROR] the database did not create sucessfully."
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
print "Database created successfully. Don't forget to configure the "
|
print "Database created successfully."
|
||||||
print "[cvsdb] section of your viewvc.conf file."
|
|
||||||
except KeyboardInterrupt:
|
except KeyboardInterrupt:
|
||||||
pass
|
pass
|
||||||
sys.exit(0)
|
sys.exit(0)
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
# -*-python-*-
|
# -*-python-*-
|
||||||
#
|
#
|
||||||
# Copyright (C) 1999-2008 The ViewCVS Group. All Rights Reserved.
|
# Copyright (C) 1999-2006 The ViewCVS Group. All Rights Reserved.
|
||||||
#
|
#
|
||||||
# By using this file, you agree to the terms and conditions set forth in
|
# By using this file, you agree to the terms and conditions set forth in
|
||||||
# the LICENSE.html file which can be found at the top level of the ViewVC
|
# the LICENSE.html file which can be found at the top level of the ViewVC
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
# -*-python-*-
|
# -*-python-*-
|
||||||
#
|
#
|
||||||
# Copyright (C) 1999-2008 The ViewCVS Group. All Rights Reserved.
|
# Copyright (C) 1999-2006 The ViewCVS Group. All Rights Reserved.
|
||||||
#
|
#
|
||||||
# By using this file, you agree to the terms and conditions set forth in
|
# By using this file, you agree to the terms and conditions set forth in
|
||||||
# the LICENSE.html file which can be found at the top level of the ViewVC
|
# the LICENSE.html file which can be found at the top level of the ViewVC
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
# -*-python-*-
|
# -*-python-*-
|
||||||
#
|
#
|
||||||
# Copyright (C) 1999-2009 The ViewCVS Group. All Rights Reserved.
|
# Copyright (C) 1999-2007 The ViewCVS Group. All Rights Reserved.
|
||||||
#
|
#
|
||||||
# By using this file, you agree to the terms and conditions set forth in
|
# By using this file, you agree to the terms and conditions set forth in
|
||||||
# the LICENSE.html file which can be found at the top level of the ViewVC
|
# the LICENSE.html file which can be found at the top level of the ViewVC
|
||||||
@@ -226,16 +226,9 @@ If this doesn't work, please click on the link above.
|
|||||||
save_stdout = sys.stdout
|
save_stdout = sys.stdout
|
||||||
save_stderr = sys.stderr
|
save_stderr = sys.stderr
|
||||||
# For external tools like enscript we also need to redirect
|
# For external tools like enscript we also need to redirect
|
||||||
# the real stdout file descriptor.
|
# the real stdout file descriptor. (On windows, reassigning the
|
||||||
#
|
# sys.stdout variable is sufficient because pipe_cmds makes it
|
||||||
# FIXME: This code used to carry the following comment:
|
# the standard output for child processes.)
|
||||||
#
|
|
||||||
# (On windows, reassigning the sys.stdout variable is sufficient
|
|
||||||
# because pipe_cmds makes it the standard output for child
|
|
||||||
# processes.)
|
|
||||||
#
|
|
||||||
# But we no longer use pipe_cmds. So at the very least, the
|
|
||||||
# comment is stale. Is the code okay, though?
|
|
||||||
if sys.platform != "win32": save_realstdout = os.dup(1)
|
if sys.platform != "win32": save_realstdout = os.dup(1)
|
||||||
try:
|
try:
|
||||||
try:
|
try:
|
||||||
@@ -382,7 +375,7 @@ def gui(host, port):
|
|||||||
|
|
||||||
# Early loading of configuration here. Used to
|
# Early loading of configuration here. Used to
|
||||||
# allow tinkering with configuration settings through the gui:
|
# allow tinkering with configuration settings through the gui:
|
||||||
handle_config(options.config_file)
|
handle_config()
|
||||||
if not LIBRARY_DIR:
|
if not LIBRARY_DIR:
|
||||||
cfg.options.cvsgraph_conf = "../cgi/cvsgraph.conf.dist"
|
cfg.options.cvsgraph_conf = "../cgi/cvsgraph.conf.dist"
|
||||||
|
|
||||||
@@ -396,6 +389,14 @@ def gui(host, port):
|
|||||||
command=self.toggle_use_cvsgraph)
|
command=self.toggle_use_cvsgraph)
|
||||||
self.cvsgraph_toggle.pack(side='top', anchor='w')
|
self.cvsgraph_toggle.pack(side='top', anchor='w')
|
||||||
|
|
||||||
|
# enscript toggle:
|
||||||
|
self.enscript_ivar = Tkinter.IntVar()
|
||||||
|
self.enscript_ivar.set(cfg.options.use_enscript)
|
||||||
|
self.enscript_toggle = Tkinter.Checkbutton(self.options_frm,
|
||||||
|
text="enable enscript (needs binary)", var=self.enscript_ivar,
|
||||||
|
command=self.toggle_use_enscript)
|
||||||
|
self.enscript_toggle.pack(side='top', anchor='w')
|
||||||
|
|
||||||
# show_subdir_lastmod toggle:
|
# show_subdir_lastmod toggle:
|
||||||
self.subdirmod_ivar = Tkinter.IntVar()
|
self.subdirmod_ivar = Tkinter.IntVar()
|
||||||
self.subdirmod_ivar.set(cfg.options.show_subdir_lastmod)
|
self.subdirmod_ivar.set(cfg.options.show_subdir_lastmod)
|
||||||
@@ -421,27 +422,16 @@ def gui(host, port):
|
|||||||
command=self.toggle_use_localtime)
|
command=self.toggle_use_localtime)
|
||||||
self.use_localtime_toggle.pack(side='top', anchor='w')
|
self.use_localtime_toggle.pack(side='top', anchor='w')
|
||||||
|
|
||||||
# log_pagesize integer var:
|
# use_pagesize integer var:
|
||||||
self.log_pagesize_lbl = Tkinter.Label(self.options_frm,
|
self.usepagesize_lbl = Tkinter.Label(self.options_frm,
|
||||||
text='Paging (number of items per log page, 0 disables):')
|
text='Paging (number of items per page, 0 disables):')
|
||||||
self.log_pagesize_lbl.pack(side='top', anchor='w')
|
self.usepagesize_lbl.pack(side='top', anchor='w')
|
||||||
self.log_pagesize_ivar = Tkinter.IntVar()
|
self.use_pagesize_ivar = Tkinter.IntVar()
|
||||||
self.log_pagesize_ivar.set(cfg.options.log_pagesize)
|
self.use_pagesize_ivar.set(cfg.options.use_pagesize)
|
||||||
self.log_pagesize_entry = Tkinter.Entry(self.options_frm,
|
self.use_pagesize_entry = Tkinter.Entry(self.options_frm,
|
||||||
width=10, textvariable=self.log_pagesize_ivar)
|
width=10, textvariable=self.use_pagesize_ivar)
|
||||||
self.log_pagesize_entry.bind('<Return>', self.set_log_pagesize)
|
self.use_pagesize_entry.bind('<Return>', self.set_use_pagesize)
|
||||||
self.log_pagesize_entry.pack(side='top', anchor='w')
|
self.use_pagesize_entry.pack(side='top', anchor='w')
|
||||||
|
|
||||||
# dir_pagesize integer var:
|
|
||||||
self.dir_pagesize_lbl = Tkinter.Label(self.options_frm,
|
|
||||||
text='Paging (number of items per dir page, 0 disables):')
|
|
||||||
self.dir_pagesize_lbl.pack(side='top', anchor='w')
|
|
||||||
self.dir_pagesize_ivar = Tkinter.IntVar()
|
|
||||||
self.dir_pagesize_ivar.set(cfg.options.dir_pagesize)
|
|
||||||
self.dir_pagesize_entry = Tkinter.Entry(self.options_frm,
|
|
||||||
width=10, textvariable=self.dir_pagesize_ivar)
|
|
||||||
self.dir_pagesize_entry.bind('<Return>', self.set_dir_pagesize)
|
|
||||||
self.dir_pagesize_entry.pack(side='top', anchor='w')
|
|
||||||
|
|
||||||
# directory view template:
|
# directory view template:
|
||||||
self.dirtemplate_lbl = Tkinter.Label(self.options_frm,
|
self.dirtemplate_lbl = Tkinter.Label(self.options_frm,
|
||||||
@@ -517,6 +507,9 @@ def gui(host, port):
|
|||||||
def toggle_use_cvsgraph(self, event=None):
|
def toggle_use_cvsgraph(self, event=None):
|
||||||
cfg.options.use_cvsgraph = self.cvsgraph_ivar.get()
|
cfg.options.use_cvsgraph = self.cvsgraph_ivar.get()
|
||||||
|
|
||||||
|
def toggle_use_enscript(self, event=None):
|
||||||
|
cfg.options.use_enscript = self.enscript_ivar.get()
|
||||||
|
|
||||||
def toggle_use_localtime(self, event=None):
|
def toggle_use_localtime(self, event=None):
|
||||||
cfg.options.use_localtime = self.use_localtime_ivar.get()
|
cfg.options.use_localtime = self.use_localtime_ivar.get()
|
||||||
|
|
||||||
@@ -526,11 +519,8 @@ def gui(host, port):
|
|||||||
def toggle_useresearch(self, event=None):
|
def toggle_useresearch(self, event=None):
|
||||||
cfg.options.use_re_search = self.useresearch_ivar.get()
|
cfg.options.use_re_search = self.useresearch_ivar.get()
|
||||||
|
|
||||||
def set_log_pagesize(self, event=None):
|
def set_use_pagesize(self, event=None):
|
||||||
cfg.options.log_pagesize = self.log_pagesize_ivar.get()
|
cfg.options.use_pagesize = self.use_pagesize_ivar.get()
|
||||||
|
|
||||||
def set_dir_pagesize(self, event=None):
|
|
||||||
cfg.options.dir_pagesize = self.dir_pagesize_ivar.get()
|
|
||||||
|
|
||||||
def set_templates_log(self, event=None):
|
def set_templates_log(self, event=None):
|
||||||
cfg.templates.log = self.logtemplate_svar.get()
|
cfg.templates.log = self.logtemplate_svar.get()
|
||||||
@@ -624,7 +614,7 @@ def cli(argv):
|
|||||||
if pid != 0:
|
if pid != 0:
|
||||||
sys.exit()
|
sys.exit()
|
||||||
if options.start_gui:
|
if options.start_gui:
|
||||||
gui(options.host, options.port)
|
gui(options.host, options.port, options.config_file)
|
||||||
return
|
return
|
||||||
elif options.port:
|
elif options.port:
|
||||||
def ready(server):
|
def ready(server):
|
||||||
|
@@ -1,7 +1,6 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
# -*-python-*-
|
# -*-python-*-
|
||||||
#
|
#
|
||||||
# Copyright (C) 2004-2008 The ViewCVS Group. All Rights Reserved.
|
|
||||||
# Copyright (C) 2004-2007 James Henstridge
|
# Copyright (C) 2004-2007 James Henstridge
|
||||||
#
|
#
|
||||||
# By using this file, you agree to the terms and conditions set forth in
|
# By using this file, you agree to the terms and conditions set forth in
|
||||||
@@ -245,12 +244,7 @@ def main(command, repository, revs=[], verbose=0, force=0):
|
|||||||
if command in ('rebuild', 'purge'):
|
if command in ('rebuild', 'purge'):
|
||||||
if verbose:
|
if verbose:
|
||||||
print "Purging commit info for repository root `%s'" % repository
|
print "Purging commit info for repository root `%s'" % repository
|
||||||
try:
|
db.PurgeRepository(repository)
|
||||||
db.PurgeRepository(repository)
|
|
||||||
except cvsdb.UnknownRepositoryError, e:
|
|
||||||
if command == 'purge':
|
|
||||||
sys.stderr.write("ERROR: " + str(e) + "\n")
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
repo = SvnRepo(repository)
|
repo = SvnRepo(repository)
|
||||||
if command == 'rebuild' or (command == 'update' and not revs):
|
if command == 'rebuild' or (command == 'update' and not revs):
|
||||||
|
@@ -1,32 +0,0 @@
|
|||||||
#---------------------------------------------------------------------------
|
|
||||||
#
|
|
||||||
# MIME type mapping file for ViewVC
|
|
||||||
#
|
|
||||||
# Information on ViewVC is located at the following web site:
|
|
||||||
# http://viewvc.org/
|
|
||||||
#
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
|
|
||||||
# THE FORMAT OF THIS FILE
|
|
||||||
#
|
|
||||||
# This file contains records -- one per line -- of the following format:
|
|
||||||
#
|
|
||||||
# MIME_TYPE [EXTENSION [EXTENSION ...]]
|
|
||||||
#
|
|
||||||
# where whitespace separates the MIME_TYPE from the EXTENSION(s),
|
|
||||||
# and the EXTENSIONs from each other.
|
|
||||||
#
|
|
||||||
# For example:
|
|
||||||
#
|
|
||||||
# text/x-csh csh
|
|
||||||
# text/x-csrc c
|
|
||||||
# text/x-diff diff patch
|
|
||||||
# image/png png
|
|
||||||
# image/jpeg jpeg jpg jpe
|
|
||||||
#
|
|
||||||
# By default, this file is left empty, allowing ViewVC to continue
|
|
||||||
# consulting it first without overriding the MIME type mappings
|
|
||||||
# found in more standard mapping files (such as those provided as
|
|
||||||
# part of the operating system or web server software).
|
|
||||||
#
|
|
||||||
#
|
|
@@ -1,957 +0,0 @@
|
|||||||
##---------------------------------------------------------------------------
|
|
||||||
##
|
|
||||||
## Configuration file for ViewVC
|
|
||||||
##
|
|
||||||
## Information on ViewVC is located at the following web site:
|
|
||||||
## http://viewvc.org/
|
|
||||||
##
|
|
||||||
##---------------------------------------------------------------------------
|
|
||||||
|
|
||||||
## THE FORMAT OF THIS CONFIGURATION FILE
|
|
||||||
##
|
|
||||||
## This file is delineated by sections, specified in [brackets]. Within
|
|
||||||
## each section, are a number of configuration settings. These settings
|
|
||||||
## take the form of: name = value. Values may be continued on the
|
|
||||||
## following line by indenting the continued line.
|
|
||||||
##
|
|
||||||
## WARNING: Indentation *always* means continuation. Name=value lines
|
|
||||||
## should always start in column zero.
|
|
||||||
##
|
|
||||||
## Comments should always start in column zero, and are identified
|
|
||||||
## with "#". By default each of the configuration items is
|
|
||||||
## commented out, with the default value of the option shown.
|
|
||||||
## You'll need to remove the '#' that precedes configuration
|
|
||||||
## options whose values you wish to modify.
|
|
||||||
##
|
|
||||||
## Certain configuration settings may have multiple values. These should
|
|
||||||
## be separated by a comma. The settings where this is allowed are noted
|
|
||||||
## below. Any other setting that requires special syntax is noted at that
|
|
||||||
## setting.
|
|
||||||
##
|
|
||||||
##
|
|
||||||
## SOME TERMINOLOGY USED HEREIN
|
|
||||||
##
|
|
||||||
## "root" - This is a CVS or Subversion repository. For Subversion, the
|
|
||||||
## meaning is pretty clear, as the virtual, versioned directory tree
|
|
||||||
## stored inside a Subversion repository looks nothing like the actual
|
|
||||||
## tree visible with shell utilities that holds the repository. For
|
|
||||||
## CVS, this is more confusing, because CVS's repository layout mimics
|
|
||||||
## (actually, defines) the layout of the stuff housed in the repository.
|
|
||||||
## But a CVS repository can be identified by the presence of a CVSROOT
|
|
||||||
## subdirectory in its root directory.
|
|
||||||
##
|
|
||||||
## "module" - A module is a top-level subdirectory of a root, usually
|
|
||||||
## associated with the concept of a single "project" among many housed
|
|
||||||
## within a single repository.
|
|
||||||
##
|
|
||||||
##
|
|
||||||
## BASIC VIEWVC CONFIGURATION HINTS
|
|
||||||
##
|
|
||||||
## While ViewVC has quite a few configuration options, you generally
|
|
||||||
## only need to change a small subset of them to get your ViewVC
|
|
||||||
## installation working properly. Here are some options that we
|
|
||||||
## recommend you pay attention to. Of course, don't try to change the
|
|
||||||
## options here -- do so in the relevant section of the configuration
|
|
||||||
## file below.
|
|
||||||
##
|
|
||||||
## For correct operation, you will probably need to change the following
|
|
||||||
## configuration variables:
|
|
||||||
##
|
|
||||||
## cvs_roots (for CVS)
|
|
||||||
## svn_roots (for Subversion)
|
|
||||||
## root_parents (for CVS or Subversion)
|
|
||||||
## default_root
|
|
||||||
## root_as_url_component
|
|
||||||
## rcs_dir
|
|
||||||
## mime_types_files
|
|
||||||
## the many options in the [utilities] section
|
|
||||||
##
|
|
||||||
## It is usually desirable to change the following variables:
|
|
||||||
##
|
|
||||||
## address
|
|
||||||
## forbidden
|
|
||||||
##
|
|
||||||
## To optimize delivery of ViewVC static files:
|
|
||||||
##
|
|
||||||
## docroot
|
|
||||||
##
|
|
||||||
## To customize the display of ViewVC for your site:
|
|
||||||
##
|
|
||||||
## template_dir
|
|
||||||
## the [templates] override section
|
|
||||||
##
|
|
||||||
|
|
||||||
##---------------------------------------------------------------------------
|
|
||||||
[general]
|
|
||||||
|
|
||||||
## cvs_roots: Specifies each of the CVS roots on your system and
|
|
||||||
## assigns names to them. Each root should be given by a "name: path"
|
|
||||||
## value. Multiple roots should be separated by commas and can be
|
|
||||||
## placed on separate lines.
|
|
||||||
##
|
|
||||||
## Example:
|
|
||||||
## cvs_roots = cvsroot: /opt/cvs/repos1,
|
|
||||||
## anotherroot: /usr/local/cvs/repos2
|
|
||||||
##
|
|
||||||
#cvs_roots =
|
|
||||||
|
|
||||||
## svn_roots: Specifies each of the Subversion roots (repositories) on
|
|
||||||
## your system and assigns names to them. Each root should be given by
|
|
||||||
## a "name: path" value. Multiple roots should be separated by commas
|
|
||||||
## and can be placed on separate lines.
|
|
||||||
##
|
|
||||||
## Example:
|
|
||||||
## svn_roots = svnrepos: /opt/svn/,
|
|
||||||
## anotherrepos: /usr/local/svn/repos2
|
|
||||||
##
|
|
||||||
#svn_roots =
|
|
||||||
|
|
||||||
## root_parents: Specifies a list of directories in which any number of
|
|
||||||
## repositories may reside. Rather than force you to add a new entry
|
|
||||||
## to 'cvs_roots' or 'svn_roots' each time you create a new repository,
|
|
||||||
## ViewVC rewards you for organising all your repositories under a few
|
|
||||||
## parent directories by allowing you to simply specifiy just those
|
|
||||||
## parent directories. ViewVC will then notice each repository in that
|
|
||||||
## directory as a new root whose name is the subdirectory of the parent
|
|
||||||
## path in which that repository lives.
|
|
||||||
##
|
|
||||||
## You can specify multiple parent paths separated by commas or new lines.
|
|
||||||
##
|
|
||||||
## WARNING: these names can, of course, clash with names you have
|
|
||||||
## defined in your cvs_roots or svn_roots configuration items. If this
|
|
||||||
## occurs, you can either rename the offending repository on disk, or
|
|
||||||
## grant new names to the clashing item in cvs_roots or svn_roots.
|
|
||||||
## Each parent path is processed sequentially, so repositories under
|
|
||||||
## later parent paths may override earlier ones.
|
|
||||||
##
|
|
||||||
## Example:
|
|
||||||
## root_parents = /opt/svn : svn,
|
|
||||||
## /opt/cvs : cvs
|
|
||||||
##
|
|
||||||
#root_parents =
|
|
||||||
|
|
||||||
## default_root: This is the name of the default root. Valid names
|
|
||||||
## include those explicitly listed in the cvs_roots and svn_roots
|
|
||||||
## configuration options, as well as those implicitly indicated by
|
|
||||||
## virtue of being the basenames of repositories found in the
|
|
||||||
## root_parents option locations.
|
|
||||||
##
|
|
||||||
## Note: This setting is ignored when root_as_url_component is enabled.
|
|
||||||
##
|
|
||||||
## Example:
|
|
||||||
## default_root = cvsroot
|
|
||||||
##
|
|
||||||
#default_root =
|
|
||||||
|
|
||||||
## mime_types_files: This is a list of pathnames to a set of MIME type
|
|
||||||
## mapping files to help ViewVC guess the correct MIME type of a
|
|
||||||
## versioned file. The pathnames listed here are specified in order of
|
|
||||||
## authoritativeness either as absolute paths or relative to this
|
|
||||||
## configuration file.
|
|
||||||
##
|
|
||||||
## As a convenience, ViewVC provides a MIME type mapping file
|
|
||||||
## (mimetypes.conf) which is, by default, the preferred provider of
|
|
||||||
## MIME type mapping answers, but which is also empty. If you find
|
|
||||||
## that ViewVC is unable to accurately guess MIME types based on the
|
|
||||||
## extensions of some of your versioned files, you can add records of
|
|
||||||
## your preferred mappings to the provided mimetypes.conf file (or to
|
|
||||||
## your system's mapping files, if you wish).
|
|
||||||
##
|
|
||||||
## You might, for example, wish to have ViewVC also consult the mapping
|
|
||||||
## files provided by your operating system and Apache.
|
|
||||||
##
|
|
||||||
## Example:
|
|
||||||
## mime_types_files = mimetypes.conf,
|
|
||||||
## /etc/mime.types,
|
|
||||||
## /usr/local/apache2/conf/mime.types
|
|
||||||
##
|
|
||||||
#mime_types_files = mimetypes.conf
|
|
||||||
|
|
||||||
## address: The address of the local repository maintainer. (This
|
|
||||||
## option is provided only as a convenience for ViewVC installations
|
|
||||||
## which are using the default template set, where the value of this
|
|
||||||
## option will be displayed in the footer of every ViewVC page.)
|
|
||||||
##
|
|
||||||
## Example:
|
|
||||||
## address = admin@server.com
|
|
||||||
##
|
|
||||||
#address =
|
|
||||||
|
|
||||||
## kv_files: Provides a mechanism for custom key/value pairs to be
|
|
||||||
## available to templates. These are stored in key/value (KV) files.
|
|
||||||
##
|
|
||||||
## The paths of the KV files are listed here, specified either as
|
|
||||||
## absolute paths or relative to this configuration file. The files
|
|
||||||
## use the same format as this configuration file, containing one or
|
|
||||||
## more user-defined sections, and user-defined options in those
|
|
||||||
## sections. ViewVC makes these options available to template authors
|
|
||||||
## as:
|
|
||||||
##
|
|
||||||
## kv.SECTION.OPTION
|
|
||||||
##
|
|
||||||
## Note that an option name can be dotted. For example:
|
|
||||||
##
|
|
||||||
## [my_images]
|
|
||||||
## logos.small = /images/small-logo.png
|
|
||||||
## logos.big = /images/big-logo.png
|
|
||||||
##
|
|
||||||
## Templates can use these with a directive like: [kv.my_images.logos.small]
|
|
||||||
##
|
|
||||||
## Note that section names which are common to multiple KV files will
|
|
||||||
## be merged. If two files have a [my_images] section, then the
|
|
||||||
## options in those two like-named sections will be merged together.
|
|
||||||
## If two files have the same option name in a section, then one will
|
|
||||||
## overwrite the other (and which one "wins" is unspecified).
|
|
||||||
##
|
|
||||||
## To further categorize the KV files, and how the values are provided to
|
|
||||||
## the templates, a KV file name may be annotated with an additional level
|
|
||||||
## of dotted naming. For example:
|
|
||||||
##
|
|
||||||
## kv_files = [asf]kv/images.conf
|
|
||||||
##
|
|
||||||
## Assuming the same section as above, the template would refer to an image
|
|
||||||
## using [kv.asf.my_images.logos.small]
|
|
||||||
##
|
|
||||||
## Lastly, it is possible to use %lang% in the filenames to specify a
|
|
||||||
## substitution of the selected language-tag.
|
|
||||||
##
|
|
||||||
## Example:
|
|
||||||
## kv_files = kv/file1.conf, kv/file2.conf, [i18n]kv/%lang%_data.conf
|
|
||||||
##
|
|
||||||
#kv_files =
|
|
||||||
|
|
||||||
## This option is a comma-separated list of language-tag values
|
|
||||||
## available to ViewVC. The first language-tag listed is the default
|
|
||||||
## language, and will be used if an Accept-Language header is not
|
|
||||||
## present in the request, or none of the user's requested languages
|
|
||||||
## are available. If there are ties on the selection of a language,
|
|
||||||
## then the first to appear in the list is chosen.
|
|
||||||
##
|
|
||||||
## Example:
|
|
||||||
## languages = en-us, en-gb, de
|
|
||||||
##
|
|
||||||
#languages = en-us
|
|
||||||
|
|
||||||
|
|
||||||
##---------------------------------------------------------------------------
|
|
||||||
[utilities]
|
|
||||||
|
|
||||||
## ViewVC uses (sometimes optionally) various third-party programs to do some
|
|
||||||
## of the heavy lifting. Generally, it will attempt to execute those utility
|
|
||||||
## programs in such a way that if they are found in ViewVC's executable
|
|
||||||
## search path ($PATH, %PATH%, etc.) all is well. But sometimes these tools
|
|
||||||
## aren't installed in the executable search path, so here's where you can
|
|
||||||
## tell ViewVC where to find them.
|
|
||||||
##
|
|
||||||
## NOTE: Options with a "_dir" suffix are for configuring the directories
|
|
||||||
## in which certain programs live; otherwise, the option value should
|
|
||||||
## point to the actual program.
|
|
||||||
|
|
||||||
|
|
||||||
## rcs_dir: Directory in which the RCS utilities are installed, used
|
|
||||||
## for viewing CVS repositories.
|
|
||||||
##
|
|
||||||
## Example:
|
|
||||||
## rcs_dir = /usr/bin/
|
|
||||||
##
|
|
||||||
#rcs_dir =
|
|
||||||
|
|
||||||
## cvsnt: Location of cvsnt program. ViewVC can use CVSNT (www.cvsnt.org)
|
|
||||||
## instead of the RCS utilities to retrieve information from CVS
|
|
||||||
## repositories. To enable use of CVSNT, set the "cvsnt" value to the
|
|
||||||
## path of the CVSNT executable. (If CVSNT is on the standard path, you
|
|
||||||
## can also set it to the name of the CVSNT executable). By default
|
|
||||||
## "cvsnt" is set to "cvs" on Windows and is not set on other platforms.
|
|
||||||
##
|
|
||||||
## Examples:
|
|
||||||
## cvsnt = K:\Program Files\cvsnt\cvs.exe
|
|
||||||
## cvsnt = /usr/bin/cvs
|
|
||||||
## cvsnt = cvs
|
|
||||||
##
|
|
||||||
#cvsnt =
|
|
||||||
|
|
||||||
## svn: Location of the Subversion command-line client, used for
|
|
||||||
## viewing Subversion repositories.
|
|
||||||
##
|
|
||||||
## Example:
|
|
||||||
## svn = /usr/bin/svn
|
|
||||||
##
|
|
||||||
#svn =
|
|
||||||
|
|
||||||
## diff: Location of the GNU diff program, used for showing file
|
|
||||||
## version differences.
|
|
||||||
##
|
|
||||||
## Example:
|
|
||||||
## diff = /usr/bin/diff
|
|
||||||
##
|
|
||||||
#diff =
|
|
||||||
|
|
||||||
## cvsgraph: Location of the CvsGraph program, a graphical CVS version
|
|
||||||
## graph generator (see options.use_cvsgraph).
|
|
||||||
##
|
|
||||||
## Example:
|
|
||||||
## cvsgraph = /usr/local/bin/cvsgraph
|
|
||||||
##
|
|
||||||
#cvsgraph =
|
|
||||||
|
|
||||||
|
|
||||||
##---------------------------------------------------------------------------
|
|
||||||
[options]
|
|
||||||
|
|
||||||
## root_as_url_component: Interpret the first path component in the URL
|
|
||||||
## after the script location as the root to use. This is an
|
|
||||||
## alternative to using the "root=" query key. If ViewVC is configured
|
|
||||||
## with multiple repositories, this results in more natural looking
|
|
||||||
## ViewVC URLs.
|
|
||||||
## Note: Enabling this option will break backwards compatibility with
|
|
||||||
## any old ViewCVS URL which doesn't have an explicit "root" parameter.
|
|
||||||
##
|
|
||||||
#root_as_url_component = 1
|
|
||||||
|
|
||||||
## checkout_magic: Use checkout links with magic /*checkout*/ prefixes so
|
|
||||||
## checked out HTML pages can have working links to other repository files
|
|
||||||
## Note: This option is DEPRECATED and should not be used in new ViewVC
|
|
||||||
## installations. Setting "default_file_view = co" achieves the same effect
|
|
||||||
##
|
|
||||||
#checkout_magic = 0
|
|
||||||
|
|
||||||
## allowed_views: List the ViewVC views which are enabled. Views not
|
|
||||||
## in this comma-delited list will not be served (or, will return an
|
|
||||||
## error on attempted access).
|
|
||||||
## Possible values: "annotate", "co", "diff", "markup", "roots", "tar"
|
|
||||||
##
|
|
||||||
#allowed_views = annotate, diff, markup, roots
|
|
||||||
|
|
||||||
## authorizer: The name of the ViewVC authorizer plugin to use when
|
|
||||||
## authorizing access to repository contents. This value must be the
|
|
||||||
## name of a Python module addressable as vcauth.MODULENAME (most
|
|
||||||
## easily accomplished by placing it in ViewVC's lib/vcauth/ directory)
|
|
||||||
## and which implements a ViewVCAuthorizer class (as a subclass of
|
|
||||||
## vcauth.GenericViewVCAuthorizer). You can provide custom parameters
|
|
||||||
## to the authorizer module by defining configuration sections named
|
|
||||||
## authz-MODULENAME and adding the parameter keys and values there.
|
|
||||||
##
|
|
||||||
## ViewVC provides the following modules:
|
|
||||||
## svnauthz - based on Subversion authz files
|
|
||||||
## forbidden - simple path glob matches against top-level root directories
|
|
||||||
## forbiddenre - root and path matches against regular expressions
|
|
||||||
##
|
|
||||||
## NOTE: Only one authorizer may be in use for a given ViewVC request.
|
|
||||||
## It doesn't matter if you configure the parameters of multiple
|
|
||||||
## authorizer plugins -- only the authorizer whose name is configured
|
|
||||||
## here (or effectively configured here via per-vhost or per-root
|
|
||||||
## configuration) will be activated.
|
|
||||||
##
|
|
||||||
#authorizer =
|
|
||||||
|
|
||||||
## hide_cvsroot: Don't show the CVSROOT directory
|
|
||||||
## 1 Hide CVSROOT directory
|
|
||||||
## 0 Show CVSROOT directory
|
|
||||||
## NOTE: Someday this option may be removed in favor of letting
|
|
||||||
## individual authorizer plugin hide the CVSROOT.
|
|
||||||
##
|
|
||||||
#hide_cvsroot = 1
|
|
||||||
|
|
||||||
## mangle_email_addresses: Mangle email addresses in marked-up output.
|
|
||||||
## There are various levels of mangling available:
|
|
||||||
## 0 - No mangling; markup un-mangled email addresses as hyperlinks
|
|
||||||
## 1 - Obfuscation (using entity encoding); no hyperlinking
|
|
||||||
## 2 - Data-dropping address truncation; no hyperlinking
|
|
||||||
## Note: this will not effect the display of versioned file contents, only
|
|
||||||
## addresses that appear in version control metadata (e.g. log messages).
|
|
||||||
##
|
|
||||||
#mangle_email_addresses = 0
|
|
||||||
|
|
||||||
## default_file_view: "log", "co", or "markup"
|
|
||||||
## Controls whether the default view for file URLs is a checkout view or
|
|
||||||
## a log view. "log" is the default for backwards compatibility with old
|
|
||||||
## ViewCVS URLs, but "co" has the advantage that it allows ViewVC to serve
|
|
||||||
## static HTML pages directly from a repository with working links
|
|
||||||
## to other repository files
|
|
||||||
## Note: Changing this option may break compatibility with existing
|
|
||||||
## bookmarked URLs.
|
|
||||||
## Also note: If you choose one of the "co" or "markup" views, be sure
|
|
||||||
## to enable it (via the allowed_views option)
|
|
||||||
##
|
|
||||||
#default_file_view = log
|
|
||||||
|
|
||||||
## http_expiration_time: Expiration time (in seconds) for cacheable
|
|
||||||
## pages served by ViewVC. Note that in most cases, a cache aware
|
|
||||||
## client will only revalidate the page after it expires (using the
|
|
||||||
## If-Modified-Since and/or If-None-Match headers) and that browsers
|
|
||||||
## will also revalidate the page when the reload button is pressed.
|
|
||||||
## Set to 0 to disable the transmission of these caching headers.
|
|
||||||
##
|
|
||||||
#http_expiration_time = 600
|
|
||||||
|
|
||||||
## generate_etags: Generate Etag headers for relevant pages to assist
|
|
||||||
## in browser caching.
|
|
||||||
## 1 Generate Etags
|
|
||||||
## 0 Don't generate Etags
|
|
||||||
##
|
|
||||||
#generate_etags = 1
|
|
||||||
|
|
||||||
## svn_ignore_mimetype: Don't consult the svn:mime-type property to
|
|
||||||
## determine how to display a file in the markup view. This is
|
|
||||||
## especially helpful when versioned images carry the default
|
|
||||||
## Subversion-calculated MIME type of "application/octet-stream" (which
|
|
||||||
## isn't recognized as viewable type by browsers).
|
|
||||||
##
|
|
||||||
#svn_ignore_mimetype = 0
|
|
||||||
|
|
||||||
## svn_config_dir: Path of the Subversion runtime configuration
|
|
||||||
## directory ViewVC should consult for various things, including cached
|
|
||||||
## remote authentication credentials. If unset, Subversion will use
|
|
||||||
## the default location(s) ($HOME/.subversion, etc.)
|
|
||||||
##
|
|
||||||
#svn_config_dir =
|
|
||||||
|
|
||||||
## use_rcsparse: Use the rcsparse Python module to retrieve CVS
|
|
||||||
## repository information instead of invoking rcs utilities [EXPERIMENTAL]
|
|
||||||
##
|
|
||||||
#use_rcsparse = 0
|
|
||||||
|
|
||||||
## sort_by: File sort order
|
|
||||||
## file Sort by filename
|
|
||||||
## rev Sort by revision number
|
|
||||||
## date Sort by commit date
|
|
||||||
## author Sort by author
|
|
||||||
## log Sort by log message
|
|
||||||
##
|
|
||||||
#sort_by = file
|
|
||||||
|
|
||||||
## sort_group_dirs: Group directories when sorting
|
|
||||||
## 1 Group directories together
|
|
||||||
## 0 No grouping -- sort directories as any other item would be sorted
|
|
||||||
##
|
|
||||||
#sort_group_dirs = 1
|
|
||||||
|
|
||||||
## hide_attic: Hide or show the contents of the Attic subdirectory
|
|
||||||
## 1 Hide dead files inside Attic subdir
|
|
||||||
## 0 Show the files which are inside the Attic subdir
|
|
||||||
##
|
|
||||||
#hide_attic = 1
|
|
||||||
|
|
||||||
## hide_errorful_entries: Hide or show errorful directory entries
|
|
||||||
## (perhaps due to not being readable, or some other rlog parsing
|
|
||||||
## error, etc.)
|
|
||||||
## 1 Hide errorful entries from the directory display
|
|
||||||
## 0 Show errorful entries (with their errors) in the directory display
|
|
||||||
##
|
|
||||||
#hide_errorful_entries = 0
|
|
||||||
|
|
||||||
## log_sort: Sort order for log messages
|
|
||||||
## date Sort revisions by date
|
|
||||||
## rev Sort revision by revision number
|
|
||||||
## none Use the version control system's ordering
|
|
||||||
##
|
|
||||||
#log_sort = date
|
|
||||||
|
|
||||||
## diff_format: Default diff format
|
|
||||||
## h Human readable
|
|
||||||
## u Unified diff
|
|
||||||
## c Context diff
|
|
||||||
## s Side by side
|
|
||||||
## l Long human readable (more context)
|
|
||||||
## f Full human readable (entire file)
|
|
||||||
##
|
|
||||||
#diff_format = h
|
|
||||||
|
|
||||||
## hr_breakable: Diff view line breaks
|
|
||||||
## 1 lines break at spaces
|
|
||||||
## 0 no line breaking
|
|
||||||
## Or, use a positive integer > 1 to cut lines after that many characters
|
|
||||||
##
|
|
||||||
#hr_breakable = 1
|
|
||||||
|
|
||||||
## hr_funout: Give out function names in human readable diffs.
|
|
||||||
## (Only works well for C source files, otherwise diff's heuristic falls short.)
|
|
||||||
## ('-p' option to diff)
|
|
||||||
##
|
|
||||||
#hr_funout = 0
|
|
||||||
|
|
||||||
## hr_ignore_white: Ignore whitespace (indendation and stuff) for human
|
|
||||||
## readable diffs.
|
|
||||||
## ('-w' option to diff)
|
|
||||||
##
|
|
||||||
#hr_ignore_white = 0
|
|
||||||
|
|
||||||
## hr_ignore_keyword_subst: Ignore diffs which are caused by keyword
|
|
||||||
## substitution (such as "$Id - Stuff").
|
|
||||||
## ('-kk' option to rcsdiff)
|
|
||||||
##
|
|
||||||
#hr_ignore_keyword_subst = 1
|
|
||||||
|
|
||||||
## hr_intraline: Enable highlighting of intraline changes in human
|
|
||||||
## readable diffs. [Requires Python 2.4]
|
|
||||||
##
|
|
||||||
#hr_intraline = 0
|
|
||||||
|
|
||||||
## allow_compress: Allow compression via gzip of output if the Browser
|
|
||||||
## accepts it (HTTP_ACCEPT_ENCODING contains "gzip").
|
|
||||||
##
|
|
||||||
## Note: this relies on Python's gzip module, which has proven to be
|
|
||||||
## not-so-performant. Enabling this feature should reduce the overall
|
|
||||||
## transfer size of ViewVC's responses to the client's request, but
|
|
||||||
## will do so with a speed penalty.
|
|
||||||
##
|
|
||||||
#allow_compress = 0
|
|
||||||
|
|
||||||
## template_dir: The directory which contains the EZT templates used by
|
|
||||||
## ViewVC to customize the display of the various output views. ViewVC
|
|
||||||
## looks in this directory for files with names that match the name of
|
|
||||||
## the view ("log", "directory", etc.) plus the ".ezt" extension. If
|
|
||||||
## specified as a relative path, it is relative to the directory where
|
|
||||||
## this config file resides; absolute paths may be used as well. If
|
|
||||||
## %lang% occurs in the pathname, then the selected language will be
|
|
||||||
## substituted.
|
|
||||||
## See Also: the [templates] configuration section, where you can
|
|
||||||
## override templates on a per-view basis.
|
|
||||||
##
|
|
||||||
#template_dir = templates
|
|
||||||
|
|
||||||
## docroot: Web path to a directory that contains ViewVC static files
|
|
||||||
## (stylesheets, images, etc.) If set, static files will get
|
|
||||||
## downloaded directory from this location. If unset, static files
|
|
||||||
## will be served by the ViewVC script (at a likely performance
|
|
||||||
## penalty, and from the "docroot" subdirectory of the directory
|
|
||||||
## specified by the "template_dir" option).
|
|
||||||
##
|
|
||||||
#docroot =
|
|
||||||
|
|
||||||
## show_subdir_lastmod: Show last changelog message for CVS subdirectories
|
|
||||||
## NOTE: The current implementation makes many assumptions and may show
|
|
||||||
## the incorrect file at some times. The main assumption is that the
|
|
||||||
## last modified file has the newest filedate. But some CVS operations
|
|
||||||
## touches the file without even when a new version is not checked in,
|
|
||||||
## and TAG based browsing essentially puts this out of order, unless
|
|
||||||
## the last checkin was on the same tag as you are viewing. Enable
|
|
||||||
## this if you like the feature, but don't rely on correct results.
|
|
||||||
##
|
|
||||||
## ** WARNING: Enabling this will currently leak unauthorized path names **
|
|
||||||
##
|
|
||||||
#show_subdir_lastmod = 0
|
|
||||||
|
|
||||||
## show_logs: Show the most recent log entry in directory listings.
|
|
||||||
##
|
|
||||||
#show_logs = 1
|
|
||||||
|
|
||||||
## show_log_in_markup: Show log when viewing file contents.
|
|
||||||
##
|
|
||||||
#show_log_in_markup = 1
|
|
||||||
|
|
||||||
## cross_copies: Cross filesystem copies when traversing Subversion
|
|
||||||
## file revision histories.
|
|
||||||
##
|
|
||||||
#cross_copies = 1
|
|
||||||
|
|
||||||
## use_localtime: Display dates as UTC or in local time zone.
|
|
||||||
##
|
|
||||||
#use_localtime = 0
|
|
||||||
|
|
||||||
## short_log_len: The length (in characters) to which the most recent
|
|
||||||
## log entry should be truncated when shown in the directory view.
|
|
||||||
##
|
|
||||||
#short_log_len = 80
|
|
||||||
|
|
||||||
## enable_syntax_coloration: Should we colorize known file content
|
|
||||||
## syntaxes? [Requires Pygments Python module]
|
|
||||||
##
|
|
||||||
#enable_syntax_coloration = 1
|
|
||||||
|
|
||||||
## detect_encoding: Should we attempt to detect versioned file
|
|
||||||
## character encodings? [Requires 'chardet' module, and is currently
|
|
||||||
## used only by the syntax coloration logic -- if enabled -- for the
|
|
||||||
## 'markup' and 'annotate' views; see 'enable_syntax_coloration'.]
|
|
||||||
##
|
|
||||||
#detect_encoding = 0
|
|
||||||
|
|
||||||
## use_cvsgraph: Use CvsGraph to offer visual graphs of CVS revision history.
|
|
||||||
##
|
|
||||||
#use_cvsgraph = 0
|
|
||||||
|
|
||||||
## cvsgraph_conf: Location of the customized cvsgraph configuration file.
|
|
||||||
## May be specified as an absolute path or as a path relative to this
|
|
||||||
## configuration file.
|
|
||||||
##
|
|
||||||
#cvsgraph_conf = cvsgraph.conf
|
|
||||||
|
|
||||||
## allowed_cvsgraph_useropts: A list of settings used for cvsgraph's
|
|
||||||
## user-modifiable behavior which can be changed in the graph display.
|
|
||||||
## This value is a comma-delimited list of features, taken from the
|
|
||||||
## following set:
|
|
||||||
## invert - Display graph upside down
|
|
||||||
## branchbox - Add a branchbox at the tip of each branch
|
|
||||||
## show - Display user-selected classes of revisions
|
|
||||||
## rotate - Draw the tree left-to-right or top-to-bottom [*]
|
|
||||||
## limittags - Allow limit on the maximum number of tags displayed
|
|
||||||
##
|
|
||||||
## If this option is left unset, users will not be permitted to modify
|
|
||||||
## the graph display behavior.
|
|
||||||
##
|
|
||||||
## [*] WARNING: The 'rotate' option is known to cause some browsers to
|
|
||||||
## crash due, presumably, to the display of excessively wide images.
|
|
||||||
##
|
|
||||||
## Example:
|
|
||||||
## allowed_cvsgraph_useropts = limittags, show
|
|
||||||
##
|
|
||||||
##
|
|
||||||
#allowed_cvsgraph_useropts =
|
|
||||||
|
|
||||||
## use_re_search: Enable regular expression search of files in a directory.
|
|
||||||
##
|
|
||||||
## WARNING: Enabling this option can consume HUGE amounts of server
|
|
||||||
## time. A "checkout" must be performed on *each* file in a directory,
|
|
||||||
## and the result needs to be searched for a match against the regular
|
|
||||||
## expression.
|
|
||||||
##
|
|
||||||
## SECURITY WARNING: Since a user can enter the regular expression, it
|
|
||||||
## is possible for them to enter an expression with many alternatives
|
|
||||||
## and a lot of backtracking. Executing that search over thousands of
|
|
||||||
## lines over dozens of files can easily tie up a server for a long
|
|
||||||
## period of time. This option should only be used on sites with
|
|
||||||
## trusted users. It is highly inadvisable to use this on a public site.
|
|
||||||
##
|
|
||||||
#use_re_search = 0
|
|
||||||
|
|
||||||
## dir_pagesize: Maximum number of directory entries on a given page.
|
|
||||||
## This allows ViewVC to present discrete pages to the users instead of
|
|
||||||
## the entire directory. Set to 0 to disable pagination.
|
|
||||||
##
|
|
||||||
#dir_pagesize = 0
|
|
||||||
|
|
||||||
## log_pagesize: Maximum number of revision log entries on a given page.
|
|
||||||
## This allows ViewVC to present discrete pages to the users instead of
|
|
||||||
## the entire revision log. Set to 0 to disable pagination.
|
|
||||||
##
|
|
||||||
#log_pagesize = 0
|
|
||||||
|
|
||||||
## limit_changes: Maximum number of changed paths shown per commit in
|
|
||||||
## the Subversion revision view and in query results. This is not a
|
|
||||||
## hard limit (the UI provides options to show all changed paths), but
|
|
||||||
## it prevents ViewVC from generating enormous and hard to read pages
|
|
||||||
## by default when they happen to contain import or merge commits
|
|
||||||
## affecting hundreds or thousands of files. Set to 0 to disable the
|
|
||||||
## limit.
|
|
||||||
##
|
|
||||||
#limit_changes = 100
|
|
||||||
|
|
||||||
##---------------------------------------------------------------------------
|
|
||||||
[templates]
|
|
||||||
|
|
||||||
## You can override the templates used by various ViewVC views in this
|
|
||||||
## section. By default, ViewVC will look for templates in the
|
|
||||||
## directory specified by the "template_dir" configuration option (see
|
|
||||||
## the documentation for that option for details). But if you want to
|
|
||||||
## use a different template for a particular view, simply uncomment the
|
|
||||||
## appropriate option below and specify the currect location of the EZT
|
|
||||||
## template file you wish to use for that view.
|
|
||||||
##
|
|
||||||
## Templates are specified relative to the configured template
|
|
||||||
## directory (see the "template_dir" option), but absolute paths may
|
|
||||||
## also be used as well.
|
|
||||||
##
|
|
||||||
## If %lang% occurs in the pathname, then the selected language will be
|
|
||||||
## substituted.
|
|
||||||
##
|
|
||||||
## Note: the selected language is defined by the "languages" item in the
|
|
||||||
## [general] section, and based on the request's Accept-Language
|
|
||||||
## header.
|
|
||||||
##
|
|
||||||
|
|
||||||
## diff: Template used for the file differences view.
|
|
||||||
##
|
|
||||||
#diff =
|
|
||||||
|
|
||||||
## directory: Template used for the directory listing view.
|
|
||||||
##
|
|
||||||
#directory =
|
|
||||||
|
|
||||||
## error: Template used for the ViewVC error display view.
|
|
||||||
##
|
|
||||||
#error =
|
|
||||||
|
|
||||||
## file: Template used for the file contents/annotation view.
|
|
||||||
##
|
|
||||||
#file =
|
|
||||||
|
|
||||||
## graph: Template used for the revision graph view.
|
|
||||||
##
|
|
||||||
#graph =
|
|
||||||
|
|
||||||
## log: Template used for the revision log view.
|
|
||||||
##
|
|
||||||
#log =
|
|
||||||
|
|
||||||
## query: Template used for the non-integrated query interface.
|
|
||||||
##
|
|
||||||
#query =
|
|
||||||
|
|
||||||
## query_form: Template used for the query form view.
|
|
||||||
##
|
|
||||||
#query_form =
|
|
||||||
|
|
||||||
## query_results: Template used for the query results view.
|
|
||||||
##
|
|
||||||
#query_results =
|
|
||||||
|
|
||||||
## revision: Template used for the revision/changeset view.
|
|
||||||
##
|
|
||||||
#revision =
|
|
||||||
|
|
||||||
## roots: Template used for the root listing view.
|
|
||||||
##
|
|
||||||
#roots =
|
|
||||||
|
|
||||||
##---------------------------------------------------------------------------
|
|
||||||
[cvsdb]
|
|
||||||
|
|
||||||
## enabled: Enable database integration feature.
|
|
||||||
##
|
|
||||||
#enabled = 0
|
|
||||||
|
|
||||||
## host: Database hostname. Leave unset to use a local Unix socket
|
|
||||||
## connection.
|
|
||||||
##
|
|
||||||
#host =
|
|
||||||
|
|
||||||
## post: Database listening port.
|
|
||||||
##
|
|
||||||
#port = 3306
|
|
||||||
|
|
||||||
## database_name: ViewVC database name.
|
|
||||||
##database_name = ViewVC
|
|
||||||
|
|
||||||
## user: Username of user with read/write privileges to the database
|
|
||||||
## specified by the 'database_name' configuration option.
|
|
||||||
##
|
|
||||||
#user =
|
|
||||||
|
|
||||||
## passwd: Password of user with read/write privileges to the database
|
|
||||||
## specified by the 'database_name' configuration option.
|
|
||||||
##
|
|
||||||
#passwd =
|
|
||||||
|
|
||||||
## readonly_user: Username of user with read privileges to the database
|
|
||||||
## specified by the 'database_name' configuration option.
|
|
||||||
##
|
|
||||||
#readonly_user =
|
|
||||||
|
|
||||||
## readonly_passwd: Password of user with read privileges to the database
|
|
||||||
## specified by the 'database_name' configuration option.
|
|
||||||
##
|
|
||||||
#readonly_passwd =
|
|
||||||
|
|
||||||
## row_limit: Maximum number of rows returned by a given normal query
|
|
||||||
## to the database.
|
|
||||||
##
|
|
||||||
#row_limit = 1000
|
|
||||||
|
|
||||||
## rss_row_limit: Maximum number of rows returned by a given query to
|
|
||||||
## the database made as part of an RSS feed request. (Keeping in mind
|
|
||||||
## that RSS readers tend to poll regularly for new data, you might want
|
|
||||||
## to keep this set to a conservative number.)
|
|
||||||
##
|
|
||||||
#rss_row_limit = 100
|
|
||||||
|
|
||||||
## check_database_for_root: Check if the repository is found in the
|
|
||||||
## database before showing the query link and RSS feeds.
|
|
||||||
##
|
|
||||||
## WARNING: Enabling this check adds the cost of a database connection
|
|
||||||
## and query to most ViewVC requests. If all your roots are represented
|
|
||||||
## in the commits database, or if you don't care about the creation of
|
|
||||||
## RSS and query links that might lead ultimately to error pages for
|
|
||||||
## certain of your roots, or if you simply don't want to add this extra
|
|
||||||
## cost to your ViewVC requests, leave this disabled.
|
|
||||||
##
|
|
||||||
#check_database_for_root = 0
|
|
||||||
|
|
||||||
##---------------------------------------------------------------------------
|
|
||||||
[vhosts]
|
|
||||||
|
|
||||||
## Virtual hosts are individual logical servers accessible via
|
|
||||||
## different hostnames, but which are all really the same physical
|
|
||||||
## computer. For example, you might have your web server configured to
|
|
||||||
## accept incoming traffic for both http://www.yourdomain.com/ and
|
|
||||||
## http://viewvc.yourdomain.com/. Users pointing their web browsers at
|
|
||||||
## each of those two URLs might see entirely different content via one
|
|
||||||
## URL versus the other, but all that content actually lives on the
|
|
||||||
## same computer, is served up via the same web server, and so
|
|
||||||
## on. It just *looks* like its coming from multiple servers.
|
|
||||||
##
|
|
||||||
## ViewVC allows you to customize its configuration options for
|
|
||||||
## individual virtual hosts. You might, for example, wish to expose
|
|
||||||
## all of your Subversion repositories at http://svn.yourdomain.com/viewvc/
|
|
||||||
## and all your CVS ones at http://cvs.yourdomain.com/viewvc/, with no
|
|
||||||
## cross-exposure. Using ViewVC's virtual host (vhost) configuration
|
|
||||||
## support, you can do this. Simply create two vhost configurations
|
|
||||||
## (one for each of your hostnames), then configure the cvs_roots
|
|
||||||
## option only for the vhost associated with cvs.yourdomain.com, and
|
|
||||||
## configure the svn_roots option only for the vhost associated with
|
|
||||||
## svn.yourdomain.com.
|
|
||||||
##
|
|
||||||
## This section is a freeform configuration section, where you create
|
|
||||||
## both the option names and their values. The names of the options
|
|
||||||
## are then treated as canonical names of virtual hosts, and their
|
|
||||||
## values are defined to be comma-delimited lists of hostname globs
|
|
||||||
## against which incoming ViewVC requests will be matched to figure out
|
|
||||||
## which vhost they apply to.
|
|
||||||
##
|
|
||||||
## After you've named and defined your vhosts, you may then create new
|
|
||||||
## configuration sections whose names are of the form
|
|
||||||
## vhost-VHOSTNAME/CONFIGSECTION. VHOSTNAME here is the canonical name
|
|
||||||
## of one of the virtual hosts you defined under the [vhosts] section.
|
|
||||||
## Inside those configuration sections, you override the standard
|
|
||||||
## ViewVC options typically found in the base configuration section
|
|
||||||
## named CONFIGSECTION ("general", "option", etc.)
|
|
||||||
##
|
|
||||||
## Here is an example:
|
|
||||||
##
|
|
||||||
## [vhosts]
|
|
||||||
## libs = libs.yourdomain.*, *.yourlibs.*
|
|
||||||
## gui = guiproject.yourdomain.*
|
|
||||||
##
|
|
||||||
## [vhost-libs/general]
|
|
||||||
## cvs_roots =
|
|
||||||
## svn_roots = svnroot: /var/svn/libs-repos
|
|
||||||
## default_root = svnroot
|
|
||||||
##
|
|
||||||
## [vhost-libs/options]
|
|
||||||
## show_logs = 1
|
|
||||||
##
|
|
||||||
## [vhost-gui/general]
|
|
||||||
## cvs_roots = cvsroot: /var/cvs/guiproject
|
|
||||||
## svn_roots =
|
|
||||||
## default_root = cvsroot
|
|
||||||
##
|
|
||||||
|
|
||||||
##---------------------------------------------------------------------------
|
|
||||||
## ViewVC recognizes per-root configuration overrides, too. To
|
|
||||||
## override the value of a configuration parameter only for a single
|
|
||||||
## root, create a configuration section whose names is of the form
|
|
||||||
## root-ROOTNAME/CONFIGSECTION. ROOTNAME here is the name of the root
|
|
||||||
## as defined explicitly in cvs_roots or svn_roots or implicitly as the
|
|
||||||
## basename of a root path in root_parents. Options found in this new
|
|
||||||
## configuration section override for this one root the corresponding
|
|
||||||
## options found in the base configuration section CONFIGSECTION
|
|
||||||
## ("options", "authz-*", etc.)
|
|
||||||
##
|
|
||||||
## Here is an example showing how to enable Subversion authz-based
|
|
||||||
## authorization for only the single root named "svnroot":
|
|
||||||
##
|
|
||||||
## [root-svnroot/options]
|
|
||||||
## authorizer = svnauthz
|
|
||||||
##
|
|
||||||
## [root-svnroot/authz-svnauthz]
|
|
||||||
## authzfile = /path/to/authzfile
|
|
||||||
##
|
|
||||||
|
|
||||||
##---------------------------------------------------------------------------
|
|
||||||
[authz-forbidden]
|
|
||||||
|
|
||||||
## The "forbidden" authorizer forbids access to repository modules,
|
|
||||||
## defined to be top-level subdirectories in a repository. You can use
|
|
||||||
## a simple list of modules, or something more complex:
|
|
||||||
##
|
|
||||||
## *) The "!" can be used before a module to explicitly state that it
|
|
||||||
## is NOT forbidden. Whenever this form is seen, then all modules will
|
|
||||||
## be forbidden unless one of the "!" modules match.
|
|
||||||
##
|
|
||||||
## *) Shell-style "glob" expressions may be used. "*" will match any
|
|
||||||
## sequence of zero or more characters, "?" will match any single
|
|
||||||
## character, "[seq]" will match any character in seq, and "[!seq]"
|
|
||||||
## will match any character not in seq.
|
|
||||||
##
|
|
||||||
## *) Tests are performed in sequence. The first match will terminate the
|
|
||||||
## testing. This allows for more complex allow/deny patterns.
|
|
||||||
##
|
|
||||||
## Tests are case-sensitive.
|
|
||||||
##
|
|
||||||
## NOTE: Again, this is for the hiding of modules within repositories, *not*
|
|
||||||
## for the hiding of repositories (roots) themselves.
|
|
||||||
##
|
|
||||||
## Some examples:
|
|
||||||
##
|
|
||||||
## Disallow "example" but allow all others:
|
|
||||||
## forbidden = example
|
|
||||||
##
|
|
||||||
## Disallow "example1" and "example2" but allow all others:
|
|
||||||
## forbidden = example1, example2
|
|
||||||
##
|
|
||||||
## Allow *only* "example1" and "example2":
|
|
||||||
## forbidden = !example1, !example2
|
|
||||||
##
|
|
||||||
## Forbid modules starting with "x":
|
|
||||||
## forbidden = x*
|
|
||||||
##
|
|
||||||
## Allow modules starting with "x" but no others:
|
|
||||||
## forbidden = !x*
|
|
||||||
##
|
|
||||||
## Allow "xml", forbid other modules starting with "x", and allow the rest:
|
|
||||||
## forbidden = !xml, x*, !*
|
|
||||||
##
|
|
||||||
#forbidden =
|
|
||||||
|
|
||||||
##---------------------------------------------------------------------------
|
|
||||||
[authz-forbiddenre]
|
|
||||||
|
|
||||||
## The "forbiddenre" authorizer forbids access to repositories and
|
|
||||||
## repository paths by comparing a list of regular expressions
|
|
||||||
## (separated by commas) against paths consisting of the repository (or
|
|
||||||
## root) name plus the path of the versioned file or directory to be
|
|
||||||
## tested. For example, to see if the user is authorized to see the
|
|
||||||
## path "/trunk/www/index.html" in the repository whose root name is
|
|
||||||
## "svnrepos", this authorizer will check the path
|
|
||||||
## "svnrepos/trunk/www/index.html" against the list of forbidden
|
|
||||||
## regular expressions. Directory paths will be terminated by a forward
|
|
||||||
## slash.
|
|
||||||
##
|
|
||||||
## Like the "forbidden" authorizer...
|
|
||||||
##
|
|
||||||
## *) The "!" can be used before a module to explicitly state that it
|
|
||||||
## is NOT forbidden. Whenever this form is seen, then all modules will
|
|
||||||
## be forbidden unless one of the "!" modules match.
|
|
||||||
##
|
|
||||||
## *) Tests are performed in sequence. The first match will terminate the
|
|
||||||
## testing. This allows for more complex allow/deny patterns.
|
|
||||||
##
|
|
||||||
## Unlike the "forbidden" authorizer, you can can use this to hide roots, too.
|
|
||||||
##
|
|
||||||
## Some examples:
|
|
||||||
##
|
|
||||||
## Disallow files named "PRIVATE", but allow all others:
|
|
||||||
## forbiddenre = /PRIVATE$
|
|
||||||
##
|
|
||||||
## Disallow the "hidden" repository, allowing all others:
|
|
||||||
## forbiddenre = ^hidden(/|$)
|
|
||||||
##
|
|
||||||
## Allow only the "example1" and "example2" roots and the paths inside them,
|
|
||||||
## disallowing all others (which can be done in multiple ways):
|
|
||||||
## forbiddenre = !^example1(/|$), !^example2(/|$)/
|
|
||||||
## forbiddenre = !^example[12](/|$)
|
|
||||||
##
|
|
||||||
## Only allow visibility of HTML files and the directories that hold them:
|
|
||||||
## forbiddenre = !^([^/]+|.*(/|\.html))$
|
|
||||||
##
|
|
||||||
#forbiddenre =
|
|
||||||
|
|
||||||
##---------------------------------------------------------------------------
|
|
||||||
[authz-svnauthz]
|
|
||||||
|
|
||||||
## The "svnauthz" authorizer uses a Subversion authz configuration file
|
|
||||||
## to determine access to repository paths.
|
|
||||||
|
|
||||||
## authzfile: Specifies the location of the authorization rules file
|
|
||||||
## (using an absolute path).
|
|
||||||
##
|
|
||||||
#authzfile =
|
|
||||||
|
|
||||||
## force_username_case: Like the AuthzForceUsernameCase httpd.conf
|
|
||||||
## directive, set this to "upper" or "lower" to force the normalization
|
|
||||||
## to upper- or lower-case, respectively, of incoming usernames prior
|
|
||||||
## to comparison against the authorization rules files. Leave the
|
|
||||||
## option unset to preserve the username case.
|
|
||||||
##
|
|
||||||
#force_username_case =
|
|
||||||
|
|
||||||
##---------------------------------------------------------------------------
|
|
@@ -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>
|
|
@@ -161,6 +161,12 @@ td {
|
|||||||
resource. Valid only when <var>pathtype</var> is <tt>file</tt>
|
resource. Valid only when <var>pathtype</var> is <tt>file</tt>
|
||||||
or (for Subversion roots) <tt>dir</tt>.</td>
|
or (for Subversion roots) <tt>dir</tt>.</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<tr class="varlevel1">
|
||||||
|
<td class="varname">log_rev_href</td>
|
||||||
|
<td>String</td>
|
||||||
|
<td>Revision number of the file-revision currently being viewed, or
|
||||||
|
None.</td>
|
||||||
|
</tr>
|
||||||
<tr class="varlevel1">
|
<tr class="varlevel1">
|
||||||
<td class="varname">nav_path</td>
|
<td class="varname">nav_path</td>
|
||||||
<td>List</td>
|
<td>List</td>
|
||||||
@@ -315,7 +321,7 @@ td {
|
|||||||
<tr class="varlevel1">
|
<tr class="varlevel1">
|
||||||
<td class="varname">pathrev_hidden_values</td>
|
<td class="varname">pathrev_hidden_values</td>
|
||||||
<td>List</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>
|
||||||
<tr class="varlevel1">
|
<tr class="varlevel1">
|
||||||
<td class="varname">pathrev_clear_action</td>
|
<td class="varname">pathrev_clear_action</td>
|
||||||
@@ -325,7 +331,7 @@ td {
|
|||||||
<tr class="varlevel1">
|
<tr class="varlevel1">
|
||||||
<td class="varname">pathrev_clear_hidden_values</td>
|
<td class="varname">pathrev_clear_hidden_values</td>
|
||||||
<td>List</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>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
@@ -444,10 +450,10 @@ td {
|
|||||||
<tr class="varlevel1">
|
<tr class="varlevel1">
|
||||||
<td class="varname">annotation</td>
|
<td class="varname">annotation</td>
|
||||||
<td>String</td>
|
<td>String</td>
|
||||||
<td>Valid values are "none" (no annotations were attempted),
|
<td>If set, indicates that annotations were requested. Valid values
|
||||||
"annotated" (annotation was successful), "binary" (file contents
|
are "annotated" (annotation was successful), "binary" (file contents
|
||||||
are not line-based and human-readable), and "error" (something
|
are not line-based and human-readable), and "error" (something went
|
||||||
went wrong during annotation).</td>
|
wrong during annotation).</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr class="varlevel1">
|
<tr class="varlevel1">
|
||||||
<td class="varname">author</td>
|
<td class="varname">author</td>
|
||||||
@@ -598,45 +604,6 @@ td {
|
|||||||
<td colspan="3">Includes all variables from the
|
<td colspan="3">Includes all variables from the
|
||||||
<a href="#variables-common">COMMON</a> variable set</td>
|
<a href="#variables-common">COMMON</a> variable set</td>
|
||||||
</tr>
|
</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">
|
<tr class="varlevel1">
|
||||||
<td class="varname">imagemap</td>
|
<td class="varname">imagemap</td>
|
||||||
<td>String</td>
|
<td>String</td>
|
||||||
@@ -649,37 +616,6 @@ td {
|
|||||||
<td>URL of the ViewVC revision graph image for the current
|
<td>URL of the ViewVC revision graph image for the current
|
||||||
resource.</td>
|
resource.</td>
|
||||||
</tr>
|
</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>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
@@ -789,7 +725,7 @@ td {
|
|||||||
<tr class="varlevel1">
|
<tr class="varlevel1">
|
||||||
<td class="varname">diff_format_hidden_values</td>
|
<td class="varname">diff_format_hidden_values</td>
|
||||||
<td>List</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>
|
||||||
<tr class="varlevel1">
|
<tr class="varlevel1">
|
||||||
<td class="varname">left</td>
|
<td class="varname">left</td>
|
||||||
@@ -969,7 +905,7 @@ td {
|
|||||||
<tr class="varlevel1">
|
<tr class="varlevel1">
|
||||||
<td class="varname">dir_paging_hidden_values</td>
|
<td class="varname">dir_paging_hidden_values</td>
|
||||||
<td>List</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>
|
||||||
<tr class="varlevel1">
|
<tr class="varlevel1">
|
||||||
<td class="varname">entries</td>
|
<td class="varname">entries</td>
|
||||||
@@ -1151,16 +1087,23 @@ td {
|
|||||||
<td>String</td>
|
<td>String</td>
|
||||||
<td>Current search expression, if any.</td>
|
<td>Current search expression, if any.</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<tr class="varlevel1">
|
||||||
|
<td class="varname">search_re_form</td>
|
||||||
|
<td>Boolean</td>
|
||||||
|
<td>Indicates whether or not to display the regular expression search
|
||||||
|
form. Value depends on the whether searching is enabled in the
|
||||||
|
configuration and whether or not the current directory is
|
||||||
|
empty.</td>
|
||||||
|
</tr>
|
||||||
<tr class="varlevel1">
|
<tr class="varlevel1">
|
||||||
<td class="varname">search_re_action</td>
|
<td class="varname">search_re_action</td>
|
||||||
<td>String</td>
|
<td>String</td>
|
||||||
<td>Form action URL for the regular expression search form,
|
<td>Form action URL for the regular expression search form.</td>
|
||||||
if searching is available.</td>
|
|
||||||
</tr>
|
</tr>
|
||||||
<tr class="varlevel1">
|
<tr class="varlevel1">
|
||||||
<td class="varname">search_re_hidden_values</td>
|
<td class="varname">search_re_hidden_values</td>
|
||||||
<td>List</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>
|
||||||
<tr class="varlevel1">
|
<tr class="varlevel1">
|
||||||
<td class="varname">show_attic_href</td>
|
<td class="varname">show_attic_href</td>
|
||||||
@@ -1306,7 +1249,7 @@ td {
|
|||||||
<tr class="varlevel1">
|
<tr class="varlevel1">
|
||||||
<td class="varname">diff_select_hidden_values</td>
|
<td class="varname">diff_select_hidden_values</td>
|
||||||
<td>List</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>
|
||||||
<tr class="varlevel1">
|
<tr class="varlevel1">
|
||||||
<td class="varname">entries</td>
|
<td class="varname">entries</td>
|
||||||
@@ -1587,7 +1530,7 @@ td {
|
|||||||
<tr class="varlevel1">
|
<tr class="varlevel1">
|
||||||
<td class="varname">log_paging_hidden_values</td>
|
<td class="varname">log_paging_hidden_values</td>
|
||||||
<td>List</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>
|
||||||
<tr class="varlevel1">
|
<tr class="varlevel1">
|
||||||
<td class="varname">logsort</td>
|
<td class="varname">logsort</td>
|
||||||
@@ -1603,7 +1546,7 @@ td {
|
|||||||
<tr class="varlevel1">
|
<tr class="varlevel1">
|
||||||
<td class="varname">logsort_hidden_values</td>
|
<td class="varname">logsort_hidden_values</td>
|
||||||
<td>List</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>
|
||||||
<tr class="varlevel1">
|
<tr class="varlevel1">
|
||||||
<td class="varname">mime_type</td>
|
<td class="varname">mime_type</td>
|
||||||
@@ -1967,7 +1910,7 @@ td {
|
|||||||
<tr class="varlevel1">
|
<tr class="varlevel1">
|
||||||
<td class="varname">query_hidden_values</td>
|
<td class="varname">query_hidden_values</td>
|
||||||
<td>List</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>
|
||||||
<tr class="varlevel1">
|
<tr class="varlevel1">
|
||||||
<td class="varname">querysort</td>
|
<td class="varname">querysort</td>
|
||||||
@@ -2107,7 +2050,7 @@ td {
|
|||||||
<tr class="varlevel1">
|
<tr class="varlevel1">
|
||||||
<td class="varname">jump_rev_hidden_values</td>
|
<td class="varname">jump_rev_hidden_values</td>
|
||||||
<td>List</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>
|
||||||
<tr class="varlevel1">
|
<tr class="varlevel1">
|
||||||
<td class="varname">limit_changes</td>
|
<td class="varname">limit_changes</td>
|
||||||
@@ -2130,11 +2073,6 @@ td {
|
|||||||
<td>String</td>
|
<td>String</td>
|
||||||
<td>URL for the current view but with <tt>limit_changes</tt> disabled.</td>
|
<td>URL for the current view but with <tt>limit_changes</tt> disabled.</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr class="varlevel1">
|
|
||||||
<td class="varname">num_changes</td>
|
|
||||||
<td>String</td>
|
|
||||||
<td>Number of paths changed in this revision.</td>
|
|
||||||
</tr>
|
|
||||||
<tr class="varlevel1">
|
<tr class="varlevel1">
|
||||||
<td class="varname">next_href</td>
|
<td class="varname">next_href</td>
|
||||||
<td>String</td>
|
<td>String</td>
|
||||||
|
@@ -137,8 +137,9 @@ td {
|
|||||||
configuration's "general" section.</li>
|
configuration's "general" section.</li>
|
||||||
|
|
||||||
<li>Finally, ensure that that the new <code>authorizer</code>
|
<li>Finally, ensure that that the new <code>authorizer</code>
|
||||||
option is set to either "forbidden" or "forbiddenre", depending
|
option is set to either "forbidden" (which is the default) or
|
||||||
on which of those you were using in ViewVC 1.0.x.</li>
|
"forbiddenre", depending on which of those you were using in
|
||||||
|
ViewVC 1.0.x.</li>
|
||||||
|
|
||||||
</ol>
|
</ol>
|
||||||
|
|
||||||
@@ -214,9 +215,10 @@ td {
|
|||||||
<li>options/py2html_path</li>
|
<li>options/py2html_path</li>
|
||||||
<li>options/use_enscript</li>
|
<li>options/use_enscript</li>
|
||||||
<li>options/use_highlight</li>
|
<li>options/use_highlight</li>
|
||||||
<li>options/use_pagesize</li>
|
|
||||||
<li>options/use_php</li>
|
<li>options/use_php</li>
|
||||||
<li>options/use_py2html</li>
|
<li>options/use_py2html</li>
|
||||||
|
<li>options/use_pygments</li>
|
||||||
|
<li>options/use_source_highlight</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
@@ -224,23 +226,16 @@ td {
|
|||||||
<div class="h3">
|
<div class="h3">
|
||||||
<h3>Checkin Database</h3>
|
<h3>Checkin Database</h3>
|
||||||
|
|
||||||
<p>ViewVC 1.1 introduces to the <code>cvsdbadmin</code>
|
<p>In ViewVC 1.1, the <code>svndbadmin</code> program's "rebuild"
|
||||||
and <code>svndbadmin</code> tools a new "purge" operation, which
|
subcommand has had its purpose become more defined. It no longer
|
||||||
allows you to remove all the information related to a given root
|
accepts a revision argument, and therefore can now only be used to
|
||||||
from your checkins database (without disturbing the information
|
completely rebuild the entirety of the checkin database information
|
||||||
associated with other roots). Likewise, the "rebuild" command in
|
for a Subversion repository (instead of being able to only update
|
||||||
those tools now implies a "purge" followed by an update.</p>
|
the information related to single Subversion revision). For
|
||||||
|
per-revision updating, use <code>svndbadmin update</code> and
|
||||||
<p>As a related change, the <code>svndbadmin</code> program's
|
|
||||||
"rebuild" subcommand has had its purpose become more defined. It
|
|
||||||
no longer accepts a revision argument, and therefore can now only
|
|
||||||
be used to completely rebuild the entirety of the checkin database
|
|
||||||
information for a Subversion repository (instead of being able to
|
|
||||||
only update the information related to single Subversion revision).
|
|
||||||
For per-revision updating, use <code>svndbadmin update</code> and
|
|
||||||
provide a revision (or revision range). And to get the previous
|
provide a revision (or revision range). And to get the previous
|
||||||
rebuild-a-revision effect, pass the new <code>--force</code> option
|
rebuild-a-revision effect, pass the new <code>--force</code>
|
||||||
to <code>svndbadmin update</code>.</p>
|
option to <code>svndbadmin update</code>.</p>
|
||||||
|
|
||||||
<p>In other words, where you once did this:</p>
|
<p>In other words, where you once did this:</p>
|
||||||
|
|
||||||
@@ -254,19 +249,6 @@ td {
|
|||||||
</pre>
|
</pre>
|
||||||
</blockquote>
|
</blockquote>
|
||||||
|
|
||||||
<p>To enhance the performance of the new "purge" operation, ViewVC 1.1
|
|
||||||
introduces some slight changes to the checkin database schema. If
|
|
||||||
you use the <code>make-database</code> tool to (re)create your
|
|
||||||
checkins database, it will by default employ the new database
|
|
||||||
schema. This should cause the database to be virtually unusable by
|
|
||||||
previous versions of ViewVC, and that's by design. If, however,
|
|
||||||
you need to (re)create your checkins database and you require
|
|
||||||
compatibility with previous versions of ViewVC or ViewCVS, simply
|
|
||||||
pass the "--version=1.0" option to the <code>make-database</code>
|
|
||||||
script. Note that your "purge" and "rebuild" operations could be
|
|
||||||
abysmally slow, though, as that version of the database schema is
|
|
||||||
not optimized for those operations.</p>
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="h3">
|
<div class="h3">
|
||||||
@@ -314,22 +296,6 @@ td {
|
|||||||
<li>options/allow_tar</li>
|
<li>options/allow_tar</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<p>ViewVC now honors the "svn:mime-type" property stored on
|
|
||||||
Subversion-versioned files as the primary source of MIME type
|
|
||||||
determination (before falling back to name-based MIME mappings and
|
|
||||||
such). However, this can negatively affect the viewability of
|
|
||||||
certain files — especially images — whose
|
|
||||||
"svn:mime-type" properties are set incorrectly, such as will happen
|
|
||||||
if Subversion itself merely determines that the file isn't
|
|
||||||
human-readable and uses the "application/octet-stream" MIME type to
|
|
||||||
record this determination. To make ViewVC <em>not</em> honor the
|
|
||||||
"svn:mime-type" property value, set the <code>svn_ignore_mimetype</code>
|
|
||||||
configuration option.</p>
|
|
||||||
|
|
||||||
<p>Speaking of MIME types, the option <code>mime_types_file</code> is
|
|
||||||
now <code>mime_types_files</code>, as it now carries multiple paths
|
|
||||||
to MIME mappings files, ordered by preference.</p>
|
|
||||||
|
|
||||||
<p>The <code>use_rcsparse</code> option was moved from the "general"
|
<p>The <code>use_rcsparse</code> option was moved from the "general"
|
||||||
section to the "options" section.</p>
|
section to the "options" section.</p>
|
||||||
|
|
||||||
@@ -665,11 +631,6 @@ allow_tar = 1
|
|||||||
<td>revision.ezt</td>
|
<td>revision.ezt</td>
|
||||||
<td>now is an iterable list of objects with .name and .value attributes</td>
|
<td>now is an iterable list of objects with .name and .value attributes</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr class="added">
|
|
||||||
<td class="varname">num_changes</td>
|
|
||||||
<td>revision.ezt</td>
|
|
||||||
<td>added</td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
@@ -698,7 +659,7 @@ allow_tar = 1
|
|||||||
<h3>Checkin Database</h3>
|
<h3>Checkin Database</h3>
|
||||||
|
|
||||||
<p>ViewVC 1.0 reads and writes commit times in the MySQL database in
|
<p>ViewVC 1.0 reads and writes commit times in the MySQL database in
|
||||||
UTC time rather than local time. This can cause times displayed on
|
UTC time rather than local time. This can cause times displayed on
|
||||||
the query page to be a few hours off if an old database is being
|
the query page to be a few hours off if an old database is being
|
||||||
used with a new version of ViewVC. The best way to fix this is to
|
used with a new version of ViewVC. The best way to fix this is to
|
||||||
rebuild the database with the new version of cvsdbadmin, but it
|
rebuild the database with the new version of cvsdbadmin, but it
|
||||||
@@ -741,8 +702,7 @@ allow_tar = 1
|
|||||||
<li>options/root_as_url_component</li>
|
<li>options/root_as_url_component</li>
|
||||||
<li>options/default_file_view</li>
|
<li>options/default_file_view</li>
|
||||||
<li>options/sort_group_dirs</li>
|
<li>options/sort_group_dirs</li>
|
||||||
<li>options/dir_pagesize</li>
|
<li>options/use_pagesize</li>
|
||||||
<li>options/log_pagesize</li>
|
|
||||||
<li>options/limit_changes</li>
|
<li>options/limit_changes</li>
|
||||||
<li>options/use_localtime</li>
|
<li>options/use_localtime</li>
|
||||||
<li>options/cross_copies</li>
|
<li>options/cross_copies</li>
|
||||||
|
@@ -654,35 +654,6 @@ th.caption {
|
|||||||
<td>depends</td>
|
<td>depends</td>
|
||||||
<td><a href="#root-param"><code>root</code> parameter</a></td>
|
<td><a href="#root-param"><code>root</code> parameter</a></td>
|
||||||
</tr>
|
</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>
|
</table>
|
||||||
|
|
||||||
<h3 id="graphimg-view">Graph Image View</h3>
|
<h3 id="graphimg-view">Graph Image View</h3>
|
||||||
@@ -729,35 +700,6 @@ th.caption {
|
|||||||
<td>depends</td>
|
<td>depends</td>
|
||||||
<td><a href="#root-param"><code>root</code> parameter</a></td>
|
<td><a href="#root-param"><code>root</code> parameter</a></td>
|
||||||
</tr>
|
</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>
|
</table>
|
||||||
|
|
||||||
<h3 id="log-view">Log View</h3>
|
<h3 id="log-view">Log View</h3>
|
||||||
@@ -1054,7 +996,7 @@ th.caption {
|
|||||||
<td>file query string</td>
|
<td>file query string</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td><code>file_match=<var>FILE_MATCH</var></code></td>
|
<td><code>file_match=FILE_MATCH</code></td>
|
||||||
<td>optional</td>
|
<td>optional</td>
|
||||||
<td>"exact" "like" "glob" "regex" or "notregex" determining type
|
<td>"exact" "like" "glob" "regex" or "notregex" determining type
|
||||||
of file match</td>
|
of file match</td>
|
||||||
@@ -1065,7 +1007,7 @@ th.caption {
|
|||||||
<td>author query string</td>
|
<td>author query string</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td><code>who_match=<var>WHO_MATCH</var></code></td>
|
<td><code>who_match=WHO_MATCH</code></td>
|
||||||
<td>optional</td>
|
<td>optional</td>
|
||||||
<td>"exact" "like" "glob" "regex" or "notregex" determining type
|
<td>"exact" "like" "glob" "regex" or "notregex" determining type
|
||||||
of author match</td>
|
of author match</td>
|
||||||
@@ -1082,36 +1024,36 @@ th.caption {
|
|||||||
of log message match</td>
|
of log message match</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td><code>querysort=<var>SORT</var></code></td>
|
<td><code>querysort=SORT</code></td>
|
||||||
<td>optional</td>
|
<td>optional</td>
|
||||||
<td>"date" "author" or "file" determining order of query results</td>
|
<td>"date" "author" or "file" determining order of query results</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td><code>date=<var>DATE</var></code></td>
|
<td><code>date=DATE</code></td>
|
||||||
<td>optional</td>
|
<td>optional</td>
|
||||||
<td>"hours" "day" "week" "month" "all" or "explicit" to filter
|
<td>"hours" "day" "week" "month" "all" or "explicit" to filter
|
||||||
query results by date</td>
|
query results by date</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td><code>hours=<var>HOURS</var></code></td>
|
<td><code>hours=HOURS</code></td>
|
||||||
<td>optional</td>
|
<td>optional</td>
|
||||||
<td>number of hours back to include results from when
|
<td>number of hours back to include results from when
|
||||||
<code><var>DATE</var></code> is "hours"</td>
|
<code><var>DATE</var></code> is "hours"</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td><code>mindate=<var>MINDATE</var></code></td>
|
<td><code>mindate=MINDATE</code></td>
|
||||||
<td>optional</td>
|
<td>optional</td>
|
||||||
<td>earliest date to include results from when
|
<td>earliest date to include results from when
|
||||||
<code><var>DATE</var></code> is "explicit"</td>
|
<code><var>DATE</var></code> is "explicit"</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td><code>maxdate=<var>MAXDATE</var></code></td>
|
<td><code>maxdate=MAXDATE</code></td>
|
||||||
<td>optional</td>
|
<td>optional</td>
|
||||||
<td>latest date to include results from when
|
<td>latest date to include results from when
|
||||||
<code><var>DATE</var></code> is "explicit"</td>
|
<code><var>DATE</var></code> is "explicit"</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td><code>limit_changes=<var>LIMIT_CHANGES</var></code></td>
|
<td><code>limit_changes=LIMIT_CHANGES</code></td>
|
||||||
<td>optional</td>
|
<td>optional</td>
|
||||||
<td>maximum number of files to list per commit in query
|
<td>maximum number of files to list per commit in query
|
||||||
results. Default is value of <code>limit_changes</code>
|
results. Default is value of <code>limit_changes</code>
|
||||||
@@ -1171,7 +1113,7 @@ th.caption {
|
|||||||
<td>branch query string</td>
|
<td>branch query string</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td><code>branch_match=<var>BRANCH_MATCH</var></code></td>
|
<td><code>branch_match=BRANCH_MATCH</code></td>
|
||||||
<td>optional</td>
|
<td>optional</td>
|
||||||
<td>"exact" "like" "glob" "regex" or "notregex" determining type
|
<td>"exact" "like" "glob" "regex" or "notregex" determining type
|
||||||
of branch match</td>
|
of branch match</td>
|
||||||
@@ -1187,7 +1129,7 @@ th.caption {
|
|||||||
<td>file query string</td>
|
<td>file query string</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td><code>file_match=<var>FILE_MATCH</var></code></td>
|
<td><code>file_match=FILE_MATCH</code></td>
|
||||||
<td>optional</td>
|
<td>optional</td>
|
||||||
<td>"exact" "like" "glob" "regex" or "notregex" determining type
|
<td>"exact" "like" "glob" "regex" or "notregex" determining type
|
||||||
of file match</td>
|
of file match</td>
|
||||||
@@ -1198,7 +1140,7 @@ th.caption {
|
|||||||
<td>author query string</td>
|
<td>author query string</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td><code>who_match=<var>WHO_MATCH</var></code></td>
|
<td><code>who_match=WHO_MATCH</code></td>
|
||||||
<td>optional</td>
|
<td>optional</td>
|
||||||
<td>"exact" "like" "glob" "regex" or "notregex" determining type
|
<td>"exact" "like" "glob" "regex" or "notregex" determining type
|
||||||
of author match</td>
|
of author match</td>
|
||||||
@@ -1215,50 +1157,50 @@ th.caption {
|
|||||||
of log message match</td>
|
of log message match</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td><code>querysort=<var>SORT</var></code></td>
|
<td><code>querysort=SORT</code></td>
|
||||||
<td>optional</td>
|
<td>optional</td>
|
||||||
<td>"date" "author" or "file" determining order of query results</td>
|
<td>"date" "author" or "file" determining order of query results</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td><code>date=<var>DATE</var></code></td>
|
<td><code>date=DATE</code></td>
|
||||||
<td>optional</td>
|
<td>optional</td>
|
||||||
<td>"hours" "day" "week" "month" "all" or "explicit" to filter
|
<td>"hours" "day" "week" "month" "all" or "explicit" to filter
|
||||||
query results by date</td>
|
query results by date</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td><code>hours=<var>HOURS</var></code></td>
|
<td><code>hours=HOURS</code></td>
|
||||||
<td>optional</td>
|
<td>optional</td>
|
||||||
<td>number of hours back to include results from when
|
<td>number of hours back to include results from when
|
||||||
<code><var>DATE</var></code> is "hours"</td>
|
<code><var>DATE</var></code> is "hours"</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td><code>mindate=<var>MINDATE</var></code></td>
|
<td><code>mindate=MINDATE</code></td>
|
||||||
<td>optional</td>
|
<td>optional</td>
|
||||||
<td>earliest date to include results from when
|
<td>earliest date to include results from when
|
||||||
<code><var>DATE</var></code> is "explicit"</td>
|
<code><var>DATE</var></code> is "explicit"</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td><code>maxdate=<var>MAXDATE</var></code></td>
|
<td><code>maxdate=MAXDATE</code></td>
|
||||||
<td>optional</td>
|
<td>optional</td>
|
||||||
<td>latest date to include results from when
|
<td>latest date to include results from when
|
||||||
<code><var>DATE</var></code> is "explicit"</td>
|
<code><var>DATE</var></code> is "explicit"</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td><code>format=<var>FORMAT</var></code></td>
|
<td><code>format=FORMAT</code></td>
|
||||||
<td>optional</td>
|
<td>optional</td>
|
||||||
<td>"rss" or "backout" values to generate an rss feed or list of
|
<td>"rss" or "backout" values to generate an rss feed or list of
|
||||||
commands to back out changes instead showing a normal query result
|
commands to back out changes instead showing a normal query result
|
||||||
page</td>
|
page</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td><code>limit=<var>LIMIT</var></code></td>
|
<td><code>limit=LIMIT</code></td>
|
||||||
<td>optional</td>
|
<td>optional</td>
|
||||||
<td>maximum number of file-revisions to process during a
|
<td>maximum number of file-revisions to process during a
|
||||||
query. Default is value of <code>row_limit</code> configuration
|
query. Default is value of <code>row_limit</code> configuration
|
||||||
option</td>
|
option</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td><code>limit_changes=<var>LIMIT_CHANGES</var></code></td>
|
<td><code>limit_changes=LIMIT_CHANGES</code></td>
|
||||||
<td>optional</td>
|
<td>optional</td>
|
||||||
<td>maximum number of files to list per commit in query
|
<td>maximum number of files to list per commit in query
|
||||||
results. Default is value of <code>limit_changes</code>
|
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>
|
<td><a href="#revision-param"><code>revision</code> parameter</a></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td><code>limit_changes=<var>LIMIT_CHANGES</var></code></td>
|
<td><code>limit_changes=LIMIT_CHANGES</code></td>
|
||||||
<td>optional</td>
|
<td>optional</td>
|
||||||
<td>maximum number of files to list per commit. Default is value
|
<td>maximum number of files to list per commit. Default is value
|
||||||
of <code>limit_changes</code> configuration option</td>
|
of <code>limit_changes</code> configuration option</td>
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
# -*-python-*-
|
# -*-python-*-
|
||||||
#
|
#
|
||||||
# Copyright (C) 1999-2009 The ViewCVS Group. All Rights Reserved.
|
# Copyright (C) 1999-2006 The ViewCVS Group. All Rights Reserved.
|
||||||
#
|
#
|
||||||
# By using this file, you agree to the terms and conditions set forth in
|
# By using this file, you agree to the terms and conditions set forth in
|
||||||
# the LICENSE.html file which can be found at the top level of the ViewVC
|
# the LICENSE.html file which can be found at the top level of the ViewVC
|
||||||
@@ -39,7 +39,7 @@ def _parse(hdr, result):
|
|||||||
while pos < len(hdr):
|
while pos < len(hdr):
|
||||||
name = _re_token.match(hdr, pos)
|
name = _re_token.match(hdr, pos)
|
||||||
if not name:
|
if not name:
|
||||||
raise AcceptLanguageParseError()
|
raise AcceptParseError()
|
||||||
a = result.item_class(string.lower(name.group(1)))
|
a = result.item_class(string.lower(name.group(1)))
|
||||||
pos = name.end()
|
pos = name.end()
|
||||||
while 1:
|
while 1:
|
||||||
@@ -210,7 +210,7 @@ class _LanguageSelector:
|
|||||||
def append(self, item):
|
def append(self, item):
|
||||||
self.requested.append(item)
|
self.requested.append(item)
|
||||||
|
|
||||||
class AcceptLanguageParseError(Exception):
|
class AcceptParseError(Exception):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def _test():
|
def _test():
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
# -*-python-*-
|
# -*-python-*-
|
||||||
#
|
#
|
||||||
# Copyright (C) 1999-2008 The ViewCVS Group. All Rights Reserved.
|
# Copyright (C) 1999-2007 The ViewCVS Group. All Rights Reserved.
|
||||||
# Copyright (C) 2000 Curt Hagenlocher <curt@hagenlocher.org>
|
# Copyright (C) 2000 Curt Hagenlocher <curt@hagenlocher.org>
|
||||||
#
|
#
|
||||||
# By using this file, you agree to the terms and conditions set forth in
|
# By using this file, you agree to the terms and conditions set forth in
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
# -*-python-*-
|
# -*-python-*-
|
||||||
#
|
#
|
||||||
# Copyright (C) 1999-2009 The ViewCVS Group. All Rights Reserved.
|
# Copyright (C) 1999-2008 The ViewCVS Group. All Rights Reserved.
|
||||||
#
|
#
|
||||||
# By using this file, you agree to the terms and conditions set forth in
|
# By using this file, you agree to the terms and conditions set forth in
|
||||||
# the LICENSE.html file which can be found at the top level of the ViewVC
|
# the LICENSE.html file which can be found at the top level of the ViewVC
|
||||||
@@ -40,7 +40,7 @@ import fnmatch
|
|||||||
class Config:
|
class Config:
|
||||||
_sections = ('general', 'utilities', 'options', 'cvsdb', 'templates')
|
_sections = ('general', 'utilities', 'options', 'cvsdb', 'templates')
|
||||||
_force_multi_value = ('cvs_roots', 'svn_roots', 'languages', 'kv_files',
|
_force_multi_value = ('cvs_roots', 'svn_roots', 'languages', 'kv_files',
|
||||||
'root_parents', 'allowed_views', 'mime_types_files')
|
'root_parents', 'allowed_views')
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
for section in self._sections:
|
for section in self._sections:
|
||||||
@@ -197,7 +197,7 @@ class Config:
|
|||||||
self.general.svn_roots = { }
|
self.general.svn_roots = { }
|
||||||
self.general.root_parents = []
|
self.general.root_parents = []
|
||||||
self.general.default_root = ''
|
self.general.default_root = ''
|
||||||
self.general.mime_types_files = ["mimetypes.conf"]
|
self.general.mime_types_file = ''
|
||||||
self.general.address = ''
|
self.general.address = ''
|
||||||
self.general.kv_files = [ ]
|
self.general.kv_files = [ ]
|
||||||
self.general.languages = ['en-us']
|
self.general.languages = ['en-us']
|
||||||
@@ -213,13 +213,12 @@ class Config:
|
|||||||
|
|
||||||
self.options.root_as_url_component = 1
|
self.options.root_as_url_component = 1
|
||||||
self.options.checkout_magic = 0
|
self.options.checkout_magic = 0
|
||||||
self.options.allowed_views = ['annotate', 'diff', 'markup', 'roots']
|
self.options.allowed_views = ['markup', 'annotate', 'roots']
|
||||||
self.options.authorizer = None
|
self.options.authorizer = 'forbidden'
|
||||||
self.options.mangle_email_addresses = 0
|
self.options.mangle_email_addresses = 0
|
||||||
self.options.default_file_view = "log"
|
self.options.default_file_view = "log"
|
||||||
self.options.http_expiration_time = 600
|
self.options.http_expiration_time = 600
|
||||||
self.options.generate_etags = 1
|
self.options.generate_etags = 1
|
||||||
self.options.svn_ignore_mimetype = 0
|
|
||||||
self.options.svn_config_dir = None
|
self.options.svn_config_dir = None
|
||||||
self.options.use_rcsparse = 0
|
self.options.use_rcsparse = 0
|
||||||
self.options.sort_by = 'file'
|
self.options.sort_by = 'file'
|
||||||
@@ -244,13 +243,10 @@ class Config:
|
|||||||
self.options.use_localtime = 0
|
self.options.use_localtime = 0
|
||||||
self.options.short_log_len = 80
|
self.options.short_log_len = 80
|
||||||
self.options.enable_syntax_coloration = 1
|
self.options.enable_syntax_coloration = 1
|
||||||
self.options.detect_encoding = 0
|
|
||||||
self.options.use_cvsgraph = 0
|
self.options.use_cvsgraph = 0
|
||||||
self.options.cvsgraph_conf = "cvsgraph.conf"
|
self.options.cvsgraph_conf = "cvsgraph.conf"
|
||||||
self.options.allowed_cvsgraph_useropts = []
|
|
||||||
self.options.use_re_search = 0
|
self.options.use_re_search = 0
|
||||||
self.options.dir_pagesize = 0
|
self.options.use_pagesize = 0
|
||||||
self.options.log_pagesize = 0
|
|
||||||
self.options.limit_changes = 100
|
self.options.limit_changes = 100
|
||||||
|
|
||||||
self.templates.diff = None
|
self.templates.diff = None
|
||||||
|
196
lib/cvsdb.py
196
lib/cvsdb.py
@@ -1,6 +1,6 @@
|
|||||||
# -*-python-*-
|
# -*-python-*-
|
||||||
#
|
#
|
||||||
# Copyright (C) 1999-2009 The ViewCVS Group. All Rights Reserved.
|
# Copyright (C) 1999-2007 The ViewCVS Group. All Rights Reserved.
|
||||||
#
|
#
|
||||||
# By using this file, you agree to the terms and conditions set forth in
|
# By using this file, you agree to the terms and conditions set forth in
|
||||||
# the LICENSE.html file which can be found at the top level of the ViewVC
|
# the LICENSE.html file which can be found at the top level of the ViewVC
|
||||||
@@ -20,14 +20,6 @@ import re
|
|||||||
import vclib
|
import vclib
|
||||||
import dbi
|
import dbi
|
||||||
|
|
||||||
## Current commits database schema version number.
|
|
||||||
##
|
|
||||||
## Version 0 was the original Bonsai-compatible version.
|
|
||||||
##
|
|
||||||
## Version 1 added the 'metadata' table (which holds the 'version' key)
|
|
||||||
## and renamed all the 'repository'-related stuff to be 'root'-
|
|
||||||
##
|
|
||||||
CURRENT_SCHEMA_VERSION = 1
|
|
||||||
|
|
||||||
## error
|
## error
|
||||||
error = "cvsdb error"
|
error = "cvsdb error"
|
||||||
@@ -45,7 +37,6 @@ class CheckinDatabase:
|
|||||||
self._passwd = passwd
|
self._passwd = passwd
|
||||||
self._database = database
|
self._database = database
|
||||||
self._row_limit = row_limit
|
self._row_limit = row_limit
|
||||||
self._version = None
|
|
||||||
|
|
||||||
## database lookup caches
|
## database lookup caches
|
||||||
self._get_cache = {}
|
self._get_cache = {}
|
||||||
@@ -57,19 +48,6 @@ class CheckinDatabase:
|
|||||||
self._host, self._port, self._user, self._passwd, self._database)
|
self._host, self._port, self._user, self._passwd, self._database)
|
||||||
cursor = self.db.cursor()
|
cursor = self.db.cursor()
|
||||||
cursor.execute("SET AUTOCOMMIT=1")
|
cursor.execute("SET AUTOCOMMIT=1")
|
||||||
table_list = self.GetTableList()
|
|
||||||
if 'metadata' in table_list:
|
|
||||||
version = self.GetMetadataValue("version")
|
|
||||||
if version is None:
|
|
||||||
self._version = 0
|
|
||||||
else:
|
|
||||||
self._version = int(version)
|
|
||||||
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))
|
|
||||||
|
|
||||||
def sql_get_id(self, table, column, value, auto_set):
|
def sql_get_id(self, table, column, value, auto_set):
|
||||||
sql = "SELECT id FROM %s WHERE %s=%%s" % (table, column)
|
sql = "SELECT id FROM %s WHERE %s=%%s" % (table, column)
|
||||||
@@ -169,42 +147,6 @@ class CheckinDatabase:
|
|||||||
|
|
||||||
return list
|
return list
|
||||||
|
|
||||||
def GetTableList(self):
|
|
||||||
sql = "SHOW TABLES"
|
|
||||||
cursor = self.db.cursor()
|
|
||||||
cursor.execute(sql)
|
|
||||||
list = []
|
|
||||||
while 1:
|
|
||||||
row = cursor.fetchone()
|
|
||||||
if row == None:
|
|
||||||
break
|
|
||||||
list.append(row[0])
|
|
||||||
return list
|
|
||||||
|
|
||||||
def GetMetadataValue(self, name):
|
|
||||||
sql = "SELECT value FROM metadata WHERE name=%s"
|
|
||||||
sql_args = (name)
|
|
||||||
cursor = self.db.cursor()
|
|
||||||
cursor.execute(sql, sql_args)
|
|
||||||
try:
|
|
||||||
(value,) = cursor.fetchone()
|
|
||||||
except TypeError:
|
|
||||||
return None
|
|
||||||
return value
|
|
||||||
|
|
||||||
def SetMetadataValue(self, name, value):
|
|
||||||
assert(self._version > 0)
|
|
||||||
sql = "REPLACE INTO metadata (name, value) VALUES (%s, %s)"
|
|
||||||
sql_args = (name, value)
|
|
||||||
cursor = self.db.cursor()
|
|
||||||
try:
|
|
||||||
cursor.execute(sql, sql_args)
|
|
||||||
except Exception, e:
|
|
||||||
raise Exception("Error setting metadata: '%s'\n"
|
|
||||||
"\tname = %s\n"
|
|
||||||
"\tvalue = %s\n"
|
|
||||||
% (str(e), name, value))
|
|
||||||
|
|
||||||
def GetBranchID(self, branch, auto_set = 1):
|
def GetBranchID(self, branch, auto_set = 1):
|
||||||
return self.get_id("branches", "branch", branch, auto_set)
|
return self.get_id("branches", "branch", branch, auto_set)
|
||||||
|
|
||||||
@@ -309,9 +251,7 @@ class CheckinDatabase:
|
|||||||
minus_count = commit.GetMinusCount() or '0'
|
minus_count = commit.GetMinusCount() or '0'
|
||||||
description_id = self.GetDescriptionID(commit.GetDescription())
|
description_id = self.GetDescriptionID(commit.GetDescription())
|
||||||
|
|
||||||
commits_table = self._version >= 1 and 'commits' or 'checkins'
|
sql = "REPLACE INTO checkins"\
|
||||||
sql = "REPLACE INTO %s" % (commits_table)
|
|
||||||
sql = sql + \
|
|
||||||
" (type,ci_when,whoid,repositoryid,dirid,fileid,revision,"\
|
" (type,ci_when,whoid,repositoryid,dirid,fileid,revision,"\
|
||||||
" stickytag,branchid,addedlines,removedlines,descid)"\
|
" stickytag,branchid,addedlines,removedlines,descid)"\
|
||||||
"VALUES(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)"
|
"VALUES(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)"
|
||||||
@@ -364,69 +304,58 @@ class CheckinDatabase:
|
|||||||
return "(%s)" % (string.join(sqlList, " OR "))
|
return "(%s)" % (string.join(sqlList, " OR "))
|
||||||
|
|
||||||
def CreateSQLQueryString(self, query):
|
def CreateSQLQueryString(self, query):
|
||||||
commits_table = self._version >= 1 and 'commits' or 'checkins'
|
tableList = [("checkins", None)]
|
||||||
tableList = [(commits_table, None)]
|
|
||||||
condList = []
|
condList = []
|
||||||
|
|
||||||
if len(query.repository_list):
|
if len(query.repository_list):
|
||||||
tableList.append(("repositories",
|
tableList.append(("repositories",
|
||||||
"(%s.repositoryid=repositories.id)"
|
"(checkins.repositoryid=repositories.id)"))
|
||||||
% (commits_table)))
|
|
||||||
temp = self.SQLQueryListString("repositories.repository",
|
temp = self.SQLQueryListString("repositories.repository",
|
||||||
query.repository_list)
|
query.repository_list)
|
||||||
condList.append(temp)
|
condList.append(temp)
|
||||||
|
|
||||||
if len(query.branch_list):
|
if len(query.branch_list):
|
||||||
tableList.append(("branches",
|
tableList.append(("branches", "(checkins.branchid=branches.id)"))
|
||||||
"(%s.branchid=branches.id)" % (commits_table)))
|
|
||||||
temp = self.SQLQueryListString("branches.branch",
|
temp = self.SQLQueryListString("branches.branch",
|
||||||
query.branch_list)
|
query.branch_list)
|
||||||
condList.append(temp)
|
condList.append(temp)
|
||||||
|
|
||||||
if len(query.directory_list):
|
if len(query.directory_list):
|
||||||
tableList.append(("dirs",
|
tableList.append(("dirs", "(checkins.dirid=dirs.id)"))
|
||||||
"(%s.dirid=dirs.id)" % (commits_table)))
|
|
||||||
temp = self.SQLQueryListString("dirs.dir", query.directory_list)
|
temp = self.SQLQueryListString("dirs.dir", query.directory_list)
|
||||||
condList.append(temp)
|
condList.append(temp)
|
||||||
|
|
||||||
if len(query.file_list):
|
if len(query.file_list):
|
||||||
tableList.append(("files",
|
tableList.append(("files", "(checkins.fileid=files.id)"))
|
||||||
"(%s.fileid=files.id)" % (commits_table)))
|
|
||||||
temp = self.SQLQueryListString("files.file", query.file_list)
|
temp = self.SQLQueryListString("files.file", query.file_list)
|
||||||
condList.append(temp)
|
condList.append(temp)
|
||||||
|
|
||||||
if len(query.author_list):
|
if len(query.author_list):
|
||||||
tableList.append(("people",
|
tableList.append(("people", "(checkins.whoid=people.id)"))
|
||||||
"(%s.whoid=people.id)" % (commits_table)))
|
|
||||||
temp = self.SQLQueryListString("people.who", query.author_list)
|
temp = self.SQLQueryListString("people.who", query.author_list)
|
||||||
condList.append(temp)
|
condList.append(temp)
|
||||||
|
|
||||||
if len(query.comment_list):
|
if len(query.comment_list):
|
||||||
tableList.append(("descs",
|
tableList.append(("descs", "(checkins.descid=descs.id)"))
|
||||||
"(%s.descid=descs.id)" % (commits_table)))
|
|
||||||
temp = self.SQLQueryListString("descs.description",
|
temp = self.SQLQueryListString("descs.description",
|
||||||
query.comment_list)
|
query.comment_list)
|
||||||
condList.append(temp)
|
condList.append(temp)
|
||||||
|
|
||||||
if query.from_date:
|
if query.from_date:
|
||||||
temp = "(%s.ci_when>=\"%s\")" \
|
temp = "(checkins.ci_when>=\"%s\")" % (str(query.from_date))
|
||||||
% (commits_table, str(query.from_date))
|
|
||||||
condList.append(temp)
|
condList.append(temp)
|
||||||
|
|
||||||
if query.to_date:
|
if query.to_date:
|
||||||
temp = "(%s.ci_when<=\"%s\")" \
|
temp = "(checkins.ci_when<=\"%s\")" % (str(query.to_date))
|
||||||
% (commits_table, str(query.to_date))
|
|
||||||
condList.append(temp)
|
condList.append(temp)
|
||||||
|
|
||||||
if query.sort == "date":
|
if query.sort == "date":
|
||||||
order_by = "ORDER BY %s.ci_when DESC,descid" % (commits_table)
|
order_by = "ORDER BY checkins.ci_when DESC,descid"
|
||||||
elif query.sort == "author":
|
elif query.sort == "author":
|
||||||
tableList.append(("people",
|
tableList.append(("people", "(checkins.whoid=people.id)"))
|
||||||
"(%s.whoid=people.id)" % (commits_table)))
|
|
||||||
order_by = "ORDER BY people.who,descid"
|
order_by = "ORDER BY people.who,descid"
|
||||||
elif query.sort == "file":
|
elif query.sort == "file":
|
||||||
tableList.append(("files",
|
tableList.append(("files", "(checkins.fileid=files.id)"))
|
||||||
"(%s.fileid=files.id)" % (commits_table)))
|
|
||||||
order_by = "ORDER BY files.file,descid"
|
order_by = "ORDER BY files.file,descid"
|
||||||
|
|
||||||
## exclude duplicates from the table list, and split out join
|
## exclude duplicates from the table list, and split out join
|
||||||
@@ -452,8 +381,8 @@ class CheckinDatabase:
|
|||||||
elif self._row_limit:
|
elif self._row_limit:
|
||||||
limit = "LIMIT %s" % (str(self._row_limit))
|
limit = "LIMIT %s" % (str(self._row_limit))
|
||||||
|
|
||||||
sql = "SELECT %s.* FROM %s %s %s %s" \
|
sql = "SELECT checkins.* FROM %s %s %s %s" % (
|
||||||
% (commits_table, tables, conditions, order_by, limit)
|
tables, conditions, order_by, limit)
|
||||||
|
|
||||||
return sql
|
return sql
|
||||||
|
|
||||||
@@ -504,13 +433,8 @@ class CheckinDatabase:
|
|||||||
if file_id == None:
|
if file_id == None:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
commits_table = self._version >= 1 and 'commits' or 'checkins'
|
sql = "SELECT * FROM checkins WHERE "\
|
||||||
sql = "SELECT * FROM %s WHERE "\
|
" repositoryid=%s AND dirid=%s AND fileid=%s AND revision=%s"
|
||||||
" repositoryid=%%s "\
|
|
||||||
" AND dirid=%%s"\
|
|
||||||
" AND fileid=%%s"\
|
|
||||||
" AND revision=%%s"\
|
|
||||||
% (commits_table)
|
|
||||||
sql_args = (repository_id, dir_id, file_id, commit.GetRevision())
|
sql_args = (repository_id, dir_id, file_id, commit.GetRevision())
|
||||||
|
|
||||||
cursor = self.db.cursor()
|
cursor = self.db.cursor()
|
||||||
@@ -527,72 +451,40 @@ class CheckinDatabase:
|
|||||||
def sql_delete(self, table, key, value, keep_fkey = None):
|
def sql_delete(self, table, key, value, keep_fkey = None):
|
||||||
sql = "DELETE FROM %s WHERE %s=%%s" % (table, key)
|
sql = "DELETE FROM %s WHERE %s=%%s" % (table, key)
|
||||||
sql_args = (value, )
|
sql_args = (value, )
|
||||||
commits_table = self._version >= 1 and 'commits' or 'checkins'
|
|
||||||
if keep_fkey:
|
if keep_fkey:
|
||||||
sql += " AND %s NOT IN (SELECT %s FROM %s WHERE %s = %%s)" \
|
sql += " AND %s NOT IN (SELECT %s FROM checkins WHERE %s = %%s)" \
|
||||||
% (key, keep_fkey, commits_table, keep_fkey)
|
% (key, keep_fkey, keep_fkey)
|
||||||
sql_args = (value, value)
|
sql_args = (value, value)
|
||||||
cursor = self.db.cursor()
|
cursor = self.db.cursor()
|
||||||
cursor.execute(sql, sql_args)
|
cursor.execute(sql, sql_args)
|
||||||
|
|
||||||
def sql_purge(self, table, key, fkey, ftable):
|
|
||||||
sql = "DELETE FROM %s WHERE %s NOT IN (SELECT %s FROM %s)" \
|
|
||||||
% (table, key, fkey, ftable)
|
|
||||||
cursor = self.db.cursor()
|
|
||||||
cursor.execute(sql)
|
|
||||||
|
|
||||||
def PurgeRepository(self, repository):
|
def PurgeRepository(self, repository):
|
||||||
rep_id = self.GetRepositoryID(repository, auto_set=0)
|
rep_id = self.GetRepositoryID(repository)
|
||||||
if not rep_id:
|
if not rep_id:
|
||||||
raise UnknownRepositoryError("Unknown repository '%s'"
|
raise Exception, "Unknown repository '%s'" % (repository)
|
||||||
% (repository))
|
|
||||||
|
|
||||||
if (self._version >= 1):
|
|
||||||
self.sql_delete('repositories', 'id', rep_id)
|
|
||||||
self.sql_purge('commits', 'repositoryid', 'id', 'repositories')
|
|
||||||
self.sql_purge('files', 'id', 'fileid', 'commits')
|
|
||||||
self.sql_purge('dirs', 'id', 'dirid', 'commits')
|
|
||||||
self.sql_purge('branches', 'id', 'branchid', 'commits')
|
|
||||||
self.sql_purge('descs', 'id', 'descid', 'commits')
|
|
||||||
self.sql_purge('people', 'id', 'whoid', 'commits')
|
|
||||||
else:
|
|
||||||
sql = "SELECT * FROM checkins WHERE repositoryid=%s"
|
|
||||||
sql_args = (rep_id, )
|
|
||||||
cursor = self.db.cursor()
|
|
||||||
cursor.execute(sql, sql_args)
|
|
||||||
checkins = []
|
|
||||||
while 1:
|
|
||||||
try:
|
|
||||||
(ci_type, ci_when, who_id, repository_id,
|
|
||||||
dir_id, file_id, revision, sticky_tag, branch_id,
|
|
||||||
plus_count, minus_count, description_id) = \
|
|
||||||
cursor.fetchone()
|
|
||||||
except TypeError:
|
|
||||||
break
|
|
||||||
checkins.append([file_id, dir_id, branch_id,
|
|
||||||
description_id, who_id])
|
|
||||||
|
|
||||||
#self.sql_delete('repositories', 'id', rep_id)
|
|
||||||
self.sql_delete('checkins', 'repositoryid', rep_id)
|
|
||||||
for checkin in checkins:
|
|
||||||
self.sql_delete('files', 'id', checkin[0], 'fileid')
|
|
||||||
self.sql_delete('dirs', 'id', checkin[1], 'dirid')
|
|
||||||
self.sql_delete('branches', 'id', checkin[2], 'branchid')
|
|
||||||
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 = {}
|
|
||||||
|
|
||||||
|
sql = "SELECT * FROM checkins WHERE repositoryid=%s"
|
||||||
|
sql_args = (rep_id, )
|
||||||
|
cursor = self.db.cursor()
|
||||||
|
cursor.execute(sql, sql_args)
|
||||||
|
checkins = []
|
||||||
|
while 1:
|
||||||
|
try:
|
||||||
|
(ci_type, ci_when, who_id, repository_id,
|
||||||
|
dir_id, file_id, revision, sticky_tag, branch_id,
|
||||||
|
plus_count, minus_count, description_id) = cursor.fetchone()
|
||||||
|
except TypeError:
|
||||||
|
break
|
||||||
|
checkins.append([file_id, dir_id, branch_id, description_id, who_id])
|
||||||
|
|
||||||
class DatabaseVersionError(Exception):
|
#self.sql_delete('repositories', 'id', rep_id)
|
||||||
pass
|
self.sql_delete('checkins', 'repositoryid', rep_id)
|
||||||
class UnknownRepositoryError(Exception):
|
for checkin in checkins:
|
||||||
pass
|
self.sql_delete('files', 'id', checkin[0], 'fileid')
|
||||||
|
self.sql_delete('dirs', 'id', checkin[1], 'dirid')
|
||||||
|
self.sql_delete('branches', 'id', checkin[2], 'branchid')
|
||||||
|
self.sql_delete('descs', 'id', checkin[3], 'descid')
|
||||||
|
self.sql_delete('people', 'id', checkin[4], 'whoid')
|
||||||
|
|
||||||
## the Commit class holds data on one commit, the representation is as
|
## 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
|
## close as possible to how it should be committed and retrieved to the
|
||||||
|
14
lib/debug.py
14
lib/debug.py
@@ -1,6 +1,6 @@
|
|||||||
# -*-python-*-
|
# -*-python-*-
|
||||||
#
|
#
|
||||||
# Copyright (C) 1999-2008 The ViewCVS Group. All Rights Reserved.
|
# Copyright (C) 1999-2007 The ViewCVS Group. All Rights Reserved.
|
||||||
#
|
#
|
||||||
# By using this file, you agree to the terms and conditions set forth in
|
# By using this file, you agree to the terms and conditions set forth in
|
||||||
# the LICENSE.html file which can be found at the top level of the ViewVC
|
# the LICENSE.html file which can be found at the top level of the ViewVC
|
||||||
@@ -48,17 +48,13 @@ if SHOW_TIMES:
|
|||||||
else:
|
else:
|
||||||
_times[which] = t
|
_times[which] = t
|
||||||
|
|
||||||
def t_dump(out):
|
def dump():
|
||||||
out.write('<div>')
|
for name, value in _times.items():
|
||||||
names = _times.keys()
|
print '%s: %.6f<br />' % (name, value)
|
||||||
names.sort()
|
|
||||||
for name in names:
|
|
||||||
out.write('%s: %.6fs<br/>\n' % (name, _times[name]))
|
|
||||||
out.write('</div>')
|
|
||||||
|
|
||||||
else:
|
else:
|
||||||
|
|
||||||
t_start = t_end = t_dump = lambda *args: None
|
t_start = t_end = dump = lambda *args: None
|
||||||
|
|
||||||
|
|
||||||
class ViewVCException:
|
class ViewVCException:
|
||||||
|
43
lib/ezt.py
43
lib/ezt.py
@@ -460,10 +460,7 @@ class Template:
|
|||||||
def _cmd_print(self, valrefs, ctx):
|
def _cmd_print(self, valrefs, ctx):
|
||||||
value = _get_value(valrefs[0], ctx)
|
value = _get_value(valrefs[0], ctx)
|
||||||
args = map(lambda valref, ctx=ctx: _get_value(valref, ctx), valrefs[1:])
|
args = map(lambda valref, ctx=ctx: _get_value(valref, ctx), valrefs[1:])
|
||||||
try:
|
_write_value(value, args, ctx)
|
||||||
_write_value(value, args, ctx)
|
|
||||||
except TypeError:
|
|
||||||
raise Exception("Unprintable value type for '%s'" % (str(valrefs[0][0])))
|
|
||||||
|
|
||||||
def _cmd_format(self, printer, ctx):
|
def _cmd_format(self, printer, ctx):
|
||||||
if type(printer) is TupleType:
|
if type(printer) is TupleType:
|
||||||
@@ -525,8 +522,7 @@ class Template:
|
|||||||
((valref,), unused, section) = args
|
((valref,), unused, section) = args
|
||||||
list = _get_value(valref, ctx)
|
list = _get_value(valref, ctx)
|
||||||
if isinstance(list, StringType):
|
if isinstance(list, StringType):
|
||||||
raise NeedSequenceError("The value of '%s' is not a sequence"
|
raise NeedSequenceError()
|
||||||
% (valref[0]))
|
|
||||||
refname = valref[0]
|
refname = valref[0]
|
||||||
ctx.for_iterators[refname] = iterator = _iter(list)
|
ctx.for_iterators[refname] = iterator = _iter(list)
|
||||||
for unused in iterator:
|
for unused in iterator:
|
||||||
@@ -676,41 +672,6 @@ def _write_value(value, args, ctx):
|
|||||||
ctx.printers.append(printer)
|
ctx.printers.append(printer)
|
||||||
|
|
||||||
|
|
||||||
class TemplateData:
|
|
||||||
"""A custom dictionary-like object that allows one-time definition
|
|
||||||
of keys, and only value fetches and changes, and key deletions,
|
|
||||||
thereafter.
|
|
||||||
|
|
||||||
EZT doesn't require the use of this special class -- a normal
|
|
||||||
dict-type data dictionary works fine. But use of this class will
|
|
||||||
assist those who want the data sent to their templates to have a
|
|
||||||
consistent set of keys."""
|
|
||||||
|
|
||||||
def __init__(self, initial_data={}):
|
|
||||||
self._items = initial_data
|
|
||||||
|
|
||||||
def __getitem__(self, key):
|
|
||||||
return self._items.__getitem__(key)
|
|
||||||
|
|
||||||
def __setitem__(self, key, item):
|
|
||||||
assert self._items.has_key(key)
|
|
||||||
return self._items.__setitem__(key, item)
|
|
||||||
|
|
||||||
def __delitem__(self, key):
|
|
||||||
return self._items.__delitem__(key)
|
|
||||||
|
|
||||||
def keys(self):
|
|
||||||
return self._items.keys()
|
|
||||||
|
|
||||||
def merge(self, template_data):
|
|
||||||
"""Merge the data in TemplataData instance TEMPLATA_DATA into this
|
|
||||||
instance. Avoid the temptation to use this conditionally in your
|
|
||||||
code -- it rather defeats the purpose of this class."""
|
|
||||||
|
|
||||||
assert isinstance(template_data, TemplateData)
|
|
||||||
self._items.update(template_data._items)
|
|
||||||
|
|
||||||
|
|
||||||
class Context:
|
class Context:
|
||||||
"""A container for the execution context"""
|
"""A container for the execution context"""
|
||||||
def __init__(self, fp):
|
def __init__(self, fp):
|
||||||
|
190
lib/popen.py
190
lib/popen.py
@@ -1,6 +1,6 @@
|
|||||||
# -*-python-*-
|
# -*-python-*-
|
||||||
#
|
#
|
||||||
# Copyright (C) 1999-2009 The ViewCVS Group. All Rights Reserved.
|
# Copyright (C) 1999-2007 The ViewCVS Group. All Rights Reserved.
|
||||||
#
|
#
|
||||||
# By using this file, you agree to the terms and conditions set forth in
|
# By using this file, you agree to the terms and conditions set forth in
|
||||||
# the LICENSE.html file which can be found at the top level of the ViewVC
|
# the LICENSE.html file which can be found at the top level of the ViewVC
|
||||||
@@ -131,6 +131,194 @@ def popen(cmd, args, mode, capture_err=1):
|
|||||||
# crap. shouldn't be here.
|
# crap. shouldn't be here.
|
||||||
sys.exit(127)
|
sys.exit(127)
|
||||||
|
|
||||||
|
def pipe_cmds(cmds, out=None):
|
||||||
|
"""Executes a sequence of commands. The output of each command is directed to
|
||||||
|
the input of the next command. A _pipe object is returned for writing to the
|
||||||
|
first command's input. The output of the last command is directed to the
|
||||||
|
"out" file object or the standard output if "out" is None. If "out" is not an
|
||||||
|
OS file descriptor, a separate thread will be spawned to send data to its
|
||||||
|
write() method."""
|
||||||
|
|
||||||
|
if out is None:
|
||||||
|
out = sys.stdout
|
||||||
|
|
||||||
|
if sys.platform == "win32":
|
||||||
|
### FIXME: windows implementation ignores "out" argument, always
|
||||||
|
### writing last command's output to standard out
|
||||||
|
|
||||||
|
if debug.SHOW_CHILD_PROCESSES:
|
||||||
|
dbgIn = StringIO.StringIO()
|
||||||
|
hStdIn, handle = win32popen.MakeSpyPipe(1, 0, (dbgIn,))
|
||||||
|
|
||||||
|
i = 0
|
||||||
|
for cmd in cmds:
|
||||||
|
i = i + 1
|
||||||
|
|
||||||
|
dbgOut, dbgErr = StringIO.StringIO(), StringIO.StringIO()
|
||||||
|
|
||||||
|
if i < len(cmds):
|
||||||
|
nextStdIn, hStdOut = win32popen.MakeSpyPipe(1, 1, (dbgOut,))
|
||||||
|
x, hStdErr = win32popen.MakeSpyPipe(None, 1, (dbgErr,))
|
||||||
|
else:
|
||||||
|
ehandle = win32event.CreateEvent(None, 1, 0, None)
|
||||||
|
nextStdIn, hStdOut = win32popen.MakeSpyPipe(None, 1, (dbgOut, sapi.server.file()), ehandle)
|
||||||
|
x, hStdErr = win32popen.MakeSpyPipe(None, 1, (dbgErr,))
|
||||||
|
|
||||||
|
command = win32popen.CommandLine(cmd[0], cmd[1:])
|
||||||
|
phandle, pid, thandle, tid = win32popen.CreateProcess(command, hStdIn, hStdOut, hStdErr)
|
||||||
|
if debug.SHOW_CHILD_PROCESSES:
|
||||||
|
debug.Process(command, dbgIn, dbgOut, dbgErr)
|
||||||
|
|
||||||
|
dbgIn = dbgOut
|
||||||
|
hStdIn = nextStdIn
|
||||||
|
|
||||||
|
|
||||||
|
else:
|
||||||
|
|
||||||
|
hStdIn, handle = win32popen.CreatePipe(1, 0)
|
||||||
|
spool = None
|
||||||
|
|
||||||
|
i = 0
|
||||||
|
for cmd in cmds:
|
||||||
|
i = i + 1
|
||||||
|
if i < len(cmds):
|
||||||
|
nextStdIn, hStdOut = win32popen.CreatePipe(1, 1)
|
||||||
|
else:
|
||||||
|
# very last process
|
||||||
|
nextStdIn = None
|
||||||
|
|
||||||
|
if sapi.server.inheritableOut:
|
||||||
|
# send child output to standard out
|
||||||
|
hStdOut = win32popen.MakeInheritedHandle(win32popen.FileObject2File(sys.stdout),0)
|
||||||
|
ehandle = None
|
||||||
|
else:
|
||||||
|
ehandle = win32event.CreateEvent(None, 1, 0, None)
|
||||||
|
x, hStdOut = win32popen.MakeSpyPipe(None, 1, (sapi.server.file(),), ehandle)
|
||||||
|
|
||||||
|
command = win32popen.CommandLine(cmd[0], cmd[1:])
|
||||||
|
phandle, pid, thandle, tid = win32popen.CreateProcess(command, hStdIn, hStdOut, None)
|
||||||
|
hStdIn = nextStdIn
|
||||||
|
|
||||||
|
return _pipe(win32popen.File2FileObject(handle, 'wb'), phandle, ehandle)
|
||||||
|
|
||||||
|
# flush the stdio buffers since we are about to change the FD under them
|
||||||
|
sys.stdout.flush()
|
||||||
|
sys.stderr.flush()
|
||||||
|
|
||||||
|
prev_r, parent_w = os.pipe()
|
||||||
|
|
||||||
|
null = os.open('/dev/null', os.O_RDWR)
|
||||||
|
|
||||||
|
child_pids = []
|
||||||
|
|
||||||
|
for cmd in cmds[:-1]:
|
||||||
|
r, w = os.pipe()
|
||||||
|
pid = os.fork()
|
||||||
|
if not pid:
|
||||||
|
# in the child
|
||||||
|
|
||||||
|
# hook up stdin to the "read" channel
|
||||||
|
os.dup2(prev_r, 0)
|
||||||
|
|
||||||
|
# hook up stdout to the output channel
|
||||||
|
os.dup2(w, 1)
|
||||||
|
|
||||||
|
# toss errors
|
||||||
|
os.dup2(null, 2)
|
||||||
|
|
||||||
|
# close these extra descriptors
|
||||||
|
os.close(prev_r)
|
||||||
|
os.close(parent_w)
|
||||||
|
os.close(null)
|
||||||
|
os.close(r)
|
||||||
|
os.close(w)
|
||||||
|
|
||||||
|
# time to run the command
|
||||||
|
try:
|
||||||
|
os.execvp(cmd[0], cmd)
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
|
sys.exit(127)
|
||||||
|
|
||||||
|
# in the parent
|
||||||
|
child_pids.append(pid)
|
||||||
|
|
||||||
|
# we don't need these any more
|
||||||
|
os.close(prev_r)
|
||||||
|
os.close(w)
|
||||||
|
|
||||||
|
# the read channel of this pipe will feed into to the next command
|
||||||
|
prev_r = r
|
||||||
|
|
||||||
|
# no longer needed
|
||||||
|
os.close(null)
|
||||||
|
|
||||||
|
# done with most of the commands. set up the last command to write to "out"
|
||||||
|
if not hasattr(out, 'fileno'):
|
||||||
|
r, w = os.pipe()
|
||||||
|
|
||||||
|
pid = os.fork()
|
||||||
|
if not pid:
|
||||||
|
# in the child (the last command)
|
||||||
|
|
||||||
|
# hook up stdin to the "read" channel
|
||||||
|
os.dup2(prev_r, 0)
|
||||||
|
|
||||||
|
# hook up stdout to "out"
|
||||||
|
if hasattr(out, 'fileno'):
|
||||||
|
if out.fileno() != 1:
|
||||||
|
os.dup2(out.fileno(), 1)
|
||||||
|
out.close()
|
||||||
|
|
||||||
|
else:
|
||||||
|
# "out" can't be hooked up directly, so use a pipe and a thread
|
||||||
|
os.dup2(w, 1)
|
||||||
|
os.close(r)
|
||||||
|
os.close(w)
|
||||||
|
|
||||||
|
# close these extra descriptors
|
||||||
|
os.close(prev_r)
|
||||||
|
os.close(parent_w)
|
||||||
|
|
||||||
|
# run the last command
|
||||||
|
try:
|
||||||
|
os.execvp(cmds[-1][0], cmds[-1])
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
|
sys.exit(127)
|
||||||
|
|
||||||
|
child_pids.append(pid)
|
||||||
|
# not needed any more
|
||||||
|
os.close(prev_r)
|
||||||
|
|
||||||
|
if not hasattr(out, 'fileno'):
|
||||||
|
os.close(w)
|
||||||
|
thread = _copy(r, out)
|
||||||
|
thread.start()
|
||||||
|
else:
|
||||||
|
thread = None
|
||||||
|
|
||||||
|
# write into the first pipe, wait on the final process
|
||||||
|
return _pipe(os.fdopen(parent_w, 'w'), child_pids, thread=thread)
|
||||||
|
|
||||||
|
class _copy(threading.Thread):
|
||||||
|
def __init__(self, srcfd, destfile):
|
||||||
|
self.srcfd = srcfd
|
||||||
|
self.destfile = destfile
|
||||||
|
threading.Thread.__init__(self)
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
try:
|
||||||
|
while 1:
|
||||||
|
s = os.read(self.srcfd, 1024)
|
||||||
|
if not s:
|
||||||
|
break
|
||||||
|
self.destfile.write(s)
|
||||||
|
finally:
|
||||||
|
os.close(self.srcfd)
|
||||||
|
|
||||||
class _pipe:
|
class _pipe:
|
||||||
"Wrapper for a file which can wait() on a child process at close time."
|
"Wrapper for a file which can wait() on a child process at close time."
|
||||||
|
|
||||||
|
18
lib/query.py
18
lib/query.py
@@ -1,7 +1,7 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
# -*-python-*-
|
# -*-python-*-
|
||||||
#
|
#
|
||||||
# Copyright (C) 1999-2009 The ViewCVS Group. All Rights Reserved.
|
# Copyright (C) 1999-2008 The ViewCVS Group. All Rights Reserved.
|
||||||
#
|
#
|
||||||
# By using this file, you agree to the terms and conditions set forth in
|
# By using this file, you agree to the terms and conditions set forth in
|
||||||
# the LICENSE.html file which can be found at the top level of the ViewVC
|
# the LICENSE.html file which can be found at the top level of the ViewVC
|
||||||
@@ -412,10 +412,13 @@ def main(server, cfg, viewvc_link):
|
|||||||
commits = [ ]
|
commits = [ ]
|
||||||
query = 'skipped'
|
query = 'skipped'
|
||||||
|
|
||||||
data = ezt.TemplateData({
|
script_name = server.getenv('SCRIPT_NAME', '')
|
||||||
|
|
||||||
|
data = {
|
||||||
'cfg' : cfg,
|
'cfg' : cfg,
|
||||||
'address' : cfg.general.address,
|
'address' : cfg.general.address,
|
||||||
'vsn' : viewvc.__version__,
|
'vsn' : viewvc.__version__,
|
||||||
|
|
||||||
'repository' : server.escape(form_data.repository, 1),
|
'repository' : server.escape(form_data.repository, 1),
|
||||||
'branch' : server.escape(form_data.branch, 1),
|
'branch' : server.escape(form_data.branch, 1),
|
||||||
'directory' : server.escape(form_data.directory, 1),
|
'directory' : server.escape(form_data.directory, 1),
|
||||||
@@ -432,11 +435,16 @@ def main(server, cfg, viewvc_link):
|
|||||||
'commits' : commits,
|
'commits' : commits,
|
||||||
'num_commits' : len(commits),
|
'num_commits' : len(commits),
|
||||||
'rss_href' : None,
|
'rss_href' : None,
|
||||||
'hours' : form_data.hours and form_data.hours or 2,
|
}
|
||||||
})
|
|
||||||
|
if form_data.hours:
|
||||||
|
data['hours'] = form_data.hours
|
||||||
|
else:
|
||||||
|
data['hours'] = 2
|
||||||
|
|
||||||
|
server.header()
|
||||||
|
|
||||||
# generate the page
|
# generate the page
|
||||||
server.header()
|
|
||||||
template = viewvc.get_view_template(cfg, "query")
|
template = viewvc.get_view_template(cfg, "query")
|
||||||
template.generate(server.file(), data)
|
template.generate(server.file(), data)
|
||||||
|
|
||||||
|
@@ -158,7 +158,8 @@ class CgiServer(Server):
|
|||||||
if self.iis: url = fix_iis_url(self, url)
|
if self.iis: url = fix_iis_url(self, url)
|
||||||
self.addheader('Location', url)
|
self.addheader('Location', url)
|
||||||
self.header(status='301 Moved')
|
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):
|
def escape(self, s, quote = None):
|
||||||
return cgi.escape(s, quote)
|
return cgi.escape(s, quote)
|
||||||
@@ -218,6 +219,7 @@ class AspServer(ThreadedServer):
|
|||||||
|
|
||||||
def redirect(self, url):
|
def redirect(self, url):
|
||||||
self.response.Redirect(url)
|
self.response.Redirect(url)
|
||||||
|
sys.exit()
|
||||||
|
|
||||||
def escape(self, s, quote = None):
|
def escape(self, s, quote = None):
|
||||||
return self.server.HTMLEncode(str(s))
|
return self.server.HTMLEncode(str(s))
|
||||||
@@ -306,7 +308,8 @@ class ModPythonServer(ThreadedServer):
|
|||||||
self.request.headers_out['Location'] = url
|
self.request.headers_out['Location'] = url
|
||||||
self.request.status = mod_python.apache.HTTP_MOVED_TEMPORARILY
|
self.request.status = mod_python.apache.HTTP_MOVED_TEMPORARILY
|
||||||
self.request.write("You are being redirected to <a href=\"%s\">%s</a>"
|
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):
|
def escape(self, s, quote = None):
|
||||||
return cgi.escape(s, quote)
|
return cgi.escape(s, quote)
|
||||||
|
@@ -22,6 +22,7 @@ class ViewVCAuthorizer(vcauth.GenericViewVCAuthorizer):
|
|||||||
"""Subversion authz authorizer module"""
|
"""Subversion authz authorizer module"""
|
||||||
|
|
||||||
def __init__(self, username, params={}):
|
def __init__(self, username, params={}):
|
||||||
|
self.username = username
|
||||||
self.rootpaths = { } # {root -> { paths -> access boolean for USERNAME }}
|
self.rootpaths = { } # {root -> { paths -> access boolean for USERNAME }}
|
||||||
|
|
||||||
# Get the authz file location from a passed-in parameter.
|
# 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):
|
if not os.path.exists(self.authz_file):
|
||||||
raise debug.ViewVCException("Configured authzfile file not found")
|
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):
|
def _get_paths_for_root(self, rootname):
|
||||||
if self.rootpaths.has_key(rootname):
|
if self.rootpaths.has_key(rootname):
|
||||||
return self.rootpaths[rootname]
|
return self.rootpaths[rootname]
|
||||||
|
|
||||||
paths_for_root = { }
|
paths_for_root = { }
|
||||||
|
|
||||||
# Parse the authz file, replacing ConfigParser's optionxform()
|
# Parse the authz file.
|
||||||
# method with something that won't futz with the case of the
|
|
||||||
# option names.
|
|
||||||
cp = ConfigParser()
|
cp = ConfigParser()
|
||||||
cp.optionxform = lambda x: x
|
|
||||||
cp.read(self.authz_file)
|
cp.read(self.authz_file)
|
||||||
|
|
||||||
# Figure out if there are any aliases for the current username
|
# Figure out if there are any aliases for the current username
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
# -*-python-*-
|
# -*-python-*-
|
||||||
#
|
#
|
||||||
# Copyright (C) 1999-2008 The ViewCVS Group. All Rights Reserved.
|
# Copyright (C) 1999-2007 The ViewCVS Group. All Rights Reserved.
|
||||||
# Copyright (C) 2000 Curt Hagenlocher <curt@hagenlocher.org>
|
# Copyright (C) 2000 Curt Hagenlocher <curt@hagenlocher.org>
|
||||||
#
|
#
|
||||||
# By using this file, you agree to the terms and conditions set forth in
|
# By using this file, you agree to the terms and conditions set forth in
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
# -*-python-*-
|
# -*-python-*-
|
||||||
#
|
#
|
||||||
# Copyright (C) 1999-2008 The ViewCVS Group. All Rights Reserved.
|
# Copyright (C) 1999-2007 The ViewCVS Group. All Rights Reserved.
|
||||||
#
|
#
|
||||||
# By using this file, you agree to the terms and conditions set forth in
|
# By using this file, you agree to the terms and conditions set forth in
|
||||||
# the LICENSE.html file which can be found at the top level of the ViewVC
|
# the LICENSE.html file which can be found at the top level of the ViewVC
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
# -*-python-*-
|
# -*-python-*-
|
||||||
#
|
#
|
||||||
# Copyright (C) 1999-2008 The ViewCVS Group. All Rights Reserved.
|
# Copyright (C) 1999-2007 The ViewCVS Group. All Rights Reserved.
|
||||||
#
|
#
|
||||||
# By using this file, you agree to the terms and conditions set forth in
|
# By using this file, you agree to the terms and conditions set forth in
|
||||||
# the LICENSE.html file which can be found at the top level of the ViewVC
|
# the LICENSE.html file which can be found at the top level of the ViewVC
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
# -*-python-*-
|
# -*-python-*-
|
||||||
#
|
#
|
||||||
# Copyright (C) 1999-2008 The ViewCVS Group. All Rights Reserved.
|
# Copyright (C) 1999-2007 The ViewCVS Group. All Rights Reserved.
|
||||||
#
|
#
|
||||||
# By using this file, you agree to the terms and conditions set forth in
|
# By using this file, you agree to the terms and conditions set forth in
|
||||||
# the LICENSE.html file which can be found at the top level of the ViewVC
|
# the LICENSE.html file which can be found at the top level of the ViewVC
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
# -*-python-*-
|
# -*-python-*-
|
||||||
#
|
#
|
||||||
# Copyright (C) 1999-2009 The ViewCVS Group. All Rights Reserved.
|
# Copyright (C) 1999-2008 The ViewCVS Group. All Rights Reserved.
|
||||||
#
|
#
|
||||||
# By using this file, you agree to the terms and conditions set forth in
|
# By using this file, you agree to the terms and conditions set forth in
|
||||||
# the LICENSE.html file which can be found at the top level of the ViewVC
|
# the LICENSE.html file which can be found at the top level of the ViewVC
|
||||||
@@ -21,7 +21,7 @@ import tempfile
|
|||||||
import popen2
|
import popen2
|
||||||
import time
|
import time
|
||||||
import urllib
|
import urllib
|
||||||
from svn_repos import Revision, SVNChangedPath, _datestr_to_date, _compare_paths, _path_parts, _cleanup_path, _rev2optrev, _fix_subversion_exception
|
from svn_repos import Revision, SVNChangedPath, _datestr_to_date, _compare_paths, _path_parts, _cleanup_path, _rev2optrev
|
||||||
from svn import core, delta, client, wc, ra
|
from svn import core, delta, client, wc, ra
|
||||||
|
|
||||||
|
|
||||||
@@ -254,7 +254,7 @@ class RemoteSubversionRepository(vclib.Repository):
|
|||||||
dirent = dirents[entry.name]
|
dirent = dirents[entry.name]
|
||||||
entry.date, entry.author, entry.log, changes = \
|
entry.date, entry.author, entry.log, changes = \
|
||||||
self.revinfo(dirent.created_rev)
|
self.revinfo(dirent.created_rev)
|
||||||
entry.rev = str(dirent.created_rev)
|
entry.rev = dirent.created_rev
|
||||||
entry.size = dirent.size
|
entry.size = dirent.size
|
||||||
entry.lockinfo = None
|
entry.lockinfo = None
|
||||||
if locks.has_key(entry.name):
|
if locks.has_key(entry.name):
|
||||||
@@ -362,7 +362,6 @@ class RemoteSubversionRepository(vclib.Repository):
|
|||||||
info2 = p2, _date_from_rev(r2), r2
|
info2 = p2, _date_from_rev(r2), r2
|
||||||
return vclib._diff_fp(temp1, temp2, info1, info2, self.diff_cmd, args)
|
return vclib._diff_fp(temp1, temp2, info1, info2, self.diff_cmd, args)
|
||||||
except core.SubversionException, e:
|
except core.SubversionException, e:
|
||||||
_fix_subversion_exception(e)
|
|
||||||
if e.apr_err == vclib.svn.core.SVN_ERR_FS_NOT_FOUND:
|
if e.apr_err == vclib.svn.core.SVN_ERR_FS_NOT_FOUND:
|
||||||
raise vclib.InvalidRevision
|
raise vclib.InvalidRevision
|
||||||
raise
|
raise
|
||||||
@@ -487,7 +486,6 @@ class RemoteSubversionRepository(vclib.Repository):
|
|||||||
try:
|
try:
|
||||||
results = ra.get_locations(self.ra_session, path, rev, [old_rev])
|
results = ra.get_locations(self.ra_session, path, rev, [old_rev])
|
||||||
except core.SubversionException, e:
|
except core.SubversionException, e:
|
||||||
_fix_subversion_exception(e)
|
|
||||||
if e.apr_err == core.SVN_ERR_FS_NOT_FOUND:
|
if e.apr_err == core.SVN_ERR_FS_NOT_FOUND:
|
||||||
raise vclib.ItemNotFound(path)
|
raise vclib.ItemNotFound(path)
|
||||||
raise
|
raise
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
# -*-python-*-
|
# -*-python-*-
|
||||||
#
|
#
|
||||||
# Copyright (C) 1999-2009 The ViewCVS Group. All Rights Reserved.
|
# Copyright (C) 1999-2008 The ViewCVS Group. All Rights Reserved.
|
||||||
#
|
#
|
||||||
# By using this file, you agree to the terms and conditions set forth in
|
# By using this file, you agree to the terms and conditions set forth in
|
||||||
# the LICENSE.html file which can be found at the top level of the ViewVC
|
# the LICENSE.html file which can be found at the top level of the ViewVC
|
||||||
@@ -15,9 +15,11 @@
|
|||||||
import vclib
|
import vclib
|
||||||
import os
|
import os
|
||||||
import os.path
|
import os.path
|
||||||
|
import stat
|
||||||
import string
|
import string
|
||||||
import cStringIO
|
import cStringIO
|
||||||
import signal
|
import signal
|
||||||
|
import shutil
|
||||||
import time
|
import time
|
||||||
import tempfile
|
import tempfile
|
||||||
import popen
|
import popen
|
||||||
@@ -29,19 +31,6 @@ from svn import fs, repos, core, client, delta
|
|||||||
if (core.SVN_VER_MAJOR, core.SVN_VER_MINOR, core.SVN_VER_PATCH) < (1, 3, 1):
|
if (core.SVN_VER_MAJOR, core.SVN_VER_MINOR, core.SVN_VER_PATCH) < (1, 3, 1):
|
||||||
raise Exception, "Version requirement not met (needs 1.3.1 or better)"
|
raise Exception, "Version requirement not met (needs 1.3.1 or better)"
|
||||||
|
|
||||||
|
|
||||||
### Pre-1.5 Subversion doesn't have SVN_ERR_CEASE_INVOCATION
|
|
||||||
try:
|
|
||||||
_SVN_ERR_CEASE_INVOCATION = core.SVN_ERR_CEASE_INVOCATION
|
|
||||||
except:
|
|
||||||
_SVN_ERR_CEASE_INVOCATION = core.SVN_ERR_CANCELLED
|
|
||||||
|
|
||||||
### Pre-1.5 SubversionException's might not have the .msg and .apr_err members
|
|
||||||
def _fix_subversion_exception(e):
|
|
||||||
if not hasattr(e, 'apr_err'):
|
|
||||||
e.apr_err = e[1]
|
|
||||||
if not hasattr(e, 'message'):
|
|
||||||
e.message = e[0]
|
|
||||||
|
|
||||||
def _allow_all(root, path, pool):
|
def _allow_all(root, path, pool):
|
||||||
"""Generic authz_read_func that permits access to all paths"""
|
"""Generic authz_read_func that permits access to all paths"""
|
||||||
@@ -178,16 +167,13 @@ class NodeHistory:
|
|||||||
return
|
return
|
||||||
self.histories.append([revision, _cleanup_path(path)])
|
self.histories.append([revision, _cleanup_path(path)])
|
||||||
if self.limit and len(self.histories) == self.limit:
|
if self.limit and len(self.histories) == self.limit:
|
||||||
raise core.SubversionException("", _SVN_ERR_CEASE_INVOCATION)
|
raise core.SubversionException("", core.SVN_ERR_CEASE_INVOCATION)
|
||||||
|
|
||||||
def __getitem__(self, idx):
|
def __getitem__(self, idx):
|
||||||
return self.histories[idx]
|
return self.histories[idx]
|
||||||
|
|
||||||
|
|
||||||
def _get_history(svnrepos, path, rev, path_type, limit=0, options={}):
|
def _get_history(svnrepos, path, rev, path_type, limit=0, options={}):
|
||||||
if svnrepos.youngest == 0:
|
|
||||||
return []
|
|
||||||
|
|
||||||
rev_paths = []
|
rev_paths = []
|
||||||
fsroot = svnrepos._getroot(rev)
|
fsroot = svnrepos._getroot(rev)
|
||||||
show_all_logs = options.get('svn_show_all_dir_logs', 0)
|
show_all_logs = options.get('svn_show_all_dir_logs', 0)
|
||||||
@@ -204,8 +190,7 @@ def _get_history(svnrepos, path, rev, path_type, limit=0, options={}):
|
|||||||
repos.svn_repos_history(svnrepos.fs_ptr, path, history.add_history,
|
repos.svn_repos_history(svnrepos.fs_ptr, path, history.add_history,
|
||||||
1, rev, options.get('svn_cross_copies', 0))
|
1, rev, options.get('svn_cross_copies', 0))
|
||||||
except core.SubversionException, e:
|
except core.SubversionException, e:
|
||||||
_fix_subversion_exception(e)
|
if e.apr_err != core.SVN_ERR_CEASE_INVOCATION:
|
||||||
if e.apr_err != _SVN_ERR_CEASE_INVOCATION:
|
|
||||||
raise
|
raise
|
||||||
|
|
||||||
# Now, iterate over those history items, checking for changes of
|
# Now, iterate over those history items, checking for changes of
|
||||||
@@ -225,7 +210,7 @@ def _log_helper(svnrepos, path, rev, lockinfo):
|
|||||||
copyfrom_rev, copyfrom_path = fs.copied_from(rev_root, path)
|
copyfrom_rev, copyfrom_path = fs.copied_from(rev_root, path)
|
||||||
|
|
||||||
# Assemble our LogEntry
|
# Assemble our LogEntry
|
||||||
date, author, msg, changes = svnrepos._revinfo(rev)
|
date, author, msg, changes = svnrepos.revinfo(rev)
|
||||||
if fs.is_file(rev_root, path):
|
if fs.is_file(rev_root, path):
|
||||||
size = fs.file_length(rev_root, path)
|
size = fs.file_length(rev_root, path)
|
||||||
else:
|
else:
|
||||||
@@ -329,7 +314,6 @@ class BlameSource:
|
|||||||
client.blame2(local_url, _rev2optrev(rev), _rev2optrev(first_rev),
|
client.blame2(local_url, _rev2optrev(rev), _rev2optrev(first_rev),
|
||||||
_rev2optrev(rev), self._blame_cb, ctx)
|
_rev2optrev(rev), self._blame_cb, ctx)
|
||||||
except core.SubversionException, e:
|
except core.SubversionException, e:
|
||||||
_fix_subversion_exception(e)
|
|
||||||
if e.apr_err == core.SVN_ERR_CLIENT_IS_BINARY_FILE:
|
if e.apr_err == core.SVN_ERR_CLIENT_IS_BINARY_FILE:
|
||||||
raise vclib.NonTextualFileContents
|
raise vclib.NonTextualFileContents
|
||||||
raise
|
raise
|
||||||
@@ -472,7 +456,7 @@ class LocalSubversionRepository(vclib.Repository):
|
|||||||
continue
|
continue
|
||||||
path = self._getpath(entry_path_parts)
|
path = self._getpath(entry_path_parts)
|
||||||
entry_rev = _get_last_history_rev(fsroot, path)
|
entry_rev = _get_last_history_rev(fsroot, path)
|
||||||
date, author, msg, changes = self._revinfo(entry_rev)
|
date, author, msg, changes = self.revinfo(entry_rev)
|
||||||
entry.rev = str(entry_rev)
|
entry.rev = str(entry_rev)
|
||||||
entry.date = date
|
entry.date = date
|
||||||
entry.author = author
|
entry.author = author
|
||||||
@@ -570,125 +554,100 @@ class LocalSubversionRepository(vclib.Repository):
|
|||||||
youngest_rev, oldest_rev)
|
youngest_rev, oldest_rev)
|
||||||
return source, youngest_rev
|
return source, youngest_rev
|
||||||
|
|
||||||
def _revinfo(self, rev, include_changed_paths=0):
|
def _revinfo_raw(self, rev):
|
||||||
"""Internal-use, cache-friendly revision information harvester."""
|
fsroot = self._getroot(rev)
|
||||||
|
|
||||||
def _revinfo_helper(rev, include_changed_paths):
|
|
||||||
# Get the revision property info. (Would use
|
|
||||||
# editor.get_root_props(), but something is broken there...)
|
|
||||||
revprops = fs.revision_proplist(self.fs_ptr, rev)
|
|
||||||
msg = revprops.get(core.SVN_PROP_REVISION_LOG)
|
|
||||||
author = revprops.get(core.SVN_PROP_REVISION_AUTHOR)
|
|
||||||
datestr = revprops.get(core.SVN_PROP_REVISION_DATE)
|
|
||||||
date = _datestr_to_date(datestr)
|
|
||||||
|
|
||||||
# Optimization: If our caller doesn't care about the changed
|
|
||||||
# paths, and we don't need them to do authz determinations, let's
|
|
||||||
# get outta here.
|
|
||||||
if self.auth is None and not include_changed_paths:
|
|
||||||
return date, author, msg, None
|
|
||||||
|
|
||||||
# If we get here, then we either need the changed paths because we
|
|
||||||
# were asked for them, or we need them to do authorization checks.
|
|
||||||
# Either way, we need 'em, so let's get 'em.
|
|
||||||
fsroot = self._getroot(rev)
|
|
||||||
editor = repos.ChangeCollector(self.fs_ptr, fsroot)
|
|
||||||
e_ptr, e_baton = delta.make_editor(editor)
|
|
||||||
repos.svn_repos_replay(fsroot, e_ptr, e_baton)
|
|
||||||
changedpaths = {}
|
|
||||||
changes = editor.get_changes()
|
|
||||||
|
|
||||||
# Copy the Subversion changes into a new hash, checking
|
|
||||||
# authorization and converting them into ChangedPath objects.
|
|
||||||
found_readable = found_unreadable = 0
|
|
||||||
for path in changes.keys():
|
|
||||||
change = changes[path]
|
|
||||||
if change.path:
|
|
||||||
change.path = _cleanup_path(change.path)
|
|
||||||
if change.base_path:
|
|
||||||
change.base_path = _cleanup_path(change.base_path)
|
|
||||||
is_copy = 0
|
|
||||||
if not hasattr(change, 'action'): # new to subversion 1.4.0
|
|
||||||
action = vclib.MODIFIED
|
|
||||||
if not change.path:
|
|
||||||
action = vclib.DELETED
|
|
||||||
elif change.added:
|
|
||||||
action = vclib.ADDED
|
|
||||||
replace_check_path = path
|
|
||||||
if change.base_path and change.base_rev:
|
|
||||||
replace_check_path = change.base_path
|
|
||||||
if changedpaths.has_key(replace_check_path) \
|
|
||||||
and changedpaths[replace_check_path].action == vclib.DELETED:
|
|
||||||
action = vclib.REPLACED
|
|
||||||
else:
|
|
||||||
if change.action == repos.CHANGE_ACTION_ADD:
|
|
||||||
action = vclib.ADDED
|
|
||||||
elif change.action == repos.CHANGE_ACTION_DELETE:
|
|
||||||
action = vclib.DELETED
|
|
||||||
elif change.action == repos.CHANGE_ACTION_REPLACE:
|
|
||||||
action = vclib.REPLACED
|
|
||||||
else:
|
|
||||||
action = vclib.MODIFIED
|
|
||||||
if (action == vclib.ADDED or action == vclib.REPLACED) \
|
|
||||||
and change.base_path \
|
|
||||||
and change.base_rev:
|
|
||||||
is_copy = 1
|
|
||||||
if change.item_kind == core.svn_node_dir:
|
|
||||||
pathtype = vclib.DIR
|
|
||||||
elif change.item_kind == core.svn_node_file:
|
|
||||||
pathtype = vclib.FILE
|
|
||||||
else:
|
|
||||||
pathtype = None
|
|
||||||
|
|
||||||
parts = _path_parts(path)
|
|
||||||
if vclib.check_path_access(self, parts, pathtype, rev):
|
|
||||||
if is_copy and change.base_path and (change.base_path != path):
|
|
||||||
parts = _path_parts(change.base_path)
|
|
||||||
if not vclib.check_path_access(self, parts, pathtype, change.base_rev):
|
|
||||||
is_copy = 0
|
|
||||||
change.base_path = None
|
|
||||||
change.base_rev = None
|
|
||||||
changedpaths[path] = SVNChangedPath(path, rev, pathtype,
|
|
||||||
change.base_path,
|
|
||||||
change.base_rev, action,
|
|
||||||
is_copy, change.text_changed,
|
|
||||||
change.prop_changes)
|
|
||||||
found_readable = 1
|
|
||||||
else:
|
|
||||||
found_unreadable = 1
|
|
||||||
|
|
||||||
# If our caller doesn't care about changed paths, we must be
|
|
||||||
# here for authz reasons only. That means the minute we've
|
|
||||||
# found both a readable and an unreadable path, we can bail out.
|
|
||||||
if (not include_changed_paths) and found_readable and found_unreadable:
|
|
||||||
return date, author, None, None
|
|
||||||
|
|
||||||
# Okay, we've process all our paths. Let's filter our metadata,
|
|
||||||
# and return the requested data.
|
|
||||||
if found_unreadable:
|
|
||||||
msg = None
|
|
||||||
if not found_readable:
|
|
||||||
author = None
|
|
||||||
date = None
|
|
||||||
if include_changed_paths:
|
|
||||||
return date, author, msg, changedpaths.values()
|
|
||||||
else:
|
|
||||||
return date, author, msg, None
|
|
||||||
|
|
||||||
# Consult the revinfo cache first. If we don't have cached info,
|
# Get the changes for the revision
|
||||||
# or our caller wants changed paths and we don't have those for
|
editor = repos.ChangeCollector(self.fs_ptr, fsroot)
|
||||||
# this revision, go do the real work.
|
e_ptr, e_baton = delta.make_editor(editor)
|
||||||
|
repos.svn_repos_replay(fsroot, e_ptr, e_baton)
|
||||||
|
changes = editor.get_changes()
|
||||||
|
changedpaths = {}
|
||||||
|
|
||||||
|
# Now get the revision property info. Would use
|
||||||
|
# editor.get_root_props(), but something is broken there...
|
||||||
|
revprops = fs.revision_proplist(self.fs_ptr, rev)
|
||||||
|
msg = revprops.get(core.SVN_PROP_REVISION_LOG)
|
||||||
|
author = revprops.get(core.SVN_PROP_REVISION_AUTHOR)
|
||||||
|
datestr = revprops.get(core.SVN_PROP_REVISION_DATE)
|
||||||
|
|
||||||
|
# Copy the Subversion changes into a new hash, converting them into
|
||||||
|
# ChangedPath objects.
|
||||||
|
found_readable = found_unreadable = 0
|
||||||
|
for path in changes.keys():
|
||||||
|
change = changes[path]
|
||||||
|
if change.path:
|
||||||
|
change.path = _cleanup_path(change.path)
|
||||||
|
if change.base_path:
|
||||||
|
change.base_path = _cleanup_path(change.base_path)
|
||||||
|
is_copy = 0
|
||||||
|
if not hasattr(change, 'action'): # new to subversion 1.4.0
|
||||||
|
action = vclib.MODIFIED
|
||||||
|
if not change.path:
|
||||||
|
action = vclib.DELETED
|
||||||
|
elif change.added:
|
||||||
|
action = vclib.ADDED
|
||||||
|
replace_check_path = path
|
||||||
|
if change.base_path and change.base_rev:
|
||||||
|
replace_check_path = change.base_path
|
||||||
|
if changedpaths.has_key(replace_check_path) \
|
||||||
|
and changedpaths[replace_check_path].action == vclib.DELETED:
|
||||||
|
action = vclib.REPLACED
|
||||||
|
else:
|
||||||
|
if change.action == repos.CHANGE_ACTION_ADD:
|
||||||
|
action = vclib.ADDED
|
||||||
|
elif change.action == repos.CHANGE_ACTION_DELETE:
|
||||||
|
action = vclib.DELETED
|
||||||
|
elif change.action == repos.CHANGE_ACTION_REPLACE:
|
||||||
|
action = vclib.REPLACED
|
||||||
|
else:
|
||||||
|
action = vclib.MODIFIED
|
||||||
|
if (action == vclib.ADDED or action == vclib.REPLACED) \
|
||||||
|
and change.base_path \
|
||||||
|
and change.base_rev:
|
||||||
|
is_copy = 1
|
||||||
|
if change.item_kind == core.svn_node_dir:
|
||||||
|
pathtype = vclib.DIR
|
||||||
|
elif change.item_kind == core.svn_node_file:
|
||||||
|
pathtype = vclib.FILE
|
||||||
|
else:
|
||||||
|
pathtype = None
|
||||||
|
|
||||||
|
parts = _path_parts(path)
|
||||||
|
if vclib.check_path_access(self, parts, pathtype, rev):
|
||||||
|
if is_copy and change.base_path and (change.base_path != path):
|
||||||
|
parts = _path_parts(change.base_path)
|
||||||
|
if not vclib.check_path_access(self, parts, pathtype, change.base_rev):
|
||||||
|
is_copy = 0
|
||||||
|
change.base_path = None
|
||||||
|
change.base_rev = None
|
||||||
|
changedpaths[path] = SVNChangedPath(path, rev, pathtype,
|
||||||
|
change.base_path,
|
||||||
|
change.base_rev, action,
|
||||||
|
is_copy, change.text_changed,
|
||||||
|
change.prop_changes)
|
||||||
|
found_readable = 1
|
||||||
|
else:
|
||||||
|
found_unreadable = 1
|
||||||
|
|
||||||
|
# Return our tuple, auth-filtered: date, author, msg, changes
|
||||||
|
if found_unreadable:
|
||||||
|
msg = None
|
||||||
|
if not found_readable:
|
||||||
|
author = None
|
||||||
|
datestr = None
|
||||||
|
|
||||||
|
date = _datestr_to_date(datestr)
|
||||||
|
return date, author, msg, changedpaths.values()
|
||||||
|
|
||||||
|
def revinfo(self, rev):
|
||||||
rev = self._getrev(rev)
|
rev = self._getrev(rev)
|
||||||
cached_info = self._revinfo_cache.get(rev)
|
cached_info = self._revinfo_cache.get(rev)
|
||||||
if not cached_info \
|
if not cached_info:
|
||||||
or (include_changed_paths and cached_info[3] is None):
|
cached_info = self._revinfo_raw(rev)
|
||||||
cached_info = _revinfo_helper(rev, include_changed_paths)
|
|
||||||
self._revinfo_cache[rev] = cached_info
|
self._revinfo_cache[rev] = cached_info
|
||||||
return cached_info[0], cached_info[1], cached_info[2], cached_info[3]
|
return cached_info[0], cached_info[1], cached_info[2], cached_info[3]
|
||||||
|
|
||||||
def revinfo(self, rev):
|
|
||||||
return self._revinfo(rev, 1)
|
|
||||||
|
|
||||||
def rawdiff(self, path_parts1, rev1, path_parts2, rev2, type, options={}):
|
def rawdiff(self, path_parts1, rev1, path_parts2, rev2, type, options={}):
|
||||||
p1 = self._getpath(path_parts1)
|
p1 = self._getpath(path_parts1)
|
||||||
p2 = self._getpath(path_parts2)
|
p2 = self._getpath(path_parts2)
|
||||||
@@ -702,7 +661,7 @@ class LocalSubversionRepository(vclib.Repository):
|
|||||||
args = vclib._diff_args(type, options)
|
args = vclib._diff_args(type, options)
|
||||||
|
|
||||||
def _date_from_rev(rev):
|
def _date_from_rev(rev):
|
||||||
date, author, msg, changes = self._revinfo(rev)
|
date, author, msg, changes = self.revinfo(rev)
|
||||||
return date
|
return date
|
||||||
|
|
||||||
try:
|
try:
|
||||||
@@ -712,7 +671,6 @@ class LocalSubversionRepository(vclib.Repository):
|
|||||||
info2 = p2, _date_from_rev(r2), r2
|
info2 = p2, _date_from_rev(r2), r2
|
||||||
return vclib._diff_fp(temp1, temp2, info1, info2, self.diff_cmd, args)
|
return vclib._diff_fp(temp1, temp2, info1, info2, self.diff_cmd, args)
|
||||||
except core.SubversionException, e:
|
except core.SubversionException, e:
|
||||||
_fix_subversion_exception(e)
|
|
||||||
if e.apr_err == core.SVN_ERR_FS_NOT_FOUND:
|
if e.apr_err == core.SVN_ERR_FS_NOT_FOUND:
|
||||||
raise vclib.InvalidRevision
|
raise vclib.InvalidRevision
|
||||||
raise
|
raise
|
||||||
@@ -752,7 +710,6 @@ class LocalSubversionRepository(vclib.Repository):
|
|||||||
results = repos.svn_repos_trace_node_locations(self.fs_ptr, path,
|
results = repos.svn_repos_trace_node_locations(self.fs_ptr, path,
|
||||||
rev, [old_rev], _allow_all)
|
rev, [old_rev], _allow_all)
|
||||||
except core.SubversionException, e:
|
except core.SubversionException, e:
|
||||||
_fix_subversion_exception(e)
|
|
||||||
if e.apr_err == core.SVN_ERR_FS_NOT_FOUND:
|
if e.apr_err == core.SVN_ERR_FS_NOT_FOUND:
|
||||||
raise vclib.ItemNotFound(path)
|
raise vclib.ItemNotFound(path)
|
||||||
raise
|
raise
|
||||||
@@ -802,7 +759,6 @@ class LocalSubversionRepository(vclib.Repository):
|
|||||||
try:
|
try:
|
||||||
mid_id = fs.node_id(self._getroot(mid), path)
|
mid_id = fs.node_id(self._getroot(mid), path)
|
||||||
except core.SubversionException, e:
|
except core.SubversionException, e:
|
||||||
_fix_subversion_exception(e)
|
|
||||||
if e.apr_err == core.SVN_ERR_FS_NOT_FOUND:
|
if e.apr_err == core.SVN_ERR_FS_NOT_FOUND:
|
||||||
cmp = -1
|
cmp = -1
|
||||||
else:
|
else:
|
||||||
|
668
lib/viewvc.py
668
lib/viewvc.py
File diff suppressed because it is too large
Load Diff
@@ -50,7 +50,7 @@ numbers, and not literal):
|
|||||||
|
|
||||||
9. Go into an empty directory and run the 'make-release' script:
|
9. Go into an empty directory and run the 'make-release' script:
|
||||||
|
|
||||||
tools/make-release viewvc-X.Y.Z tags/X.Y.Z
|
tools/make-release viewvc-X.Y.Z X.Y.Z
|
||||||
|
|
||||||
10. Verify the archive files:
|
10. Verify the archive files:
|
||||||
|
|
||||||
|
@@ -49,7 +49,7 @@
|
|||||||
[else]
|
[else]
|
||||||
[is changes.type "add"]
|
[is changes.type "add"]
|
||||||
<tr>
|
<tr>
|
||||||
<td class="vc_diff_line_number" id="l[changes.line_number]">[if-any right.annotate_href]<a href="[right.annotate_href]#l[changes.line_number]">[changes.line_number]</a>[else][changes.line_number][end]</td>
|
<td id="l[changes.line_number]">[if-any right.annotate_href]<a href="[right.annotate_href]#l[changes.line_number]">[changes.line_number]</a>[else][changes.line_number][end]</td>
|
||||||
<td class="vc_diff_empty"> </td>
|
<td class="vc_diff_empty"> </td>
|
||||||
<td class="vc_diff_add"> [changes.right]</td>
|
<td class="vc_diff_add"> [changes.right]</td>
|
||||||
</tr>
|
</tr>
|
||||||
@@ -64,7 +64,7 @@
|
|||||||
[is changes.type "change"]
|
[is changes.type "change"]
|
||||||
<tr>
|
<tr>
|
||||||
[if-any changes.have_right]
|
[if-any changes.have_right]
|
||||||
<td class="vc_diff_line_number" id="l[changes.line_number]">[if-any right.annotate_href]<a href="[right.annotate_href]#l[changes.line_number]">[changes.line_number]</a>[else][changes.line_number][end]</td>
|
<td id="l[changes.line_number]">[if-any right.annotate_href]<a href="[right.annotate_href]#l[changes.line_number]">[changes.line_number]</a>[else][changes.line_number][end]</td>
|
||||||
[else]
|
[else]
|
||||||
<td></td>
|
<td></td>
|
||||||
[end]
|
[end]
|
||||||
@@ -112,7 +112,7 @@
|
|||||||
</tr>
|
</tr>
|
||||||
[else]
|
[else]
|
||||||
<tr>
|
<tr>
|
||||||
<td class="vc_diff_line_number" id="l[changes.line_number]">[if-any right.annotate_href]<a href="[right.annotate_href]#l[changes.line_number]">[changes.line_number]</a>[else][changes.line_number][end]</td>
|
<td id="l[changes.line_number]">[if-any right.annotate_href]<a href="[right.annotate_href]#l[changes.line_number]">[changes.line_number]</a>[else][changes.line_number][end]</td>
|
||||||
<td class="vc_diff_nochange"> [changes.left]</td>
|
<td class="vc_diff_nochange"> [changes.left]</td>
|
||||||
<td class="vc_diff_nochange"> [changes.right]</td>
|
<td class="vc_diff_nochange"> [changes.right]</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
@@ -4,31 +4,23 @@
|
|||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th style="width: 200px" class="vc_header[is sortby "file"]_sort[end]">
|
<th style="width: 200px" class="vc_header[is sortby "file"]_sort[end]">
|
||||||
[if-any sortby_file_href]<a href="[sortby_file_href]#dirlist">File</a>[else]File[end]
|
<a href="[sortby_file_href]#dirlist">File
|
||||||
[is sortby "file"]
|
[is sortby "file"]
|
||||||
<img class="vc_sortarrow" alt="[is sortdir "down"](rev)[end]"
|
<img class="vc_sortarrow" alt="[is sortdir "down"](rev)[end]"
|
||||||
width="13" height="13"
|
width="13" height="13"
|
||||||
src="[docroot]/images/[is sortdir "up"]up[else]down[end].png" />
|
src="[docroot]/images/[is sortdir "up"]up[else]down[end].png" />
|
||||||
[end]
|
[end]
|
||||||
|
</a>
|
||||||
</th>
|
</th>
|
||||||
<th style="width: 96px" class="vc_header"></th>
|
<th style="width: 96px" class="vc_header"></th>
|
||||||
[if-any sortby_rev_href]
|
|
||||||
<th class="vc_header[is sortby "rev"]_sort[end]">
|
<th class="vc_header[is sortby "rev"]_sort[end]">
|
||||||
<a href="[sortby_rev_href]#dirlist">Last Change</a>
|
<a href="[sortby_rev_href]#dirlist">Last Change
|
||||||
[is sortby "rev"]
|
[is sortby "rev"]
|
||||||
<img class="vc_sortarrow" alt="[is sortdir "down"](rev)[end]"
|
<img class="vc_sortarrow" alt="[is sortdir "down"](rev)[end]"
|
||||||
width="13" height="13"
|
width="13" height="13"
|
||||||
src="[docroot]/images/[is sortdir "up"]up[else]down[end].png" />
|
src="[docroot]/images/[is sortdir "up"]up[else]down[end].png" />
|
||||||
[end]
|
[end]
|
||||||
[else]
|
</a>
|
||||||
<th class="vc_header[is sortby "date"]_sort[end]">
|
|
||||||
[if-any sortby_date_href]<a href="[sortby_date_href]#dirlist">Last Change</a>[else]Last Change[end]
|
|
||||||
[is sortby "date"]
|
|
||||||
<img class="vc_sortarrow" alt="[is sortdir "down"](date)[end]"
|
|
||||||
width="13" height="13"
|
|
||||||
src="[docroot]/images/[is sortdir "up"]up[else]down[end].png" />
|
|
||||||
[end]
|
|
||||||
[end]
|
|
||||||
</th>
|
</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
|
@@ -4,45 +4,50 @@
|
|||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th class="vc_header[is sortby "file"]_sort[end]" colspan="2">
|
<th class="vc_header[is sortby "file"]_sort[end]" colspan="2">
|
||||||
[if-any sortby_file_href]<a href="[sortby_file_href]#dirlist">File</a>[else]File[end]
|
<a href="[sortby_file_href]#dirlist">File
|
||||||
[is sortby "file"]
|
[is sortby "file"]
|
||||||
<img class="vc_sortarrow" alt="[is sortdir "down"](rev)[end]"
|
<img class="vc_sortarrow" alt="[is sortdir "down"](rev)[end]"
|
||||||
width="13" height="13"
|
width="13" height="13"
|
||||||
src="[docroot]/images/[is sortdir "up"]up[else]down[end].png" />
|
src="[docroot]/images/[is sortdir "up"]up[else]down[end].png" />
|
||||||
[end]
|
[end]
|
||||||
|
</a>
|
||||||
</th>
|
</th>
|
||||||
<th class="vc_header[is sortby "rev"]_sort[end]">
|
<th class="vc_header[is sortby "rev"]_sort[end]">
|
||||||
[if-any sortby_rev_href]<a href="[sortby_rev_href]#dirlist">Rev.</a>[else]Rev.[end]
|
<a href="[sortby_rev_href]#dirlist">Rev.
|
||||||
[is sortby "rev"]
|
[is sortby "rev"]
|
||||||
<img class="vc_sortarrow" alt="[is sortdir "down"](rev)[end]"
|
<img class="vc_sortarrow" alt="[is sortdir "down"](rev)[end]"
|
||||||
width="13" height="13"
|
width="13" height="13"
|
||||||
src="[docroot]/images/[is sortdir "up"]up[else]down[end].png" />
|
src="[docroot]/images/[is sortdir "up"]up[else]down[end].png" />
|
||||||
[end]
|
[end]
|
||||||
|
</a>
|
||||||
</th>
|
</th>
|
||||||
<th class="vc_header[is sortby "date"]_sort[end]">
|
<th class="vc_header[is sortby "date"]_sort[end]">
|
||||||
[if-any sortby_date_href]<a href="[sortby_date_href]#dirlist">Age</a>[else]Age[end]
|
<a href="[sortby_date_href]#dirlist">Age
|
||||||
[is sortby "date"]
|
[is sortby "date"]
|
||||||
<img class="vc_sortarrow" alt="[is sortdir "down"](rev)[end]"
|
<img class="vc_sortarrow" alt="[is sortdir "down"](rev)[end]"
|
||||||
width="13" height="13"
|
width="13" height="13"
|
||||||
src="[docroot]/images/[is sortdir "up"]up[else]down[end].png" />
|
src="[docroot]/images/[is sortdir "up"]up[else]down[end].png" />
|
||||||
[end]
|
[end]
|
||||||
|
</a>
|
||||||
</th>
|
</th>
|
||||||
<th class="vc_header[is sortby "author"]_sort[end]">
|
<th class="vc_header[is sortby "author"]_sort[end]">
|
||||||
[if-any sortby_author_href]<a href="[sortby_author_href]#dirlist">Author</a>[else]Author[end]
|
<a href="[sortby_author_href]#dirlist">Author
|
||||||
[is sortby "author"]
|
[is sortby "author"]
|
||||||
<img class="vc_sortarrow" alt="[is sortdir "down"](rev)[end]"
|
<img class="vc_sortarrow" alt="[is sortdir "down"](rev)[end]"
|
||||||
width="13" height="13"
|
width="13" height="13"
|
||||||
src="[docroot]/images/[is sortdir "up"]up[else]down[end].png" />
|
src="[docroot]/images/[is sortdir "up"]up[else]down[end].png" />
|
||||||
[end]
|
[end]
|
||||||
|
</a>
|
||||||
</th>
|
</th>
|
||||||
[is cfg.options.show_logs "1"]
|
[is cfg.options.show_logs "1"]
|
||||||
<th class="vc_header[is sortby "log"]_sort[end]">
|
<th class="vc_header[is sortby "log"]_sort[end]">
|
||||||
[if-any sortby_log_href]<a href="[sortby_log_href]#dirlist">Last log entry</a>[else]Last log entry[end]
|
<a href="[sortby_log_href]#dirlist">Last log entry
|
||||||
[is sortby "log"]
|
[is sortby "log"]
|
||||||
<img class="vc_sortarrow" alt="[is sortdir "down"](rev)[end]"
|
<img class="vc_sortarrow" alt="[is sortdir "down"](rev)[end]"
|
||||||
width="13" height="13"
|
width="13" height="13"
|
||||||
src="[docroot]/images/[is sortdir "up"]up[else]down[end].png" />
|
src="[docroot]/images/[is sortdir "up"]up[else]down[end].png" />
|
||||||
[end]
|
[end]
|
||||||
|
</a>
|
||||||
</th>
|
</th>
|
||||||
[end]
|
[end]
|
||||||
</tr>
|
</tr>
|
||||||
|
@@ -229,8 +229,6 @@ form { margin: 0; }
|
|||||||
font-family: sans-serif;
|
font-family: sans-serif;
|
||||||
font-size: smaller;
|
font-size: smaller;
|
||||||
}
|
}
|
||||||
.vc_diff_line_number {
|
|
||||||
}
|
|
||||||
.vc_raw_diff {
|
.vc_raw_diff {
|
||||||
background-color: #cccccc;
|
background-color: #cccccc;
|
||||||
font-size: smaller;
|
font-size: smaller;
|
||||||
@@ -272,8 +270,3 @@ table.vc_idiff tbody th {
|
|||||||
.vc_query_form {
|
.vc_query_form {
|
||||||
background-color: #e6e6e6;
|
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]
|
[# 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]
|
[define help_href][docroot]/help_rootview.html[end]
|
||||||
[# end]
|
[# end]
|
||||||
|
|
||||||
@@ -18,7 +8,7 @@
|
|||||||
<hr />
|
<hr />
|
||||||
<div class="vc_summary">
|
<div class="vc_summary">
|
||||||
Revision [if-any revision_href]<a href="[revision_href]"><strong>[rev]</strong></a>[else]<strong>[rev]</strong>[end] -
|
Revision [if-any revision_href]<a href="[revision_href]"><strong>[rev]</strong></a>[else]<strong>[rev]</strong>[end] -
|
||||||
([is annotation "annotated"]<a href="[view_href]"><strong>hide annotations</strong></a>[else]<a href="[annotate_href]"><strong>show annotations</strong></a>[end])
|
([if-any annotation][is annotation "annotated"]<a href="[view_href]"><strong>hide annotations</strong></a>[end][else]<a href="[annotate_href]"><strong>show annotations</strong></a>[end])
|
||||||
[if-any download_href](<a href="[download_href]"><strong>download</strong></a>)[end]
|
[if-any download_href](<a href="[download_href]"><strong>download</strong></a>)[end]
|
||||||
[if-any download_text_href](<a href="[download_text_href]"><strong>as text</strong></a>)[end]
|
[if-any download_text_href](<a href="[download_text_href]"><strong>as text</strong></a>)[end]
|
||||||
|
|
||||||
@@ -53,12 +43,14 @@ Revision [if-any revision_href]<a href="[revision_href]"><strong>[rev]</strong><
|
|||||||
[if-any lockinfo]
|
[if-any lockinfo]
|
||||||
<br />Lock status: <img src="[docroot]/images/lock.png" alt="Locked" width="16" height="16" /> [lockinfo]
|
<br />Lock status: <img src="[docroot]/images/lock.png" alt="Locked" width="16" height="16" /> [lockinfo]
|
||||||
[end]
|
[end]
|
||||||
|
[if-any annotation]
|
||||||
[is annotation "binary"]
|
[is annotation "binary"]
|
||||||
<br /><strong>Unable to calculate annotation data on binary file contents.</strong>
|
<br /><strong>Unable to calculate annotation data on binary file contents.</strong>
|
||||||
[end]
|
[end]
|
||||||
[is annotation "error"]
|
[is annotation "error"]
|
||||||
<br /><strong>Error occurred while calculating annotation data.</strong>
|
<br /><strong>Error occurred while calculating annotation data.</strong>
|
||||||
[end]
|
[end]
|
||||||
|
[end]
|
||||||
[is state "dead"]
|
[is state "dead"]
|
||||||
<br /><strong><em>FILE REMOVED</em></strong>
|
<br /><strong><em>FILE REMOVED</em></strong>
|
||||||
[end]
|
[end]
|
||||||
@@ -67,14 +59,6 @@ Revision [if-any revision_href]<a href="[revision_href]"><strong>[rev]</strong><
|
|||||||
[end]
|
[end]
|
||||||
</div>
|
</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 last_rev]0[end]
|
||||||
[define rowclass]vc_row_even[end]
|
[define rowclass]vc_row_even[end]
|
||||||
@@ -117,7 +101,6 @@ Revision [if-any revision_href]<a href="[revision_href]"><strong>[rev]</strong><
|
|||||||
</div>
|
</div>
|
||||||
[end]
|
[end]
|
||||||
[end]
|
[end]
|
||||||
[end]
|
|
||||||
|
|
||||||
[include "include/props.ezt"]
|
[include "include/props.ezt"]
|
||||||
[include "include/footer.ezt"]
|
[include "include/footer.ezt"]
|
||||||
|
@@ -15,78 +15,4 @@
|
|||||||
alt="Revisions of [where]" />
|
alt="Revisions of [where]" />
|
||||||
</div>
|
</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"]
|
[include "include/footer.ezt"]
|
||||||
|
@@ -32,7 +32,7 @@
|
|||||||
<td>[include "pathrev_form.ezt"]</td>
|
<td>[include "pathrev_form.ezt"]</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
|
||||||
[if-any search_re_action]
|
[if-any search_re_form]
|
||||||
<tr>
|
<tr>
|
||||||
<td>Filter files by content:</td>
|
<td>Filter files by content:</td>
|
||||||
<td><form method="get" action="[search_re_action]" style="display: inline;">
|
<td><form method="get" action="[search_re_action]" style="display: inline;">
|
||||||
@@ -63,7 +63,7 @@
|
|||||||
|
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
[is picklist_len "0"]
|
[is cfg.options.use_pagesize "0"]
|
||||||
[else]
|
[else]
|
||||||
[is picklist_len "1"]
|
[is picklist_len "1"]
|
||||||
[else]
|
[else]
|
||||||
|
@@ -2,7 +2,7 @@
|
|||||||
[is pathtype "file"]
|
[is pathtype "file"]
|
||||||
<a href="[up_href]"><img src="[docroot]/images/back_small.png" class="vc_icon" alt="Parent Directory" /> Parent Directory</a>
|
<a href="[up_href]"><img src="[docroot]/images/back_small.png" class="vc_icon" alt="Parent Directory" /> Parent Directory</a>
|
||||||
[if-any log_href]
|
[if-any log_href]
|
||||||
| <a href="[log_href]"><img src="[docroot]/images/log.png" class="vc_icon" alt="Revision Log" /> Revision Log</a>
|
| <a href="[log_href][if-any log_href_rev]#rev[log_href_rev][end]"><img src="[docroot]/images/log.png" class="vc_icon" alt="Revision Log" /> Revision Log</a>
|
||||||
[end]
|
[end]
|
||||||
[if-any graph_href]
|
[if-any graph_href]
|
||||||
| <a href="[graph_href]"><img src="[docroot]/images/cvsgraph_16x16.png" class="vc_icon" alt="View Revision Graph" /> Revision Graph</a>
|
| <a href="[graph_href]"><img src="[docroot]/images/cvsgraph_16x16.png" class="vc_icon" alt="View Revision Graph" /> Revision Graph</a>
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
[is picklist_len "0"]
|
[is cfg.options.use_pagesize "0"]
|
||||||
[else]
|
[else]
|
||||||
[is picklist_len "1"]
|
[is picklist_len "1"]
|
||||||
[else]
|
[else]
|
||||||
@@ -17,4 +17,6 @@
|
|||||||
</select>
|
</select>
|
||||||
</form>
|
</form>
|
||||||
[end]
|
[end]
|
||||||
[end]
|
[end]
|
||||||
|
|
||||||
|
|
||||||
|
@@ -28,11 +28,6 @@
|
|||||||
<td>[if-any date][date][else]<em>(unknown date)</em>[end]
|
<td>[if-any date][date][else]<em>(unknown date)</em>[end]
|
||||||
[if-any ago]<em>([ago] ago)</em>[end]</td>
|
[if-any ago]<em>([ago] ago)</em>[end]</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr align="left">
|
|
||||||
<th>Changed paths:</th>
|
|
||||||
<td><strong>[num_changes]</strong>
|
|
||||||
[if-any more_changes](showing only [limit_changes]; <a href="[more_changes_href]">show all</a>)[end][if-any first_changes](<a href="[first_changes_href]">show only first [first_changes]</a>)[end]</td>
|
|
||||||
</tr>
|
|
||||||
<tr align="left">
|
<tr align="left">
|
||||||
<th>Log Message:</th>
|
<th>Log Message:</th>
|
||||||
<td><pre class="vc_log">[log]</pre></td>
|
<td><pre class="vc_log">[log]</pre></td>
|
||||||
@@ -44,6 +39,17 @@
|
|||||||
|
|
||||||
<p><strong>Changed paths:</strong></p>
|
<p><strong>Changed paths:</strong></p>
|
||||||
|
|
||||||
|
[if-any more_changes]
|
||||||
|
<div>
|
||||||
|
Only [limit_changes] changes shown,
|
||||||
|
<a href="[more_changes_href]">display [more_changes] more changes...</a>
|
||||||
|
</div>
|
||||||
|
[end]
|
||||||
|
|
||||||
|
[if-any first_changes]
|
||||||
|
<div><a href="[first_changes_href]">Show only first [first_changes] changes...</div>
|
||||||
|
[end]
|
||||||
|
|
||||||
<table cellspacing="1" cellpadding="2">
|
<table cellspacing="1" cellpadding="2">
|
||||||
<thead>
|
<thead>
|
||||||
<tr align="left">
|
<tr align="left">
|
||||||
@@ -69,11 +75,6 @@
|
|||||||
<td colspan="5">No changed paths.</td>
|
<td colspan="5">No changed paths.</td>
|
||||||
</tr>
|
</tr>
|
||||||
[end]
|
[end]
|
||||||
[if-any more_changes]
|
|
||||||
<tr>
|
|
||||||
<td colspan="5">[[]<a href="[more_changes_href]">...</a>]</td>
|
|
||||||
</tr>
|
|
||||||
[end]
|
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
|
@@ -17,18 +17,17 @@
|
|||||||
|
|
||||||
### Validate input
|
### Validate input
|
||||||
if test $# != 2 && test $# != 1; then
|
if test $# != 2 && test $# != 1; then
|
||||||
echo "Usage: $0 TARGET-DIRECTORY [BRANCH]"
|
echo "Usage: $0 TARGET-DIRECTORY [TAGNAME]"
|
||||||
echo ""
|
echo ""
|
||||||
echo "If BRANCH (i.e. \"tags/1.1.0\" or \"branches/1.0.x\") is not provided,"
|
echo "If TAGNAME is not provided, the release will be rolled from trunk."
|
||||||
echo "the release will be rolled from trunk."
|
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
TARGET=${1}
|
TARGET=${1}
|
||||||
if test $# = 1; then
|
if test $# == 1; then
|
||||||
ROOT=trunk
|
ROOT=trunk
|
||||||
else
|
else
|
||||||
ROOT=${2}
|
ROOT=tags/${2}
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if test -e ${TARGET}; then
|
if test -e ${TARGET}; then
|
||||||
@@ -37,8 +36,7 @@ if test -e ${TARGET}; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
### Grab an export from the Subversion repository.
|
### Grab an export from the Subversion repository.
|
||||||
EXPORT_URL="http://viewvc.tigris.org/svn/viewvc/${ROOT}"
|
echo "Exporting into:" ${TARGET}
|
||||||
echo "Exporting '${EXPORT_URL}' into '${TARGET}'"
|
|
||||||
|
|
||||||
for PLATFORM in unix windows; do
|
for PLATFORM in unix windows; do
|
||||||
if test ${PLATFORM} = windows; then
|
if test ${PLATFORM} = windows; then
|
||||||
@@ -50,7 +48,7 @@ for PLATFORM in unix windows; do
|
|||||||
echo "Beginning build for ${PLATFORM}:"
|
echo "Beginning build for ${PLATFORM}:"
|
||||||
|
|
||||||
echo " Exporting source code..."
|
echo " Exporting source code..."
|
||||||
svn export --quiet ${EOL} ${EXPORT_URL} ${TARGET}
|
svn export --quiet ${EOL} http://viewvc.tigris.org/svn/viewvc/${ROOT} ${TARGET}
|
||||||
|
|
||||||
### Various shifting, cleanup.
|
### Various shifting, cleanup.
|
||||||
|
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
# -*- Mode: python -*-
|
# -*- Mode: python -*-
|
||||||
#
|
#
|
||||||
# Copyright (C) 1999-2009 The ViewCVS Group. All Rights Reserved.
|
# Copyright (C) 1999-2007 The ViewCVS Group. All Rights Reserved.
|
||||||
#
|
#
|
||||||
# By using this file, you agree to the terms and conditions set forth in
|
# By using this file, you agree to the terms and conditions set forth in
|
||||||
# the LICENSE.html file which can be found at the top level of the ViewVC
|
# the LICENSE.html file which can be found at the top level of the ViewVC
|
||||||
@@ -58,12 +58,10 @@ FILE_INFO_LIST = [
|
|||||||
("bin/cvsdbadmin", "bin/cvsdbadmin", 0755, 1, 0, 0),
|
("bin/cvsdbadmin", "bin/cvsdbadmin", 0755, 1, 0, 0),
|
||||||
("bin/svndbadmin", "bin/svndbadmin", 0755, 1, 0, 0),
|
("bin/svndbadmin", "bin/svndbadmin", 0755, 1, 0, 0),
|
||||||
("bin/make-database", "bin/make-database", 0755, 1, 0, 0),
|
("bin/make-database", "bin/make-database", 0755, 1, 0, 0),
|
||||||
("conf/viewvc.conf.dist", "viewvc.conf.dist", 0644, 0, 0, 0),
|
("viewvc.conf.dist", "viewvc.conf.dist", 0644, 0, 0, 0),
|
||||||
("conf/viewvc.conf.dist", "viewvc.conf", 0644, 0, 1, 0),
|
("viewvc.conf.dist", "viewvc.conf", 0644, 0, 1, 0),
|
||||||
("conf/cvsgraph.conf.dist", "cvsgraph.conf.dist", 0644, 0, 0, 0),
|
("cvsgraph.conf.dist", "cvsgraph.conf.dist", 0644, 0, 0, 0),
|
||||||
("conf/cvsgraph.conf.dist", "cvsgraph.conf", 0644, 0, 1, 0),
|
("cvsgraph.conf.dist", "cvsgraph.conf", 0644, 0, 1, 0),
|
||||||
("conf/mimetypes.conf.dist", "mimetypes.conf.dist", 0644, 0, 0, 0),
|
|
||||||
("conf/mimetypes.conf.dist", "mimetypes.conf", 0644, 0, 1, 0),
|
|
||||||
]
|
]
|
||||||
if sys.platform == "win32":
|
if sys.platform == "win32":
|
||||||
FILE_INFO_LIST.extend([
|
FILE_INFO_LIST.extend([
|
||||||
|
784
viewvc.conf.dist
Normal file
784
viewvc.conf.dist
Normal file
@@ -0,0 +1,784 @@
|
|||||||
|
#---------------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
# Configuration file for ViewVC
|
||||||
|
#
|
||||||
|
# Information on ViewVC is located at the following web site:
|
||||||
|
# http://viewvc.org/
|
||||||
|
#
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
# THE FORMAT OF THIS CONFIGURATION FILE
|
||||||
|
#
|
||||||
|
# This file is delineated by sections, specified in [brackets]. Within
|
||||||
|
# each section, are a number of configuration settings. These settings
|
||||||
|
# take the form of: name = value. Values may be continued on the
|
||||||
|
# following line by indenting the continued line.
|
||||||
|
#
|
||||||
|
# WARNING: Indentation *always* means continuation. Name=value lines
|
||||||
|
# should always start in column zero.
|
||||||
|
#
|
||||||
|
# Comments should always start in column zero, and are identified
|
||||||
|
# with "#".
|
||||||
|
#
|
||||||
|
# Certain configuration settings may have multiple values. These should
|
||||||
|
# be separated by a comma. The settings where this is allowed are noted
|
||||||
|
# below. Any other setting that requires special syntax is noted at that
|
||||||
|
# setting.
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# SOME TERMINOLOGY USED HEREIN
|
||||||
|
#
|
||||||
|
# "root" - This is a CVS or Subversion repository. For Subversion, the
|
||||||
|
# meaning is pretty clear, as the virtual, versioned directory tree
|
||||||
|
# stored inside a Subversion repository looks nothing like the actual
|
||||||
|
# tree visible with shell utilities that holds the repository. For
|
||||||
|
# CVS, this is more confusing, because CVS's repository layout mimics
|
||||||
|
# (actually, defines) the layout of the stuff housed in the repository.
|
||||||
|
# But a CVS repository can be identified by the presence of a CVSROOT
|
||||||
|
# subdirectory in its root directory.
|
||||||
|
#
|
||||||
|
# "module" - A module is a top-level subdirectory of a root, usually
|
||||||
|
# associated with the concept of a single "project" among many housed
|
||||||
|
# within a single repository.
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# BASIC VIEWVC CONFIGURATION HINTS
|
||||||
|
#
|
||||||
|
# While ViewVC has quite a few configuration options, you generally
|
||||||
|
# only need to change a small subset of them to get your ViewVC
|
||||||
|
# installation working properly. Here are some options that we
|
||||||
|
# recommend you pay attention to. Of course, don't try to change the
|
||||||
|
# options here -- do so in the relevant section of the configuration
|
||||||
|
# file below.
|
||||||
|
#
|
||||||
|
# For correct operation, you will probably need to change the following
|
||||||
|
# configuration variables:
|
||||||
|
#
|
||||||
|
# cvs_roots (for CVS)
|
||||||
|
# svn_roots (for Subversion)
|
||||||
|
# root_parents (for CVS or Subversion)
|
||||||
|
# default_root
|
||||||
|
# root_as_url_component
|
||||||
|
# rcs_dir
|
||||||
|
# mime_types_file
|
||||||
|
# the many options in the [utilities] section
|
||||||
|
#
|
||||||
|
# It is usually desirable to change the following variables:
|
||||||
|
#
|
||||||
|
# address
|
||||||
|
# forbidden
|
||||||
|
#
|
||||||
|
# To optimize delivery of ViewVC static files:
|
||||||
|
#
|
||||||
|
# docroot
|
||||||
|
#
|
||||||
|
# To customize the display of ViewVC for your site:
|
||||||
|
#
|
||||||
|
# template_dir
|
||||||
|
# the [templates] override section
|
||||||
|
#
|
||||||
|
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
[general]
|
||||||
|
|
||||||
|
#
|
||||||
|
# This setting specifies each of the CVS roots on your system and assigns
|
||||||
|
# names to them. Each root should be given by a "name: path" value. Multiple
|
||||||
|
# roots should be separated by commas and can be placed on separate lines.
|
||||||
|
#
|
||||||
|
cvs_roots = cvs: /home/cvsroot
|
||||||
|
|
||||||
|
#
|
||||||
|
# This setting specifies each of the Subversion roots (repositories)
|
||||||
|
# on your system and assigns names to them. Each root should be given
|
||||||
|
# by a "name: path" value. Multiple roots should be separated by
|
||||||
|
# commas and can be placed on separate lines.
|
||||||
|
#
|
||||||
|
#svn_roots = svn: /home/svnrepos
|
||||||
|
|
||||||
|
# The 'root_parents' setting specifies a list of directories in which
|
||||||
|
# any number of repositories may reside. Rather than force you to add
|
||||||
|
# a new entry to 'cvs_roots' or 'svn_roots' each time you create a new
|
||||||
|
# repository, ViewVC rewards you for organising all your repositories
|
||||||
|
# under a few parent directories by allowing you to simply specifiy
|
||||||
|
# just those parent directories. ViewVC will then notice each
|
||||||
|
# repository in that directory as a new root whose name is the
|
||||||
|
# subdirectory of the parent path in which that repository lives.
|
||||||
|
#
|
||||||
|
# You can specify multiple parent paths separated by commas or new lines.
|
||||||
|
#
|
||||||
|
# Caution: these names can, of course, clash with names you have
|
||||||
|
# defined in your cvs_roots or svn_roots configuration items. If this
|
||||||
|
# occurs, you can either rename the offending repository on disk, or
|
||||||
|
# grant new names to the clashing item in cvs_roots or svn_roots.
|
||||||
|
# Each parent path is processed sequentially, so repositories under
|
||||||
|
# later parent paths may override earlier ones.
|
||||||
|
#
|
||||||
|
#root_parents = /home/svn-repositories : svn,
|
||||||
|
# /home/cvs-repositories : cvs
|
||||||
|
|
||||||
|
# This is the name of the default root. Valid names include those
|
||||||
|
# explicitly listed in the cvs_roots and svn_roots configuration
|
||||||
|
# options, as well as those implicitly indicated by virtue of being
|
||||||
|
# the basenames of repositories found in the root_parents option
|
||||||
|
# locations.
|
||||||
|
#
|
||||||
|
# Note: This setting is ignored when root_as_url_component is enabled.
|
||||||
|
default_root = cvs
|
||||||
|
|
||||||
|
#
|
||||||
|
# This is a pathname to a MIME types file to help viewvc to guess the
|
||||||
|
# correct MIME type on checkout. If you are having problems with the
|
||||||
|
# default guess on the MIME type, then uncomment this option and point
|
||||||
|
# it at a MIME type file.
|
||||||
|
#
|
||||||
|
# For example, you can use the mime.types provided by Apache here:
|
||||||
|
#mime_types_file = /usr/local/apache2/conf/mime.types
|
||||||
|
|
||||||
|
# The address of the local repository maintainer. (This option is
|
||||||
|
# provided only as a convenience for ViewVC installations which are
|
||||||
|
# using the default template set, where the value of this option will
|
||||||
|
# be displayed in the footer of every ViewVC page.)
|
||||||
|
address =
|
||||||
|
|
||||||
|
#
|
||||||
|
# This option provides a mechanism for custom key/value pairs to be
|
||||||
|
# available to templates. These are stored in key/value (KV) files.
|
||||||
|
#
|
||||||
|
# The paths of the KV files are listed here, specified either as
|
||||||
|
# absolute paths or relative to this configuration file. The files
|
||||||
|
# use the same format as this configuration file, containing one or
|
||||||
|
# more user-defined sections, and user-defined options in those
|
||||||
|
# sections. ViewVC makes these options available to template authors
|
||||||
|
# as:
|
||||||
|
#
|
||||||
|
# kv.SECTION.OPTION
|
||||||
|
#
|
||||||
|
# Note that an option name can be dotted. For example:
|
||||||
|
#
|
||||||
|
# [my_images]
|
||||||
|
# logos.small = /images/small-logo.png
|
||||||
|
# logos.big = /images/big-logo.png
|
||||||
|
#
|
||||||
|
# Templates can use these with a directive like: [kv.my_images.logos.small]
|
||||||
|
#
|
||||||
|
# Note that section names which are common to multiple KV files will
|
||||||
|
# be merged. If two files have a [my_images] section, then the
|
||||||
|
# options in those two like-named sections will be merged together.
|
||||||
|
# If two files have the same option name in a section, then one will
|
||||||
|
# overwrite the other (and which one "wins" is unspecified).
|
||||||
|
#
|
||||||
|
# To further categorize the KV files, and how the values are provided to
|
||||||
|
# the templates, a KV file name may be annotated with an additional level
|
||||||
|
# of dotted naming. For example:
|
||||||
|
#
|
||||||
|
# kv_files = [asf]kv/images.conf
|
||||||
|
#
|
||||||
|
# Assuming the same section as above, the template would refer to an image
|
||||||
|
# using [kv.asf.my_images.logos.small]
|
||||||
|
#
|
||||||
|
# Lastly, it is possible to use %lang% in the filenames to specify a
|
||||||
|
# substitution of the selected language-tag.
|
||||||
|
#
|
||||||
|
# Example:
|
||||||
|
# kv_files = kv/file1.conf, kv/file2.conf, [i18n]kv/%lang%_data.conf
|
||||||
|
#
|
||||||
|
kv_files =
|
||||||
|
|
||||||
|
#
|
||||||
|
# This option is a comma-separated list of language-tag values
|
||||||
|
# available to ViewVC. The first language-tag listed is the default
|
||||||
|
# language, and will be used if an Accept-Language header is not
|
||||||
|
# present in the request, or none of the user's requested languages
|
||||||
|
# are available. If there are ties on the selection of a language,
|
||||||
|
# then the first to appear in the list is chosen.
|
||||||
|
#
|
||||||
|
# Some examples:
|
||||||
|
#
|
||||||
|
# languages = en-us, de
|
||||||
|
# languages = en-us, en-gb, de
|
||||||
|
# languages = de, fr, en-us
|
||||||
|
#
|
||||||
|
languages = en-us
|
||||||
|
|
||||||
|
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
[utilities]
|
||||||
|
|
||||||
|
# ViewVC uses (sometimes optionally) various third-party programs to do some
|
||||||
|
# of the heavy lifting. Generally, it will attempt to execute those utility
|
||||||
|
# programs in such a way that if they are found in ViewVC's executable
|
||||||
|
# search path ($PATH, %PATH%, etc.) all is well. But sometimes these tools
|
||||||
|
# aren't installed in the executable search path, so here's where you can
|
||||||
|
# tell ViewVC where to find them.
|
||||||
|
#
|
||||||
|
# NOTE: Options with a "_dir" suffix are for configuring the directories
|
||||||
|
# in which certain programs live; otherwise, the option value should
|
||||||
|
# point to the actual program.
|
||||||
|
|
||||||
|
# RCS utilities, used for viewing CVS repositories
|
||||||
|
rcs_dir =
|
||||||
|
# rcs_dir = /usr/bin/
|
||||||
|
|
||||||
|
# ViewVC can use CVSNT (www.cvsnt.org) instead of the RCS utilities to
|
||||||
|
# retrieve information from CVS repositories. To enable use of CVSNT,
|
||||||
|
# set the "cvsnt" value to the path of the CVSNT executable. (If CVSNT
|
||||||
|
# is on the standard path, you can also set it to the name of the
|
||||||
|
# CVSNT executable). By default "cvsnt" is set to "cvs" on Windows and
|
||||||
|
# is not set on other platforms.
|
||||||
|
cvsnt =
|
||||||
|
# cvsnt =
|
||||||
|
# cvsnt = cvs
|
||||||
|
# cvsnt = K:\Program Files\cvsnt\cvs.exe
|
||||||
|
# cvsnt = = /usr/bin/cvs
|
||||||
|
|
||||||
|
# Subversion command-line client, used for viewing Subversion repositories
|
||||||
|
svn =
|
||||||
|
# svn = /usr/bin/svn
|
||||||
|
|
||||||
|
# GNU diff, used for showing file version differences
|
||||||
|
diff =
|
||||||
|
# diff = /usr/bin/diff
|
||||||
|
|
||||||
|
# CvsGraph, a graphical CVS version graph generator (see options.use_cvsgraph)
|
||||||
|
cvsgraph =
|
||||||
|
# cvsgraph = /usr/local/bin/cvsgraph
|
||||||
|
|
||||||
|
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
[options]
|
||||||
|
|
||||||
|
# root_as_url_component: Interpret the first path component in the URL
|
||||||
|
# after the script location as the root to use. This is an
|
||||||
|
# alternative to using the "root=" query key. If ViewVC is configured
|
||||||
|
# with multiple repositories, this results in more natural looking
|
||||||
|
# ViewVC URLs.
|
||||||
|
# Note: Enabling this option will break backwards compatibility with
|
||||||
|
# any old ViewCVS URL which doesn't have an explicit "root" parameter.
|
||||||
|
root_as_url_component = 1
|
||||||
|
|
||||||
|
# checkout_magic: Use checkout links with magic /*checkout*/ prefixes so
|
||||||
|
# checked out HTML pages can have working links to other repository files
|
||||||
|
# Note: This option is DEPRECATED and should not be used in new ViewVC
|
||||||
|
# installations. Setting "default_file_view = co" achieves the same effect
|
||||||
|
checkout_magic = 0
|
||||||
|
|
||||||
|
# allowed_views: List the ViewVC views which are enabled. Views not
|
||||||
|
# in this comma-delited list will not be served (or, will return an
|
||||||
|
# error on attempted access).
|
||||||
|
# Possible values: "tar", "annotate", "co", "markup", "roots"
|
||||||
|
allowed_views = markup, annotate, roots
|
||||||
|
|
||||||
|
# authorizer: The name of the ViewVC authorizer plugin to use when
|
||||||
|
# authorizing access to repository contents. This value must be the
|
||||||
|
# name of a Python module addressable as vcauth.MODULENAME (most
|
||||||
|
# easily accomplished by placing it in ViewVC's lib/vcauth/ directory)
|
||||||
|
# and which implements a ViewVCAuthorizer class (as a subclass of
|
||||||
|
# vcauth.GenericViewVCAuthorizer). You can provide custom parameters
|
||||||
|
# to the authorizer module by defining configuration sections named
|
||||||
|
# authz-MODULENAME and adding the parameter keys and values there.
|
||||||
|
#
|
||||||
|
# ViewVC provides the following modules:
|
||||||
|
# svnauthz - based on Subversion authz files
|
||||||
|
# forbidden - simple path glob matches against top-level root directories
|
||||||
|
# forbiddenre - root and path matches against regular expressions
|
||||||
|
#
|
||||||
|
# NOTE: Only one authorizer may be in use for a given ViewVC request.
|
||||||
|
# It doesn't matter if you configure the parameters of multiple
|
||||||
|
# authorizer plugins -- only the authorizer whose name is configured
|
||||||
|
# here (or effectively configured here via vhost configuration) will
|
||||||
|
# be activated.
|
||||||
|
authorizer = forbidden
|
||||||
|
|
||||||
|
# hide_cvsroot: Don't show the CVSROOT directory
|
||||||
|
# 1 Hide CVSROOT directory
|
||||||
|
# 0 Show CVSROOT directory
|
||||||
|
# NOTE: Someday this option may be removed in favor of letting
|
||||||
|
# individual authorizer plugin hide the CVSROOT.
|
||||||
|
hide_cvsroot = 1
|
||||||
|
|
||||||
|
# mangle_email_addresses: Mangle email addresses in marked-up output.
|
||||||
|
# There are various levels of mangling available:
|
||||||
|
# 0 - No mangling; markup un-mangled email addresses as hyperlinks
|
||||||
|
# 1 - Obfuscation (using entity encoding); no hyperlinking
|
||||||
|
# 2 - Data-dropping address truncation; no hyperlinking
|
||||||
|
# Note: this will not effect the display of versioned file contents, only
|
||||||
|
# addresses that appear in version control metadata (e.g. log messages).
|
||||||
|
mangle_email_addresses = 0
|
||||||
|
|
||||||
|
# default_file_view: "log", "co", or "markup"
|
||||||
|
# Controls whether the default view for file URLs is a checkout view or
|
||||||
|
# a log view. "log" is the default for backwards compatibility with old
|
||||||
|
# ViewCVS URLs, but "co" has the advantage that it allows ViewVC to serve
|
||||||
|
# static HTML pages directly from a repository with working links
|
||||||
|
# to other repository files
|
||||||
|
# Note: Changing this option may break compatibility with existing
|
||||||
|
# bookmarked URLs.
|
||||||
|
# Also note: If you choose one of the "co" or "markup" views, be sure
|
||||||
|
# to enable it (via the allowed_views option)
|
||||||
|
default_file_view = log
|
||||||
|
|
||||||
|
# http_expiration_time: Expiration time (in seconds) for cacheable
|
||||||
|
# pages served by ViewVC. Note that in most cases, a cache aware
|
||||||
|
# client will only revalidate the page after it expires (using the
|
||||||
|
# If-Modified-Since and/or If-None-Match headers) and that browsers
|
||||||
|
# will also revalidate the page when the reload button is pressed.
|
||||||
|
# Set to 0 to disable the transmission of these caching headers.
|
||||||
|
http_expiration_time = 600
|
||||||
|
|
||||||
|
# generate_etags: Generate Etag headers for relevant pages to assist
|
||||||
|
# in browser caching.
|
||||||
|
# 1 Generate Etags
|
||||||
|
# 0 Don't generate Etags
|
||||||
|
generate_etags = 1
|
||||||
|
|
||||||
|
# svn_config_dir: Path of the Subversion runtime configuration
|
||||||
|
# directory ViewVC should consult for various things, including cached
|
||||||
|
# remote authentication credentials. If unset, Subversion will use
|
||||||
|
# the default location(s) ($HOME/.subversion, etc.)
|
||||||
|
svn_config_dir =
|
||||||
|
|
||||||
|
# use the rcsparse Python module to retrieve CVS repository
|
||||||
|
# information instead of invoking rcs utilities [EXPERIMENTAL]
|
||||||
|
use_rcsparse = 0
|
||||||
|
|
||||||
|
# sort_by: File sort order
|
||||||
|
# file Sort by filename
|
||||||
|
# rev Sort by revision number
|
||||||
|
# date Sort by commit date
|
||||||
|
# author Sort by author
|
||||||
|
# log Sort by log message
|
||||||
|
sort_by = file
|
||||||
|
|
||||||
|
# sort_group_dirs: Group directories when sorting
|
||||||
|
# 1 Group directories together
|
||||||
|
# 0 No grouping -- sort directories as any other item would be sorted
|
||||||
|
sort_group_dirs = 1
|
||||||
|
|
||||||
|
# hide_attic: Hide or show the contents of the Attic subdirectory
|
||||||
|
# 1 Hide dead files inside Attic subdir
|
||||||
|
# 0 Show the files which are inside the Attic subdir
|
||||||
|
hide_attic = 1
|
||||||
|
|
||||||
|
# hide_errorful_entries: Hide or show errorful directory entries
|
||||||
|
# (perhaps due to not being readable, or some other rlog parsing
|
||||||
|
# error, etc.)
|
||||||
|
# 1 Hide errorful entries from the directory display
|
||||||
|
# 0 Show errorful entries (with their errors) in the directory display
|
||||||
|
hide_errorful_entries = 0
|
||||||
|
|
||||||
|
# log_sort: Sort order for log messages
|
||||||
|
# date Sort revisions by date
|
||||||
|
# rev Sort revision by revision number
|
||||||
|
# none Use the version control system's ordering
|
||||||
|
log_sort = date
|
||||||
|
|
||||||
|
# diff_format: Default diff format
|
||||||
|
# h Human readable
|
||||||
|
# u Unified diff
|
||||||
|
# c Context diff
|
||||||
|
# s Side by side
|
||||||
|
# l Long human readable (more context)
|
||||||
|
# f Full human readable (entire file)
|
||||||
|
diff_format = h
|
||||||
|
|
||||||
|
# hr_breakable: Diff view line breaks
|
||||||
|
# 1 lines break at spaces
|
||||||
|
# 0 no line breaking
|
||||||
|
# Or, use a positive integer > 1 to cut lines after that many characters
|
||||||
|
hr_breakable = 1
|
||||||
|
|
||||||
|
# give out function names in human readable diffs
|
||||||
|
# this just makes sense if we have C-files, otherwise
|
||||||
|
# diff's heuristic doesn't work well ..
|
||||||
|
# ( '-p' option to diff)
|
||||||
|
hr_funout = 0
|
||||||
|
|
||||||
|
# ignore whitespaces for human readable diffs
|
||||||
|
# (indendation and stuff ..)
|
||||||
|
# ( '-w' option to diff)
|
||||||
|
hr_ignore_white = 0
|
||||||
|
|
||||||
|
# ignore diffs which are caused by
|
||||||
|
# keyword-substitution like $Id - Stuff
|
||||||
|
# ( '-kk' option to rcsdiff)
|
||||||
|
hr_ignore_keyword_subst = 1
|
||||||
|
|
||||||
|
# Enable highlighting of intraline changes in human readable diffs
|
||||||
|
# this feature is experimental and currently requires python 2.4
|
||||||
|
hr_intraline = 0
|
||||||
|
|
||||||
|
# allow compression with gzip of output if the Browser accepts it
|
||||||
|
# (HTTP_ACCEPT_ENCODING contains "gzip")
|
||||||
|
#allow_compress = 1
|
||||||
|
|
||||||
|
# The directory which contains the EZT templates used by ViewVC to
|
||||||
|
# customize the display of the various output views. ViewVC looks in
|
||||||
|
# this directory for files with names that match the name of the view
|
||||||
|
# ("log", "directory", etc.) plus the ".ezt" extension. If specified
|
||||||
|
# as a relative path, it is relative to the directory where this config
|
||||||
|
# file resides; absolute paths may be used as well.
|
||||||
|
#
|
||||||
|
# If %lang% occurs in the pathname, then the selected language will be
|
||||||
|
# substituted.
|
||||||
|
#
|
||||||
|
# See also the [templates] configuration section, where you can
|
||||||
|
# override templates on a per-view basis.
|
||||||
|
#
|
||||||
|
template_dir = templates
|
||||||
|
|
||||||
|
# Web path to a directory that contains ViewVC static files
|
||||||
|
# (stylesheets, images, etc.) If set, static files will get
|
||||||
|
# downloaded directory from this location. If unset, static files
|
||||||
|
# will be served by the ViewVC script (at a likely performance
|
||||||
|
# penalty, and from the "docroot" subdirectory of the directory
|
||||||
|
# specified by the "template_dir" option).
|
||||||
|
#docroot = /docroot
|
||||||
|
|
||||||
|
# Show last changelog message for CVS subdirectories
|
||||||
|
# NOTE: The current implementation makes many assumptions and may show
|
||||||
|
# the incorrect file at some times. The main assumption is that the
|
||||||
|
# last modified file has the newest filedate. But some CVS operations
|
||||||
|
# touches the file without even when a new version is not checked in,
|
||||||
|
# and TAG based browsing essentially puts this out of order, unless
|
||||||
|
# the last checkin was on the same tag as you are viewing. Enable
|
||||||
|
# this if you like the feature, but don't rely on correct results.
|
||||||
|
#
|
||||||
|
# ** WARNING: Enabling this will currently leak unauthorized path names **
|
||||||
|
show_subdir_lastmod = 0
|
||||||
|
|
||||||
|
# Show the most recent log entry in directory listings.
|
||||||
|
show_logs = 1
|
||||||
|
|
||||||
|
# Show log when viewing file contents
|
||||||
|
show_log_in_markup = 1
|
||||||
|
|
||||||
|
# Cross filesystem copies when traversing Subversion file revision histories.
|
||||||
|
cross_copies = 1
|
||||||
|
|
||||||
|
# Display dates as UTC or in local time zone
|
||||||
|
use_localtime = 0
|
||||||
|
#use_localtime = 1
|
||||||
|
|
||||||
|
### CONFIGURATION DEFAULTS ###
|
||||||
|
###
|
||||||
|
### Defaults for configuration variables that shouldn't need
|
||||||
|
### to be configured..
|
||||||
|
|
||||||
|
# the length to which the most recent log entry should be truncated when
|
||||||
|
# shown in the directory view
|
||||||
|
short_log_len = 80
|
||||||
|
|
||||||
|
# should we colorize known file content syntaxes? (requires Pygments module)
|
||||||
|
enable_syntax_coloration = 1
|
||||||
|
|
||||||
|
# Use CvsGraph. See http://www.akhphd.au.dk/~bertho/cvsgraph/ for
|
||||||
|
# documentation and download.
|
||||||
|
use_cvsgraph = 0
|
||||||
|
#use_cvsgraph = 1
|
||||||
|
|
||||||
|
# Location of the customized cvsgraph configuration file.
|
||||||
|
cvsgraph_conf = cvsgraph.conf
|
||||||
|
|
||||||
|
#
|
||||||
|
# Set to enable regular expression search of all files in a directory
|
||||||
|
#
|
||||||
|
# WARNING:
|
||||||
|
#
|
||||||
|
# Enabling this option can consume HUGE amounts of server time. A
|
||||||
|
# "checkout" must be performed on *each* file in a directory, and
|
||||||
|
# the result needs to be searched for a match against the regular
|
||||||
|
# expression.
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# SECURITY WARNING: Denial Of Service
|
||||||
|
#
|
||||||
|
# Since a user can enter the regular expression, it is possible for
|
||||||
|
# them to enter an expression with many alternatives and a lot of
|
||||||
|
# backtracking. Executing that search over thousands of lines over
|
||||||
|
# dozens of files can easily tie up a server for a long period of
|
||||||
|
# time.
|
||||||
|
#
|
||||||
|
# This option should only be used on sites with trusted users. It is
|
||||||
|
# highly inadvisable to use this on a public site.
|
||||||
|
#
|
||||||
|
use_re_search = 0
|
||||||
|
# use_re_search = 1
|
||||||
|
|
||||||
|
#
|
||||||
|
# Split directories and logs into pages.
|
||||||
|
# Allows ViewVC to present discrete pages to the users instead of the
|
||||||
|
# entire log or directory.
|
||||||
|
# Set use_pagesize to the number of entries you want displayed on a page.
|
||||||
|
#
|
||||||
|
use_pagesize = 0
|
||||||
|
# use_pagesize = 20
|
||||||
|
|
||||||
|
# Limit number of changed paths shown per commit in the Subversion revision
|
||||||
|
# view and in query results. This is not a hard limit (the UI provides
|
||||||
|
# options to show all changed paths), but it prevents ViewVC from generating
|
||||||
|
# enormous and hard to read pages by default when they happen to contain
|
||||||
|
# import or merge commits affecting hundreds or thousands of files.
|
||||||
|
# Set to 0 to disable the limit.
|
||||||
|
limit_changes = 100
|
||||||
|
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
[templates]
|
||||||
|
|
||||||
|
# You can override the templates used by various ViewVC views in this
|
||||||
|
# section. By default, ViewVC will look for templates in the
|
||||||
|
# directory specified by the "template_dir" configuration option (see
|
||||||
|
# the documentation for that option for details). But if you want to
|
||||||
|
# use a different template for a particular view, simply uncomment the
|
||||||
|
# appropriate option below and specify the currect location of the EZT
|
||||||
|
# template file you wish to use for that view.
|
||||||
|
#
|
||||||
|
# Templates are specified relative to the configured template
|
||||||
|
# directory (see the "template_dir" option), but absolute paths may
|
||||||
|
# also be used as well.
|
||||||
|
#
|
||||||
|
# If %lang% occurs in the pathname, then the selected language will be
|
||||||
|
# substituted.
|
||||||
|
#
|
||||||
|
# Note: the selected language is defined by the "languages" item in the
|
||||||
|
# [general] section, and based on the request's Accept-Language
|
||||||
|
# header.
|
||||||
|
#
|
||||||
|
#diff = diff.ezt
|
||||||
|
#directory = directory.ezt
|
||||||
|
### an alternative directory view
|
||||||
|
#directory = dir_new.ezt
|
||||||
|
#error = error.ezt
|
||||||
|
#file = file.ezt
|
||||||
|
#graph = graph.ezt
|
||||||
|
#log = log.ezt
|
||||||
|
### a table-based alternative log view
|
||||||
|
#log = log_table.ezt
|
||||||
|
#query = query.ezt
|
||||||
|
#query_form = query_form.ezt
|
||||||
|
#query_results = query_results.ezt
|
||||||
|
#revision = revision.ezt
|
||||||
|
#roots = roots.ezt
|
||||||
|
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
[cvsdb]
|
||||||
|
|
||||||
|
# Set to 1 to enable the database integration feature, 0 otherwise.
|
||||||
|
enabled = 0
|
||||||
|
|
||||||
|
# Database hostname and port.
|
||||||
|
#host = localhost
|
||||||
|
#port = 3306
|
||||||
|
|
||||||
|
# ViewVC database name.
|
||||||
|
#database_name = ViewVC
|
||||||
|
|
||||||
|
# Username and password of user with read/write privileges to the ViewVC
|
||||||
|
# database.
|
||||||
|
#user =
|
||||||
|
#passwd =
|
||||||
|
|
||||||
|
# Username and password of user with read privileges to the ViewVC
|
||||||
|
# database.
|
||||||
|
#readonly_user =
|
||||||
|
#readonly_passwd =
|
||||||
|
|
||||||
|
# Limit the number of rows returned by a given query to this number.
|
||||||
|
#row_limit = 1000
|
||||||
|
|
||||||
|
# Limit the number of rows returned by a given query made as part an
|
||||||
|
# RSS feed request to this number. (Keeping in mind that RSS readers
|
||||||
|
# tend to poll regularly for new data, you might want to keep this set
|
||||||
|
# to a conservative number.)
|
||||||
|
#rss_row_limit = 100
|
||||||
|
|
||||||
|
# Check if the repository is found in the database before showing
|
||||||
|
# the query link and RSS feeds. Set to 1 to enable check.
|
||||||
|
#
|
||||||
|
# WARNING: Enabling this check adds the cost of a database connection
|
||||||
|
# and query to most ViewVC requests. If all your roots are represented
|
||||||
|
# in the commits database, or if you don't care about the creation of
|
||||||
|
# RSS and query links that might lead ultimately to error pages for
|
||||||
|
# certain of your roots, or if you simply don't want to add this extra
|
||||||
|
# cost to your ViewVC requests, leave this disabled.
|
||||||
|
#check_database_for_root = 0
|
||||||
|
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
[vhosts]
|
||||||
|
|
||||||
|
# Virtual hosts are individual logical servers accessible via
|
||||||
|
# different hostnames, but which are all really the same physical
|
||||||
|
# computer. For example, you might have your web server configured to
|
||||||
|
# accept incoming traffic for both http://www.yourdomain.com/ and
|
||||||
|
# http://viewvc.yourdomain.com/. Users pointing their web browsers at
|
||||||
|
# each of those two URLs might see entirely different content via one
|
||||||
|
# URL versus the other, but all that content actually lives on the
|
||||||
|
# same computer, is served up via the same web server, and so
|
||||||
|
# on. It just *looks* like its coming from multiple servers.
|
||||||
|
#
|
||||||
|
# ViewVC allows you to customize its configuration options for
|
||||||
|
# individual virtual hosts. You might, for example, wish to expose
|
||||||
|
# all of your Subversion repositories at http://svn.yourdomain.com/viewvc/
|
||||||
|
# and all your CVS ones at http://cvs.yourdomain.com/viewvc/, with no
|
||||||
|
# cross-exposure. Using ViewVC's virtual host (vhost) configuration
|
||||||
|
# support, you can do this. Simply create two vhost configurations
|
||||||
|
# (one for each of your hostnames), then configure the cvs_roots
|
||||||
|
# option only for the vhost associated with cvs.yourdomain.com, and
|
||||||
|
# configure the svn_roots option only for the vhost associated with
|
||||||
|
# svn.yourdomain.com.
|
||||||
|
#
|
||||||
|
# This section is a freeform configuration section, where you create
|
||||||
|
# both the option names and their values. The names of the options
|
||||||
|
# are then treated as canonical names of virtual hosts, and their
|
||||||
|
# values are defined to be comma-delimited lists of hostname globs
|
||||||
|
# against which incoming ViewVC requests will be matched to figure out
|
||||||
|
# which vhost they apply to.
|
||||||
|
#
|
||||||
|
# After you've named and defined your vhosts, you may then create new
|
||||||
|
# configuration sections whose names are of the form
|
||||||
|
# vhost-VHOSTNAME/CONFIGSECTION. VHOSTNAME here is the canonical name
|
||||||
|
# of one of the virtual hosts you defined under the [vhosts] section.
|
||||||
|
# Inside those configuration sections, you override the standard
|
||||||
|
# ViewVC options typically found in the base configuration section
|
||||||
|
# named CONFIGSECTION ("general", "option", etc.)
|
||||||
|
#
|
||||||
|
# Here is an example:
|
||||||
|
#
|
||||||
|
# [vhosts]
|
||||||
|
# libs = libs.yourdomain.*, *.yourlibs.*
|
||||||
|
# gui = guiproject.yourdomain.*
|
||||||
|
#
|
||||||
|
# [vhost-libs/general]
|
||||||
|
# cvs_roots =
|
||||||
|
# svn_roots = svnroot: /var/svn/libs-repos
|
||||||
|
# default_root = svnroot
|
||||||
|
#
|
||||||
|
# [vhost-libs/options]
|
||||||
|
# show_logs = 1
|
||||||
|
#
|
||||||
|
# [vhost-gui/general]
|
||||||
|
# cvs_roots = cvsroot: /var/cvs/guiproject
|
||||||
|
# svn_roots =
|
||||||
|
# default_root = cvsroot
|
||||||
|
#
|
||||||
|
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# ViewVC recognizes per-root configuration overrides, too. To
|
||||||
|
# override the value of a configuration parameter only for a single
|
||||||
|
# root, create a configuration section whose names is of the form
|
||||||
|
# root-ROOTNAME/CONFIGSECTION. ROOTNAME here is the name of the root
|
||||||
|
# as defined explicitly in cvs_roots or svn_roots or implicitly as the
|
||||||
|
# basename of a root path in root_parents. Options found in this new
|
||||||
|
# configuration section override for this one root the corresponding
|
||||||
|
# options found in the base configuration section CONFIGSECTION
|
||||||
|
# ("options", "authz-*", etc.)
|
||||||
|
#
|
||||||
|
# Here is an example showing how to enable Subversion authz-based
|
||||||
|
# authorization for only the single root named "svnroot":
|
||||||
|
#
|
||||||
|
# [root-svnroot/options]
|
||||||
|
# authorizer = svnauthz
|
||||||
|
#
|
||||||
|
# [root-svnroot/authz-svnauthz]
|
||||||
|
# authzfile = /path/to/authzfile
|
||||||
|
#
|
||||||
|
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
[authz-forbidden]
|
||||||
|
|
||||||
|
# The "forbidden" authorizer forbids access to repository modules,
|
||||||
|
# defined to be top-level subdirectories in a repository. You can use
|
||||||
|
# a simple list of modules, or something more complex:
|
||||||
|
#
|
||||||
|
# *) The "!" can be used before a module to explicitly state that it
|
||||||
|
# is NOT forbidden. Whenever this form is seen, then all modules will
|
||||||
|
# be forbidden unless one of the "!" modules match.
|
||||||
|
#
|
||||||
|
# *) Shell-style "glob" expressions may be used. "*" will match any
|
||||||
|
# sequence of zero or more characters, "?" will match any single
|
||||||
|
# character, "[seq]" will match any character in seq, and "[!seq]"
|
||||||
|
# will match any character not in seq.
|
||||||
|
#
|
||||||
|
# *) Tests are performed in sequence. The first match will terminate the
|
||||||
|
# testing. This allows for more complex allow/deny patterns.
|
||||||
|
#
|
||||||
|
# Tests are case-sensitive.
|
||||||
|
#
|
||||||
|
# NOTE: Again, this is for the hiding of modules within repositories, *not*
|
||||||
|
# for the hiding of repositories (roots) themselves.
|
||||||
|
#
|
||||||
|
# Some examples:
|
||||||
|
#
|
||||||
|
# Disallow "example" but allow all others:
|
||||||
|
# forbidden = example
|
||||||
|
#
|
||||||
|
# Disallow "example1" and "example2" but allow all others:
|
||||||
|
# forbidden = example1, example2
|
||||||
|
#
|
||||||
|
# Allow *only* "example1" and "example2":
|
||||||
|
# forbidden = !example1, !example2
|
||||||
|
#
|
||||||
|
# Forbid modules starting with "x":
|
||||||
|
# forbidden = x*
|
||||||
|
#
|
||||||
|
# Allow modules starting with "x" but no others:
|
||||||
|
# forbidden = !x*
|
||||||
|
#
|
||||||
|
# Allow "xml", forbid other modules starting with "x", and allow the rest:
|
||||||
|
# forbidden = !xml, x*, !*
|
||||||
|
#
|
||||||
|
forbidden =
|
||||||
|
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
[authz-forbiddenre]
|
||||||
|
|
||||||
|
# The "forbiddenre" authorizer forbids access to repositories and
|
||||||
|
# repository paths by comparing a list of regular expressions
|
||||||
|
# (separated by commas) against paths consisting of the repository (or
|
||||||
|
# root) name plus the path of the versioned file or directory to be
|
||||||
|
# tested. For example, to see if the user is authorized to see the
|
||||||
|
# path "/trunk/www/index.html" in the repository whose root name is
|
||||||
|
# "svnrepos", this authorizer will check the path
|
||||||
|
# "svnrepos/trunk/www/index.html" against the list of forbidden
|
||||||
|
# regular expressions. Directory paths will be terminated by a forward
|
||||||
|
# slash.
|
||||||
|
#
|
||||||
|
# Like the "forbidden" authorizer...
|
||||||
|
#
|
||||||
|
# *) The "!" can be used before a module to explicitly state that it
|
||||||
|
# is NOT forbidden. Whenever this form is seen, then all modules will
|
||||||
|
# be forbidden unless one of the "!" modules match.
|
||||||
|
#
|
||||||
|
# *) Tests are performed in sequence. The first match will terminate the
|
||||||
|
# testing. This allows for more complex allow/deny patterns.
|
||||||
|
#
|
||||||
|
# Unlike the "forbidden" authorizer, you can can use this to hide roots, too.
|
||||||
|
#
|
||||||
|
# Some examples:
|
||||||
|
#
|
||||||
|
# Disallow files named "PRIVATE", but allow all others:
|
||||||
|
# forbiddenre = /PRIVATE$
|
||||||
|
#
|
||||||
|
# Disallow the "hidden" repository, allowing all others:
|
||||||
|
# forbiddenre = ^hidden(/|$)
|
||||||
|
#
|
||||||
|
# Allow only the "example1" and "example2" roots and the paths inside them,
|
||||||
|
# disallowing all others (which can be done in multiple ways):
|
||||||
|
# forbiddenre = !^example1(/|$), !^example2(/|$)/
|
||||||
|
# forbiddenre = !^example[12](/|$)
|
||||||
|
#
|
||||||
|
# Only allow visibility of HTML files and the directories that hold them:
|
||||||
|
# forbiddenre = !^([^/]+|.*(/|\.html))$
|
||||||
|
#
|
||||||
|
forbiddenre =
|
||||||
|
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
[authz-svnauthz]
|
||||||
|
|
||||||
|
# The "svnauthz" authorizer uses a Subversion authz configuration file
|
||||||
|
# to determine access to repository paths. This option specifies the
|
||||||
|
# location of that file using an absolute path.
|
||||||
|
#
|
||||||
|
authzfile =
|
||||||
|
|
||||||
|
#---------------------------------------------------------------------------
|
@@ -228,9 +228,8 @@
|
|||||||
which describes the directives used in the HTML templates used by
|
which describes the directives used in the HTML templates used by
|
||||||
ViewVC. The templates themselves can be found in the
|
ViewVC. The templates themselves can be found in the
|
||||||
<code>templates</code> subdirectory. We're currently developing a
|
<code>templates</code> subdirectory. We're currently developing a
|
||||||
how-to guide for
|
how-to guide for <a href="./template-authoring-guide.html">ViewVC
|
||||||
<a href="http://viewvc.tigris.org/source/browse/viewvc/trunk/docs/template-authoring-guide.html?rev=HEAD"
|
template customization</a>.</p>
|
||||||
>ViewVC template customization</a>.</p>
|
|
||||||
|
|
||||||
</div> <!-- section-body -->
|
</div> <!-- section-body -->
|
||||||
</div> <!-- section -->
|
</div> <!-- section -->
|
||||||
|
@@ -35,8 +35,7 @@
|
|||||||
|
|
||||||
<ul id="bookmarks">
|
<ul id="bookmarks">
|
||||||
<li><a href="#sec-download">Downloading</a></li>
|
<li><a href="#sec-download">Downloading</a></li>
|
||||||
<li><a href="#sec-subversion">Subversion Checkout</a></li>
|
<li><a href="#sec-subversion">Subversion</a></li>
|
||||||
<li><a href="#sec-upgrading">Upgrading</a></li>
|
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<p><a href="http://validator.w3.org/check?uri=referer"><img
|
<p><a href="http://validator.w3.org/check?uri=referer"><img
|
||||||
@@ -69,7 +68,7 @@
|
|||||||
|
|
||||||
<div class="section">
|
<div class="section">
|
||||||
|
|
||||||
<h2 id="sec-subversion">Subversion Checkout</h2>
|
<h2 id="sec-subversion">Subversion</h2>
|
||||||
|
|
||||||
<div class="section-body">
|
<div class="section-body">
|
||||||
|
|
||||||
@@ -84,36 +83,6 @@
|
|||||||
</div> <!-- section-body -->
|
</div> <!-- section-body -->
|
||||||
</div> <!-- section -->
|
</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>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
|
@@ -63,9 +63,6 @@
|
|||||||
<li><a href="#installation">Where does the installation documentation,
|
<li><a href="#installation">Where does the installation documentation,
|
||||||
if any, live?</a></li>
|
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
|
<li><a href="#authz-support">Does ViewVC support path-based
|
||||||
authorization, such as Subversion's authz-file mechanism?</a></li>
|
authorization, such as Subversion's authz-file mechanism?</a></li>
|
||||||
|
|
||||||
@@ -87,9 +84,6 @@
|
|||||||
|
|
||||||
<ul>
|
<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
|
<li><a href="#rlog-output-ended-early">What causes "Error: Rlog output ended
|
||||||
early. Expected RCS file "/opt/cvs/project/file,v""?</a></li>
|
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>
|
>http://viewvc.tigris.org/source/browse/*checkout*/viewvc/trunk/docs/upgrading-howto.html</a>.</p>
|
||||||
</div>
|
</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">
|
<div id="authz-support">
|
||||||
<p class="faq-atitle">Does ViewVC support path-based authorization,
|
<p class="faq-atitle">Does ViewVC support path-based authorization,
|
||||||
such as Subversion's authz-file mechanism?</p>
|
such as Subversion's authz-file mechanism?</p>
|
||||||
|
|
||||||
<p>This feature is available in ViewVC 1.1.0, which you can get from
|
<p>There are no released versions of ViewVC which have this support
|
||||||
our <a href="http://viewvc.org/download.html" >Download</a>
|
built-in. The feature request is being tracking in <a
|
||||||
page.</p>
|
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
|
<p>In the meantime, there are some available workarounds. For
|
||||||
workarounds. For example, if you are running ViewVC under Apache,
|
example, if you are running ViewVC under Apache, you can use
|
||||||
you can use regular Apache configuration directives to
|
regular Apache configuration directives to authz-protect areas of
|
||||||
authz-protect areas of your repository — see
|
your repository — see the <a
|
||||||
the <a href="http://httpd.apache.org/docs/2.2/mod/core.html#location"
|
href="http://httpd.apache.org/docs/2.2/mod/core.html#location"
|
||||||
>Location</a>
|
>Location</a> and <a
|
||||||
and <a href="http://httpd.apache.org/docs/2.2/mod/core.html#locationmatch"
|
href="http://httpd.apache.org/docs/2.2/mod/core.html#locationmatch"
|
||||||
>LocationMatch</a> directives, as well as
|
>LocationMatch</a> directives, as well as the <a
|
||||||
the <a href="http://httpd.apache.org/docs/2.2/howto/auth.html"
|
href="http://httpd.apache.org/docs/2.2/howto/auth.html"
|
||||||
>Authentication, Authorization and Access Control</a> portions of
|
>Authentication, Authorization and Access Control</a> portions of
|
||||||
the Apache HTTP Server documentation. This works best when ViewVC
|
the Apache HTTP Server documentation. This works best when ViewVC
|
||||||
is only serving up a single repository, or when the
|
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>
|
<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">
|
<div id="rlog-output-ended-early">
|
||||||
|
|
||||||
<p class="faq-atitle">What causes "Error: Rlog output ended
|
<p class="faq-atitle">What causes "Error: Rlog output ended
|
||||||
early. Expected RCS file "/opt/cvs/project/file,v""?</p>
|
early. Expected RCS file "/opt/cvs/project/file,v""?</p>
|
||||||
|
|
||||||
<p>This is another symptom of the basic problem described <a
|
<p>This error generally occurs when ViewVC is unable to locate the
|
||||||
href="#error-displaying-cvs-files">here</a>.</p>
|
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>
|
</div>
|
||||||
|
|
||||||
@@ -281,7 +246,7 @@ ScriptAlias / /usr/local/viewvc/bin/cgi/viewvc.cgi/</pre></blockquote>
|
|||||||
find filename in co output stream"?</p>
|
find filename in co output stream"?</p>
|
||||||
|
|
||||||
<p>This is another symptom of the basic problem described <a
|
<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>
|
</div>
|
||||||
|
|
||||||
|
@@ -36,6 +36,7 @@
|
|||||||
<ul id="bookmarks">
|
<ul id="bookmarks">
|
||||||
<li><a href="#sec-what-is-viewvc">What Is ViewVC?</a></li>
|
<li><a href="#sec-what-is-viewvc">What Is ViewVC?</a></li>
|
||||||
<li><a href="#sec-requirements">Requirements</a></li>
|
<li><a href="#sec-requirements">Requirements</a></li>
|
||||||
|
<li><a href="#sec-future">Future Plans</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<p><a href="http://validator.w3.org/check?uri=referer"><img
|
<p><a href="http://validator.w3.org/check?uri=referer"><img
|
||||||
@@ -65,14 +66,7 @@
|
|||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
|
|
||||||
<li>Support for filesystem-accessible CVS and Subversion
|
<li>Support for filesystem-accessible CVS and Subversion repositories.</li>
|
||||||
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>Individually configurable virtual host support.</li>
|
<li>Individually configurable virtual host support.</li>
|
||||||
|
|
||||||
@@ -94,8 +88,7 @@
|
|||||||
<li>Tarball generation (by tag/branch for CVS, by revision for
|
<li>Tarball generation (by tag/branch for CVS, by revision for
|
||||||
Subversion).</li>
|
Subversion).</li>
|
||||||
|
|
||||||
<li>Localization support based on the Accept-Language request
|
<li>I18N support based on the Accept-Language request header.</li>
|
||||||
header.</li>
|
|
||||||
|
|
||||||
<li>Ability to run either as CGI script or as a standalone
|
<li>Ability to run either as CGI script or as a standalone
|
||||||
server.</li>
|
server.</li>
|
||||||
@@ -125,21 +118,6 @@
|
|||||||
href="http://www.python.org/">Python 1.5.2</a> or later. All other
|
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>
|
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
|
<p>If you plan to use ViewVC with CVS repositories, you need the
|
||||||
following things:</p>
|
following things:</p>
|
||||||
|
|
||||||
@@ -155,25 +133,65 @@
|
|||||||
|
|
||||||
</ul>
|
</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
|
<p>ViewVC integrates with additional pieces of software to provide
|
||||||
certain bits of optional functionality:</p>
|
certain bits of optional functionality:</p>
|
||||||
|
|
||||||
<ul>
|
<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
|
<li><a href="http://www.mysql.com/">MySQL</a> — Needed to use
|
||||||
the commit database query functionality.</li>
|
the commit database query functionality.</li>
|
||||||
|
|
||||||
<li><a href="http://pygments.org/">Pygments</a> — Needed for
|
<li><a href="http://www.codento.com/people/mtr/genscript/">GNU
|
||||||
syntax highlighting in versioned file contents
|
enscript</a> — Needed for syntax highlighting in versioned
|
||||||
displays.</li>
|
file contents displays</li>
|
||||||
|
|
||||||
<li><a href="http://www.akhphd.au.dk/~bertho/cvsgraph/">CvsGraph</a>
|
<li><a href="http://www.akhphd.au.dk/~bertho/cvsgraph/">CvsGraph</a>
|
||||||
— Needed for version graph displays.</li>
|
— 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>
|
</ul>
|
||||||
|
|
||||||
</div> <!-- section-body -->
|
</div> <!-- section-body -->
|
||||||
|
@@ -46,7 +46,7 @@ def make_release(branch, export_dir, publish_dir, root_url, username, password):
|
|||||||
curdir = os.getcwd()
|
curdir = os.getcwd()
|
||||||
try:
|
try:
|
||||||
os.chdir(os.path.join(export_dir, 'tools'))
|
os.chdir(os.path.join(export_dir, 'tools'))
|
||||||
os.system('./make-release %s %s' % (distname, branch))
|
os.system('./make-release %s' % (distname))
|
||||||
finally:
|
finally:
|
||||||
os.chdir(curdir)
|
os.chdir(curdir)
|
||||||
|
|
||||||
|
@@ -8,7 +8,6 @@
|
|||||||
#longdescription { border: none; }
|
#longdescription { border: none; }
|
||||||
#longdescription h2 { display: none; }
|
#longdescription h2 { display: none; }
|
||||||
#customcontent h2 { display: block; }
|
#customcontent h2 { display: block; }
|
||||||
.h2 { margin-bottom: 2em; }
|
|
||||||
</style>
|
</style>
|
||||||
<!-- End custom stylations -->
|
<!-- End custom stylations -->
|
||||||
</head>
|
</head>
|
||||||
@@ -19,27 +18,10 @@
|
|||||||
|
|
||||||
<h1>ViewVC — Web-based Version Control Repository Browsing</h1>
|
<h1>ViewVC — Web-based Version Control Repository Browsing</h1>
|
||||||
|
|
||||||
<div class="h2"
|
<div class="h2">
|
||||||
style="border-style: solid;
|
<h2>Latest Release</h2>
|
||||||
border-width: 1px 2px 2px 1px;
|
|
||||||
border-color: black;
|
|
||||||
background: #eed;
|
|
||||||
padding: 0.5em;">
|
|
||||||
|
|
||||||
<h2>Latest Release(s)</h2>
|
<p>The most recent release of ViewVC is: <strong>1.0.7</strong></p>
|
||||||
|
|
||||||
<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>
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -63,16 +45,15 @@
|
|||||||
<li>Line-based annotation/blame display</li>
|
<li>Line-based annotation/blame display</li>
|
||||||
<li>Revision graph capabilities (<em>CVS only</em>)</li>
|
<li>Revision graph capabilities (<em>CVS only</em>)</li>
|
||||||
<li>Syntax highlighting support</li>
|
<li>Syntax highlighting support</li>
|
||||||
<li>Path-based authorization</li>
|
|
||||||
<li>Commit metadata query facilities</li>
|
<li>Commit metadata query facilities</li>
|
||||||
<li>Template-driven output generation</li>
|
<li>Template-driven output generation</li>
|
||||||
<li>Colorized, side-by-side differences</li>
|
<li>Colorized, side-by-side differences</li>
|
||||||
<li>Tarball generation (by tag for CVS, by revision for Subversion)</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>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>
|
</ul>
|
||||||
|
|
||||||
<p>For a complete list of changes present in each release, see
|
<p>For a complete list of changes present in each release, see
|
||||||
@@ -85,28 +66,20 @@
|
|||||||
<div class="h2">
|
<div class="h2">
|
||||||
<h2>Wanna Talk About ViewVC?</h2>
|
<h2>Wanna Talk About ViewVC?</h2>
|
||||||
|
|
||||||
<table border="0" cellpadding="10" cellspacing="10" style="margin: 0 5%;">
|
<p>If you have questions about ViewVC — how to configure it, if
|
||||||
<thead>
|
some behavior you are seeing is expected or not, and so on —
|
||||||
<tr style="vertical-align: top;">
|
send email to our users list: <a
|
||||||
<th style="width: 50%;">User/Admin Discussion</th>
|
href="mailto:users@viewvc.tigris.org"
|
||||||
<th style="width: 50%;">Developer Discussion</th>
|
>users@viewvc.tigris.org</a>.</p>
|
||||||
</tr>
|
|
||||||
</thead>
|
<p>If you'd like to discuss the actual development of ViewVC itself,
|
||||||
<tbody>
|
or submit a patch to ViewVC's sources, you can do so on our
|
||||||
<tr style="vertical-align: top;">
|
development list: <a href="mailto:dev@viewvc.tigris.org"
|
||||||
<td>If you have questions about ViewVC — how to configure it, if
|
>dev@viewvc.tigris.org</a>.</p>
|
||||||
some behavior you are seeing is expected or not, and so on —
|
|
||||||
send email to <a href="mailto:users@viewvc.tigris.org"
|
<p>Finally, if you prefer realtime chatter, use your favorite IRC
|
||||||
>users@viewvc.tigris.org</a> or use your favorite IRC client to
|
client to pop into <tt><a href="irc://irc.freenode.net/viewvc"
|
||||||
pop into <tt><a href="irc://irc.freenode.net/viewvc"
|
>#viewvc</a></tt> on irc.freenode.net.</p>
|
||||||
>#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>
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@@ -13,14 +13,12 @@
|
|||||||
|
|
||||||
<li><a href="http://viewvc.tigris.org/servlets/ProjectNewsList"
|
<li><a href="http://viewvc.tigris.org/servlets/ProjectNewsList"
|
||||||
>Announcements</a></li>
|
>Announcements</a></li>
|
||||||
<li><a href="http://viewvc.tigris.org/ds/viewForums.do"
|
<li><a href="http://viewvc.tigris.org/servlets/ProjectMailingListList"
|
||||||
>Discussions</a></li>
|
>Mailing lists</a></li>
|
||||||
<li><a href="http://viewvc.tigris.org/source/browse/viewvc/"
|
<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"
|
<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>
|
>Issue tracker</a></li>
|
||||||
<li><a href="http://viewvc.tigris.org/servlets/ProjectDocumentList?folderID=6004"
|
|
||||||
>Downloads</a></li>
|
|
||||||
|
|
||||||
</ul></dd>
|
</ul></dd>
|
||||||
<!-- .................................................................. -->
|
<!-- .................................................................. -->
|
||||||
|
Reference in New Issue
Block a user