Compare commits
279 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
71b8440308 | ||
![]() |
370c49ad75 | ||
![]() |
40e938f123 | ||
![]() |
57ab699677 | ||
![]() |
c4ec79be78 | ||
![]() |
6f8c5a64b4 | ||
![]() |
f3335bd10c | ||
![]() |
f842941cd1 | ||
![]() |
d4eedc49b9 | ||
![]() |
24b213e14c | ||
![]() |
82c0b25d80 | ||
![]() |
8fdb3c6a98 | ||
![]() |
ea15def7ad | ||
![]() |
d15ff63726 | ||
![]() |
ac2566c7ab | ||
![]() |
41fdf2b86d | ||
![]() |
a878d93992 | ||
![]() |
dae4abebaf | ||
![]() |
dba173ca38 | ||
![]() |
5e18bf0aa4 | ||
![]() |
41809c22bf | ||
![]() |
850f4dd0eb | ||
![]() |
7eace69bfb | ||
![]() |
907d9eddd2 | ||
![]() |
02eefc07a5 | ||
![]() |
ddd96672b0 | ||
![]() |
0fc67216d5 | ||
![]() |
167a2a041b | ||
![]() |
c4483d0501 | ||
![]() |
d620bc13e7 | ||
![]() |
e3756ae365 | ||
![]() |
77ad38cbdb | ||
![]() |
7feecdd512 | ||
![]() |
a087c06a88 | ||
![]() |
acce6a556d | ||
![]() |
4670019d3a | ||
![]() |
9ce7372e1a | ||
![]() |
e1959ac2e5 | ||
![]() |
cb38ccc929 | ||
![]() |
f2b82132c2 | ||
![]() |
5caf3a4437 | ||
![]() |
06ee4df42d | ||
![]() |
0a6b13145e | ||
![]() |
65d3568c92 | ||
![]() |
de5b147a6f | ||
![]() |
eb6b575701 | ||
![]() |
8d82b6f0d6 | ||
![]() |
5a51470cbc | ||
![]() |
acc0783468 | ||
![]() |
c91325d40a | ||
![]() |
ca1bd67b5d | ||
![]() |
f1e7ef42d6 | ||
![]() |
8b7eae7f14 | ||
![]() |
6f3d9a3a00 | ||
![]() |
1d7307c09b | ||
![]() |
22d1e72c66 | ||
![]() |
0e7d4061ed | ||
![]() |
56dd2dcf28 | ||
![]() |
5932f24a68 | ||
![]() |
161421a20f | ||
![]() |
2a297c5361 | ||
![]() |
f43117b10f | ||
![]() |
a025237f7e | ||
![]() |
228db2fadb | ||
![]() |
0cd26cc79f | ||
![]() |
b808d5d1e8 | ||
![]() |
f843c054b7 | ||
![]() |
cf06a971e8 | ||
![]() |
bc8f3bdd4f | ||
![]() |
a6fcab67b0 | ||
![]() |
4069208316 | ||
![]() |
cfaa30b40f | ||
![]() |
97c5a82b7b | ||
![]() |
21bd391d62 | ||
![]() |
9d1476ef1d | ||
![]() |
151fcd05e6 | ||
![]() |
22400ddcfb | ||
![]() |
ae55530edc | ||
![]() |
112700a12c | ||
![]() |
cecffecf39 | ||
![]() |
bdac8697fe | ||
![]() |
3d9404b67d | ||
![]() |
7c50f55153 | ||
![]() |
368e4dc360 | ||
![]() |
964d8bb5f9 | ||
![]() |
846e8e46c5 | ||
![]() |
75c719bcde | ||
![]() |
fc8793bf15 | ||
![]() |
65935c40fd | ||
![]() |
a30d0b44cc | ||
![]() |
fded8462d2 | ||
![]() |
b1095ac763 | ||
![]() |
e54399a169 | ||
![]() |
4cc0db75be | ||
![]() |
74a9cbb2a0 | ||
![]() |
390e337a8e | ||
![]() |
ecdac77d5f | ||
![]() |
79158c2ee7 | ||
![]() |
96fdfbdbcf | ||
![]() |
361538da21 | ||
![]() |
6250d4134b | ||
![]() |
8589949521 | ||
![]() |
f12e262fa5 | ||
![]() |
f379070697 | ||
![]() |
d47fc0ff3b | ||
![]() |
f2b6f0ba86 | ||
![]() |
ddbe150be1 | ||
![]() |
6b5ed7c857 | ||
![]() |
391f7d8237 | ||
![]() |
141cf5ff10 | ||
![]() |
bfe148eb45 | ||
![]() |
6fb28f2198 | ||
![]() |
02cc53d34b | ||
![]() |
5928918da4 | ||
![]() |
2e9f84427c | ||
![]() |
df599031a0 | ||
![]() |
6311c93298 | ||
![]() |
b982cccbcd | ||
![]() |
33b8224714 | ||
![]() |
2f05f570b1 | ||
![]() |
d737657e1d | ||
![]() |
3d5294635e | ||
![]() |
75c3fc2346 | ||
![]() |
80bce159af | ||
![]() |
7ff9b84ee1 | ||
![]() |
b6acd3c114 | ||
![]() |
fa5d40caa3 | ||
![]() |
a9cbd4c6a6 | ||
![]() |
882cdaa46b | ||
![]() |
58e64cb28d | ||
![]() |
779e67653b | ||
![]() |
0381a772b7 | ||
![]() |
048b2c8033 | ||
![]() |
e354ab302c | ||
![]() |
5f931c6cf1 | ||
![]() |
576837351a | ||
![]() |
6084ccf877 | ||
![]() |
514da91629 | ||
![]() |
d2c8bb9878 | ||
![]() |
fe274e9b9c | ||
![]() |
6603a67a91 | ||
![]() |
b50de1c92e | ||
![]() |
dfd8dc82f6 | ||
![]() |
1a942d1062 | ||
![]() |
289a78eb99 | ||
![]() |
2897763020 | ||
![]() |
47886423e5 | ||
![]() |
0890821839 | ||
![]() |
2903389d3e | ||
![]() |
5bdea369e8 | ||
![]() |
3699e8e0c7 | ||
![]() |
55c0b30bc0 | ||
![]() |
6fd321529a | ||
![]() |
531877db4a | ||
![]() |
51df003d8e | ||
![]() |
7d05859d7e | ||
![]() |
2e48cd2ba1 | ||
![]() |
267b61f347 | ||
![]() |
7f53d5cc3c | ||
![]() |
af591ed9f7 | ||
![]() |
17492a3856 | ||
![]() |
e990ff9f2f | ||
![]() |
d832930c8d | ||
![]() |
8a0c66c7cf | ||
![]() |
292c2d7ce0 | ||
![]() |
16937af30f | ||
![]() |
d067d49afa | ||
![]() |
132a01a88f | ||
![]() |
4db5103ff1 | ||
![]() |
41943f67c5 | ||
![]() |
1f37623526 | ||
![]() |
7e92babad8 | ||
![]() |
97e45101d9 | ||
![]() |
62d5a3b649 | ||
![]() |
c96c585b39 | ||
![]() |
136063e5a7 | ||
![]() |
f59db1597d | ||
![]() |
c6c3f55c2c | ||
![]() |
8063d46a53 | ||
![]() |
fbc7737465 | ||
![]() |
23f3f3ad55 | ||
![]() |
0efc53a373 | ||
![]() |
0cfe027753 | ||
![]() |
df3b75cdb0 | ||
![]() |
24dd18bf0f | ||
![]() |
bbf27f4afd | ||
![]() |
d4ac97de3c | ||
![]() |
3039b1f43b | ||
![]() |
13597f89cd | ||
![]() |
870ae9aecc | ||
![]() |
c94b0709ec | ||
![]() |
5632e63bcb | ||
![]() |
ae7b1103f6 | ||
![]() |
2882178be7 | ||
![]() |
bfc59256ca | ||
![]() |
3abe695c3c | ||
![]() |
624dfdf0f8 | ||
![]() |
28bf22f279 | ||
![]() |
830a48f88c | ||
![]() |
a23543d763 | ||
![]() |
586a183d5c | ||
![]() |
7ae02a5887 | ||
![]() |
4020fd2e5f | ||
![]() |
af871d59ce | ||
![]() |
b8d36c8c14 | ||
![]() |
4b5721a3d7 | ||
![]() |
10235b8fdf | ||
![]() |
45332f577a | ||
![]() |
148fd7b462 | ||
![]() |
6f66313b51 | ||
![]() |
cf32af4816 | ||
![]() |
df3addacdb | ||
![]() |
a1428600b7 | ||
![]() |
4a4a3b1d61 | ||
![]() |
8c65f1b2c5 | ||
![]() |
55046f2261 | ||
![]() |
b6cedd7c1a | ||
![]() |
771d6736fb | ||
![]() |
455157e413 | ||
![]() |
c875582cfe | ||
![]() |
c3d896d5a8 | ||
![]() |
236069b068 | ||
![]() |
6de96c4fc6 | ||
![]() |
e45c2fcf6e | ||
![]() |
8c620c8c1a | ||
![]() |
c6d6dc4bdf | ||
![]() |
355fac5da1 | ||
![]() |
77d0c3dd06 | ||
![]() |
d95cb540f5 | ||
![]() |
98b757de23 | ||
![]() |
efb811d20c | ||
![]() |
a57e6b7054 | ||
![]() |
fe52bbb079 | ||
![]() |
76d6b541c3 | ||
![]() |
269a9ca864 | ||
![]() |
a5aafe3172 | ||
![]() |
d30bd89c42 | ||
![]() |
d76ce85625 | ||
![]() |
b2b247f417 | ||
![]() |
3ab2ec665b | ||
![]() |
2806f0e9a2 | ||
![]() |
8b426f6fb3 | ||
![]() |
19ee8b32df | ||
![]() |
a5389019fa | ||
![]() |
7f272fbe04 | ||
![]() |
89edf0ac04 | ||
![]() |
71fbec8871 | ||
![]() |
504b1e1a8a | ||
![]() |
cf9381e0ee | ||
![]() |
3907172131 | ||
![]() |
c34752ce92 | ||
![]() |
40cc23f12a | ||
![]() |
9b7fea99d4 | ||
![]() |
85949a6464 | ||
![]() |
d5291a6b98 | ||
![]() |
9e41d171c9 | ||
![]() |
da54e91dea | ||
![]() |
41b2ae2c7a | ||
![]() |
1815220abe | ||
![]() |
a080d8eef4 | ||
![]() |
8c4af42d56 | ||
![]() |
7f1d0952fc | ||
![]() |
222aa4ec1f | ||
![]() |
c03bfd4b89 | ||
![]() |
6fa8cdf117 | ||
![]() |
c4c777ffe6 | ||
![]() |
3680903ed4 | ||
![]() |
6fe61a11bb | ||
![]() |
437975652f | ||
![]() |
7ff75bec7b | ||
![]() |
ea03f20f46 | ||
![]() |
a5df515d79 | ||
![]() |
fabe8e8a66 | ||
![]() |
f01fcc4ec4 | ||
![]() |
05e99f4c7b | ||
![]() |
d8aff4e58f | ||
![]() |
e8d3d6ad89 | ||
![]() |
1317088e3c | ||
![]() |
fe81ee5969 |
35
CHANGES
@@ -1,15 +1,3 @@
|
||||
Version 1.2.0 (released ??-???-????)
|
||||
|
||||
* bumped minimum support Python version to 2.4
|
||||
* implemented support for property diffs (issue #383)
|
||||
* allow user-configurable cvsgraph display (issue #336)
|
||||
* allow rNNNN syntax for Subversion revision numbers (issue #441)
|
||||
|
||||
Version 1.1.20 (released 24-Apr-2013)
|
||||
|
||||
* fix tab-to-space handling regression in markup view
|
||||
* fix regression in root lookup handling (issue #526)
|
||||
|
||||
Version 1.1.19 (released 22-Apr-2013)
|
||||
|
||||
* improve root lookup performance (issue #523)
|
||||
@@ -116,7 +104,7 @@ Version 1.1.7 (released 09-Sep-2010)
|
||||
* display Subversion revision properties in the revision view (issue #453)
|
||||
* fix exception in 'standalone.py -r REPOS' when run without a config file
|
||||
* fix standalone.py server root deployments (--script-alias='')
|
||||
* add rudimentary Basic authentication support to standalone.py (issue #49)
|
||||
* add Basic authentication support to standalone.py (Unix only) (issue #49)
|
||||
* fix obscure "unexpected NULL parent pool" Subversion bindings error
|
||||
* enable path info / link display in remote Subversion root revision view
|
||||
* fix vhost name case handling inconsistency (issue #466)
|
||||
@@ -221,27 +209,6 @@ Version 1.1.0 (released 13-May-2009)
|
||||
* fix exception in rev-sorted remote Subversion directory views (issue #409)
|
||||
* allow setting of page sizes for log and dir views individually (issue #402)
|
||||
|
||||
Version 1.0.13 (released 24-Oct-2012)
|
||||
|
||||
* security fix: escape "extra" diff info to avoid XSS attack (issue #515)
|
||||
* security fix: remove user-reachable override of cvsdb row limit
|
||||
* fix obscure "unexpected NULL parent pool" Subversion bindings error
|
||||
* fix svndbadmin failure on deleted paths under Subversion 1.7 (issue #499)
|
||||
|
||||
Version 1.0.12 (released 02-Jun-2010)
|
||||
|
||||
* fix exception caused by trying to HTML-escape non-string data (issue #454)
|
||||
|
||||
Version 1.0.11 (released 29-Mar-2010)
|
||||
|
||||
* security fix: escape user-provided search_re input to avoid XSS attack
|
||||
|
||||
Version 1.0.10 (released 10-Mar-2010)
|
||||
|
||||
* security fix: escape user-provided query form input to avoid XSS attack
|
||||
* fix errors viewing remote Subversion paths with URI-unsafe characters
|
||||
* fix regexp input validation (issue #426, #427, #440)
|
||||
|
||||
Version 1.0.9 (released 11-Aug-2009)
|
||||
|
||||
* security fix: validate the 'view' parameter to avoid XSS attack
|
||||
|
57
INSTALL
@@ -17,13 +17,10 @@ Congratulations on getting this far. :-)
|
||||
|
||||
Required Software And Configuration Needed To Run ViewVC:
|
||||
|
||||
In General:
|
||||
|
||||
* Python 2, version 2.4 or later (sorry, no 3.x support yet)
|
||||
(http://www.python.org/)
|
||||
|
||||
For CVS Support:
|
||||
|
||||
* Python 1.5.2 or later (sorry, no 3.x support yet)
|
||||
(http://www.python.org/)
|
||||
* RCS, Revision Control System
|
||||
(http://www.cs.purdue.edu/homes/trinkle/RCS/)
|
||||
* GNU-diff to replace diff implementations without the -u option
|
||||
@@ -33,6 +30,8 @@ Congratulations on getting this far. :-)
|
||||
|
||||
For Subversion Support:
|
||||
|
||||
* Python 2.0 or later (sorry, no 3.x support yet)
|
||||
(http://www.python.org/)
|
||||
* Subversion, Version Control System, 1.3.1 or later
|
||||
(binary installation and Python bindings)
|
||||
(http://subversion.apache.org/)
|
||||
@@ -262,7 +261,7 @@ APACHE CONFIGURATION
|
||||
METHOD E: Using mod_wsgi (if installed)
|
||||
----------------------------------------
|
||||
Copy the Python scripts file from
|
||||
<VIEWVC_INSTALLATION_DIRECTORY>/bin/wsgi/
|
||||
<VIEWVC_INSTALLATION_DIRECTORY>/bin/mod_python/
|
||||
to the directory of your choosing. Modify httpd.conf with the
|
||||
following directives:
|
||||
|
||||
@@ -304,47 +303,7 @@ APACHE CONFIGURATION
|
||||
ScriptAlias /viewvc /usr/local/viewvc/bin/wsgi/viewvc.fcgi
|
||||
ScriptAlias /query /usr/local/viewvc/bin/wsgi/query.fcgi
|
||||
|
||||
4) [Optional] Provide direct access to icons, stylesheets, etc.
|
||||
|
||||
ViewVC's HTML templates reference various stylesheets and icons
|
||||
provided by ViewVC itself. By default, ViewVC generates URLs to
|
||||
those artifacts which point back into ViewVC (using a magic
|
||||
syntax); ViewVC in turn handles such magic URL requests by
|
||||
streaming back the contents of the requested icon or stylesheet
|
||||
file. While this simplifies the configuration and initial
|
||||
deployment of ViewVC, it's not the most efficient approach to
|
||||
deliver what is essentially static content.
|
||||
|
||||
To improve performance, consider carving out a URL space in your
|
||||
webserver's configuration solely for this static content and
|
||||
instruct ViewVC to use that space when generating URLs for that
|
||||
content. For example, you might add an Alias such as the following
|
||||
to your httpd.conf:
|
||||
|
||||
Alias /viewvc-docroot /usr/local/viewvc/templates/default/docroot
|
||||
|
||||
And then, in viewvc.conf, set the 'docroot' option to the same
|
||||
location:
|
||||
|
||||
docroot = /viewvc-docroot
|
||||
|
||||
WARNING: As always when using Alias directives, be careful that you
|
||||
have them in the correct order. For example, if you use an
|
||||
ordering such as the following, Apache will hand requests for your
|
||||
static documents off to ViewVC as if they were versioned resources:
|
||||
|
||||
ScriptAlias /viewvc /usr/local/viewvc/bin/wsgi/viewvc.fcgi
|
||||
Alias /viewvc/static /usr/local/viewvc/templates/default/docroot
|
||||
|
||||
The correct order would be:
|
||||
|
||||
Alias /viewvc/static /usr/local/viewvc/templates/default/docroot
|
||||
ScriptAlias /viewvc /usr/local/viewvc/bin/wsgi/viewvc.fcgi
|
||||
|
||||
(That said, it's best to avoid such namespace nesting altogether if
|
||||
you can.)
|
||||
|
||||
5) [Optional] Add access control.
|
||||
4) [Optional] Add access control.
|
||||
|
||||
In your httpd.conf you can control access to certain modules by
|
||||
adding directives like this:
|
||||
@@ -365,14 +324,14 @@ APACHE CONFIGURATION
|
||||
http://<server_name>/viewvc/~checkout~/<module_name>
|
||||
http://<server_name>/viewvc/<module_name>.tar.gz?view=tar
|
||||
|
||||
6) Restart Apache.
|
||||
5) Restart Apache.
|
||||
|
||||
The commands to do this vary. "httpd -k restart" and "apache -k
|
||||
restart" are two common variants. On RedHat Linux it is done using
|
||||
the command "/sbin/service httpd restart" and on SuSE Linux it is
|
||||
done with "rcapache restart". Other systems use "apachectl restart".
|
||||
|
||||
7) [Optional] Protect your ViewVC instance from server-whacking webcrawlers.
|
||||
6) Optional: Protect your ViewVC instance from server-whacking webcrawlers.
|
||||
|
||||
As ViewVC is a web-based application which each page containing various
|
||||
links to other pages and views, you can expect your server's performance
|
||||
|
@@ -34,7 +34,7 @@ CONF_PATHNAME = None
|
||||
|
||||
#########################################################################
|
||||
#
|
||||
# Adjust sys.path to include our library directory.
|
||||
# Adjust sys.path to include our library directory
|
||||
#
|
||||
|
||||
import sys
|
||||
@@ -47,20 +47,6 @@ else:
|
||||
"../../../lib")))
|
||||
|
||||
#########################################################################
|
||||
#
|
||||
# If admins want nicer processes, here's the place to get them.
|
||||
#
|
||||
|
||||
#try:
|
||||
# os.nice(20) # bump the nice level of this process
|
||||
#except:
|
||||
# pass
|
||||
|
||||
|
||||
#########################################################################
|
||||
#
|
||||
# Go do the work.
|
||||
#
|
||||
|
||||
import sapi
|
||||
import viewvc
|
||||
|
@@ -34,7 +34,7 @@ CONF_PATHNAME = None
|
||||
|
||||
#########################################################################
|
||||
#
|
||||
# Adjust sys.path to include our library directory.
|
||||
# Adjust sys.path to include our library directory
|
||||
#
|
||||
|
||||
import sys
|
||||
@@ -47,21 +47,12 @@ else:
|
||||
"../../../lib")))
|
||||
|
||||
#########################################################################
|
||||
#
|
||||
# If admins want nicer processes, here's the place to get them.
|
||||
#
|
||||
|
||||
#try:
|
||||
# os.nice(20) # bump the nice level of this process
|
||||
#except:
|
||||
# pass
|
||||
|
||||
### add code for checking the load average
|
||||
|
||||
#########################################################################
|
||||
#
|
||||
# Go do the work.
|
||||
#
|
||||
|
||||
# go do the work
|
||||
import sapi
|
||||
import viewvc
|
||||
|
||||
|
@@ -40,6 +40,7 @@ else:
|
||||
#########################################################################
|
||||
|
||||
import os
|
||||
import string
|
||||
import cvsdb
|
||||
import viewvc
|
||||
import vclib.ccvs
|
||||
@@ -55,7 +56,7 @@ def UpdateFile(db, repository, path, update, quiet_level):
|
||||
print '[ERROR] %s' % (e)
|
||||
return
|
||||
|
||||
file = '/'.join(path)
|
||||
file = string.join(path, "/")
|
||||
printing = 0
|
||||
if update:
|
||||
if quiet_level < 1 or (quiet_level < 2 and len(commit_list)):
|
||||
|
@@ -39,6 +39,7 @@ else:
|
||||
#########################################################################
|
||||
|
||||
import os
|
||||
import string
|
||||
import getopt
|
||||
import re
|
||||
import cvsdb
|
||||
@@ -151,11 +152,11 @@ def FindLongestDirectory(s, repository):
|
||||
and a file name, either of which may contain spaces. Returns the longest
|
||||
possible directory name that actually exists"""
|
||||
|
||||
parts = s.split()
|
||||
parts = string.split(s, " ")
|
||||
|
||||
for i in range(len(parts)-1, 0, -1):
|
||||
directory = ' '.join(parts[:i])
|
||||
filename = ' '.join(parts[i:])
|
||||
directory = string.join(parts[:i])
|
||||
filename = string.join(parts[i:])
|
||||
if os.path.isdir(os.path.join(repository, directory)):
|
||||
return directory, filename
|
||||
|
||||
@@ -226,7 +227,7 @@ def ProcessLoginfo(rootpath, directory, files):
|
||||
cfg.utilities, 0)
|
||||
|
||||
# split up the directory components
|
||||
dirpath = filter(None, os.path.normpath(directory).split(os.sep))
|
||||
dirpath = filter(None, string.split(os.path.normpath(directory), os.sep))
|
||||
|
||||
## build a list of Commit objects
|
||||
commit_list = []
|
||||
@@ -278,7 +279,7 @@ if __name__ == '__main__':
|
||||
else:
|
||||
# if there are no arguments, read version information from
|
||||
# first line of input like old versions of ViewCVS did
|
||||
arg = sys.stdin.readline().rstrip()
|
||||
arg = string.rstrip(sys.stdin.readline())
|
||||
|
||||
if len(sys.argv) > 2:
|
||||
# if there is a second argument it indicates which parser
|
||||
|
@@ -16,8 +16,7 @@
|
||||
#
|
||||
# -----------------------------------------------------------------------
|
||||
|
||||
import os
|
||||
import sys
|
||||
import os, sys, string
|
||||
import popen2
|
||||
import getopt
|
||||
|
||||
@@ -322,7 +321,7 @@ if __name__ == "__main__":
|
||||
dbname = raw_input("ViewVC Database Name [default: ViewVC]: ") or "ViewVC"
|
||||
|
||||
# Create the database.
|
||||
dscript = DATABASE_SCRIPT_COMMON.replace("<dbname>", dbname)
|
||||
dscript = string.replace(DATABASE_SCRIPT_COMMON, "<dbname>", dbname)
|
||||
if version == "1.0":
|
||||
print BONSAI_COMPAT
|
||||
dscript = dscript + DATABASE_SCRIPT_VERSION_0
|
||||
|
@@ -10,13 +10,19 @@
|
||||
# For more information, visit http://viewvc.org/
|
||||
#
|
||||
# -----------------------------------------------------------------------
|
||||
#
|
||||
# This program originally written by Peter Funk <pf@artcom-gmbh.de>, with
|
||||
# contributions by Ka-Ping Yee.
|
||||
#
|
||||
# -----------------------------------------------------------------------
|
||||
|
||||
#
|
||||
"""Run "standalone.py -p <port>" to start an HTTP server on a given port
|
||||
on the local machine to generate ViewVC web pages.
|
||||
"""
|
||||
|
||||
__author__ = "Peter Funk <pf@artcom-gmbh.de>"
|
||||
__date__ = "11 November 2001"
|
||||
__version__ = "$Revision$"
|
||||
__credits__ = """Guido van Rossum, for an excellent programming language.
|
||||
Greg Stein, for writing ViewCVS in the first place.
|
||||
Ka-Ping Yee, for the GUI code and the framework stolen from pydoc.py.
|
||||
"""
|
||||
|
||||
# INSTALL-TIME CONFIGURATION
|
||||
#
|
||||
# These values will be set during the installation process. During
|
||||
@@ -45,6 +51,7 @@ else:
|
||||
|
||||
import sapi
|
||||
import viewvc
|
||||
import compat; compat.for_standalone()
|
||||
|
||||
|
||||
# The 'crypt' module is only available on Unix platforms. We'll try
|
||||
@@ -91,7 +98,7 @@ class StandaloneServer(sapi.CgiServer):
|
||||
statusCode = 200
|
||||
statusText = 'OK'
|
||||
else:
|
||||
p = status.find(' ')
|
||||
p = string.find(status, ' ')
|
||||
if p < 0:
|
||||
statusCode = int(status)
|
||||
statusText = ''
|
||||
@@ -190,7 +197,7 @@ class ViewVCHTTPRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
|
||||
try:
|
||||
lines = open(htpasswd_file, 'r').readlines()
|
||||
for line in lines:
|
||||
file_user, file_pass = line.rstrip().split(':', 1)
|
||||
file_user, file_pass = string.split(line.rstrip(), ':', 1)
|
||||
if username == file_user:
|
||||
return _check_passwd(password, file_pass)
|
||||
except:
|
||||
@@ -214,10 +221,10 @@ class ViewVCHTTPRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
|
||||
if not authn:
|
||||
raise AuthenticationException()
|
||||
try:
|
||||
kind, data = authn.split(' ', 1)
|
||||
kind, data = string.split(authn, ' ', 1)
|
||||
if kind == 'Basic':
|
||||
data = base64.b64decode(data)
|
||||
username, password = data.split(':', 1)
|
||||
username, password = string.split(data, ':', 1)
|
||||
except:
|
||||
raise AuthenticationException()
|
||||
if not self.validate_password(options.htpasswd_file, username, password):
|
||||
@@ -231,7 +238,7 @@ class ViewVCHTTPRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
|
||||
|
||||
viewvc_url = self.server.url[:-1] + scriptname
|
||||
rest = self.path[len(scriptname):]
|
||||
i = rest.rfind('?')
|
||||
i = string.rfind(rest, '?')
|
||||
if i >= 0:
|
||||
rest, query = rest[:i], rest[i+1:]
|
||||
else:
|
||||
@@ -276,10 +283,10 @@ class ViewVCHTTPRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
|
||||
accept = []
|
||||
for line in self.headers.getallmatchingheaders('accept'):
|
||||
if line[:1] in string.whitespace:
|
||||
accept.append(line.strip())
|
||||
accept.append(string.strip(line))
|
||||
else:
|
||||
accept = accept + line[7:].split(',')
|
||||
env['HTTP_ACCEPT'] = ','.join(accept)
|
||||
accept = accept + string.split(line[7:], ',')
|
||||
env['HTTP_ACCEPT'] = string.joinfields(accept, ',')
|
||||
ua = self.headers.getheader('user-agent')
|
||||
if ua:
|
||||
env['HTTP_USER_AGENT'] = ua
|
||||
@@ -332,7 +339,6 @@ class ViewVCHTTPRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
|
||||
else:
|
||||
self.log_error("ViewVC exited ok")
|
||||
|
||||
|
||||
class ViewVCHTTPServer(BaseHTTPServer.HTTPServer):
|
||||
"""Customized HTTP server for ViewVC."""
|
||||
|
||||
@@ -360,7 +366,6 @@ class ViewVCHTTPServer(BaseHTTPServer.HTTPServer):
|
||||
self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
|
||||
BaseHTTPServer.HTTPServer.server_bind(self)
|
||||
|
||||
|
||||
def serve(host, port, callback=None):
|
||||
"""Start an HTTP server for HOST on PORT. Call CALLBACK function
|
||||
when the server is ready to serve."""
|
||||
@@ -401,7 +406,7 @@ def serve(host, port, callback=None):
|
||||
line = fp.readline()
|
||||
if not line:
|
||||
break
|
||||
if line.find("Concurrent Versions System (CVSNT)") >= 0:
|
||||
if string.find(line, "Concurrent Versions System (CVSNT)") >= 0:
|
||||
cvsnt_works = 1
|
||||
while fp.read(4096):
|
||||
pass
|
||||
@@ -418,11 +423,288 @@ def serve(host, port, callback=None):
|
||||
pass
|
||||
print 'server stopped'
|
||||
|
||||
|
||||
def handle_config(config_file):
|
||||
global cfg
|
||||
cfg = viewvc.load_config(config_file or CONF_PATHNAME)
|
||||
|
||||
# --- graphical interface: --------------------------------------------------
|
||||
|
||||
def nogui(missing_module):
|
||||
sys.stderr.write("""\
|
||||
Sorry! Your Python was compiled without the %s module enabled.
|
||||
I'm unable to run the GUI part. Please omit the '-g' and '--gui' options,
|
||||
or install another Python interpreter.
|
||||
""" % (missing_module))
|
||||
raise SystemExit, 1
|
||||
|
||||
def gui(host, port):
|
||||
"""Graphical interface (starts web server and pops up a control window)."""
|
||||
class GUI:
|
||||
def __init__(self, window, host, port):
|
||||
self.window = window
|
||||
self.server = None
|
||||
self.scanner = None
|
||||
|
||||
try:
|
||||
import Tkinter
|
||||
except ImportError:
|
||||
nogui("Tkinter")
|
||||
|
||||
self.server_frm = Tkinter.Frame(window)
|
||||
self.title_lbl = Tkinter.Label(self.server_frm,
|
||||
text='Starting server...\n ')
|
||||
self.open_btn = Tkinter.Button(self.server_frm,
|
||||
text='open browser',
|
||||
command=self.open,
|
||||
state='disabled')
|
||||
self.quit_btn = Tkinter.Button(self.server_frm,
|
||||
text='quit serving',
|
||||
command=self.quit,
|
||||
state='disabled')
|
||||
|
||||
self.window.title('ViewVC standalone')
|
||||
self.window.protocol('WM_DELETE_WINDOW', self.quit)
|
||||
self.title_lbl.pack(side='top', fill='x')
|
||||
self.open_btn.pack(side='left', fill='x', expand=1)
|
||||
self.quit_btn.pack(side='right', fill='x', expand=1)
|
||||
|
||||
# Early loading of configuration here. Used to
|
||||
# allow tinkering with configuration settings through the gui:
|
||||
handle_config(options.config_file)
|
||||
if not LIBRARY_DIR:
|
||||
cfg.options.cvsgraph_conf = "../cgi/cvsgraph.conf.dist"
|
||||
|
||||
self.options_frm = Tkinter.Frame(window)
|
||||
|
||||
# cvsgraph toggle:
|
||||
self.cvsgraph_ivar = Tkinter.IntVar()
|
||||
self.cvsgraph_ivar.set(cfg.options.use_cvsgraph)
|
||||
self.cvsgraph_toggle = \
|
||||
Tkinter.Checkbutton(self.options_frm,
|
||||
text="enable cvsgraph (needs binary)",
|
||||
var=self.cvsgraph_ivar,
|
||||
command=self.toggle_use_cvsgraph)
|
||||
self.cvsgraph_toggle.pack(side='top', anchor='w')
|
||||
|
||||
# show_subdir_lastmod toggle:
|
||||
self.subdirmod_ivar = Tkinter.IntVar()
|
||||
self.subdirmod_ivar.set(cfg.options.show_subdir_lastmod)
|
||||
self.subdirmod_toggle = \
|
||||
Tkinter.Checkbutton(self.options_frm,
|
||||
text="show subdir last mod (dir view)",
|
||||
var=self.subdirmod_ivar,
|
||||
command=self.toggle_subdirmod)
|
||||
self.subdirmod_toggle.pack(side='top', anchor='w')
|
||||
|
||||
# use_re_search toggle:
|
||||
self.useresearch_ivar = Tkinter.IntVar()
|
||||
self.useresearch_ivar.set(cfg.options.use_re_search)
|
||||
self.useresearch_toggle = \
|
||||
Tkinter.Checkbutton(self.options_frm,
|
||||
text="allow regular expr search",
|
||||
var=self.useresearch_ivar,
|
||||
command=self.toggle_useresearch)
|
||||
self.useresearch_toggle.pack(side='top', anchor='w')
|
||||
|
||||
# use_localtime toggle:
|
||||
self.use_localtime_ivar = Tkinter.IntVar()
|
||||
self.use_localtime_ivar.set(cfg.options.use_localtime)
|
||||
self.use_localtime_toggle = \
|
||||
Tkinter.Checkbutton(self.options_frm,
|
||||
text="use localtime (instead of UTC)",
|
||||
var=self.use_localtime_ivar,
|
||||
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='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='number of items per dir page (0 disables):')
|
||||
self.dir_pagesize_lbl.pack(side='top', anchor='w')
|
||||
self.dir_pagesize_ivar = Tkinter.IntVar()
|
||||
self.dir_pagesize_ivar.set(cfg.options.dir_pagesize)
|
||||
self.dir_pagesize_entry = \
|
||||
Tkinter.Entry(self.options_frm,
|
||||
width=10,
|
||||
textvariable=self.dir_pagesize_ivar)
|
||||
self.dir_pagesize_entry.bind('<Return>', self.set_dir_pagesize)
|
||||
self.dir_pagesize_entry.pack(side='top', anchor='w')
|
||||
|
||||
# directory view template:
|
||||
self.dirtemplate_lbl = \
|
||||
Tkinter.Label(self.options_frm,
|
||||
text='Choose HTML Template for the Directory pages:')
|
||||
self.dirtemplate_lbl.pack(side='top', anchor='w')
|
||||
self.dirtemplate_svar = Tkinter.StringVar()
|
||||
self.dirtemplate_svar.set(cfg.templates.directory)
|
||||
self.dirtemplate_entry = \
|
||||
Tkinter.Entry(self.options_frm,
|
||||
width=40,
|
||||
textvariable=self.dirtemplate_svar)
|
||||
self.dirtemplate_entry.bind('<Return>', self.set_templates_directory)
|
||||
self.dirtemplate_entry.pack(side='top', anchor='w')
|
||||
self.templates_dir = \
|
||||
Tkinter.Radiobutton(self.options_frm,
|
||||
text="directory.ezt",
|
||||
value="templates/directory.ezt",
|
||||
var=self.dirtemplate_svar,
|
||||
command=self.set_templates_directory)
|
||||
self.templates_dir.pack(side='top', anchor='w')
|
||||
self.templates_dir_alt = \
|
||||
Tkinter.Radiobutton(self.options_frm,
|
||||
text="dir_alternate.ezt",
|
||||
value="templates/dir_alternate.ezt",
|
||||
var=self.dirtemplate_svar,
|
||||
command=self.set_templates_directory)
|
||||
self.templates_dir_alt.pack(side='top', anchor='w')
|
||||
|
||||
# log view template:
|
||||
self.logtemplate_lbl = \
|
||||
Tkinter.Label(self.options_frm,
|
||||
text='Choose HTML Template for the Log pages:')
|
||||
self.logtemplate_lbl.pack(side='top', anchor='w')
|
||||
self.logtemplate_svar = Tkinter.StringVar()
|
||||
self.logtemplate_svar.set(cfg.templates.log)
|
||||
self.logtemplate_entry = \
|
||||
Tkinter.Entry(self.options_frm,
|
||||
width=40,
|
||||
textvariable=self.logtemplate_svar)
|
||||
self.logtemplate_entry.bind('<Return>', self.set_templates_log)
|
||||
self.logtemplate_entry.pack(side='top', anchor='w')
|
||||
self.templates_log = \
|
||||
Tkinter.Radiobutton(self.options_frm,
|
||||
text="log.ezt",
|
||||
value="templates/log.ezt",
|
||||
var=self.logtemplate_svar,
|
||||
command=self.set_templates_log)
|
||||
self.templates_log.pack(side='top', anchor='w')
|
||||
self.templates_log_table = \
|
||||
Tkinter.Radiobutton(self.options_frm,
|
||||
text="log_table.ezt",
|
||||
value="templates/log_table.ezt",
|
||||
var=self.logtemplate_svar,
|
||||
command=self.set_templates_log)
|
||||
self.templates_log_table.pack(side='top', anchor='w')
|
||||
|
||||
# query view template:
|
||||
self.querytemplate_lbl = \
|
||||
Tkinter.Label(self.options_frm,
|
||||
text='Template for the database query page:')
|
||||
self.querytemplate_lbl.pack(side='top', anchor='w')
|
||||
self.querytemplate_svar = Tkinter.StringVar()
|
||||
self.querytemplate_svar.set(cfg.templates.query)
|
||||
self.querytemplate_entry = \
|
||||
Tkinter.Entry(self.options_frm,
|
||||
width=40,
|
||||
textvariable=self.querytemplate_svar)
|
||||
self.querytemplate_entry.bind('<Return>', self.set_templates_query)
|
||||
self.querytemplate_entry.pack(side='top', anchor='w')
|
||||
self.templates_query = \
|
||||
Tkinter.Radiobutton(self.options_frm,
|
||||
text="query.ezt",
|
||||
value="templates/query.ezt",
|
||||
var=self.querytemplate_svar,
|
||||
command=self.set_templates_query)
|
||||
self.templates_query.pack(side='top', anchor='w')
|
||||
|
||||
# pack and set window manager hints:
|
||||
self.server_frm.pack(side='top', fill='x')
|
||||
self.options_frm.pack(side='top', fill='x')
|
||||
|
||||
self.window.update()
|
||||
self.minwidth = self.window.winfo_width()
|
||||
self.minheight = self.window.winfo_height()
|
||||
self.expanded = 0
|
||||
self.window.wm_geometry('%dx%d' % (self.minwidth, self.minheight))
|
||||
self.window.wm_minsize(self.minwidth, self.minheight)
|
||||
|
||||
try:
|
||||
import threading
|
||||
except ImportError:
|
||||
nogui("thread")
|
||||
threading.Thread(target=serve, args=(host, port, self.ready)).start()
|
||||
|
||||
def toggle_use_cvsgraph(self, event=None):
|
||||
cfg.options.use_cvsgraph = self.cvsgraph_ivar.get()
|
||||
|
||||
def toggle_use_localtime(self, event=None):
|
||||
cfg.options.use_localtime = self.use_localtime_ivar.get()
|
||||
|
||||
def toggle_subdirmod(self, event=None):
|
||||
cfg.options.show_subdir_lastmod = self.subdirmod_ivar.get()
|
||||
|
||||
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_templates_log(self, event=None):
|
||||
cfg.templates.log = self.logtemplate_svar.get()
|
||||
|
||||
def set_templates_directory(self, event=None):
|
||||
cfg.templates.directory = self.dirtemplate_svar.get()
|
||||
|
||||
def set_templates_query(self, event=None):
|
||||
cfg.templates.query = self.querytemplate_svar.get()
|
||||
|
||||
def ready(self, server):
|
||||
"""used as callback parameter to the serve() function"""
|
||||
self.server = server
|
||||
self.title_lbl.config(text='ViewVC standalone server at\n' + server.url)
|
||||
self.open_btn.config(state='normal')
|
||||
self.quit_btn.config(state='normal')
|
||||
|
||||
def open(self, event=None, url=None):
|
||||
"""opens a browser window on the local machine"""
|
||||
url = url or self.server.url
|
||||
try:
|
||||
import webbrowser
|
||||
webbrowser.open(url)
|
||||
except ImportError: # pre-webbrowser.py compatibility
|
||||
if sys.platform == 'win32':
|
||||
os.system('start "%s"' % url)
|
||||
elif sys.platform == 'mac':
|
||||
try:
|
||||
import ic
|
||||
ic.launchurl(url)
|
||||
except ImportError: pass
|
||||
else:
|
||||
rc = os.system('netscape -remote "openURL(%s)" &' % url)
|
||||
if rc:
|
||||
os.system('netscape "%s" &' % url)
|
||||
|
||||
def quit(self, event=None):
|
||||
if self.server:
|
||||
self.server.quit = 1
|
||||
self.window.quit()
|
||||
|
||||
import Tkinter
|
||||
try:
|
||||
gui = GUI(Tkinter.Tk(), host, port)
|
||||
Tkinter.mainloop()
|
||||
except KeyboardInterrupt:
|
||||
pass
|
||||
|
||||
# --- command-line interface: ----------------------------------------------
|
||||
|
||||
|
||||
def usage():
|
||||
clean_options = Options()
|
||||
@@ -439,10 +721,13 @@ Options:
|
||||
--config-file=FILE (-c) Read configuration options from FILE. If not
|
||||
specified, ViewVC will look for a configuration
|
||||
file in its installation tree, falling back to
|
||||
built-in default values.
|
||||
built-in default values. (Not valid in GUI mode.)
|
||||
|
||||
--daemon (-d) Background the server process.
|
||||
|
||||
--gui (-g) Pop up a graphical configuration interface.
|
||||
Requires a valid X11 display connection.
|
||||
|
||||
--help Show this usage message and exit.
|
||||
|
||||
--host=HOSTNAME (-h) Listen on HOSTNAME. Required for access from a
|
||||
@@ -478,15 +763,17 @@ def main(argv):
|
||||
"""Command-line interface (looks at argv to decide what to do)."""
|
||||
import getopt
|
||||
|
||||
short_opts = ''.join(['c:',
|
||||
'd',
|
||||
'h:',
|
||||
'p:',
|
||||
'r:',
|
||||
's:',
|
||||
])
|
||||
short_opts = string.join(['c:',
|
||||
'd',
|
||||
'g',
|
||||
'h:',
|
||||
'p:',
|
||||
'r:',
|
||||
's:',
|
||||
], '')
|
||||
long_opts = ['daemon',
|
||||
'config-file=',
|
||||
'gui',
|
||||
'help',
|
||||
'host=',
|
||||
'htpasswd-file=',
|
||||
@@ -495,7 +782,8 @@ def main(argv):
|
||||
'script-alias=',
|
||||
]
|
||||
|
||||
opt_daemon = False
|
||||
opt_daemon = 0
|
||||
opt_gui = 0
|
||||
opt_host = None
|
||||
opt_port = None
|
||||
opt_htpasswd_file = None
|
||||
@@ -509,6 +797,8 @@ def main(argv):
|
||||
for opt, val in opts:
|
||||
if opt in ['--help']:
|
||||
usage()
|
||||
elif opt in ['-g', '--gui']:
|
||||
opt_gui = 1
|
||||
elif opt in ['-r', '--repository']: # may be used more than once
|
||||
opt_repositories.append(val)
|
||||
elif opt in ['-d', '--daemon']:
|
||||
@@ -556,7 +846,10 @@ def main(argv):
|
||||
if opt_host is not None:
|
||||
options.host = opt_host
|
||||
if opt_script_alias is not None:
|
||||
options.script_alias = '/'.join(filter(None, opt_script_alias.split('/')))
|
||||
options.script_alias = string.join(filter(None,
|
||||
string.split(opt_script_alias,
|
||||
'/')),
|
||||
'/')
|
||||
for repository in opt_repositories:
|
||||
if not options.repositories.has_key('Development'):
|
||||
rootname = 'Development'
|
||||
@@ -573,9 +866,12 @@ def main(argv):
|
||||
sys.exit()
|
||||
|
||||
# Finaly, start the server.
|
||||
def ready(server):
|
||||
print 'server ready at %s%s' % (server.url, options.script_alias)
|
||||
serve(options.host, options.port, ready)
|
||||
if opt_gui:
|
||||
gui(options.host, options.port)
|
||||
else:
|
||||
def ready(server):
|
||||
print 'server ready at %s%s' % (server.url, options.script_alias)
|
||||
serve(options.host, options.port, ready)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
@@ -57,6 +57,7 @@ else:
|
||||
#########################################################################
|
||||
|
||||
import os
|
||||
import string
|
||||
import re
|
||||
|
||||
import svn.core
|
||||
@@ -343,7 +344,7 @@ if __name__ == '__main__':
|
||||
if len(args) < 3:
|
||||
usage()
|
||||
|
||||
command = args[1].lower()
|
||||
command = string.lower(args[1])
|
||||
if command not in ('rebuild', 'update', 'purge'):
|
||||
sys.stderr.write('ERROR: unknown command %s\n' % command)
|
||||
usage()
|
||||
|
@@ -301,6 +301,14 @@
|
||||
##
|
||||
#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.
|
||||
##
|
||||
@@ -621,12 +629,7 @@
|
||||
## SEE ALSO: the [templates] configuration section, where you can
|
||||
## override templates on a per-view basis.
|
||||
##
|
||||
## Example:
|
||||
## template_dir = templates/classic
|
||||
## template_dir = templates/default
|
||||
## template_dir = templates-contrib/custom/templates
|
||||
#
|
||||
#template_dir = templates/default
|
||||
#template_dir = templates
|
||||
|
||||
## docroot: Web path to a directory that contains ViewVC static files
|
||||
## (stylesheets, images, etc.) If set, static files will get
|
||||
@@ -725,28 +728,6 @@
|
||||
##
|
||||
#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
|
||||
|
@@ -1,213 +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> <!-- h2 -->
|
||||
|
||||
<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> <!-- h2 -->
|
||||
|
||||
<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.
|
||||
<strong>UPDATE: This was fixed in ViewVC 1.1.3.</strong></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. <strong>UPDATE: This was fixed in ViewVC
|
||||
1.1.15.</strong></p>
|
||||
|
||||
</div> <!-- h3 -->
|
||||
|
||||
<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> <!-- h3 -->
|
||||
|
||||
<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> <!-- h3 -->
|
||||
|
||||
<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> <!-- h3 -->
|
||||
|
||||
<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> <!-- h3 -->
|
||||
|
||||
<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> <!-- h3 -->
|
||||
|
||||
<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> <!-- h3 -->
|
||||
|
||||
<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> <!-- h3 -->
|
||||
|
||||
<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> <!-- h3 -->
|
||||
|
||||
</div> <!-- h2 -->
|
||||
|
||||
</body>
|
||||
</html>
|
@@ -1,49 +0,0 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
|
||||
<html>
|
||||
<head>
|
||||
<title>ViewVC: 1.2.0 Release Notes</title>
|
||||
<style>
|
||||
.h2, .h3 {
|
||||
padding: 0.25em 0em;
|
||||
background: white;
|
||||
}
|
||||
.warning {
|
||||
font-style: italic;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<h1>ViewVC 1.2.0 Release Notes</h1>
|
||||
|
||||
<div class="h2">
|
||||
<h2 id="introduction">Introduction</h2>
|
||||
|
||||
<p>ViewVC 1.2.0 is the superset of all previous ViewVC releases.</p>
|
||||
|
||||
</div> <!-- h2 -->
|
||||
|
||||
<div class="h2">
|
||||
<h2 id="compatibility">Compatibility</h2>
|
||||
|
||||
<p>Each ViewVC release strives to maintain URL stability with previous
|
||||
releases, and 1.2.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>
|
||||
|
||||
</div> <!-- h2 -->
|
||||
|
||||
<div class="h2">
|
||||
<h2 id="compatibility">Features and Fixes</h2>
|
||||
|
||||
<div class="h3">
|
||||
<h3 id=""></h3>
|
||||
|
||||
</div> <!-- h3 -->
|
||||
|
||||
</div> <!-- h2 -->
|
||||
|
||||
</body>
|
||||
</html>
|
@@ -1,6 +1,6 @@
|
||||
<html>
|
||||
<head>
|
||||
<title>ViewVC 1.2 Template Authoring Guide</title>
|
||||
<title>ViewVC 1.1 Template Authoring Guide</title>
|
||||
<style>
|
||||
body {
|
||||
background-color: rgb(180,193,205);
|
||||
@@ -29,20 +29,16 @@ td {
|
||||
.varlevel1 { background: rgb(65%,85%,65%); }
|
||||
.varlevel2 { background: rgb(70%,90%,70%); }
|
||||
.varlevel3 { background: rgb(75%,95%,75%); }
|
||||
.varlevel4 { background: rgb(80%,100%,80%); }
|
||||
.varlevel5 { background: rgb(85%,100%,85%); }
|
||||
.varname { font-family: monospace; }
|
||||
.varlevel1 .varname { padding-left: 0; }
|
||||
.varlevel2 .varname { padding-left: 2em; }
|
||||
.varlevel3 .varname { padding-left: 4em; }
|
||||
.varlevel4 .varname { padding-left: 6em; }
|
||||
.varlevel5 .varname { padding-left: 8em; }
|
||||
.toc-list { font-size: 90%; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<h1>ViewVC 1.2 Template Authoring Guide</h1>
|
||||
<h1>ViewVC 1.1 Template Authoring Guide</h1>
|
||||
|
||||
<div class="h2">
|
||||
<h2 id="introduction">Introduction</h2>
|
||||
@@ -602,45 +598,6 @@ td {
|
||||
<td colspan="3">Includes all variables from the
|
||||
<a href="#variables-common">COMMON</a> variable set</td>
|
||||
</tr>
|
||||
<tr class="varlevel1">
|
||||
<td class="varname">gbbox</td>
|
||||
<td>Boolean</td>
|
||||
<td>Toggle generation of a branch box at the tip of all branches in
|
||||
the revision graph.</td>
|
||||
</tr>
|
||||
<tr class="varlevel1">
|
||||
<td class="varname">gflip</td>
|
||||
<td>Boolean</td>
|
||||
<td>Toggle the direction of the revision graph.</td>
|
||||
</tr>
|
||||
<tr class="varlevel1">
|
||||
<td class="varname">gleft</td>
|
||||
<td>Boolean</td>
|
||||
<td>Toggle the orientation of the revision graph.</td>
|
||||
</tr>
|
||||
<tr class="varlevel1">
|
||||
<td class="varname">gmaxtag</td>
|
||||
<td>String</td>
|
||||
<td>Number of tags per revision to display in the revision graph.</td>
|
||||
</tr>
|
||||
<tr class="varlevel1">
|
||||
<td class="varname">graph_action</td>
|
||||
<td>String</td>
|
||||
<td>Form action URL for the graph customization form.</td>
|
||||
</tr>
|
||||
<tr class="varlevel1">
|
||||
<td class="varname">graph_hidden_values</td>
|
||||
<td>String</td>
|
||||
<td>Hidden value name/value pairs for the graph customization form.</td>
|
||||
</tr>
|
||||
<tr class="varlevel1">
|
||||
<td class="varname">gshow</td>
|
||||
<td>String</td>
|
||||
<td>Classes of revisions to show in the revision graph. Valid values
|
||||
are <tt>all</tt> (all revision), <tt>inittagged</tt> (initial
|
||||
revision(s) and tagged revisions), and <tt>tagged</tt> (tagged
|
||||
revisions only).</td>
|
||||
</tr>
|
||||
<tr class="varlevel1">
|
||||
<td class="varname">imagemap</td>
|
||||
<td>String</td>
|
||||
@@ -653,37 +610,6 @@ td {
|
||||
<td>URL of the ViewVC revision graph image for the current
|
||||
resource.</td>
|
||||
</tr>
|
||||
<tr class="varlevel1">
|
||||
<td class="varname">opt_gbbox</td>
|
||||
<td>Boolean</td>
|
||||
<td>Specifies whether the user is allowed to toggle the generation
|
||||
of branch boxes at the tip of all branches in the revision
|
||||
graph.</td>
|
||||
</tr>
|
||||
<tr class="varlevel1">
|
||||
<td class="varname">opt_gflip</td>
|
||||
<td>Boolean</td>
|
||||
<td>Specifies whether the user is allowed to toggle the direction
|
||||
of the revision graph.</td>
|
||||
</tr>
|
||||
<tr class="varlevel1">
|
||||
<td class="varname">opt_gleft</td>
|
||||
<td>Boolean</td>
|
||||
<td>Specifies whether the user is allowed to toggle the orientation
|
||||
of the revision graph.</td>
|
||||
</tr>
|
||||
<tr class="varlevel1">
|
||||
<td class="varname">opt_gmaxtag</td>
|
||||
<td>Boolean</td>
|
||||
<td>Specifies whether the user is allowed to configure the maximum
|
||||
number of tags per revision show in the revision graph.</td>
|
||||
</tr>
|
||||
<tr class="varlevel1">
|
||||
<td class="varname">opt_gshow</td>
|
||||
<td>Boolean</td>
|
||||
<td>Specifies whether the user is allowed to configure which
|
||||
classes of revisions are shown in the revision graph.</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
@@ -704,64 +630,30 @@ td {
|
||||
<a href="#variables-common">COMMON</a> variable set</td>
|
||||
</tr>
|
||||
<tr class="varlevel1">
|
||||
<td class="varname">diffs</td>
|
||||
<td class="varname">changes</td>
|
||||
<td>List</td>
|
||||
<td>List of all blocks of differences between the two sides, including content
|
||||
and property differences.</td>
|
||||
<td>Set of objects which contain information about a single line of
|
||||
file difference data. Valid only when <var>diff_format</var> is
|
||||
<tt>h</tt> or <tt>l</tt>.</td>
|
||||
</tr>
|
||||
<tr class="varlevel2">
|
||||
<td class="varname">diffs.diff_block_format</td>
|
||||
<td>String</td>
|
||||
<td>Indicates the type of this block. One of the <tt>anchor</tt> (no display,
|
||||
create an anchor), <tt>raw</tt> (non-colored diff, display as produced),
|
||||
<tt>sidebyside-1</tt> (traditional side-by-side diff),
|
||||
<tt>sidebyside-2</tt> (newer side-by-side diff with intraline changes),
|
||||
<tt>unified</tt> (colored unified diff).</td>
|
||||
</tr>
|
||||
<tr class="varlevel2">
|
||||
<td class="varname">diffs.anchor</td>
|
||||
<td>String</td>
|
||||
<td>If <var>diffs.diff_block_format</var> is <tt>anchor</tt>, this variable specifies
|
||||
the anchor name.</td>
|
||||
</tr>
|
||||
<tr class="varlevel2">
|
||||
<td class="varname">diffs.changes</td>
|
||||
<td>List/Container</td>
|
||||
<td>Set of objects which contain information about a change in a single
|
||||
object (file or property). Not present if <var>diffs.diff_block_format</var> is
|
||||
<tt>anchor</tt>, otherwise has different format depending on
|
||||
<var>diffs.diff_block_format</var> (applicable as indicated in brackets below).</td>
|
||||
</tr>
|
||||
<tr class="varlevel3">
|
||||
<td class="varname">diffs.changes.raw</td>
|
||||
<td>String</td>
|
||||
<td>[raw] Diff text. Valid only if <var>diffs.changes.type</var> is
|
||||
<tt>raw</tt>.</td>
|
||||
</tr>
|
||||
<tr class="varlevel3">
|
||||
<td class="varname">diffs.changes.type</td>
|
||||
<td>String</td>
|
||||
<td>[raw] The type of change. Values: <tt>binary-diff</tt>,
|
||||
<tt>error</tt>, <tt>no-changes</tt>, <tt>raw</tt>.</td>
|
||||
</tr>
|
||||
<tr class="varlevel3">
|
||||
<td class="varname">diffs.changes.have_left</td>
|
||||
<td class="varname">changes.have_left</td>
|
||||
<td>Boolean</td>
|
||||
<td>[sidebyside-1] Specifies whether the left file has a line of content relevant
|
||||
<td>Specifies whether the left file has a line of content relevant
|
||||
to the difference data line. Valid only when
|
||||
<var>changes.type</var> is <tt>change</tt>.</td>
|
||||
</tr>
|
||||
<tr class="varlevel3">
|
||||
<td class="varname">diffs.changes.have_right</td>
|
||||
<tr class="varlevel2">
|
||||
<td class="varname">changes.have_right</td>
|
||||
<td>Boolean</td>
|
||||
<td>[sidebyside-1] Specifies whether the right file has a line of content relevant
|
||||
<td>Specifies whether the right file has a line of content relevant
|
||||
to the difference data line. Valid only when
|
||||
<var>changes.type</var> is <tt>change</tt>.</td>
|
||||
</tr>
|
||||
<tr class="varlevel3">
|
||||
<td class="varname">diffs.changes.left</td>
|
||||
<tr class="varlevel2">
|
||||
<td class="varname">changes.left</td>
|
||||
<td>String</td>
|
||||
<td>[sidebyside-1] Textual contents of the relevant line in the left file. Valid
|
||||
<td>Textual contents of the relevant line in the left file. Valid
|
||||
only when <var>changes.type</var> is <tt>change</tt>,
|
||||
<tt>context</tt>, or <tt>remove</tt>. When
|
||||
<var>changes.type</var> is <tt>change</tt>, valid only when
|
||||
@@ -769,10 +661,10 @@ td {
|
||||
between missing lines and empty lines, which EZT does not
|
||||
support).</td>
|
||||
</tr>
|
||||
<tr class="varlevel3">
|
||||
<td class="varname">diffs.changes.right</td>
|
||||
<tr class="varlevel2">
|
||||
<td class="varname">changes.right</td>
|
||||
<td>String</td>
|
||||
<td>[sidebyside-1] Textual contents of the relevant line in the right file. Valid
|
||||
<td>Textual contents of the relevant line in the right file. Valid
|
||||
only when <var>changes.type</var> is <tt>add</tt>, <tt>change</tt>,
|
||||
or <tt>context</tt>. When
|
||||
<var>changes.type</var> is <tt>change</tt>, valid only when
|
||||
@@ -780,264 +672,40 @@ td {
|
||||
between missing lines and empty lines, which EZT does not
|
||||
support).</td>
|
||||
</tr>
|
||||
<tr class="varlevel3">
|
||||
<td class="varname">diffs.changes.line_info_extra</td>
|
||||
<tr class="varlevel2">
|
||||
<td class="varname">changes.line_info_extra</td>
|
||||
<td>String</td>
|
||||
<td>[sidebyside-1] Additional line information for the current difference hunk.
|
||||
<td>Additional line information for the current difference hunk.
|
||||
Valid only when <var>changes.type</var> is <tt>header</tt>.</td>
|
||||
</tr>
|
||||
<tr class="varlevel3">
|
||||
<td class="varname">diffs.changes.line_info_left</td>
|
||||
<tr class="varlevel2">
|
||||
<td class="varname">changes.line_info_left</td>
|
||||
<td>String</td>
|
||||
<td>[sidebyside-1] First line number represented by the current hunk in the left
|
||||
<td>First line number represented by the current hunk in the left
|
||||
file. Valid only when <var>changes.type</var> is <tt>header</tt>.</td>
|
||||
</tr>
|
||||
<tr class="varlevel3">
|
||||
<td class="varname">diffs.changes.line_info_right</td>
|
||||
<tr class="varlevel2">
|
||||
<td class="varname">changes.line_info_right</td>
|
||||
<td>String</td>
|
||||
<td>[sidebyside-1] First line number represented by the current hunk in the right
|
||||
<td>First line number represented by the current hunk in the right
|
||||
file. Valid only when <var>changes.type</var> is <tt>header</tt>.</td>
|
||||
</tr>
|
||||
<tr class="varlevel3">
|
||||
<td class="varname">diffs.changes.line_number</td>
|
||||
<tr class="varlevel2">
|
||||
<td class="varname">changes.line_number</td>
|
||||
<td>String</td>
|
||||
<td>[sidebyside-1] Line number (1-based) of the line.</td>
|
||||
<td>Line number (1-based) of the line.</td>
|
||||
</tr>
|
||||
<tr class="varlevel3">
|
||||
<td class="varname">diffs.changes.type</td>
|
||||
<tr class="varlevel2">
|
||||
<td class="varname">changes.type</td>
|
||||
<td>String</td>
|
||||
<td>[sidebyside-1] The type of change. Values: <tt>add</tt>, <tt>binary-diff</tt>,
|
||||
<tt>change</tt>, <tt>context</tt>, <tt>error</tt>, <tt>header</tt>,
|
||||
<td>The type of change. Value values: <tt>add</tt>,
|
||||
<tt>change</tt>, <tt>context</tt>, <tt>header</tt>,
|
||||
<tt>no-changes</tt>, <tt>remove</tt>.</td>
|
||||
</tr>
|
||||
<tr class="varlevel3">
|
||||
<td class="varname">diffs.changes.columns</td>
|
||||
<td>List</td>
|
||||
<td>[sidebyside-2] List of two columns for left and right parts of the diff.</td>
|
||||
</tr>
|
||||
<tr class="varlevel4">
|
||||
<td class="varname">diffs.changes.columns.line_number</td>
|
||||
<td>String</td>
|
||||
<td>[sidebyside-2] Line number in the left/right column.</td>
|
||||
</tr>
|
||||
<tr class="varlevel4">
|
||||
<td class="varname">diffs.changes.columns.segments</td>
|
||||
<td>List</td>
|
||||
<td>[sidebyside-2] Left/right line, broken into change segments.</td>
|
||||
</tr>
|
||||
<tr class="varlevel5">
|
||||
<td class="varname">diffs.changes.columns.segments.text</td>
|
||||
<td>String</td>
|
||||
<td>[sidebyside-2] Text of this segment.</td>
|
||||
</tr>
|
||||
<tr class="varlevel5">
|
||||
<td class="varname">diffs.changes.columns.segments.type</td>
|
||||
<td>String</td>
|
||||
<td>[sidebyside-2] Not set if the segment is the same in both left and right sides;
|
||||
otherwise, one of the <tt>add</tt>, <tt>remove</tt> or <tt>change</tt>.</td>
|
||||
</tr>
|
||||
<tr class="varlevel3">
|
||||
<td class="varname">diffs.changes.gap</td>
|
||||
<td>Boolean</td>
|
||||
<td>[sidebyside-2] If true, indicates that change blocks are non-contiguous
|
||||
and that the template should display some sort of ellipsis before the
|
||||
current block.</td>
|
||||
</tr>
|
||||
<tr class="varlevel3">
|
||||
<td class="varname">diffs.changes.type</td>
|
||||
<td>String</td>
|
||||
<td>[sidebyside-2] The type of change. Values: <tt>binary-diff</tt>,
|
||||
<tt>error</tt>, <tt>intraline</tt>, <tt>no-changes</tt>.</td>
|
||||
</tr>
|
||||
<tr class="varlevel3">
|
||||
<td class="varname">diffs.changes.segments</td>
|
||||
<td>List</td>
|
||||
<td>[unified] Left/right line, broken into change segments.</td>
|
||||
</tr>
|
||||
<tr class="varlevel4">
|
||||
<td class="varname">diffs.changes.segments.text</td>
|
||||
<td>String</td>
|
||||
<td>[unified] Text of this segment.</td>
|
||||
</tr>
|
||||
<tr class="varlevel4">
|
||||
<td class="varname">diffs.changes.segments.type</td>
|
||||
<td>String</td>
|
||||
<td>[unified] Not set if the segment is the same in both left and right sides;
|
||||
otherwise, one of the <tt>add</tt>, <tt>remove</tt> or <tt>change</tt>.</td>
|
||||
</tr>
|
||||
<tr class="varlevel3">
|
||||
<td class="varname">diffs.changes.type</td>
|
||||
<td>String</td>
|
||||
<td>[unified] The type of change. Values: <tt>add</tt>, <tt>binary-diff</tt>,
|
||||
<tt>error</tt>, <tt>no-changes</tt>, <tt>remove</tt> or empty string
|
||||
if the line was not changed (context line).</td>
|
||||
</tr>
|
||||
<tr class="varlevel2">
|
||||
<td class="varname">diffs.left</td>
|
||||
<td>Container</td>
|
||||
<td>Container object for grouping information about the left file.</td>
|
||||
</tr>
|
||||
<tr class="varlevel3">
|
||||
<td class="varname">diffs.left.ago</td>
|
||||
<td>String</td>
|
||||
<td>Text description of the time elapsed since <var>left.date</date>.</td>
|
||||
</tr>
|
||||
<tr class="varlevel3">
|
||||
<td class="varname">diffs.left.annotate_href</td>
|
||||
<td>String</td>
|
||||
<td>URL of the ViewVC annotation view for the left file.
|
||||
Valid only when <var>entries.pathtype</var> is <tt>file</tt>.</td>
|
||||
</tr>
|
||||
<tr class="varlevel3">
|
||||
<td class="varname">diffs.left.author</td>
|
||||
<td>String</td>
|
||||
<td>Author of the revision of the left file.</td>
|
||||
</tr>
|
||||
<tr class="varlevel3">
|
||||
<td class="varname">diffs.left.date</td>
|
||||
<td>String</td>
|
||||
<td>Date (in UTC if not otherwise configured) in which the left file
|
||||
revision was created.</td>
|
||||
</tr>
|
||||
<tr class="varlevel3">
|
||||
<td class="varname">diffs.left.download_href</td>
|
||||
<td>String</td>
|
||||
<td>URL to download the HEAD revision of the left file.</td>
|
||||
</tr>
|
||||
<tr class="varlevel3">
|
||||
<td class="varname">diffs.left.download_text_href</td>
|
||||
<td>String</td>
|
||||
<td>URL to download the HEAD revision of the left file as
|
||||
<tt>text/plain</tt>.</td>
|
||||
</tr>
|
||||
<tr class="varlevel3">
|
||||
<td class="varname">diffs.left.log</td>
|
||||
<td>String</td>
|
||||
<td>Log message of the left file revision.</td>
|
||||
</tr>
|
||||
<tr class="varlevel3">
|
||||
<td class="varname">diffs.left.path</td>
|
||||
<td>String</td>
|
||||
<td>Path of the left file.</td>
|
||||
</tr>
|
||||
<tr class="varlevel3">
|
||||
<td class="varname">diffs.left.prefer_markup</td>
|
||||
<td>Boolean</td>
|
||||
<td>Indicates whether to make the default file link a link to the markup
|
||||
page instead of the checkout page.</td>
|
||||
</tr>
|
||||
<tr class="varlevel3">
|
||||
<td class="varname">diffs.left.rev</td>
|
||||
<td>String</td>
|
||||
<td>Revision of the left file.</td>
|
||||
</tr>
|
||||
<tr class="varlevel3">
|
||||
<td class="varname">diffs.left.revision_href</td>
|
||||
<td>String</td>
|
||||
<td>URL of the Subversion revision view for the left file's
|
||||
current revision. Valid only when <var>roottype</var> is
|
||||
<tt>svn</tt>.</td>
|
||||
</tr>
|
||||
<tr class="varlevel3">
|
||||
<td class="varname">diffs.left.size</td>
|
||||
<td>String</td>
|
||||
<td>Size of the left file revision, in bytes. Subversion only.</td>
|
||||
</tr>
|
||||
<tr class="varlevel3">
|
||||
<td class="varname">diffs.left.tag</td>
|
||||
<td>String</td>
|
||||
<td>Tag of the left file.</td>
|
||||
</tr>
|
||||
<tr class="varlevel3">
|
||||
<td class="varname">diffs.left.view_href</td>
|
||||
<td>String</td>
|
||||
<td>This is a URL for the markup view of the left file.</td>
|
||||
</tr>
|
||||
<tr class="varlevel2">
|
||||
<td class="varname">diffs.right</td>
|
||||
<td>Container</td>
|
||||
<td>Container object for grouping information about the right file.</td>
|
||||
</tr>
|
||||
<tr class="varlevel3">
|
||||
<td class="varname">diffs.right.ago</td>
|
||||
<td>String</td>
|
||||
<td>Text description of the time elapsed since <var>right.date</var>.</td>
|
||||
</tr>
|
||||
<tr class="varlevel3">
|
||||
<td class="varname">diffs.right.annotate_href</td>
|
||||
<td>String</td>
|
||||
<td>URL of the ViewVC annotation view for the right file.
|
||||
Valid only when <var>entries.pathtype</var> is <tt>file</tt>.</td>
|
||||
</tr>
|
||||
<tr class="varlevel3">
|
||||
<td class="varname">diffs.right.author</td>
|
||||
<td>String</td>
|
||||
<td>Author of the revision of the right file.</td>
|
||||
</tr>
|
||||
<tr class="varlevel3">
|
||||
<td class="varname">diffs.right.date</td>
|
||||
<td>String</td>
|
||||
<td>Date (in UTC if not otherwise configured) in which the right file
|
||||
revision was created.</td>
|
||||
</tr>
|
||||
<tr class="varlevel3">
|
||||
<td class="varname">diffs.right.download_href</td>
|
||||
<td>String</td>
|
||||
<td>URL to download the HEAD revision of the right file.</td>
|
||||
</tr>
|
||||
<tr class="varlevel3">
|
||||
<td class="varname">diffs.right.download_text_href</td>
|
||||
<td>String</td>
|
||||
<td>URL to download the HEAD revision of the right file as
|
||||
<tt>text/plain</tt>.</td>
|
||||
</tr>
|
||||
<tr class="varlevel3">
|
||||
<td class="varname">diffs.right.log</td>
|
||||
<td>String</td>
|
||||
<td>Log message of the right file revision.</td>
|
||||
</tr>
|
||||
<tr class="varlevel3">
|
||||
<td class="varname">diffs.right.path</td>
|
||||
<td>String</td>
|
||||
<td>Path of the right file.</td>
|
||||
</tr>
|
||||
<tr class="varlevel3">
|
||||
<td class="varname">diffs.right.prefer_markup</td>
|
||||
<td>Boolean</td>
|
||||
<td>Indicates whether to make the default file link a link to the markup
|
||||
page instead of the checkout page.</td>
|
||||
</tr>
|
||||
<tr class="varlevel3">
|
||||
<td class="varname">diffs.right.rev</td>
|
||||
<td>String</td>
|
||||
<td>Revision of the right file.</td>
|
||||
</tr>
|
||||
<tr class="varlevel3">
|
||||
<td class="varname">diffs.right.revision_href</td>
|
||||
<td>String</td>
|
||||
<td>URL of the Subversion revision view for the right file's
|
||||
current revision. Valid only when <var>roottype</var> is
|
||||
<tt>svn</tt>.</td>
|
||||
</tr>
|
||||
<tr class="varlevel3">
|
||||
<td class="varname">diffs.right.size</td>
|
||||
<td>String</td>
|
||||
<td>Size of the right file revision, in bytes. Subversion only.</td>
|
||||
</tr>
|
||||
<tr class="varlevel3">
|
||||
<td class="varname">diffs.right.tag</td>
|
||||
<td>String</td>
|
||||
<td>Tag of the right file.</td>
|
||||
</tr>
|
||||
<tr class="varlevel3">
|
||||
<td class="varname">diffs.right.view_href</td>
|
||||
<td>String</td>
|
||||
<td>This is a URL for the markup view of the right file.</td>
|
||||
</tr>
|
||||
<tr class="varlevel1">
|
||||
<td class="varname">diff_format</td>
|
||||
<td>String</td>
|
||||
<td>Difference display format: Valid values are <tt>c</tt>
|
||||
<td>Difference dislay format: Valid values are <tt>c</tt>
|
||||
(context), <tt>f</tt> (full human-readable),
|
||||
<tt>h</tt> (human-readable, or colored), <tt>l</tt> (long
|
||||
human-readable), <tt>s</tt> (side-by-side), <tt>u</tt>
|
||||
@@ -1054,15 +722,178 @@ td {
|
||||
<td>Hidden field name/value pairs for the diff format selection form.</td>
|
||||
</tr>
|
||||
<tr class="varlevel1">
|
||||
<td class="varname">hide_legend</td>
|
||||
<td class="varname">left</td>
|
||||
<td>Container</td>
|
||||
<td>Container object for grouping information about the left file.</td>
|
||||
</tr>
|
||||
<tr class="varlevel2">
|
||||
<td class="varname">left.ago</td>
|
||||
<td>String</td>
|
||||
<td>Text description of the time elapsed since <var>left.date</date>.</td>
|
||||
</tr>
|
||||
<tr class="varlevel2">
|
||||
<td class="varname">left.annotate_href</td>
|
||||
<td>String</td>
|
||||
<td>URL of the ViewVC annotation view for the left file.
|
||||
Valid only when <var>entries.pathtype</var> is <tt>file</tt>.</td>
|
||||
</tr>
|
||||
<tr class="varlevel2">
|
||||
<td class="varname">left.author</td>
|
||||
<td>String</td>
|
||||
<td>Author of the revision of the left file.</td>
|
||||
</tr>
|
||||
<tr class="varlevel2">
|
||||
<td class="varname">left.date</td>
|
||||
<td>String</td>
|
||||
<td>Date (in UTC if not otherwise configured) in which the left file
|
||||
revision was created.</td>
|
||||
</tr>
|
||||
<tr class="varlevel2">
|
||||
<td class="varname">left.download_href</td>
|
||||
<td>String</td>
|
||||
<td>URL to download the HEAD revision of the left file.</td>
|
||||
</tr>
|
||||
<tr class="varlevel2">
|
||||
<td class="varname">left.download_text_href</td>
|
||||
<td>String</td>
|
||||
<td>URL to download the HEAD revision of the left file as
|
||||
<tt>text/plain</tt>.</td>
|
||||
</tr>
|
||||
<tr class="varlevel2">
|
||||
<td class="varname">left.log</td>
|
||||
<td>String</td>
|
||||
<td>Log message of the left file revision.</td>
|
||||
</tr>
|
||||
<tr class="varlevel2">
|
||||
<td class="varname">left.path</td>
|
||||
<td>String</td>
|
||||
<td>Path of the left file.</td>
|
||||
</tr>
|
||||
<tr class="varlevel2">
|
||||
<td class="varname">left.prefer_markup</td>
|
||||
<td>Boolean</td>
|
||||
<td>Indicates whether the display format requires displaying a legend</td>
|
||||
<td>Indicates whether to make the default file link a link to the markup
|
||||
page instead of the checkout page.</td>
|
||||
</tr>
|
||||
<tr class="varlevel2">
|
||||
<td class="varname">left.rev</td>
|
||||
<td>String</td>
|
||||
<td>Revision of the left file.</td>
|
||||
</tr>
|
||||
<tr class="varlevel2">
|
||||
<td class="varname">left.revision_href</td>
|
||||
<td>String</td>
|
||||
<td>URL of the Subversion revision view for the left file's
|
||||
current revision. Valid only when <var>roottype</var> is
|
||||
<tt>svn</tt>.</td>
|
||||
</tr>
|
||||
<tr class="varlevel2">
|
||||
<td class="varname">left.size</td>
|
||||
<td>String</td>
|
||||
<td>Size of the left file revision, in bytes. Subversion only.</td>
|
||||
</tr>
|
||||
<tr class="varlevel2">
|
||||
<td class="varname">left.tag</td>
|
||||
<td>String</td>
|
||||
<td>Tag of the left file.</td>
|
||||
</tr>
|
||||
<tr class="varlevel2">
|
||||
<td class="varname">left.view_href</td>
|
||||
<td>String</td>
|
||||
<td>This is a URL for the markup view of the left file.</td>
|
||||
</tr>
|
||||
<tr class="varlevel1">
|
||||
<td class="varname">patch_href</td>
|
||||
<td>String</td>
|
||||
<td>URL of the patch view for the file.</td>
|
||||
</tr>
|
||||
<tr class="varlevel1">
|
||||
<td class="varname">raw_diff</td>
|
||||
<td>String</td>
|
||||
<td>Raw difference text. Valid only when <var>diff_format</var> is
|
||||
<tt>c</tt>, <tt>s</tt>, or <tt>u</tt>.</td>
|
||||
</tr>
|
||||
<tr class="varlevel1">
|
||||
<td class="varname">right</td>
|
||||
<td>Container</td>
|
||||
<td>Container object for grouping information about the right file.</td>
|
||||
</tr>
|
||||
<tr class="varlevel2">
|
||||
<td class="varname">right.author</td>
|
||||
<td>String</td>
|
||||
<td>Author of the revision of the right file.</td>
|
||||
</tr>
|
||||
<tr class="varlevel2">
|
||||
<td class="varname">right.annotate_href</td>
|
||||
<td>String</td>
|
||||
<td>URL of the ViewVC annotation view for the right file.
|
||||
Valid only when <var>entries.pathtype</var> is <tt>file</tt>.</td>
|
||||
</tr>
|
||||
<tr class="varlevel2">
|
||||
<td class="varname">right.author</td>
|
||||
<td>String</td>
|
||||
<td>Author of the revision of the right file.</td>
|
||||
</tr>
|
||||
<tr class="varlevel2">
|
||||
<td class="varname">right.date</td>
|
||||
<td>String</td>
|
||||
<td>Date (in UTC if not otherwise configured) in which the right file
|
||||
revision was created.</td>
|
||||
</tr>
|
||||
<tr class="varlevel2">
|
||||
<td class="varname">right.download_href</td>
|
||||
<td>String</td>
|
||||
<td>URL to download the HEAD revision of the right file.</td>
|
||||
</tr>
|
||||
<tr class="varlevel2">
|
||||
<td class="varname">right.download_text_href</td>
|
||||
<td>String</td>
|
||||
<td>URL to download the HEAD revision of the right file as
|
||||
<tt>text/plain</tt>.</td>
|
||||
</tr>
|
||||
<tr class="varlevel2">
|
||||
<td class="varname">right.log</td>
|
||||
<td>String</td>
|
||||
<td>Log message of the right file revision.</td>
|
||||
</tr>
|
||||
<tr class="varlevel2">
|
||||
<td class="varname">right.path</td>
|
||||
<td>String</td>
|
||||
<td>Path of the right file.</td>
|
||||
</tr>
|
||||
<tr class="varlevel2">
|
||||
<td class="varname">right.prefer_markup</td>
|
||||
<td>Boolean</td>
|
||||
<td>Indicates whether to make the default file link a link to the markup
|
||||
page instead of the checkout page.</td>
|
||||
</tr>
|
||||
<tr class="varlevel2">
|
||||
<td class="varname">right.rev</td>
|
||||
<td>String</td>
|
||||
<td>Revision of the right file.</td>
|
||||
</tr>
|
||||
<tr class="varlevel2">
|
||||
<td class="varname">right.revision_href</td>
|
||||
<td>String</td>
|
||||
<td>URL of the Subversion revision view for the right file's
|
||||
current revision. Valid only when <var>roottype</var> is
|
||||
<tt>svn</tt>.</td>
|
||||
</tr>
|
||||
<tr class="varlevel2">
|
||||
<td class="varname">right.size</td>
|
||||
<td>String</td>
|
||||
<td>Size of the right file revision, in bytes. Subversion only.</td>
|
||||
</tr>
|
||||
<tr class="varlevel2">
|
||||
<td class="varname">right.tag</td>
|
||||
<td>String</td>
|
||||
<td>Tag of the right file.</td>
|
||||
</tr>
|
||||
<tr class="varlevel2">
|
||||
<td class="varname">right.view_href</td>
|
||||
<td>String</td>
|
||||
<td>This is a URL for the markup view of the right file.</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
@@ -28,12 +28,12 @@ td {
|
||||
.h3 { border-width: 1px 0 0 0; }
|
||||
.toc-list { font-size: 90%; }
|
||||
.varname { font-family: monospace; }
|
||||
.added { background: rgb(60%,90%,60%); }
|
||||
.added { background: rgb(50%,75%,25%); }
|
||||
.unchanged { background: rgb(75%,75%,75%); }
|
||||
.renamed { background: rgb(80%,60%,80%); }
|
||||
.changed { background: rgb(100%,100%,50%); }
|
||||
.replaced { background: rgb(100%,80%,40%); }
|
||||
.removed { background: rgb(100%,70%,70%); }
|
||||
.renamed { background: rgb(75%,50%,75%); }
|
||||
.changed { background: rgb(100%,100%,25%); }
|
||||
.replaced { background: rgb(100%,75%,0%); }
|
||||
.removed { background: rgb(100%,25%,25%); }
|
||||
</style>
|
||||
</head>
|
||||
|
||||
@@ -67,21 +67,12 @@ td {
|
||||
<h2 id="toc">Table of Contents</h2>
|
||||
<ul class="toc-list">
|
||||
<li><a href="#introduction">Introduction</a></li>
|
||||
<li><a href="#sec-from-1-1">Upgrading From ViewVC 1.1</a></li>
|
||||
<li><a href="#sec-from-1-0">Upgrading From ViewVC 1.0</a></li>
|
||||
<li><a href="#sec-from-0-9">Upgrading From ViewCVS 0.9</a></li>
|
||||
<li><a href="#sec-from-0-8">Upgrading From ViewCVS 0.8</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="h2">
|
||||
<h2 id="sec-from-1-0">Upgrading From ViewVC 1.1</h2>
|
||||
|
||||
<p>This section discusses how to upgrade ViewVC 1.1.x to ViewVC 1.2.x.</p>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
<div class="h2">
|
||||
<h2 id="sec-from-1-0">Upgrading From ViewVC 1.0</h2>
|
||||
|
||||
@@ -1612,8 +1603,13 @@ allowed_views = annotate, diff, markup, tar
|
||||
<div class="h2">
|
||||
<h2 id="sec-from-0-8">Upgrading From ViewCVS 0.8</h2>
|
||||
|
||||
<p>This section discusses how to upgrade ViewCVS 0.8 to ViewCVS 0.9.x.</p>
|
||||
<p>This section discusses how to upgrade ViewCVS 0.8 to version
|
||||
0.9 or a later version of the software.</p>
|
||||
|
||||
<p><strong>NOTE:</strong> these changes will bring you up to the
|
||||
requirements of version 0.9. You must also follow the directions
|
||||
for <a href="#sec-from-0-9">upgrading from 0.9</a>.</p>
|
||||
|
||||
<div class="h3">
|
||||
<h3>Configuration Options</h3>
|
||||
|
||||
@@ -1623,50 +1619,92 @@ allowed_views = annotate, diff, markup, tar
|
||||
options, then you will need to make corresponding changes in the
|
||||
templates.</p>
|
||||
|
||||
<dl>
|
||||
<dt>Colors: <code>diff_heading</code>, <code>diff_empty</code>,
|
||||
<code>diff_remove</code>, <code>diff_change</code>,
|
||||
<code>diff_add</code>, and <code>diff_dark_change</code></dt>
|
||||
<dd>These options have been incorporated into the
|
||||
<code>diff.ezt</code> template.</dd>
|
||||
<dl>
|
||||
<dt>
|
||||
Colors:
|
||||
<strong>diff_heading</strong>,
|
||||
<strong>diff_empty</strong>,
|
||||
<strong>diff_remove</strong>,
|
||||
<strong>diff_change</strong>,
|
||||
<strong>diff_add</strong>,
|
||||
and <strong>diff_dark_change</strong>
|
||||
</dt>
|
||||
<dd>
|
||||
These options have been incorporated into the
|
||||
<code>diff.ezt</code> template.
|
||||
|
||||
<dt><code>markup_log</code></dt>
|
||||
<dd>This option has been incorporated into the
|
||||
<code>markup.ezt</code> template.</dd>
|
||||
<p></p>
|
||||
</dd>
|
||||
|
||||
<dt>Colors: <code>nav_header</code> and
|
||||
<code>alt_background</code></dt>
|
||||
<dd>These options have been incorporated into the
|
||||
<code>header.ezt</code> template.</dd>
|
||||
<dt><strong>markup_log</strong></dt>
|
||||
<dd>
|
||||
This option has been incorporated into the
|
||||
<code>markup.ezt</code> template.
|
||||
|
||||
<dt>Images: <code>back_icon</code>, <code>dir_icon</code>,
|
||||
and <code>file_icon</code></dt>
|
||||
<dd>These options have been incorporated into the
|
||||
<code>directory.ezt</code>, <code>header.ezt</code>,
|
||||
<code>log.ezt</code>, <code>log_table.ezt</code>, and
|
||||
<code>query.ezt</code> templates.</dd>
|
||||
<p></p>
|
||||
</dd>
|
||||
|
||||
<dt><code>use_java_script</code>
|
||||
and <code>open_extern_window</code></dt>
|
||||
<dd>The templates now use JavaScript in all applicable places, and
|
||||
open external windows for most downloading and viewing of
|
||||
files. If you wish to not use JavaScript and/or external
|
||||
windows, then remove the feature(s) from the templates.</dd>
|
||||
<dt>Colors: <strong>nav_header</strong>
|
||||
and <strong>alt_background</strong></dt>
|
||||
<dd>
|
||||
These options have been incorporated into the
|
||||
<code>header.ezt</code> template.
|
||||
|
||||
<dt><code>show_author</code></dt>
|
||||
<dd>Changing this option would be quite strange and rare. If you
|
||||
do not want to show the author for the revisions, then you
|
||||
should remove it from the various templates.</dd>
|
||||
<p></p>
|
||||
</dd>
|
||||
|
||||
<dt><code>hide_non_readable</code></dt>
|
||||
<dd>This option was never used, so it has been removed.</dd>
|
||||
<dt>
|
||||
Images:
|
||||
<strong>back_icon</strong>,
|
||||
<strong>dir_icon</strong>,
|
||||
and <strong>file_icon</strong>
|
||||
</dt>
|
||||
<dd>
|
||||
These options have been incorporated into the
|
||||
<code>directory.ezt</code>, <code>header.ezt</code>,
|
||||
<code>log.ezt</code>, <code>log_table.ezt</code>, and
|
||||
<code>query.ezt</code> templates.
|
||||
|
||||
<dt><code>flip_links_in_dirview</code></dt>
|
||||
<dd>This option is no longer available. If you want the links in
|
||||
your directory view flipped, then you may use the
|
||||
<code>dir_alternate.ezt</code> template.</dd>
|
||||
<p></p>
|
||||
</dd>
|
||||
|
||||
</dl>
|
||||
<dt><strong>use_java_script</strong>
|
||||
and <strong>open_extern_window</strong></dt>
|
||||
<dd>
|
||||
The templates now use JavaScript in all applicable places,
|
||||
and open external windows for most downloading and viewing
|
||||
of files. If you wish to not use JavaScript and/or external
|
||||
windows, then remove the feature(s) from the templates.
|
||||
|
||||
<p></p>
|
||||
</dd>
|
||||
|
||||
<dt><strong>show_author</strong></dt>
|
||||
<dd>
|
||||
Changing this option would be quite strange and rare. If you
|
||||
do not want to show the author for the revisions, then you
|
||||
should remove it from the various templates.
|
||||
|
||||
<p></p>
|
||||
</dd>
|
||||
|
||||
<dt><strong>hide_non_readable</strong></dt>
|
||||
<dd>
|
||||
This option was never used, so it has been removed.
|
||||
|
||||
<p></p>
|
||||
</dd>
|
||||
|
||||
<dt><strong>flip_links_in_dirview</strong></dt>
|
||||
<dd>
|
||||
This option is no longer available. If you want the links in
|
||||
your directory view flipped, then you may use the
|
||||
<code>dir_alternate.ezt</code> template.
|
||||
|
||||
<p></p>
|
||||
</dd>
|
||||
|
||||
</dl>
|
||||
|
||||
</div>
|
||||
|
||||
@@ -1677,65 +1715,53 @@ allowed_views = annotate, diff, markup, tar
|
||||
removed in 0.9. If you have custom templates that refer to these
|
||||
variables, then you will need to modify your templates.</p>
|
||||
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Variable</th>
|
||||
<th>Location</th>
|
||||
<th>Changes</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr class="removed">
|
||||
<td class="varname">headers</td>
|
||||
<td>directory.ezt</td>
|
||||
<td>removed; headers are now listed explicitly in the template, rather
|
||||
than made available through a list.</td>
|
||||
</tr>
|
||||
<tr class="removed">
|
||||
<td class="varname">rows.cols</td>
|
||||
<td>directory.ezt</td>
|
||||
<td>removed; was used in conjunction with the <var>headers</var>
|
||||
variable to control the column displays. This is now controlled
|
||||
explicitly within the templates.</td>
|
||||
</tr>
|
||||
<tr class="removed">
|
||||
<td class="varname">rows.span</td>
|
||||
<td>directory.ezt</td>
|
||||
<td>removed; was used in conjunction with the <var>headers</var>
|
||||
variable to control the column displays. This is now controlled
|
||||
explicitly within the templates.</td>
|
||||
</tr>
|
||||
<tr class="removed">
|
||||
<td class="varname">rev_in_front</td>
|
||||
<td>directory.ezt</td>
|
||||
<td>removed; was used to indicate that revision links should be used in
|
||||
the first column, rather than in their standard place in the
|
||||
second column. Changing the links should now be done in the
|
||||
template, rather than according to this variable. You may want
|
||||
to look at the <code>dir_alternate.ezt</code> template, which
|
||||
has the revision in front.</dd>
|
||||
</tr>
|
||||
<tr class="removed">
|
||||
<td class="varname">rows.attic</td>
|
||||
<td>directory.ezt</td>
|
||||
<td>removed; used to manage the hide and showing of the
|
||||
contents of the <code>Attic/</code> subdirectory. Several new
|
||||
variables were introduced which can be used to replace this
|
||||
functionality: <var>show_attic_href</var>,
|
||||
<var>hide_attic_href</var>, and <var>rows.state</var>.</td>
|
||||
</tr>
|
||||
<tr class="removed">
|
||||
<td class="varname">rows.hide_attic_href</td>
|
||||
<td>directory.ezt</td>
|
||||
<td>removed; used to manage the hide and showing of the
|
||||
contents of the <code>Attic/</code> subdirectory. Several new
|
||||
variables were introduced which can be used to replace this
|
||||
functionality: <var>show_attic_href</var>,
|
||||
<var>hide_attic_href</var>, and <var>rows.state</var>.</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<dl>
|
||||
<dt><code>directory.ezt</code>: <var>headers</var></dt>
|
||||
<dd>
|
||||
The headers are now listed explicitly in the template,
|
||||
rather than made available through a list.
|
||||
<p></p>
|
||||
</dd>
|
||||
|
||||
<dt>
|
||||
<code>directory.ezt</code>:
|
||||
<var>rows.cols</var>,
|
||||
and <var>rows.span</var>
|
||||
</dt>
|
||||
<dd>
|
||||
These variables were used in conjunction with the
|
||||
<var>headers</var> variable to control the column
|
||||
displays. This is now controlled explicitly within the
|
||||
templates.
|
||||
<p></p>
|
||||
</dd>
|
||||
|
||||
<dt><code>directory.ezt</code>:
|
||||
<var>rev_in_front</var></dt>
|
||||
<dd>
|
||||
This was used to indicate that revision links should
|
||||
be used in the first column, rather than in their
|
||||
standard place in the second column. Changing the
|
||||
links should now be done in the template, rather than
|
||||
according to this variable. You may want to look at
|
||||
the <code>dir_alternate.ezt</code> template, which has
|
||||
the revision in front.
|
||||
<p></p>
|
||||
</dd>
|
||||
|
||||
<dt><code>directory.ezt</code>:
|
||||
<var>rows.attic</var>
|
||||
and <var>rows.hide_attic_href</var></dt>
|
||||
<dd>
|
||||
These variable were used to manage the hide and
|
||||
showing of the contents of the <code>Attic/</code>
|
||||
subdirectory. Several new variables were introduced
|
||||
which can be used to replace this functionality:
|
||||
<var>show_attic_href</var>,
|
||||
<var>hide_attic_href</var>, and <var>rows.state</var>.
|
||||
<p></p>
|
||||
</dd>
|
||||
</dl>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
@@ -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>
|
||||
|
@@ -15,6 +15,7 @@
|
||||
# -----------------------------------------------------------------------
|
||||
|
||||
import re
|
||||
import string
|
||||
|
||||
|
||||
def language(hdr):
|
||||
@@ -39,7 +40,7 @@ def _parse(hdr, result):
|
||||
name = _re_token.match(hdr, pos)
|
||||
if not name:
|
||||
raise AcceptLanguageParseError()
|
||||
a = result.item_class(name.group(1).lower())
|
||||
a = result.item_class(string.lower(name.group(1)))
|
||||
pos = name.end()
|
||||
while 1:
|
||||
# are we looking at a parameter?
|
||||
@@ -55,7 +56,7 @@ def _parse(hdr, result):
|
||||
# the "=" was probably missing
|
||||
continue
|
||||
|
||||
pname = match.group(1).lower()
|
||||
pname = string.lower(match.group(1))
|
||||
if pname == 'q' or pname == 'qs':
|
||||
try:
|
||||
a.quality = float(match.group(2))
|
||||
@@ -69,7 +70,7 @@ def _parse(hdr, result):
|
||||
# bad float literal
|
||||
pass
|
||||
elif pname == 'charset':
|
||||
a.charset = match.group(2).lower()
|
||||
a.charset = string.lower(match.group(2))
|
||||
|
||||
result.append(a)
|
||||
if hdr[pos:pos+1] == ',':
|
||||
|
16
lib/blame.py
@@ -27,12 +27,11 @@
|
||||
# -----------------------------------------------------------------------
|
||||
|
||||
import sys
|
||||
import string
|
||||
import os
|
||||
import re
|
||||
import time
|
||||
import math
|
||||
|
||||
from common import _item
|
||||
import vclib
|
||||
import sapi
|
||||
|
||||
@@ -43,7 +42,7 @@ def link_includes(text, repos, path_parts, include_url):
|
||||
if match:
|
||||
incfile = match.group(3)
|
||||
include_path_parts = path_parts[:-1]
|
||||
for part in filter(None, incfile.split('/')):
|
||||
for part in filter(None, string.split(incfile, '/')):
|
||||
if part == "..":
|
||||
if not include_path_parts:
|
||||
# nothing left to pop; don't bother marking up this include.
|
||||
@@ -55,14 +54,14 @@ def link_includes(text, repos, path_parts, include_url):
|
||||
include_path = None
|
||||
try:
|
||||
if repos.itemtype(include_path_parts, None) == vclib.FILE:
|
||||
include_path = '/'.join(include_path_parts)
|
||||
include_path = string.join(include_path_parts, '/')
|
||||
except vclib.ItemNotFound:
|
||||
pass
|
||||
|
||||
if include_path:
|
||||
return '#%sinclude%s<a href="%s">"%s"</a>' % \
|
||||
(match.group(1), match.group(2),
|
||||
include_url.replace('/WHERE/', include_path), incfile)
|
||||
string.replace(include_url, '/WHERE/', include_path), incfile)
|
||||
|
||||
return text
|
||||
|
||||
@@ -95,6 +94,11 @@ def blame(repos, path_parts, diff_url, include_url, opt_rev=None):
|
||||
return source, source.revision
|
||||
|
||||
|
||||
class _item:
|
||||
def __init__(self, **kw):
|
||||
vars(self).update(kw)
|
||||
|
||||
|
||||
def make_html(root, rcs_path):
|
||||
import vclib.ccvs.blame
|
||||
bs = vclib.ccvs.blame.BlameSource(os.path.join(root, rcs_path))
|
||||
@@ -132,7 +136,7 @@ def make_html(root, rcs_path):
|
||||
sys.stdout.write('<td> </td><td> </td>')
|
||||
rev_count = rev_count + 1
|
||||
|
||||
sys.stdout.write('<td%s>%s</td></tr>\n' % (align % 'left', thisline.rstrip() or ' '))
|
||||
sys.stdout.write('<td%s>%s</td></tr>\n' % (align % 'left', string.rstrip(thisline) or ' '))
|
||||
sys.stdout.write('</table>\n')
|
||||
|
||||
|
||||
|
@@ -1,60 +0,0 @@
|
||||
# -*-python-*-
|
||||
#
|
||||
# Copyright (C) 1999-2013 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
|
||||
# distribution or at http://viewvc.org/license-1.html.
|
||||
#
|
||||
# For more information, visit http://viewvc.org/
|
||||
#
|
||||
# -----------------------------------------------------------------------
|
||||
#
|
||||
# common: common definitions for the viewvc library
|
||||
#
|
||||
# -----------------------------------------------------------------------
|
||||
|
||||
# Special type indicators for diff header processing and idiff return codes
|
||||
_RCSDIFF_IS_BINARY = 'binary-diff'
|
||||
_RCSDIFF_ERROR = 'error'
|
||||
_RCSDIFF_NO_CHANGES = "no-changes"
|
||||
|
||||
|
||||
class _item:
|
||||
def __init__(self, **kw):
|
||||
vars(self).update(kw)
|
||||
|
||||
|
||||
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)
|
180
lib/compat.py
Normal file
@@ -0,0 +1,180 @@
|
||||
# -*-python-*-
|
||||
#
|
||||
# Copyright (C) 1999-2013 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
|
||||
# distribution or at http://viewvc.org/license-1.html.
|
||||
#
|
||||
# For more information, visit http://viewvc.org/
|
||||
#
|
||||
# -----------------------------------------------------------------------
|
||||
#
|
||||
# compat.py: compatibility functions for operation across Python 1.5.x to 2.2.x
|
||||
#
|
||||
# -----------------------------------------------------------------------
|
||||
|
||||
import urllib
|
||||
import string
|
||||
import time
|
||||
import calendar
|
||||
import re
|
||||
import os
|
||||
import rfc822
|
||||
import tempfile
|
||||
import errno
|
||||
|
||||
#
|
||||
# urllib.urlencode() is new to Python 1.5.2
|
||||
#
|
||||
try:
|
||||
urlencode = urllib.urlencode
|
||||
except AttributeError:
|
||||
def urlencode(dict):
|
||||
"Encode a dictionary as application/x-url-form-encoded."
|
||||
if not dict:
|
||||
return ''
|
||||
quote = urllib.quote_plus
|
||||
keyvalue = [ ]
|
||||
for key, value in dict.items():
|
||||
keyvalue.append(quote(key) + '=' + quote(str(value)))
|
||||
return string.join(keyvalue, '&')
|
||||
|
||||
#
|
||||
# time.strptime() is new to Python 1.5.2
|
||||
#
|
||||
if hasattr(time, 'strptime'):
|
||||
def cvs_strptime(timestr):
|
||||
'Parse a CVS-style date/time value.'
|
||||
return time.strptime(timestr, '%Y/%m/%d %H:%M:%S')[:-1] + (0,)
|
||||
else:
|
||||
_re_rev_date = re.compile('([0-9]{4})/([0-9][0-9])/([0-9][0-9]) '
|
||||
'([0-9][0-9]):([0-9][0-9]):([0-9][0-9])')
|
||||
def cvs_strptime(timestr):
|
||||
'Parse a CVS-style date/time value.'
|
||||
match = _re_rev_date.match(timestr)
|
||||
if match:
|
||||
return tuple(map(int, match.groups())) + (0, 1, 0)
|
||||
else:
|
||||
raise ValueError('date is not in cvs format')
|
||||
|
||||
#
|
||||
# os.makedirs() is new to Python 1.5.2
|
||||
#
|
||||
try:
|
||||
makedirs = os.makedirs
|
||||
except AttributeError:
|
||||
def makedirs(path, mode=0777):
|
||||
head, tail = os.path.split(path)
|
||||
if head and tail and not os.path.exists(head):
|
||||
makedirs(head, mode)
|
||||
os.mkdir(path, mode)
|
||||
|
||||
#
|
||||
# rfc822.formatdate() is new to Python 1.6
|
||||
#
|
||||
try:
|
||||
formatdate = rfc822.formatdate
|
||||
except AttributeError:
|
||||
def formatdate(timeval):
|
||||
if timeval is None:
|
||||
timeval = time.time()
|
||||
timeval = time.gmtime(timeval)
|
||||
return "%s, %02d %s %04d %02d:%02d:%02d GMT" % (
|
||||
["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"][timeval[6]],
|
||||
timeval[2],
|
||||
["Jan", "Feb", "Mar", "Apr", "May", "Jun",
|
||||
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"][timeval[1]-1],
|
||||
timeval[0], timeval[3], timeval[4], timeval[5])
|
||||
|
||||
#
|
||||
# calendar.timegm() is new to Python 2.x and
|
||||
# calendar.leapdays() was wrong in Python 1.5.2
|
||||
#
|
||||
try:
|
||||
timegm = calendar.timegm
|
||||
except AttributeError:
|
||||
def leapdays(year1, year2):
|
||||
"""Return number of leap years in range [year1, year2).
|
||||
Assume year1 <= year2."""
|
||||
year1 = year1 - 1
|
||||
year2 = year2 - 1
|
||||
return (year2/4 - year1/4) - (year2/100 -
|
||||
year1/100) + (year2/400 - year1/400)
|
||||
|
||||
EPOCH = 1970
|
||||
def timegm(tuple):
|
||||
"""Unrelated but handy function to calculate Unix timestamp from GMT."""
|
||||
year, month, day, hour, minute, second = tuple[:6]
|
||||
# assert year >= EPOCH
|
||||
# assert 1 <= month <= 12
|
||||
days = 365*(year-EPOCH) + leapdays(EPOCH, year)
|
||||
for i in range(1, month):
|
||||
days = days + calendar.mdays[i]
|
||||
if month > 2 and calendar.isleap(year):
|
||||
days = days + 1
|
||||
days = days + day - 1
|
||||
hours = days*24 + hour
|
||||
minutes = hours*60 + minute
|
||||
seconds = minutes*60 + second
|
||||
return seconds
|
||||
|
||||
#
|
||||
# tempfile.mkdtemp() is new to Python 2.3
|
||||
#
|
||||
try:
|
||||
mkdtemp = tempfile.mkdtemp
|
||||
except AttributeError:
|
||||
def mkdtemp(suffix="", prefix="tmp", dir=None):
|
||||
# mktemp() only took a single suffix argument until Python 2.3.
|
||||
# We'll do the best we can.
|
||||
oldtmpdir = os.environ.get('TMPDIR')
|
||||
try:
|
||||
for i in range(10):
|
||||
if dir:
|
||||
os.environ['TMPDIR'] = dir
|
||||
dir = tempfile.mktemp(suffix)
|
||||
if prefix:
|
||||
parent, base = os.path.split(dir)
|
||||
dir = os.path.join(parent, prefix + base)
|
||||
try:
|
||||
os.mkdir(dir, 0700)
|
||||
return dir
|
||||
except OSError, e:
|
||||
if e.errno == errno.EEXIST:
|
||||
continue # try again
|
||||
raise
|
||||
finally:
|
||||
if oldtmpdir:
|
||||
os.environ['TMPDIR'] = oldtmpdir
|
||||
elif os.environ.has_key('TMPDIR'):
|
||||
del(os.environ['TMPDIR'])
|
||||
|
||||
raise IOError, (errno.EEXIST, "No usable temporary directory name found")
|
||||
|
||||
#
|
||||
# the following stuff is *ONLY* needed for standalone.py.
|
||||
# For that reason I've encapsulated it into a function.
|
||||
#
|
||||
|
||||
def for_standalone():
|
||||
import SocketServer
|
||||
if not hasattr(SocketServer.TCPServer, "close_request"):
|
||||
#
|
||||
# method close_request() was missing until Python 2.1
|
||||
#
|
||||
class TCPServer(SocketServer.TCPServer):
|
||||
def process_request(self, request, client_address):
|
||||
"""Call finish_request.
|
||||
|
||||
Overridden by ForkingMixIn and ThreadingMixIn.
|
||||
|
||||
"""
|
||||
self.finish_request(request, client_address)
|
||||
self.close_request(request)
|
||||
|
||||
def close_request(self, request):
|
||||
"""Called to clean up an individual request."""
|
||||
request.close()
|
||||
|
||||
SocketServer.TCPServer = TCPServer
|
@@ -16,6 +16,7 @@
|
||||
|
||||
import sys
|
||||
import os
|
||||
import string
|
||||
import ConfigParser
|
||||
import fnmatch
|
||||
|
||||
@@ -171,12 +172,12 @@ class Config:
|
||||
|
||||
for fname in self.general.kv_files:
|
||||
if fname[0] == '[':
|
||||
idx = fname.index(']')
|
||||
parts = fname[1:idx].split('.')
|
||||
fname = fname[idx+1:].strip()
|
||||
idx = string.index(fname, ']')
|
||||
parts = string.split(fname[1:idx], '.')
|
||||
fname = string.strip(fname[idx+1:])
|
||||
else:
|
||||
parts = [ ]
|
||||
fname = fname.replace('%lang%', language)
|
||||
fname = string.replace(fname, '%lang%', language)
|
||||
|
||||
parser = ConfigParser.ConfigParser()
|
||||
parser.optionxform = lambda x: x # don't case-normalize option names.
|
||||
@@ -208,7 +209,7 @@ class Config:
|
||||
for opt in parser.options(section):
|
||||
value = parser.get(section, opt)
|
||||
if opt in self._force_multi_value:
|
||||
value = map(lambda x: x.strip(), filter(None, value.split(',')))
|
||||
value = map(string.strip, filter(None, string.split(value, ',')))
|
||||
else:
|
||||
try:
|
||||
value = int(value)
|
||||
@@ -266,11 +267,11 @@ class Config:
|
||||
self._process_section(parser, section, base_section)
|
||||
|
||||
def _find_canon_vhost(self, parser, vhost):
|
||||
vhost = vhost.lower().split(':')[0] # lower-case, no port
|
||||
vhost = string.split(string.lower(vhost), ':')[0] # lower-case, no port
|
||||
for canon_vhost in parser.options('vhosts'):
|
||||
value = parser.get('vhosts', canon_vhost)
|
||||
patterns = map(lambda x: x.lower().strip(),
|
||||
filter(None, value.split(',')))
|
||||
patterns = map(string.lower, map(string.strip,
|
||||
filter(None, string.split(value, ','))))
|
||||
for pat in patterns:
|
||||
if fnmatch.fnmatchcase(vhost, pat):
|
||||
return canon_vhost
|
||||
@@ -390,6 +391,7 @@ class Config:
|
||||
self.utilities.cvsnt = 'cvs'
|
||||
else:
|
||||
self.utilities.cvsnt = None
|
||||
self.utilities.svn = ''
|
||||
self.utilities.diff = ''
|
||||
self.utilities.cvsgraph = ''
|
||||
|
||||
@@ -420,7 +422,7 @@ class Config:
|
||||
self.options.hr_ignore_keyword_subst = 1
|
||||
self.options.hr_intraline = 0
|
||||
self.options.allow_compress = 0
|
||||
self.options.template_dir = "templates/default"
|
||||
self.options.template_dir = "templates"
|
||||
self.options.docroot = None
|
||||
self.options.show_subdir_lastmod = 0
|
||||
self.options.show_roots_lastmod = 0
|
||||
@@ -435,7 +437,6 @@ class Config:
|
||||
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
|
||||
@@ -473,11 +474,11 @@ def _startswith(somestr, substr):
|
||||
def _parse_roots(config_name, config_value):
|
||||
roots = { }
|
||||
for root in config_value:
|
||||
try:
|
||||
name, path = root.split(':', 1)
|
||||
except:
|
||||
pos = string.find(root, ':')
|
||||
if pos < 0:
|
||||
raise MalformedRoot(config_name, root)
|
||||
roots[name.strip()] = path.strip()
|
||||
name, path = map(string.strip, (root[:pos], root[pos+1:]))
|
||||
roots[name] = path
|
||||
return roots
|
||||
|
||||
class ViewVCConfigurationError(Exception):
|
||||
@@ -503,3 +504,10 @@ class MalformedRoot(ViewVCConfigurationError):
|
||||
|
||||
class _sub_config:
|
||||
pass
|
||||
|
||||
if not hasattr(sys, 'hexversion'):
|
||||
# Python 1.5 or 1.5.1. fix the syntax for ConfigParser options.
|
||||
import regex
|
||||
ConfigParser.option_cre = regex.compile('^\([-A-Za-z0-9._]+\)\(:\|['
|
||||
+ string.whitespace
|
||||
+ ']*=\)\(.*\)$')
|
||||
|
11
lib/cvsdb.py
@@ -12,6 +12,7 @@
|
||||
|
||||
import os
|
||||
import sys
|
||||
import string
|
||||
import time
|
||||
import fnmatch
|
||||
import re
|
||||
@@ -369,7 +370,7 @@ class CheckinDatabase:
|
||||
|
||||
sqlList.append("%s%s%s" % (field, match, self.db.literal(data)))
|
||||
|
||||
return "(%s)" % (" OR ".join(sqlList))
|
||||
return "(%s)" % (string.join(sqlList, " OR "))
|
||||
|
||||
def CreateSQLQueryString(self, query, detect_leftover=0):
|
||||
commits_table = self.GetCommitsTable()
|
||||
@@ -448,8 +449,8 @@ class CheckinDatabase:
|
||||
tables.append(table)
|
||||
if cond is not None: joinConds.append(cond)
|
||||
|
||||
tables = ",".join(tables)
|
||||
conditions = " AND ".join(joinConds + condList)
|
||||
tables = string.join(tables, ",")
|
||||
conditions = string.join(joinConds + condList, " AND ")
|
||||
conditions = conditions and "WHERE %s" % conditions
|
||||
|
||||
## apply the query's row limit, if any (so we avoid really
|
||||
@@ -909,7 +910,7 @@ def ConnectDatabaseReadOnly(cfg):
|
||||
def GetCommitListFromRCSFile(repository, path_parts, revision=None):
|
||||
commit_list = []
|
||||
|
||||
directory = "/".join(path_parts[:-1])
|
||||
directory = string.join(path_parts[:-1], "/")
|
||||
file = path_parts[-1]
|
||||
|
||||
revs = repository.itemlog(path_parts, revision, vclib.SORTBY_DEFAULT,
|
||||
@@ -926,7 +927,7 @@ def GetCommitListFromRCSFile(repository, path_parts, revision=None):
|
||||
|
||||
if rev.changed:
|
||||
# extract the plus/minus and drop the sign
|
||||
plus, minus = rev.changed.split()
|
||||
plus, minus = string.split(rev.changed)
|
||||
commit.SetPlusCount(plus[1:])
|
||||
commit.SetMinusCount(minus[1:])
|
||||
|
||||
|
@@ -14,7 +14,7 @@ import sys
|
||||
import time
|
||||
import types
|
||||
import re
|
||||
import calendar
|
||||
import compat
|
||||
import MySQLdb
|
||||
|
||||
# set to 1 to store commit times in UTC, or 0 to use the ViewVC machine's
|
||||
@@ -55,7 +55,7 @@ def TicksFromDateTime(datetime):
|
||||
t = datetime.tuple()
|
||||
|
||||
if utc_time:
|
||||
return calendar.timegm(t)
|
||||
return compat.timegm(t)
|
||||
else:
|
||||
return time.mktime(t[:8] + (-1,))
|
||||
|
||||
|
35
lib/ezt.py
@@ -687,6 +687,41 @@ def _write_value(value, args, ctx):
|
||||
ctx.formatters = formatters
|
||||
|
||||
|
||||
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):
|
||||
|
19
lib/idiff.py
@@ -19,8 +19,6 @@ from __future__ import generators
|
||||
import difflib
|
||||
import sys
|
||||
import re
|
||||
|
||||
from common import _item, _RCSDIFF_NO_CHANGES
|
||||
import ezt
|
||||
import sapi
|
||||
|
||||
@@ -31,7 +29,6 @@ def sidebyside(fromlines, tolines, context):
|
||||
line_strip = lambda line: line.rstrip("\n")
|
||||
fromlines = map(line_strip, fromlines)
|
||||
tolines = map(line_strip, tolines)
|
||||
had_changes = 0
|
||||
|
||||
gap = False
|
||||
for fromdata, todata, flag in difflib._mdiff(fromlines, tolines, context):
|
||||
@@ -40,11 +37,8 @@ def sidebyside(fromlines, tolines, context):
|
||||
else:
|
||||
from_item = _mdiff_split(flag, fromdata)
|
||||
to_item = _mdiff_split(flag, todata)
|
||||
had_changes = 1
|
||||
yield _item(gap=ezt.boolean(gap), columns=(from_item, to_item), type="intraline")
|
||||
yield _item(gap=ezt.boolean(gap), columns=(from_item, to_item))
|
||||
gap = False
|
||||
if not had_changes:
|
||||
yield _item(type=_RCSDIFF_NO_CHANGES)
|
||||
|
||||
_re_mdiff = re.compile("\0([+-^])(.*?)\1")
|
||||
|
||||
@@ -77,26 +71,19 @@ def unified(fromlines, tolines, context):
|
||||
|
||||
diff = difflib.Differ().compare(fromlines, tolines)
|
||||
lastrow = None
|
||||
had_changes = 0
|
||||
|
||||
for row in _trim_context(diff, context):
|
||||
if row[0].startswith("? "):
|
||||
had_changes = 1
|
||||
yield _differ_split(lastrow, row[0])
|
||||
lastrow = None
|
||||
else:
|
||||
if lastrow:
|
||||
had_changes = 1
|
||||
yield _differ_split(lastrow, None)
|
||||
lastrow = row
|
||||
|
||||
if lastrow:
|
||||
had_changes = 1
|
||||
yield _differ_split(lastrow, None)
|
||||
|
||||
if not had_changes:
|
||||
yield _item(type=_RCSDIFF_NO_CHANGES)
|
||||
|
||||
def _trim_context(lines, context_size):
|
||||
"""Trim context lines that don't surround changes from Differ results
|
||||
|
||||
@@ -189,6 +176,10 @@ def _differ_split(row, guide):
|
||||
return _item(gap=ezt.boolean(gap), type=type, segments=segments,
|
||||
left_number=left_number, right_number=right_number)
|
||||
|
||||
class _item:
|
||||
def __init__(self, **kw):
|
||||
vars(self).update(kw)
|
||||
|
||||
try:
|
||||
### Using difflib._mdiff function here was the easiest way of obtaining
|
||||
### intraline diffs for use in ViewVC, but it doesn't exist prior to
|
||||
|
@@ -23,6 +23,7 @@ import os
|
||||
import sys
|
||||
import sapi
|
||||
import threading
|
||||
import string
|
||||
|
||||
if sys.platform == "win32":
|
||||
import win32popen
|
||||
@@ -35,7 +36,7 @@ def popen(cmd, args, mode, capture_err=1):
|
||||
if sys.platform == "win32":
|
||||
command = win32popen.CommandLine(cmd, args)
|
||||
|
||||
if mode.find('r') >= 0:
|
||||
if string.find(mode, 'r') >= 0:
|
||||
hStdIn = None
|
||||
|
||||
if debug.SHOW_CHILD_PROCESSES:
|
||||
@@ -84,7 +85,7 @@ def popen(cmd, args, mode, capture_err=1):
|
||||
# in the parent
|
||||
|
||||
# close the descriptor that we don't need and return the other one.
|
||||
if mode.find('r') >= 0:
|
||||
if string.find(mode, 'r') >= 0:
|
||||
os.close(w)
|
||||
return _pipe(os.fdopen(r, mode), pid)
|
||||
os.close(r)
|
||||
@@ -95,7 +96,7 @@ def popen(cmd, args, mode, capture_err=1):
|
||||
# we'll need /dev/null for the discarded I/O
|
||||
null = os.open('/dev/null', os.O_RDWR)
|
||||
|
||||
if mode.find('r') >= 0:
|
||||
if string.find(mode, 'r') >= 0:
|
||||
# hook stdout/stderr to the "write" channel
|
||||
os.dup2(w, 1)
|
||||
# "close" stdin; the child shouldn't use it
|
||||
@@ -124,7 +125,7 @@ def popen(cmd, args, mode, capture_err=1):
|
||||
os.execvp(cmd, (cmd,) + tuple(args))
|
||||
except:
|
||||
# aid debugging, if the os.execvp above fails for some reason:
|
||||
print "<h2>exec failed:</h2><pre>", cmd, ' '.join(args), "</pre>"
|
||||
print "<h2>exec failed:</h2><pre>", cmd, string.join(args), "</pre>"
|
||||
raise
|
||||
|
||||
# crap. shouldn't be here.
|
||||
|
33
lib/query.py
@@ -23,7 +23,6 @@ import sys
|
||||
import string
|
||||
import time
|
||||
|
||||
from common import _item, TemplateData
|
||||
import cvsdb
|
||||
import viewvc
|
||||
import ezt
|
||||
@@ -48,7 +47,7 @@ class FormData:
|
||||
|
||||
def decode_thyself(self, form):
|
||||
try:
|
||||
self.repository = form["repository"].value.strip()
|
||||
self.repository = string.strip(form["repository"].value)
|
||||
except KeyError:
|
||||
pass
|
||||
except TypeError:
|
||||
@@ -57,7 +56,7 @@ class FormData:
|
||||
self.valid = 1
|
||||
|
||||
try:
|
||||
self.branch = form["branch"].value.strip()
|
||||
self.branch = string.strip(form["branch"].value)
|
||||
except KeyError:
|
||||
pass
|
||||
except TypeError:
|
||||
@@ -66,7 +65,7 @@ class FormData:
|
||||
self.valid = 1
|
||||
|
||||
try:
|
||||
self.directory = form["directory"].value.strip()
|
||||
self.directory = string.strip(form["directory"].value)
|
||||
except KeyError:
|
||||
pass
|
||||
except TypeError:
|
||||
@@ -75,7 +74,7 @@ class FormData:
|
||||
self.valid = 1
|
||||
|
||||
try:
|
||||
self.file = form["file"].value.strip()
|
||||
self.file = string.strip(form["file"].value)
|
||||
except KeyError:
|
||||
pass
|
||||
except TypeError:
|
||||
@@ -84,7 +83,7 @@ class FormData:
|
||||
self.valid = 1
|
||||
|
||||
try:
|
||||
self.who = form["who"].value.strip()
|
||||
self.who = string.strip(form["who"].value)
|
||||
except KeyError:
|
||||
pass
|
||||
except TypeError:
|
||||
@@ -93,14 +92,14 @@ class FormData:
|
||||
self.valid = 1
|
||||
|
||||
try:
|
||||
self.sortby = form["sortby"].value.strip()
|
||||
self.sortby = string.strip(form["sortby"].value)
|
||||
except KeyError:
|
||||
pass
|
||||
except TypeError:
|
||||
pass
|
||||
|
||||
try:
|
||||
self.date = form["date"].value.strip()
|
||||
self.date = string.strip(form["date"].value)
|
||||
except KeyError:
|
||||
pass
|
||||
except TypeError:
|
||||
@@ -159,7 +158,7 @@ def listparse_string(str):
|
||||
## command; add the command and start over
|
||||
elif c == ",":
|
||||
## strip ending whitespace on un-quoted data
|
||||
temp = temp.rstrip()
|
||||
temp = string.rstrip(temp)
|
||||
return_list.append( ("", temp) )
|
||||
temp = ""
|
||||
state = "eat leading whitespace"
|
||||
@@ -268,13 +267,13 @@ def form_to_cvsdb_query(cfg, form_data):
|
||||
|
||||
def prev_rev(rev):
|
||||
'''Returns a string representing the previous revision of the argument.'''
|
||||
r = rev.split('.')
|
||||
r = string.split(rev, '.')
|
||||
# decrement final revision component
|
||||
r[-1] = str(int(r[-1]) - 1)
|
||||
# prune if we pass the beginning of the branch
|
||||
if len(r) > 2 and r[-1] == '0':
|
||||
r = r[:-2]
|
||||
return '.'.join(r)
|
||||
return string.join(r, '.')
|
||||
|
||||
def is_forbidden(cfg, cvsroot_name, module):
|
||||
'''Return 1 if MODULE in CVSROOT_NAME is forbidden; return 0 otherwise.'''
|
||||
@@ -301,7 +300,7 @@ def is_forbidden(cfg, cvsroot_name, module):
|
||||
"by this interface. The '%s' root is configured to "
|
||||
"use a different one." % (cvsroot_name))
|
||||
forbidden = params.get('forbidden', '')
|
||||
forbidden = map(lambda x: x.strip(), filter(None, forbidden.split(',')))
|
||||
forbidden = map(string.strip, filter(None, string.split(forbidden, ',')))
|
||||
default = 0
|
||||
for pat in forbidden:
|
||||
if pat[0] == '!':
|
||||
@@ -314,7 +313,7 @@ def is_forbidden(cfg, cvsroot_name, module):
|
||||
|
||||
def build_commit(server, cfg, desc, files, cvsroots, viewvc_link):
|
||||
ob = _item(num_files=len(files), files=[])
|
||||
ob.log = desc and server.escape(desc).replace('\n', '<br />') or ''
|
||||
ob.log = desc and string.replace(server.escape(desc), '\n', '<br />') or ''
|
||||
|
||||
for commit in files:
|
||||
repository = commit.GetRepository()
|
||||
@@ -323,7 +322,7 @@ def build_commit(server, cfg, desc, files, cvsroots, viewvc_link):
|
||||
|
||||
## find the module name (if any)
|
||||
try:
|
||||
module = filter(None, directory.split('/'))[0]
|
||||
module = filter(None, string.split(directory, '/'))[0]
|
||||
except IndexError:
|
||||
module = None
|
||||
|
||||
@@ -443,7 +442,7 @@ def main(server, cfg, viewvc_link):
|
||||
if docroot is None and viewvc_link:
|
||||
docroot = viewvc_link + '/' + viewvc.docroot_magic_path
|
||||
|
||||
data = TemplateData({
|
||||
data = ezt.TemplateData({
|
||||
'cfg' : cfg,
|
||||
'address' : cfg.general.address,
|
||||
'vsn' : viewvc.__version__,
|
||||
@@ -474,3 +473,7 @@ def main(server, cfg, viewvc_link):
|
||||
exc_info = debug.GetExceptionData()
|
||||
server.header(status=exc_info['status'])
|
||||
debug.PrintException(server, exc_info)
|
||||
|
||||
class _item:
|
||||
def __init__(self, **kw):
|
||||
vars(self).update(kw)
|
||||
|
12
lib/sapi.py
@@ -16,6 +16,7 @@
|
||||
# -----------------------------------------------------------------------
|
||||
|
||||
import types
|
||||
import string
|
||||
import os
|
||||
import sys
|
||||
import re
|
||||
@@ -33,10 +34,10 @@ server = None
|
||||
# into HTML attributes.
|
||||
def escape(s):
|
||||
s = str(s)
|
||||
s = s.replace('&', '&')
|
||||
s = s.replace('>', '>')
|
||||
s = s.replace('<', '<')
|
||||
s = s.replace('"', """)
|
||||
s = string.replace(s, '&', '&')
|
||||
s = string.replace(s, '>', '>')
|
||||
s = string.replace(s, '<', '<')
|
||||
s = string.replace(s, '"', """)
|
||||
return s
|
||||
|
||||
|
||||
@@ -210,6 +211,9 @@ class WsgiServer(Server):
|
||||
global server
|
||||
server = self
|
||||
|
||||
global cgi
|
||||
import cgi
|
||||
|
||||
def addheader(self, name, value):
|
||||
self._headers.append((name, value))
|
||||
|
||||
|
@@ -12,6 +12,10 @@
|
||||
|
||||
"""Generic API for implementing authorization checks employed by ViewVC."""
|
||||
|
||||
import string
|
||||
import vclib
|
||||
|
||||
|
||||
class GenericViewVCAuthorizer:
|
||||
"""Abstract class encapsulating version control authorization routines."""
|
||||
|
||||
|
@@ -12,13 +12,14 @@
|
||||
import vcauth
|
||||
import vclib
|
||||
import fnmatch
|
||||
import string
|
||||
|
||||
class ViewVCAuthorizer(vcauth.GenericViewVCAuthorizer):
|
||||
"""A simple top-level module authorizer."""
|
||||
def __init__(self, username, params={}):
|
||||
forbidden = params.get('forbidden', '')
|
||||
self.forbidden = map(lambda x: x.strip(),
|
||||
filter(None, forbidden.split(',')))
|
||||
self.forbidden = map(string.strip,
|
||||
filter(None, string.split(forbidden, ',')))
|
||||
|
||||
def check_root_access(self, rootname):
|
||||
return 1
|
||||
|
@@ -12,6 +12,7 @@
|
||||
import vcauth
|
||||
import vclib
|
||||
import fnmatch
|
||||
import string
|
||||
import re
|
||||
|
||||
|
||||
@@ -28,8 +29,8 @@ class ViewVCAuthorizer(vcauth.GenericViewVCAuthorizer):
|
||||
"""A simple regular-expression-based authorizer."""
|
||||
def __init__(self, username, params={}):
|
||||
forbidden = params.get('forbiddenre', '')
|
||||
self.forbidden = map(lambda x: _split_regexp(x.strip()),
|
||||
filter(None, forbidden.split(',')))
|
||||
self.forbidden = map(lambda x: _split_regexp(string.strip(x)),
|
||||
filter(None, string.split(forbidden, ',')))
|
||||
|
||||
def _check_root_path_access(self, root_path):
|
||||
default = 1
|
||||
@@ -55,7 +56,7 @@ class ViewVCAuthorizer(vcauth.GenericViewVCAuthorizer):
|
||||
def check_path_access(self, rootname, path_parts, pathtype, rev=None):
|
||||
root_path = rootname
|
||||
if path_parts:
|
||||
root_path = root_path + '/' + '/'.join(path_parts)
|
||||
root_path = root_path + '/' + string.join(path_parts, '/')
|
||||
if pathtype == vclib.DIR:
|
||||
root_path = root_path + '/'
|
||||
else:
|
||||
|
@@ -12,6 +12,7 @@
|
||||
# (c) 2006 Sergey Lapin <slapin@dataart.com>
|
||||
|
||||
import vcauth
|
||||
import string
|
||||
import os.path
|
||||
import debug
|
||||
|
||||
@@ -33,9 +34,9 @@ class ViewVCAuthorizer(vcauth.GenericViewVCAuthorizer):
|
||||
# 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 and username.upper() or username
|
||||
self.username = username and string.upper(username) or username
|
||||
elif self.force_username_case == "lower":
|
||||
self.username = username and username.lower() or username
|
||||
self.username = username and string.lower(username) or username
|
||||
elif not self.force_username_case:
|
||||
self.username = username
|
||||
else:
|
||||
@@ -96,9 +97,9 @@ class ViewVCAuthorizer(vcauth.GenericViewVCAuthorizer):
|
||||
all_groups.append(groupname)
|
||||
group_member = 0
|
||||
groupname = groupname.strip()
|
||||
entries = cp.get('groups', groupname).split(',')
|
||||
entries = string.split(cp.get('groups', groupname), ',')
|
||||
for entry in entries:
|
||||
entry = entry.strip()
|
||||
entry = string.strip(entry)
|
||||
if entry == self.username:
|
||||
group_member = 1
|
||||
break
|
||||
@@ -139,13 +140,13 @@ class ViewVCAuthorizer(vcauth.GenericViewVCAuthorizer):
|
||||
# Figure if this path is explicitly allowed or denied to USERNAME.
|
||||
allow = deny = 0
|
||||
for user in cp.options(section):
|
||||
user = user.strip()
|
||||
user = string.strip(user)
|
||||
if _userspec_matches_user(user):
|
||||
# See if the 'r' permission is among the ones granted to
|
||||
# USER. If so, we can stop looking. (Entry order is not
|
||||
# relevant -- we'll use the most permissive entry, meaning
|
||||
# one 'allow' is all we need.)
|
||||
allow = cp.get(section, user).find('r') != -1
|
||||
allow = string.find(cp.get(section, user), 'r') != -1
|
||||
deny = not allow
|
||||
if allow:
|
||||
break
|
||||
@@ -174,7 +175,7 @@ class ViewVCAuthorizer(vcauth.GenericViewVCAuthorizer):
|
||||
if section.find(':') == -1:
|
||||
path = section
|
||||
else:
|
||||
name, path = section.split(':', 1)
|
||||
name, path = string.split(section, ':', 1)
|
||||
if name == rootname:
|
||||
root_sections.append(section)
|
||||
continue
|
||||
@@ -186,14 +187,14 @@ class ViewVCAuthorizer(vcauth.GenericViewVCAuthorizer):
|
||||
# USERNAME, record it.
|
||||
if allow or deny:
|
||||
if path != '/':
|
||||
path = '/' + '/'.join(filter(None, path.split('/')))
|
||||
path = '/' + string.join(filter(None, string.split(path, '/')), '/')
|
||||
paths_for_root[path] = allow
|
||||
|
||||
# Okay. Superimpose those root-specific values now.
|
||||
for section in root_sections:
|
||||
|
||||
# Get the path again.
|
||||
name, path = section.split(':', 1)
|
||||
name, path = string.split(section, ':', 1)
|
||||
|
||||
# Check for a specific access determination.
|
||||
allow, deny = _process_access_section(section)
|
||||
@@ -202,7 +203,7 @@ class ViewVCAuthorizer(vcauth.GenericViewVCAuthorizer):
|
||||
# USERNAME, record it.
|
||||
if allow or deny:
|
||||
if path != '/':
|
||||
path = '/' + '/'.join(filter(None, path.split('/')))
|
||||
path = '/' + string.join(filter(None, string.split(path, '/')), '/')
|
||||
paths_for_root[path] = allow
|
||||
|
||||
# If the root isn't readable, there's no point in caring about all
|
||||
@@ -262,7 +263,7 @@ class ViewVCAuthorizer(vcauth.GenericViewVCAuthorizer):
|
||||
return 0
|
||||
parts = path_parts[:]
|
||||
while parts:
|
||||
path = '/' + '/'.join(parts)
|
||||
path = '/' + string.join(parts, '/')
|
||||
if paths.has_key(path):
|
||||
return paths[path]
|
||||
del parts[-1]
|
||||
|
@@ -14,6 +14,7 @@
|
||||
such as CVS.
|
||||
"""
|
||||
|
||||
import string
|
||||
import types
|
||||
|
||||
|
||||
@@ -326,7 +327,7 @@ class ItemNotFound(Error):
|
||||
# use '/' rather than os.sep because this is for user consumption, and
|
||||
# it was defined using URL separators
|
||||
if type(path) in (types.TupleType, types.ListType):
|
||||
path = '/'.join(path)
|
||||
path = string.join(path, '/')
|
||||
Error.__init__(self, path)
|
||||
|
||||
class InvalidRevision(Error):
|
||||
|
@@ -11,11 +11,6 @@
|
||||
# -----------------------------------------------------------------------
|
||||
import os
|
||||
import os.path
|
||||
import time
|
||||
|
||||
|
||||
def cvs_strptime(timestr):
|
||||
return time.strptime(timestr, '%Y/%m/%d %H:%M:%S')[:-1] + (0,)
|
||||
|
||||
|
||||
def canonicalize_rootpath(rootpath):
|
||||
@@ -23,10 +18,6 @@ def canonicalize_rootpath(rootpath):
|
||||
return os.path.normpath(rootpath)
|
||||
|
||||
|
||||
def _is_cvsroot(path):
|
||||
return os.path.exists(os.path.join(path, "CVSROOT", "config"))
|
||||
|
||||
|
||||
def expand_root_parent(parent_path):
|
||||
# Each subdirectory of PARENT_PATH that contains a child
|
||||
# "CVSROOT/config" is added the set of returned roots. Or, if the
|
||||
@@ -35,9 +26,11 @@ def expand_root_parent(parent_path):
|
||||
assert os.path.isabs(parent_path)
|
||||
roots = {}
|
||||
subpaths = os.listdir(parent_path)
|
||||
cvsroot = os.path.exists(os.path.join(parent_path, "CVSROOT", "config"))
|
||||
for rootname in subpaths:
|
||||
rootpath = os.path.join(parent_path, rootname)
|
||||
if _is_cvsroot(parent_path) or _is_cvsroot(rootpath):
|
||||
if cvsroot \
|
||||
or (os.path.exists(os.path.join(rootpath, "CVSROOT", "config"))):
|
||||
roots[rootname] = canonicalize_rootpath(rootpath)
|
||||
return roots
|
||||
|
||||
@@ -46,13 +39,15 @@ def find_root_in_parent(parent_path, rootname):
|
||||
"""Search PARENT_PATH for a root named ROOTNAME, returning the
|
||||
canonicalized ROOTPATH of the root if found; return None if no such
|
||||
root is found."""
|
||||
|
||||
assert os.path.isabs(parent_path)
|
||||
# Is PARENT_PATH itself a CVS repository? If so, we allow ROOTNAME
|
||||
# to be any subdir within it. Otherwise, we expect
|
||||
# PARENT_PATH/ROOTNAME to be a CVS repository.
|
||||
assert os.path.isabs(parent_path)
|
||||
rootpath = os.path.join(parent_path, rootname)
|
||||
if (_is_cvsroot(parent_path) and os.path.exists(rootpath)) \
|
||||
or _is_cvsroot(rootpath):
|
||||
if os.path.exists(os.path.join(parent_path, "CVSROOT", "config")):
|
||||
return canonicalize_rootpath(rootpath)
|
||||
if os.path.exists(os.path.join(rootpath, "CVSROOT", "config")):
|
||||
return canonicalize_rootpath(rootpath)
|
||||
return None
|
||||
|
||||
|
@@ -18,17 +18,14 @@ import os
|
||||
import os.path
|
||||
import sys
|
||||
import stat
|
||||
import string
|
||||
import re
|
||||
import time
|
||||
import calendar
|
||||
|
||||
# ViewVC libs
|
||||
import compat
|
||||
import popen
|
||||
import vclib.ccvs
|
||||
|
||||
def _path_join(path_parts):
|
||||
return '/'.join(path_parts)
|
||||
|
||||
class BaseCVSRepository(vclib.Repository):
|
||||
def __init__(self, name, rootpath, authorizer, utilities):
|
||||
if not os.path.isdir(rootpath):
|
||||
@@ -84,7 +81,7 @@ class BaseCVSRepository(vclib.Repository):
|
||||
def listdir(self, path_parts, rev, options):
|
||||
if self.itemtype(path_parts, rev) != vclib.DIR: # does auth-check
|
||||
raise vclib.Error("Path '%s' is not a directory."
|
||||
% (_path_join(path_parts)))
|
||||
% (string.join(path_parts, "/")))
|
||||
|
||||
# Only RCS files (*,v) and subdirs are returned.
|
||||
data = [ ]
|
||||
@@ -141,14 +138,15 @@ class BaseCVSRepository(vclib.Repository):
|
||||
if root:
|
||||
ret = ret_file
|
||||
else:
|
||||
ret = _path_join(ret_parts)
|
||||
ret = string.join(ret_parts, "/")
|
||||
if v:
|
||||
ret = ret + ",v"
|
||||
return ret
|
||||
|
||||
def isexecutable(self, path_parts, rev):
|
||||
if self.itemtype(path_parts, rev) != vclib.FILE: # does auth-check
|
||||
raise vclib.Error("Path '%s' is not a file." % (_path_join(path_parts)))
|
||||
raise vclib.Error("Path '%s' is not a file."
|
||||
% (string.join(path_parts, "/")))
|
||||
rcsfile = self.rcsfile(path_parts, 1)
|
||||
return os.access(rcsfile, os.X_OK)
|
||||
|
||||
@@ -183,7 +181,8 @@ class BinCVSRepository(BaseCVSRepository):
|
||||
boolean. true to use the original keyword substitution values.
|
||||
"""
|
||||
if self.itemtype(path_parts, rev) != vclib.FILE: # does auth-check
|
||||
raise vclib.Error("Path '%s' is not a file." % (_path_join(path_parts)))
|
||||
raise vclib.Error("Path '%s' is not a file."
|
||||
% (string.join(path_parts, "/")))
|
||||
if not rev or rev == 'HEAD' or rev == 'MAIN':
|
||||
rev_flag = '-p'
|
||||
else:
|
||||
@@ -257,7 +256,7 @@ class BinCVSRepository(BaseCVSRepository):
|
||||
"""
|
||||
if self.itemtype(path_parts, rev) != vclib.DIR: # does auth-check
|
||||
raise vclib.Error("Path '%s' is not a directory."
|
||||
% (_path_join(path_parts)))
|
||||
% (string.join(path_parts, "/")))
|
||||
|
||||
subdirs = options.get('cvs_subdirs', 0)
|
||||
entries_to_fetch = []
|
||||
@@ -294,7 +293,8 @@ class BinCVSRepository(BaseCVSRepository):
|
||||
"""
|
||||
|
||||
if self.itemtype(path_parts, rev) != vclib.FILE: # does auth-check
|
||||
raise vclib.Error("Path '%s' is not a file." % (_path_join(path_parts)))
|
||||
raise vclib.Error("Path '%s' is not a file."
|
||||
% (string.join(path_parts, "/")))
|
||||
|
||||
# Invoke rlog
|
||||
rcsfile = self.rcsfile(path_parts, 1)
|
||||
@@ -339,7 +339,8 @@ class BinCVSRepository(BaseCVSRepository):
|
||||
|
||||
def annotate(self, path_parts, rev=None, include_text=False):
|
||||
if self.itemtype(path_parts, rev) != vclib.FILE: # does auth-check
|
||||
raise vclib.Error("Path '%s' is not a file." % (_path_join(path_parts)))
|
||||
raise vclib.Error("Path '%s' is not a file."
|
||||
% (string.join(path_parts, "/")))
|
||||
|
||||
from vclib.ccvs import blame
|
||||
source = blame.BlameSource(self.rcsfile(path_parts, 1), rev, include_text)
|
||||
@@ -356,9 +357,11 @@ class BinCVSRepository(BaseCVSRepository):
|
||||
ignore_keyword_subst - boolean, ignore keyword substitution
|
||||
"""
|
||||
if self.itemtype(path_parts1, rev1) != vclib.FILE: # does auth-check
|
||||
raise vclib.Error("Path '%s' is not a file." % (_path_join(path_parts1)))
|
||||
raise vclib.Error("Path '%s' is not a file."
|
||||
% (string.join(path_parts1, "/")))
|
||||
if self.itemtype(path_parts2, rev2) != vclib.FILE: # does auth-check
|
||||
raise vclib.Error("Path '%s' is not a file." % (_path_join(path_parts2)))
|
||||
raise vclib.Error("Path '%s' is not a file."
|
||||
% (string.join(path_parts2, "/")))
|
||||
|
||||
args = vclib._diff_args(type, options)
|
||||
if options.get('ignore_keyword_subst', 0):
|
||||
@@ -566,7 +569,7 @@ def _remove_tag(tag):
|
||||
|
||||
def _revision_tuple(revision_string):
|
||||
"""convert a revision number into a tuple of integers"""
|
||||
t = tuple(map(int, revision_string.split('.')))
|
||||
t = tuple(map(int, string.split(revision_string, '.')))
|
||||
if len(t) % 2 == 0:
|
||||
return t
|
||||
raise ValueError
|
||||
@@ -574,7 +577,7 @@ def _revision_tuple(revision_string):
|
||||
def _tag_tuple(revision_string):
|
||||
"""convert a revision number or branch number into a tuple of integers"""
|
||||
if revision_string:
|
||||
t = map(int, revision_string.split('.'))
|
||||
t = map(int, string.split(revision_string, '.'))
|
||||
l = len(t)
|
||||
if l == 1:
|
||||
return ()
|
||||
@@ -719,7 +722,7 @@ def _parse_log_header(fp):
|
||||
|
||||
if state == 1:
|
||||
if line[0] == '\t':
|
||||
[ tag, rev ] = map(lambda x: x.strip(), line.split(':'))
|
||||
[ tag, rev ] = map(string.strip, string.split(line, ':'))
|
||||
taginfo[tag] = rev
|
||||
else:
|
||||
# oops. this line isn't tag info. stop parsing tags.
|
||||
@@ -727,7 +730,7 @@ def _parse_log_header(fp):
|
||||
|
||||
if state == 2:
|
||||
if line[0] == '\t':
|
||||
[ locker, rev ] = map(lambda x: x.strip(), line.split(':'))
|
||||
[ locker, rev ] = map(string.strip, string.split(line, ':'))
|
||||
lockinfo[rev] = locker
|
||||
else:
|
||||
# oops. this line isn't lock info. stop parsing tags.
|
||||
@@ -836,7 +839,7 @@ def _parse_log_entry(fp):
|
||||
return None, eof
|
||||
|
||||
# parse out a time tuple for the local time
|
||||
tm = vclib.ccvs.cvs_strptime(match.group(1))
|
||||
tm = compat.cvs_strptime(match.group(1))
|
||||
|
||||
# rlog seems to assume that two-digit years are 1900-based (so, "04"
|
||||
# comes out as "1904", not "2004").
|
||||
@@ -847,7 +850,7 @@ def _parse_log_entry(fp):
|
||||
tm[0] = tm[0] + 100
|
||||
if tm[0] < EPOCH:
|
||||
raise ValueError, 'invalid year'
|
||||
date = calendar.timegm(tm)
|
||||
date = compat.timegm(tm)
|
||||
|
||||
return Revision(rev, date,
|
||||
# author, state, lines changed
|
||||
|
@@ -26,6 +26,7 @@
|
||||
#
|
||||
# -----------------------------------------------------------------------
|
||||
|
||||
import string
|
||||
import re
|
||||
import time
|
||||
import math
|
||||
@@ -99,7 +100,7 @@ class CVSParser(rcsparse.Sink):
|
||||
|
||||
# Split deltatext specified by rev to each line.
|
||||
def deltatext_split(self, rev):
|
||||
lines = self.revision_deltatext[rev].split('\n')
|
||||
lines = string.split(self.revision_deltatext[rev], '\n')
|
||||
if lines[-1] == '':
|
||||
del lines[-1]
|
||||
return lines
|
||||
@@ -138,16 +139,16 @@ class CVSParser(rcsparse.Sink):
|
||||
adjust = adjust + 1
|
||||
elif dmatch:
|
||||
# "d" - Delete command
|
||||
start_line = int(dmatch.group(1))
|
||||
count = int(dmatch.group(2))
|
||||
start_line = string.atoi(dmatch.group(1))
|
||||
count = string.atoi(dmatch.group(2))
|
||||
begin = start_line + adjust - 1
|
||||
del text[begin:begin + count]
|
||||
adjust = adjust - count
|
||||
lines_removed_now = lines_removed_now + count
|
||||
elif amatch:
|
||||
# "a" - Add command
|
||||
start_line = int(amatch.group(1))
|
||||
count = int(amatch.group(2))
|
||||
start_line = string.atoi(amatch.group(1))
|
||||
count = string.atoi(amatch.group(2))
|
||||
add_lines_remaining = count
|
||||
lines_added_now = lines_added_now + count
|
||||
else:
|
||||
@@ -310,13 +311,13 @@ class CVSParser(rcsparse.Sink):
|
||||
skip = skip - 1
|
||||
elif dmatch:
|
||||
# "d" - Delete command
|
||||
start_line = int(dmatch.group(1))
|
||||
count = int(dmatch.group(2))
|
||||
start_line = string.atoi(dmatch.group(1))
|
||||
count = string.atoi(dmatch.group(2))
|
||||
line_count = line_count - count
|
||||
elif amatch:
|
||||
# "a" - Add command
|
||||
start_line = int(amatch.group(1))
|
||||
count = int(amatch.group(2))
|
||||
start_line = string.atoi(amatch.group(1))
|
||||
count = string.atoi(amatch.group(2))
|
||||
skip = count
|
||||
line_count = line_count + count
|
||||
else:
|
||||
@@ -358,8 +359,8 @@ class CVSParser(rcsparse.Sink):
|
||||
dmatch = self.d_command.match(command)
|
||||
amatch = self.a_command.match(command)
|
||||
if dmatch:
|
||||
start_line = int(dmatch.group(1))
|
||||
count = int(dmatch.group(2))
|
||||
start_line = string.atoi(dmatch.group(1))
|
||||
count = string.atoi(dmatch.group(2))
|
||||
temp = []
|
||||
while count > 0:
|
||||
temp.append(revision)
|
||||
@@ -367,8 +368,8 @@ class CVSParser(rcsparse.Sink):
|
||||
self.revision_map = (self.revision_map[:start_line - 1] +
|
||||
temp + self.revision_map[start_line - 1:])
|
||||
elif amatch:
|
||||
start_line = int(amatch.group(1))
|
||||
count = int(amatch.group(2))
|
||||
start_line = string.atoi(amatch.group(1))
|
||||
count = string.atoi(amatch.group(2))
|
||||
del self.revision_map[start_line:start_line + count]
|
||||
skip = count
|
||||
else:
|
||||
@@ -387,15 +388,15 @@ class CVSParser(rcsparse.Sink):
|
||||
dmatch = self.d_command.match(command)
|
||||
amatch = self.a_command.match(command)
|
||||
if dmatch:
|
||||
start_line = int(dmatch.group(1))
|
||||
count = int(dmatch.group(2))
|
||||
start_line = string.atoi(dmatch.group(1))
|
||||
count = string.atoi(dmatch.group(2))
|
||||
adj_begin = start_line + adjust - 1
|
||||
adj_end = start_line + adjust - 1 + count
|
||||
del self.revision_map[adj_begin:adj_end]
|
||||
adjust = adjust - count
|
||||
elif amatch:
|
||||
start_line = int(amatch.group(1))
|
||||
count = int(amatch.group(2))
|
||||
start_line = string.atoi(amatch.group(1))
|
||||
count = string.atoi(amatch.group(2))
|
||||
skip = count
|
||||
temp = []
|
||||
while count > 0:
|
||||
|
@@ -11,6 +11,7 @@
|
||||
# -----------------------------------------------------------------------
|
||||
|
||||
import os
|
||||
import string
|
||||
import re
|
||||
import cStringIO
|
||||
import tempfile
|
||||
@@ -21,8 +22,7 @@ import blame
|
||||
|
||||
### The functionality shared with bincvs should probably be moved to a
|
||||
### separate module
|
||||
from bincvs import BaseCVSRepository, Revision, Tag, _file_log, _log_path, _logsort_date_cmp, _logsort_rev_cmp, _path_join
|
||||
|
||||
from bincvs import BaseCVSRepository, Revision, Tag, _file_log, _log_path, _logsort_date_cmp, _logsort_rev_cmp
|
||||
|
||||
class CCVSRepository(BaseCVSRepository):
|
||||
def dirlogs(self, path_parts, rev, entries, options):
|
||||
@@ -44,7 +44,7 @@ class CCVSRepository(BaseCVSRepository):
|
||||
"""
|
||||
if self.itemtype(path_parts, rev) != vclib.DIR: # does auth-check
|
||||
raise vclib.Error("Path '%s' is not a directory."
|
||||
% (part2path(path_parts)))
|
||||
% (string.join(path_parts, "/")))
|
||||
entries_to_fetch = []
|
||||
for entry in entries:
|
||||
if vclib.check_path_access(self, path_parts + [entry.name], None, rev):
|
||||
@@ -94,7 +94,8 @@ class CCVSRepository(BaseCVSRepository):
|
||||
dictionary of Tag objects for all tags encountered
|
||||
"""
|
||||
if self.itemtype(path_parts, rev) != vclib.FILE: # does auth-check
|
||||
raise vclib.Error("Path '%s' is not a file." % (_path_join(path_parts)))
|
||||
raise vclib.Error("Path '%s' is not a file."
|
||||
% (string.join(path_parts, "/")))
|
||||
|
||||
path = self.rcsfile(path_parts, 1)
|
||||
sink = TreeSink()
|
||||
@@ -119,9 +120,11 @@ class CCVSRepository(BaseCVSRepository):
|
||||
|
||||
def rawdiff(self, path_parts1, rev1, path_parts2, rev2, type, options={}):
|
||||
if self.itemtype(path_parts1, rev1) != vclib.FILE: # does auth-check
|
||||
raise vclib.Error("Path '%s' is not a file." % (_path_join(path_parts1)))
|
||||
raise vclib.Error("Path '%s' is not a file."
|
||||
% (string.join(path_parts1, "/")))
|
||||
if self.itemtype(path_parts2, rev2) != vclib.FILE: # does auth-check
|
||||
raise vclib.Error("Path '%s' is not a file." % (_path_join(path_parts2)))
|
||||
raise vclib.Error("Path '%s' is not a file."
|
||||
% (string.join(path_parts2, "/")))
|
||||
|
||||
temp1 = tempfile.mktemp()
|
||||
open(temp1, 'wb').write(self.openfile(path_parts1, rev1, {})[0].getvalue())
|
||||
@@ -141,7 +144,8 @@ class CCVSRepository(BaseCVSRepository):
|
||||
|
||||
def annotate(self, path_parts, rev=None, include_text=False):
|
||||
if self.itemtype(path_parts, rev) != vclib.FILE: # does auth-check
|
||||
raise vclib.Error("Path '%s' is not a file." % (_path_join(path_parts)))
|
||||
raise vclib.Error("Path '%s' is not a file."
|
||||
% (string.join(path_parts, "/")))
|
||||
source = blame.BlameSource(self.rcsfile(path_parts, 1), rev, include_text)
|
||||
return source, source.revision
|
||||
|
||||
@@ -150,12 +154,13 @@ class CCVSRepository(BaseCVSRepository):
|
||||
|
||||
def openfile(self, path_parts, rev, options):
|
||||
if self.itemtype(path_parts, rev) != vclib.FILE: # does auth-check
|
||||
raise vclib.Error("Path '%s' is not a file." % (_path_join(path_parts)))
|
||||
raise vclib.Error("Path '%s' is not a file."
|
||||
% (string.join(path_parts, "/")))
|
||||
path = self.rcsfile(path_parts, 1)
|
||||
sink = COSink(rev)
|
||||
rcsparse.parse(open(path, 'rb'), sink)
|
||||
revision = sink.last and sink.last.string
|
||||
return cStringIO.StringIO('\n'.join(sink.sstext.text)), revision
|
||||
return cStringIO.StringIO(string.join(sink.sstext.text, "\n")), revision
|
||||
|
||||
class MatchingSink(rcsparse.Sink):
|
||||
"""Superclass for sinks that search for revisions based on tag or number"""
|
||||
@@ -294,18 +299,18 @@ class TreeSink(rcsparse.Sink):
|
||||
deled = 0
|
||||
if self.head != revision:
|
||||
changed = 1
|
||||
lines = text.split('\n')
|
||||
lines = string.split(text, '\n')
|
||||
idx = 0
|
||||
while idx < len(lines):
|
||||
command = lines[idx]
|
||||
dmatch = self.d_command.match(command)
|
||||
idx = idx + 1
|
||||
if dmatch:
|
||||
deled = deled + int(dmatch.group(2))
|
||||
deled = deled + string.atoi(dmatch.group(2))
|
||||
else:
|
||||
amatch = self.a_command.match(command)
|
||||
if amatch:
|
||||
count = int(amatch.group(2))
|
||||
count = string.atoi(amatch.group(2))
|
||||
added = added + count
|
||||
idx = idx + count
|
||||
elif command:
|
||||
@@ -321,12 +326,12 @@ class StreamText:
|
||||
a_command = re.compile('^a(\d+)\\s(\\d+)')
|
||||
|
||||
def __init__(self, text):
|
||||
self.text = text.split('\n')
|
||||
self.text = string.split(text, "\n")
|
||||
|
||||
def command(self, cmd):
|
||||
adjust = 0
|
||||
add_lines_remaining = 0
|
||||
diffs = cmd.split('\n')
|
||||
diffs = string.split(cmd, "\n")
|
||||
if diffs[-1] == "":
|
||||
del diffs[-1]
|
||||
if len(diffs) == 0:
|
||||
@@ -344,22 +349,22 @@ class StreamText:
|
||||
amatch = self.a_command.match(command)
|
||||
if dmatch:
|
||||
# "d" - Delete command
|
||||
start_line = int(dmatch.group(1))
|
||||
count = int(dmatch.group(2))
|
||||
start_line = string.atoi(dmatch.group(1))
|
||||
count = string.atoi(dmatch.group(2))
|
||||
begin = start_line + adjust - 1
|
||||
del self.text[begin:begin + count]
|
||||
adjust = adjust - count
|
||||
elif amatch:
|
||||
# "a" - Add command
|
||||
start_line = int(amatch.group(1))
|
||||
count = int(amatch.group(2))
|
||||
start_line = string.atoi(amatch.group(1))
|
||||
count = string.atoi(amatch.group(2))
|
||||
add_lines_remaining = count
|
||||
else:
|
||||
raise RuntimeError, 'Error parsing diff commands'
|
||||
|
||||
def secondnextdot(s, start):
|
||||
# find the position the second dot after the start index.
|
||||
return s.find('.', s.find('.', start) + 1)
|
||||
return string.find(s, '.', string.find(s, '.', start) + 1)
|
||||
|
||||
|
||||
class COSink(MatchingSink):
|
||||
|
@@ -10,17 +10,8 @@
|
||||
#
|
||||
# -----------------------------------------------------------------------
|
||||
|
||||
"""This package provides parsing tools for RCS files.
|
||||
"""This package provides parsing tools for RCS files."""
|
||||
|
||||
To use this package, first create a subclass of Sink. This should
|
||||
declare all the callback methods you care about. Create an instance
|
||||
of your class, and open() the RCS file you want to read. Then call
|
||||
parse() to parse the file.
|
||||
"""
|
||||
|
||||
# Make the "Sink" class and the various exception classes visible in this
|
||||
# scope. That way, applications never need to import any of the
|
||||
# sub-packages.
|
||||
from common import *
|
||||
|
||||
try:
|
||||
@@ -32,13 +23,4 @@ except ImportError:
|
||||
from default import Parser
|
||||
|
||||
def parse(file, sink):
|
||||
"""Parse an RCS file.
|
||||
|
||||
Parameters: FILE is the file object to parse. (I.e. an object of the
|
||||
built-in Python type "file", usually created using Python's built-in
|
||||
"open()" function). It should be opened in binary mode.
|
||||
SINK is an instance of (some subclass of) Sink. It's methods will be
|
||||
called as the file is parsed; see the definition of Sink for the
|
||||
details.
|
||||
"""
|
||||
return Parser().parse(file, sink)
|
||||
|
@@ -16,199 +16,52 @@ import calendar
|
||||
import string
|
||||
|
||||
class Sink:
|
||||
"""Interface to be implemented by clients. The RCS parser calls this as
|
||||
it parses the RCS file.
|
||||
|
||||
All these methods have stub implementations that do nothing, so you only
|
||||
have to override the callbacks that you care about.
|
||||
"""
|
||||
def set_head_revision(self, revision):
|
||||
"""Reports the head revision for this RCS file.
|
||||
|
||||
This is the value of the 'head' header in the admin section of the RCS
|
||||
file. This function can only be called before admin_completed().
|
||||
|
||||
Parameter: REVISION is a string containing a revision number. This is
|
||||
an actual revision number, not a branch number.
|
||||
"""
|
||||
pass
|
||||
|
||||
def set_principal_branch(self, branch_name):
|
||||
"""Reports the principal branch for this RCS file. This is only called
|
||||
if the principal branch is not trunk.
|
||||
|
||||
This is the value of the 'branch' header in the admin section of the RCS
|
||||
file. This function can only be called before admin_completed().
|
||||
|
||||
Parameter: BRANCH_NAME is a string containing a branch number. If this
|
||||
function is called, the parameter is typically "1.1.1", indicating the
|
||||
vendor branch.
|
||||
"""
|
||||
pass
|
||||
|
||||
def set_access(self, accessors):
|
||||
"""Reports the access control list for this RCS file. This function is
|
||||
only called if the ACL is set. If this function is not called then
|
||||
there is no ACL and all users are allowed access.
|
||||
|
||||
This is the value of the 'access' header in the admin section of the RCS
|
||||
file. This function can only be called before admin_completed().
|
||||
|
||||
Parameter: ACCESSORS is a list of strings. Each string is a username.
|
||||
The user is allowed access if and only if their username is in the list,
|
||||
OR the user owns the RCS file on disk, OR the user is root.
|
||||
|
||||
Note that CVS typically doesn't use this field.
|
||||
"""
|
||||
pass
|
||||
|
||||
def define_tag(self, name, revision):
|
||||
"""Reports a tag or branch definition. This function will be called
|
||||
once for each tag or branch.
|
||||
|
||||
This is taken from the 'symbols' header in the admin section of the RCS
|
||||
file. This function can only be called before admin_completed().
|
||||
|
||||
Parameters: NAME is a string containing the tag or branch name.
|
||||
REVISION is a string containing a revision number. This may be
|
||||
an actual revision number (for a tag) or a branch number.
|
||||
|
||||
The revision number consists of a number of decimal components separated
|
||||
by dots. There are three common forms. If there are an odd number of
|
||||
components, it's a branch. Otherwise, if the next-to-last component is
|
||||
zero, it's a branch (and the next-to-last component is an artifact of
|
||||
CVS and should not be shown to the user). Otherwise, it's a tag.
|
||||
|
||||
This function is called in the order that the tags appear in the RCS
|
||||
file header. For CVS, this appears to be in reverse chronological
|
||||
order of tag/branch creation.
|
||||
"""
|
||||
pass
|
||||
|
||||
def set_locker(self, revision, locker):
|
||||
"""Reports a lock on this RCS file. This function will be called once
|
||||
for each lock.
|
||||
|
||||
This is taken from the 'locks' header in the admin section of the RCS
|
||||
file. This function can only be called before admin_completed().
|
||||
|
||||
Parameters: REVISION is a string containing a revision number. This is
|
||||
an actual revision number, not a branch number.
|
||||
LOCKER is a string containing a username.
|
||||
"""
|
||||
pass
|
||||
|
||||
def set_locking(self, mode):
|
||||
"""Signals strict locking mode. This function will be called if and
|
||||
only if the RCS file is in strict locking mode.
|
||||
"""Used to signal locking mode.
|
||||
|
||||
This is taken from the 'strict' header in the admin section of the RCS
|
||||
file. This function can only be called before admin_completed().
|
||||
Called with mode argument 'strict' if strict locking
|
||||
Not called when no locking used."""
|
||||
|
||||
Parameters: MODE is always the string 'strict'.
|
||||
"""
|
||||
pass
|
||||
|
||||
def set_comment(self, comment):
|
||||
"""Reports the comment for this RCS file.
|
||||
|
||||
This is the value of the 'comment' header in the admin section of the
|
||||
RCS file. This function can only be called before admin_completed().
|
||||
|
||||
Parameter: COMMENT is a string containing the comment. This may be
|
||||
multi-line.
|
||||
|
||||
This field does not seem to be used by CVS.
|
||||
"""
|
||||
pass
|
||||
|
||||
def set_expansion(self, mode):
|
||||
"""Reports the keyword expansion mode for this RCS file.
|
||||
|
||||
This is the value of the 'expand' header in the admin section of the
|
||||
RCS file. This function can only be called before admin_completed().
|
||||
|
||||
Parameter: MODE is a string containing the keyword expansion mode.
|
||||
Possible values include 'o' and 'b', amongst others.
|
||||
"""
|
||||
pass
|
||||
|
||||
def admin_completed(self):
|
||||
"""Reports that the initial RCS header has been parsed. This function is
|
||||
called exactly once.
|
||||
"""
|
||||
pass
|
||||
|
||||
def define_revision(self, revision, timestamp, author, state,
|
||||
branches, next):
|
||||
"""Reports metadata about a single revision.
|
||||
|
||||
This function is called for each revision. It is called later than
|
||||
admin_completed() and earlier than tree_completed().
|
||||
|
||||
Parameter: REVISION is a revision number, as a string. This is an
|
||||
actual revision number, not a branch number.
|
||||
TIMESTAMP is the date and time that the revision was created, as an
|
||||
integer number of seconds since the epoch. (I.e. "UNIX time" format).
|
||||
AUTHOR is the author name, as a string.
|
||||
STATE is the state of the revision, as a string. Common values are
|
||||
"Exp" and "dead".
|
||||
BRANCHES is a list of strings, with each string being an actual
|
||||
revision number (not a branch number). For each branch which is based
|
||||
on this revision and has commits, the revision number of the first
|
||||
branch commit is listed here.
|
||||
NEXT is either None or a string representing an actual revision number
|
||||
(not a branch number).
|
||||
|
||||
When on trunk, NEXT points to what humans might consider to be the
|
||||
'previous' revision number. For example, 1.3's NEXT is 1.2.
|
||||
However, on a branch, NEXT really does point to what humans would
|
||||
consider to be the 'next' revision number. For example, 1.1.2.1's
|
||||
NEXT would be 1.1.2.2.
|
||||
In other words, NEXT always means "where to find the next deltatext
|
||||
that you need this revision to retrieve".
|
||||
"""
|
||||
pass
|
||||
|
||||
def tree_completed(self):
|
||||
"""Reports that the RCS revision tree has been parsed. This function is
|
||||
called exactly once. This function will be called later than
|
||||
admin_completed().
|
||||
"""
|
||||
pass
|
||||
|
||||
def set_description(self, description):
|
||||
"""Reports the description from the RCS file. This is set using the
|
||||
"-m" flag to "cvs add". However, many CVS users don't use that option,
|
||||
so this is often empty.
|
||||
|
||||
This function is called once, after tree_completed().
|
||||
|
||||
Parameter: DESCRIPTION is a string containing the description. This may
|
||||
be multi-line.
|
||||
"""
|
||||
pass
|
||||
|
||||
def set_revision_info(self, revision, log, text):
|
||||
"""Reports the log message and contents of a CVS revision.
|
||||
|
||||
This function is called for each revision. It is called later than
|
||||
set_description().
|
||||
|
||||
Parameters: REVISION is a string containing the actual revision number.
|
||||
LOG is a string containing the log message. This may be multi-line.
|
||||
TEXT is the contents of the file in this revision, either as full-text or
|
||||
as a diff. This is usually multi-line, and often quite large and/or
|
||||
binary.
|
||||
"""
|
||||
pass
|
||||
|
||||
def parse_completed(self):
|
||||
"""Reports that parsing an RCS file is complete.
|
||||
|
||||
This function is called once. After it is called, no more calls will be
|
||||
made via this interface.
|
||||
"""
|
||||
pass
|
||||
|
||||
|
||||
@@ -356,7 +209,7 @@ class _Parser:
|
||||
date = self.ts.get()
|
||||
self.ts.match(';')
|
||||
|
||||
# Convert date into standard UNIX time format (seconds since epoch)
|
||||
# Convert date into timestamp
|
||||
date_fields = string.split(date, '.')
|
||||
# According to rcsfile(5): the year "contains just the last two
|
||||
# digits of the year for years from 1900 through 1999, and all the
|
||||
@@ -366,11 +219,8 @@ class _Parser:
|
||||
date_fields = map(string.atoi, date_fields)
|
||||
EPOCH = 1970
|
||||
if date_fields[0] < EPOCH:
|
||||
raise ValueError, 'invalid year for revision %s' % (revision,)
|
||||
try:
|
||||
timestamp = calendar.timegm(tuple(date_fields) + (0, 0, 0,))
|
||||
except ValueError, e:
|
||||
raise ValueError, 'invalid date for revision %s: %s' % (revision, e,)
|
||||
raise ValueError, 'invalid year'
|
||||
timestamp = calendar.timegm(tuple(date_fields) + (0, 0, 0,))
|
||||
|
||||
# Parse author
|
||||
### NOTE: authors containing whitespace are violations of the
|
||||
@@ -406,7 +256,6 @@ class _Parser:
|
||||
# group 15;
|
||||
# permissions 644;
|
||||
# hardlinks @configure.in@;
|
||||
# commitid mLiHw3bulRjnTDGr;
|
||||
# this is "newphrase" in RCSFILE(5). we just want to skip over these.
|
||||
while 1:
|
||||
token = self.ts.get()
|
||||
@@ -450,15 +299,6 @@ class _Parser:
|
||||
self.sink.set_revision_info(revision, log, text)
|
||||
|
||||
def parse(self, file, sink):
|
||||
"""Parse an RCS file.
|
||||
|
||||
Parameters: FILE is the file object to parse. (I.e. an object of the
|
||||
built-in Python type "file", usually created using Python's built-in
|
||||
"open()" function).
|
||||
SINK is an instance of (some subclass of) Sink. It's methods will be
|
||||
called as the file is parsed; see the definition of Sink for the
|
||||
details.
|
||||
"""
|
||||
self.ts = self.stream_class(file)
|
||||
self.sink = sink
|
||||
|
||||
|
@@ -15,6 +15,7 @@
|
||||
import vclib
|
||||
import sys
|
||||
import os
|
||||
import string
|
||||
import re
|
||||
import tempfile
|
||||
import time
|
||||
@@ -149,7 +150,7 @@ class LogCollector:
|
||||
if changed_path != self.path:
|
||||
# If a parent of our path was copied, our "next previous"
|
||||
# (huh?) path will exist elsewhere (under the copy source).
|
||||
if (self.path.rfind(changed_path) == 0) and \
|
||||
if (string.rfind(self.path, changed_path) == 0) and \
|
||||
self.path[len(changed_path)] == '/':
|
||||
change = paths[changed_path]
|
||||
if change.copyfrom_path:
|
||||
@@ -484,7 +485,7 @@ class RemoteSubversionRepository(vclib.Repository):
|
||||
return dirent.size
|
||||
|
||||
def _getpath(self, path_parts):
|
||||
return '/'.join(path_parts)
|
||||
return string.join(path_parts, '/')
|
||||
|
||||
def _getrev(self, rev):
|
||||
if rev is None or rev == 'HEAD':
|
||||
|
@@ -15,7 +15,9 @@
|
||||
import vclib
|
||||
import os
|
||||
import os.path
|
||||
import string
|
||||
import cStringIO
|
||||
import signal
|
||||
import time
|
||||
import tempfile
|
||||
import popen
|
||||
@@ -55,12 +57,12 @@ def _allow_all(root, path, pool):
|
||||
|
||||
|
||||
def _path_parts(path):
|
||||
return filter(None, path.split('/'))
|
||||
return filter(None, string.split(path, '/'))
|
||||
|
||||
|
||||
def _cleanup_path(path):
|
||||
"""Return a cleaned-up Subversion filesystem path"""
|
||||
return '/'.join(_path_parts(path))
|
||||
return string.join(_path_parts(path), '/')
|
||||
|
||||
|
||||
def _fs_path_join(base, relative):
|
||||
@@ -116,7 +118,7 @@ def _rootpath2url(rootpath, path):
|
||||
rootpath = os.path.abspath(rootpath)
|
||||
drive, rootpath = os.path.splitdrive(rootpath)
|
||||
if os.sep != '/':
|
||||
rootpath = rootpath.replace(os.sep, '/')
|
||||
rootpath = string.replace(rootpath, os.sep, '/')
|
||||
rootpath = urllib.quote(rootpath)
|
||||
path = urllib.quote(path)
|
||||
if drive:
|
||||
@@ -197,7 +199,7 @@ class NodeHistory:
|
||||
test_path = path
|
||||
found = 0
|
||||
while 1:
|
||||
off = test_path.rfind('/')
|
||||
off = string.rfind(test_path, '/')
|
||||
if off < 0:
|
||||
break
|
||||
test_path = test_path[0:off]
|
||||
@@ -356,6 +358,7 @@ class LocalSubversionRepository(vclib.Repository):
|
||||
self.rootpath = rootpath
|
||||
self.name = name
|
||||
self.auth = authorizer
|
||||
self.svn_client_path = utilities.svn or 'svn'
|
||||
self.diff_cmd = utilities.diff or 'diff'
|
||||
self.config_dir = config_dir or None
|
||||
|
||||
@@ -364,6 +367,22 @@ class LocalSubversionRepository(vclib.Repository):
|
||||
raise vclib.ReposNotFound(name)
|
||||
|
||||
def open(self):
|
||||
# Register a handler for SIGTERM so we can have a chance to
|
||||
# cleanup. If ViewVC takes too long to start generating CGI
|
||||
# output, Apache will grow impatient and SIGTERM it. While we
|
||||
# don't mind getting told to bail, we want to gracefully close the
|
||||
# repository before we bail.
|
||||
def _sigterm_handler(signum, frame, self=self):
|
||||
sys.exit(-1)
|
||||
try:
|
||||
signal.signal(signal.SIGTERM, _sigterm_handler)
|
||||
except ValueError:
|
||||
# This is probably "ValueError: signal only works in main
|
||||
# thread", which will get thrown by the likes of mod_python
|
||||
# when trying to install a signal handler from a thread that
|
||||
# isn't the main one. We'll just not care.
|
||||
pass
|
||||
|
||||
# Open the repository and init some other variables.
|
||||
self.repos = repos.svn_repos_open(self.rootpath)
|
||||
self.fs_ptr = repos.svn_repos_fs(self.repos)
|
||||
@@ -816,7 +835,7 @@ class LocalSubversionRepository(vclib.Repository):
|
||||
return rev_paths
|
||||
|
||||
def _getpath(self, path_parts):
|
||||
return '/'.join(path_parts)
|
||||
return string.join(path_parts, '/')
|
||||
|
||||
def _getrev(self, rev):
|
||||
if rev is None or rev == 'HEAD':
|
||||
|
689
lib/viewvc.py
@@ -14,7 +14,7 @@
|
||||
#
|
||||
# -----------------------------------------------------------------------
|
||||
|
||||
import os, sys, traceback, thread
|
||||
import os, sys, traceback, string, thread
|
||||
try:
|
||||
import win32api
|
||||
except ImportError, e:
|
||||
@@ -40,9 +40,9 @@ def CommandLine(command, args):
|
||||
"""Convert an executable path and a sequence of arguments into a command
|
||||
line that can be passed to CreateProcess"""
|
||||
|
||||
cmd = "\"" + command.replace("\"", "\"\"") + "\""
|
||||
cmd = "\"" + string.replace(command, "\"", "\"\"") + "\""
|
||||
for arg in args:
|
||||
cmd = cmd + " \"" + arg.replace("\"", "\"\"") + "\""
|
||||
cmd = cmd + " \"" + string.replace(arg, "\"", "\"\"") + "\""
|
||||
return cmd
|
||||
|
||||
def CreateProcess(cmd, hStdInput, hStdOutput, hStdError):
|
||||
@@ -109,13 +109,13 @@ def CreatePipe(readInheritable, writeInheritable):
|
||||
|
||||
def File2FileObject(pipe, mode):
|
||||
"""Make a C stdio file object out of a win32 file handle"""
|
||||
if mode.find('r') >= 0:
|
||||
if string.find(mode, 'r') >= 0:
|
||||
wmode = os.O_RDONLY
|
||||
elif mode.find('w') >= 0:
|
||||
elif string.find(mode, 'w') >= 0:
|
||||
wmode = os.O_WRONLY
|
||||
if mode.find('b') >= 0:
|
||||
if string.find(mode, 'b') >= 0:
|
||||
wmode = wmode | os.O_BINARY
|
||||
if mode.find('t') >= 0:
|
||||
if string.find(mode, 't') >= 0:
|
||||
wmode = wmode | os.O_TEXT
|
||||
return os.fdopen(msvcrt.open_osfhandle(pipe.Detach(),wmode),mode)
|
||||
|
||||
|
@@ -1,42 +1,9 @@
|
||||
RELEASE MANAGEMENT
|
||||
RELEASE MANAGEMENT
|
||||
|
||||
ViewVC rolls releases from release branches associate with each minor
|
||||
version of the software. For example, the 1.1.0 is rolled from the
|
||||
1.1.x branch. The same is true for the 1.1.1, 1.1.2, ... releases.
|
||||
|
||||
|
||||
A. Creating Release Branches
|
||||
============================
|
||||
|
||||
Primary ViewVC development occurs on the trunk, with bugfixes and
|
||||
compatible features being backported to release branches as
|
||||
appropriate. When, however, the need arises to create a new release
|
||||
branch, here's the process (M, N, X, and Y below represent integral
|
||||
major, minor, and patch version numbers, and are not literal):
|
||||
|
||||
1. Create the release branch as a copy of the trunk@HEAD (the
|
||||
lower-case "x" in the branch name is literal):
|
||||
|
||||
svn cp -m "Branch for X.Y release stabilization." . ^/branches/X.Y.x
|
||||
|
||||
2. On the trunk, update the following files to reflect the new
|
||||
version which trunk will be progressing towards:
|
||||
|
||||
CHANGES: Add stub section for new release.
|
||||
INSTALL: Update example configuration.
|
||||
lib/viewvc.py: Update "__version__" value.
|
||||
docs/upgrading-howto.html: Add stub section for new release.
|
||||
docs/template-authoring-guide.html: Update to reflect new release.
|
||||
docs/release-notes/M.N.0.html: Add a new stub file.
|
||||
|
||||
Commit these changes:
|
||||
|
||||
svn ci -m "Trunk is now progressing toward version M.N."
|
||||
|
||||
|
||||
B. Publishing Releases
|
||||
======================
|
||||
|
||||
There is a script, `tools/make-release', which creates a release
|
||||
directory and the various archive files that we distribute. All other
|
||||
steps required to get a ViewVC release out of the door require manual
|
||||
@@ -46,17 +13,16 @@ follows:
|
||||
Checkout a working copy of the release branch for the release you
|
||||
intend to roll, and in that working copy, perform the following steps
|
||||
(X, Y, and Z below represent integral major, minor, and patch version
|
||||
numbers, and are not literal):
|
||||
numbers, and not literal):
|
||||
|
||||
1. Review any open bug reports:
|
||||
|
||||
http://viewvc.tigris.org/servlets/ProjectIssues
|
||||
|
||||
2. Ensure that the file 'docs/upgrading.html' describes all user
|
||||
visible changes for users of previous releases of ViewVC. (Any
|
||||
changes here should be made on the trunk and backported to the
|
||||
branch.) NOTE: This step should not be necessary for patch
|
||||
releases.
|
||||
2. Add a new subsection to the file 'docs/upgrading.html' describing
|
||||
all user visible changes for users of previous releases of ViewVC.
|
||||
Commit any modifications. NOTE: This step should not be necessary
|
||||
for patch releases.
|
||||
|
||||
3. Verify that copyright years are correct in both the license-1.html
|
||||
file and the source code.
|
||||
|
@@ -1,107 +0,0 @@
|
||||
-*- text -*-
|
||||
|
||||
This document carries some design thoughts regarding the solution of
|
||||
Issue #439[1] ("allow svn repositories to reside in web-navigable
|
||||
subdirectories")
|
||||
|
||||
[1] http://viewvc.tigris.org/issues/show_bug.cgi?id=439
|
||||
|
||||
|
||||
INTRODUCTION
|
||||
============
|
||||
|
||||
Many folks have expressed the desire that ViewVC expose its configured
|
||||
roots at more or less arbitrary virtual paths below the ViewVC root
|
||||
URL. An example might explain this better.
|
||||
|
||||
Say you have a ViewVC instance configured with roots like so:
|
||||
|
||||
# path vc
|
||||
# ------------ ---
|
||||
root_parents = /var/cvs/old : cvs,
|
||||
/var/svn/dev : svn,
|
||||
/var/svn/qa : svn,
|
||||
|
||||
and say that each of these root parents has a few roots whose names
|
||||
begin with the basenames of the parent directory ("dev-tools" lives in
|
||||
"/var/svn/dev", "old-docs" lives in "/var/cvs/old", etc.)
|
||||
|
||||
Today, ViewVC will display all those roots in the "root listing" view
|
||||
as if they are siblings:
|
||||
|
||||
old-docs/
|
||||
old-src/
|
||||
dev-build/
|
||||
dev-libs/
|
||||
dev-tools/
|
||||
qa-scripts/
|
||||
qa-utils/
|
||||
|
||||
In other words, any heirarchy which might exist in the on-disk
|
||||
locations of the roots, or (in the Subversion case) in the
|
||||
version-control system itself, is flattened.
|
||||
|
||||
But sometimes you might want to preserve -- or even introduce -- some
|
||||
heirarchy in those roots, exposed to the users. For example, you
|
||||
might wish that instead of a single "root listing" view, ViewVC
|
||||
instead presented users with a navigable tree constructed from paths
|
||||
configured by the admin. For example, imagine if each root_parent
|
||||
item also carried an "exposure path" bit of configuration:
|
||||
|
||||
# path vc exposure-path
|
||||
# ------------ --- -------------
|
||||
root_parents = /var/cvs/old : cvs : old,
|
||||
/var/svn/dev : svn : current/dev,
|
||||
/var/svn/qa : svn : current/qa,
|
||||
|
||||
A visit to ViewVC's root URL would then show:
|
||||
|
||||
old/
|
||||
current/
|
||||
|
||||
Clicking into "old/", you'd see:
|
||||
|
||||
old-docs/
|
||||
old-src/
|
||||
|
||||
Alternatively, clicking into "current/" would show:
|
||||
|
||||
dev/
|
||||
qa/
|
||||
|
||||
...and so on.
|
||||
|
||||
In fact, you'd have a virtual heirarchy like so:
|
||||
|
||||
/
|
||||
old/
|
||||
old-docs/ => CVS root at /var/cvs/old/docs
|
||||
old-src/ => CVS root at /var/cvs/old/src
|
||||
current/
|
||||
dev/
|
||||
dev-build/ => SVN root at /var/svn/dev/dev-build
|
||||
dev-libs/ => SVN root at /var/svn/dev/dev-libs
|
||||
dev-tools/ => SVN root at /var/svn/dev/dev-tools
|
||||
qa/
|
||||
qa-scripts/ => SVN root at /var/svn/qa/qa-scripts
|
||||
qa-utils/ => SVN root at /var/svn/qa/qa-utils
|
||||
|
||||
|
||||
CHALLENGES
|
||||
==========
|
||||
|
||||
* Merely tacking on a new "exposure path" item in the definition of
|
||||
the root_parents, cvs_roots, and svn_roots seems clunky. It also
|
||||
limits the the granularity of control: you couldn't assign
|
||||
different locations to the various roots that live within a single
|
||||
root parent path. Finally, the current code is banking on there
|
||||
being only a single colon (:) separator (since those might legally
|
||||
appear in Windows on-disk paths). That might create a bit of a
|
||||
compatibility annoyance.
|
||||
|
||||
* What do you do about root_as_url_component=0? I guess this feature
|
||||
is just simply unavailable in that case.
|
||||
|
||||
* Do you continue to allow cvs_roots and svn_roots members to specify
|
||||
a root name, or does the root name concept go away entirely in light
|
||||
of the new exposure path concept?
|
@@ -1,63 +0,0 @@
|
||||
[# setup page definitions]
|
||||
[define page_title]Diff of /[where][end]
|
||||
[define help_href][docroot]/help_rootview.html[end]
|
||||
[# end]
|
||||
|
||||
[include "include/header.ezt" "diff"]
|
||||
[include "include/file_header.ezt"]
|
||||
|
||||
[if-any diffs]
|
||||
[for diffs]
|
||||
[include "include/diff_display.ezt"]
|
||||
[end]
|
||||
[end]
|
||||
|
||||
<hr style="margin-top:1em;" />
|
||||
|
||||
<table cellpadding="10" class="auto">
|
||||
<tr>
|
||||
<td>
|
||||
<form method="get" action="[diff_format_action]">
|
||||
<div>
|
||||
[for diff_format_hidden_values]<input type="hidden" name="[diff_format_hidden_values.name]" value="[diff_format_hidden_values.value]"/>[end]
|
||||
<select name="diff_format" onchange="submit()">
|
||||
<option value="h" [is diff_format "h"]selected="selected"[end]>Colored Diff</option>
|
||||
<option value="l" [is diff_format "l"]selected="selected"[end]>Long Colored Diff</option>
|
||||
<option value="f" [is diff_format "f"]selected="selected"[end]>Full Colored Diff</option>
|
||||
<option value="u" [is diff_format "u"]selected="selected"[end]>Unidiff</option>
|
||||
<option value="c" [is diff_format "c"]selected="selected"[end]>Context Diff</option>
|
||||
<option value="s" [is diff_format "s"]selected="selected"[end]>Side by Side</option>
|
||||
</select>
|
||||
<input type="submit" value="Show" />
|
||||
</div>
|
||||
</form>
|
||||
</td>
|
||||
<td>
|
||||
[if-any hide_legend]
|
||||
|
||||
[else]
|
||||
<table style="border:solid gray 1px;" class="auto">
|
||||
<tr>
|
||||
<td>Legend:<br />
|
||||
<table cellspacing="0" cellpadding="1">
|
||||
<tr>
|
||||
<td style="text-align:center;" class="vc_diff_remove">Removed lines/characters</td>
|
||||
<td class="vc_diff_empty"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="text-align:center;" colspan="2" class="vc_diff_change">Changed lines/characters</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="vc_diff_empty"> </td>
|
||||
<td style="text-align:center;" class="vc_diff_add">Added lines/characters</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
[end]
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
[include "include/footer.ezt"]
|
@@ -1,92 +0,0 @@
|
||||
[# setup page definitions]
|
||||
[define page_title]Graph of /[where][end]
|
||||
[define help_href][docroot]/help_rootview.html[end]
|
||||
[# end]
|
||||
|
||||
[include "include/header.ezt" "graph"]
|
||||
[include "include/file_header.ezt"]
|
||||
|
||||
<hr />
|
||||
|
||||
<div style="text-align:center;">
|
||||
[imagemap]
|
||||
<img usemap="#MyMapName"
|
||||
src="[imagesrc]"
|
||||
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"]
|
@@ -1,235 +0,0 @@
|
||||
[is diffs.diff_block_format "anchor"]
|
||||
<p id="[diffs.anchor]"/>
|
||||
[else]
|
||||
[define msg_no_changes]<br/><strong>- No changes -</strong><br/> [end]
|
||||
[define msg_binary]<br/><strong>- Binary content differs -</strong><br/> [end]
|
||||
[define msg_error]<br/><strong>- ViewVC depends on rcsdiff and GNU diff to create this page. ViewVC cannot find GNU diff.
|
||||
Even if you have GNU diff installed, the rcsdiff program must be configured and compiled with the GNU
|
||||
diff location. -</strong><br/> [end]
|
||||
|
||||
[define left_view_href][if-any diffs.left.prefer_markup][diffs.left.view_href][else][if-any diffs.left.download_href][diffs.left.download_href][end][end][end]
|
||||
[define right_view_href][if-any diffs.right.prefer_markup][diffs.right.view_href][else][if-any diffs.right.download_href][diffs.right.download_href][end][end][end]
|
||||
|
||||
[define left_header][is diffs.left.path diffs.right.path][else][diffs.left.path]<br/>[end]
|
||||
[if-any diffs.propname]Property: <em>[diffs.propname]</em><br/>[end]
|
||||
Revision [if-any left_view_href]<a href="[left_view_href]">[end][diffs.left.rev][if-any left_view_href]</a>[end][if-any diffs.left.author] by <em>[diffs.left.author]</em>[end],
|
||||
[diffs.left.date]
|
||||
[if-any diffs.left.tag]<br/>Tag: [diffs.left.tag][end][end]
|
||||
|
||||
[define right_header][is diffs.right.path diffs.left.path][else][diffs.right.path]<br/>[end]
|
||||
[if-any diffs.propname]Property: <em>[diffs.propname]</em><br/>[end]
|
||||
Revision [if-any right_view_href]<a href="[right_view_href]">[end][diffs.right.rev][if-any right_view_href]</a>[end][if-any diffs.right.author] by <em>[diffs.right.author]</em>[end],
|
||||
[diffs.right.date]
|
||||
[if-any diffs.right.tag]<br/>Tag: [diffs.right.tag][end][end]
|
||||
[end]
|
||||
|
||||
[is diffs.diff_block_format "raw"]
|
||||
<table cellspacing="0" cellpadding="0" style="margin-top: 1em;">
|
||||
<tr class="vc_diff_header">
|
||||
<th style="width:5%"> </th><th style="width:95%; text-align:left;">[left_header]</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<th colspan="2" style="text-align:left;">vs.</th>
|
||||
</tr>
|
||||
<tr class="vc_diff_header">
|
||||
<th style="width:5%"> </th><th style="width:95%; text-align:left;">[right_header]</th>
|
||||
</tr>
|
||||
[is diffs.changes.type "no-changes"]
|
||||
<tr class="vc_diff_empty">
|
||||
<td colspan="2" style="text-align:center;">[msg_no_changes]</td>
|
||||
</tr>
|
||||
[else]
|
||||
[is diffs.changes.type "binary-diff"]
|
||||
<tr class="vc_diff_empty">
|
||||
<td colspan="2" style="text-align:center;">[msg_binary]</td>
|
||||
</tr>
|
||||
[else]
|
||||
<tr><td colspan="2"><pre class="vc_raw_diff">[diffs.changes.raw]</pre></td></tr>
|
||||
[end]
|
||||
[end]
|
||||
</table>
|
||||
[end]
|
||||
|
||||
[is diffs.diff_block_format "sidebyside-1"]
|
||||
<table cellspacing="0" cellpadding="0" style="margin-top: 1em;">
|
||||
<tr class="vc_diff_header">
|
||||
<th style="width:6%;"></th>
|
||||
<th style="width:47%; vertical-align:top;">[left_header]</th>
|
||||
<th style="width:47%; vertical-align:top;">[right_header]</th>
|
||||
</tr>
|
||||
|
||||
[for diffs.changes]
|
||||
[is diffs.changes.type "header"]
|
||||
<tr class="vc_diff_chunk_header" id="h[diffs.changes.line_info_right]">
|
||||
<td style="width:6%;"><strong>#</strong></td>
|
||||
<td style="width:47%;">
|
||||
<strong>Line [diffs.changes.line_info_left]</strong>
|
||||
<span class="vc_diff_chunk_extra">[diffs.changes.line_info_extra]</span>
|
||||
</td>
|
||||
<td style="width:47%;">
|
||||
<strong>Line [diffs.changes.line_info_right]</strong>
|
||||
<span class="vc_diff_chunk_extra">[diffs.changes.line_info_extra]</span>
|
||||
</td>
|
||||
</tr>
|
||||
[else]
|
||||
[is diffs.changes.type "add"]
|
||||
<tr>
|
||||
<td class="vc_diff_line_number" id="l[diffs.changes.line_number]">[if-any diffs.right.annotate_href]<a href="[diffs.right.annotate_href]#l[diffs.changes.line_number]">[diffs.changes.line_number]</a>[else][diffs.changes.line_number][end]</td>
|
||||
<td class="vc_diff_empty"> </td>
|
||||
<td class="vc_diff_add"> [diffs.changes.right]</td>
|
||||
</tr>
|
||||
[else]
|
||||
[is diffs.changes.type "remove"]
|
||||
<tr>
|
||||
<td></td>
|
||||
<td class="vc_diff_remove"> [diffs.changes.left]</td>
|
||||
<td class="vc_diff_empty"> </td>
|
||||
</tr>
|
||||
[else]
|
||||
[is diffs.changes.type "change"]
|
||||
<tr>
|
||||
[if-any diffs.changes.have_right]
|
||||
<td class="vc_diff_line_number" id="l[diffs.changes.line_number]">[if-any diffs.right.annotate_href]<a href="[diffs.right.annotate_href]#l[diffs.changes.line_number]">[diffs.changes.line_number]</a>[else][diffs.changes.line_number][end]</td>
|
||||
[else]
|
||||
<td></td>
|
||||
[end]
|
||||
[if-any diffs.changes.have_left]
|
||||
<td class="vc_diff_change"> [diffs.changes.left]</td>
|
||||
[else]
|
||||
<td class="vc_diff_change_empty"> </td>
|
||||
[end]
|
||||
[if-any diffs.changes.have_right]
|
||||
<td class="vc_diff_change"> [diffs.changes.right]</td>
|
||||
[else]
|
||||
<td class="vc_diff_change_empty"> </td>
|
||||
[end]
|
||||
</tr>
|
||||
[else]
|
||||
[is diffs.changes.type "no-changes"]
|
||||
<tr>
|
||||
<td colspan="3"> </td>
|
||||
</tr>
|
||||
<tr class="vc_diff_empty">
|
||||
<td colspan="3" style="text-align:center;">[msg_no_changes]</td>
|
||||
</tr>
|
||||
[else]
|
||||
[is diffs.changes.type "binary-diff"]
|
||||
<tr>
|
||||
<td colspan="3"> </td>
|
||||
</tr>
|
||||
<tr class="vc_diff_empty">
|
||||
<td colspan="3" style="text-align:center;">[msg_binary]</td>
|
||||
</tr>
|
||||
[else]
|
||||
[is diffs.changes.type "error"]
|
||||
<tr>
|
||||
<td colspan="3"> </td>
|
||||
</tr>
|
||||
<tr class="vc_diff_empty">
|
||||
<td colspan="3" style="text-align:center;">[msg_error]</td>
|
||||
</tr>
|
||||
[else]
|
||||
<tr>
|
||||
<td class="vc_diff_line_number" id="l[diffs.changes.line_number]">[if-any diffs.right.annotate_href]<a href="[diffs.right.annotate_href]#l[diffs.changes.line_number]">[diffs.changes.line_number]</a>[else][diffs.changes.line_number][end]</td>
|
||||
<td class="vc_diff_nochange"> [diffs.changes.left]</td>
|
||||
<td class="vc_diff_nochange"> [diffs.changes.right]</td>
|
||||
</tr>
|
||||
[end]
|
||||
[end]
|
||||
[end]
|
||||
[end]
|
||||
[end]
|
||||
[end]
|
||||
[end]
|
||||
[end]
|
||||
</table>
|
||||
[end]
|
||||
|
||||
[is diffs.diff_block_format "sidebyside-2"]
|
||||
<table class="vc_idiff" style="margin-top: 1em;">
|
||||
<colgroup><col style="width: 3%;"/><col class="content" style="width: 47%;"/></colgroup>
|
||||
<colgroup><col style="width: 3%;"/><col class="content" style="width: 47%;"/></colgroup>
|
||||
<thead>
|
||||
<tr>
|
||||
<th colspan="2">[left_header]</th>
|
||||
<th colspan="2">[right_header]</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
[for diffs.changes]
|
||||
[is diffs.changes.type "no-changes"]
|
||||
<tr class="vc_diff_empty">
|
||||
<td colspan="4" style="text-align:center;">[msg_no_changes]</td>
|
||||
</tr>
|
||||
[else]
|
||||
[is diffs.changes.type "binary-diff"]
|
||||
<tr class="vc_diff_empty">
|
||||
<td colspan="4" style="text-align:center;">[msg_binary]</td>
|
||||
</tr>
|
||||
[else]
|
||||
[if-any diffs.changes.gap]
|
||||
<tr>
|
||||
<th>…</th><th></th>
|
||||
<th>…</th><th></th>
|
||||
</tr>
|
||||
[end]
|
||||
<tr>
|
||||
[for diffs.changes.columns]
|
||||
<th>[diffs.changes.columns.line_number]</th><td[if-any diffs.changes.columns.line_number][else] class="vc_idiff_empty"[end]>[for diffs.changes.columns.segments][if-any diffs.changes.columns.segments.type]<span class="vc_idiff_[diffs.changes.columns.segments.type]">[diffs.changes.columns.segments.text]</span>[else][diffs.changes.columns.segments.text][end][end]</td>
|
||||
[end]
|
||||
</tr>
|
||||
[end]
|
||||
[end]
|
||||
[end]
|
||||
</tbody>
|
||||
</table>
|
||||
[end]
|
||||
|
||||
[is diffs.diff_block_format "unified"]
|
||||
<table class="vc_idiff" style="margin-top: 1em;">
|
||||
<colgroup>
|
||||
<col style="width: 3%;"/>
|
||||
<col style="width: 3%;"/>
|
||||
<col class="content" style="width: 94%;"/>
|
||||
</colgroup>
|
||||
<thead>
|
||||
<tr class="vc_diff_header">
|
||||
<th> </th><th colspan="2" style="width:95%; text-align:left;">[left_header]</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<th colspan="3" style="text-align:left;">vs.</th>
|
||||
</tr>
|
||||
<tr class="vc_diff_header">
|
||||
<th> </th><th colspan="2" style="width:95%; text-align:left;">[right_header]</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
[for diffs.changes]
|
||||
[is diffs.changes.type "no-changes"]
|
||||
<tr class="vc_diff_empty">
|
||||
<td colspan="3" style="text-align:center;">[msg_no_changes]</td>
|
||||
</tr>
|
||||
[else]
|
||||
[is diffs.changes.type "binary-diff"]
|
||||
<tr class="vc_diff_empty">
|
||||
<td colspan="3" style="text-align:center;">[msg_binary]</td>
|
||||
</tr>
|
||||
[else]
|
||||
[if-any diffs.changes.gap]
|
||||
<tr>
|
||||
<th>…</th>
|
||||
<th>…</th>
|
||||
<th></th>
|
||||
</tr>
|
||||
[end]
|
||||
<tr>
|
||||
<th>[diffs.changes.left_number]</th>
|
||||
<th>[diffs.changes.right_number]</th>
|
||||
<td[if-any diffs.changes.type] class="vc_idiff_[diffs.changes.type]"[end]>[for diffs.changes.segments][if-any diffs.changes.segments.type]<span class="vc_idiff_[diffs.changes.segments.type]">[diffs.changes.segments.text]</span>[else][diffs.changes.segments.text][end][end]</td>
|
||||
</tr>
|
||||
[end]
|
||||
[end]
|
||||
[end]
|
||||
</tbody>
|
||||
</table>
|
||||
[end]
|
@@ -1,58 +0,0 @@
|
||||
[# Setup page definitions]
|
||||
[define page_title]Diff of:[end]
|
||||
[define help_href][docroot]/help_rootview.html[end]
|
||||
[# end]
|
||||
[include "include/header.ezt" "diff"]
|
||||
|
||||
<form class="inline" method="get" action="[diff_format_action]">
|
||||
<div class="inline">
|
||||
[for diff_format_hidden_values]<input type="hidden" name="[diff_format_hidden_values.name]" value="[diff_format_hidden_values.value]"/>[end]
|
||||
<select name="diff_format" onchange="submit()">
|
||||
<option value="h" [is diff_format "h"]selected="selected"[end]>Colored Diff</option>
|
||||
<option value="l" [is diff_format "l"]selected="selected"[end]>Long Colored Diff</option>
|
||||
<option value="f" [is diff_format "f"]selected="selected"[end]>Full Colored Diff</option>
|
||||
<option value="u" [is diff_format "u"]selected="selected"[end]>Unidiff</option>
|
||||
<option value="c" [is diff_format "c"]selected="selected"[end]>Context Diff</option>
|
||||
<option value="s" [is diff_format "s"]selected="selected"[end]>Side by Side</option>
|
||||
</select>
|
||||
<input type="submit" value="Show" />
|
||||
(<a href="[patch_href]">Generate patch</a>)
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<div id="vc_main_body">
|
||||
<!-- ************************************************************** -->
|
||||
|
||||
[if-any diffs]
|
||||
[for diffs]
|
||||
[include "include/diff_display.ezt"]
|
||||
[end]
|
||||
[end]
|
||||
|
||||
[if-any hide_legend]
|
||||
[else]
|
||||
<h3>Diff Legend</h3>
|
||||
<table class="auto" cellspacing="0">
|
||||
<tr>
|
||||
<td class="vc_diff_plusminus"><strong style="color: red;">–</strong></td>
|
||||
<td class="vc_diff_remove">Removed lines</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="vc_diff_plusminus"><strong style="color: green;">+</strong></td>
|
||||
<td class="vc_diff_add">Added lines</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="vc_diff_plusminus"><strong style="color: yellow;"><</strong></td>
|
||||
<td class="vc_diff_changes1">Changed lines</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="vc_diff_plusminus"><strong style="color: yellow;">></strong></td>
|
||||
<td class="vc_diff_changes2">Changed lines</td>
|
||||
</tr>
|
||||
</table>
|
||||
[end]
|
||||
|
||||
<!-- ************************************************************** -->
|
||||
</div>
|
||||
|
||||
[include "include/footer.ezt"]
|
@@ -1,140 +0,0 @@
|
||||
[# setup page definitions]
|
||||
[define page_title]Index of:[end]
|
||||
[define help_href][docroot]/help_[if-any where]dir[else]root[end]view.html[end]
|
||||
[# end]
|
||||
[include "include/header.ezt" "directory"]
|
||||
|
||||
[if-any where][else]
|
||||
<!-- you may insert repository access instructions here -->
|
||||
[end]
|
||||
|
||||
<div id="vc_main_body">
|
||||
<!-- ************************************************************** -->
|
||||
|
||||
<div id="vc_togglables">
|
||||
<div class="inline">
|
||||
[include "include/pathrev_form.ezt"]
|
||||
</div>
|
||||
[is roottype "svn"]
|
||||
<div class="inline lpad">
|
||||
[if-any rev]r<a href="[revision_href]">[rev]</a>[end]
|
||||
</div>
|
||||
[end]
|
||||
</div>
|
||||
|
||||
<table cellspacing="2" class="fixed" id="dirlist">
|
||||
<thead>
|
||||
<tr>
|
||||
<th style="width: 200px" class="vc_header[is sortby "file"]_sort[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]">
|
||||
<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]
|
||||
</a>
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
|
||||
<tbody>
|
||||
[if-any up_href]
|
||||
<tr class="vc_row_odd">
|
||||
<td colspan="2">
|
||||
<a href="[up_href]">
|
||||
<img src="[docroot]/images/back_small.png" alt="" class="vc_icon"
|
||||
/> ../</a>
|
||||
</td>
|
||||
</tr>
|
||||
[end]
|
||||
[for entries]
|
||||
[define click_href][is entries.pathtype "dir"][entries.view_href][else][if-any entries.prefer_markup][entries.view_href][else][entries.download_href][end][end][end]
|
||||
|
||||
<tr class="vc_row_[if-index entries even]even[else]odd[end]">
|
||||
<td style="width: 200px" [if-any click_href]onclick="jumpTo('[click_href]')"[end]>
|
||||
[if-any click_href]<a name="[entries.anchor]" href="[click_href]" title="[is entries.pathtype "dir"]View Directory Contents[else][if-any entries.prefer_markup]View[else]Download[end] File Contents[end]">[end]
|
||||
<img src="[docroot]/images/[is entries.pathtype "dir"]dir[else][is entries.state "dead"]broken[else]text[end][end].png" alt="" class="vc_icon" />
|
||||
[entries.name][is entries.pathtype "dir"]/[end][if-any click_href]</a>[end][if-any entries.lockinfo]<img src="[docroot]/images/lock-icon.gif" alt="locked" class="vc_overlay" title="Locked by [entries.lockinfo]" />[end]
|
||||
[is entries.state "dead"](dead)[end]
|
||||
</td>
|
||||
|
||||
<td [if-any entries.log_href]onclick="jumpTo('[entries.log_href]')"[end]>
|
||||
[if-any entries.rev]
|
||||
<strong>[if-any entries.log_href]<a href="[entries.log_href]" title="Revision [entries.rev]">[entries.rev]</a>[else][entries.rev][end]</strong>
|
||||
([entries.ago] ago)
|
||||
by <em>[entries.author]</em>:
|
||||
[entries.log]
|
||||
[is entries.pathtype "dir"][is roottype "cvs"]
|
||||
<em>(from [entries.log_file]/[entries.log_rev])</em>
|
||||
[end][end]
|
||||
[end]
|
||||
</td>
|
||||
</tr>
|
||||
[end]
|
||||
</tbody>
|
||||
|
||||
</table>
|
||||
|
||||
<div id="vc_view_summary">
|
||||
[is picklist_len "0"][else][is picklist_len "1"][else]
|
||||
<form class="inline" method="get" action="[dir_paging_action]">
|
||||
<div class="inline lpad">
|
||||
[for dir_paging_hidden_values]<input type="hidden" name="[dir_paging_hidden_values.name]" value="[dir_paging_hidden_values.value]"/>[end]
|
||||
<select name="dir_pagestart" onchange="submit()">
|
||||
[for picklist]
|
||||
<option [is picklist.count dir_pagestart]selected[end] value="[picklist.count]">Page [picklist.page]: [picklist.start] to [picklist.end]</option>
|
||||
[end]
|
||||
</select>
|
||||
<input type="submit" value="Go" />
|
||||
</div>
|
||||
</form>
|
||||
[end][end]
|
||||
[if-any search_re_action]
|
||||
<form class="inline" method="get" action="[search_re_action]">
|
||||
<div class="inline lpad">
|
||||
[for search_re_hidden_values]<input type="hidden" name="[search_re_hidden_values.name]" value="[search_re_hidden_values.value]"/>[end]
|
||||
<input type="text" name="search" value="[search_re]" />
|
||||
<input type="submit" value="Search Files" />
|
||||
</div>
|
||||
</form>
|
||||
[if-any search_re]
|
||||
<form class="inline" method="get" action="[search_re_action]">
|
||||
<div class="inline">
|
||||
[for search_re_hidden_values]<input type="hidden" name="[search_re_hidden_values.name]" value="[search_re_hidden_values.value]"/>[end]
|
||||
<input type="submit" value="Show all files" />
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
[end]
|
||||
[end]
|
||||
[is num_dead "0"]
|
||||
[else]
|
||||
<div class="inline lpad">
|
||||
[if-any attic_showing]
|
||||
<a href="[hide_attic_href]">Hide
|
||||
[else]
|
||||
<a href="[show_attic_href]">Show
|
||||
[end]
|
||||
dead files</a>
|
||||
</div>
|
||||
[end]
|
||||
<div class="inline lpad">
|
||||
[files_shown] file[is files_shown "1"][else]s[end] shown
|
||||
</div>
|
||||
</div>
|
||||
|
||||
[include "include/props.ezt"]
|
||||
|
||||
<!-- ************************************************************** -->
|
||||
</div>
|
||||
|
||||
[include "include/footer.ezt"]
|
@@ -1,8 +0,0 @@
|
||||
/************************************/
|
||||
/*** ViewVC Help CSS Stylesheet ***/
|
||||
/************************************/
|
||||
body { margin: 0.5em; }
|
||||
img { border: none; }
|
||||
table { width: 100%; }
|
||||
td { vertical-align: top; }
|
||||
col.menu { width:12em; }
|
@@ -1,126 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||
<head>
|
||||
<title>ViewVC Help: Directory View</title>
|
||||
<link rel="stylesheet" href="help.css" type="text/css" />
|
||||
</head>
|
||||
<body>
|
||||
<table>
|
||||
<col class="menu" />
|
||||
<col />
|
||||
<tr>
|
||||
<td colspan="2">
|
||||
<h1>ViewVC Help: Directory View</h1>
|
||||
</td>
|
||||
</tr>
|
||||
<tr><td>
|
||||
<h3>Help</h3>
|
||||
<a href="help_rootview.html">General</a><br />
|
||||
<strong>Directory View</strong><br />
|
||||
<a href="help_log.html">Log View</a><br />
|
||||
|
||||
<h3>Internet</h3>
|
||||
<a href="http://viewvc.org/index.html">Home</a><br />
|
||||
<a href="http://viewvc.org/upgrading.html">Upgrading</a><br />
|
||||
<a href="http://viewvc.org/contributing.html">Contributing</a><br />
|
||||
<a href="http://viewvc.org/license-1.html">License</a><br />
|
||||
</td><td colspan="2">
|
||||
|
||||
<p>The directory listing view should be a familiar sight to any
|
||||
computer user. It shows the path of the current directory being viewed
|
||||
at the top of the page. Below that is a table summarizing the
|
||||
directory contents, and then comes actual contents, a sortable list of
|
||||
all files and subdirectories inside the current directory.</p>
|
||||
|
||||
<p><a name="summary"></a>The summary table is made up of some or all
|
||||
of the following rows:</p>
|
||||
<ul>
|
||||
<li><a name="summary-files-shown"><strong>Files Shown</strong></a>
|
||||
- Number of files shown in the directory listing. This might be less
|
||||
than the actual number of files in the directory if a
|
||||
<a href="#option-search">regular expression search</a> is in place,
|
||||
hiding files which don't meet the search criteria. In CVS directory
|
||||
listings, this row will also have a link to toggle display of
|
||||
<a href="help_rootview.html#dead-files">dead files</a>, if any are
|
||||
present.</li>
|
||||
|
||||
<li><a name="summary-revision"><strong>Directory
|
||||
Revision</strong></a> - For Subversion directories only.
|
||||
Shown as "# of #" where the first number is the most recent
|
||||
repository revision where the directory (or a path underneath it)
|
||||
was modified. The second number is just the latest repository
|
||||
revision. Both numbers are links to
|
||||
<a href="help_rootview.html#view-rev">revision views</a></li>
|
||||
|
||||
<li><a name="summary-sticky-revision-tag"><strong>Sticky
|
||||
Revision/Tag</strong></a> - shows the current
|
||||
<a href="help_rootview.html#sticky-revision-tag">sticky revision or
|
||||
tag</a> and contains form fields to set or clear it.</li>
|
||||
|
||||
<li><a name="summary-search"><strong>Current Search</strong></a> -
|
||||
If a <a href="#option-search">regular expression search</a> is in place,
|
||||
shows the search string.</li>
|
||||
|
||||
<li><a name="summary-query"><strong>Query</strong></a> - Provides
|
||||
a link to a <a href="help_rootview.html#view-query">query form</a>
|
||||
for the directory</li>
|
||||
</ul>
|
||||
|
||||
<p><a name="list"></a>The actual directory list is a table with
|
||||
filenames and directory names in one column and information about the
|
||||
most recent revisions where each file or directory was modified in the
|
||||
other columns. Column headers can be clicked to sort the directory
|
||||
entries in order by a column, and clicked again to reverse the sort
|
||||
order.</p>
|
||||
|
||||
<p>
|
||||
<!-- If using directory.ezt template -->
|
||||
File names are links to <a href="help_log.html">log views</a>
|
||||
showing a list of revisions where a file was modified. Revision
|
||||
numbers are links to either
|
||||
<a href="help_rootview.html#view-markup">view</a>
|
||||
or <a href="help_rootview.html#view-checkout">download</a> a file
|
||||
(depending on its file type). The links are reversed for directories.
|
||||
Directory revision numbers are links to <a href="help_log.html">log
|
||||
views</a>, while directory names are links showing the contents of those
|
||||
directories.
|
||||
|
||||
<!-- If using dir_alt.ezt template -->
|
||||
<!--
|
||||
File and directory names are links to retrieve their contents.
|
||||
File links may be either
|
||||
<a href="help_rootview.html#view-markup">view</a>
|
||||
or <a href="help_rootview.html#view-download">download</a> links
|
||||
depending on the file type. Directory links go to directory
|
||||
listings. Revision numbers are links to <a href="help_log.html">log
|
||||
views</a> showing lists of revisions where a file or directory was
|
||||
modified.
|
||||
-->
|
||||
|
||||
Also, in CVS repositories with the <a
|
||||
href="help_rootview.html#view-graph">graph view</a> enabled, there
|
||||
will be small icons next to file names which are links to revision
|
||||
graphs.</p>
|
||||
|
||||
<p>Depending on how ViewVC is configured, there may be more options
|
||||
at the bottom of directory pages:</p>
|
||||
|
||||
<ul>
|
||||
<li><a name="option-search"><strong>Regular expression
|
||||
search</strong></a> - If enabled, will show a form field accepting
|
||||
a search string (a
|
||||
<a href="http://doc.python.org/lib/re-syntax.html">python regular
|
||||
expression</a>). Once submitted, only files that have at least
|
||||
one occurance of the expression will show up in directory listings.
|
||||
</li>
|
||||
<li><a name="option-tarball"><strong>Tarball download</strong></a> -
|
||||
If enabled, will show a link to download a gzipped tar archive of
|
||||
the directory contents.</li>
|
||||
</ul>
|
||||
|
||||
</td></tr></table>
|
||||
<hr />
|
||||
<address><a href="mailto:users@viewvc.tigris.org">ViewVC Users Mailinglist</a></address>
|
||||
</body>
|
||||
</html>
|
@@ -1,71 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||
<head>
|
||||
<title>ViewVC Help: Log View</title>
|
||||
<link rel="stylesheet" href="help.css" type="text/css" />
|
||||
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
|
||||
</head>
|
||||
<body>
|
||||
<table>
|
||||
<col class="menu" />
|
||||
<col />
|
||||
<tr>
|
||||
<td colspan="2">
|
||||
<h1>ViewVC Help: Log View</h1>
|
||||
</td>
|
||||
</tr>
|
||||
<tr><td>
|
||||
<h3>Help</h3>
|
||||
<a href="help_rootview.html">General</a><br />
|
||||
<a href="help_dirview.html">Directory View</a><br />
|
||||
<strong>Log View</strong><br />
|
||||
|
||||
<h3>Internet</h3>
|
||||
<a href="http://viewvc.org/index.html">Home</a><br />
|
||||
<a href="http://viewvc.org/upgrading.html">Upgrading</a><br />
|
||||
<a href="http://viewvc.org/contributing.html">Contributing</a><br />
|
||||
<a href="http://viewvc.org/license-1.html">License</a><br />
|
||||
</td><td colspan="2">
|
||||
<p>
|
||||
The log view displays the revision history of the selected source
|
||||
file or directory. For each revision the following information is
|
||||
displayed:
|
||||
|
||||
<ul>
|
||||
<li>The revision number. In Subversion repositories, this is a
|
||||
link to the <a href="help_rootview.html#view-rev">revision
|
||||
view</a></li>
|
||||
<li>For files, links to
|
||||
<a href="help_rootview.html#view-markup">view</a>,
|
||||
<a href="help_rootview.html#view-checkout">download</a>, and
|
||||
<a href="help_rootview.html#view-annotate">annotate</a> the
|
||||
revision. For directories, a link to
|
||||
<a href="help_dirview.html">list directory contents</a></li>
|
||||
<li>A link to select the revision for diffs (see below)</li>
|
||||
<li>The date and age of the change</li>
|
||||
<li>The author of the modification</li>
|
||||
<li>The CVS branch (usually <em>MAIN</em>, if not on a branch)</li>
|
||||
<li>Possibly a list of CVS tags bound to the revision (if any)</li>
|
||||
<li>The size of the change measured in added and removed lines of
|
||||
code. (CVS only)</li>
|
||||
<li>The size of the file in bytes at the time of the revision
|
||||
(Subversion only)</li>
|
||||
<li>Links to view diffs to the previous revision or possibly to
|
||||
an arbitrary selected revision (if any, see above)</li>
|
||||
<li>If the revision is the result of a copy, the path and revision
|
||||
copied from</li>
|
||||
<li>If the revision precedes a copy or rename, the path at the
|
||||
time of the revision</li>
|
||||
<li>And last but not least, the commit log message which should tell
|
||||
about the reason for the change.</li>
|
||||
</ul>
|
||||
<p>
|
||||
At the bottom of the page you will find a form which allows
|
||||
to request diffs between arbitrary revisions.
|
||||
</p>
|
||||
</td></tr></table>
|
||||
<hr />
|
||||
<address><a href="mailto:users@viewvc.tigris.org">ViewVC Users Mailinglist</a></address>
|
||||
</body>
|
||||
</html>
|
@@ -1,66 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||
<head>
|
||||
<title>ViewVC Help: Query The Commit Database</title>
|
||||
<link rel="stylesheet" href="help.css" type="text/css" />
|
||||
</head>
|
||||
<body>
|
||||
<table>
|
||||
<col class="menu" />
|
||||
<col />
|
||||
<tr>
|
||||
<td colspan="2">
|
||||
<h1>ViewVC Help: Query The Commit Database</h1>
|
||||
</td>
|
||||
</tr>
|
||||
<tr><td>
|
||||
<h3>Other Help:</h3>
|
||||
<a href="help_rootview.html">General</a><br />
|
||||
<a href="help_dirview.html">Directory View</a><br />
|
||||
<a href="help_log.html">Classic Log View</a><br />
|
||||
<a href="help_logtable.html">Alternative Log View</a><br />
|
||||
<strong>Query Database</strong>
|
||||
|
||||
<h3>Internet</h3>
|
||||
<a href="http://viewvc.org/index.html">Home</a><br />
|
||||
<a href="http://viewvc.org/upgrading.html">Upgrading</a><br />
|
||||
<a href="http://viewvc.org/contributing.html">Contributing</a><br />
|
||||
<a href="http://viewvc.org/license-1.html">License</a><br />
|
||||
</td><td colspan="2">
|
||||
|
||||
<p>
|
||||
Select your parameters for querying the CVS commit database in the
|
||||
form at the top of the page. You
|
||||
can search for multiple matches by typing a comma-seperated list
|
||||
into the text fields. Regular expressions, and wildcards are also
|
||||
supported. Blank text input fields are treated as wildcards.
|
||||
</p>
|
||||
<p>
|
||||
Any of the text entry fields can take a comma-seperated list of
|
||||
search arguments. For example, to search for all commits from
|
||||
authors <em>jpaint</em> and <em>gstein</em>, just type: <code>jpaint,
|
||||
gstein</code> in the <em>Author</em> input box. If you are searching
|
||||
for items containing spaces or quotes, you will need to quote your
|
||||
request. For example, the same search above with quotes is:
|
||||
<code>"jpaint", "gstein"</code>.
|
||||
</p>
|
||||
<p>
|
||||
Wildcard and regular expression searches are entered in a similar
|
||||
way to the quoted requests. You must quote any wildcard or
|
||||
regular expression request, and a command character preceeds the
|
||||
first quote. The command character <code>l</code>(lowercase L) is for wildcard
|
||||
searches, and the wildcard character is a percent (<code>%</code>). The
|
||||
command character for regular expressions is <code>r</code>, and is
|
||||
passed directly to MySQL, so you'll need to refer to the MySQL
|
||||
manual for the exact regex syntax. It is very similar to Perl. A
|
||||
wildard search for all files with a <em>.py</em> extention is:
|
||||
<code>l"%.py"</code> in the <em>File</em> input box. The same search done
|
||||
with a regular expression is: <code>r".*\.py"</code>.
|
||||
</p>
|
||||
<p>
|
||||
All search types can be mixed, as long as they are seperated by
|
||||
commas.
|
||||
</p>
|
||||
</td></tr></table>
|
||||
</body></html>
|
@@ -1,166 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||
<head>
|
||||
<title>ViewVC Help: General</title>
|
||||
<link rel="stylesheet" href="help.css" type="text/css" />
|
||||
</head>
|
||||
<body>
|
||||
<table>
|
||||
<col class="menu" />
|
||||
<col />
|
||||
<tr>
|
||||
<td colspan="2">
|
||||
<h1>ViewVC Help: General</h1>
|
||||
</td>
|
||||
</tr>
|
||||
<tr><td>
|
||||
<h3>Help</h3>
|
||||
<strong>General</strong><br />
|
||||
<a href="help_dirview.html">Directory View</a><br />
|
||||
<a href="help_log.html">Log View</a><br />
|
||||
|
||||
<h3>Internet</h3>
|
||||
<a href="http://viewvc.org/index.html">Home</a><br />
|
||||
<a href="http://viewvc.org/upgrading.html">Upgrading</a><br />
|
||||
<a href="http://viewvc.org/contributing.html">Contributing</a><br />
|
||||
<a href="http://viewvc.org/license-1.html">License</a><br />
|
||||
</td><td colspan="2">
|
||||
|
||||
<p><em>ViewVC</em> is a WWW interface for CVS and Subversion
|
||||
repositories. It allows you to browse the files and directories in a
|
||||
repository while showing you metadata from the repository history: log
|
||||
messages, modification dates, author names, revision numbers, copy
|
||||
history, and so on. It provides several different views of repository
|
||||
data to help you find the information you are looking for:</p>
|
||||
|
||||
<ul>
|
||||
<li><a name="view-dir" href="help_dirview.html"><strong>Directory
|
||||
View</strong></a> - Shows a list of files and subdirectories in a
|
||||
directory of the repository, along with metadata like author names and
|
||||
log entries.</li>
|
||||
|
||||
<li><a name="view-log" href="help_log.html"><strong>Log
|
||||
View</strong></a> - Shows a revision by revision list of all the
|
||||
changes that have made to a file or directory in the repository, with
|
||||
metadata and links to views of each revision.</li>
|
||||
|
||||
<li><a name="view-markup"><strong>File Contents View (Markup
|
||||
View)</strong></a> - Shows the contents of a file at a particular
|
||||
revision, with revision information at the top of the page. File
|
||||
revisions which are GIF, PNG, or JPEG images are displayed inline on
|
||||
the page. Other file types are displayed as marked up text. The markup
|
||||
may be limited to turning URLs and email addresses into links, or
|
||||
configured to show colorized source code.</li>
|
||||
|
||||
<li><a name="view-checkout"><strong>File Download (Checkout
|
||||
View)</strong></a> - Retrieves the unaltered contents of a file
|
||||
revision. Browsers may try to display the file, or just save it to
|
||||
disk.</li>
|
||||
|
||||
<li><a name="view-annotate"><strong>File Annotate View</strong></a> -
|
||||
Shows the contents of a file revision and breaks it down line by line,
|
||||
showing the revision number where each one was last modified, along
|
||||
with links and other information. <em>This view is disabled in some
|
||||
ViewVC configurations</em></li>
|
||||
|
||||
<li><a name="view-diff"><strong>File Diff View</strong></a> - Shows
|
||||
the changes made between two revisions of a file</li>
|
||||
|
||||
<li><a name="view-tarball"><strong>Directory Tarball View</strong> -
|
||||
Retrieves a gzipped tar archive containing the contents of a
|
||||
directory.<em>This view is disabled in the default ViewVC
|
||||
configuration.</em></li>
|
||||
|
||||
<li><a name="view-query"><strong>Directory Query View</strong></a> -
|
||||
Shows information about changes made to all subdirectories and files
|
||||
under a parent directory, sorted and filtered by criteria you specify.
|
||||
<em>This view is disabled in the default ViewVC configuration.</em>
|
||||
</li>
|
||||
|
||||
<li><a name="view-rev"><strong>Revision View</strong> - Shows
|
||||
information about a revision including log message, author, and a list
|
||||
of changed paths. <em>For Subversion repositories only.</em></li>
|
||||
|
||||
<li><a name="view-graph"><strong>Graph View</strong></a> - Shows a
|
||||
graphical representation of a file's revisions and branches complete
|
||||
with tag and author names and links to markup and diff pages.
|
||||
<em>For CVS repositories only, and disabled in the default
|
||||
configuration.</em></li>
|
||||
</ul>
|
||||
|
||||
<h3><a name="multiple-repositories">Multiple Repositories</a></h3>
|
||||
|
||||
<p>A single installation of ViewVC is often used to provide access to
|
||||
more than one repository. In these installations, ViewVC shows a
|
||||
<em>Project Root</em> drop down box in the top right corner of every
|
||||
generated page to allow for quick access to any repository.</p>
|
||||
|
||||
<h3><a name="sticky-revision-tag">Sticky Revision and Tag</a></h3>
|
||||
|
||||
<p>By default, ViewVC will show the files and directories and revisions
|
||||
that currently exist in the repository. But it's also possible to browse
|
||||
the contents of a repository at a point in its past history by choosing
|
||||
a "sticky tag" (in CVS) or a "sticky revision" (in Subversion) from the
|
||||
forms at the top of directory and log pages. They're called sticky
|
||||
because once they're chosen, they stick around when you navigate to
|
||||
other pages, until you reset them. When they're set, directory and log
|
||||
pages only show revisions preceding the specified point in history. In
|
||||
CVS, when a tag refers to a branch or a revision on a branch, only
|
||||
revisions from the branch history are shown, including branch points and
|
||||
their preceding revisions.</p>
|
||||
|
||||
<h3><a name="dead-files">Dead Files</a></h3>
|
||||
|
||||
<p>In CVS directory listings, ViewVC can optionally display dead files.
|
||||
Dead files are files which used to be in a directory but are currently
|
||||
deleted, or files which just don't exist in the currently selected
|
||||
<a href="#sticky-revision-tag">sticky tag</a>. Dead files cannot be
|
||||
shown in Subversion repositories. The only way to see a deleted file in
|
||||
a Subversion directory is to navigate to a sticky revision where the
|
||||
file previously existed.</p>
|
||||
|
||||
<h3><a name="artificial-tags">Artificial Tags</a></h3>
|
||||
|
||||
<p>In CVS Repositories, ViewVC adds artificial tags <em>HEAD</em> and
|
||||
<em>MAIN</em> to tag listings and accepts them in place of revision
|
||||
numbers and real tag names in all URLs. <em>MAIN</em> acts like a branch
|
||||
tag pointing at the default branch, while <em>HEAD</em> acts like a
|
||||
revision tag pointing to the latest revision on the default branch. The
|
||||
default branch is usually just the trunk, but may be set to other
|
||||
branches inside individual repository files. CVS will always check out
|
||||
revisions from a file's default branch when no other branch is specified
|
||||
on the command line.</p>
|
||||
|
||||
<h3><a name="more-information">More Information</a></h3>
|
||||
|
||||
<p>More information about <em>ViewVC</em> is available from
|
||||
<a href="http://viewvc.org/">viewvc.org</a>.
|
||||
See the links below for guides to CVS and Subversion</p>
|
||||
|
||||
<h4>Documentation about CVS</h4>
|
||||
<blockquote>
|
||||
<p>
|
||||
<a href="http://cvsbook.red-bean.com/"><em>Open Source
|
||||
Development with CVS</em></a><br />
|
||||
<a href="http://www.loria.fr/~molli/cvs/doc/cvs_toc.html">CVS
|
||||
User's Guide</a><br />
|
||||
<a href="http://cellworks.washington.edu/pub/docs/cvs/tutorial/cvs_tutorial_1.html">Another CVS tutorial</a><br />
|
||||
<a href="http://www.csc.calpoly.edu/~dbutler/tutorials/winter96/cvs/">Yet another CVS tutorial (a little old, but nice)</a><br />
|
||||
<a href="http://www.cs.utah.edu/dept/old/texinfo/cvs/FAQ.txt">An old but very useful FAQ about CVS</a>
|
||||
</p>
|
||||
</blockquote>
|
||||
|
||||
<h4>Documentation about Subversion</h3>
|
||||
<blockquote>
|
||||
<p>
|
||||
<a href="http://svnbook.red-bean.com/"><em>Version Control with
|
||||
Subversion</em></a><br />
|
||||
</p>
|
||||
</blockquote>
|
||||
|
||||
</td></tr></table>
|
||||
<hr />
|
||||
<address><a href="mailto:users@viewvc.tigris.org">ViewVC Users Mailinglist</a></address>
|
||||
</body>
|
||||
</html>
|
Before Width: | Height: | Size: 337 B |
Before Width: | Height: | Size: 205 B |
Before Width: | Height: | Size: 247 B |
Before Width: | Height: | Size: 601 B |
Before Width: | Height: | Size: 228 B |
Before Width: | Height: | Size: 167 B |
Before Width: | Height: | Size: 1004 B |
Before Width: | Height: | Size: 338 B |
Before Width: | Height: | Size: 64 B |
Before Width: | Height: | Size: 1.0 KiB |
Before Width: | Height: | Size: 226 B |
Before Width: | Height: | Size: 168 B |
Before Width: | Height: | Size: 8.2 KiB |
@@ -1,4 +0,0 @@
|
||||
function jumpTo(url)
|
||||
{
|
||||
window.location = url;
|
||||
}
|
@@ -1,385 +0,0 @@
|
||||
/*******************************/
|
||||
/*** ViewVC CSS Stylesheet ***/
|
||||
/*******************************/
|
||||
|
||||
/*** Standard Tags ***/
|
||||
html, body {
|
||||
background-color: white;
|
||||
color: black;
|
||||
font-family: sans-serif;
|
||||
font-size: 100%;
|
||||
margin: 5px;
|
||||
}
|
||||
h2 {
|
||||
border-top: 3px solid #d0d775;
|
||||
font-size: 115%;
|
||||
font-weight: bold;
|
||||
}
|
||||
a {
|
||||
text-decoration: none;
|
||||
color: rgb(30%,30%,60%);
|
||||
}
|
||||
img { border: none; }
|
||||
table {
|
||||
width: 100%;
|
||||
margin: 0;
|
||||
border: none;
|
||||
}
|
||||
td, th {
|
||||
vertical-align: top;
|
||||
}
|
||||
th { white-space: nowrap; }
|
||||
table.auto {
|
||||
width: auto;
|
||||
}
|
||||
table.fixed {
|
||||
width: 100%;
|
||||
table-layout: fixed;
|
||||
}
|
||||
table.fixed td {
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
}
|
||||
form { margin: 0; }
|
||||
address { font-style: normal; display: inline; }
|
||||
.inline { display: inline; }
|
||||
.lpad { margin-left: 2em; }
|
||||
|
||||
/*** Icons ***/
|
||||
.vc_icon {
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
border: none;
|
||||
padding: 0 1px;
|
||||
}
|
||||
.vc_overlay {
|
||||
width: 12px;
|
||||
height: 12px;
|
||||
border: none;
|
||||
padding: 0 1px;
|
||||
vertical-align: top;
|
||||
}
|
||||
#vc_header {
|
||||
padding: 0 0 10px 0;
|
||||
border-bottom: 10px solid #94bd5e;
|
||||
}
|
||||
|
||||
#vc_footer {
|
||||
text-align: right;
|
||||
font-size: 85%;
|
||||
padding: 10px 0 0 0;
|
||||
border-top: 10px solid #94bd5e;
|
||||
}
|
||||
|
||||
#vc_topmatter {
|
||||
float: right;
|
||||
text-align: right;
|
||||
font-size: 85%;
|
||||
}
|
||||
|
||||
#vc_current_path {
|
||||
color: rgb(50%,50%,50%);
|
||||
padding: 10px 0;
|
||||
font-size: 140%;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
#vc_current_path a {
|
||||
color: rgb(60%,60%,60%);
|
||||
}
|
||||
|
||||
#vc_current_path a:hover {
|
||||
background-color: rgb(90%,90%,90%);
|
||||
}
|
||||
|
||||
#vc_current_path .thisitem {
|
||||
color: #94bd5e;
|
||||
}
|
||||
|
||||
#vc_current_path .pathdiv {
|
||||
padding: 0 0.1em;
|
||||
}
|
||||
|
||||
#vc_view_selection_group {
|
||||
background: black;
|
||||
color: white;
|
||||
margin: 0 0 5px 0;
|
||||
padding: 5px;
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
#vc_view_selection_group a {
|
||||
padding: 5px;
|
||||
font-size: 100%;
|
||||
color: white;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
#vc_view_selection_group a.vc_view_link_this, #vc_view_selection_group a.vc_view_link:hover {
|
||||
color: #94bd5e;
|
||||
}
|
||||
|
||||
#vc_view_selection_group a:hover {
|
||||
background-color: black;
|
||||
}
|
||||
|
||||
#vc_view_main {
|
||||
border-top: 1px solid black;
|
||||
border-bottom: 1px solid black;
|
||||
}
|
||||
|
||||
#vc_togglables {
|
||||
text-align: right;
|
||||
font-size: 85%;
|
||||
}
|
||||
|
||||
#vc_main_body {
|
||||
background: white;
|
||||
padding: 5px 0 20px 0;
|
||||
}
|
||||
|
||||
#vc_view_summary {
|
||||
font-size: 85%;
|
||||
text-align: right;
|
||||
margin-top: 5px;
|
||||
}
|
||||
|
||||
|
||||
/*** Table Headers ***/
|
||||
.vc_header, .vc_header_sort {
|
||||
padding: 2px 5px;
|
||||
text-align: left;
|
||||
vertical-align: top;
|
||||
border-bottom: 1px solid black;
|
||||
background-color: rgb(80%,80%,80%);
|
||||
}
|
||||
.vc_header_sort {
|
||||
background-color: rgb(85%,85%,85%);
|
||||
}
|
||||
|
||||
|
||||
/*** Table Rows ***/
|
||||
.vc_row_even {
|
||||
background-color: rgb(95%,95%,95%);
|
||||
}
|
||||
.vc_row_odd {
|
||||
background-color: rgb(90%,90%,90%);
|
||||
}
|
||||
|
||||
|
||||
/*** Directory View ***/
|
||||
#dirlist td, #dirlist th {
|
||||
padding: 0.2em;
|
||||
vertical-align: middle;
|
||||
}
|
||||
#dirlist tr:hover {
|
||||
background-color: white;
|
||||
}
|
||||
|
||||
|
||||
/*** Log messages ***/
|
||||
.vc_log {
|
||||
/* unfortunately, white-space: pre-wrap isn't widely supported ... */
|
||||
white-space: -moz-pre-wrap; /* Mozilla based browsers */
|
||||
white-space: -pre-wrap; /* Opera 4 - 6 */
|
||||
white-space: -o-pre-wrap; /* Opera >= 7 */
|
||||
white-space: pre-wrap; /* CSS3 */
|
||||
word-wrap: break-word; /* IE 5.5+ */
|
||||
}
|
||||
|
||||
|
||||
/*** Revision Log View ***/
|
||||
#vc_revision_log {
|
||||
}
|
||||
.vc_log_block_even {
|
||||
border-left: 10px solid #d0d775;
|
||||
padding-left: 1em;
|
||||
background-color: rgb(95%,95%,95%);
|
||||
}
|
||||
.vc_log_block_odd {
|
||||
border-left: 10px solid #94bd5e;
|
||||
padding-left: 1em;
|
||||
background-color: rgb(90%,90%,90%);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*** Changed Paths Listing ***/
|
||||
.vc_changedpaths {
|
||||
margin: 1em 0 1em 2em;
|
||||
}
|
||||
|
||||
|
||||
/*** Properties Listing ***/
|
||||
.vc_properties {
|
||||
margin: 1em 0 1em 2em;
|
||||
}
|
||||
.vc_properties td, .vc_properties th {
|
||||
padding: 0.2em;
|
||||
}
|
||||
|
||||
|
||||
/*** File Content Markup Styles ***/
|
||||
.vc_summary {
|
||||
background-color: #eeeeee;
|
||||
}
|
||||
#vc_file {
|
||||
margin: 1em 0 1em 2em;
|
||||
}
|
||||
#vc_file td {
|
||||
border-right-style: solid;
|
||||
border-right-color: #505050;
|
||||
text-decoration: none;
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
padding: 1px 5px;
|
||||
}
|
||||
.vc_file_line_number {
|
||||
border-right-width: 1px;
|
||||
background-color: #eeeeee;
|
||||
color: #505050;
|
||||
text-align: right;
|
||||
}
|
||||
.vc_file_line_author, .vc_file_line_rev {
|
||||
border-right-width: 1px;
|
||||
text-align: right;
|
||||
}
|
||||
.vc_file_line_text {
|
||||
border-right-width: 0px;
|
||||
background-color: white;
|
||||
font-family: monospace;
|
||||
text-align: left;
|
||||
white-space: pre;
|
||||
width: 100%;
|
||||
}
|
||||
.pygments-c { color: #408080; font-style: italic } /* Comment */
|
||||
.pygments-err { border: 1px solid #FF0000 } /* Error */
|
||||
.pygments-k { color: #008000; font-weight: bold } /* Keyword */
|
||||
.pygments-o { color: #666666 } /* Operator */
|
||||
.pygments-cm { color: #408080; font-style: italic } /* Comment.Multiline */
|
||||
.pygments-cp { color: #BC7A00 } /* Comment.Preproc */
|
||||
.pygments-c1 { color: #408080; font-style: italic } /* Comment.Single */
|
||||
.pygments-cs { color: #408080; font-style: italic } /* Comment.Special */
|
||||
.pygments-gd { color: #A00000 } /* Generic.Deleted */
|
||||
.pygments-ge { font-style: italic } /* Generic.Emph */
|
||||
.pygments-gr { color: #FF0000 } /* Generic.Error */
|
||||
.pygments-gh { color: #000080; font-weight: bold } /* Generic.Heading */
|
||||
.pygments-gi { color: #00A000 } /* Generic.Inserted */
|
||||
.pygments-go { color: #808080 } /* Generic.Output */
|
||||
.pygments-gp { color: #000080; font-weight: bold } /* Generic.Prompt */
|
||||
.pygments-gs { font-weight: bold } /* Generic.Strong */
|
||||
.pygments-gu { color: #800080; font-weight: bold } /* Generic.Subheading */
|
||||
.pygments-gt { color: #0040D0 } /* Generic.Traceback */
|
||||
.pygments-kc { color: #008000; font-weight: bold } /* Keyword.Constant */
|
||||
.pygments-kd { color: #008000; font-weight: bold } /* Keyword.Declaration */
|
||||
.pygments-kp { color: #008000 } /* Keyword.Pseudo */
|
||||
.pygments-kr { color: #008000; font-weight: bold } /* Keyword.Reserved */
|
||||
.pygments-kt { color: #B00040 } /* Keyword.Type */
|
||||
.pygments-m { color: #666666 } /* Literal.Number */
|
||||
.pygments-s { color: #BA2121 } /* Literal.String */
|
||||
.pygments-na { color: #7D9029 } /* Name.Attribute */
|
||||
.pygments-nb { color: #008000 } /* Name.Builtin */
|
||||
.pygments-nc { color: #0000FF; font-weight: bold } /* Name.Class */
|
||||
.pygments-no { color: #880000 } /* Name.Constant */
|
||||
.pygments-nd { color: #AA22FF } /* Name.Decorator */
|
||||
.pygments-ni { color: #999999; font-weight: bold } /* Name.Entity */
|
||||
.pygments-ne { color: #D2413A; font-weight: bold } /* Name.Exception */
|
||||
.pygments-nf { color: #0000FF } /* Name.Function */
|
||||
.pygments-nl { color: #A0A000 } /* Name.Label */
|
||||
.pygments-nn { color: #0000FF; font-weight: bold } /* Name.Namespace */
|
||||
.pygments-nt { color: #008000; font-weight: bold } /* Name.Tag */
|
||||
.pygments-nv { color: #19177C } /* Name.Variable */
|
||||
.pygments-ow { color: #AA22FF; font-weight: bold } /* Operator.Word */
|
||||
.pygments-w { color: #bbbbbb } /* Text.Whitespace */
|
||||
.pygments-mf { color: #666666 } /* Literal.Number.Float */
|
||||
.pygments-mh { color: #666666 } /* Literal.Number.Hex */
|
||||
.pygments-mi { color: #666666 } /* Literal.Number.Integer */
|
||||
.pygments-mo { color: #666666 } /* Literal.Number.Oct */
|
||||
.pygments-sb { color: #BA2121 } /* Literal.String.Backtick */
|
||||
.pygments-sc { color: #BA2121 } /* Literal.String.Char */
|
||||
.pygments-sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */
|
||||
.pygments-s2 { color: #BA2121 } /* Literal.String.Double */
|
||||
.pygments-se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */
|
||||
.pygments-sh { color: #BA2121 } /* Literal.String.Heredoc */
|
||||
.pygments-si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */
|
||||
.pygments-sx { color: #008000 } /* Literal.String.Other */
|
||||
.pygments-sr { color: #BB6688 } /* Literal.String.Regex */
|
||||
.pygments-s1 { color: #BA2121 } /* Literal.String.Single */
|
||||
.pygments-ss { color: #19177C } /* Literal.String.Symbol */
|
||||
.pygments-bp { color: #008000 } /* Name.Builtin.Pseudo */
|
||||
.pygments-vc { color: #19177C } /* Name.Variable.Class */
|
||||
.pygments-vg { color: #19177C } /* Name.Variable.Global */
|
||||
.pygments-vi { color: #19177C } /* Name.Variable.Instance */
|
||||
.pygments-il { color: #666666 } /* Literal.Number.Integer.Long */
|
||||
|
||||
|
||||
/*** Diff Styles ***/
|
||||
.vc_diff_plusminus { width: 1em; }
|
||||
.vc_diff_remove, .vc_diff_add, .vc_diff_changes1, .vc_diff_changes2 {
|
||||
font-family: monospace;
|
||||
white-space: pre;
|
||||
}
|
||||
.vc_diff_remove { background: rgb(100%,60%,60%); }
|
||||
.vc_diff_add { background: rgb(60%,100%,60%); }
|
||||
.vc_diff_changes1 { background: rgb(100%,100%,70%); color: rgb(50%,50%,50%); text-decoration: line-through; }
|
||||
.vc_diff_changes2 { background: rgb(100%,100%,0%); }
|
||||
.vc_diff_nochange, .vc_diff_binary, .vc_diff_error {
|
||||
font-family: sans-serif;
|
||||
font-size: smaller;
|
||||
}
|
||||
|
||||
/*** Intraline Diff Styles ***/
|
||||
.vc_idiff_add {
|
||||
background-color: #aaffaa;
|
||||
}
|
||||
.vc_idiff_change {
|
||||
background-color:#ffff77;
|
||||
}
|
||||
.vc_idiff_remove {
|
||||
background-color:#ffaaaa;
|
||||
}
|
||||
.vc_idiff_empty {
|
||||
background-color:#e0e0e0;
|
||||
}
|
||||
|
||||
table.vc_idiff col.content {
|
||||
width: 50%;
|
||||
}
|
||||
table.vc_idiff tbody {
|
||||
font-family: monospace;
|
||||
/* unfortunately, white-space: pre-wrap isn't widely supported ... */
|
||||
white-space: -moz-pre-wrap; /* Mozilla based browsers */
|
||||
white-space: -pre-wrap; /* Opera 4 - 6 */
|
||||
white-space: -o-pre-wrap; /* Opera >= 7 */
|
||||
white-space: pre-wrap; /* CSS3 */
|
||||
word-wrap: break-word; /* IE 5.5+ */
|
||||
}
|
||||
table.vc_idiff tbody th {
|
||||
background-color:#e0e0e0;
|
||||
text-align:right;
|
||||
}
|
||||
|
||||
|
||||
/*** Query Form ***/
|
||||
.vc_query_form {
|
||||
}
|
||||
|
||||
|
||||
/*** Admonishments ***/
|
||||
.vc_notice {
|
||||
border-width: 1px 2px 2px 2px;
|
||||
border-color: black;
|
||||
border-style: solid;
|
||||
background-color: yellow;
|
||||
color: black;
|
||||
padding: 0.5em;
|
||||
}
|
||||
.vc_warning {
|
||||
border-width: 1px 2px 2px 2px;
|
||||
border-color: black;
|
||||
border-style: solid;
|
||||
background-color: red;
|
||||
color: white;
|
||||
padding: 0.5em;
|
||||
}
|
@@ -1,51 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||
<!-- ViewVC :: http://www.viewvc.org/ -->
|
||||
<head>
|
||||
<title>ViewVC Exception</title>
|
||||
</head>
|
||||
<body>
|
||||
<h3>An Exception Has Occurred</h3>
|
||||
|
||||
[if-any msg]
|
||||
<p>[msg]</p>
|
||||
[end]
|
||||
|
||||
[if-any status]
|
||||
<h4>HTTP Response Status</h4>
|
||||
<p><pre>[status]</pre></p>
|
||||
<hr />
|
||||
[end]
|
||||
|
||||
[if-any msg][else]
|
||||
<h4>Python Traceback</h4>
|
||||
<p><pre>
|
||||
[stacktrace]
|
||||
</pre></p>
|
||||
[end]
|
||||
|
||||
[# Here follows a bunch of space characters, present to ensure that
|
||||
our error message is larger than 512 bytes so that IE's "Friendly
|
||||
Error Message" won't show. For more information, see
|
||||
http://oreillynet.com/onjava/blog/2002/09/internet_explorer_subverts_err.html]
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</body>
|
||||
</html>
|
@@ -1,168 +0,0 @@
|
||||
[# ------------------------------------------------------------------------- ]
|
||||
[# 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]
|
||||
[is annotation "annotated"]
|
||||
[define page_title]Annotation of:[end]
|
||||
[else]
|
||||
[define page_title]Contents of:[end]
|
||||
[end]
|
||||
[define help_href][docroot]/help_rootview.html[end]
|
||||
[# end]
|
||||
[include "include/header.ezt" "annotate"]
|
||||
|
||||
<table class="auto">
|
||||
<tr>
|
||||
<td>Revision:</td>
|
||||
<td><strong>[if-any revision_href]<a href="[revision_href]">[rev]</a>[else][rev][end]</strong> [if-any vendor_branch] <em>(vendor branch)</em>[end]</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<tr>
|
||||
<td>Committed:</td>
|
||||
<td>[if-any date]<em>[date]</em> [end][if-any ago]([ago] ago) [end][if-any author]by <em>[author]</em>[end]</td>
|
||||
</tr>
|
||||
[if-any mime_type]
|
||||
<tr>
|
||||
<td>Content type:</td>
|
||||
<td>[mime_type]</td>
|
||||
</tr>
|
||||
[end]
|
||||
[if-any orig_path]
|
||||
<tr>
|
||||
<td>Original Path:</td>
|
||||
<td><strong><a href="[orig_href]"><em>[orig_path]</em></a></strong></td>
|
||||
</tr>
|
||||
[end]
|
||||
[if-any branches]
|
||||
<tr>
|
||||
<td>Branch:</td>
|
||||
<td><strong>[branches]</strong></td>
|
||||
</tr>
|
||||
[end]
|
||||
[if-any tags]
|
||||
<tr>
|
||||
<td>CVS Tags:</td>
|
||||
<td><strong>[tags]</strong></td>
|
||||
</tr>
|
||||
[end]
|
||||
[if-any branch_points]
|
||||
<tr>
|
||||
<td>Branch point for:</td>
|
||||
<td><strong>[branch_points]</strong></td>
|
||||
</tr>
|
||||
[end]
|
||||
[is roottype "cvs"][if-any changed]
|
||||
<tr>
|
||||
<td>Changes since <strong>[prev]</strong>:</td>
|
||||
<td><strong>[changed] lines</strong></td>
|
||||
</tr>
|
||||
[end][end]
|
||||
[is roottype "svn"][if-any size]
|
||||
<tr>
|
||||
<td>File size:</td>
|
||||
<td>[size] byte(s)</td>
|
||||
</tr>
|
||||
[end][end]
|
||||
[if-any lockinfo]
|
||||
<td>Lock status:</td>
|
||||
<td>[lockinfo]</td>
|
||||
[end]
|
||||
[is state "dead"]
|
||||
<tr>
|
||||
<td>State:</td>
|
||||
<td><strong><em>FILE REMOVED</em></strong></td>
|
||||
</tr>
|
||||
[end]
|
||||
[if-any annotation]
|
||||
[is annotation "binary"]
|
||||
<tr>
|
||||
<td colspan="2"><strong>Unable to calculate annotation data on binary file contents.</strong></td>
|
||||
</tr>
|
||||
[end]
|
||||
[is annotation "error"]
|
||||
<tr>
|
||||
<td colspan="2"><strong>Error occurred while calculating annotation data.</strong></td>
|
||||
</tr>
|
||||
[end]
|
||||
[end]
|
||||
[if-any log]
|
||||
<tr>
|
||||
<td>Log Message:</td>
|
||||
<td><pre class="vc_log">[log]</pre></td>
|
||||
</tr>
|
||||
[end]
|
||||
</table>
|
||||
|
||||
<div id="vc_main_body">
|
||||
<!-- ************************************************************** -->
|
||||
|
||||
<h2>File Contents</h2>
|
||||
|
||||
[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 class="vc_notice">This file's contents are not viewable.
|
||||
[if-any download_href]Please <a href="[download_href]">download</a>
|
||||
this version of the file in order to view it.[end]</p>
|
||||
[else]
|
||||
|
||||
[define last_rev]0[end]
|
||||
[define rowclass]vc_row_odd[end]
|
||||
|
||||
[if-any lines]
|
||||
<div id="vc_file">
|
||||
<table cellspacing="0" cellpadding="0">
|
||||
<tr>
|
||||
<th class="vc_header">#</th>
|
||||
[is annotation "annotated"]
|
||||
<th class="vc_header">User</th>
|
||||
<th class="vc_header">Rev</th>
|
||||
[end]
|
||||
<th class="vc_header">Content</th>
|
||||
</tr>
|
||||
[for lines]
|
||||
[is lines.rev last_rev]
|
||||
[else]
|
||||
[is rowclass "vc_row_even"]
|
||||
[define rowclass]vc_row_odd[end]
|
||||
[else]
|
||||
[define rowclass]vc_row_even[end]
|
||||
[end]
|
||||
[end]
|
||||
|
||||
<tr class="[rowclass]" id="l[lines.line_number]">
|
||||
<td class="vc_file_line_number">[lines.line_number]</td>
|
||||
[is annotation "annotated"]
|
||||
<td class="vc_file_line_author">[is lines.rev last_rev] [else][lines.author][end]</td>
|
||||
<td class="vc_file_line_rev">[is lines.rev last_rev] [else][if-any lines.diff_href]<a href="[lines.diff_href]">[end][lines.rev][if-any lines.diff_href]</a>[end][end]</td>
|
||||
[end]
|
||||
<td class="vc_file_line_text">[lines.text]</td>
|
||||
</tr>
|
||||
[define last_rev][lines.rev][end]
|
||||
[end]
|
||||
</table>
|
||||
</div>
|
||||
|
||||
[else]
|
||||
[if-any image_src_href]
|
||||
<div id="vc_file_image">
|
||||
<img src="[image_src_href]" alt="" />
|
||||
</div>
|
||||
[end]
|
||||
[end]
|
||||
[end]
|
||||
|
||||
[include "include/props.ezt"]
|
||||
|
||||
<!-- ************************************************************** -->
|
||||
</div>
|
||||
|
||||
[include "include/footer.ezt"]
|
@@ -1,89 +0,0 @@
|
||||
[# setup page definitions]
|
||||
[define page_title]Graph of:[end]
|
||||
[define help_href][docroot]/help_rootview.html[end]
|
||||
[# end]
|
||||
|
||||
[include "include/header.ezt" "graph"]
|
||||
|
||||
<div style="text-align:center;">
|
||||
[imagemap]
|
||||
<img usemap="#MyMapName"
|
||||
src="[imagesrc]"
|
||||
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"]
|
@@ -1,189 +0,0 @@
|
||||
[is diffs.diff_block_format "anchor"]
|
||||
<p id="[diffs.anchor]"/>
|
||||
[else]
|
||||
[define msg_no_changes]<strong>- No changes -</strong>[end]
|
||||
[define msg_binary]<strong>- Binary content differs -</strong>[end]
|
||||
[define msg_error]<strong>- ViewVC depends on rcsdiff and GNU diff to create
|
||||
this page. ViewVC cannot find GNU diff. Even if you have GNU diff
|
||||
installed, the rcsdiff program must be configured and compiled with
|
||||
the GNU diff location. -</strong>[end]
|
||||
|
||||
[define left_view_href][if-any diffs.left.prefer_markup][diffs.left.view_href][else][if-any diffs.left.download_href][diffs.left.download_href][end][end][end]
|
||||
[define right_view_href][if-any diffs.right.prefer_markup][diffs.right.view_href][else][if-any diffs.right.download_href][diffs.right.download_href][end][end][end]
|
||||
|
||||
[define left_item][diffs.left.path] ([if-any diffs.propname]property <em>[diffs.propname]</em>[else]file contents[end])[end]
|
||||
[define right_item][diffs.right.path] ([if-any diffs.propname]property <em>[diffs.propname]</em>[else]file contents[end])[end]
|
||||
|
||||
[is left_item right_item]
|
||||
[define common_header][left_item][end]
|
||||
[define left_header]Revision [if-any left_view_href]<a href="[left_view_href]">[end][diffs.left.rev][if-any left_view_href]</a>[end][if-any diffs.left.author] by <em>[diffs.left.author]</em>[end], [diffs.left.date] [if-any diffs.left.tag]<br/>Tag: [diffs.left.tag][end][end]
|
||||
[define right_header]Revision [if-any right_view_href]<a href="[right_view_href]">[end][diffs.right.rev][if-any right_view_href]</a>[end][if-any diffs.right.author] by <em>[diffs.right.author]</em>[end], [diffs.right.date] [if-any diffs.right.tag]<br/>Tag: [diffs.right.tag][end][end]
|
||||
[else]
|
||||
[define common_header][end]
|
||||
[define left_header][left_item], Revision [if-any left_view_href]<a href="[left_view_href]">[end][diffs.left.rev][if-any left_view_href]</a>[end][if-any diffs.left.author] by <em>[diffs.left.author]</em>[end], [diffs.left.date] [if-any diffs.left.tag]<br/>Tag: [diffs.left.tag][end][end]
|
||||
[define right_header][right_item], Revision [if-any right_view_href]<a href="[right_view_href]">[end][diffs.right.rev][if-any right_view_href]</a>[end][if-any diffs.right.author] by <em>[diffs.right.author]</em>[end], [diffs.right.date] [if-any diffs.right.tag]<br/>Tag: [diffs.right.tag][end][end]
|
||||
[end]
|
||||
|
||||
<h2 style="text-indent: -2em; padding-left: 2em;">Comparing[if-any common_header] [common_header][else][end]:<br/>
|
||||
[left_header] vs.<br/>
|
||||
[right_header]</h2>
|
||||
[end]
|
||||
|
||||
[is diffs.diff_block_format "raw"]
|
||||
<table cellspacing="0" cellpadding="0" style="margin-top: 1em; margin-left: 2em;">
|
||||
[is diffs.changes.type "no-changes"]
|
||||
<tr class="vc_diff_empty">
|
||||
<td colspan="2" style="text-align:center;">[msg_no_changes]</td>
|
||||
</tr>
|
||||
[else]
|
||||
[is diffs.changes.type "binary-diff"]
|
||||
<tr class="vc_diff_empty">
|
||||
<td colspan="2" style="text-align:center;">[msg_binary]</td>
|
||||
</tr>
|
||||
[else]
|
||||
<tr><td colspan="2"><pre class="vc_raw_diff">[diffs.changes.raw]</pre></td></tr>
|
||||
[end][end]
|
||||
</table>
|
||||
[end]
|
||||
|
||||
[is diffs.diff_block_format "sidebyside-1"]
|
||||
[define change_right][end]
|
||||
[define last_change_type][end]
|
||||
|
||||
<table cellspacing="0" cellpadding="0" style="margin-top: 1em; margin-left: 2em;">
|
||||
[for diffs.changes]
|
||||
[is diffs.changes.type "change"][else][if-any change_right][change_right][define change_right][end][end][end]
|
||||
[is diffs.changes.type "header"]
|
||||
<tr>
|
||||
<th class="vc_header" style="width:6%;"><strong>#</strong></th>
|
||||
<th colspan="2" class="vc_header">
|
||||
<strong>Line [diffs.changes.line_info_left]</strong> |
|
||||
<strong>Line [diffs.changes.line_info_right]</strong>
|
||||
[if-any diffs.changes.line_info_extra]| <strong>[diffs.changes.line_info_extra]</strong>[end]
|
||||
</th>
|
||||
</tr>
|
||||
[else]
|
||||
[is diffs.changes.type "add"]
|
||||
<tr>
|
||||
<td id="l[diffs.changes.line_number]">[if-any diffs.right.annotate_href]<a href="[diffs.right.annotate_href]#l[diffs.changes.line_number]">[diffs.changes.line_number]</a>[else][diffs.changes.line_number][end]</td>
|
||||
<td class="vc_diff_plusminus"><strong style="color: green;">+</strong></td>
|
||||
<td class="vc_diff_add">[diffs.changes.right]</td>
|
||||
</tr>
|
||||
[else]
|
||||
[is diffs.changes.type "remove"]
|
||||
<tr>
|
||||
<td style="text-decoration: line-through">[diffs.changes.line_number]</td>
|
||||
<td class="vc_diff_plusminus"><strong style="color: red;">–</strong></td>
|
||||
<td class="vc_diff_remove">[diffs.changes.left]</td>
|
||||
</tr>
|
||||
[else]
|
||||
[is diffs.changes.type "change"]
|
||||
[if-any diffs.changes.have_left]
|
||||
<tr>
|
||||
<td style="text-decoration: line-through">[diffs.changes.line_number]</td>
|
||||
<td class="vc_diff_plusminus"><strong style="color: yellow;"><</strong></td>
|
||||
<td class="vc_diff_changes1">[diffs.changes.left]</td>
|
||||
</tr>
|
||||
[end]
|
||||
[define change_right][change_right]
|
||||
[if-any diffs.changes.have_right]
|
||||
<tr>
|
||||
<td id="l[diffs.changes.line_number]">[if-any diffs.right.annotate_href]<a href="[diffs.right.annotate_href]#l[diffs.changes.line_number]">[diffs.changes.line_number]</a>[else][diffs.changes.line_number][end]</td>
|
||||
<td class="vc_diff_plusminus"><strong style="color: yellow;">></strong></td>
|
||||
<td class="vc_diff_changes2">[diffs.changes.right]</td>
|
||||
</tr>
|
||||
[end]
|
||||
[end]
|
||||
[else]
|
||||
[is diffs.changes.type "no-changes"]
|
||||
<tr><td colspan="3" style="vc_diff_nochange">[msg_no_changes]</td></tr>
|
||||
[else]
|
||||
[is diffs.changes.type "binary-diff"]
|
||||
<tr><td colspan="3" class="vc_diff_binary">[msg_binary]</td></tr>
|
||||
[else]
|
||||
[is diffs.changes.type "error"]
|
||||
<tr><td colspan="3" class="vc_diff_error">[msg_error]</td></tr>
|
||||
[else][# a line of context]
|
||||
<tr>
|
||||
<td id="l[diffs.changes.line_number]">[if-any diffs.right.annotate_href]<a href="[diffs.right.annotate_href]#l[diffs.changes.line_number]">[diffs.changes.line_number]</a>[else][diffs.changes.line_number][end]</td>
|
||||
<td class="vc_diff_plusminus"> </td>
|
||||
<td style="font-family: monospace; white-space: pre;">[diffs.changes.right]</td>
|
||||
</tr>
|
||||
[end][end][end][end][end][end][end]
|
||||
[define last_change_type][diffs.changes.type][end]
|
||||
[end]
|
||||
[if-any change_right][change_right][end]
|
||||
</table>
|
||||
[end]
|
||||
|
||||
[is diffs.diff_block_format "sidebyside-2"]
|
||||
<table class="vc_idiff" cellspacing="0" cellpadding="0" style="margin-top: 1em; margin-left: 2em;">
|
||||
<colgroup><col style="width: 3%;"/><col class="content" style="width: 47%;"/></colgroup>
|
||||
<colgroup><col style="width: 3%;"/><col class="content" style="width: 47%;"/></colgroup>
|
||||
<tbody>
|
||||
[for diffs.changes]
|
||||
[is diffs.changes.type "no-changes"]
|
||||
<tr class="vc_diff_empty">
|
||||
<td colspan="4" style="text-align:center;">[msg_no_changes]</td>
|
||||
</tr>
|
||||
[else]
|
||||
[is diffs.changes.type "binary-diff"]
|
||||
<tr class="vc_diff_empty">
|
||||
<td colspan="4" style="text-align:center;">[msg_binary]</td>
|
||||
</tr>
|
||||
[else]
|
||||
[if-any diffs.changes.gap]
|
||||
<tr>
|
||||
<th>…</th><th></th>
|
||||
<th>…</th><th></th>
|
||||
</tr>
|
||||
[end]
|
||||
<tr>
|
||||
[for diffs.changes.columns]
|
||||
<th>[diffs.changes.columns.line_number]</th><td[if-any diffs.changes.columns.line_number][else] class="vc_idiff_empty"[end]>[for diffs.changes.columns.segments][if-any diffs.changes.columns.segments.type]<span class="vc_idiff_[diffs.changes.columns.segments.type]">[diffs.changes.columns.segments.text]</span>[else][diffs.changes.columns.segments.text][end][end]</td>
|
||||
[end]
|
||||
</tr>
|
||||
[end]
|
||||
[end]
|
||||
[end]
|
||||
</tbody>
|
||||
</table>
|
||||
[end]
|
||||
|
||||
[is diffs.diff_block_format "unified"]
|
||||
<table class="vc_idiff" cellspacing="0" cellpadding="0" style="margin-top: 1em; margin-left: 2em;">
|
||||
<colgroup>
|
||||
<col style="width: 3%;"/>
|
||||
<col style="width: 3%;"/>
|
||||
<col class="content" style="width: 94%;"/>
|
||||
</colgroup>
|
||||
<tbody>
|
||||
[for diffs.changes]
|
||||
[is diffs.changes.type "no-changes"]
|
||||
<tr class="vc_diff_empty">
|
||||
<td colspan="3" style="text-align:center;">[msg_no_changes]</td>
|
||||
</tr>
|
||||
[else]
|
||||
[is diffs.changes.type "binary-diff"]
|
||||
<tr class="vc_diff_empty">
|
||||
<td colspan="3" style="text-align:center;">[msg_binary]</td>
|
||||
</tr>
|
||||
[else]
|
||||
[if-any diffs.changes.gap]
|
||||
<tr>
|
||||
<th>…</th>
|
||||
<th>…</th>
|
||||
<th></th>
|
||||
</tr>
|
||||
[end]
|
||||
<tr>
|
||||
<th>[diffs.changes.left_number]</th>
|
||||
<th>[diffs.changes.right_number]</th>
|
||||
<td[if-any diffs.changes.type] class="vc_idiff_[diffs.changes.type]"[end]>[for diffs.changes.segments][if-any diffs.changes.segments.type]<span class="vc_idiff_[diffs.changes.segments.type]">[diffs.changes.segments.text]</span>[else][diffs.changes.segments.text][end][end]</td>
|
||||
</tr>
|
||||
[end]
|
||||
[end]
|
||||
[end]
|
||||
</tbody>
|
||||
</table>
|
||||
[end]
|
@@ -1,70 +0,0 @@
|
||||
|
||||
<div style="border-bottom: solid 1px black;">
|
||||
<p id="diff">This form allows you to request diffs between any two
|
||||
revisions of this file.
|
||||
For each of the two "sides" of the diff,
|
||||
[if-any tags]
|
||||
select a symbolic revision name using the selection box, or choose
|
||||
'Use Text Field' and enter a numeric revision.
|
||||
[else]
|
||||
enter a numeric revision.
|
||||
[end]
|
||||
</p>
|
||||
|
||||
<form method="get" action="[diff_select_action]" id="diff_select">
|
||||
|
||||
<table cellpadding="2" cellspacing="0" class="auto">
|
||||
<tr>
|
||||
<td> </td>
|
||||
<td>
|
||||
[for diff_select_hidden_values]<input type="hidden" name="[diff_select_hidden_values.name]" value="[diff_select_hidden_values.value]"/>[end]
|
||||
Diffs between
|
||||
[if-any tags]
|
||||
<select name="r1">
|
||||
<option value="text" selected="selected">Use Text Field</option>
|
||||
[for tags]
|
||||
<option value="[tags.rev]:[tags.name]">[tags.name]</option>
|
||||
[end]
|
||||
</select>
|
||||
<input type="text" size="12" name="tr1"
|
||||
value="[if-any rev_selected][rev_selected][else][first_revision][end]"
|
||||
onchange="document.getElementById('diff_select').r1.selectedIndex=0" />
|
||||
[else]
|
||||
<input type="text" size="12" name="r1"
|
||||
value="[if-any rev_selected][rev_selected][else][first_revision][end]" />
|
||||
[end]
|
||||
|
||||
and
|
||||
[if-any tags]
|
||||
<select name="r2">
|
||||
<option value="text" selected="selected">Use Text Field</option>
|
||||
[for tags]
|
||||
<option value="[tags.rev]:[tags.name]">[tags.name]</option>
|
||||
[end]
|
||||
</select>
|
||||
<input type="text" size="12" name="tr2"
|
||||
value="[last_revision]"
|
||||
onchange="document.getElementById('diff_select').r2.selectedIndex=0" />
|
||||
[else]
|
||||
<input type="text" size="12" name="r2" value="[last_revision]" />
|
||||
[end]
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> </td>
|
||||
<td>
|
||||
Type of Diff should be a
|
||||
<select name="diff_format" onchange="submit()">
|
||||
<option value="h" [is diff_format "h"]selected="selected"[end]>Colored Diff</option>
|
||||
<option value="l" [is diff_format "l"]selected="selected"[end]>Long Colored Diff</option>
|
||||
<option value="f" [is diff_format "f"]selected="selected"[end]>Full Colored Diff</option>
|
||||
<option value="u" [is diff_format "u"]selected="selected"[end]>Unidiff</option>
|
||||
<option value="c" [is diff_format "c"]selected="selected"[end]>Context Diff</option>
|
||||
<option value="s" [is diff_format "s"]selected="selected"[end]>Side by Side</option>
|
||||
</select>
|
||||
<input type="submit" value=" Get Diffs " />
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</form>
|
||||
</div>
|
@@ -1,10 +0,0 @@
|
||||
</div> <!-- vc_view_main -->
|
||||
|
||||
<div id="vc_footer">
|
||||
[if-any cfg.general.address]Administered by <address><a href="mailto:[cfg.general.address]">[cfg.general.address]</a></address><br/>[end]
|
||||
Powered by <a href="http://viewvc.tigris.org/">ViewVC [vsn]</a>
|
||||
[if-any rss_href]<br/><a href="[rss_href]" title="RSS 2.0 feed"><img src="[docroot]/images/feed-icon-16x16.jpg" class="vc_icon" alt="RSS 2.0 feed" /></a>[else] [end]
|
||||
</div>
|
||||
|
||||
</body>
|
||||
</html>
|
@@ -1,71 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||
|
||||
<!-- ViewVC :: http://www.viewvc.org/ -->
|
||||
|
||||
<head>
|
||||
<title>[[]ViewVC] [page_title] [if-any rootname][rootname][if-any where]/[where][end][end]</title>
|
||||
<meta name="generator" content="ViewVC [vsn]" />
|
||||
<link rel="stylesheet" href="[docroot]/styles.css" type="text/css" />
|
||||
<script src="[docroot]/scripts.js"></script>
|
||||
[if-any rss_href]
|
||||
<link rel="alternate" type="application/rss+xml" href="[rss_href]" title="ViewVC RSS: [if-any rootname][rootname][if-any where]/[where][end][end]">
|
||||
[end]
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<div id="vc_header">
|
||||
|
||||
<div id="vc_topmatter">
|
||||
[if-any username]Logged in as: <strong>[username]</strong> |[end]
|
||||
<a href="[help_href]">ViewVC Help</a>
|
||||
</div>
|
||||
|
||||
<div id="vc_logo">
|
||||
<a href="http://www.viewvc.org/"><img src="[docroot]/images/viewvc-logo.png" alt="ViewVC logotype" width="240" height="70" /></a>
|
||||
</div>
|
||||
|
||||
<div id="vc_view_selection_group">
|
||||
[is pathtype "dir"]
|
||||
<a class="vc_view_link[is view "dir"]_this[end]" href="[view_href]">View Directory</a>
|
||||
[if-any log_href]
|
||||
| <a class="vc_view_link[is view "log"]_this[end]" href="[log_href]">Revision Log</a>
|
||||
[end]
|
||||
[if-any queryform_href]
|
||||
| <a class="vc_view_link[is view "queryform"]_this[end]" href="[queryform_href]">Commit Query</a>
|
||||
[end]
|
||||
[if-any tarball_href]
|
||||
| <a class="vc_view_link" href="[tarball_href]">Download Tarball</a>
|
||||
[end]
|
||||
[end]
|
||||
[is pathtype "file"]
|
||||
[if-any view_href]
|
||||
<a class="vc_view_link[is view "markup"]_this[end]" href="[view_href]">View File</a> |
|
||||
[end]
|
||||
<a class="vc_view_link[is view "log"]_this[end]" href="[log_href]">Revision Log</a>
|
||||
[if-any annotate_href]
|
||||
| <a class="vc_view_link[is view "annotate"]_this[end]" href="[annotate_href]">Show Annotations</a>
|
||||
[end]
|
||||
[if-any graph_href]
|
||||
| <a class="vc_view_link[is view "graph"]_this[end]" href="[graph_href]">Revision Graph</a>
|
||||
[end]
|
||||
[if-any download_href]
|
||||
| <a class="vc_view_link" href="[download_href]">Download File</a>
|
||||
[end]
|
||||
[end]
|
||||
[if-any revision_href]
|
||||
| <a class="vc_view_link[is view "revision"]_this[end]" href="[revision_href]">View Changeset</a>
|
||||
[end]
|
||||
[if-any roots_href]
|
||||
| <a class="vc_view_link[is view "roots"]_this[end]" href="[roots_href]">Root Listing</a>
|
||||
[end]
|
||||
</div>
|
||||
|
||||
<div id="vc_current_path">
|
||||
[if-any roots_href]<a href="[roots_href]">root</a>[end][if-any nav_path]<span class="pathdiv">/</span>[for nav_path][if-any nav_path.href]<a href="[nav_path.href]">[end][if-index nav_path last]<span class="thisitem">[end][nav_path.name][if-index nav_path last]</span>[end][if-any nav_path.href]</a>[end][if-index nav_path last][else]<span class="pathdiv">/</span>[end][end][end]
|
||||
</div>
|
||||
|
||||
</div> <!-- vc_header -->
|
||||
|
||||
<div id="vc_view_main">
|
@@ -1,53 +0,0 @@
|
||||
<form class="inline" method="get" action="[pathrev_action]">
|
||||
<div class="inline">
|
||||
[for pathrev_hidden_values]<input type="hidden" name="[pathrev_hidden_values.name]" value="[pathrev_hidden_values.value]"/>[end]
|
||||
[is roottype "cvs"]
|
||||
[define pathrev_selected][pathrev][end]
|
||||
<select name="pathrev" onchange="submit()">
|
||||
<option value=""></option>
|
||||
[if-any branch_tags]
|
||||
<optgroup label="Branches">
|
||||
[for branch_tags]
|
||||
[is branch_tags pathrev]
|
||||
<option selected>[branch_tags]</option>
|
||||
[define pathrev_selected][end]
|
||||
[else]
|
||||
<option>[branch_tags]</option>
|
||||
[end]
|
||||
[end]
|
||||
</optgroup>
|
||||
[end]
|
||||
<optgroup label="Non-branch tags">
|
||||
[for plain_tags]
|
||||
[is plain_tags pathrev]
|
||||
<option selected>[plain_tags]</option>
|
||||
[define pathrev_selected][end]
|
||||
[else]
|
||||
<option>[plain_tags]</option>
|
||||
[end]
|
||||
[end]
|
||||
</optgroup>
|
||||
[if-any pathrev_selected]
|
||||
<option selected>[pathrev_selected]</option>
|
||||
[end]
|
||||
</select>
|
||||
[else]
|
||||
<input type="text" name="pathrev" value="[pathrev]" size="6"/>
|
||||
[end]
|
||||
<input type="submit" value="Set Sticky [is roottype "cvs"]Tag[else]Revision[end]" />
|
||||
</div>
|
||||
</form>
|
||||
|
||||
[if-any pathrev]
|
||||
<form class="inline" method="get" action="[pathrev_clear_action]">
|
||||
<div class="inline">
|
||||
[for pathrev_clear_hidden_values]<input type="hidden" name="[pathrev_clear_hidden_values.name]" value="[pathrev_clear_hidden_values.value]"/>[end]
|
||||
[if-any lastrev]
|
||||
[is pathrev lastrev][else]<input type="submit" value="Set to [lastrev]" />[end]
|
||||
(<i>Current path doesn't exist after revision <strong>[lastrev]</strong></i>)
|
||||
[else]
|
||||
<input type="submit" value="Clear" />
|
||||
[end]
|
||||
</div>
|
||||
</form>
|
||||
[end]
|
@@ -1,25 +0,0 @@
|
||||
[if-any properties]
|
||||
<h2>Properties</h2>
|
||||
<div class="vc_properties">
|
||||
<table cellspacing="2" class="fixed">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="vc_header_sort" style="width: 200px;">Name</th>
|
||||
<th class="vc_header">Value</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
[for properties]
|
||||
<tr class="vc_row_[if-index properties even]even[else]odd[end]">
|
||||
<td><strong>[properties.name]</strong></td>
|
||||
[if-any properties.undisplayable]
|
||||
<td><em>Property value is undisplayable.</em></td>
|
||||
[else]
|
||||
<td style="white-space: pre;">[properties.value]</td>
|
||||
[end]
|
||||
</tr>
|
||||
[end]
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
[end]
|
@@ -1,229 +0,0 @@
|
||||
[# setup page definitions]
|
||||
[define page_title]Log of:[end]
|
||||
[define help_href][docroot]/help_log.html[end]
|
||||
[# end]
|
||||
[include "include/header.ezt" "log"]
|
||||
|
||||
<div id="vc_main_body">
|
||||
<!-- ************************************************************** -->
|
||||
|
||||
<div id="vc_revision_log">
|
||||
|
||||
[define first_revision][end]
|
||||
[define last_revision][end]
|
||||
[for entries]
|
||||
[if-index entries first][define first_revision][entries.rev][end][end]
|
||||
[if-index entries last][define last_revision][entries.rev][end][end]
|
||||
|
||||
<div class="vc_log_block_[if-index entries even]even[else]odd[end]">
|
||||
|
||||
[is entries.state "dead"]
|
||||
Revision <strong>[entries.rev]</strong>
|
||||
[else]
|
||||
<a name="rev[entries.rev]"></a>
|
||||
[for entries.tag_names]<a name="[entries.tag_names]"></a>[end]
|
||||
[for entries.branch_names]<a name="[entries.branch_names]"></a>[end]
|
||||
|
||||
Revision [is roottype "svn"]<a href="[entries.revision_href]"><strong>[entries.rev]</strong></a>[else]<strong>[entries.rev]</strong>[end] -
|
||||
[if-any entries.view_href]
|
||||
[is pathtype "file"]
|
||||
(<a href="[entries.view_href]">view</a>)
|
||||
[else]
|
||||
<a href="[entries.view_href]">Directory Listing</a>
|
||||
[end]
|
||||
[end]
|
||||
[if-any entries.download_href](<a href="[entries.download_href]">download</a>)[end]
|
||||
[if-any entries.download_text_href](<a href="[entries.download_text_href]">as text</a>)[end]
|
||||
[if-any entries.annotate_href](<a href="[entries.annotate_href]">annotate</a>)[end]
|
||||
|
||||
[# if you don't want to allow select for diffs then remove this section]
|
||||
[is entries.rev rev_selected]
|
||||
- <strong>[[]selected]</strong>
|
||||
[else]
|
||||
- <a href="[entries.sel_for_diff_href]">[[]select for diffs]</a>
|
||||
[end]
|
||||
[end]
|
||||
|
||||
[if-any entries.vendor_branch]
|
||||
<em>(vendor branch)</em>
|
||||
[end]
|
||||
|
||||
<br />
|
||||
|
||||
[is roottype "svn"]
|
||||
[if-index entries last]Added[else]Modified[end]
|
||||
[end]
|
||||
|
||||
<em>[if-any entries.date][entries.date][else](unknown date)[end]</em>
|
||||
[if-any entries.ago]([entries.ago] ago)[end]
|
||||
by <em>[if-any entries.author][entries.author][else](unknown author)[end]</em>
|
||||
|
||||
[if-any entries.orig_path]
|
||||
<br />Original Path: <a href="[entries.orig_href]"><em>[entries.orig_path]</em></a>
|
||||
[end]
|
||||
|
||||
[if-any entries.branches]
|
||||
<br />Branch:
|
||||
[for entries.branches]
|
||||
<a href="[entries.branches.href]"><strong>[entries.branches.name]</strong></a>[if-index entries.branches last][else],[end]
|
||||
[end]
|
||||
[end]
|
||||
|
||||
[if-any entries.tags]
|
||||
<br />CVS Tags:
|
||||
[for entries.tags]
|
||||
<a href="[entries.tags.href]"><strong>[entries.tags.name]</strong></a>[if-index entries.tags last][else],[end]
|
||||
[end]
|
||||
[end]
|
||||
|
||||
[if-any entries.branch_points]
|
||||
<br />Branch point for:
|
||||
[for entries.branch_points]
|
||||
<a href="[entries.branch_points.href]"><strong>[entries.branch_points.name]</strong></a>[if-index entries.branch_points last][else],[end]
|
||||
[end]
|
||||
[end]
|
||||
|
||||
[if-any entries.prev]
|
||||
[if-any entries.changed]
|
||||
[is roottype "cvs"]
|
||||
<br />Changes since <strong>[entries.prev]: [entries.changed] lines</strong>
|
||||
[end]
|
||||
[end]
|
||||
[end]
|
||||
|
||||
[if-any entries.lockinfo]
|
||||
<br />Lock status: [entries.lockinfo]
|
||||
[end]
|
||||
|
||||
[is roottype "svn"]
|
||||
[if-any entries.size]
|
||||
<br />File length: [entries.size] byte(s)
|
||||
[end]
|
||||
|
||||
[if-any entries.copy_path]
|
||||
<br />Copied from: <a href="[entries.copy_href]"><em>[entries.copy_path]</em></a> revision [entries.copy_rev]
|
||||
[end]
|
||||
[end]
|
||||
|
||||
[is entries.state "dead"]
|
||||
<br /><strong><em>FILE REMOVED</em></strong>
|
||||
[else]
|
||||
[if-any entries.diff_to_prev_href]
|
||||
<br />Diff to <a href="[entries.diff_to_prev_href]">previous [entries.prev]</a>
|
||||
[if-any human_readable]
|
||||
[else]
|
||||
(<a href="[entries.diff_to_prev_href]&diff_format=h">colored</a>)
|
||||
[end]
|
||||
[end]
|
||||
|
||||
[is roottype "cvs"]
|
||||
[if-any entries.branch_point]
|
||||
, to <a href="[entries.diff_to_branch_href]">branch point [entries.branch_point]</a>
|
||||
[if-any human_readable]
|
||||
[else]
|
||||
(<a href="[entries.diff_to_branch_href]&diff_format=h">colored</a>)
|
||||
[end]
|
||||
[end]
|
||||
|
||||
[if-any entries.next_main]
|
||||
, to <a href="[entries.diff_to_main_href]">next main [entries.next_main]</a>
|
||||
[if-any human_readable]
|
||||
[else]
|
||||
(<a href="[entries.diff_to_main_href]&diff_format=h">colored</a>)
|
||||
[end]
|
||||
[end]
|
||||
[end]
|
||||
|
||||
[if-any entries.diff_to_sel_href]
|
||||
[if-any entries.prev], [else]<br />Diff[end]
|
||||
to <a href="[entries.diff_to_sel_href]">selected [rev_selected]</a>
|
||||
[if-any human_readable]
|
||||
[else]
|
||||
(<a href="[entries.diff_to_sel_href]&diff_format=h">colored</a>)
|
||||
[end]
|
||||
[end]
|
||||
[end]
|
||||
|
||||
<pre class="vc_log">[entries.log]</pre>
|
||||
</div>
|
||||
[end]
|
||||
|
||||
</div>
|
||||
|
||||
<div id="vc_view_summary">
|
||||
[is picklist_len "0"][else][is picklist_len "1"][else]
|
||||
<form class="inline" method="get" action="[log_paging_action]">
|
||||
<div class="inline lpad">
|
||||
[for log_paging_hidden_values]<input type="hidden" name="[log_paging_hidden_values.name]" value="[log_paging_hidden_values.value]"/>[end]
|
||||
<select name="log_pagestart" onchange="submit()">
|
||||
[for picklist]
|
||||
<option [is picklist.count log_pagestart]selected[end] value="[picklist.count]">page [picklist.page]: [picklist.start] [if-any picklist.more]...[else]- [picklist.end][end]</option>
|
||||
[end]
|
||||
</select>
|
||||
<input type="submit" value=" View Range " />
|
||||
</div>
|
||||
</form>
|
||||
[end][end]
|
||||
<form class="inline" method="get" action="[logsort_action]">
|
||||
<div id="logsort" class="inline lpad">
|
||||
[for logsort_hidden_values]<input type="hidden" name="[logsort_hidden_values.name]" value="[logsort_hidden_values.value]"/>[end]
|
||||
<select name="logsort" onchange="submit()">
|
||||
<option value="cvs" [is logsort "cvs"]selected="selected"[end]>unsorted</option>
|
||||
<option value="date" [is logsort "date"]selected="selected"[end]>by date</option>
|
||||
<option value="rev" [is logsort "rev"]selected="selected"[end]>by revision</option>
|
||||
</select>
|
||||
<input type="submit" value=" Sort " />
|
||||
</div>
|
||||
</form>
|
||||
<div class="inline lpad">
|
||||
[include "include/pathrev_form.ezt"]
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- ************************************************************** -->
|
||||
</div>
|
||||
|
||||
<h2>Convenience Links</h2>
|
||||
|
||||
[if-any default_branch]
|
||||
<tr>
|
||||
<td>Default branch:</td>
|
||||
<td>[for default_branch]<a href="[default_branch.href]">[default_branch.name]</a>[if-index default_branch last][else], [end]
|
||||
[end]</td>
|
||||
</tr>
|
||||
[end]
|
||||
|
||||
[is pathtype "file"]
|
||||
[if-any view_href]
|
||||
<tr>
|
||||
<td>Links to HEAD:</td>
|
||||
<td>
|
||||
(<a href="[view_href]">view</a>)
|
||||
[if-any download_href](<a href="[download_href]">download</a>)[end]
|
||||
[if-any download_text_href](<a href="[download_text_href]">as text</a>)[end]
|
||||
[if-any annotate_href](<a href="[annotate_href]">annotate</a>)[end]
|
||||
</td>
|
||||
</tr>
|
||||
[end]
|
||||
|
||||
[if-any tag_view_href]
|
||||
<tr>
|
||||
<td>Links to [pathrev]:</td>
|
||||
<td>
|
||||
(<a href="[tag_view_href]">view</a>)
|
||||
[if-any tag_download_href](<a href="[tag_download_href]">download</a>)[end]
|
||||
[if-any tag_download_text_href](<a href="[tag_download_text_href]">as text</a>)[end]
|
||||
[if-any tag_annotate_href](<a href="[tag_annotate_href]">annotate</a>)[end]
|
||||
</td>
|
||||
</tr>
|
||||
[end]
|
||||
[end]
|
||||
|
||||
</table>
|
||||
|
||||
[is pathtype "file"]
|
||||
<h2>Compare Revisions</h2>
|
||||
[include "include/diff_form.ezt"]
|
||||
[end]
|
||||
|
||||
[include "include/footer.ezt"]
|
@@ -1,241 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||
<!-- ViewVC :: http://www.viewvc.org/ -->
|
||||
<head>
|
||||
<title>Checkin Database Query</title>
|
||||
<link rel="stylesheet" href="[docroot]/styles.css" type="text/css" />
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
[# setup page definitions]
|
||||
[define help_href][docroot]/help_query.html[end]
|
||||
[# end]
|
||||
|
||||
<p>
|
||||
Select your parameters for querying the CVS commit database. You
|
||||
can search for multiple matches by typing a comma-seperated list
|
||||
into the text fields. Regular expressions, and wildcards are also
|
||||
supported. Blank text input fields are treated as wildcards.
|
||||
</p>
|
||||
<p>
|
||||
Any of the text entry fields can take a comma-seperated list of
|
||||
search arguments. For example, to search for all commits from
|
||||
authors <em>jpaint</em> and <em>gstein</em>, just type: <strong>jpaint,
|
||||
gstein</strong> in the <em>Author</em> input box. If you are searching
|
||||
for items containing spaces or quotes, you will need to quote your
|
||||
request. For example, the same search above with quotes is:
|
||||
<strong>"jpaint", "gstein"</strong>.
|
||||
</p>
|
||||
<p>
|
||||
|
||||
Wildcard and regular expression searches are entered in a similar
|
||||
way to the quoted requests. You must quote any wildcard or
|
||||
regular expression request, and a command charactor preceeds the
|
||||
first quote. The command charactor <strong>l</strong> is for wildcard
|
||||
searches, and the wildcard charactor is a percent (<strong>%</strong>). The
|
||||
command charactor for regular expressions is <strong>r</strong>, and is
|
||||
passed directly to MySQL, so you'll need to refer to the MySQL
|
||||
manual for the exact regex syntax. It is very similar to Perl. A
|
||||
wildard search for all files with a <em>.py</em> extention is:
|
||||
<strong>l"%.py"</strong> in the <em>File</em> input box. The same search done
|
||||
with a regular expression is: <strong>r".*\.py"</strong>.
|
||||
</p>
|
||||
<p>
|
||||
All search types can be mixed, as long as they are seperated by
|
||||
commas.
|
||||
</p>
|
||||
|
||||
<form method="get" action="">
|
||||
|
||||
<div class="vc_query_form">
|
||||
<table cellspacing="0" cellpadding="2" class="auto">
|
||||
<tr>
|
||||
<td>
|
||||
<table>
|
||||
<tr>
|
||||
<td style="vertical-align:top;">
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<td align="right">CVS Repository:</td>
|
||||
<td>
|
||||
<input type="text" name="repository" size="40" value="[repository]" />
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="right">CVS Branch:</td>
|
||||
<td>
|
||||
<input type="text" name="branch" size="40" value="[branch]" />
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="right">Directory:</td>
|
||||
<td>
|
||||
<input type="text" name="directory" size="40" value="[directory]" />
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="right">File:</td>
|
||||
<td>
|
||||
<input type="text" name="file" size="40" value="[file]" />
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="right">Author:</td>
|
||||
<td>
|
||||
<input type="text" name="who" size="40" value="[who]" />
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
</td>
|
||||
<td style="vertical-align:top;">
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<td align="left">Sort By:</td>
|
||||
<td>
|
||||
<select name="sortby">
|
||||
<option value="date" [is sortby "date"]selected="selected"[end]>Date</option>
|
||||
<option value="author" [is sortby "author"]selected="selected"[end]>Author</option>
|
||||
<option value="file" [is sortby "file"]selected="selected"[end]>File</option>
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="2">
|
||||
<table cellspacing="0" cellpadding="0">
|
||||
<tr>
|
||||
<td>Date:</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><input type="radio" name="date" value="hours"
|
||||
[is date "hours"]checked="checked"[end] /></td>
|
||||
<td>In the last
|
||||
<input type="text" name="hours" value="[hours]" size="4" />hours
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><input type="radio" name="date" value="day"
|
||||
[is date "day"]checked="checked"[end] /></td>
|
||||
<td>In the last day</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><input type="radio" name="date" value="week"
|
||||
[is date "week"]checked="checked"[end] /></td>
|
||||
<td>In the last week</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><input type="radio" name="date" value="month"
|
||||
[is date "month"]checked="checked"[end] /></td>
|
||||
<td>In the last month</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><input type="radio" name="date" value="all"
|
||||
[is date "all"]checked="checked"[end] /></td>
|
||||
<td>Since the beginning of time</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
<td>
|
||||
<input type="submit" value="Search" />
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
</form>
|
||||
|
||||
[is query "skipped"]
|
||||
[else]
|
||||
<p><strong>[num_commits]</strong> matches found.</p>
|
||||
|
||||
[if-any commits]
|
||||
<table cellspacing="0" cellpadding="2">
|
||||
<thead>
|
||||
<tr class="vc_header">
|
||||
<th>Revision</th>
|
||||
<th>File</th>
|
||||
<th>Branch</th>
|
||||
<th>+/-</th>
|
||||
<th>Date</th>
|
||||
<th>Author</th>
|
||||
[# uncommment, if you want a separate Description column: (also see below)
|
||||
<th>Description</th>
|
||||
]
|
||||
</tr>
|
||||
</thead>
|
||||
[for commits]
|
||||
<tbody>
|
||||
[for commits.files]
|
||||
<tr class="vc_row_[if-index commits even]even[else]odd[end]">
|
||||
<td style="vertical-align:top;">
|
||||
[if-any commits.files.rev][commits.files.rev][else] [end]
|
||||
</td>
|
||||
<td style="vertical-align:top;">[commits.files.link]</td>
|
||||
<td style="vertical-align:top;">
|
||||
[if-any commits.files.branch][commits.files.branch][else] [end]
|
||||
</td>
|
||||
<td style="vertical-align:top;">
|
||||
[is commits.files.type "Add"]<ins>[end]
|
||||
[is commits.files.type "Change"]<a href="[commits.files.difflink]">[end]
|
||||
[is commits.files.type "Remove"]<del>[end]
|
||||
[commits.files.plus]/[commits.files.minus]
|
||||
[is commits.files.type "Add"]</ins>[end]
|
||||
[is commits.files.type "Change"]</a>[end]
|
||||
[is commits.files.type "Remove"]</del>[end]
|
||||
</td>
|
||||
<td style="vertical-align:top;">
|
||||
[if-any commits.files.date][commits.files.date][else] [end]
|
||||
</td>
|
||||
<td style="vertical-align:top;">
|
||||
[if-any commits.files.author][commits.files.author][else] [end]
|
||||
</td>
|
||||
|
||||
[# uncommment, if you want a separate Description column:
|
||||
{if-index commits.files first{
|
||||
<td style="vertical-align:top;" rowspan="{commits.num_files}">
|
||||
{commits.log}
|
||||
</td>
|
||||
{end}
|
||||
|
||||
(substitute brackets for the braces)
|
||||
]
|
||||
</tr>
|
||||
[# and also take the following out in the "Description column"-case:]
|
||||
[if-index commits.files last]
|
||||
<tr class="vc_row_[if-index commits even]even[else]odd[end]">
|
||||
<td> </td>
|
||||
<td colspan="5"><strong>Log:</strong><br />
|
||||
<pre class="vc_log">[commits.log]</pre></td>
|
||||
</tr>
|
||||
[end]
|
||||
[# ---]
|
||||
[end]
|
||||
</tbody>
|
||||
[end]
|
||||
|
||||
<tr class="vc_header">
|
||||
<th style="text-align:left;vertical-align:top;"> </th>
|
||||
<th style="text-align:left;vertical-align:top;"> </th>
|
||||
<th style="text-align:left;vertical-align:top;"> </th>
|
||||
<th style="text-align:left;vertical-align:top;"> </th>
|
||||
<th style="text-align:left;vertical-align:top;"> </th>
|
||||
<th style="text-align:left;vertical-align:top;"> </th>
|
||||
[# uncommment, if you want a separate Description column:
|
||||
<th style="text-align:left;vertical-align:top;"> </th>
|
||||
]
|
||||
</tr>
|
||||
</table>
|
||||
[end]
|
||||
[end]
|
||||
[include "include/footer.ezt"]
|
@@ -1,201 +0,0 @@
|
||||
[# setup page definitions]
|
||||
[define page_title]Query on:[end]
|
||||
[define help_href][docroot]/help_rootview.html[end]
|
||||
[# end]
|
||||
[include "include/header.ezt" "query"]
|
||||
|
||||
<form action="[query_action]" method="get">
|
||||
|
||||
<div class="vc_query_form">
|
||||
[for query_hidden_values]<input type="hidden" name="[query_hidden_values.name]" value="[query_hidden_values.value]"/>[end]
|
||||
<table cellspacing="0" cellpadding="5" class="auto">
|
||||
[is roottype "cvs"]
|
||||
[# For subversion, the branch field is not used ]
|
||||
<tr>
|
||||
<th style="text-align:right;vertical-align:top;">Branch:</th>
|
||||
<td>
|
||||
<input type="text" name="branch" value="[branch]" />
|
||||
<label for="branch_match_exact">
|
||||
<input type="radio" name="branch_match" id="branch_match_exact"
|
||||
value="exact" [is branch_match "exact"]checked="checked"[end] />
|
||||
exact
|
||||
</label>
|
||||
<label for="branch_match_glob">
|
||||
<input type="radio" name="branch_match" id="branch_match_glob"
|
||||
value="glob" [is branch_match "glob"]checked="checked"[end] />
|
||||
glob pattern
|
||||
</label>
|
||||
<label for="branch_match_regex">
|
||||
<input type="radio" name="branch_match" id="branch_match_regex"
|
||||
value="regex" [is branch_match "regex"]checked="checked"[end] />
|
||||
regex
|
||||
</label>
|
||||
<label for="branch_match_notregex">
|
||||
<input type="radio" name="branch_match" id="branch_match_notregex"
|
||||
value="notregex" [is branch_match "notregex"]checked="checked"[end] />
|
||||
<em>not</em> regex
|
||||
</label>
|
||||
</td>
|
||||
</tr>
|
||||
[end]
|
||||
<tr>
|
||||
<th style="text-align:right;vertical-align:top;">Subdirectory:</th>
|
||||
<td>
|
||||
<input type="text" name="dir" value="[dir]" />
|
||||
<em>(You can list multiple directories separated by commas.)</em>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th style="text-align:right;vertical-align:top;">File:</th>
|
||||
<td>
|
||||
<input type="text" name="file" value="[file]" />
|
||||
<label for="file_match_exact">
|
||||
<input type="radio" name="file_match" id="file_match_exact"
|
||||
value="exact" [is file_match "exact"]checked="checked"[end] />
|
||||
exact
|
||||
</label>
|
||||
<label for="file_match_glob">
|
||||
<input type="radio" name="file_match" id="file_match_glob"
|
||||
value="glob" [is file_match "glob"]checked="checked"[end] />
|
||||
glob pattern
|
||||
</label>
|
||||
<label for="file_match_regex">
|
||||
<input type="radio" name="file_match" id="file_match_regex"
|
||||
value="regex" [is file_match "regex"]checked="checked"[end] />
|
||||
regex
|
||||
</label>
|
||||
<label for="file_match_notregex">
|
||||
<input type="radio" name="file_match" id="file_match_notregex"
|
||||
value="notregex" [is file_match "notregex"]checked="checked"[end] />
|
||||
<em>not</em> regex
|
||||
</label>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th style="text-align:right;vertical-align:top;">Who:</th>
|
||||
<td>
|
||||
<input type="text" name="who" value="[who]" />
|
||||
<label for="who_match_exact">
|
||||
<input type="radio" name="who_match" id="who_match_exact"
|
||||
value="exact" [is who_match "exact"]checked="checked"[end] />
|
||||
exact
|
||||
</label>
|
||||
<label for="who_match_glob">
|
||||
<input type="radio" name="who_match" id="who_match_glob"
|
||||
value="glob" [is who_match "glob"]checked="checked"[end] />
|
||||
glob pattern
|
||||
</label>
|
||||
<label for="who_match_regex">
|
||||
<input type="radio" name="who_match" id="who_match_regex"
|
||||
value="regex" [is who_match "regex"]checked="checked"[end] />
|
||||
regex
|
||||
</label>
|
||||
<label for="who_match_notregex">
|
||||
<input type="radio" name="who_match" id="who_match_notregex"
|
||||
value="notregex" [is who_match "notregex"]checked="checked"[end] />
|
||||
<em>not</em> regex
|
||||
</label>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th style="text-align:right;vertical-align:top;">Comment:</th>
|
||||
<td>
|
||||
<input type="text" name="comment" value="[comment]" />
|
||||
<label for="comment_match_exact">
|
||||
<input type="radio" name="comment_match" id="comment_match_exact"
|
||||
value="exact" [is comment_match "exact"]checked=""[end] />
|
||||
exact
|
||||
</label>
|
||||
<label for="comment_match_glob">
|
||||
<input type="radio" name="comment_match" id="comment_match_glob"
|
||||
value="glob" [is comment_match "glob"]checked=""[end] />
|
||||
glob pattern
|
||||
</label>
|
||||
<label for="comment_match_regex">
|
||||
<input type="radio" name="comment_match" id="comment_match_regex"
|
||||
value="regex" [is comment_match "regex"]checked=""[end] />
|
||||
regex
|
||||
</label>
|
||||
<label for="comment_match_notregex">
|
||||
<input type="radio" name="comment_match" id="comment_match_notregex"
|
||||
value="notregex" [is comment_match "notregex"]checked=""[end] />
|
||||
<em>not</em> regex
|
||||
</label>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th style="text-align:right;vertical-align:top;">Sort By:</th>
|
||||
<td>
|
||||
<select name="querysort">
|
||||
<option value="date" [is querysort "date"]selected="selected"[end]>Date</option>
|
||||
<option value="author" [is querysort "author"]selected="selected"[end]>Author</option>
|
||||
<option value="file" [is querysort "file"]selected="selected"[end]>File</option>
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th style="text-align:right;vertical-align:top;">Date:</th>
|
||||
<td>
|
||||
<table cellspacing="0" cellpadding="0">
|
||||
<tr>
|
||||
<td><input type="radio" name="date" id="date_hours"
|
||||
value="hours" [is date "hours"]checked="checked"[end] /></td>
|
||||
<td>
|
||||
<label for="date_hours">In the last</label>
|
||||
<input type="text" name="hours" value="[hours]" size="4" />
|
||||
hours
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><input type="radio" name="date" id="date_day"
|
||||
value="day" [is date "day"]checked="checked"[end] /></td>
|
||||
<td><label for="date_day">In the last day</label></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><input type="radio" name="date" id="date_week"
|
||||
value="week" [is date "week"]checked="checked"[end] /></td>
|
||||
<td><label for="date_week">In the last week</label></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><input type="radio" name="date" id="date_month"
|
||||
value="month" [is date "month"]checked="checked"[end] /></td>
|
||||
<td><label for="date_month">In the last month</label></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><input type="radio" name="date" id="date_all"
|
||||
value="all" [is date "all"]checked="checked"[end] /></td>
|
||||
<td><label for="date_all">Since the beginning of time</label></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><input type="radio" name="date" id="date_explicit"
|
||||
value="explicit" [is date "explicit"]checked="checked"[end] /></td>
|
||||
<td>
|
||||
<label for="date_explicit">Between</label>
|
||||
<input type="text" name="mindate" value="[mindate]" size="20" />
|
||||
and
|
||||
<input type="text" name="maxdate" value="[maxdate]" size="20" />
|
||||
<br />
|
||||
(use the form <strong>yyyy-mm-dd hh:mm:ss</strong>)
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th style="text-align:right;vertical-align:top;">Limit:</th>
|
||||
<td>
|
||||
Show at most
|
||||
<input type="text" name="limit_changes" value="[limit_changes]" size="5" />
|
||||
changed files per commit. <em>(Use 0 to show all files.)</em>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td></td>
|
||||
<td><input type="submit" value="Search" /></td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
</form>
|
||||
|
||||
[include "include/footer.ezt"]
|
@@ -1,95 +0,0 @@
|
||||
[# setup page definitions]
|
||||
[define page_title]Query results in:[end]
|
||||
[define help_href][docroot]/help_rootview.html[end]
|
||||
[# end]
|
||||
|
||||
[include "include/header.ezt"]
|
||||
|
||||
<p><strong>[english_query]</strong></p>
|
||||
[# <!-- {sql} --> ]
|
||||
[if-any row_limit_reached]
|
||||
<p class="vc_warning">WARNING: These query results have been
|
||||
artificially limited by an administrative threshold value and do
|
||||
<em>not</em> represent the entirety of the data set which matches
|
||||
the query. Consider <a href="[queryform_href]">modifying your
|
||||
query to be more specific</a>, using your version control tool's
|
||||
query capabilities, or asking your administrator to raise the
|
||||
database response size threshold.</p>
|
||||
[end]
|
||||
<p><a href="[queryform_href]">Modify query</a></p>
|
||||
<p><a href="[backout_href]">Show commands which could be used to back out these changes</a></p>
|
||||
|
||||
<p><strong>+[plus_count]/-[minus_count]</strong> lines changed.</p>
|
||||
|
||||
[if-any commits]
|
||||
<table cellspacing="1" cellpadding="2">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="vc_header">Revision</th>
|
||||
<th class="vc_header[is querysort "file"]_sort[end]">File</th>
|
||||
[if-any show_branch]
|
||||
<th class="vc_header">Branch</th>
|
||||
[end]
|
||||
<th class="vc_header">+/-</th>
|
||||
<th class="vc_header[is querysort "date"]_sort[end]">Date</th>
|
||||
<th class="vc_header[is querysort "author"]_sort[end]">Author</th>
|
||||
[# uncommment, if you want a separate Description column: (also see below)
|
||||
<th class="vc_header">Description</th>
|
||||
]
|
||||
</tr>
|
||||
</thead>
|
||||
[for commits]
|
||||
[for commits.files]
|
||||
<tbody>
|
||||
<tr class="vc_row_[if-index commits even]even[else]odd[end]">
|
||||
<td style="vertical-align: top;">
|
||||
[define rev_href][if-any commits.files.prefer_markup][commits.files.view_href][else][if-any commits.files.download_href][commits.files.download_href][end][end][end]
|
||||
[if-any commits.files.rev][if-any rev_href]<a href="[rev_href]">[end][commits.files.rev][if-any rev_href]</a>[end][else] [end]
|
||||
</td>
|
||||
<td style="vertical-align: top;">
|
||||
<a href="[commits.files.dir_href]">[commits.files.dir]/</a>
|
||||
<a href="[commits.files.log_href]">[commits.files.file]</a>
|
||||
</td>
|
||||
[if-any show_branch]
|
||||
<td style="vertical-align: top;">
|
||||
[if-any commits.files.branch][commits.files.branch][else] [end]
|
||||
</td>
|
||||
[end]
|
||||
<td style="vertical-align: top;">
|
||||
[# only show a diff link for changes ]
|
||||
[is commits.files.type "Add"]<ins>[end]
|
||||
[is commits.files.type "Change"]<a href="[commits.files.diff_href]">[end]
|
||||
[is commits.files.type "Remove"]<del>[end]
|
||||
[commits.files.plus]/[commits.files.minus]
|
||||
[is commits.files.type "Add"]</ins>[end]
|
||||
[is commits.files.type "Change"]</a>[end]
|
||||
[is commits.files.type "Remove"]</del>[end]
|
||||
</td>
|
||||
<td style="vertical-align: top;">
|
||||
[if-any commits.files.date][commits.files.date][else] [end]
|
||||
</td>
|
||||
<td style="vertical-align: top;">
|
||||
[if-any commits.files.author][commits.files.author][else] [end]
|
||||
</td>
|
||||
</tr>
|
||||
[end]
|
||||
[if-any commits.limited_files]
|
||||
<tr class="vc_row_[if-index commits even]even[else]odd[end]">
|
||||
<td> </td>
|
||||
<td colspan="5">
|
||||
<strong><em><small>Only first [commits.num_files] files shown.
|
||||
<a href="[limit_changes_href]">Show all files</a> or
|
||||
<a href="[queryform_href]">adjust limit</a>.</small></em></strong>
|
||||
</tr>
|
||||
[end]
|
||||
<tr class="vc_row_[if-index commits even]even[else]odd[end]">
|
||||
<td> </td>
|
||||
<td colspan="5"><strong>Log:</strong><br />
|
||||
<pre class="vc_log">[commits.log]</pre></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
[end]
|
||||
</table>
|
||||
[end]
|
||||
|
||||
[include "include/footer.ezt"]
|
@@ -1,81 +0,0 @@
|
||||
[# setup page definitions]
|
||||
[define page_title]Revision [rev] of:[end]
|
||||
[define help_href][docroot]/help_rootview.html[end]
|
||||
[# end]
|
||||
[include "include/header.ezt" "revision"]
|
||||
|
||||
|
||||
<form method="get" action="[jump_rev_action]">
|
||||
<table cellspacing="1" cellpadding="2" style="width: auto;">
|
||||
<tr align="left">
|
||||
<th>Jump to revision:</th>
|
||||
<td>
|
||||
[for jump_rev_hidden_values]<input type="hidden" name="[jump_rev_hidden_values.name]" value="[jump_rev_hidden_values.value]"/>[end]
|
||||
<input type="text" name="revision" value="[rev]" />
|
||||
<input type="submit" value="Go" />
|
||||
[if-any prev_href]
|
||||
<a href="[prev_href]" title="Previous Revision"><img src="[docroot]/images/back.png" alt="Previous" width="20" height="22" /></a>[end]
|
||||
[if-any next_href] <a href="[next_href]" title="Next Revision"><img src="[docroot]/images/forward.png" width="20" height="22" alt="Next" /></a>[end]
|
||||
</td>
|
||||
</tr>
|
||||
<tr align="left">
|
||||
<th>Author:</th>
|
||||
<td>[if-any author][author][else]<em>(unknown author)</em>[end]</td>
|
||||
</tr>
|
||||
<tr align="left">
|
||||
<th>Date:</th>
|
||||
<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>Log Message:</th>
|
||||
<td><pre class="vc_log">[log]</pre></td>
|
||||
</tr>
|
||||
</table>
|
||||
</form>
|
||||
|
||||
<div id="vc_main_body">
|
||||
<!-- ************************************************************** -->
|
||||
|
||||
[if-any changes]
|
||||
<h2>Changed paths</h2>
|
||||
<div class="vc_changedpaths">
|
||||
[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">
|
||||
<th class="vc_header_sort">Path</th>
|
||||
<th class="vc_header">Details</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
[for changes]
|
||||
<tr class="vc_row_[if-index changes even]even[else]odd[end]">
|
||||
<td>[if-any changes.view_href]<a href="[changes.view_href]" title="View [is changes.pathtype "dir"]Directory[else]File[end] Contents">[end]<img src="[docroot]/images/[is changes.pathtype "dir"]dir[else]text[end].png" class="vc_icon" alt="Directory" />[changes.path][is changes.pathtype "dir"]/[end][if-any changes.view_href]</a>[end]
|
||||
[if-any changes.is_copy]<br /><em>(Copied from [changes.copy_path], r[changes.copy_rev])</em>[end]
|
||||
</td>
|
||||
<td>[if-any changes.log_href]<a href="[changes.log_href]" title="View Log">[end][changes.action][if-any changes.log_href]</a>[end]
|
||||
[if-any changes.text_mods], [if-any changes.diff_href]<a href="[changes.diff_href]#content" title="View Diff">[end]text changed[if-any changes.diff_href]</a>[end][end]
|
||||
[if-any changes.prop_mods], [if-any changes.diff_href]<a href="[changes.diff_href]#properties" title="View Property Diff">[end]props changed[if-any changes.diff_href]</a>[end][end]
|
||||
</td>
|
||||
</tr>
|
||||
[end]
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
[end]
|
||||
|
||||
[include "include/props.ezt"]
|
||||
|
||||
<!-- ************************************************************** -->
|
||||
</div>
|
||||
|
||||
[include "include/footer.ezt"]
|
@@ -1,40 +0,0 @@
|
||||
[# setup page definitions]
|
||||
[define page_title]Repository Listing[end]
|
||||
[define help_href][docroot]/help_rootview.html[end]
|
||||
[# end]
|
||||
|
||||
[include "include/header.ezt" "directory"]
|
||||
|
||||
<div id="vc_main_body">
|
||||
<!-- ************************************************************** -->
|
||||
|
||||
<table cellspacing="1" class="fixed" id="dirlist">
|
||||
<thead>
|
||||
<tr>
|
||||
<th style="width: 200px" class="vc_header_sort">Name</th>
|
||||
[is cfg.options.show_roots_lastmod "1"]
|
||||
<th class="vc_header">Last Change</th>
|
||||
[end]
|
||||
</tr>
|
||||
</thead>
|
||||
|
||||
<tbody>
|
||||
[if-any roots]
|
||||
[for roots]
|
||||
<tr class="vc_row_[if-index roots even]even[else]odd[end]">
|
||||
<td onclick="jumpTo('[roots.href]')"><a href="[roots.href]"><img src="[docroot]/images/[roots.type]-logo.png" alt="" class="vc_icon" />[roots.name]</a></td>
|
||||
[is cfg.options.show_roots_lastmod "1"]
|
||||
<td>[if-any roots.rev]<strong>[if-any roots.log_href]<a href="[roots.log_href]">[roots.rev]</a>[else][roots.rev][end]</strong> ([roots.ago] ago)
|
||||
by <em>[roots.author]</em>: [roots.log][end]</td>
|
||||
[end]
|
||||
</tr>
|
||||
[end]
|
||||
[end]
|
||||
</tbody>
|
||||
|
||||
</table>
|
||||
|
||||
<!-- ************************************************************** -->
|
||||
</div>
|
||||
|
||||
[include "include/footer.ezt"]
|