Hello community,
here is the log from the commit of package viewvc for openSUSE:Factory
checked in at Wed Jun 9 17:18:30 CEST 2010.
--------
--- viewvc/viewvc.changes 2010-04-06 21:51:44.000000000 +0200
+++ /mounts/work_src_done/STABLE/viewvc/viewvc.changes 2010-06-06 22:46:00.000000000 +0200
@@ -1,0 +2,8 @@
+Sun Jun 6 20:44:55 UTC 2010 - pascal.bleser@opensuse.org
+
+- update to 1.1.6:
+ * fixes a regression introduced in 1.1.5
+ * corrects some bits of the RSS feed support
+ * introduces rudimentary support for WSGI-based deployments
+
+-------------------------------------------------------------------
calling whatdependson for head-i586
Old:
----
viewvc-1.1.5.tar.bz2
New:
----
viewvc-1.1.6.tar.bz2
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ viewvc.spec ++++++
--- /var/tmp/diff_new_pack.Bj0XeU/_old 2010-06-09 17:18:13.000000000 +0200
+++ /var/tmp/diff_new_pack.Bj0XeU/_new 2010-06-09 17:18:13.000000000 +0200
@@ -1,5 +1,5 @@
#
-# spec file for package viewvc (Version 1.1.5)
+# spec file for package viewvc (Version 1.1.6)
#
# Copyright (c) 2010 SUSE LINUX Products GmbH, Nuernberg, Germany.
#
@@ -20,8 +20,8 @@
Name: viewvc
BuildRequires: apache2-devel python-devel
-Version: 1.1.5
-Release: 2
+Version: 1.1.6
+Release: 1
#
%define apxs /usr/sbin/apxs2
%define apache_libexecdir %(%{apxs} -q LIBEXECDIR)
++++++ viewvc-1.1.5.tar.bz2 -> viewvc-1.1.6.tar.bz2 ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/viewvc-1.1.5/CHANGES new/viewvc-1.1.6/CHANGES
--- old/viewvc-1.1.5/CHANGES 2010-03-29 17:24:33.000000000 +0200
+++ new/viewvc-1.1.6/CHANGES 2010-06-02 15:24:27.000000000 +0200
@@ -1,3 +1,11 @@
+Version 1.1.6 (released 02-Jun-2010)
+
+ * add rudimentary support for WSGI-based deployments (issue #397)
+ * fix exception caused by trying to HTML-escape non-string data (issue #454)
+ * fix incorrect RSS feed Content-Type header (issue #449)
+ * fix RSS <title> encoding problem (issue #451)
+ * allow 'svndbadmin purge' to work on missing repositories (issue #452)
+
Version 1.1.5 (released 29-Mar-2010)
* security fix: escape user-provided search_re input to avoid XSS attack
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/viewvc-1.1.5/INSTALL new/viewvc-1.1.6/INSTALL
--- old/viewvc-1.1.5/INSTALL 2009-10-08 19:46:57.000000000 +0200
+++ new/viewvc-1.1.6/INSTALL 2010-05-05 17:26:44.000000000 +0200
@@ -213,9 +213,9 @@
Options +ExecCGI
AddHandler cgi-script .cgi
- (Note: For this to work mod_cgi has to be loaded. And for the .htaccess file
+ Note: For this to work mod_cgi has to be loaded. And for the .htaccess file
to be effective, "AllowOverride All" or "AllowOverride Options FileInfo"
- need to have been specified for the directory.)
+ needs to have been specified for the directory.
------------------------------------------
METHOD D: Using mod_python (if installed)
@@ -232,6 +232,25 @@
feature may not work because it uses multithreading. This works fine
under Apache 2.
+ ----------------------------------------
+ METHOD E: Using mod_wsgi (if installed)
+ ----------------------------------------
+ Copy the Python scripts file from
+ /bin/mod_python/
+ to the directory of your choosing. Modify httpd.conf with the
+ following directives:
+
+ WSGIScriptAlias /viewvc /bin/wsgi/viewvc.wsgi
+ WSGIScriptAlias /query /bin/wsgi/query.wsgi
+
+ You'll probably also need the following directive because of the
+ not-quite-sanctioned way that ViewVC manipulates Python objects.
+
+ WSGIApplicationGroup %{GLOBAL}
+
+ Note: WSGI support in ViewVC is at this time quite rudimentary,
+ bordering on downright experimental. Your mileage may vary.
+
3) Restart Apache.
The commands to do this vary. "httpd -k restart" and "apache -k
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/viewvc-1.1.5/bin/svndbadmin new/viewvc-1.1.6/bin/svndbadmin
--- old/viewvc-1.1.5/bin/svndbadmin 2009-06-08 17:53:47.000000000 +0200
+++ new/viewvc-1.1.6/bin/svndbadmin 2010-05-20 21:43:32.000000000 +0200
@@ -242,6 +242,7 @@
cfg = viewvc.load_config(CONF_PATHNAME)
db = cvsdb.ConnectDatabase(cfg)
+ # Purge what must be purged.
if command in ('rebuild', 'purge'):
if verbose:
print "Purging commit info for repository root `%s'" % repository
@@ -252,18 +253,24 @@
sys.stderr.write("ERROR: " + str(e) + "\n")
sys.exit(1)
- repo = SvnRepo(repository)
- if command == 'rebuild' or (command == 'update' and not revs):
- for rev in range(repo.rev_max+1):
- handle_revision(db, command, repo, rev, verbose)
- elif command == 'update':
- if revs[0] is None:
- revs[0] = repo.rev_max
- if revs[1] is None:
- revs[1] = repo.rev_max
- revs.sort()
- for rev in range(revs[0], revs[1]+1):
- handle_revision(db, command, repo, rev, verbose, force)
+ # Record what must be recorded.
+ if command in ('rebuild', 'update'):
+ if not os.path.exists(repository):
+ sys.stderr.write('ERROR: could not find repository %s\n'
+ % (repository))
+ sys.exit(1)
+ repo = SvnRepo(repository)
+ if command == 'rebuild' or (command == 'update' and not revs):
+ for rev in range(repo.rev_max+1):
+ handle_revision(db, command, repo, rev, verbose)
+ elif command == 'update':
+ if revs[0] is None:
+ revs[0] = repo.rev_max
+ if revs[1] is None:
+ revs[1] = repo.rev_max
+ revs.sort()
+ for rev in range(revs[0], revs[1]+1):
+ handle_revision(db, command, repo, rev, verbose, force)
def _rev2int(r):
if r == 'HEAD':
@@ -330,12 +337,6 @@
sys.stderr.write('ERROR: unknown command %s\n' % command)
usage()
- repository = args[2]
- if not os.path.exists(repository):
- sys.stderr.write('ERROR: could not find repository %s\n' % args[2])
- usage()
- repository = vclib.svn.canonicalize_rootpath(repository)
-
revs = []
if len(sys.argv) > 3:
if command == 'rebuild':
@@ -358,6 +359,7 @@
rev = None
try:
+ repository = vclib.svn.canonicalize_rootpath(args[2])
repository = cvsdb.CleanRepository(os.path.abspath(repository))
main(command, repository, revs, verbose, force)
except KeyboardInterrupt:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/viewvc-1.1.5/bin/wsgi/query.wsgi new/viewvc-1.1.6/bin/wsgi/query.wsgi
--- old/viewvc-1.1.5/bin/wsgi/query.wsgi 1970-01-01 01:00:00.000000000 +0100
+++ new/viewvc-1.1.6/bin/wsgi/query.wsgi 2010-05-04 19:23:06.000000000 +0200
@@ -0,0 +1,42 @@
+# -*-python-*-
+#
+# Copyright (C) 1999-2009 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/
+#
+# -----------------------------------------------------------------------
+#
+# viewvc: View CVS/SVN repositories via a web browser
+#
+# -----------------------------------------------------------------------
+#
+# This is a wsgi entry point for the query ViewVC app. It's appropriate
+# for use with mod_wsgi. It defines a single application function that
+# is a walid wsgi entry point.
+#
+# -----------------------------------------------------------------------
+
+import sys, os
+
+LIBRARY_DIR = None
+CONF_PATHNAME = None
+
+if LIBRARY_DIR:
+ sys.path.insert(0, LIBRARY_DIR)
+else:
+ sys.path.insert(0, os.path.abspath(os.path.join(sys.argv[0],
+ "../../../lib")))
+
+import sapi
+import viewvc
+import query
+
+def application(environ, start_response):
+ server = sapi.WsgiServer(environ, start_response)
+ cfg = viewvc.load_config(CONF_PATHNAME, server)
+ query.main(server, cfg, "viewvc.wsgi")
+ return []
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/viewvc-1.1.5/bin/wsgi/viewvc.wsgi new/viewvc-1.1.6/bin/wsgi/viewvc.wsgi
--- old/viewvc-1.1.5/bin/wsgi/viewvc.wsgi 1970-01-01 01:00:00.000000000 +0100
+++ new/viewvc-1.1.6/bin/wsgi/viewvc.wsgi 2010-05-04 19:23:06.000000000 +0200
@@ -0,0 +1,41 @@
+# -*-python-*-
+#
+# Copyright (C) 1999-2009 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/
+#
+# -----------------------------------------------------------------------
+#
+# viewvc: View CVS/SVN repositories via a web browser
+#
+# -----------------------------------------------------------------------
+#
+# This is a wsgi entry point for the main ViewVC app. It's appropriate
+# for use with mod_wsgi. It defines a single application function that
+# is a walid wsgi entry point.
+#
+# -----------------------------------------------------------------------
+
+import sys, os
+
+LIBRARY_DIR = None
+CONF_PATHNAME = None
+
+if LIBRARY_DIR:
+ sys.path.insert(0, LIBRARY_DIR)
+else:
+ sys.path.insert(0, os.path.abspath(os.path.join(sys.argv[0],
+ "../../../lib")))
+
+import sapi
+import viewvc
+
+def application(environ, start_response):
+ server = sapi.WsgiServer(environ, start_response)
+ cfg = viewvc.load_config(CONF_PATHNAME, server)
+ viewvc.main(server, cfg)
+ return []
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/viewvc-1.1.5/lib/ezt.py new/viewvc-1.1.6/lib/ezt.py
--- old/viewvc-1.1.5/lib/ezt.py 2009-05-05 19:01:10.000000000 +0200
+++ new/viewvc-1.1.6/lib/ezt.py 2010-05-20 21:12:26.000000000 +0200
@@ -347,7 +347,7 @@
for_names = [ ]
if base_format:
- program.append((self._cmd_format, _printers[base_format]))
+ program.append((self._cmd_format, _formatters[base_format]))
for i in range(len(parts)):
piece = parts[i]
@@ -405,13 +405,13 @@
elif cmd == 'format':
if args[1][0]:
# argument is a variable reference
- printer = args[1]
+ formatter = args[1]
else:
- # argument is a string constant referring to built-in printer
- printer = _printers.get(args[1][1])
- if not printer:
+ # argument is a string constant referring to built-in formatter
+ formatter = _formatters.get(args[1][1])
+ if not formatter:
raise UnknownFormatConstantError(str(args[1:]))
- program.append((self._cmd_format, printer))
+ program.append((self._cmd_format, formatter))
# remember the cmd, current pos, args, and a section placeholder
stack.append([cmd, len(program), args[1:], None])
@@ -465,13 +465,13 @@
except TypeError:
raise Exception("Unprintable value type for '%s'" % (str(valrefs[0][0])))
- def _cmd_format(self, printer, ctx):
- if type(printer) is TupleType:
- printer = _get_value(printer, ctx)
- ctx.printers.append(printer)
+ def _cmd_format(self, formatter, ctx):
+ if type(formatter) is TupleType:
+ formatter = _get_value(formatter, ctx)
+ ctx.formatters.append(formatter)
def _cmd_end_format(self, valref, ctx):
- ctx.printers.pop()
+ ctx.formatters.pop()
def _cmd_include(self, (valref, reader), ctx):
fname = _get_value(valref, ctx)
@@ -637,14 +637,23 @@
# string or a sequence
return ob
+def _print_formatted(formatters, ctx, chunk):
+ # print chunk to ctx.fp after running it sequentially through formatters
+ for formatter in formatters:
+ chunk = formatter(chunk)
+ ctx.fp.write(chunk)
+
def _write_value(value, args, ctx):
# value is a callback function, generates its own output
if callable(value):
apply(value, [ctx] + list(args))
return
- # pop printer in case it recursively calls _write_value
- printer = ctx.printers.pop()
+ # squirrel away formatters in case one of them recursively calls
+ # _write_value() -- we'll use them (in reverse order) to format our
+ # output.
+ formatters = ctx.formatters[:]
+ formatters.reverse()
try:
# if the value has a 'read' attribute, then it is a stream: copy it
@@ -653,7 +662,7 @@
chunk = value.read(16384)
if not chunk:
break
- printer(ctx, chunk)
+ _print_formatted(formatters, ctx, chunk)
# value is a substitution pattern
elif args:
@@ -666,14 +675,16 @@
piece = args[idx]
else:
piece = '<undef>'
- printer(ctx, piece)
+ _print_formatted(formatters, ctx, piece)
# plain old value, write to output
else:
- printer(ctx, value)
+ _print_formatted(formatters, ctx, value)
finally:
- ctx.printers.append(printer)
+ # restore our formatters
+ formatters.reverse()
+ ctx.formatters = formatters
class TemplateData:
@@ -715,7 +726,7 @@
"""A container for the execution context"""
def __init__(self, fp):
self.fp = fp
- self.printers = []
+ self.formatters = []
def write(self, value, args=()):
_write_value(value, args, self)
@@ -828,20 +839,26 @@
class UnknownFormatConstantError(EZTException):
"""The format specifier is an unknown value."""
-def _raw_printer(ctx, s):
- ctx.fp.write(s)
-
-def _html_printer(ctx, s):
- ctx.fp.write(cgi.escape(s))
+def _raw_formatter(s):
+ return s
-def _uri_printer(ctx, s):
- ctx.fp.write(urllib.quote(s))
+def _html_formatter(s):
+ return cgi.escape(s)
-_printers = {
- FORMAT_RAW : _raw_printer,
- FORMAT_HTML : _html_printer,
- FORMAT_XML : _html_printer,
- FORMAT_URI : _uri_printer,
+def _xml_formatter(s):
+ s = s.replace('&', '&')
+ s = s.replace('<', '<')
+ s = s.replace('>', '>')
+ return s
+
+def _uri_formatter(s):
+ return urllib.quote(s)
+
+_formatters = {
+ FORMAT_RAW : _raw_formatter,
+ FORMAT_HTML : _html_formatter,
+ FORMAT_XML : _xml_formatter,
+ FORMAT_URI : _uri_formatter,
}
# --- standard test environment ---
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/viewvc-1.1.5/lib/sapi.py new/viewvc-1.1.6/lib/sapi.py
--- old/viewvc-1.1.5/lib/sapi.py 2010-03-29 17:32:43.000000000 +0200
+++ new/viewvc-1.1.6/lib/sapi.py 2010-05-06 15:53:46.000000000 +0200
@@ -23,8 +23,8 @@
import cgi
-# global server object. It will be either a CgiServer or a proxy to
-# an AspServer or ModPythonServer object.
+# global server object. It will be either a CgiServer, a WsgiServer,
+# or a proxy to an AspServer or ModPythonServer object.
server = None
@@ -33,6 +33,7 @@
# that character as-is, and sometimes needs to embed escaped values
# into HTML attributes.
def escape(s):
+ s = str(s)
s = string.replace(s, '&', '&')
s = string.replace(s, '>', '>')
s = string.replace(s, '<', '<')
@@ -197,6 +198,66 @@
return sys.stdout
+class WsgiServer(Server):
+ def __init__(self, environ, start_response):
+ Server.__init__(self)
+
+ self._environ = environ
+ self._start_response = start_response;
+ self._headers = []
+ self._wsgi_write = None
+ self.headerSent = False
+
+ global server
+ server = self
+
+ global cgi
+ import cgi
+
+ def addheader(self, name, value):
+ self._headers.append((name, value))
+
+ def header(self, content_type='text/html; charset=UTF-8', status=None):
+ if not status:
+ status = "200 OK"
+ if not self.headerSent:
+ self.headerSent = True
+ self._headers.insert(0, ("Content-Type", content_type),)
+ self._wsgi_write = self._start_response("%s" % status, self._headers)
+
+ def redirect(self, url):
+ """Redirect client to url. This discards any data that has been queued
+ to be sent to the user. But there should never by any anyway.
+ """
+ self.addheader('Location', url)
+ self.header(status='301 Moved')
+ self._wsgi_write('This document is located <a href="%s">here</a>.' % url)
+
+ def escape(self, s, quote = None):
+ return cgi.escape(s, quote)
+
+ def getenv(self, name, value=None):
+ return self._environ.get(name, value)
+
+ def params(self):
+ return cgi.parse(environ=self._environ, fp=self._environ["wsgi.input"])
+
+ def FieldStorage(self, fp=None, headers=None, outerboundary="",
+ environ=os.environ, keep_blank_values=0, strict_parsing=0):
+ return cgi.FieldStorage(self._environ["wsgi.input"], self._headers,
+ outerboundary, self._environ, keep_blank_values,
+ strict_parsing)
+
+ def write(self, s):
+ self._wsgi_write(s)
+
+ def flush(self):
+ pass
+
+ def file(self):
+ return File(self)
+
+
class AspServer(ThreadedServer):
def __init__(self, Server, Request, Response, Application):
ThreadedServer.__init__(self)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/viewvc-1.1.5/lib/vclib/ccvs/rcsparse/default.py new/viewvc-1.1.6/lib/vclib/ccvs/rcsparse/default.py
--- old/viewvc-1.1.5/lib/vclib/ccvs/rcsparse/default.py 2009-03-18 17:45:10.000000000 +0100
+++ new/viewvc-1.1.6/lib/vclib/ccvs/rcsparse/default.py 2010-05-20 16:58:14.000000000 +0200
@@ -19,7 +19,11 @@
import common
class _TokenStream:
- token_term = string.whitespace + ';:'
+ token_term = string.whitespace + ";:"
+ try:
+ token_term = frozenset(token_term)
+ except NameError:
+ pass
# the algorithm is about the same speed for any CHUNK_SIZE chosen.
# grab a good-sized chunk, but not too large to overwhelm memory.
@@ -44,15 +48,17 @@
# out more complex solutions.
buf = self.buf
+ lbuf = len(buf)
idx = self.idx
while 1:
- if idx == len(buf):
+ if idx == lbuf:
buf = self.rcsfile.read(self.CHUNK_SIZE)
if buf == '':
# signal EOF by returning None as the token
del self.buf # so we fail if get() is called again
return None
+ lbuf = len(buf)
idx = 0
if buf[idx] not in string.whitespace:
@@ -60,7 +66,7 @@
idx = idx + 1
- if buf[idx] == ';' or buf[idx] == ':':
+ if buf[idx] in ';:':
self.buf = buf
self.idx = idx + 1
return buf[idx]
@@ -70,17 +76,18 @@
token = ''
while 1:
# find token characters in the current buffer
- while end < len(buf) and buf[end] not in self.token_term:
+ while end < lbuf and buf[end] not in self.token_term:
end = end + 1
token = token + buf[idx:end]
- if end < len(buf):
+ if end < lbuf:
# we stopped before the end, so we have a full token
idx = end
break
# we stopped at the end of the buffer, so we may have a partial token
buf = self.rcsfile.read(self.CHUNK_SIZE)
+ lbuf = len(buf)
idx = end = 0
self.buf = buf
@@ -94,22 +101,24 @@
chunks = [ ]
while 1:
- if idx == len(buf):
+ if idx == lbuf:
idx = 0
buf = self.rcsfile.read(self.CHUNK_SIZE)
if buf == '':
raise RuntimeError, 'EOF'
+ lbuf = len(buf)
i = string.find(buf, '@', idx)
if i == -1:
chunks.append(buf[idx:])
- idx = len(buf)
+ idx = lbuf
continue
- if i == len(buf) - 1:
+ if i == lbuf - 1:
chunks.append(buf[idx:i])
idx = 0
buf = '@' + self.rcsfile.read(self.CHUNK_SIZE)
if buf == '@':
raise RuntimeError, 'EOF'
+ lbuf = len(buf)
continue
if buf[i + 1] == '@':
chunks.append(buf[idx:i+1])
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/viewvc-1.1.5/lib/viewvc.py new/viewvc-1.1.6/lib/viewvc.py
--- old/viewvc-1.1.5/lib/viewvc.py 2010-03-29 17:41:46.000000000 +0200
+++ new/viewvc-1.1.6/lib/viewvc.py 2010-06-02 15:28:45.000000000 +0200
@@ -14,7 +14,7 @@
#
# -----------------------------------------------------------------------
-__version__ = '1.1.5'
+__version__ = '1.1.6'
# this comes from our library; measure the startup time
import debug
@@ -915,7 +915,7 @@
return fp
def generate_page(request, view_name, data, content_type=None):
- server_fp = get_writeready_server_file(request)
+ server_fp = get_writeready_server_file(request, content_type)
template = get_view_template(request.cfg, view_name, request.language)
template.generate(server_fp, data)
@@ -3550,6 +3550,11 @@
'first_changes_href': first_changes_href,
'jump_rev_action' : jump_rev_action,
'jump_rev_hidden_values' : jump_rev_hidden_values,
+ 'revision_href' : request.get_url(view_func=view_revision,
+ where=None,
+ pathtype=None,
+ params={'revision': str(rev)},
+ escape=1),
}))
if rev == youngest_rev:
request.server.addheader("Cache-control", "no-store")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/viewvc-1.1.5/templates/include/header.ezt new/viewvc-1.1.6/templates/include/header.ezt
--- old/viewvc-1.1.5/templates/include/header.ezt 2008-10-15 01:53:55.000000000 +0200
+++ new/viewvc-1.1.6/templates/include/header.ezt 2010-04-21 21:08:14.000000000 +0200
@@ -5,7 +5,7 @@
<head>
<title>[if-any rootname][[][rootname]][else]ViewVC[end] [page_title]</title>
<meta name="generator" content="ViewVC [vsn]" />
- <link rel="shortcut icon" href="[docroot]/images/favicon.ico" type="image/x-icon" />
+ <link rel="shortcut icon" href="[docroot]/images/favicon.ico" />
<link rel="stylesheet" href="[docroot]/styles.css" type="text/css" />
[if-any rss_href]<link rel="alternate" type="application/rss+xml" title="RSS [[][rootname]][where]" href="[rss_href]" />[end]
</head>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/viewvc-1.1.5/templates/rss.ezt new/viewvc-1.1.6/templates/rss.ezt
--- old/viewvc-1.1.5/templates/rss.ezt 2007-07-26 20:55:15.000000000 +0200
+++ new/viewvc-1.1.6/templates/rss.ezt 2010-05-20 21:12:26.000000000 +0200
@@ -7,11 +7,11 @@
<description>[is roottype "svn"]Subversion[else]CVS[end] commits to the[if-any where] [where] directory of the[end] [rootname] repository</description>
[for commits]<item>
- <title>[if-any commits.rev][commits.rev]: [end][[commits.author]] [commits.short_log]</title>
+ <title>[if-any commits.rev][commits.rev]: [end][[commits.author]] [format "xml"][commits.short_log][end]</title>
[if-any commits.rss_url]<link>[commits.rss_url]</link>[end]
<author>[commits.author]</author>
<pubDate>[if-any commits.rss_date][commits.rss_date][else](unknown date)[end]</pubDate>
- <description><pre>[format "xml"][commits.log][end]</pre></description>
+ <description><pre>[format "xml"][format "html"][commits.log][end][end]</pre></description>
</item>[end]
</channel>
</rss>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/viewvc-1.1.5/viewvc-install new/viewvc-1.1.6/viewvc-install
--- old/viewvc-1.1.5/viewvc-install 2009-08-25 17:30:31.000000000 +0200
+++ new/viewvc-1.1.6/viewvc-install 2010-05-04 19:23:06.000000000 +0200
@@ -49,6 +49,8 @@
FILE_INFO_LIST = [
("bin/cgi/viewvc.cgi", "bin/cgi/viewvc.cgi", 0755, 1, 0, 0),
("bin/cgi/query.cgi", "bin/cgi/query.cgi", 0755, 1, 0, 0),
+ ("bin/wsgi/viewvc.wsgi", "bin/wsgi/viewvc.wsgi", 0755, 1, 0, 0),
+ ("bin/wsgi/query.wsgi", "bin/wsgi/query.wsgi", 0755, 1, 0, 0),
("bin/mod_python/viewvc.py", "bin/mod_python/viewvc.py", 0755, 1, 0, 0),
("bin/mod_python/query.py", "bin/mod_python/query.py", 0755, 1, 0, 0),
("bin/mod_python/handler.py", "bin/mod_python/handler.py", 0755, 1, 0, 0),
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Remember to have fun...
--
To unsubscribe, e-mail: opensuse-commit+unsubscribe@opensuse.org
For additional commands, e-mail: opensuse-commit+help@opensuse.org