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 ??-???-????)
|
||||
|
||||
* 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)
|
||||
Version 1.1.0 (released ??-???-????)
|
||||
|
||||
* add support for full content diffs (issue #153)
|
||||
* 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)
|
||||
* 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)
|
||||
* 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)
|
||||
* make the query handling more forgiving of malformatted subdirs (issue #244)
|
||||
* 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)
|
||||
* recognize Subversion svn:mime-type property values (issue #364)
|
||||
* hide CVS files when viewing tags/branches on which they don't exist
|
||||
* allow hiding of 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)
|
||||
* add support for hiding errorful entries from the directory view (issue #105)
|
||||
|
||||
Version 1.0.7 (released 14-Oct-2008)
|
||||
|
||||
|
2
INSTALL
2
INSTALL
@@ -139,7 +139,7 @@ installation instructions.
|
||||
default_root
|
||||
root_as_url_component
|
||||
rcs_dir
|
||||
mime_types_files
|
||||
mime_types_file
|
||||
|
||||
There are some other options that are usually nice to change. See
|
||||
viewvc.conf for more information. ViewVC provides a working,
|
||||
|
@@ -15,7 +15,7 @@
|
||||
|
||||
<blockquote>
|
||||
|
||||
<p><strong>Copyright © 1999-2009 The ViewCVS Group. All rights
|
||||
<p><strong>Copyright © 1999-2008 The ViewCVS Group. All rights
|
||||
reserved.</strong></p>
|
||||
|
||||
<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>April 10, 2007 — copyright years updated</li>
|
||||
<li>February 22, 2008 — copyright years updated</li>
|
||||
<li>March 18, 2009 — copyright years updated</li>
|
||||
</ul>
|
||||
|
||||
</body>
|
||||
|
@@ -177,12 +177,7 @@ if __name__ == '__main__':
|
||||
if command in ('rebuild', 'purge'):
|
||||
if quiet_level < 2:
|
||||
print "Purging existing data for repository root `%s'" % root
|
||||
try:
|
||||
db.PurgeRepository(root)
|
||||
except cvsdb.UnknownRepositoryError, e:
|
||||
if command == 'purge':
|
||||
sys.stderr.write("ERROR: " + str(e) + "\n")
|
||||
sys.exit(1)
|
||||
db.PurgeRepository(root)
|
||||
|
||||
if command in ('rebuild', 'update'):
|
||||
repository = vclib.ccvs.CVSRepository(None, rootpath, None,
|
||||
|
@@ -1,7 +1,7 @@
|
||||
#!/usr/bin/env 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
|
||||
# the LICENSE.html file which can be found at the top level of the ViewVC
|
||||
@@ -18,22 +18,22 @@
|
||||
|
||||
import os, sys, string
|
||||
import popen2
|
||||
import getopt
|
||||
|
||||
## ------------------------------------------------------------------------
|
||||
## Stuff common to all schemas
|
||||
##
|
||||
DATABASE_SCRIPT_COMMON="""\
|
||||
INTRO_TEXT = """\
|
||||
This script creates the database and tables in MySQL used by the
|
||||
ViewVC checkin database. You will be prompted for: database server
|
||||
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>;
|
||||
CREATE DATABASE <dbname>;
|
||||
|
||||
USE <dbname>;
|
||||
"""
|
||||
|
||||
## ------------------------------------------------------------------------
|
||||
## Version 0: The original, Bonsai-compatible schema.
|
||||
##
|
||||
DATABASE_SCRIPT_VERSION_0="""\
|
||||
DROP TABLE IF EXISTS branches;
|
||||
CREATE TABLE branches (
|
||||
id mediumint(9) NOT NULL auto_increment,
|
||||
@@ -121,213 +121,28 @@ CREATE TABLE tags (
|
||||
) 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__":
|
||||
try:
|
||||
# Parse the command-line options, if any.
|
||||
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")
|
||||
print INTRO_TEXT
|
||||
|
||||
# Prompt for information not provided via command-line options.
|
||||
if hostname is None:
|
||||
hostname = raw_input("MySQL Hostname [default: localhost]: ") or ""
|
||||
if username is None:
|
||||
username = raw_input("MySQL User: ")
|
||||
if password is None:
|
||||
password = raw_input("MySQL Password: ")
|
||||
if dbname is None:
|
||||
dbname = raw_input("ViewVC Database Name [default: ViewVC]: ") or "ViewVC"
|
||||
# Prompt for necessary information
|
||||
host = raw_input("MySQL Hostname [default: localhost]: ") or ""
|
||||
user = raw_input("MySQL User: ")
|
||||
passwd = raw_input("MySQL Password: ")
|
||||
dbase = raw_input("ViewVC Database Name [default: ViewVC]: ") or "ViewVC"
|
||||
|
||||
# Create the database
|
||||
dscript = string.replace(DATABASE_SCRIPT_COMMON, "<dbname>", dbname)
|
||||
if version == "1.0":
|
||||
print BONSAI_COMPAT
|
||||
dscript = dscript + DATABASE_SCRIPT_VERSION_0
|
||||
else:
|
||||
dscript = dscript + DATABASE_SCRIPT_VERSION_1
|
||||
|
||||
host_option = hostname and "--host=%s" % (hostname) or ""
|
||||
dscript = string.replace(DATABASE_SCRIPT, "<dbname>", dbase)
|
||||
host_option = host and "--host=%s" % (host) or ""
|
||||
if sys.platform == "win32":
|
||||
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.write(dscript)
|
||||
status = mysql.close()
|
||||
else:
|
||||
cmd = "{ mysql --user=%s --password=%s %s ; } 2>&1" \
|
||||
% (username, password, host_option)
|
||||
% (user, passwd, host_option)
|
||||
pipes = popen2.Popen3(cmd)
|
||||
pipes.tochild.write(dscript)
|
||||
pipes.tochild.close()
|
||||
@@ -335,11 +150,10 @@ if __name__ == "__main__":
|
||||
status = pipes.wait()
|
||||
|
||||
if status:
|
||||
print "[ERROR] The database did not create sucessfully."
|
||||
print "[ERROR] the database did not create sucessfully."
|
||||
sys.exit(1)
|
||||
|
||||
print "Database created successfully. Don't forget to configure the "
|
||||
print "[cvsdb] section of your viewvc.conf file."
|
||||
print "Database created successfully."
|
||||
except KeyboardInterrupt:
|
||||
pass
|
||||
sys.exit(0)
|
||||
|
@@ -1,6 +1,6 @@
|
||||
# -*-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
|
||||
# the LICENSE.html file which can be found at the top level of the ViewVC
|
||||
|
@@ -1,6 +1,6 @@
|
||||
# -*-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
|
||||
# the LICENSE.html file which can be found at the top level of the ViewVC
|
||||
|
@@ -1,7 +1,7 @@
|
||||
#!/usr/bin/env 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
|
||||
# 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_stderr = sys.stderr
|
||||
# For external tools like enscript we also need to redirect
|
||||
# the real stdout file descriptor.
|
||||
#
|
||||
# FIXME: This code used to carry the following comment:
|
||||
#
|
||||
# (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?
|
||||
# the real stdout file descriptor. (On windows, reassigning the
|
||||
# sys.stdout variable is sufficient because pipe_cmds makes it
|
||||
# the standard output for child processes.)
|
||||
if sys.platform != "win32": save_realstdout = os.dup(1)
|
||||
try:
|
||||
try:
|
||||
@@ -382,7 +375,7 @@ def gui(host, port):
|
||||
|
||||
# Early loading of configuration here. Used to
|
||||
# allow tinkering with configuration settings through the gui:
|
||||
handle_config(options.config_file)
|
||||
handle_config()
|
||||
if not LIBRARY_DIR:
|
||||
cfg.options.cvsgraph_conf = "../cgi/cvsgraph.conf.dist"
|
||||
|
||||
@@ -396,6 +389,14 @@ def gui(host, port):
|
||||
command=self.toggle_use_cvsgraph)
|
||||
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:
|
||||
self.subdirmod_ivar = Tkinter.IntVar()
|
||||
self.subdirmod_ivar.set(cfg.options.show_subdir_lastmod)
|
||||
@@ -421,27 +422,16 @@ def gui(host, port):
|
||||
command=self.toggle_use_localtime)
|
||||
self.use_localtime_toggle.pack(side='top', anchor='w')
|
||||
|
||||
# log_pagesize integer var:
|
||||
self.log_pagesize_lbl = Tkinter.Label(self.options_frm,
|
||||
text='Paging (number of items per log page, 0 disables):')
|
||||
self.log_pagesize_lbl.pack(side='top', anchor='w')
|
||||
self.log_pagesize_ivar = Tkinter.IntVar()
|
||||
self.log_pagesize_ivar.set(cfg.options.log_pagesize)
|
||||
self.log_pagesize_entry = Tkinter.Entry(self.options_frm,
|
||||
width=10, textvariable=self.log_pagesize_ivar)
|
||||
self.log_pagesize_entry.bind('<Return>', self.set_log_pagesize)
|
||||
self.log_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')
|
||||
# use_pagesize integer var:
|
||||
self.usepagesize_lbl = Tkinter.Label(self.options_frm,
|
||||
text='Paging (number of items per page, 0 disables):')
|
||||
self.usepagesize_lbl.pack(side='top', anchor='w')
|
||||
self.use_pagesize_ivar = Tkinter.IntVar()
|
||||
self.use_pagesize_ivar.set(cfg.options.use_pagesize)
|
||||
self.use_pagesize_entry = Tkinter.Entry(self.options_frm,
|
||||
width=10, textvariable=self.use_pagesize_ivar)
|
||||
self.use_pagesize_entry.bind('<Return>', self.set_use_pagesize)
|
||||
self.use_pagesize_entry.pack(side='top', anchor='w')
|
||||
|
||||
# directory view template:
|
||||
self.dirtemplate_lbl = Tkinter.Label(self.options_frm,
|
||||
@@ -517,6 +507,9 @@ def gui(host, port):
|
||||
def toggle_use_cvsgraph(self, event=None):
|
||||
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):
|
||||
cfg.options.use_localtime = self.use_localtime_ivar.get()
|
||||
|
||||
@@ -526,11 +519,8 @@ def gui(host, port):
|
||||
def toggle_useresearch(self, event=None):
|
||||
cfg.options.use_re_search = self.useresearch_ivar.get()
|
||||
|
||||
def set_log_pagesize(self, event=None):
|
||||
cfg.options.log_pagesize = self.log_pagesize_ivar.get()
|
||||
|
||||
def set_dir_pagesize(self, event=None):
|
||||
cfg.options.dir_pagesize = self.dir_pagesize_ivar.get()
|
||||
def set_use_pagesize(self, event=None):
|
||||
cfg.options.use_pagesize = self.use_pagesize_ivar.get()
|
||||
|
||||
def set_templates_log(self, event=None):
|
||||
cfg.templates.log = self.logtemplate_svar.get()
|
||||
@@ -624,7 +614,7 @@ def cli(argv):
|
||||
if pid != 0:
|
||||
sys.exit()
|
||||
if options.start_gui:
|
||||
gui(options.host, options.port)
|
||||
gui(options.host, options.port, options.config_file)
|
||||
return
|
||||
elif options.port:
|
||||
def ready(server):
|
||||
|
@@ -1,7 +1,6 @@
|
||||
#!/usr/bin/env python
|
||||
# -*-python-*-
|
||||
#
|
||||
# Copyright (C) 2004-2008 The ViewCVS Group. All Rights Reserved.
|
||||
# Copyright (C) 2004-2007 James Henstridge
|
||||
#
|
||||
# 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 verbose:
|
||||
print "Purging commit info for repository root `%s'" % repository
|
||||
try:
|
||||
db.PurgeRepository(repository)
|
||||
except cvsdb.UnknownRepositoryError, e:
|
||||
if command == 'purge':
|
||||
sys.stderr.write("ERROR: " + str(e) + "\n")
|
||||
sys.exit(1)
|
||||
db.PurgeRepository(repository)
|
||||
|
||||
repo = SvnRepo(repository)
|
||||
if command == 'rebuild' or (command == 'update' and not revs):
|
||||
|
@@ -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>
|
||||
or (for Subversion roots) <tt>dir</tt>.</td>
|
||||
</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">
|
||||
<td class="varname">nav_path</td>
|
||||
<td>List</td>
|
||||
@@ -315,7 +321,7 @@ td {
|
||||
<tr class="varlevel1">
|
||||
<td class="varname">pathrev_hidden_values</td>
|
||||
<td>List</td>
|
||||
<td>Hidden field name/value pairs for the revision/tag selection form.</td>
|
||||
<td>Hidden value name/value pairs for the revision/tag selection form.</td>
|
||||
</tr>
|
||||
<tr class="varlevel1">
|
||||
<td class="varname">pathrev_clear_action</td>
|
||||
@@ -325,7 +331,7 @@ td {
|
||||
<tr class="varlevel1">
|
||||
<td class="varname">pathrev_clear_hidden_values</td>
|
||||
<td>List</td>
|
||||
<td>Hidden field name/value pairs for the path revision clear button.</td>
|
||||
<td>Hidden value name/value pairs for the path revision clear button.</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
@@ -444,10 +450,10 @@ td {
|
||||
<tr class="varlevel1">
|
||||
<td class="varname">annotation</td>
|
||||
<td>String</td>
|
||||
<td>Valid values are "none" (no annotations were attempted),
|
||||
"annotated" (annotation was successful), "binary" (file contents
|
||||
are not line-based and human-readable), and "error" (something
|
||||
went wrong during annotation).</td>
|
||||
<td>If set, indicates that annotations were requested. Valid values
|
||||
are "annotated" (annotation was successful), "binary" (file contents
|
||||
are not line-based and human-readable), and "error" (something went
|
||||
wrong during annotation).</td>
|
||||
</tr>
|
||||
<tr class="varlevel1">
|
||||
<td class="varname">author</td>
|
||||
@@ -598,45 +604,6 @@ td {
|
||||
<td colspan="3">Includes all variables from the
|
||||
<a href="#variables-common">COMMON</a> variable set</td>
|
||||
</tr>
|
||||
<tr class="varlevel1">
|
||||
<td class="varname">gbbox</td>
|
||||
<td>Boolean</td>
|
||||
<td>Toggle generation of a branch box at the tip of all branches in
|
||||
the revision graph.</td>
|
||||
</tr>
|
||||
<tr class="varlevel1">
|
||||
<td class="varname">gflip</td>
|
||||
<td>Boolean</td>
|
||||
<td>Toggle the direction of the revision graph.</td>
|
||||
</tr>
|
||||
<tr class="varlevel1">
|
||||
<td class="varname">gleft</td>
|
||||
<td>Boolean</td>
|
||||
<td>Toggle the orientation of the revision graph.</td>
|
||||
</tr>
|
||||
<tr class="varlevel1">
|
||||
<td class="varname">gmaxtag</td>
|
||||
<td>String</td>
|
||||
<td>Number of tags per revision to display in the revision graph.</td>
|
||||
</tr>
|
||||
<tr class="varlevel1">
|
||||
<td class="varname">graph_action</td>
|
||||
<td>String</td>
|
||||
<td>Form action URL for the graph customization form.</td>
|
||||
</tr>
|
||||
<tr class="varlevel1">
|
||||
<td class="varname">graph_hidden_values</td>
|
||||
<td>String</td>
|
||||
<td>Hidden value name/value pairs for the graph customization form.</td>
|
||||
</tr>
|
||||
<tr class="varlevel1">
|
||||
<td class="varname">gshow</td>
|
||||
<td>String</td>
|
||||
<td>Classes of revisions to show in the revision graph. Valid values
|
||||
are <tt>all</tt> (all revision), <tt>inittagged</tt> (initial
|
||||
revision(s) and tagged revisions), and <tt>tagged</tt> (tagged
|
||||
revisions only).</td>
|
||||
</tr>
|
||||
<tr class="varlevel1">
|
||||
<td class="varname">imagemap</td>
|
||||
<td>String</td>
|
||||
@@ -649,37 +616,6 @@ td {
|
||||
<td>URL of the ViewVC revision graph image for the current
|
||||
resource.</td>
|
||||
</tr>
|
||||
<tr class="varlevel1">
|
||||
<td class="varname">opt_gbbox</td>
|
||||
<td>Boolean</td>
|
||||
<td>Specifies whether the user is allowed to toggle the generation
|
||||
of branch boxes at the tip of all branches in the revision
|
||||
graph.</td>
|
||||
</tr>
|
||||
<tr class="varlevel1">
|
||||
<td class="varname">opt_gflip</td>
|
||||
<td>Boolean</td>
|
||||
<td>Specifies whether the user is allowed to toggle the direction
|
||||
of the revision graph.</td>
|
||||
</tr>
|
||||
<tr class="varlevel1">
|
||||
<td class="varname">opt_gleft</td>
|
||||
<td>Boolean</td>
|
||||
<td>Specifies whether the user is allowed to toggle the orientation
|
||||
of the revision graph.</td>
|
||||
</tr>
|
||||
<tr class="varlevel1">
|
||||
<td class="varname">opt_gmaxtag</td>
|
||||
<td>Boolean</td>
|
||||
<td>Specifies whether the user is allowed to configure the maximum
|
||||
number of tags per revision show in the revision graph.</td>
|
||||
</tr>
|
||||
<tr class="varlevel1">
|
||||
<td class="varname">opt_gshow</td>
|
||||
<td>Boolean</td>
|
||||
<td>Specifies whether the user is allowed to configure which
|
||||
classes of revisions are shown in the revision graph.</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
@@ -789,7 +725,7 @@ td {
|
||||
<tr class="varlevel1">
|
||||
<td class="varname">diff_format_hidden_values</td>
|
||||
<td>List</td>
|
||||
<td>Hidden field name/value pairs for the diff format selection form.</td>
|
||||
<td>Hidden value name/value pairs for the diff format selection form.</td>
|
||||
</tr>
|
||||
<tr class="varlevel1">
|
||||
<td class="varname">left</td>
|
||||
@@ -969,7 +905,7 @@ td {
|
||||
<tr class="varlevel1">
|
||||
<td class="varname">dir_paging_hidden_values</td>
|
||||
<td>List</td>
|
||||
<td>Hidden field name/value pairs for the page selection form.</td>
|
||||
<td>Hidden value name/value pairs for the page selection form.</td>
|
||||
</tr>
|
||||
<tr class="varlevel1">
|
||||
<td class="varname">entries</td>
|
||||
@@ -1151,16 +1087,23 @@ td {
|
||||
<td>String</td>
|
||||
<td>Current search expression, if any.</td>
|
||||
</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">
|
||||
<td class="varname">search_re_action</td>
|
||||
<td>String</td>
|
||||
<td>Form action URL for the regular expression search form,
|
||||
if searching is available.</td>
|
||||
<td>Form action URL for the regular expression search form.</td>
|
||||
</tr>
|
||||
<tr class="varlevel1">
|
||||
<td class="varname">search_re_hidden_values</td>
|
||||
<td>List</td>
|
||||
<td>Hidden field name/value pairs for the regular expression search form.</td>
|
||||
<td>Hidden value name/value pairs for the regular expression search form.</td>
|
||||
</tr>
|
||||
<tr class="varlevel1">
|
||||
<td class="varname">show_attic_href</td>
|
||||
@@ -1306,7 +1249,7 @@ td {
|
||||
<tr class="varlevel1">
|
||||
<td class="varname">diff_select_hidden_values</td>
|
||||
<td>List</td>
|
||||
<td>Hidden field name/value pairs for the diff selection form.</td>
|
||||
<td>Hidden value name/value pairs for the diff selection form.</td>
|
||||
</tr>
|
||||
<tr class="varlevel1">
|
||||
<td class="varname">entries</td>
|
||||
@@ -1587,7 +1530,7 @@ td {
|
||||
<tr class="varlevel1">
|
||||
<td class="varname">log_paging_hidden_values</td>
|
||||
<td>List</td>
|
||||
<td>Hidden field name/value pairs for the page selection form.</td>
|
||||
<td>Hidden value name/value pairs for the page selection form.</td>
|
||||
</tr>
|
||||
<tr class="varlevel1">
|
||||
<td class="varname">logsort</td>
|
||||
@@ -1603,7 +1546,7 @@ td {
|
||||
<tr class="varlevel1">
|
||||
<td class="varname">logsort_hidden_values</td>
|
||||
<td>List</td>
|
||||
<td>Hidden field name/value pairs for the log sort drop down box</td>
|
||||
<td>Hidden value name/value pairs for the log sort drop down box</td>
|
||||
</tr>
|
||||
<tr class="varlevel1">
|
||||
<td class="varname">mime_type</td>
|
||||
@@ -1967,7 +1910,7 @@ td {
|
||||
<tr class="varlevel1">
|
||||
<td class="varname">query_hidden_values</td>
|
||||
<td>List</td>
|
||||
<td>Hidden field name/value pairs for query form.</td>
|
||||
<td>Hidden value name/value pairs for query form.</td>
|
||||
</tr>
|
||||
<tr class="varlevel1">
|
||||
<td class="varname">querysort</td>
|
||||
@@ -2107,7 +2050,7 @@ td {
|
||||
<tr class="varlevel1">
|
||||
<td class="varname">jump_rev_hidden_values</td>
|
||||
<td>List</td>
|
||||
<td>Hidden field name/value pairs for revision jump form.</td>
|
||||
<td>Hidden value name/value pairs for revision jump form.</td>
|
||||
</tr>
|
||||
<tr class="varlevel1">
|
||||
<td class="varname">limit_changes</td>
|
||||
@@ -2130,11 +2073,6 @@ td {
|
||||
<td>String</td>
|
||||
<td>URL for the current view but with <tt>limit_changes</tt> disabled.</td>
|
||||
</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">
|
||||
<td class="varname">next_href</td>
|
||||
<td>String</td>
|
||||
|
@@ -137,8 +137,9 @@ td {
|
||||
configuration's "general" section.</li>
|
||||
|
||||
<li>Finally, ensure that that the new <code>authorizer</code>
|
||||
option is set to either "forbidden" or "forbiddenre", depending
|
||||
on which of those you were using in ViewVC 1.0.x.</li>
|
||||
option is set to either "forbidden" (which is the default) or
|
||||
"forbiddenre", depending on which of those you were using in
|
||||
ViewVC 1.0.x.</li>
|
||||
|
||||
</ol>
|
||||
|
||||
@@ -214,9 +215,10 @@ td {
|
||||
<li>options/py2html_path</li>
|
||||
<li>options/use_enscript</li>
|
||||
<li>options/use_highlight</li>
|
||||
<li>options/use_pagesize</li>
|
||||
<li>options/use_php</li>
|
||||
<li>options/use_py2html</li>
|
||||
<li>options/use_pygments</li>
|
||||
<li>options/use_source_highlight</li>
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
@@ -224,23 +226,16 @@ td {
|
||||
<div class="h3">
|
||||
<h3>Checkin Database</h3>
|
||||
|
||||
<p>ViewVC 1.1 introduces to the <code>cvsdbadmin</code>
|
||||
and <code>svndbadmin</code> tools a new "purge" operation, which
|
||||
allows you to remove all the information related to a given root
|
||||
from your checkins database (without disturbing the information
|
||||
associated with other roots). Likewise, the "rebuild" command in
|
||||
those tools now implies a "purge" followed by an update.</p>
|
||||
|
||||
<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
|
||||
<p>In ViewVC 1.1, 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
|
||||
rebuild-a-revision effect, pass the new <code>--force</code> option
|
||||
to <code>svndbadmin update</code>.</p>
|
||||
rebuild-a-revision effect, pass the new <code>--force</code>
|
||||
option to <code>svndbadmin update</code>.</p>
|
||||
|
||||
<p>In other words, where you once did this:</p>
|
||||
|
||||
@@ -254,19 +249,6 @@ td {
|
||||
</pre>
|
||||
</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 class="h3">
|
||||
@@ -314,22 +296,6 @@ td {
|
||||
<li>options/allow_tar</li>
|
||||
</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"
|
||||
section to the "options" section.</p>
|
||||
|
||||
@@ -665,11 +631,6 @@ allow_tar = 1
|
||||
<td>revision.ezt</td>
|
||||
<td>now is an iterable list of objects with .name and .value attributes</td>
|
||||
</tr>
|
||||
<tr class="added">
|
||||
<td class="varname">num_changes</td>
|
||||
<td>revision.ezt</td>
|
||||
<td>added</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
@@ -698,7 +659,7 @@ allow_tar = 1
|
||||
<h3>Checkin Database</h3>
|
||||
|
||||
<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
|
||||
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
|
||||
@@ -741,8 +702,7 @@ allow_tar = 1
|
||||
<li>options/root_as_url_component</li>
|
||||
<li>options/default_file_view</li>
|
||||
<li>options/sort_group_dirs</li>
|
||||
<li>options/dir_pagesize</li>
|
||||
<li>options/log_pagesize</li>
|
||||
<li>options/use_pagesize</li>
|
||||
<li>options/limit_changes</li>
|
||||
<li>options/use_localtime</li>
|
||||
<li>options/cross_copies</li>
|
||||
|
@@ -654,35 +654,6 @@ th.caption {
|
||||
<td>depends</td>
|
||||
<td><a href="#root-param"><code>root</code> parameter</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>gflip=<var>GFLIP</var></code></td>
|
||||
<td>optional</td>
|
||||
<td>"1" if the revisions in the graph should run
|
||||
youngest-to-oldest; "0" for the reverse</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>gbbox=<var>GBBOX</var></code></td>
|
||||
<td>optional</td>
|
||||
<td>"1" if the revision graph should contain branch boxes at the
|
||||
tip of each branch; "0" otherwise</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>gleft=<var>GLEFT</var></code></td>
|
||||
<td>optional</td>
|
||||
<td>"1" if the revision graph should be orientated left-to-right;
|
||||
"0" otherwise</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>gmaxtag=<var>GMAXTAG</var></code></td>
|
||||
<td>optional</td>
|
||||
<td>maximum number of per-revision tags to show in the revision graph</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>gshow=<var>GSHOW</var></code></td>
|
||||
<td>optional</td>
|
||||
<td>"all", "inittagged", or "tagged" — user-selected classes
|
||||
of revision to show in the graph</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<h3 id="graphimg-view">Graph Image View</h3>
|
||||
@@ -729,35 +700,6 @@ th.caption {
|
||||
<td>depends</td>
|
||||
<td><a href="#root-param"><code>root</code> parameter</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>gflip=<var>GFLIP</var></code></td>
|
||||
<td>optional</td>
|
||||
<td>"1" if the revisions in the graph should run
|
||||
youngest-to-oldest; "0" for the reverse</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>gbbox=<var>GBBOX</var></code></td>
|
||||
<td>optional</td>
|
||||
<td>"1" if the revision graph should contain branch boxes at the
|
||||
tip of each branch; "0" otherwise</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>gleft=<var>GLEFT</var></code></td>
|
||||
<td>optional</td>
|
||||
<td>"1" if the revision graph should be orientated left-to-right;
|
||||
"0" otherwise</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>gmaxtag=<var>GMAXTAG</var></code></td>
|
||||
<td>optional</td>
|
||||
<td>maximum number of per-revision tags to show in the revision graph</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>gshow=<var>GSHOW</var></code></td>
|
||||
<td>optional</td>
|
||||
<td>"all", "inittagged", or "tagged" — user-selected classes
|
||||
of revision to show in the graph</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<h3 id="log-view">Log View</h3>
|
||||
@@ -1054,7 +996,7 @@ th.caption {
|
||||
<td>file query string</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>file_match=<var>FILE_MATCH</var></code></td>
|
||||
<td><code>file_match=FILE_MATCH</code></td>
|
||||
<td>optional</td>
|
||||
<td>"exact" "like" "glob" "regex" or "notregex" determining type
|
||||
of file match</td>
|
||||
@@ -1065,7 +1007,7 @@ th.caption {
|
||||
<td>author query string</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>who_match=<var>WHO_MATCH</var></code></td>
|
||||
<td><code>who_match=WHO_MATCH</code></td>
|
||||
<td>optional</td>
|
||||
<td>"exact" "like" "glob" "regex" or "notregex" determining type
|
||||
of author match</td>
|
||||
@@ -1082,36 +1024,36 @@ th.caption {
|
||||
of log message match</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>querysort=<var>SORT</var></code></td>
|
||||
<td><code>querysort=SORT</code></td>
|
||||
<td>optional</td>
|
||||
<td>"date" "author" or "file" determining order of query results</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>date=<var>DATE</var></code></td>
|
||||
<td><code>date=DATE</code></td>
|
||||
<td>optional</td>
|
||||
<td>"hours" "day" "week" "month" "all" or "explicit" to filter
|
||||
query results by date</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>hours=<var>HOURS</var></code></td>
|
||||
<td><code>hours=HOURS</code></td>
|
||||
<td>optional</td>
|
||||
<td>number of hours back to include results from when
|
||||
<code><var>DATE</var></code> is "hours"</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>mindate=<var>MINDATE</var></code></td>
|
||||
<td><code>mindate=MINDATE</code></td>
|
||||
<td>optional</td>
|
||||
<td>earliest date to include results from when
|
||||
<code><var>DATE</var></code> is "explicit"</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>maxdate=<var>MAXDATE</var></code></td>
|
||||
<td><code>maxdate=MAXDATE</code></td>
|
||||
<td>optional</td>
|
||||
<td>latest date to include results from when
|
||||
<code><var>DATE</var></code> is "explicit"</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>limit_changes=<var>LIMIT_CHANGES</var></code></td>
|
||||
<td><code>limit_changes=LIMIT_CHANGES</code></td>
|
||||
<td>optional</td>
|
||||
<td>maximum number of files to list per commit in query
|
||||
results. Default is value of <code>limit_changes</code>
|
||||
@@ -1171,7 +1113,7 @@ th.caption {
|
||||
<td>branch query string</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>branch_match=<var>BRANCH_MATCH</var></code></td>
|
||||
<td><code>branch_match=BRANCH_MATCH</code></td>
|
||||
<td>optional</td>
|
||||
<td>"exact" "like" "glob" "regex" or "notregex" determining type
|
||||
of branch match</td>
|
||||
@@ -1187,7 +1129,7 @@ th.caption {
|
||||
<td>file query string</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>file_match=<var>FILE_MATCH</var></code></td>
|
||||
<td><code>file_match=FILE_MATCH</code></td>
|
||||
<td>optional</td>
|
||||
<td>"exact" "like" "glob" "regex" or "notregex" determining type
|
||||
of file match</td>
|
||||
@@ -1198,7 +1140,7 @@ th.caption {
|
||||
<td>author query string</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>who_match=<var>WHO_MATCH</var></code></td>
|
||||
<td><code>who_match=WHO_MATCH</code></td>
|
||||
<td>optional</td>
|
||||
<td>"exact" "like" "glob" "regex" or "notregex" determining type
|
||||
of author match</td>
|
||||
@@ -1215,50 +1157,50 @@ th.caption {
|
||||
of log message match</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>querysort=<var>SORT</var></code></td>
|
||||
<td><code>querysort=SORT</code></td>
|
||||
<td>optional</td>
|
||||
<td>"date" "author" or "file" determining order of query results</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>date=<var>DATE</var></code></td>
|
||||
<td><code>date=DATE</code></td>
|
||||
<td>optional</td>
|
||||
<td>"hours" "day" "week" "month" "all" or "explicit" to filter
|
||||
query results by date</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>hours=<var>HOURS</var></code></td>
|
||||
<td><code>hours=HOURS</code></td>
|
||||
<td>optional</td>
|
||||
<td>number of hours back to include results from when
|
||||
<code><var>DATE</var></code> is "hours"</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>mindate=<var>MINDATE</var></code></td>
|
||||
<td><code>mindate=MINDATE</code></td>
|
||||
<td>optional</td>
|
||||
<td>earliest date to include results from when
|
||||
<code><var>DATE</var></code> is "explicit"</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>maxdate=<var>MAXDATE</var></code></td>
|
||||
<td><code>maxdate=MAXDATE</code></td>
|
||||
<td>optional</td>
|
||||
<td>latest date to include results from when
|
||||
<code><var>DATE</var></code> is "explicit"</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>format=<var>FORMAT</var></code></td>
|
||||
<td><code>format=FORMAT</code></td>
|
||||
<td>optional</td>
|
||||
<td>"rss" or "backout" values to generate an rss feed or list of
|
||||
commands to back out changes instead showing a normal query result
|
||||
page</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>limit=<var>LIMIT</var></code></td>
|
||||
<td><code>limit=LIMIT</code></td>
|
||||
<td>optional</td>
|
||||
<td>maximum number of file-revisions to process during a
|
||||
query. Default is value of <code>row_limit</code> configuration
|
||||
option</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>limit_changes=<var>LIMIT_CHANGES</var></code></td>
|
||||
<td><code>limit_changes=LIMIT_CHANGES</code></td>
|
||||
<td>optional</td>
|
||||
<td>maximum number of files to list per commit in query
|
||||
results. Default is value of <code>limit_changes</code>
|
||||
@@ -1312,7 +1254,7 @@ th.caption {
|
||||
<td><a href="#revision-param"><code>revision</code> parameter</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>limit_changes=<var>LIMIT_CHANGES</var></code></td>
|
||||
<td><code>limit_changes=LIMIT_CHANGES</code></td>
|
||||
<td>optional</td>
|
||||
<td>maximum number of files to list per commit. Default is value
|
||||
of <code>limit_changes</code> configuration option</td>
|
||||
|
@@ -1,6 +1,6 @@
|
||||
# -*-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
|
||||
# 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):
|
||||
name = _re_token.match(hdr, pos)
|
||||
if not name:
|
||||
raise AcceptLanguageParseError()
|
||||
raise AcceptParseError()
|
||||
a = result.item_class(string.lower(name.group(1)))
|
||||
pos = name.end()
|
||||
while 1:
|
||||
@@ -210,7 +210,7 @@ class _LanguageSelector:
|
||||
def append(self, item):
|
||||
self.requested.append(item)
|
||||
|
||||
class AcceptLanguageParseError(Exception):
|
||||
class AcceptParseError(Exception):
|
||||
pass
|
||||
|
||||
def _test():
|
||||
|
@@ -1,7 +1,7 @@
|
||||
#!/usr/bin/env 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>
|
||||
#
|
||||
# By using this file, you agree to the terms and conditions set forth in
|
||||
|
@@ -1,6 +1,6 @@
|
||||
# -*-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
|
||||
# the LICENSE.html file which can be found at the top level of the ViewVC
|
||||
@@ -40,7 +40,7 @@ import fnmatch
|
||||
class Config:
|
||||
_sections = ('general', 'utilities', 'options', 'cvsdb', 'templates')
|
||||
_force_multi_value = ('cvs_roots', 'svn_roots', 'languages', 'kv_files',
|
||||
'root_parents', 'allowed_views', 'mime_types_files')
|
||||
'root_parents', 'allowed_views')
|
||||
|
||||
def __init__(self):
|
||||
for section in self._sections:
|
||||
@@ -197,7 +197,7 @@ class Config:
|
||||
self.general.svn_roots = { }
|
||||
self.general.root_parents = []
|
||||
self.general.default_root = ''
|
||||
self.general.mime_types_files = ["mimetypes.conf"]
|
||||
self.general.mime_types_file = ''
|
||||
self.general.address = ''
|
||||
self.general.kv_files = [ ]
|
||||
self.general.languages = ['en-us']
|
||||
@@ -213,13 +213,12 @@ class Config:
|
||||
|
||||
self.options.root_as_url_component = 1
|
||||
self.options.checkout_magic = 0
|
||||
self.options.allowed_views = ['annotate', 'diff', 'markup', 'roots']
|
||||
self.options.authorizer = None
|
||||
self.options.allowed_views = ['markup', 'annotate', 'roots']
|
||||
self.options.authorizer = 'forbidden'
|
||||
self.options.mangle_email_addresses = 0
|
||||
self.options.default_file_view = "log"
|
||||
self.options.http_expiration_time = 600
|
||||
self.options.generate_etags = 1
|
||||
self.options.svn_ignore_mimetype = 0
|
||||
self.options.svn_config_dir = None
|
||||
self.options.use_rcsparse = 0
|
||||
self.options.sort_by = 'file'
|
||||
@@ -244,13 +243,10 @@ class Config:
|
||||
self.options.use_localtime = 0
|
||||
self.options.short_log_len = 80
|
||||
self.options.enable_syntax_coloration = 1
|
||||
self.options.detect_encoding = 0
|
||||
self.options.use_cvsgraph = 0
|
||||
self.options.cvsgraph_conf = "cvsgraph.conf"
|
||||
self.options.allowed_cvsgraph_useropts = []
|
||||
self.options.use_re_search = 0
|
||||
self.options.dir_pagesize = 0
|
||||
self.options.log_pagesize = 0
|
||||
self.options.use_pagesize = 0
|
||||
self.options.limit_changes = 100
|
||||
|
||||
self.templates.diff = None
|
||||
|
196
lib/cvsdb.py
196
lib/cvsdb.py
@@ -1,6 +1,6 @@
|
||||
# -*-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
|
||||
# the LICENSE.html file which can be found at the top level of the ViewVC
|
||||
@@ -20,14 +20,6 @@ import re
|
||||
import vclib
|
||||
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 = "cvsdb error"
|
||||
@@ -45,7 +37,6 @@ class CheckinDatabase:
|
||||
self._passwd = passwd
|
||||
self._database = database
|
||||
self._row_limit = row_limit
|
||||
self._version = None
|
||||
|
||||
## database lookup caches
|
||||
self._get_cache = {}
|
||||
@@ -57,19 +48,6 @@ class CheckinDatabase:
|
||||
self._host, self._port, self._user, self._passwd, self._database)
|
||||
cursor = self.db.cursor()
|
||||
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):
|
||||
sql = "SELECT id FROM %s WHERE %s=%%s" % (table, column)
|
||||
@@ -169,42 +147,6 @@ class CheckinDatabase:
|
||||
|
||||
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):
|
||||
return self.get_id("branches", "branch", branch, auto_set)
|
||||
|
||||
@@ -309,9 +251,7 @@ class CheckinDatabase:
|
||||
minus_count = commit.GetMinusCount() or '0'
|
||||
description_id = self.GetDescriptionID(commit.GetDescription())
|
||||
|
||||
commits_table = self._version >= 1 and 'commits' or 'checkins'
|
||||
sql = "REPLACE INTO %s" % (commits_table)
|
||||
sql = sql + \
|
||||
sql = "REPLACE INTO checkins"\
|
||||
" (type,ci_when,whoid,repositoryid,dirid,fileid,revision,"\
|
||||
" stickytag,branchid,addedlines,removedlines,descid)"\
|
||||
"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 "))
|
||||
|
||||
def CreateSQLQueryString(self, query):
|
||||
commits_table = self._version >= 1 and 'commits' or 'checkins'
|
||||
tableList = [(commits_table, None)]
|
||||
tableList = [("checkins", None)]
|
||||
condList = []
|
||||
|
||||
if len(query.repository_list):
|
||||
tableList.append(("repositories",
|
||||
"(%s.repositoryid=repositories.id)"
|
||||
% (commits_table)))
|
||||
"(checkins.repositoryid=repositories.id)"))
|
||||
temp = self.SQLQueryListString("repositories.repository",
|
||||
query.repository_list)
|
||||
condList.append(temp)
|
||||
|
||||
if len(query.branch_list):
|
||||
tableList.append(("branches",
|
||||
"(%s.branchid=branches.id)" % (commits_table)))
|
||||
tableList.append(("branches", "(checkins.branchid=branches.id)"))
|
||||
temp = self.SQLQueryListString("branches.branch",
|
||||
query.branch_list)
|
||||
condList.append(temp)
|
||||
|
||||
if len(query.directory_list):
|
||||
tableList.append(("dirs",
|
||||
"(%s.dirid=dirs.id)" % (commits_table)))
|
||||
tableList.append(("dirs", "(checkins.dirid=dirs.id)"))
|
||||
temp = self.SQLQueryListString("dirs.dir", query.directory_list)
|
||||
condList.append(temp)
|
||||
|
||||
if len(query.file_list):
|
||||
tableList.append(("files",
|
||||
"(%s.fileid=files.id)" % (commits_table)))
|
||||
tableList.append(("files", "(checkins.fileid=files.id)"))
|
||||
temp = self.SQLQueryListString("files.file", query.file_list)
|
||||
condList.append(temp)
|
||||
|
||||
if len(query.author_list):
|
||||
tableList.append(("people",
|
||||
"(%s.whoid=people.id)" % (commits_table)))
|
||||
tableList.append(("people", "(checkins.whoid=people.id)"))
|
||||
temp = self.SQLQueryListString("people.who", query.author_list)
|
||||
condList.append(temp)
|
||||
|
||||
if len(query.comment_list):
|
||||
tableList.append(("descs",
|
||||
"(%s.descid=descs.id)" % (commits_table)))
|
||||
tableList.append(("descs", "(checkins.descid=descs.id)"))
|
||||
temp = self.SQLQueryListString("descs.description",
|
||||
query.comment_list)
|
||||
condList.append(temp)
|
||||
|
||||
if query.from_date:
|
||||
temp = "(%s.ci_when>=\"%s\")" \
|
||||
% (commits_table, str(query.from_date))
|
||||
temp = "(checkins.ci_when>=\"%s\")" % (str(query.from_date))
|
||||
condList.append(temp)
|
||||
|
||||
if query.to_date:
|
||||
temp = "(%s.ci_when<=\"%s\")" \
|
||||
% (commits_table, str(query.to_date))
|
||||
temp = "(checkins.ci_when<=\"%s\")" % (str(query.to_date))
|
||||
condList.append(temp)
|
||||
|
||||
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":
|
||||
tableList.append(("people",
|
||||
"(%s.whoid=people.id)" % (commits_table)))
|
||||
tableList.append(("people", "(checkins.whoid=people.id)"))
|
||||
order_by = "ORDER BY people.who,descid"
|
||||
elif query.sort == "file":
|
||||
tableList.append(("files",
|
||||
"(%s.fileid=files.id)" % (commits_table)))
|
||||
tableList.append(("files", "(checkins.fileid=files.id)"))
|
||||
order_by = "ORDER BY files.file,descid"
|
||||
|
||||
## exclude duplicates from the table list, and split out join
|
||||
@@ -452,8 +381,8 @@ class CheckinDatabase:
|
||||
elif self._row_limit:
|
||||
limit = "LIMIT %s" % (str(self._row_limit))
|
||||
|
||||
sql = "SELECT %s.* FROM %s %s %s %s" \
|
||||
% (commits_table, tables, conditions, order_by, limit)
|
||||
sql = "SELECT checkins.* FROM %s %s %s %s" % (
|
||||
tables, conditions, order_by, limit)
|
||||
|
||||
return sql
|
||||
|
||||
@@ -504,13 +433,8 @@ class CheckinDatabase:
|
||||
if file_id == None:
|
||||
return None
|
||||
|
||||
commits_table = self._version >= 1 and 'commits' or 'checkins'
|
||||
sql = "SELECT * FROM %s WHERE "\
|
||||
" repositoryid=%%s "\
|
||||
" AND dirid=%%s"\
|
||||
" AND fileid=%%s"\
|
||||
" AND revision=%%s"\
|
||||
% (commits_table)
|
||||
sql = "SELECT * FROM checkins WHERE "\
|
||||
" repositoryid=%s AND dirid=%s AND fileid=%s AND revision=%s"
|
||||
sql_args = (repository_id, dir_id, file_id, commit.GetRevision())
|
||||
|
||||
cursor = self.db.cursor()
|
||||
@@ -527,72 +451,40 @@ class CheckinDatabase:
|
||||
def sql_delete(self, table, key, value, keep_fkey = None):
|
||||
sql = "DELETE FROM %s WHERE %s=%%s" % (table, key)
|
||||
sql_args = (value, )
|
||||
commits_table = self._version >= 1 and 'commits' or 'checkins'
|
||||
if keep_fkey:
|
||||
sql += " AND %s NOT IN (SELECT %s FROM %s WHERE %s = %%s)" \
|
||||
% (key, keep_fkey, commits_table, keep_fkey)
|
||||
sql_args = (value, value)
|
||||
sql += " AND %s NOT IN (SELECT %s FROM checkins WHERE %s = %%s)" \
|
||||
% (key, keep_fkey, keep_fkey)
|
||||
sql_args = (value, value)
|
||||
cursor = self.db.cursor()
|
||||
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):
|
||||
rep_id = self.GetRepositoryID(repository, auto_set=0)
|
||||
rep_id = self.GetRepositoryID(repository)
|
||||
if not rep_id:
|
||||
raise UnknownRepositoryError("Unknown repository '%s'"
|
||||
% (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 = {}
|
||||
raise Exception, "Unknown repository '%s'" % (repository)
|
||||
|
||||
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):
|
||||
pass
|
||||
class UnknownRepositoryError(Exception):
|
||||
pass
|
||||
|
||||
#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')
|
||||
|
||||
## 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
|
||||
|
14
lib/debug.py
14
lib/debug.py
@@ -1,6 +1,6 @@
|
||||
# -*-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
|
||||
# the LICENSE.html file which can be found at the top level of the ViewVC
|
||||
@@ -48,17 +48,13 @@ if SHOW_TIMES:
|
||||
else:
|
||||
_times[which] = t
|
||||
|
||||
def t_dump(out):
|
||||
out.write('<div>')
|
||||
names = _times.keys()
|
||||
names.sort()
|
||||
for name in names:
|
||||
out.write('%s: %.6fs<br/>\n' % (name, _times[name]))
|
||||
out.write('</div>')
|
||||
def dump():
|
||||
for name, value in _times.items():
|
||||
print '%s: %.6f<br />' % (name, value)
|
||||
|
||||
else:
|
||||
|
||||
t_start = t_end = t_dump = lambda *args: None
|
||||
t_start = t_end = dump = lambda *args: None
|
||||
|
||||
|
||||
class ViewVCException:
|
||||
|
43
lib/ezt.py
43
lib/ezt.py
@@ -460,10 +460,7 @@ class Template:
|
||||
def _cmd_print(self, valrefs, ctx):
|
||||
value = _get_value(valrefs[0], ctx)
|
||||
args = map(lambda valref, ctx=ctx: _get_value(valref, ctx), valrefs[1:])
|
||||
try:
|
||||
_write_value(value, args, ctx)
|
||||
except TypeError:
|
||||
raise Exception("Unprintable value type for '%s'" % (str(valrefs[0][0])))
|
||||
_write_value(value, args, ctx)
|
||||
|
||||
def _cmd_format(self, printer, ctx):
|
||||
if type(printer) is TupleType:
|
||||
@@ -525,8 +522,7 @@ class Template:
|
||||
((valref,), unused, section) = args
|
||||
list = _get_value(valref, ctx)
|
||||
if isinstance(list, StringType):
|
||||
raise NeedSequenceError("The value of '%s' is not a sequence"
|
||||
% (valref[0]))
|
||||
raise NeedSequenceError()
|
||||
refname = valref[0]
|
||||
ctx.for_iterators[refname] = iterator = _iter(list)
|
||||
for unused in iterator:
|
||||
@@ -676,41 +672,6 @@ def _write_value(value, args, ctx):
|
||||
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:
|
||||
"""A container for the execution context"""
|
||||
def __init__(self, fp):
|
||||
|
190
lib/popen.py
190
lib/popen.py
@@ -1,6 +1,6 @@
|
||||
# -*-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
|
||||
# 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.
|
||||
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:
|
||||
"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
|
||||
# -*-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
|
||||
# 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 = [ ]
|
||||
query = 'skipped'
|
||||
|
||||
data = ezt.TemplateData({
|
||||
script_name = server.getenv('SCRIPT_NAME', '')
|
||||
|
||||
data = {
|
||||
'cfg' : cfg,
|
||||
'address' : cfg.general.address,
|
||||
'vsn' : viewvc.__version__,
|
||||
|
||||
'repository' : server.escape(form_data.repository, 1),
|
||||
'branch' : server.escape(form_data.branch, 1),
|
||||
'directory' : server.escape(form_data.directory, 1),
|
||||
@@ -432,11 +435,16 @@ def main(server, cfg, viewvc_link):
|
||||
'commits' : commits,
|
||||
'num_commits' : len(commits),
|
||||
'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
|
||||
server.header()
|
||||
template = viewvc.get_view_template(cfg, "query")
|
||||
template.generate(server.file(), data)
|
||||
|
||||
|
@@ -158,7 +158,8 @@ class CgiServer(Server):
|
||||
if self.iis: url = fix_iis_url(self, url)
|
||||
self.addheader('Location', url)
|
||||
self.header(status='301 Moved')
|
||||
sys.stdout.write('This document is located <a href="%s">here</a>.\n' % url)
|
||||
print 'This document is located <a href="%s">here</a>.' % url
|
||||
sys.exit(0)
|
||||
|
||||
def escape(self, s, quote = None):
|
||||
return cgi.escape(s, quote)
|
||||
@@ -218,6 +219,7 @@ class AspServer(ThreadedServer):
|
||||
|
||||
def redirect(self, url):
|
||||
self.response.Redirect(url)
|
||||
sys.exit()
|
||||
|
||||
def escape(self, s, quote = None):
|
||||
return self.server.HTMLEncode(str(s))
|
||||
@@ -306,7 +308,8 @@ class ModPythonServer(ThreadedServer):
|
||||
self.request.headers_out['Location'] = url
|
||||
self.request.status = mod_python.apache.HTTP_MOVED_TEMPORARILY
|
||||
self.request.write("You are being redirected to <a href=\"%s\">%s</a>"
|
||||
% (url, url))
|
||||
% (url, url))
|
||||
sys.exit()
|
||||
|
||||
def escape(self, s, quote = None):
|
||||
return cgi.escape(s, quote)
|
||||
|
@@ -22,6 +22,7 @@ class ViewVCAuthorizer(vcauth.GenericViewVCAuthorizer):
|
||||
"""Subversion authz authorizer module"""
|
||||
|
||||
def __init__(self, username, params={}):
|
||||
self.username = username
|
||||
self.rootpaths = { } # {root -> { paths -> access boolean for USERNAME }}
|
||||
|
||||
# Get the authz file location from a passed-in parameter.
|
||||
@@ -31,29 +32,14 @@ class ViewVCAuthorizer(vcauth.GenericViewVCAuthorizer):
|
||||
if not os.path.exists(self.authz_file):
|
||||
raise debug.ViewVCException("Configured authzfile file not found")
|
||||
|
||||
# See if the admin wants us to do case normalization of usernames.
|
||||
self.force_username_case = params.get('force_username_case')
|
||||
if self.force_username_case == "upper":
|
||||
self.username = username.upper()
|
||||
elif self.force_username_case == "lower":
|
||||
self.username = username.lower()
|
||||
elif not self.force_username_case:
|
||||
self.username = username
|
||||
else:
|
||||
raise debug.ViewVCException("Invalid value for force_username_case "
|
||||
"option")
|
||||
|
||||
def _get_paths_for_root(self, rootname):
|
||||
if self.rootpaths.has_key(rootname):
|
||||
return self.rootpaths[rootname]
|
||||
|
||||
paths_for_root = { }
|
||||
|
||||
# Parse the authz file, replacing ConfigParser's optionxform()
|
||||
# method with something that won't futz with the case of the
|
||||
# option names.
|
||||
# Parse the authz file.
|
||||
cp = ConfigParser()
|
||||
cp.optionxform = lambda x: x
|
||||
cp.read(self.authz_file)
|
||||
|
||||
# Figure out if there are any aliases for the current username
|
||||
|
@@ -1,7 +1,7 @@
|
||||
#!/usr/bin/env 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>
|
||||
#
|
||||
# By using this file, you agree to the terms and conditions set forth in
|
||||
|
@@ -1,6 +1,6 @@
|
||||
# -*-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
|
||||
# the LICENSE.html file which can be found at the top level of the ViewVC
|
||||
|
@@ -1,6 +1,6 @@
|
||||
# -*-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
|
||||
# the LICENSE.html file which can be found at the top level of the ViewVC
|
||||
|
@@ -1,6 +1,6 @@
|
||||
# -*-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
|
||||
# the LICENSE.html file which can be found at the top level of the ViewVC
|
||||
|
@@ -1,6 +1,6 @@
|
||||
# -*-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
|
||||
# the LICENSE.html file which can be found at the top level of the ViewVC
|
||||
@@ -21,7 +21,7 @@ import tempfile
|
||||
import popen2
|
||||
import time
|
||||
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
|
||||
|
||||
|
||||
@@ -254,7 +254,7 @@ class RemoteSubversionRepository(vclib.Repository):
|
||||
dirent = dirents[entry.name]
|
||||
entry.date, entry.author, entry.log, changes = \
|
||||
self.revinfo(dirent.created_rev)
|
||||
entry.rev = str(dirent.created_rev)
|
||||
entry.rev = dirent.created_rev
|
||||
entry.size = dirent.size
|
||||
entry.lockinfo = None
|
||||
if locks.has_key(entry.name):
|
||||
@@ -362,7 +362,6 @@ class RemoteSubversionRepository(vclib.Repository):
|
||||
info2 = p2, _date_from_rev(r2), r2
|
||||
return vclib._diff_fp(temp1, temp2, info1, info2, self.diff_cmd, args)
|
||||
except core.SubversionException, e:
|
||||
_fix_subversion_exception(e)
|
||||
if e.apr_err == vclib.svn.core.SVN_ERR_FS_NOT_FOUND:
|
||||
raise vclib.InvalidRevision
|
||||
raise
|
||||
@@ -487,7 +486,6 @@ class RemoteSubversionRepository(vclib.Repository):
|
||||
try:
|
||||
results = ra.get_locations(self.ra_session, path, rev, [old_rev])
|
||||
except core.SubversionException, e:
|
||||
_fix_subversion_exception(e)
|
||||
if e.apr_err == core.SVN_ERR_FS_NOT_FOUND:
|
||||
raise vclib.ItemNotFound(path)
|
||||
raise
|
||||
|
@@ -1,6 +1,6 @@
|
||||
# -*-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
|
||||
# the LICENSE.html file which can be found at the top level of the ViewVC
|
||||
@@ -15,9 +15,11 @@
|
||||
import vclib
|
||||
import os
|
||||
import os.path
|
||||
import stat
|
||||
import string
|
||||
import cStringIO
|
||||
import signal
|
||||
import shutil
|
||||
import time
|
||||
import tempfile
|
||||
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):
|
||||
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):
|
||||
"""Generic authz_read_func that permits access to all paths"""
|
||||
@@ -178,16 +167,13 @@ class NodeHistory:
|
||||
return
|
||||
self.histories.append([revision, _cleanup_path(path)])
|
||||
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):
|
||||
return self.histories[idx]
|
||||
|
||||
|
||||
def _get_history(svnrepos, path, rev, path_type, limit=0, options={}):
|
||||
if svnrepos.youngest == 0:
|
||||
return []
|
||||
|
||||
rev_paths = []
|
||||
fsroot = svnrepos._getroot(rev)
|
||||
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,
|
||||
1, rev, options.get('svn_cross_copies', 0))
|
||||
except core.SubversionException, e:
|
||||
_fix_subversion_exception(e)
|
||||
if e.apr_err != _SVN_ERR_CEASE_INVOCATION:
|
||||
if e.apr_err != core.SVN_ERR_CEASE_INVOCATION:
|
||||
raise
|
||||
|
||||
# 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)
|
||||
|
||||
# Assemble our LogEntry
|
||||
date, author, msg, changes = svnrepos._revinfo(rev)
|
||||
date, author, msg, changes = svnrepos.revinfo(rev)
|
||||
if fs.is_file(rev_root, path):
|
||||
size = fs.file_length(rev_root, path)
|
||||
else:
|
||||
@@ -329,7 +314,6 @@ class BlameSource:
|
||||
client.blame2(local_url, _rev2optrev(rev), _rev2optrev(first_rev),
|
||||
_rev2optrev(rev), self._blame_cb, ctx)
|
||||
except core.SubversionException, e:
|
||||
_fix_subversion_exception(e)
|
||||
if e.apr_err == core.SVN_ERR_CLIENT_IS_BINARY_FILE:
|
||||
raise vclib.NonTextualFileContents
|
||||
raise
|
||||
@@ -472,7 +456,7 @@ class LocalSubversionRepository(vclib.Repository):
|
||||
continue
|
||||
path = self._getpath(entry_path_parts)
|
||||
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.date = date
|
||||
entry.author = author
|
||||
@@ -570,125 +554,100 @@ class LocalSubversionRepository(vclib.Repository):
|
||||
youngest_rev, oldest_rev)
|
||||
return source, youngest_rev
|
||||
|
||||
def _revinfo(self, rev, include_changed_paths=0):
|
||||
"""Internal-use, cache-friendly revision information harvester."""
|
||||
|
||||
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
|
||||
def _revinfo_raw(self, rev):
|
||||
fsroot = self._getroot(rev)
|
||||
|
||||
# Consult the revinfo cache first. If we don't have cached info,
|
||||
# or our caller wants changed paths and we don't have those for
|
||||
# this revision, go do the real work.
|
||||
# Get the changes for the revision
|
||||
editor = repos.ChangeCollector(self.fs_ptr, fsroot)
|
||||
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)
|
||||
cached_info = self._revinfo_cache.get(rev)
|
||||
if not cached_info \
|
||||
or (include_changed_paths and cached_info[3] is None):
|
||||
cached_info = _revinfo_helper(rev, include_changed_paths)
|
||||
if not cached_info:
|
||||
cached_info = self._revinfo_raw(rev)
|
||||
self._revinfo_cache[rev] = cached_info
|
||||
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={}):
|
||||
p1 = self._getpath(path_parts1)
|
||||
p2 = self._getpath(path_parts2)
|
||||
@@ -702,7 +661,7 @@ class LocalSubversionRepository(vclib.Repository):
|
||||
args = vclib._diff_args(type, options)
|
||||
|
||||
def _date_from_rev(rev):
|
||||
date, author, msg, changes = self._revinfo(rev)
|
||||
date, author, msg, changes = self.revinfo(rev)
|
||||
return date
|
||||
|
||||
try:
|
||||
@@ -712,7 +671,6 @@ class LocalSubversionRepository(vclib.Repository):
|
||||
info2 = p2, _date_from_rev(r2), r2
|
||||
return vclib._diff_fp(temp1, temp2, info1, info2, self.diff_cmd, args)
|
||||
except core.SubversionException, e:
|
||||
_fix_subversion_exception(e)
|
||||
if e.apr_err == core.SVN_ERR_FS_NOT_FOUND:
|
||||
raise vclib.InvalidRevision
|
||||
raise
|
||||
@@ -752,7 +710,6 @@ class LocalSubversionRepository(vclib.Repository):
|
||||
results = repos.svn_repos_trace_node_locations(self.fs_ptr, path,
|
||||
rev, [old_rev], _allow_all)
|
||||
except core.SubversionException, e:
|
||||
_fix_subversion_exception(e)
|
||||
if e.apr_err == core.SVN_ERR_FS_NOT_FOUND:
|
||||
raise vclib.ItemNotFound(path)
|
||||
raise
|
||||
@@ -802,7 +759,6 @@ class LocalSubversionRepository(vclib.Repository):
|
||||
try:
|
||||
mid_id = fs.node_id(self._getroot(mid), path)
|
||||
except core.SubversionException, e:
|
||||
_fix_subversion_exception(e)
|
||||
if e.apr_err == core.SVN_ERR_FS_NOT_FOUND:
|
||||
cmp = -1
|
||||
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:
|
||||
|
||||
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:
|
||||
|
||||
|
@@ -49,7 +49,7 @@
|
||||
[else]
|
||||
[is changes.type "add"]
|
||||
<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_add"> [changes.right]</td>
|
||||
</tr>
|
||||
@@ -64,7 +64,7 @@
|
||||
[is changes.type "change"]
|
||||
<tr>
|
||||
[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]
|
||||
<td></td>
|
||||
[end]
|
||||
@@ -112,7 +112,7 @@
|
||||
</tr>
|
||||
[else]
|
||||
<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.right]</td>
|
||||
</tr>
|
||||
|
@@ -4,31 +4,23 @@
|
||||
<thead>
|
||||
<tr>
|
||||
<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"]
|
||||
<img class="vc_sortarrow" alt="[is sortdir "down"](rev)[end]"
|
||||
width="13" height="13"
|
||||
src="[docroot]/images/[is sortdir "up"]up[else]down[end].png" />
|
||||
[end]
|
||||
</a>
|
||||
</th>
|
||||
<th style="width: 96px" class="vc_header"></th>
|
||||
[if-any sortby_rev_href]
|
||||
<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"]
|
||||
<img class="vc_sortarrow" alt="[is sortdir "down"](rev)[end]"
|
||||
width="13" height="13"
|
||||
src="[docroot]/images/[is sortdir "up"]up[else]down[end].png" />
|
||||
[end]
|
||||
[else]
|
||||
<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]
|
||||
</a>
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
|
@@ -4,45 +4,50 @@
|
||||
<thead>
|
||||
<tr>
|
||||
<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"]
|
||||
<img class="vc_sortarrow" alt="[is sortdir "down"](rev)[end]"
|
||||
width="13" height="13"
|
||||
src="[docroot]/images/[is sortdir "up"]up[else]down[end].png" />
|
||||
[end]
|
||||
</a>
|
||||
</th>
|
||||
<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"]
|
||||
<img class="vc_sortarrow" alt="[is sortdir "down"](rev)[end]"
|
||||
width="13" height="13"
|
||||
src="[docroot]/images/[is sortdir "up"]up[else]down[end].png" />
|
||||
[end]
|
||||
</a>
|
||||
</th>
|
||||
<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"]
|
||||
<img class="vc_sortarrow" alt="[is sortdir "down"](rev)[end]"
|
||||
width="13" height="13"
|
||||
src="[docroot]/images/[is sortdir "up"]up[else]down[end].png" />
|
||||
[end]
|
||||
</a>
|
||||
</th>
|
||||
<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"]
|
||||
<img class="vc_sortarrow" alt="[is sortdir "down"](rev)[end]"
|
||||
width="13" height="13"
|
||||
src="[docroot]/images/[is sortdir "up"]up[else]down[end].png" />
|
||||
[end]
|
||||
</a>
|
||||
</th>
|
||||
[is cfg.options.show_logs "1"]
|
||||
<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"]
|
||||
<img class="vc_sortarrow" alt="[is sortdir "down"](rev)[end]"
|
||||
width="13" height="13"
|
||||
src="[docroot]/images/[is sortdir "up"]up[else]down[end].png" />
|
||||
[end]
|
||||
</a>
|
||||
</th>
|
||||
[end]
|
||||
</tr>
|
||||
|
@@ -229,8 +229,6 @@ form { margin: 0; }
|
||||
font-family: sans-serif;
|
||||
font-size: smaller;
|
||||
}
|
||||
.vc_diff_line_number {
|
||||
}
|
||||
.vc_raw_diff {
|
||||
background-color: #cccccc;
|
||||
font-size: smaller;
|
||||
@@ -272,8 +270,3 @@ table.vc_idiff tbody th {
|
||||
.vc_query_form {
|
||||
background-color: #e6e6e6;
|
||||
}
|
||||
|
||||
|
||||
/*** Graph Display Form ***/
|
||||
.vc_graph_form {
|
||||
}
|
||||
|
@@ -1,15 +1,5 @@
|
||||
[# ------------------------------------------------------------------------- ]
|
||||
[# CUSTOMIZE ME: To avoid displaying "binary garbage" -- the contents of ]
|
||||
[# files with non-human-readable file formats -- change the value of the ]
|
||||
[# hide_binary_garbage variable below to 1. ]
|
||||
[# ------------------------------------------------------------------------- ]
|
||||
|
||||
[define hide_binary_garbage]0[end]
|
||||
|
||||
[# ------------------------------------------------------------------------- ]
|
||||
|
||||
[# setup page definitions]
|
||||
[define page_title]Contents of /[where][end]
|
||||
[define page_title]Annotate of /[where][end]
|
||||
[define help_href][docroot]/help_rootview.html[end]
|
||||
[# end]
|
||||
|
||||
@@ -18,7 +8,7 @@
|
||||
<hr />
|
||||
<div class="vc_summary">
|
||||
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_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]
|
||||
<br />Lock status: <img src="[docroot]/images/lock.png" alt="Locked" width="16" height="16" /> [lockinfo]
|
||||
[end]
|
||||
[if-any annotation]
|
||||
[is annotation "binary"]
|
||||
<br /><strong>Unable to calculate annotation data on binary file contents.</strong>
|
||||
[end]
|
||||
[is annotation "error"]
|
||||
<br /><strong>Error occurred while calculating annotation data.</strong>
|
||||
[end]
|
||||
[end]
|
||||
[is state "dead"]
|
||||
<br /><strong><em>FILE REMOVED</em></strong>
|
||||
[end]
|
||||
@@ -67,14 +59,6 @@ Revision [if-any revision_href]<a href="[revision_href]"><strong>[rev]</strong><
|
||||
[end]
|
||||
</div>
|
||||
|
||||
[if-any prefer_markup][define hide_binary_garbage]0[end][end]
|
||||
[if-any image_src_href][define hide_binary_garbage]0[end][end]
|
||||
|
||||
[is hide_binary_garbage "1"]
|
||||
<p><strong>This file's contents are not viewable. Please
|
||||
<a href="[download_href]">download</a> this version of the
|
||||
file in order to view it.</strong></p>
|
||||
[else]
|
||||
|
||||
[define last_rev]0[end]
|
||||
[define rowclass]vc_row_even[end]
|
||||
@@ -117,7 +101,6 @@ Revision [if-any revision_href]<a href="[revision_href]"><strong>[rev]</strong><
|
||||
</div>
|
||||
[end]
|
||||
[end]
|
||||
[end]
|
||||
|
||||
[include "include/props.ezt"]
|
||||
[include "include/footer.ezt"]
|
||||
|
@@ -15,78 +15,4 @@
|
||||
alt="Revisions of [where]" />
|
||||
</div>
|
||||
|
||||
[define graph_disp_opts][end]
|
||||
[if-any opt_gflip][define graph_disp_opts]1[end][end]
|
||||
[if-any opt_gbbox][define graph_disp_opts]1[end][end]
|
||||
[if-any opt_gleft][define graph_disp_opts]1[end][end]
|
||||
|
||||
[define graph_user_opts][end]
|
||||
[if-any graph_disp_opts][define graph_user_opts]1[end][end]
|
||||
[if-any opt_gshow][define graph_user_opts]1[end][end]
|
||||
[if-any opt_gmaxtag][define graph_user_opts]1[end][end]
|
||||
|
||||
[if-any graph_user_opts]
|
||||
|
||||
<form method="get" action="[graph_action]">
|
||||
<div class="vc_graph_form">
|
||||
[for graph_hidden_values]<input type="hidden" name="[graph_hidden_values.name]" value="[graph_hidden_values.value]"/>[end]
|
||||
|
||||
[is graph_disp_opts "1"]
|
||||
<p><strong>Graph display options:</strong></p>
|
||||
<table class="auto">
|
||||
[if-any opt_gflip]
|
||||
<tr>
|
||||
<td><input id="gflip" type="checkbox" name="gflip" value="1"[if-any gflip] checked="checked"[end] /></td>
|
||||
<td style="text-align: left;"><label for="gflip">Flip the graph</label></td>
|
||||
</tr>
|
||||
[end]
|
||||
[if-any opt_gbbox]
|
||||
<tr>
|
||||
<td><input id="gbbox" type="checkbox" name="gbbox" value="1"[if-any gbbox] checked="checked"[end] /></td>
|
||||
<td style="text-align: left;"><label for="gbbox">Add a branch box at the tip of each branch</label></td>
|
||||
</tr>
|
||||
[end]
|
||||
[if-any opt_gleft]
|
||||
<tr>
|
||||
<td><input id="gleft" type="checkbox" name="gleft" value="1"[if-any gleft] checked="checked"[end] /></td>
|
||||
<td style="text-align: left;"><label for="gleft">Draw tree left-to-right (instead of top-to-bottom)</label></td>
|
||||
</tr>
|
||||
[end]
|
||||
</table>
|
||||
[end]
|
||||
|
||||
[if-any opt_gshow]
|
||||
<p><strong>Revision display options:</strong></p>
|
||||
<table class="auto">
|
||||
<tr>
|
||||
<td><input id="gshow_all" type="radio" name="gshow" value="all"[is gshow "all"] checked="checked"[end] /></td>
|
||||
<td style="text-align: left;"><label for="gshow_all">Show all revisions</label></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><input id="gshow_inittagged" type="radio" name="gshow" value="inittagged"[is gshow "inittagged"] checked="checked"[end] /></td>
|
||||
<td style="text-align: left;"><label for="gshow_inittagged">Show only tagged and initial untagged revisions</label></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><input id="gshow_tagged" type="radio" name="gshow" value="tagged"[is gshow "tagged"] checked="checked"[end] /></td>
|
||||
<td style="text-align: left;"><label for="gshow_tagged">Show only tagged revisions</label></td>
|
||||
</tr>
|
||||
</table>
|
||||
[end]
|
||||
|
||||
[if-any opt_gmaxtag]
|
||||
<p><strong>Tag limitation:</strong></p>
|
||||
<table class="auto">
|
||||
<tr>
|
||||
<td><input id="gmaxtag" type="text" size="3" name="gmaxtag" value="[gmaxtag]" /></td>
|
||||
<td style="text-align: left;"><label for="gmaxtag">Maximum number of tags to display (0=all)</label></td>
|
||||
</tr>
|
||||
</table>
|
||||
[end]
|
||||
|
||||
<input type="submit" value="Refresh" />
|
||||
|
||||
</div>
|
||||
</form>
|
||||
[end]
|
||||
|
||||
[include "include/footer.ezt"]
|
||||
|
@@ -32,7 +32,7 @@
|
||||
<td>[include "pathrev_form.ezt"]</td>
|
||||
</tr>
|
||||
|
||||
[if-any search_re_action]
|
||||
[if-any search_re_form]
|
||||
<tr>
|
||||
<td>Filter files by content:</td>
|
||||
<td><form method="get" action="[search_re_action]" style="display: inline;">
|
||||
@@ -63,7 +63,7 @@
|
||||
|
||||
</table>
|
||||
|
||||
[is picklist_len "0"]
|
||||
[is cfg.options.use_pagesize "0"]
|
||||
[else]
|
||||
[is picklist_len "1"]
|
||||
[else]
|
||||
|
@@ -2,7 +2,7 @@
|
||||
[is pathtype "file"]
|
||||
<a href="[up_href]"><img src="[docroot]/images/back_small.png" class="vc_icon" alt="Parent Directory" /> Parent Directory</a>
|
||||
[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]
|
||||
[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>
|
||||
|
@@ -1,4 +1,4 @@
|
||||
[is picklist_len "0"]
|
||||
[is cfg.options.use_pagesize "0"]
|
||||
[else]
|
||||
[is picklist_len "1"]
|
||||
[else]
|
||||
@@ -17,4 +17,6 @@
|
||||
</select>
|
||||
</form>
|
||||
[end]
|
||||
[end]
|
||||
[end]
|
||||
|
||||
|
||||
|
@@ -28,11 +28,6 @@
|
||||
<td>[if-any date][date][else]<em>(unknown date)</em>[end]
|
||||
[if-any ago]<em>([ago] ago)</em>[end]</td>
|
||||
</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">
|
||||
<th>Log Message:</th>
|
||||
<td><pre class="vc_log">[log]</pre></td>
|
||||
@@ -44,6 +39,17 @@
|
||||
|
||||
<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">
|
||||
<thead>
|
||||
<tr align="left">
|
||||
@@ -69,11 +75,6 @@
|
||||
<td colspan="5">No changed paths.</td>
|
||||
</tr>
|
||||
[end]
|
||||
[if-any more_changes]
|
||||
<tr>
|
||||
<td colspan="5">[[]<a href="[more_changes_href]">...</a>]</td>
|
||||
</tr>
|
||||
[end]
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
|
@@ -17,18 +17,17 @@
|
||||
|
||||
### Validate input
|
||||
if test $# != 2 && test $# != 1; then
|
||||
echo "Usage: $0 TARGET-DIRECTORY [BRANCH]"
|
||||
echo "Usage: $0 TARGET-DIRECTORY [TAGNAME]"
|
||||
echo ""
|
||||
echo "If BRANCH (i.e. \"tags/1.1.0\" or \"branches/1.0.x\") is not provided,"
|
||||
echo "the release will be rolled from trunk."
|
||||
echo "If TAGNAME is not provided, the release will be rolled from trunk."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
TARGET=${1}
|
||||
if test $# = 1; then
|
||||
if test $# == 1; then
|
||||
ROOT=trunk
|
||||
else
|
||||
ROOT=${2}
|
||||
ROOT=tags/${2}
|
||||
fi
|
||||
|
||||
if test -e ${TARGET}; then
|
||||
@@ -37,8 +36,7 @@ if test -e ${TARGET}; then
|
||||
fi
|
||||
|
||||
### Grab an export from the Subversion repository.
|
||||
EXPORT_URL="http://viewvc.tigris.org/svn/viewvc/${ROOT}"
|
||||
echo "Exporting '${EXPORT_URL}' into '${TARGET}'"
|
||||
echo "Exporting into:" ${TARGET}
|
||||
|
||||
for PLATFORM in unix windows; do
|
||||
if test ${PLATFORM} = windows; then
|
||||
@@ -50,7 +48,7 @@ for PLATFORM in unix windows; do
|
||||
echo "Beginning build for ${PLATFORM}:"
|
||||
|
||||
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.
|
||||
|
||||
|
@@ -1,7 +1,7 @@
|
||||
#!/usr/bin/env 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
|
||||
# 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/svndbadmin", "bin/svndbadmin", 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),
|
||||
("conf/viewvc.conf.dist", "viewvc.conf", 0644, 0, 1, 0),
|
||||
("conf/cvsgraph.conf.dist", "cvsgraph.conf.dist", 0644, 0, 0, 0),
|
||||
("conf/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),
|
||||
("viewvc.conf.dist", "viewvc.conf.dist", 0644, 0, 0, 0),
|
||||
("viewvc.conf.dist", "viewvc.conf", 0644, 0, 1, 0),
|
||||
("cvsgraph.conf.dist", "cvsgraph.conf.dist", 0644, 0, 0, 0),
|
||||
("cvsgraph.conf.dist", "cvsgraph.conf", 0644, 0, 1, 0),
|
||||
]
|
||||
if sys.platform == "win32":
|
||||
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
|
||||
ViewVC. The templates themselves can be found in the
|
||||
<code>templates</code> subdirectory. We're currently developing a
|
||||
how-to guide for
|
||||
<a href="http://viewvc.tigris.org/source/browse/viewvc/trunk/docs/template-authoring-guide.html?rev=HEAD"
|
||||
>ViewVC template customization</a>.</p>
|
||||
how-to guide for <a href="./template-authoring-guide.html">ViewVC
|
||||
template customization</a>.</p>
|
||||
|
||||
</div> <!-- section-body -->
|
||||
</div> <!-- section -->
|
||||
|
@@ -35,8 +35,7 @@
|
||||
|
||||
<ul id="bookmarks">
|
||||
<li><a href="#sec-download">Downloading</a></li>
|
||||
<li><a href="#sec-subversion">Subversion Checkout</a></li>
|
||||
<li><a href="#sec-upgrading">Upgrading</a></li>
|
||||
<li><a href="#sec-subversion">Subversion</a></li>
|
||||
</ul>
|
||||
|
||||
<p><a href="http://validator.w3.org/check?uri=referer"><img
|
||||
@@ -69,7 +68,7 @@
|
||||
|
||||
<div class="section">
|
||||
|
||||
<h2 id="sec-subversion">Subversion Checkout</h2>
|
||||
<h2 id="sec-subversion">Subversion</h2>
|
||||
|
||||
<div class="section-body">
|
||||
|
||||
@@ -84,36 +83,6 @@
|
||||
</div> <!-- section-body -->
|
||||
</div> <!-- section -->
|
||||
|
||||
<div class="section">
|
||||
|
||||
<h2 id="sec-upgrading">Upgrading</h2>
|
||||
|
||||
<div class="section-body">
|
||||
|
||||
<p>We've tried to ensure that ViewVC URLs are stable, and that even
|
||||
when we deprecate a particular URL syntax, we continue to support
|
||||
the handling of it (using HTTP redirects to point browsers to the
|
||||
new form of that URL). We know that ViewVC URLs get bookmarked,
|
||||
and nobody likes when their bookmarked URLs suddenly stop working.</p>
|
||||
|
||||
<p>Across patch releases of ViewVC (when only the <em>Z</em> component
|
||||
of <em>version X.Y.Z</em> changes), we do our best to keep the
|
||||
configuration file syntax and template data dictionary unchanged,
|
||||
too. This makes it much easier for folks who need to upgrade
|
||||
quickly to get security or other bug fixes. But across major and
|
||||
minor releases, all bets are off, and chances are good that we've
|
||||
done some major plumbing. When upgrading your ViewVC instance
|
||||
across major or minor version numbers, you'll almost certainly want
|
||||
to consult our
|
||||
<a href="http://viewvc.tigris.org/source/browse/viewvc/trunk/docs/upgrading-howto.html?rev=HEAD"
|
||||
>upgrading HOWTO</a> for tips on how to migrate your configuration
|
||||
files and any template customizations you've made into their new
|
||||
formats.</p>
|
||||
|
||||
</div> <!-- section-body -->
|
||||
</div> <!-- section -->
|
||||
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
@@ -63,9 +63,6 @@
|
||||
<li><a href="#installation">Where does the installation documentation,
|
||||
if any, live?</a></li>
|
||||
|
||||
<li><a href="#vhost-root">How can I expose ViewVC at the root of a
|
||||
virtual host on my webserver?</a></li>
|
||||
|
||||
<li><a href="#authz-support">Does ViewVC support path-based
|
||||
authorization, such as Subversion's authz-file mechanism?</a></li>
|
||||
|
||||
@@ -87,9 +84,6 @@
|
||||
|
||||
<ul>
|
||||
|
||||
<li><a href="#error-displaying-cvs-files">Why can I navigate only those CVS
|
||||
directories that have no files in them?</a></li>
|
||||
|
||||
<li><a href="#rlog-output-ended-early">What causes "Error: Rlog output ended
|
||||
early. Expected RCS file "/opt/cvs/project/file,v""?</a></li>
|
||||
|
||||
@@ -153,40 +147,25 @@
|
||||
>http://viewvc.tigris.org/source/browse/*checkout*/viewvc/trunk/docs/upgrading-howto.html</a>.</p>
|
||||
</div>
|
||||
|
||||
<div id="vhost-root">
|
||||
<p class="faq-atitle">How can I expose ViewVC at the root of a virtual
|
||||
host on my webserver?</p>
|
||||
|
||||
<p>If you want to dedicate a virtual host on your server just to
|
||||
ViewVC, such the root directory of that host maps to ViewVC's root
|
||||
display, you can do so by placing the following lines inside
|
||||
the <code>VirtualHost</code>Apache configuration:</p>
|
||||
|
||||
<blockquote><pre>Alias /docroot /usr/local/viewvc/templates/docroot
|
||||
ScriptAlias / /usr/local/viewvc/bin/cgi/viewvc.cgi/</pre></blockquote>
|
||||
|
||||
<p>The trick appears to be the presence of the trailing slash
|
||||
character on the <code>ScriptAlias</code> directive.</p>
|
||||
|
||||
</div>
|
||||
|
||||
<div id="authz-support">
|
||||
<p class="faq-atitle">Does ViewVC support path-based authorization,
|
||||
such as Subversion's authz-file mechanism?</p>
|
||||
|
||||
<p>This feature is available in ViewVC 1.1.0, which you can get from
|
||||
our <a href="http://viewvc.org/download.html" >Download</a>
|
||||
page.</p>
|
||||
<p>There are no released versions of ViewVC which have this support
|
||||
built-in. The feature request is being tracking in <a
|
||||
href="http://viewvc.tigris.org/issues/show_bug.cgi?id=268">issue
|
||||
#268</a>, and we're working to complete it for release in ViewVC
|
||||
1.1.</p>
|
||||
|
||||
<p>If you prefer to use only final releases, there are some available
|
||||
workarounds. For example, if you are running ViewVC under Apache,
|
||||
you can use regular Apache configuration directives to
|
||||
authz-protect areas of your repository — see
|
||||
the <a href="http://httpd.apache.org/docs/2.2/mod/core.html#location"
|
||||
>Location</a>
|
||||
and <a href="http://httpd.apache.org/docs/2.2/mod/core.html#locationmatch"
|
||||
>LocationMatch</a> directives, as well as
|
||||
the <a href="http://httpd.apache.org/docs/2.2/howto/auth.html"
|
||||
<p>In the meantime, there are some available workarounds. For
|
||||
example, if you are running ViewVC under Apache, you can use
|
||||
regular Apache configuration directives to authz-protect areas of
|
||||
your repository — see the <a
|
||||
href="http://httpd.apache.org/docs/2.2/mod/core.html#location"
|
||||
>Location</a> and <a
|
||||
href="http://httpd.apache.org/docs/2.2/mod/core.html#locationmatch"
|
||||
>LocationMatch</a> directives, as well as the <a
|
||||
href="http://httpd.apache.org/docs/2.2/howto/auth.html"
|
||||
>Authentication, Authorization and Access Control</a> portions of
|
||||
the Apache HTTP Server documentation. This works best when ViewVC
|
||||
is only serving up a single repository, or when the
|
||||
@@ -244,34 +223,20 @@ ScriptAlias / /usr/local/viewvc/bin/cgi/viewvc.cgi/</pre></blockquote>
|
||||
<h3 class="faq-section" id="faq-a-cvs">CVS Browsing</h3>
|
||||
<!-- #- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -# -->
|
||||
|
||||
<div id="error-displaying-cvs-files">
|
||||
|
||||
<p class="faq-atitle">Why can I navigate only those CVS directories
|
||||
that have no files in them?</p>
|
||||
|
||||
<p>ViewVC can generally display CVS directories without the use of any
|
||||
external tools. But unless configured to use the incomplete,
|
||||
experimental rcsparse module (via the <code>use_rcsparse</code>
|
||||
configuration option), it relies on either the RCS toolchain or the
|
||||
CVSNT tool (on Windows) to get information about versioned files.
|
||||
If the system is missing both of these, you'll need to remedy that.
|
||||
If ViewVC simply cannot find the installed tools, ensure that they
|
||||
are available in the system <code>$PATH</code>, or specify their
|
||||
location in the <code>viewvc.conf</code> file using
|
||||
the <code>utilities/rcs_dir</code> or <code>utilities/cvsnt</code>
|
||||
options. (Note that prior to ViewVC 1.1.0, these options were found
|
||||
at <code>general/rcs_path</code>
|
||||
and <code>general/cvsnt_exe_path</code>.)</p>
|
||||
|
||||
</div>
|
||||
|
||||
<div id="rlog-output-ended-early">
|
||||
|
||||
<p class="faq-atitle">What causes "Error: Rlog output ended
|
||||
early. Expected RCS file "/opt/cvs/project/file,v""?</p>
|
||||
|
||||
<p>This is another symptom of the basic problem described <a
|
||||
href="#error-displaying-cvs-files">here</a>.</p>
|
||||
<p>This error generally occurs when ViewVC is unable to locate the
|
||||
rlog tool, one of several in the RCS toolchain. If the system
|
||||
doesn't have the RCS toolchain installed, you'll need to install
|
||||
it. If the RCS toolchain is installed, but ViewVC simply can't
|
||||
locate the RCS programs, either ensure that the programs are
|
||||
in the system <code>$PATH</code>, or specify their location in
|
||||
the <code>viewvc.conf</code> file — the option is
|
||||
<code>utilities/rcs_dir</code> as of ViewVC 1.1,
|
||||
<code>general/rcs_path</code> in earlier versions.</p>
|
||||
|
||||
</div>
|
||||
|
||||
@@ -281,7 +246,7 @@ ScriptAlias / /usr/local/viewvc/bin/cgi/viewvc.cgi/</pre></blockquote>
|
||||
find filename in co output stream"?</p>
|
||||
|
||||
<p>This is another symptom of the basic problem described <a
|
||||
href="#error-displaying-cvs-files">here</a>.</p>
|
||||
href="#rlog-output-ended-early">here</a>.</p>
|
||||
|
||||
</div>
|
||||
|
||||
|
@@ -36,6 +36,7 @@
|
||||
<ul id="bookmarks">
|
||||
<li><a href="#sec-what-is-viewvc">What Is ViewVC?</a></li>
|
||||
<li><a href="#sec-requirements">Requirements</a></li>
|
||||
<li><a href="#sec-future">Future Plans</a></li>
|
||||
</ul>
|
||||
|
||||
<p><a href="http://validator.w3.org/check?uri=referer"><img
|
||||
@@ -65,14 +66,7 @@
|
||||
|
||||
<ul>
|
||||
|
||||
<li>Support for filesystem-accessible CVS and Subversion
|
||||
repositories.</li>
|
||||
|
||||
<li>Support for path-based authorization, including parsing and
|
||||
honoring Subversion authz configuration files.</li>
|
||||
|
||||
<li>RSS feed generation for tracking changes to repositories or
|
||||
individual items within repositories.</li>
|
||||
<li>Support for filesystem-accessible CVS and Subversion repositories.</li>
|
||||
|
||||
<li>Individually configurable virtual host support.</li>
|
||||
|
||||
@@ -94,8 +88,7 @@
|
||||
<li>Tarball generation (by tag/branch for CVS, by revision for
|
||||
Subversion).</li>
|
||||
|
||||
<li>Localization support based on the Accept-Language request
|
||||
header.</li>
|
||||
<li>I18N support based on the Accept-Language request header.</li>
|
||||
|
||||
<li>Ability to run either as CGI script or as a standalone
|
||||
server.</li>
|
||||
@@ -125,21 +118,6 @@
|
||||
href="http://www.python.org/">Python 1.5.2</a> or later. All other
|
||||
requirements depend on what you want to do with the tool.</p>
|
||||
|
||||
<p>For use with Subversion repositories, you need these things:</p>
|
||||
|
||||
<ul>
|
||||
|
||||
<li><a href="http://subversion.tigris.org/">Subversion</a> 1.2 or
|
||||
later and its SWIG Python bindings.</li>
|
||||
|
||||
<li><a href="http://www.gnu.org/software/diffutils/diffutils.html">GNU
|
||||
diff</a></li>
|
||||
|
||||
<li>Physical access to a Subversion repository (though there is
|
||||
limited, use-at-your-risk support for remote access, too).</li>
|
||||
|
||||
</ul>
|
||||
|
||||
<p>If you plan to use ViewVC with CVS repositories, you need the
|
||||
following things:</p>
|
||||
|
||||
@@ -155,25 +133,65 @@
|
||||
|
||||
</ul>
|
||||
|
||||
<p>For use with Subversion repositories, you need these things:</p>
|
||||
|
||||
<ul>
|
||||
|
||||
<li><a href="http://subversion.tigris.org/">Subversion</a> 1.2 or
|
||||
later and its SWIG Python bindings.</li>
|
||||
|
||||
<li><a href="http://www.gnu.org/software/diffutils/diffutils.html">GNU
|
||||
diff</a></li>
|
||||
|
||||
<li>Physical access to a Subversion repository (though there is
|
||||
limited, use-at-your-risk support for remote access, too).</li>
|
||||
|
||||
</ul>
|
||||
|
||||
<p>ViewVC integrates with additional pieces of software to provide
|
||||
certain bits of optional functionality:</p>
|
||||
|
||||
<ul>
|
||||
|
||||
<li><a href="http://httpd.apache.org/">Apache HTTP Server</a>, or
|
||||
another server capable of running CGI programs — unless
|
||||
you just want ViewVC to run in standalone server mode.</li>
|
||||
|
||||
<li><a href="http://www.mysql.com/">MySQL</a> — Needed to use
|
||||
the commit database query functionality.</li>
|
||||
|
||||
<li><a href="http://pygments.org/">Pygments</a> — Needed for
|
||||
syntax highlighting in versioned file contents
|
||||
displays.</li>
|
||||
<li><a href="http://www.codento.com/people/mtr/genscript/">GNU
|
||||
enscript</a> — Needed for syntax highlighting in versioned
|
||||
file contents displays</li>
|
||||
|
||||
<li><a href="http://www.akhphd.au.dk/~bertho/cvsgraph/">CvsGraph</a>
|
||||
— Needed for version graph displays.</li>
|
||||
|
||||
<li><a href="http://httpd.apache.org/">Apache HTTP Server</a>, or
|
||||
another server capable of running CGI programs — unless
|
||||
you just want ViewVC to run in standalone server mode.</li>
|
||||
|
||||
</ul>
|
||||
|
||||
</div> <!-- section-body -->
|
||||
</div> <!-- section -->
|
||||
|
||||
<div class="section">
|
||||
|
||||
<h2 id="sec-future">Future Plans</h2>
|
||||
|
||||
<div class="section-body">
|
||||
|
||||
<p>ViewVC is an Open Source project. So any future development
|
||||
depends on the <a href="./contributing.html">contributions</a> that
|
||||
will be made by its user community. Certainly working patches have
|
||||
a greater chance to become realized quickly than feature requests,
|
||||
but please don't hesitate to submit your suggestions to our <a
|
||||
href="http://viewvc.tigris.org/servlets/ProjectIssues">issue
|
||||
tracker</a>.</p>
|
||||
|
||||
<p>Some things we're thinking about include:</p>
|
||||
|
||||
<ul>
|
||||
<li>UI streamlining/simplification.</li>
|
||||
<li>Integration with CVS and Subversion commit mail scripts.</li>
|
||||
<li>Integration with an indexer such as LXR.</li>
|
||||
</ul>
|
||||
|
||||
</div> <!-- section-body -->
|
||||
|
@@ -46,7 +46,7 @@ def make_release(branch, export_dir, publish_dir, root_url, username, password):
|
||||
curdir = os.getcwd()
|
||||
try:
|
||||
os.chdir(os.path.join(export_dir, 'tools'))
|
||||
os.system('./make-release %s %s' % (distname, branch))
|
||||
os.system('./make-release %s' % (distname))
|
||||
finally:
|
||||
os.chdir(curdir)
|
||||
|
||||
|
@@ -8,7 +8,6 @@
|
||||
#longdescription { border: none; }
|
||||
#longdescription h2 { display: none; }
|
||||
#customcontent h2 { display: block; }
|
||||
.h2 { margin-bottom: 2em; }
|
||||
</style>
|
||||
<!-- End custom stylations -->
|
||||
</head>
|
||||
@@ -19,27 +18,10 @@
|
||||
|
||||
<h1>ViewVC — Web-based Version Control Repository Browsing</h1>
|
||||
|
||||
<div class="h2"
|
||||
style="border-style: solid;
|
||||
border-width: 1px 2px 2px 1px;
|
||||
border-color: black;
|
||||
background: #eed;
|
||||
padding: 0.5em;">
|
||||
<div class="h2">
|
||||
<h2>Latest Release</h2>
|
||||
|
||||
<h2>Latest Release(s)</h2>
|
||||
|
||||
<p>The most recent stable release of ViewVC is: <strong>1.1.2</strong></p>
|
||||
|
||||
<ul>
|
||||
<li><a href="http://www.viewvc.org/download.html"
|
||||
>Download or checkout</a> this release</li>
|
||||
<li>See the
|
||||
<a href="http://viewvc.tigris.org/source/browse/*checkout*/viewvc/tags/1.1.2/CHANGES"
|
||||
>CHANGES</a> in this release.</li>
|
||||
<li>Read the
|
||||
<a href="http://viewvc.tigris.org/source/browse/*checkout*/viewvc/trunk/docs/release-notes/1.1.0.html"
|
||||
>release notes</a> for this version line.</li>
|
||||
</ul>
|
||||
<p>The most recent release of ViewVC is: <strong>1.0.7</strong></p>
|
||||
|
||||
</div>
|
||||
|
||||
@@ -63,16 +45,15 @@
|
||||
<li>Line-based annotation/blame display</li>
|
||||
<li>Revision graph capabilities (<em>CVS only</em>)</li>
|
||||
<li>Syntax highlighting support</li>
|
||||
<li>Path-based authorization</li>
|
||||
<li>Commit metadata query facilities</li>
|
||||
<li>Template-driven output generation</li>
|
||||
<li>Colorized, side-by-side differences</li>
|
||||
<li>Tarball generation (by tag for CVS, by revision for Subversion)</li>
|
||||
<li>Ability to run as CGI script, under mod_python, or as a
|
||||
standalone server application</li>
|
||||
<li>Regexp-based file searching</li>
|
||||
<li>INI-like configuration file (no code tweaking required)</li>
|
||||
<li>Localization support based on the Accept-Language request header</li>
|
||||
<li>Ability to run either as CGI script or as a standalone server</li>
|
||||
<li>Regexp-based file searching</li>
|
||||
<li>INI-like configuration file (as opposed to requiring actual code
|
||||
tweaks)</li>
|
||||
</ul>
|
||||
|
||||
<p>For a complete list of changes present in each release, see
|
||||
@@ -85,28 +66,20 @@
|
||||
<div class="h2">
|
||||
<h2>Wanna Talk About ViewVC?</h2>
|
||||
|
||||
<table border="0" cellpadding="10" cellspacing="10" style="margin: 0 5%;">
|
||||
<thead>
|
||||
<tr style="vertical-align: top;">
|
||||
<th style="width: 50%;">User/Admin Discussion</th>
|
||||
<th style="width: 50%;">Developer Discussion</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr style="vertical-align: top;">
|
||||
<td>If you have questions about ViewVC — how to configure it, if
|
||||
some behavior you are seeing is expected or not, and so on —
|
||||
send email to <a href="mailto:users@viewvc.tigris.org"
|
||||
>users@viewvc.tigris.org</a> or use your favorite IRC client to
|
||||
pop into <tt><a href="irc://irc.freenode.net/viewvc"
|
||||
>#viewvc</a></tt> on irc.freenode.net.</td>
|
||||
<td>If you'd like to discuss the actual development of ViewVC itself,
|
||||
or submit a patch to ViewVC's sources, you can do so on our
|
||||
development list, <a href="mailto:dev@viewvc.tigris.org"
|
||||
>dev@viewvc.tigris.org</a>.</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<p>If you have questions about ViewVC — how to configure it, if
|
||||
some behavior you are seeing is expected or not, and so on —
|
||||
send email to our users list: <a
|
||||
href="mailto:users@viewvc.tigris.org"
|
||||
>users@viewvc.tigris.org</a>.</p>
|
||||
|
||||
<p>If you'd like to discuss the actual development of ViewVC itself,
|
||||
or submit a patch to ViewVC's sources, you can do so on our
|
||||
development list: <a href="mailto:dev@viewvc.tigris.org"
|
||||
>dev@viewvc.tigris.org</a>.</p>
|
||||
|
||||
<p>Finally, if you prefer realtime chatter, use your favorite IRC
|
||||
client to pop into <tt><a href="irc://irc.freenode.net/viewvc"
|
||||
>#viewvc</a></tt> on irc.freenode.net.</p>
|
||||
|
||||
</div>
|
||||
|
||||
|
@@ -13,14 +13,12 @@
|
||||
|
||||
<li><a href="http://viewvc.tigris.org/servlets/ProjectNewsList"
|
||||
>Announcements</a></li>
|
||||
<li><a href="http://viewvc.tigris.org/ds/viewForums.do"
|
||||
>Discussions</a></li>
|
||||
<li><a href="http://viewvc.tigris.org/servlets/ProjectMailingListList"
|
||||
>Mailing lists</a></li>
|
||||
<li><a href="http://viewvc.tigris.org/source/browse/viewvc/"
|
||||
>Source Code</a></li>
|
||||
>Subversion</a></li>
|
||||
<li><a href="http://viewvc.tigris.org/issues/buglist.cgi?component=viewvc&issue_status=UNCONFIRMED&issue_status=NEW&issue_status=STARTED&issue_status=REOPENED"
|
||||
>Issue tracker</a></li>
|
||||
<li><a href="http://viewvc.tigris.org/servlets/ProjectDocumentList?folderID=6004"
|
||||
>Downloads</a></li>
|
||||
|
||||
</ul></dd>
|
||||
<!-- .................................................................. -->
|
||||
|
Reference in New Issue
Block a user