Merge lp:~allison/ubuntu/raring/libsvn-web-perl/fix-for-1106378 into lp:ubuntu/raring/libsvn-web-perl

Proposed by Allison Randal
Status: Merged
Merged at revision: 8
Proposed branch: lp:~allison/ubuntu/raring/libsvn-web-perl/fix-for-1106378
Merge into: lp:ubuntu/raring/libsvn-web-perl
Diff against target: 12337 lines (+5192/-4860)
143 files modified
Build.PL (+0/-420)
CHANGES.pod (+95/-13)
LICENSE (+379/-0)
MANIFEST (+93/-56)
MANIFEST.SKIP (+1/-0)
META.json (+79/-0)
META.yml (+43/-72)
Makefile.PL (+84/-31)
README (+6/-6)
SIGNATURE (+0/-102)
SVN-Web.psgi (+22/-0)
UPDATING.pod (+4/-0)
bin/svnweb-install (+8/-46)
bin/svnweb-server (+0/-142)
conf/apache1.tt (+0/-82)
conf/apache2.tt (+0/-69)
cpanfile (+49/-0)
css/common.css (+84/-0)
css/styles-hlb.css (+241/-0)
css/trac/browser.css (+89/-0)
css/trac/changeset.css (+20/-0)
css/trac/code.css (+108/-0)
css/trac/diff.css (+153/-0)
css/trac/svnweb.css (+24/-0)
css/trac/text-diff-html.css (+32/-0)
css/trac/trac.css (+360/-0)
debian/changelog (+15/-0)
debian/compat (+1/-1)
debian/control (+6/-2)
debian/docs (+2/-0)
debian/rules (+6/-78)
dist.ini (+77/-0)
lib/SVN/Web.pm (+316/-647)
lib/SVN/Web/Blame.pm (+29/-24)
lib/SVN/Web/Browse.pm (+55/-60)
lib/SVN/Web/Checkout.pm (+20/-20)
lib/SVN/Web/Diff.pm (+79/-99)
lib/SVN/Web/DiffParser.pm (+232/-224)
lib/SVN/Web/I18N.pm (+11/-9)
lib/SVN/Web/List.pm (+57/-15)
lib/SVN/Web/Log.pm (+61/-74)
lib/SVN/Web/RSS.pm (+11/-10)
lib/SVN/Web/Revision.pm (+43/-62)
lib/SVN/Web/Style/common.css (+0/-84)
lib/SVN/Web/Style/styles-hlb.css (+0/-241)
lib/SVN/Web/Style/trac/browser.css (+0/-89)
lib/SVN/Web/Style/trac/changeset.css (+0/-20)
lib/SVN/Web/Style/trac/code.css (+0/-108)
lib/SVN/Web/Style/trac/diff.css (+0/-153)
lib/SVN/Web/Style/trac/svnweb.css (+0/-24)
lib/SVN/Web/Style/trac/text-diff-html.css (+0/-32)
lib/SVN/Web/Style/trac/trac.css (+0/-360)
lib/SVN/Web/Template/plain/browse (+0/-31)
lib/SVN/Web/Template/plain/diff (+0/-1)
lib/SVN/Web/Template/plain/footer (+0/-3)
lib/SVN/Web/Template/plain/header (+0/-31)
lib/SVN/Web/Template/plain/list (+0/-15)
lib/SVN/Web/Template/plain/log (+0/-52)
lib/SVN/Web/Template/plain/revision (+0/-54)
lib/SVN/Web/Template/plain/view (+0/-38)
lib/SVN/Web/Template/plain/x (+0/-3)
lib/SVN/Web/Template/trac/_action_menu (+0/-20)
lib/SVN/Web/Template/trac/_diff (+0/-122)
lib/SVN/Web/Template/trac/_log_msg (+0/-78)
lib/SVN/Web/Template/trac/blame (+0/-58)
lib/SVN/Web/Template/trac/browse (+0/-88)
lib/SVN/Web/Template/trac/diff (+0/-7)
lib/SVN/Web/Template/trac/footer (+0/-7)
lib/SVN/Web/Template/trac/header (+0/-63)
lib/SVN/Web/Template/trac/list (+0/-18)
lib/SVN/Web/Template/trac/log (+0/-78)
lib/SVN/Web/Template/trac/revision (+0/-98)
lib/SVN/Web/Template/trac/rss (+0/-43)
lib/SVN/Web/Template/trac/view (+0/-23)
lib/SVN/Web/Template/trac/x (+0/-6)
lib/SVN/Web/Test.pm (+109/-200)
lib/SVN/Web/View.pm (+23/-23)
lib/SVN/Web/X.pm (+9/-3)
lib/SVN/Web/action.pm (+128/-45)
t/2basic.t (+54/-25)
t/3svnweb-install.t (+5/-7)
t/author-critic.t (+20/-0)
t/cache.t (+9/-1)
t/cgi.t (+0/-47)
t/mod_perl.t (+0/-48)
t/perlcriticrc (+1/-0)
t/release-distmeta.t (+15/-0)
t/release-pod-coverage.t (+21/-0)
t/release-pod-syntax.t (+15/-0)
t/repos/README.txt (+5/-0)
t/repos/conf/authz (+32/-0)
t/repos/conf/passwd (+8/-0)
t/repos/conf/svnserve.conf (+47/-0)
t/repos/db/current (+1/-0)
t/repos/db/format (+2/-0)
t/repos/db/fs-type (+1/-0)
t/repos/db/fsfs.conf (+37/-0)
t/repos/db/min-unpacked-rev (+1/-0)
t/repos/db/revprops/0/0 (+5/-0)
t/repos/db/revprops/0/1 (+13/-0)
t/repos/db/revprops/0/2 (+13/-0)
t/repos/db/revprops/0/3 (+15/-0)
t/repos/db/revs/0/0 (+11/-0)
t/repos/db/txn-current (+1/-0)
t/repos/db/uuid (+1/-0)
t/repos/format (+1/-0)
t/repos/hooks/post-commit.tmpl (+50/-0)
t/repos/hooks/post-lock.tmpl (+45/-0)
t/repos/hooks/post-revprop-change.tmpl (+57/-0)
t/repos/hooks/post-unlock.tmpl (+43/-0)
t/repos/hooks/pre-commit.tmpl (+85/-0)
t/repos/hooks/pre-lock.tmpl (+71/-0)
t/repos/hooks/pre-revprop-change.tmpl (+66/-0)
t/repos/hooks/pre-unlock.tmpl (+63/-0)
t/repos/hooks/start-commit.tmpl (+68/-0)
t/repos/locks/db-logs.lock (+3/-0)
t/repos/locks/db.lock (+3/-0)
t/svn-uris.t (+33/-0)
t/svnweb-server.t (+0/-33)
t/test_repo.dump (+70/-16)
template/plain/browse (+31/-0)
template/plain/diff (+1/-0)
template/plain/footer (+3/-0)
template/plain/header (+31/-0)
template/plain/list (+15/-0)
template/plain/log (+52/-0)
template/plain/revision (+54/-0)
template/plain/view (+38/-0)
template/plain/x (+3/-0)
template/trac/_action_menu (+20/-0)
template/trac/_diff (+122/-0)
template/trac/_log_msg (+78/-0)
template/trac/blame (+58/-0)
template/trac/browse (+88/-0)
template/trac/diff (+7/-0)
template/trac/footer (+7/-0)
template/trac/header (+63/-0)
template/trac/list (+18/-0)
template/trac/log (+78/-0)
template/trac/revision (+98/-0)
template/trac/rss (+43/-0)
template/trac/view (+23/-0)
template/trac/x (+6/-0)
To merge this branch: bzr merge lp:~allison/ubuntu/raring/libsvn-web-perl/fix-for-1106378
Reviewer Review Type Date Requested Status
Luke Yelavich (community) Approve
Ubuntu branches Pending
Review via email: mp+145072@code.launchpad.net

Description of the change

See LP #1106378.

To post a comment you must log in.
Revision history for this message
Luke Yelavich (themuso) wrote :

Thanks for your work, uploading.

review: Approve
Revision history for this message
Stefano Rivera (stefanor) wrote :

This didn't actually close the bug

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== removed file 'Build.PL'
2--- Build.PL 2007-11-30 14:01:12 +0000
3+++ Build.PL 1970-01-01 00:00:00 +0000
4@@ -1,420 +0,0 @@
5-#!/usr/bin/perl
6-
7-use strict;
8-use warnings;
9-
10-use File::Basename;
11-use Getopt::Long;
12-
13-use Module::Build;
14-use File::Basename;
15-use Getopt::Long;
16-
17-use Module::Build;
18-
19-# $SVN::Core::VERSION is set in a manner that confuses Module::Build, so
20-# do an explicit version check here.
21-my $svn_maj = 1;
22-my $svn_min = 4; # Need Subversion 1.4.x or above
23-
24-die << "." unless eval { no warnings 'once'; require SVN::Core; $SVN::Core::VER_MAJOR > $svn_maj or ($SVN::Core::VER_MAJOR == $svn_maj and $SVN::Core::VER_MINOR >= $svn_min); };
25-===> Warning: SVN::Core is missing or outdated.
26-
27-Please manually install SVN::Core by compiling Subversion
28-(version $svn_maj.$svn_min.0 or above) with SWIG/Perl bindings,
29-and try this installation process again.
30-.
31-
32-my $class = Module::Build->subclass(code => <<'EOCODE');
33- sub ACTION_code {
34- my $self = shift;
35- my $rc = $self->SUPER::ACTION_code(@_);
36-
37- warn "Copying additional files\n";
38-
39- open(MAN, 'MANIFEST') or die 'Could not open MANIFEST';
40- my @files = map { chomp; $_ }
41- grep { $_ =~ m{^lib/SVN/Web/(Style|Template|I18N)} } <MAN>;
42- close(MAN);
43-
44- $self->copy_if_modified(from => $_,
45- to => File::Spec->catfile($self->blib(), $_))
46- for map { $self->localize_file_path($_) } @files;
47-
48- return $rc;
49- }
50-EOCODE
51-
52-my %feature = ();
53-my %config_data = ();
54-my %requires = ('Template' => 0,
55- 'YAML' => 0,
56- 'Number::Format' => 0,
57- 'Template::Plugin::Number::Format' => 0,
58- 'Locale::Maketext' => 0,
59- 'Locale::Maketext::Lexicon' => 0,
60- 'Exception::Class' => 1.22,
61- 'List::Util' => 0,
62- 'URI' => 0,
63- 'Time::Zone' => 0,
64- 'Test::WWW::Mechanize' => 0,
65- );
66-
67-=head1 NAME
68-
69-Build.PL
70-
71-=head1 SYNOPSIS
72-
73- perl Build.PL [--run_apache_tests]
74- [--apache_path PATH]
75- [--apxs_path PATH]
76- [--run_apache_cgi_tests]
77- [--with_mod_perl]
78- [--run_mod_perl_tests]
79- [--mod_perl_path PATH]
80- [--run_svnweb-server_tests]
81- [--httpd_port PORT]
82- [--skip_questions]
83- [-- --Module::Build options]
84-
85-=head1 DESCRIPTION
86-
87-This is the build script for SVN::Web. Since some of SVN::Web's
88-functionality is optional, and/or doesn't need to be tested at install
89-time, it determines the correct set of pre-requisite modules prior to
90-install, and obtains some information from the user that is needed by the
91-automated tests.
92-
93-The options are:
94-
95-=over
96-
97-=item --run_apache_tests
98-
99-Whether to run post-build tests that require Apache. Use
100-C<--norun_apache_tests> to disable.
101-
102-=item --apache_path PATH
103-
104-The full path to the Apache httpd binary.
105-
106-=item --apxs_path PATH
107-
108-The full path to the Apache apxs binary.
109-
110-=item --run_apache_cgi_tests
111-
112-Whether to run post-build tests that SVN::Web as a CGI script with Apache.
113-Use C<--norun_apache_cgi_tests> to disable.
114-
115-=item --with_mod_perl
116-
117-Whether SVN::Web will be used under mod_perl. Use C<--nowith_mod_perl> to
118-disable.
119-
120-=item --run_mod_perl_tests
121-
122-Whether to run post-build tests that use SVN::Web as a mod_perl handler.
123-Use C<--norun_mod_perl_tests> to disable.
124-
125-=item --mod_perl_path PATH
126-
127-The full path to the mod_perl shared object file (typically called
128-F<mod_perl.so> or F<libperl.so>.
129-
130-=item --run_svnweb-server_tests
131-
132-Whether to run post-build tests for SVN::Web's simple web server. Use
133-C<--norun_svnweb-server_tests> to disable.
134-
135-=item --httpd_port PORT
136-
137-Specify the PORT that the Apache and svnweb-server tests should use.
138-
139-=item --skip_questions
140-
141-Take the command line options as read, and don't ask the user any questions
142-before creating the build script.
143-
144-=back
145-
146-You may also provide all the usual options that L<Module::Build> supports.
147-However, these options should appear after the options described
148-previously, and should be preceeded by C<-->.
149-
150-=cut
151-
152-my $skip_questions = 0;
153-
154-GetOptions('with_mod_perl' => sub { $requires{'Apache::Request'} = 0; },
155- 'run_apache_tests' => \$feature{run_apache_tests},
156- 'apache_path=s' => \$config_data{apache_path},
157- 'apxs_path=s' => \$config_data{apxs_path},
158- 'run_apache_cgi_tests' => \$feature{run_apache_cgi_tests},
159- 'run_mod_perl_tests' => \$feature{run_mod_perl_tests},
160- 'mod_perl_path=s' => \$config_data{mod_perl_path},
161- 'run_svnweb-server_tests' => \$feature{'run_svnweb-server_tests'},
162- 'httpd_port=i' => \$config_data{httpd_port},
163- 'skip_questions' => \$skip_questions,
164- );
165-
166-
167-goto build if $skip_questions;
168-
169-# ------------------------------------------------------------------------
170-
171-print <<EOM;
172-
173-Welcome to SVN::Web. The installer will now ask you a few questions to
174-make sure that the list of modules that SVN::Web requires is correct.
175-
176-Each question has a command line option associated with it, and there is
177-also a command line option to skip all the questions.
178-
179-To do this, press Ctrl-C now and re-run 'perl Build.PL' with the
180-appropriate options. To see the documentation for the options run:
181-
182- perldoc Build.PL
183-
184-Press RETURN to continue.
185-
186-EOM
187-
188-<STDIN>;
189-
190-# ------------------------------------------------------------------------
191-
192-print <<EOM;
193-
194-The test suite includes tests to check that SVN::Web works correctly
195-when installed under Apache. You do not have to run these tests, but
196-if you intend to use SVN::Web with Apache then they may highlight
197-issues that were not encountered in the author's development
198-environment.
199-
200-EOM
201-
202-$feature{run_apache_tests} =
203- Module::Build->y_n(q{==> Do you want to run the Apache tests?}, 'n');
204-
205-while($feature{run_apache_tests}) {
206- $config_data{apache_path} =
207- Module::Build->prompt('==> Please enter the full path to your Apache httpd binary', '/usr/local/sbin/httpd');
208-
209- if(! -x $config_data{apache_path}) {
210- print "The path\n\n";
211- print " '", $config_data{apache_path}, "'\n\n";
212- print "is not executable.\n\n";
213- next;
214- }
215-
216- $config_data{apxs_path} =
217- Module::Build->prompt('==> Please enter the full path to your apxs binary', dirname($config_data{apache_path}) . '/apxs');
218-
219- if(! -x $config_data{apxs_path}) {
220- print "The path\n\n";
221- print " '", $config_data{apxs_path}, "'\n\n";
222- print "is not executable.\n\n";
223- next;
224- }
225-
226- last;
227-} continue {
228- $feature{run_apache_tests} =
229- Module::Build->y_n('==> Do you still want to run the Apache tests?', 'n');
230-}
231-
232-# ------------------------------------------------------------------------
233-
234-# Work out which version of Apache we're using
235-if($feature{run_apache_tests}) {
236- my $httpd_v = `$config_data{apache_path} -v`;
237- my($httpd_version) = $httpd_v =~ m{^Server version: Apache/(\d)\.};
238- $config_data{httpd_version} = $httpd_version;
239-
240- if($httpd_version == 1) {
241- print "Apache 1.x detected\n";
242- $requires{'Apache::Request'} = 0;
243- }
244-
245- if($httpd_version == 2) {
246- print "Apache 2.x detected\n";
247- $requires{'Apache2::Request'} = 0;
248- }
249-
250- if($httpd_version < 1 or $httpd_version > 2) {
251- print <<"EOM";
252-The output from running
253-
254- $config_data{apache_path} -v
255-
256-did not produce something this program could parse to determine your
257-Apache version number. The output was:
258-
259-$httpd_v
260-
261-Please report this as a bug. In the meantime, the Apache tests have
262-been disabled.
263-EOM
264-
265- $feature{run_apache_tests} = 0;
266- }
267-}
268-
269-# ------------------------------------------------------------------------
270-
271-if($feature{run_apache_tests}) {
272- print <<EOM;
273-
274-SVN::Web can be run under Apache as a CGI script.
275-
276-EOM
277-
278- $feature{run_apache_cgi_tests} =
279- Module::Build->y_n('==> Do you want to test that SVN::Web works with Apache as a CGI script', 'y');
280-}
281-
282-# ------------------------------------------------------------------------
283-
284-if($feature{run_apache_tests}) {
285- $feature{run_mod_perl_tests} =
286- Module::Build->y_n(q{==> Do you want to test mod_perl support?}, 'y');
287-} else {
288- $feature{run_mod_perl_tests} = 0;
289-}
290-
291-# Find the mod_perl .so
292-if(exists $config_data{apxs_path} and defined $config_data{apxs_path}) {
293- my $libexec_dir;
294- chomp($libexec_dir = `$config_data{apxs_path} -q LIBEXECDIR`);
295- $config_data{libexec_dir} = $libexec_dir;
296-
297- foreach my $file (qw(mod_perl.so libperl.so)) {
298- if(-f "$libexec_dir/$file") {
299- $config_data{mod_perl_path} = "$libexec_dir/$file";
300- last;
301- }
302- }
303-}
304-
305-while($feature{run_mod_perl_tests}) {
306- $config_data{mod_perl_path} =
307- Module::Build->prompt('==> Please enter the full path to your mod_perl library:', $config_data{mod_perl_path});
308-
309- if(! -e $config_data{mod_perl_path}) {
310- print "The path\n\n";
311- print " '", $config_data{mod_perl_path}, "'\n\n";
312- print "does not exist.\n\n";
313- next;
314- }
315-
316- last;
317-} continue {
318- $feature{run_mod_perl_tests} =
319- Module::Build->y_n('==> Do you still want to run the mod_perl tests?', 'n');
320-}
321-
322-# ------------------------------------------------------------------------
323-
324-print <<EOM;
325-
326-SVN::Web includes a simple web server (called "svnweb-server") that
327-uses the HTTP::Server::Simple module.
328-
329-Would you like to use this server? If so, HTTP::Server::Simple will
330-be added to the list of modules that SVN::Web requires and tests will
331-be run before installation to make sure that it is working correctly.
332-
333-EOM
334-
335-$feature{'run_svnweb-server_tests'} =
336- Module::Build->y_n(q{==> Do you want to test svnweb-server?}, 'y');
337-
338-$requires{'HTTP::Server::Simple'} = 0 if $feature{'run_svnweb-server_tests'};
339-
340-if($feature{run_apache_tests} or $feature{'run_svnweb-server_tests'}) {
341- print <<EOM;
342-
343-The httpd server will be started listening on the loopback address
344-(127.0.0.1). However, it must be bound to a network port that is not
345-currently being used by another service.
346-
347-EOM
348-
349- until(defined $config_data{httpd_port}) {
350- $config_data{httpd_port} =
351- Module::Build->prompt('==> Please enter a spare port', 8080);
352-
353- if($config_data{httpd_port} !~ /^\d+$/) {
354- print "The port must contain only digits.\n\n";
355- next;
356- }
357-
358- if($config_data{httpd_port} < 1024 and $> != 0) {
359- print <<EOM;
360-
361-You have entered a port number that is less than a 1024, and you are
362-not the root user. Please enter a different port number.
363-
364-EOM
365-
366- next;
367- }
368-
369- if($config_data{httpd_port} < 1) {
370- print "Ports less than 1 are not allowed\n\n";
371- next;
372- }
373-
374- if($config_data{httpd_port} > 65535) {
375- print "Ports greater than 65535 are not allowed\n\n";
376- next;
377- }
378-
379- last;
380- } continue {
381- $config_data{httpd_port} = undef;
382- }
383-}
384-
385-# ------------------------------------------------------------------------
386-
387-print <<EOM;
388-
389-SVN::Web can use plugins to turn e-mail addresses and URLs in
390-Subversion commit messages in to clickable hyperlinks.
391-
392-EOM
393-
394-if(Module::Build->y_n('==> Do you want to install these plugins?', 'y')) {
395- $requires{'Template::Plugin::Clickable'} = 0;
396- $requires{'Template::Plugin::Clickable::Email'} = 0;
397-}
398-
399-# ------------------------------------------------------------------------
400-
401-build:
402-
403-$b = $class->new(
404- dist_name => 'SVN-Web',
405- dist_author => 'Nik Clayton <nik@FreeBSD.org>',
406- license => 'perl',
407- module_name => 'SVN::Web',
408- create_makefile_pl => 'passthrough',
409- create_readme => 0,
410- sign => 1,
411- script_files => [ 'bin/svnweb-install', 'bin/svnweb-server' ],
412- requires => \%requires,
413- recommends => { 'Cache::Cache', => 0,
414- 'Template::Plugin::Subst' => 0,
415- 'Test::Benchmark' => 0,
416- 'Test::HTML::Tidy' => 0,
417- 'XML::RSS::Parser' => 0, },
418- add_to_cleanup => [ qw't/repos*' ],
419-);
420-
421-$b->config_data($_ => $config_data{$_}) foreach keys %config_data;
422-$b->feature($_ => $feature{$_}) foreach keys %feature;
423-
424-$b->create_build_script();
425
426=== modified file 'CHANGES.pod'
427--- CHANGES.pod 2007-11-30 14:01:12 +0000
428+++ CHANGES.pod 2013-01-26 22:10:25 +0000
429@@ -12,6 +12,88 @@
430 SVN::Web. Please see L<UPDATING.pod> for details about any changes
431 you may need to make when updating an SVN::Web installation.
432
433+=head2 0.63, released Oct 17, 2012
434+
435+=over
436+
437+=item
438+
439+More improvements to UTF8 handling graciously contributed by Vladimir Timofeev
440+
441+=back
442+
443+=head2 0.62, released Oct 10, 2012
444+
445+=over
446+
447+=item
448+
449+Updated psgi file, for some reason I regressed it.
450+
451+=item
452+
453+A variety of fixes, notably huge improvements to UTF8 handling graciously contributed by Vladimir Timofeev and diff output fixes
454+
455+=back
456+
457+=head2 0.61, released Jun 11, 2012
458+
459+=over
460+
461+=item
462+
463+Template fixes for RT48416
464+
465+=item
466+
467+RT24507 closed as the stand alone server was removed in favor of Plack.
468+
469+=item
470+
471+RT39707 closed as many perl SVN related issues were resolved elsewhere
472+
473+=item
474+
475+Included patch from RT32041 to authenticate to https
476+
477+=back
478+
479+=head2 0.60, released Jun 7, 2012
480+
481+=over
482+
483+=item
484+
485+Pulled out mod_perl1/2 and cgi, replaced with Plack. This probably broke lots of things.
486+
487+=item
488+
489+Changed to using Dist::Zilla with MakeMaker (due to .po issues with Module::Build)
490+
491+=item
492+
493+DAGOLDEN recommends using Alien::SVN as dependency, rather than SVN::Core, SVN::Client and SVN::Ra. This is because the SVN perl modules are not published to CPAN.
494+
495+=item
496+
497+Merged patch from rt26159
498+
499+=back
500+
501+=head2 0.54, never released
502+
503+=over
504+
505+=item
506+
507+Fix for RT35186, to make 'selected' compliant with XHTML
508+
509+=item
510+
511+Fix for RT37388, by Vladimir Timofeev
512+
513+=back
514+
515 =head2 0.53, released Apr 29, 2007
516
517 =over
518@@ -47,7 +129,7 @@
519 =item
520
521 C<reposparent> functionality was inadvertently broken in 0.50. This
522-release fixes that. This was rt#24377 reported by Christoph Buescher
523+release fixes that. This was rt#24377 reported by Christoph Buescher
524 <Christoph.Buescher@fiducia.de>.
525
526 =back
527@@ -138,7 +220,7 @@
528 <sterling@hanenkamp.com>, has been fixed.
529
530 =back
531-
532+
533 =head2 0.49, released Aug 23, 2006
534
535 =over
536@@ -349,8 +431,8 @@
537
538 =item
539
540-The C<revision>, C<log>, C<view>, and C<rss> actions are much more
541-conservative with memory when processing commits that changed a large
542+The C<revision>, C<log>, C<view>, and C<rss> actions are much more
543+conservative with memory when processing commits that changed a large
544 number of files. Fixes rt#17359, reported by Dietrich Streifert
545 <dietrich.streifert@visionet.de>.
546
547@@ -369,7 +451,7 @@
548 =item
549
550 Entering a revision number that does not exist will now generate a
551-localised error message. Fixes rt#17822, reported by
552+localised error message. Fixes rt#17822, reported by
553 <gk5885@kickstyle.net>
554
555 =item
556@@ -511,13 +593,13 @@
557
558 =item
559
560-More customisation options, making it easier to add or remove actions
561+More customisation options, making it easier to add or remove actions
562 from the list of things that SVN::Web is allowed to do.
563
564 =item
565
566-Added huge swathes of information to the documentation. It should now
567-be much easier for anyone else to contribute code and/or templates to
568+Added huge swathes of information to the documentation. It should now
569+be much easier for anyone else to contribute code and/or templates to
570 SVN::Web.
571
572 =item
573@@ -526,18 +608,18 @@
574
575 =item
576
577-A mechanism to 'stack' Template Toolkit filters. You can easily run
578-log messages through an arbitrary number of filters, without causing
579+A mechanism to 'stack' Template Toolkit filters. You can easily run
580+log messages through an arbitrary number of filters, without causing
581 problems if one or more of the filters is not installed.
582
583 =item
584
585-Inline display of some content from the repository where appropriate
586+Inline display of some content from the repository where appropriate
587 (e.g., viewing an image works properly).
588
589 =item
590
591-Fixed a bug that meant the results from the automated tests weren't
592+Fixed a bug that meant the results from the automated tests weren't
593 valid. Fixed the bugs that this uncovered.
594
595 =item
596@@ -634,7 +716,7 @@
597
598 Adjust pool usage for opened repos so it's easier for modperl to work
599
600-=item
601+=item
602
603 Add mod_perl support.
604
605
606=== added file 'LICENSE'
607--- LICENSE 1970-01-01 00:00:00 +0000
608+++ LICENSE 2013-01-26 22:10:25 +0000
609@@ -0,0 +1,379 @@
610+This software is copyright (c) 2012 by Dean Hamstad.
611+
612+This is free software; you can redistribute it and/or modify it under
613+the same terms as the Perl 5 programming language system itself.
614+
615+Terms of the Perl programming language system itself
616+
617+a) the GNU General Public License as published by the Free
618+ Software Foundation; either version 1, or (at your option) any
619+ later version, or
620+b) the "Artistic License"
621+
622+--- The GNU General Public License, Version 1, February 1989 ---
623+
624+This software is Copyright (c) 2012 by Dean Hamstad.
625+
626+This is free software, licensed under:
627+
628+ The GNU General Public License, Version 1, February 1989
629+
630+ GNU GENERAL PUBLIC LICENSE
631+ Version 1, February 1989
632+
633+ Copyright (C) 1989 Free Software Foundation, Inc.
634+ 51 Franklin St, Suite 500, Boston, MA 02110-1335 USA
635+
636+ Everyone is permitted to copy and distribute verbatim copies
637+ of this license document, but changing it is not allowed.
638+
639+ Preamble
640+
641+ The license agreements of most software companies try to keep users
642+at the mercy of those companies. By contrast, our General Public
643+License is intended to guarantee your freedom to share and change free
644+software--to make sure the software is free for all its users. The
645+General Public License applies to the Free Software Foundation's
646+software and to any other program whose authors commit to using it.
647+You can use it for your programs, too.
648+
649+ When we speak of free software, we are referring to freedom, not
650+price. Specifically, the General Public License is designed to make
651+sure that you have the freedom to give away or sell copies of free
652+software, that you receive source code or can get it if you want it,
653+that you can change the software or use pieces of it in new free
654+programs; and that you know you can do these things.
655+
656+ To protect your rights, we need to make restrictions that forbid
657+anyone to deny you these rights or to ask you to surrender the rights.
658+These restrictions translate to certain responsibilities for you if you
659+distribute copies of the software, or if you modify it.
660+
661+ For example, if you distribute copies of a such a program, whether
662+gratis or for a fee, you must give the recipients all the rights that
663+you have. You must make sure that they, too, receive or can get the
664+source code. And you must tell them their rights.
665+
666+ We protect your rights with two steps: (1) copyright the software, and
667+(2) offer you this license which gives you legal permission to copy,
668+distribute and/or modify the software.
669+
670+ Also, for each author's protection and ours, we want to make certain
671+that everyone understands that there is no warranty for this free
672+software. If the software is modified by someone else and passed on, we
673+want its recipients to know that what they have is not the original, so
674+that any problems introduced by others will not reflect on the original
675+authors' reputations.
676+
677+ The precise terms and conditions for copying, distribution and
678+modification follow.
679+
680+ GNU GENERAL PUBLIC LICENSE
681+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
682+
683+ 0. This License Agreement applies to any program or other work which
684+contains a notice placed by the copyright holder saying it may be
685+distributed under the terms of this General Public License. The
686+"Program", below, refers to any such program or work, and a "work based
687+on the Program" means either the Program or any work containing the
688+Program or a portion of it, either verbatim or with modifications. Each
689+licensee is addressed as "you".
690+
691+ 1. You may copy and distribute verbatim copies of the Program's source
692+code as you receive it, in any medium, provided that you conspicuously and
693+appropriately publish on each copy an appropriate copyright notice and
694+disclaimer of warranty; keep intact all the notices that refer to this
695+General Public License and to the absence of any warranty; and give any
696+other recipients of the Program a copy of this General Public License
697+along with the Program. You may charge a fee for the physical act of
698+transferring a copy.
699+
700+ 2. You may modify your copy or copies of the Program or any portion of
701+it, and copy and distribute such modifications under the terms of Paragraph
702+1 above, provided that you also do the following:
703+
704+ a) cause the modified files to carry prominent notices stating that
705+ you changed the files and the date of any change; and
706+
707+ b) cause the whole of any work that you distribute or publish, that
708+ in whole or in part contains the Program or any part thereof, either
709+ with or without modifications, to be licensed at no charge to all
710+ third parties under the terms of this General Public License (except
711+ that you may choose to grant warranty protection to some or all
712+ third parties, at your option).
713+
714+ c) If the modified program normally reads commands interactively when
715+ run, you must cause it, when started running for such interactive use
716+ in the simplest and most usual way, to print or display an
717+ announcement including an appropriate copyright notice and a notice
718+ that there is no warranty (or else, saying that you provide a
719+ warranty) and that users may redistribute the program under these
720+ conditions, and telling the user how to view a copy of this General
721+ Public License.
722+
723+ d) You may charge a fee for the physical act of transferring a
724+ copy, and you may at your option offer warranty protection in
725+ exchange for a fee.
726+
727+Mere aggregation of another independent work with the Program (or its
728+derivative) on a volume of a storage or distribution medium does not bring
729+the other work under the scope of these terms.
730+
731+ 3. You may copy and distribute the Program (or a portion or derivative of
732+it, under Paragraph 2) in object code or executable form under the terms of
733+Paragraphs 1 and 2 above provided that you also do one of the following:
734+
735+ a) accompany it with the complete corresponding machine-readable
736+ source code, which must be distributed under the terms of
737+ Paragraphs 1 and 2 above; or,
738+
739+ b) accompany it with a written offer, valid for at least three
740+ years, to give any third party free (except for a nominal charge
741+ for the cost of distribution) a complete machine-readable copy of the
742+ corresponding source code, to be distributed under the terms of
743+ Paragraphs 1 and 2 above; or,
744+
745+ c) accompany it with the information you received as to where the
746+ corresponding source code may be obtained. (This alternative is
747+ allowed only for noncommercial distribution and only if you
748+ received the program in object code or executable form alone.)
749+
750+Source code for a work means the preferred form of the work for making
751+modifications to it. For an executable file, complete source code means
752+all the source code for all modules it contains; but, as a special
753+exception, it need not include source code for modules which are standard
754+libraries that accompany the operating system on which the executable
755+file runs, or for standard header files or definitions files that
756+accompany that operating system.
757+
758+ 4. You may not copy, modify, sublicense, distribute or transfer the
759+Program except as expressly provided under this General Public License.
760+Any attempt otherwise to copy, modify, sublicense, distribute or transfer
761+the Program is void, and will automatically terminate your rights to use
762+the Program under this License. However, parties who have received
763+copies, or rights to use copies, from you under this General Public
764+License will not have their licenses terminated so long as such parties
765+remain in full compliance.
766+
767+ 5. By copying, distributing or modifying the Program (or any work based
768+on the Program) you indicate your acceptance of this license to do so,
769+and all its terms and conditions.
770+
771+ 6. Each time you redistribute the Program (or any work based on the
772+Program), the recipient automatically receives a license from the original
773+licensor to copy, distribute or modify the Program subject to these
774+terms and conditions. You may not impose any further restrictions on the
775+recipients' exercise of the rights granted herein.
776+
777+ 7. The Free Software Foundation may publish revised and/or new versions
778+of the General Public License from time to time. Such new versions will
779+be similar in spirit to the present version, but may differ in detail to
780+address new problems or concerns.
781+
782+Each version is given a distinguishing version number. If the Program
783+specifies a version number of the license which applies to it and "any
784+later version", you have the option of following the terms and conditions
785+either of that version or of any later version published by the Free
786+Software Foundation. If the Program does not specify a version number of
787+the license, you may choose any version ever published by the Free Software
788+Foundation.
789+
790+ 8. If you wish to incorporate parts of the Program into other free
791+programs whose distribution conditions are different, write to the author
792+to ask for permission. For software which is copyrighted by the Free
793+Software Foundation, write to the Free Software Foundation; we sometimes
794+make exceptions for this. Our decision will be guided by the two goals
795+of preserving the free status of all derivatives of our free software and
796+of promoting the sharing and reuse of software generally.
797+
798+ NO WARRANTY
799+
800+ 9. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
801+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
802+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
803+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
804+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
805+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
806+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
807+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
808+REPAIR OR CORRECTION.
809+
810+ 10. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
811+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
812+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
813+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
814+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
815+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
816+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
817+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
818+POSSIBILITY OF SUCH DAMAGES.
819+
820+ END OF TERMS AND CONDITIONS
821+
822+ Appendix: How to Apply These Terms to Your New Programs
823+
824+ If you develop a new program, and you want it to be of the greatest
825+possible use to humanity, the best way to achieve this is to make it
826+free software which everyone can redistribute and change under these
827+terms.
828+
829+ To do so, attach the following notices to the program. It is safest to
830+attach them to the start of each source file to most effectively convey
831+the exclusion of warranty; and each file should have at least the
832+"copyright" line and a pointer to where the full notice is found.
833+
834+ <one line to give the program's name and a brief idea of what it does.>
835+ Copyright (C) 19yy <name of author>
836+
837+ This program is free software; you can redistribute it and/or modify
838+ it under the terms of the GNU General Public License as published by
839+ the Free Software Foundation; either version 1, or (at your option)
840+ any later version.
841+
842+ This program is distributed in the hope that it will be useful,
843+ but WITHOUT ANY WARRANTY; without even the implied warranty of
844+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
845+ GNU General Public License for more details.
846+
847+ You should have received a copy of the GNU General Public License
848+ along with this program; if not, write to the Free Software
849+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA
850+
851+
852+Also add information on how to contact you by electronic and paper mail.
853+
854+If the program is interactive, make it output a short notice like this
855+when it starts in an interactive mode:
856+
857+ Gnomovision version 69, Copyright (C) 19xx name of author
858+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
859+ This is free software, and you are welcome to redistribute it
860+ under certain conditions; type `show c' for details.
861+
862+The hypothetical commands `show w' and `show c' should show the
863+appropriate parts of the General Public License. Of course, the
864+commands you use may be called something other than `show w' and `show
865+c'; they could even be mouse-clicks or menu items--whatever suits your
866+program.
867+
868+You should also get your employer (if you work as a programmer) or your
869+school, if any, to sign a "copyright disclaimer" for the program, if
870+necessary. Here a sample; alter the names:
871+
872+ Yoyodyne, Inc., hereby disclaims all copyright interest in the
873+ program `Gnomovision' (a program to direct compilers to make passes
874+ at assemblers) written by James Hacker.
875+
876+ <signature of Ty Coon>, 1 April 1989
877+ Ty Coon, President of Vice
878+
879+That's all there is to it!
880+
881+
882+--- The Artistic License 1.0 ---
883+
884+This software is Copyright (c) 2012 by Dean Hamstad.
885+
886+This is free software, licensed under:
887+
888+ The Artistic License 1.0
889+
890+The Artistic License
891+
892+Preamble
893+
894+The intent of this document is to state the conditions under which a Package
895+may be copied, such that the Copyright Holder maintains some semblance of
896+artistic control over the development of the package, while giving the users of
897+the package the right to use and distribute the Package in a more-or-less
898+customary fashion, plus the right to make reasonable modifications.
899+
900+Definitions:
901+
902+ - "Package" refers to the collection of files distributed by the Copyright
903+ Holder, and derivatives of that collection of files created through
904+ textual modification.
905+ - "Standard Version" refers to such a Package if it has not been modified,
906+ or has been modified in accordance with the wishes of the Copyright
907+ Holder.
908+ - "Copyright Holder" is whoever is named in the copyright or copyrights for
909+ the package.
910+ - "You" is you, if you're thinking about copying or distributing this Package.
911+ - "Reasonable copying fee" is whatever you can justify on the basis of media
912+ cost, duplication charges, time of people involved, and so on. (You will
913+ not be required to justify it to the Copyright Holder, but only to the
914+ computing community at large as a market that must bear the fee.)
915+ - "Freely Available" means that no fee is charged for the item itself, though
916+ there may be fees involved in handling the item. It also means that
917+ recipients of the item may redistribute it under the same conditions they
918+ received it.
919+
920+1. You may make and give away verbatim copies of the source form of the
921+Standard Version of this Package without restriction, provided that you
922+duplicate all of the original copyright notices and associated disclaimers.
923+
924+2. You may apply bug fixes, portability fixes and other modifications derived
925+from the Public Domain or from the Copyright Holder. A Package modified in such
926+a way shall still be considered the Standard Version.
927+
928+3. You may otherwise modify your copy of this Package in any way, provided that
929+you insert a prominent notice in each changed file stating how and when you
930+changed that file, and provided that you do at least ONE of the following:
931+
932+ a) place your modifications in the Public Domain or otherwise make them
933+ Freely Available, such as by posting said modifications to Usenet or an
934+ equivalent medium, or placing the modifications on a major archive site
935+ such as ftp.uu.net, or by allowing the Copyright Holder to include your
936+ modifications in the Standard Version of the Package.
937+
938+ b) use the modified Package only within your corporation or organization.
939+
940+ c) rename any non-standard executables so the names do not conflict with
941+ standard executables, which must also be provided, and provide a separate
942+ manual page for each non-standard executable that clearly documents how it
943+ differs from the Standard Version.
944+
945+ d) make other distribution arrangements with the Copyright Holder.
946+
947+4. You may distribute the programs of this Package in object code or executable
948+form, provided that you do at least ONE of the following:
949+
950+ a) distribute a Standard Version of the executables and library files,
951+ together with instructions (in the manual page or equivalent) on where to
952+ get the Standard Version.
953+
954+ b) accompany the distribution with the machine-readable source of the Package
955+ with your modifications.
956+
957+ c) accompany any non-standard executables with their corresponding Standard
958+ Version executables, giving the non-standard executables non-standard
959+ names, and clearly documenting the differences in manual pages (or
960+ equivalent), together with instructions on where to get the Standard
961+ Version.
962+
963+ d) make other distribution arrangements with the Copyright Holder.
964+
965+5. You may charge a reasonable copying fee for any distribution of this
966+Package. You may charge any fee you choose for support of this Package. You
967+may not charge a fee for this Package itself. However, you may distribute this
968+Package in aggregate with other (possibly commercial) programs as part of a
969+larger (possibly commercial) software distribution provided that you do not
970+advertise this Package as a product of your own.
971+
972+6. The scripts and library files supplied as input to or produced as output
973+from the programs of this Package do not automatically fall under the copyright
974+of this Package, but belong to whomever generated them, and may be sold
975+commercially, and may be aggregated with this Package.
976+
977+7. C or perl subroutines supplied by you and linked into this Package shall not
978+be considered part of this Package.
979+
980+8. The name of the Copyright Holder may not be used to endorse or promote
981+products derived from this software without specific prior written permission.
982+
983+9. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED
984+WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
985+MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
986+
987+The End
988+
989
990=== modified file 'MANIFEST'
991--- MANIFEST 2007-11-30 14:01:12 +0000
992+++ MANIFEST 2013-01-26 22:10:25 +0000
993@@ -1,11 +1,34 @@
994-bin/svnweb-install
995-bin/svnweb-server
996 CHANGES.pod
997 CONTRIBUTING.pod
998-conf/apache1.tt
999-conf/apache2.tt
1000+LICENSE
1001+MANIFEST
1002+MANIFEST.SKIP
1003+META.json
1004+META.yml
1005+Makefile.PL
1006+README
1007+SVN-Web.psgi
1008+TODO
1009+UPDATING.pod
1010+bin/svnweb-install
1011+cpanfile
1012+css/common.css
1013+css/styles-hlb.css
1014+css/trac/browser.css
1015+css/trac/changeset.css
1016+css/trac/code.css
1017+css/trac/diff.css
1018+css/trac/feed-icon-16x16.png
1019+css/trac/file.png
1020+css/trac/filedeny.png
1021+css/trac/folder.png
1022+css/trac/folderdeny.png
1023+css/trac/parent.png
1024+css/trac/svnweb.css
1025+css/trac/text-diff-html.css
1026+css/trac/trac.css
1027+dist.ini
1028 lib/SVN/Web.pm
1029-lib/SVN/Web/action.pm
1030 lib/SVN/Web/Blame.pm
1031 lib/SVN/Web/Browse.pm
1032 lib/SVN/Web/Checkout.pm
1033@@ -18,64 +41,78 @@
1034 lib/SVN/Web/I18N/zh_tw.po
1035 lib/SVN/Web/List.pm
1036 lib/SVN/Web/Log.pm
1037+lib/SVN/Web/RSS.pm
1038 lib/SVN/Web/Revision.pm
1039-lib/SVN/Web/RSS.pm
1040-lib/SVN/Web/Style/common.css
1041-lib/SVN/Web/Style/styles-hlb.css
1042-lib/SVN/Web/Style/trac/browser.css
1043-lib/SVN/Web/Style/trac/changeset.css
1044-lib/SVN/Web/Style/trac/code.css
1045-lib/SVN/Web/Style/trac/diff.css
1046-lib/SVN/Web/Style/trac/feed-icon-16x16.png
1047-lib/SVN/Web/Style/trac/file.png
1048-lib/SVN/Web/Style/trac/filedeny.png
1049-lib/SVN/Web/Style/trac/folder.png
1050-lib/SVN/Web/Style/trac/folderdeny.png
1051-lib/SVN/Web/Style/trac/parent.png
1052-lib/SVN/Web/Style/trac/svnweb.css
1053-lib/SVN/Web/Style/trac/text-diff-html.css
1054-lib/SVN/Web/Style/trac/trac.css
1055-lib/SVN/Web/Template/plain/browse
1056-lib/SVN/Web/Template/plain/diff
1057-lib/SVN/Web/Template/plain/footer
1058-lib/SVN/Web/Template/plain/header
1059-lib/SVN/Web/Template/plain/list
1060-lib/SVN/Web/Template/plain/log
1061-lib/SVN/Web/Template/plain/revision
1062-lib/SVN/Web/Template/plain/view
1063-lib/SVN/Web/Template/plain/x
1064-lib/SVN/Web/Template/trac/_action_menu
1065-lib/SVN/Web/Template/trac/_diff
1066-lib/SVN/Web/Template/trac/_log_msg
1067-lib/SVN/Web/Template/trac/blame
1068-lib/SVN/Web/Template/trac/browse
1069-lib/SVN/Web/Template/trac/diff
1070-lib/SVN/Web/Template/trac/footer
1071-lib/SVN/Web/Template/trac/header
1072-lib/SVN/Web/Template/trac/list
1073-lib/SVN/Web/Template/trac/log
1074-lib/SVN/Web/Template/trac/revision
1075-lib/SVN/Web/Template/trac/rss
1076-lib/SVN/Web/Template/trac/view
1077-lib/SVN/Web/Template/trac/x
1078 lib/SVN/Web/Test.pm
1079 lib/SVN/Web/View.pm
1080 lib/SVN/Web/X.pm
1081-Makefile.PL
1082-Build.PL
1083-MANIFEST This list of files
1084-META.yml
1085-README
1086-SIGNATURE
1087+lib/SVN/Web/action.pm
1088 t/1use.t
1089 t/2basic.t
1090 t/3svnweb-install.t
1091+t/author-critic.t
1092 t/cache.t
1093-t/cgi.t
1094-t/mod_perl.t
1095-t/svnweb-server.t
1096+t/perlcriticrc
1097+t/release-distmeta.t
1098+t/release-pod-coverage.t
1099+t/release-pod-syntax.t
1100+t/repos/README.txt
1101+t/repos/conf/authz
1102+t/repos/conf/passwd
1103+t/repos/conf/svnserve.conf
1104+t/repos/db/current
1105+t/repos/db/format
1106+t/repos/db/fs-type
1107+t/repos/db/fsfs.conf
1108+t/repos/db/min-unpacked-rev
1109+t/repos/db/rep-cache.db
1110+t/repos/db/revprops/0/0
1111+t/repos/db/revprops/0/1
1112+t/repos/db/revprops/0/2
1113+t/repos/db/revprops/0/3
1114+t/repos/db/revs/0/0
1115+t/repos/db/revs/0/1
1116+t/repos/db/revs/0/2
1117+t/repos/db/revs/0/3
1118+t/repos/db/txn-current
1119+t/repos/db/txn-current-lock
1120+t/repos/db/uuid
1121+t/repos/db/write-lock
1122+t/repos/format
1123+t/repos/hooks/post-commit.tmpl
1124+t/repos/hooks/post-lock.tmpl
1125+t/repos/hooks/post-revprop-change.tmpl
1126+t/repos/hooks/post-unlock.tmpl
1127+t/repos/hooks/pre-commit.tmpl
1128+t/repos/hooks/pre-lock.tmpl
1129+t/repos/hooks/pre-revprop-change.tmpl
1130+t/repos/hooks/pre-unlock.tmpl
1131+t/repos/hooks/start-commit.tmpl
1132+t/repos/locks/db-logs.lock
1133+t/repos/locks/db.lock
1134+t/svn-uris.t
1135 t/test_repo.dump
1136 t/timedate_format.t
1137-TODO
1138-UPDATING.pod
1139-SIGNATURE Added here by Module::Build
1140+template/plain/browse
1141+template/plain/diff
1142+template/plain/footer
1143+template/plain/header
1144+template/plain/list
1145+template/plain/log
1146+template/plain/revision
1147+template/plain/view
1148+template/plain/x
1149+template/trac/_action_menu
1150+template/trac/_diff
1151+template/trac/_log_msg
1152+template/trac/blame
1153+template/trac/browse
1154+template/trac/diff
1155+template/trac/footer
1156+template/trac/header
1157+template/trac/list
1158+template/trac/log
1159+template/trac/revision
1160+template/trac/rss
1161+template/trac/view
1162+template/trac/x
1163
1164=== added file 'MANIFEST.SKIP'
1165--- MANIFEST.SKIP 1970-01-01 00:00:00 +0000
1166+++ MANIFEST.SKIP 2013-01-26 22:10:25 +0000
1167@@ -0,0 +1,1 @@
1168+config.yaml
1169
1170=== added file 'META.json'
1171--- META.json 1970-01-01 00:00:00 +0000
1172+++ META.json 2013-01-26 22:10:25 +0000
1173@@ -0,0 +1,79 @@
1174+{
1175+ "abstract" : "Subversion repository web frontend",
1176+ "author" : [
1177+ "Dean Hamstead <dean@fragfest.com.au>"
1178+ ],
1179+ "dynamic_config" : 0,
1180+ "generated_by" : "Dist::Zilla version 4.300025, CPAN::Meta::Converter version 2.120921",
1181+ "license" : [
1182+ "perl_5"
1183+ ],
1184+ "meta-spec" : {
1185+ "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
1186+ "version" : "2"
1187+ },
1188+ "name" : "SVN-Web",
1189+ "prereqs" : {
1190+ "build" : {
1191+ "requires" : {
1192+ "File::Copy" : "0",
1193+ "File::Find" : "0"
1194+ }
1195+ },
1196+ "configure" : {
1197+ "requires" : {
1198+ "ExtUtils::MakeMaker" : "6.30"
1199+ }
1200+ },
1201+ "runtime" : {
1202+ "recommends" : {
1203+ "Cache::Cache" : "0",
1204+ "Template::Plugin::Clickable" : "0",
1205+ "Template::Plugin::Clickable::Email" : "0",
1206+ "Template::Plugin::Subst" : "0",
1207+ "Test::Benchmark" : "0",
1208+ "Test::HTML::Tidy" : "0",
1209+ "XML::RSS::Parser" : "0"
1210+ },
1211+ "requires" : {
1212+ "Alien::SVN" : "0",
1213+ "Carp" : "0",
1214+ "Encode" : "0",
1215+ "Exception::Class" : "1.22",
1216+ "File::Basename" : "0",
1217+ "File::Path" : "0",
1218+ "File::Spec" : "0",
1219+ "File::Temp" : "0",
1220+ "FindBin" : "0",
1221+ "IO::File" : "0",
1222+ "List::Util" : "0",
1223+ "Locale::Maketext" : "0",
1224+ "Locale::Maketext::Lexicon" : "0",
1225+ "Number::Format" : "0",
1226+ "POSIX" : "0",
1227+ "Plack" : "0",
1228+ "Template" : "0",
1229+ "Template::Plugin::Number::Format" : "0",
1230+ "Time::Zone" : "0",
1231+ "URI::Escape" : "0",
1232+ "YAML" : "0",
1233+ "base" : "0",
1234+ "perl" : "5.00404",
1235+ "strict" : "0",
1236+ "vars" : "0",
1237+ "warnings" : "0"
1238+ }
1239+ },
1240+ "test" : {
1241+ "requires" : {
1242+ "Cwd" : "0",
1243+ "File::Path" : "0",
1244+ "Test::More" : "0",
1245+ "Test::WWW::Mechanize" : "0"
1246+ }
1247+ }
1248+ },
1249+ "release_status" : "stable",
1250+ "version" : "0.63"
1251+}
1252+
1253
1254=== modified file 'META.yml'
1255--- META.yml 2007-11-30 14:01:12 +0000
1256+++ META.yml 2013-01-26 22:10:25 +0000
1257@@ -1,85 +1,56 @@
1258 ---
1259-name: SVN-Web
1260-version: 0.53
1261+abstract: 'Subversion repository web frontend'
1262 author:
1263- - 'Nik Clayton <nik@FreeBSD.org>'
1264-abstract: Subversion repository web frontend
1265+ - 'Dean Hamstead <dean@fragfest.com.au>'
1266+build_requires:
1267+ Cwd: 0
1268+ File::Copy: 0
1269+ File::Find: 0
1270+ File::Path: 0
1271+ Test::More: 0
1272+ Test::WWW::Mechanize: 0
1273+configure_requires:
1274+ ExtUtils::MakeMaker: 6.30
1275+dynamic_config: 0
1276+generated_by: 'Dist::Zilla version 4.300025, CPAN::Meta::Converter version 2.120921'
1277 license: perl
1278-resources:
1279- license: http://dev.perl.org/licenses/
1280+meta-spec:
1281+ url: http://module-build.sourceforge.net/META-spec-v1.4.html
1282+ version: 1.4
1283+name: SVN-Web
1284+recommends:
1285+ Cache::Cache: 0
1286+ Template::Plugin::Clickable: 0
1287+ Template::Plugin::Clickable::Email: 0
1288+ Template::Plugin::Subst: 0
1289+ Test::Benchmark: 0
1290+ Test::HTML::Tidy: 0
1291+ XML::RSS::Parser: 0
1292 requires:
1293- Apache::Request: 0
1294+ Alien::SVN: 0
1295+ Carp: 0
1296+ Encode: 0
1297 Exception::Class: 1.22
1298- HTTP::Server::Simple: 0
1299+ File::Basename: 0
1300+ File::Path: 0
1301+ File::Spec: 0
1302+ File::Temp: 0
1303+ FindBin: 0
1304+ IO::File: 0
1305 List::Util: 0
1306 Locale::Maketext: 0
1307 Locale::Maketext::Lexicon: 0
1308 Number::Format: 0
1309+ POSIX: 0
1310+ Plack: 0
1311 Template: 0
1312- Template::Plugin::Clickable: 0
1313- Template::Plugin::Clickable::Email: 0
1314 Template::Plugin::Number::Format: 0
1315- Test::WWW::Mechanize: 0
1316 Time::Zone: 0
1317- URI: 0
1318+ URI::Escape: 0
1319 YAML: 0
1320-recommends:
1321- Cache::Cache: 0
1322- Template::Plugin::Subst: 0
1323- Test::Benchmark: 0
1324- Test::HTML::Tidy: 0
1325- XML::RSS::Parser: 0
1326-provides:
1327- SVN::Web:
1328- file: lib/SVN/Web.pm
1329- version: 0.53
1330- SVN::Web::Blame:
1331- file: lib/SVN/Web/Blame.pm
1332- version: 0.53
1333- SVN::Web::Browse:
1334- file: lib/SVN/Web/Browse.pm
1335- version: 0.53
1336- SVN::Web::Checkout:
1337- file: lib/SVN/Web/Checkout.pm
1338- version: 0.53
1339- SVN::Web::Diff:
1340- file: lib/SVN/Web/Diff.pm
1341- version: 0.53
1342- SVN::Web::DiffParser:
1343- file: lib/SVN/Web/DiffParser.pm
1344- version: 0.53
1345- SVN::Web::DiffParser::Change:
1346- file: lib/SVN/Web/DiffParser.pm
1347- SVN::Web::I18N:
1348- file: lib/SVN/Web/I18N.pm
1349- version: 0.53
1350- SVN::Web::List:
1351- file: lib/SVN/Web/List.pm
1352- version: 0.53
1353- SVN::Web::Log:
1354- file: lib/SVN/Web/Log.pm
1355- version: 0.53
1356- SVN::Web::RSS:
1357- file: lib/SVN/Web/RSS.pm
1358- version: 0.53
1359- SVN::Web::Revision:
1360- file: lib/SVN/Web/Revision.pm
1361- version: 0.53
1362- SVN::Web::Test:
1363- file: lib/SVN/Web/Test.pm
1364- version: 0.53
1365- SVN::Web::Test::Mechanize:
1366- file: lib/SVN/Web/Test.pm
1367- SVN::Web::View:
1368- file: lib/SVN/Web/View.pm
1369- version: 0.53
1370- SVN::Web::X:
1371- file: lib/SVN/Web/X.pm
1372- version: 0.53
1373- SVN::Web::action:
1374- file: lib/SVN/Web/action.pm
1375- version: 0.53
1376-generated_by: Module::Build version 0.2807
1377-meta-spec:
1378- url: http://module-build.sourceforge.net/META-spec-v1.2.html
1379- version: 1.2
1380+ base: 0
1381+ perl: 5.00404
1382+ strict: 0
1383+ vars: 0
1384+ warnings: 0
1385+version: 0.63
1386
1387=== modified file 'Makefile.PL'
1388--- Makefile.PL 2007-11-30 14:01:12 +0000
1389+++ Makefile.PL 2013-01-26 22:10:25 +0000
1390@@ -1,31 +1,84 @@
1391-# Note: this file was auto-generated by Module::Build::Compat version 0.03
1392-
1393- unless (eval "use Module::Build::Compat 0.02; 1" ) {
1394- print "This module requires Module::Build to install itself.\n";
1395-
1396- require ExtUtils::MakeMaker;
1397- my $yn = ExtUtils::MakeMaker::prompt
1398- (' Install Module::Build now from CPAN?', 'y');
1399-
1400- unless ($yn =~ /^y/i) {
1401- die " *** Cannot install without Module::Build. Exiting ...\n";
1402- }
1403-
1404- require Cwd;
1405- require File::Spec;
1406- require CPAN;
1407-
1408- # Save this 'cause CPAN will chdir all over the place.
1409- my $cwd = Cwd::cwd();
1410-
1411- CPAN::Shell->install('Module::Build::Compat');
1412- CPAN::Shell->expand("Module", "Module::Build::Compat")->uptodate
1413- or die "Couldn't install Module::Build, giving up.\n";
1414-
1415- chdir $cwd or die "Cannot chdir() back to $cwd: $!";
1416- }
1417- eval "use Module::Build::Compat 0.02; 1" or die $@;
1418- use lib '_build/lib';
1419- Module::Build::Compat->run_build_pl(args => \@ARGV);
1420- require MyModuleBuilder;
1421- Module::Build::Compat->write_makefile(build_class => 'MyModuleBuilder');
1422+
1423+use strict;
1424+use warnings;
1425+
1426+use 5.004040;
1427+
1428+use ExtUtils::MakeMaker 6.30;
1429+
1430+
1431+
1432+my %WriteMakefileArgs = (
1433+ "ABSTRACT" => "Subversion repository web frontend",
1434+ "AUTHOR" => "Dean Hamstead <dean\@fragfest.com.au>",
1435+ "BUILD_REQUIRES" => {
1436+ "Cwd" => 0,
1437+ "File::Copy" => 0,
1438+ "File::Find" => 0,
1439+ "File::Path" => 0,
1440+ "Test::More" => 0,
1441+ "Test::WWW::Mechanize" => 0
1442+ },
1443+ "CONFIGURE_REQUIRES" => {
1444+ "ExtUtils::MakeMaker" => "6.30"
1445+ },
1446+ "DISTNAME" => "SVN-Web",
1447+ "EXE_FILES" => [
1448+ "bin/svnweb-install"
1449+ ],
1450+ "LICENSE" => "perl",
1451+ "NAME" => "SVN::Web",
1452+ "PREREQ_PM" => {
1453+ "Alien::SVN" => 0,
1454+ "Carp" => 0,
1455+ "Encode" => 0,
1456+ "Exception::Class" => "1.22",
1457+ "File::Basename" => 0,
1458+ "File::Path" => 0,
1459+ "File::Spec" => 0,
1460+ "File::Temp" => 0,
1461+ "FindBin" => 0,
1462+ "IO::File" => 0,
1463+ "List::Util" => 0,
1464+ "Locale::Maketext" => 0,
1465+ "Locale::Maketext::Lexicon" => 0,
1466+ "Number::Format" => 0,
1467+ "POSIX" => 0,
1468+ "Plack" => 0,
1469+ "Template" => 0,
1470+ "Template::Plugin::Number::Format" => 0,
1471+ "Time::Zone" => 0,
1472+ "URI::Escape" => 0,
1473+ "YAML" => 0,
1474+ "base" => 0,
1475+ "strict" => 0,
1476+ "vars" => 0,
1477+ "warnings" => 0
1478+ },
1479+ "VERSION" => "0.63",
1480+ "test" => {
1481+ "TESTS" => "t/*.t"
1482+ }
1483+);
1484+
1485+
1486+unless ( eval { ExtUtils::MakeMaker->VERSION(6.56) } ) {
1487+ my $br = delete $WriteMakefileArgs{BUILD_REQUIRES};
1488+ my $pp = $WriteMakefileArgs{PREREQ_PM};
1489+ for my $mod ( keys %$br ) {
1490+ if ( exists $pp->{$mod} ) {
1491+ $pp->{$mod} = $br->{$mod} if $br->{$mod} > $pp->{$mod};
1492+ }
1493+ else {
1494+ $pp->{$mod} = $br->{$mod};
1495+ }
1496+ }
1497+}
1498+
1499+delete $WriteMakefileArgs{CONFIGURE_REQUIRES}
1500+ unless eval { ExtUtils::MakeMaker->VERSION(6.52) };
1501+
1502+WriteMakefile(%WriteMakefileArgs);
1503+
1504+
1505+
1506
1507=== modified file 'README'
1508--- README 2007-11-30 14:01:12 +0000
1509+++ README 2013-01-26 22:10:25 +0000
1510@@ -9,11 +9,10 @@
1511 You need subversion 0.28 release or newer, with perl bindings support
1512 to use SVN::Web.
1513
1514-SVN::Web uses the stanard perl module install process:
1515+SVN::Web uses the standard perl module install process:
1516
1517-% perl Makefile.PL
1518-% make
1519-# make install
1520+% perl Build.PL
1521+% Build
1522
1523 * Configuration
1524
1525@@ -24,8 +23,7 @@
1526
1527 The latest SVN::Web could be found at:
1528
1529- http://jc.ngo.org.uk/svnweb/jc/browse/nik/CPAN/SVN-Web/trunk/
1530- svn://jc.ngo.org.uk/nik/CPAN/SVN-Web/trunk/
1531+ https://github.com/djzort/SVN-Web
1532
1533 * Copyright
1534
1535@@ -33,6 +31,8 @@
1536
1537 Copyright 2005-2007 by Nik Clayton <nik@FreeBSD.org>.
1538
1539+Copyright 2012 by Dean Hamstead <dean@fragfest.com.au>.
1540+
1541 This program is free software; you can redistribute it and/or modify it
1542 under the same terms as Perl itself.
1543
1544
1545=== removed file 'SIGNATURE'
1546--- SIGNATURE 2007-11-30 14:01:12 +0000
1547+++ SIGNATURE 1970-01-01 00:00:00 +0000
1548@@ -1,102 +0,0 @@
1549-This file contains message digests of all files listed in MANIFEST,
1550-signed via the Module::Signature module, version 0.55.
1551-
1552-To verify the content in this distribution, first make sure you have
1553-Module::Signature installed, then type:
1554-
1555- % cpansign -v
1556-
1557-It will check each file's integrity, as well as the signature's
1558-validity. If "==> Signature verified OK! <==" is not displayed,
1559-the distribution may already have been compromised, and you should
1560-not run its Makefile.PL or Build.PL.
1561-
1562------BEGIN PGP SIGNED MESSAGE-----
1563-Hash: SHA1
1564-
1565-SHA1 bea36db34ac69057951dd505e0ca60d65538f35f Build.PL
1566-SHA1 520a583b38b4f2d2aa76d766470baf1b4a4e7a51 CHANGES.pod
1567-SHA1 7b57d0a24319d2a89f5132f37d2294429a388a0f CONTRIBUTING.pod
1568-SHA1 d1062d85c0122a970edbafda5e969f7b4afbe26c MANIFEST
1569-SHA1 20817bbf049938d5bba58a6ca0727157e67c2178 META.yml
1570-SHA1 10ff3cb66031d8671cfbd03cbb4bfc14c3370c8d Makefile.PL
1571-SHA1 6526f05a145d67f12182e1fd4c266b1638de5aaa README
1572-SHA1 62a73f8f454d7ab7d109f9fa935ae05e91a26fce TODO
1573-SHA1 f80fad0adde057b48313e682ffd498f8f7fbef61 UPDATING.pod
1574-SHA1 7d661813b0a7ec8f0791e15279ec168f76def36b bin/svnweb-install
1575-SHA1 4efa43e0c277a3155e319ad6e3bc0c80598643ef bin/svnweb-server
1576-SHA1 41cc64d4add3bdfce753e03e74d2de4ed5b360b0 conf/apache1.tt
1577-SHA1 679ea7e1e56ad8364178ea0f31d85bdc95da5c03 conf/apache2.tt
1578-SHA1 ddf3bd84c2c04b30ed172dc9fdb4c7872ec20d8c lib/SVN/Web.pm
1579-SHA1 196165bf088b87da4e20c5458247cff99aaa0d58 lib/SVN/Web/Blame.pm
1580-SHA1 407b5b526985e8dcb893bd704a3dcd9511a00b44 lib/SVN/Web/Browse.pm
1581-SHA1 d1bd012d5214007d033d10f637b1323866c22376 lib/SVN/Web/Checkout.pm
1582-SHA1 eccb3fdb04af416fd6958ae2db8411c11e4faf88 lib/SVN/Web/Diff.pm
1583-SHA1 429e692a733026d337b3399279185bd57bed33fd lib/SVN/Web/DiffParser.pm
1584-SHA1 6ce1a7f85da7e3b8922b7b05f87df4b26b5c6ded lib/SVN/Web/I18N.pm
1585-SHA1 4a994b088d19d8ee898679c86cbf8fd7ec59c72e lib/SVN/Web/I18N/en.po
1586-SHA1 4682ea1d4eb0d6c8f115bdb098707a7cdc1a60d8 lib/SVN/Web/I18N/fr.po
1587-SHA1 d4a15942a0891cf00c09c032c559b1ef06f17bca lib/SVN/Web/I18N/zh_cn.po
1588-SHA1 8274a5efef8210902776180aa94f1cf5dfbfe67c lib/SVN/Web/I18N/zh_tw.po
1589-SHA1 eb3a6625aff9352db3fb469ccf9ab1aeed9b888c lib/SVN/Web/List.pm
1590-SHA1 8f01ee8f6e24ba2da8f1220e466901dca2c36a3a lib/SVN/Web/Log.pm
1591-SHA1 0ca63032577f87becf3f35f3743b6321603581b6 lib/SVN/Web/RSS.pm
1592-SHA1 b622d5c6a7dfaa196e6d5fa395d39ab70b2fe88e lib/SVN/Web/Revision.pm
1593-SHA1 4e09f47629601557603649a131fb7e259abe7a8c lib/SVN/Web/Style/common.css
1594-SHA1 c7f365aa5f266c338dcf72609844b7b35e07a024 lib/SVN/Web/Style/styles-hlb.css
1595-SHA1 eba6b6abe72e5109b82348188e957825ef109ed4 lib/SVN/Web/Style/trac/browser.css
1596-SHA1 aa619eeb97d689b527e992003995b66f1e21e410 lib/SVN/Web/Style/trac/changeset.css
1597-SHA1 b4b44f2b7ec33e0240bd008ebe85d37f749be0a8 lib/SVN/Web/Style/trac/code.css
1598-SHA1 69333e899b14209268572ab6ec59549c1c1d3e6b lib/SVN/Web/Style/trac/diff.css
1599-SHA1 f5e9f35f7f0a9b9eb7940098ab38aa32bc5c62c1 lib/SVN/Web/Style/trac/feed-icon-16x16.png
1600-SHA1 9dd0a6187297068b664beb63e21594c1a0b2bc62 lib/SVN/Web/Style/trac/file.png
1601-SHA1 9dd0a6187297068b664beb63e21594c1a0b2bc62 lib/SVN/Web/Style/trac/filedeny.png
1602-SHA1 4893f3bba7bd4748784c31d55f9d7a1391d119ed lib/SVN/Web/Style/trac/folder.png
1603-SHA1 4893f3bba7bd4748784c31d55f9d7a1391d119ed lib/SVN/Web/Style/trac/folderdeny.png
1604-SHA1 1aa6724736aba1edc7862be3f2fcce09ae399031 lib/SVN/Web/Style/trac/parent.png
1605-SHA1 70899de94e923e3a9abf3bd6cbd4ebf5af166e5e lib/SVN/Web/Style/trac/svnweb.css
1606-SHA1 4623cb93b8677e5362a0956e4c96a294a74f72e2 lib/SVN/Web/Style/trac/text-diff-html.css
1607-SHA1 ab17e64c0764d55acb26d120348a9f0a956eca7b lib/SVN/Web/Style/trac/trac.css
1608-SHA1 1cd2a07c6228145c475dc4b26543330fd6ea289c lib/SVN/Web/Template/plain/browse
1609-SHA1 688dbac49cf965e5d5661804872ba6fb5dbaf1f2 lib/SVN/Web/Template/plain/diff
1610-SHA1 b7fa80002592240d66801fca04ae83604dc01b3c lib/SVN/Web/Template/plain/footer
1611-SHA1 50916a335d7a2826fde6ac142920134bc3b6c8f8 lib/SVN/Web/Template/plain/header
1612-SHA1 5da68420974ac06fa09864de00064a8c8d9fae25 lib/SVN/Web/Template/plain/list
1613-SHA1 4d9a90b287fbf6f0ee81f5b2b465d27f6799a42f lib/SVN/Web/Template/plain/log
1614-SHA1 c6d768f2a116c3fef0fe3a68eecac4848a0eeeff lib/SVN/Web/Template/plain/revision
1615-SHA1 4c4c53cf4f6de47a58d87a6a53b6bec63cb4a164 lib/SVN/Web/Template/plain/view
1616-SHA1 ea06eb2538a68c0137ccf3b4e768d533b5335d7e lib/SVN/Web/Template/plain/x
1617-SHA1 0d6b9f5f7afef2adec6b83f3accfb48d489e6156 lib/SVN/Web/Template/trac/_action_menu
1618-SHA1 4092be0442cde17dbf4f8c935d49082d809d7d9b lib/SVN/Web/Template/trac/_diff
1619-SHA1 431c0f0c7d252e471d4f15800162f8b99c5b651e lib/SVN/Web/Template/trac/_log_msg
1620-SHA1 dd6b710eb2c7f9d53a83dfc7f4ec727edd551762 lib/SVN/Web/Template/trac/blame
1621-SHA1 6394428270dcadd85f44b67c6265e5181b28b259 lib/SVN/Web/Template/trac/browse
1622-SHA1 db70eaf3635f80e565773afcf32031e6cd9c0c14 lib/SVN/Web/Template/trac/diff
1623-SHA1 4c6638e1cc601ae0a06e1ca310c560f36ca2c9f6 lib/SVN/Web/Template/trac/footer
1624-SHA1 025aca927b96c33302a1fa52a54296bb7cb5fa01 lib/SVN/Web/Template/trac/header
1625-SHA1 6560add4fc20ae5f97970b49c5eeb111c9746420 lib/SVN/Web/Template/trac/list
1626-SHA1 ca666cf10c504d897a1781e4cbb57badc6b7e541 lib/SVN/Web/Template/trac/log
1627-SHA1 e310e8700389748688837e6885e74629a3aec604 lib/SVN/Web/Template/trac/revision
1628-SHA1 99dad950693df574a75bf0b9e459d3bd5c36795d lib/SVN/Web/Template/trac/rss
1629-SHA1 9e54ee48b02f6b3faa2891afda42c01548418ea9 lib/SVN/Web/Template/trac/view
1630-SHA1 c3f9344030d90bd0cd4863fd7926a4db51fada5c lib/SVN/Web/Template/trac/x
1631-SHA1 32786839388333d070edbf7291ba76c2d690a4cd lib/SVN/Web/Test.pm
1632-SHA1 5cff77c77be25c1a3275af96fd2e2835c8abc025 lib/SVN/Web/View.pm
1633-SHA1 cbe0082208239ed360b406082f0cf1d1cc448d56 lib/SVN/Web/X.pm
1634-SHA1 eda250c4743e5f1336a29360e67ece9fcc1b4c2e lib/SVN/Web/action.pm
1635-SHA1 e0133c50fb597f8a0355de9f347a2f1c929b9dcf t/1use.t
1636-SHA1 325ab862e69051c28fb983fa5ddea4038712ac6e t/2basic.t
1637-SHA1 6f8e289b2f687abdee6fb1d7041428a5b6bf6b14 t/3svnweb-install.t
1638-SHA1 ebc0f8645c4fad62c264b949f3a134c0500c355a t/cache.t
1639-SHA1 5fb95714a294283f9b84b6e5fa926883e2aefe88 t/cgi.t
1640-SHA1 697d075aacf296699a1ebc85477b244f82bafe7a t/mod_perl.t
1641-SHA1 becc583be7bec0f4ca504f86dd791d722be53a46 t/svnweb-server.t
1642-SHA1 c3b77dd3c7d132bc44bf31bb0b6e7eb239499a4b t/test_repo.dump
1643-SHA1 455cc3afd0ab331d3e925a0b458e0e5a76060681 t/timedate_format.t
1644------BEGIN PGP SIGNATURE-----
1645-Version: GnuPG v1.4.7 (FreeBSD)
1646-
1647-iD8DBQFGNPCLk6gHZCw343URAgg/AJ9vB3lsaidMXd3nI2ImRhgnXnywzQCcDneR
1648-/eA8t7gS0WTz0+1KvyEY1vA=
1649-=wbMq
1650------END PGP SIGNATURE-----
1651
1652=== added file 'SVN-Web.psgi'
1653--- SVN-Web.psgi 1970-01-01 00:00:00 +0000
1654+++ SVN-Web.psgi 2013-01-26 22:10:25 +0000
1655@@ -0,0 +1,22 @@
1656+use SVN::Web;
1657+
1658+# load config
1659+SVN::Web::load_config('config.yaml');
1660+
1661+my $handler = sub { SVN::Web->run_psgi(@_) };
1662+
1663+# uncomment this __END__ if you dont want to have plack deliver /css
1664+#__END__
1665+
1666+use Plack::Builder;
1667+use Plack::App::Directory;
1668+
1669+my $css = Plack::App::Directory->new({ root => './css' })->to_app;
1670+
1671+builder {
1672+
1673+ mount '/css' => $css,
1674+
1675+ mount '/' => $handler,
1676+
1677+}
1678
1679=== modified file 'UPDATING.pod'
1680--- UPDATING.pod 2007-11-30 14:01:12 +0000
1681+++ UPDATING.pod 2013-01-26 22:10:25 +0000
1682@@ -6,6 +6,10 @@
1683
1684 Notes on updating from previous versions of SVN::Web
1685
1686+=head1 WARNING
1687+
1688+This is out of date for 0.60
1689+
1690 =head1 DESCRIPTION
1691
1692 If you have not modified the supplied template files the update can
1693
1694=== modified file 'bin/svnweb-install'
1695--- bin/svnweb-install 2012-06-11 23:29:21 +0000
1696+++ bin/svnweb-install 2013-01-26 22:10:25 +0000
1697@@ -19,42 +19,14 @@
1698 }
1699 }
1700
1701+my $version = SVN::Web->VERSION();
1702+
1703 die "already have config.yaml" if -e 'config.yaml';
1704
1705-open my $fh, ">config.yaml";
1706-
1707-my %targets = (
1708- Template => 'template',
1709- Style => 'css',
1710-);
1711-
1712-while(my($from, $to) = each %targets) {
1713- my $path = $INC{'SVN/Web.pm'};
1714- $path =~ s{.pm$}{/$from}i or next;
1715-
1716- find(
1717- {
1718- wanted => sub {
1719- my $dst_path = $File::Find::name;
1720- $dst_path =~ s/\Q$path\E/$to/;
1721-
1722- if(-d $File::Find::name) {
1723- mkdir $dst_path
1724- or warn "mkdir($dst_path) failed: $!\n";
1725- } else {
1726- copy($File::Find::name, $dst_path)
1727- or warn
1728- "Copying $File::Find::name -> $dst_path failed:\n$!\n";
1729- }
1730- },
1731- no_chdir => 1
1732- },
1733- $path
1734- );
1735-}
1736+open my $fh, '>', 'config.yaml';
1737
1738 print $fh <<END;
1739-version: 0.53
1740+version: $version
1741
1742 # Actions, the classes that implement them, and where they should appear
1743 # in the action menu
1744@@ -81,6 +53,8 @@
1745 class: SVN::Web::Diff
1746 list:
1747 class: SVN::Web::List
1748+ opts:
1749+ public_repos_uri: hide_local
1750 log:
1751 class: SVN::Web::Log
1752 action_menu:
1753@@ -146,20 +120,6 @@
1754
1755 close $fh;
1756
1757-open $fh, '>index.cgi';
1758-print $fh <<"END";
1759-$Config::Config{startperl} -w
1760-#use lib '.';
1761-#use lib '../lib';
1762-use CGI::Carp qw(fatalsToBrowser);
1763-use SVN::Web;
1764-SVN::Web::run_cgi();
1765-END
1766-
1767-close $fh;
1768-
1769-chmod 0755, 'index.cgi';
1770-
1771 # XXX: export the template too
1772
1773 print "SVN::Web now installed! please see config.yaml\n";
1774@@ -182,6 +142,8 @@
1775
1776 Copyright 2005-2007 by Nik Clayton C<< <nik@FreeBSD.org> >>.
1777
1778+Copyright 2012 by Dean Hamstead C<< <dean@fragfest.com.au> >>.
1779+
1780 This program is free software; you can redistribute it and/or modify it
1781 under the same terms as Perl itself.
1782
1783
1784=== removed file 'bin/svnweb-server'
1785--- bin/svnweb-server 2007-11-30 14:01:12 +0000
1786+++ bin/svnweb-server 1970-01-01 00:00:00 +0000
1787@@ -1,142 +0,0 @@
1788-#!/usr/bin/perl
1789-
1790-# -*- Mode: cperl; cperl-indent-level: 4 -*-
1791-
1792-use strict;
1793-use warnings;
1794-
1795-use base qw(HTTP::Server::Simple::CGI);
1796-
1797-use SVN::Web;
1798-use Getopt::Long;
1799-
1800-=head1 NAME
1801-
1802-svnweb-server - simple webserver for SVN::Web
1803-
1804-=head1 SYNOPSIS
1805-
1806- svnweb-server [--root DIR] [--port PORT] [--net-server Net::Server]
1807-
1808-=head1 DESCRIPTION
1809-
1810-svnweb-server is a webserver that runs SVN::Web. It's an easy way to
1811-use SVN::Web without having to set up Apache (or any other web
1812-server). The tradeoff is that the server is very simple. But for
1813-light use then it may be perfectly acceptable.
1814-
1815-=head1 OPTIONS
1816-
1817-=over
1818-
1819-=item --root DIR
1820-
1821-The directory in which you ran C<svnweb-install>.
1822-
1823-Optional, defaults to C<.>.
1824-
1825-=item --port PORT
1826-
1827-The port the server should listen on.
1828-
1829-Options, defaults to C<8080>.
1830-
1831-=item --net-server Net::Server
1832-
1833-The Net::Server subclass to use to create the server. A single,
1834-non-forking server is created by default. Other types of server can be
1835-created by giving the correct Net::Server subclass. For example, to
1836-use a server that forks to handle each request, use C<--net-server
1837-Net::Server::Fork>.
1838-
1839-=back
1840-
1841-=cut
1842-
1843-my %options = (
1844- 'root' => '.',
1845- 'port' => '8080',
1846- 'net_server' => undef
1847-);
1848-
1849-GetOptions(
1850- 'root=s' => \$options{root},
1851- 'port=i' => \$options{port},
1852- 'net-server=s' => \$options{net_server},
1853-);
1854-
1855-sub handle_request {
1856- my($self, $cgi) = @_;
1857-
1858- if($cgi->path_info() =~ m{^/css/}) { # Pass /css requests straight through
1859- my $file = $cgi->path_info();
1860- $file =~ s/^\///g;
1861- open(FILE, $file) or die "Can't open() $file: $!\n";
1862- local $/ = undef;
1863- print <FILE>;
1864- close FILE;
1865- } else {
1866- $ENV{SCRIPT_NAME} = 'http://' . $self->host() . ':' . $self->port();
1867- print "HTTP/1.1 200 OK\n";
1868- SVN::Web::run_cgi(cgi_class => 'CGI');
1869- }
1870-}
1871-
1872-use CGI::Carp qw(fatalsToBrowser);
1873-
1874-if(!-f "$options{root}/config.yaml") {
1875- print <<EOM;
1876-Can't find $options{root}/config.yaml. Make sure you've run svnweb-install
1877-in $options{root} before running this server.
1878-EOM
1879- exit;
1880-}
1881-
1882-chdir($options{root});
1883-my $server = __PACKAGE__->new($options{port});
1884-$server->net_server($options{net_server}) if defined $options{net_server};
1885-$server->run();
1886-
1887-exit;
1888-
1889-=head1 SEE ALSO
1890-
1891-L<SVN::Web>
1892-
1893-=head1 BUGS
1894-
1895-This is a simple server. Accordingly, a few features do not work properly
1896-at the moment.
1897-
1898-=over
1899-
1900-=item Redirects
1901-
1902-L<SVN::Web::Browse> will redirect the client if the URL is missing a trailing
1903-C</>. That redirection does not work with this server. That's not an issue
1904-for any URLs generated by L<SVN::Web>, but may be an issue for URLs that
1905-are entered by hand.
1906-
1907-This will also affect L<SVN::Web::List>'s C<redirect_to_browse_when_one_repo>
1908-option.
1909-
1910-=item cgi_class
1911-
1912-The C<cgi_class> declaration (if any) in F<config.yaml> is ignored. L<CGI>
1913-is always used as the CGI class.
1914-
1915-=back
1916-
1917-Please report any bugs or feature requests to
1918-C<bug-svn-web@rt.cpan.org>, or through the web interface at
1919-L<http://rt.cpan.org/NoAuth/ReportBug.html?Queue=SVN-Web>.
1920-I will be notified, and then you'll automatically be notified of progress on
1921-your bug as I make changes.
1922-
1923-=head1 AUTHOR
1924-
1925-The current maintainer is Nik Clayton, <nikc@cpan.org>.
1926-
1927-=head1 COPYRIGHT AND LICENSE
1928-
1929-Copyright 2006-2007 Nik Clayton. All Rights Reserved.
1930
1931=== removed directory 'conf'
1932=== removed file 'conf/apache1.tt'
1933--- conf/apache1.tt 2007-11-30 14:01:12 +0000
1934+++ conf/apache1.tt 1970-01-01 00:00:00 +0000
1935@@ -1,82 +0,0 @@
1936-ServerName 127.0.0.1
1937-ServerType standalone
1938-ServerRoot "/usr/local"
1939-PidFile /dev/null
1940-Timeout 300
1941-KeepAlive Off
1942-
1943-LoadModule config_log_module [% libexec_dir %]/mod_log_config.so
1944-LoadModule mime_module [% libexec_dir %]/mod_mime.so
1945-LoadModule alias_module [% libexec_dir %]/mod_alias.so
1946-[% IF mod_perl %]
1947-LoadModule perl_module [% mod_perl_path %]
1948-[% END %]
1949-
1950-[% IF cgi_bin %]
1951-LoadModule cgi_module [% libexec_dir %]/mod_cgi.so
1952-LoadModule dir_module [% libexec_dir %]/mod_dir.so
1953-LoadModule env_module [% libexec_dir %]/mod_env.so
1954-[% END %]
1955-
1956-ClearModuleList
1957-AddModule mod_log_config.c
1958-AddModule mod_mime.c
1959-AddModule mod_alias.c
1960-AddModule mod_so.c
1961-[% IF mod_perl %]
1962-AddModule mod_perl.c
1963-[% END %]
1964-
1965-[% IF cgi_bin %]
1966-AddModule mod_cgi.c
1967-AddModule mod_dir.c
1968-AddModule mod_env.c
1969-[% END %]
1970-
1971-Port [% httpd_port %]
1972-
1973-UseCanonicalName Off
1974-
1975-HostnameLookups Off
1976-
1977-ErrorLog [% svnweb_install_dir %]/log.err
1978-LogLevel debug
1979-
1980-LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
1981-LogFormat "%h %l %u %t \"%r\" %>s %b" common
1982-LogFormat "%{Referer}i -> %U" referer
1983-LogFormat "%{User-agent}i" agent
1984-
1985-CustomLog [% svnweb_install_dir %]/log common
1986-
1987-ServerSignature Off
1988-
1989-[% IF mod_perl %]
1990-<Perl>
1991- use lib '[% blib_dir %]';
1992-</Perl>
1993-
1994-<Directory [% svnweb_install_dir %]>
1995- AllowOverride None
1996- Options None
1997- SetHandler perl-script
1998- PerlHandler SVN::Web
1999-</Directory>
2000-
2001-<Directory [% svnweb_install_dir %]/css>
2002- SetHandler default-handler
2003-</Directory>
2004-
2005-[% END %]
2006-
2007-[% IF cgi_bin %]
2008-<Directory [% svnweb_install_dir %]>
2009- Options All ExecCGI
2010- AddHandler cgi-script .cgi
2011- DirectoryIndex index.cgi
2012- SetEnv PERL5LIB [% blib_dir %]
2013-</Directory>
2014-[% END %]
2015-
2016-Alias /svnweb [% svnweb_install_dir %]
2017-
2018
2019=== removed file 'conf/apache2.tt'
2020--- conf/apache2.tt 2007-11-30 14:01:12 +0000
2021+++ conf/apache2.tt 1970-01-01 00:00:00 +0000
2022@@ -1,69 +0,0 @@
2023-ServerName 127.0.0.1
2024-ServerRoot "/usr/local"
2025-PidFile /dev/null
2026-Timeout 300
2027-KeepAlive Off
2028-LockFile [% svnweb_install_dir %]/lock
2029-
2030-
2031-LoadModule log_config_module [% libexec_dir %]/mod_log_config.so
2032-LoadModule mime_module [% libexec_dir %]/mod_mime.so
2033-LoadModule alias_module [% libexec_dir %]/mod_alias.so
2034-[% IF mod_perl %]
2035-LoadModule perl_module [% mod_perl_path %]
2036-LoadModule apreq_module [% libexec_dir %]/mod_apreq2.so
2037-[% END %]
2038-
2039-[% IF cgi_bin %]
2040-LoadModule cgi_module [% libexec_dir %]/mod_cgi.so
2041-LoadModule dir_module [% libexec_dir %]/mod_dir.so
2042-LoadModule env_module [% libexec_dir %]/mod_env.so
2043-[% END %]
2044-
2045-Listen [% httpd_port %]
2046-
2047-UseCanonicalName Off
2048-
2049-HostnameLookups Off
2050-
2051-ErrorLog [% svnweb_install_dir %]/log.err
2052-LogLevel debug
2053-
2054-LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
2055-LogFormat "%h %l %u %t \"%r\" %>s %b" common
2056-LogFormat "%{Referer}i -> %U" referer
2057-LogFormat "%{User-agent}i" agent
2058-
2059-CustomLog [% svnweb_install_dir %]/log common
2060-
2061-ServerSignature Off
2062-
2063-[% IF mod_perl %]
2064-<Perl>
2065- use lib '[% blib_dir %]';
2066-</Perl>
2067-
2068-<Directory [% svnweb_install_dir %]>
2069- AllowOverride None
2070- Options None
2071- SetHandler perl-script
2072- PerlHandler SVN::Web
2073-</Directory>
2074-
2075-<Directory [% svnweb_install_dir %]/css>
2076- SetHandler default-handler
2077-</Directory>
2078-
2079-[% END %]
2080-
2081-[% IF cgi_bin %]
2082-<Directory [% svnweb_install_dir %]>
2083- Options All ExecCGI
2084- AddHandler cgi-script .cgi
2085- DirectoryIndex index.cgi
2086- SetEnv PERL5LIB [% blib_dir %]
2087-</Directory>
2088-[% END %]
2089-
2090-Alias /svnweb [% svnweb_install_dir %]/
2091-
2092
2093=== added file 'cpanfile'
2094--- cpanfile 1970-01-01 00:00:00 +0000
2095+++ cpanfile 2013-01-26 22:10:25 +0000
2096@@ -0,0 +1,49 @@
2097+requires "Alien::SVN" => "0";
2098+requires "Carp" => "0";
2099+requires "Encode" => "0";
2100+requires "Exception::Class" => "1.22";
2101+requires "File::Basename" => "0";
2102+requires "File::Path" => "0";
2103+requires "File::Spec" => "0";
2104+requires "File::Temp" => "0";
2105+requires "FindBin" => "0";
2106+requires "IO::File" => "0";
2107+requires "List::Util" => "0";
2108+requires "Locale::Maketext" => "0";
2109+requires "Locale::Maketext::Lexicon" => "0";
2110+requires "Number::Format" => "0";
2111+requires "POSIX" => "0";
2112+requires "Plack" => "0";
2113+requires "Template" => "0";
2114+requires "Template::Plugin::Number::Format" => "0";
2115+requires "Time::Zone" => "0";
2116+requires "URI::Escape" => "0";
2117+requires "YAML" => "0";
2118+requires "base" => "0";
2119+requires "perl" => "5.00404";
2120+requires "strict" => "0";
2121+requires "vars" => "0";
2122+requires "warnings" => "0";
2123+recommends "Cache::Cache" => "0";
2124+recommends "Template::Plugin::Clickable" => "0";
2125+recommends "Template::Plugin::Clickable::Email" => "0";
2126+recommends "Template::Plugin::Subst" => "0";
2127+recommends "Test::Benchmark" => "0";
2128+recommends "Test::HTML::Tidy" => "0";
2129+recommends "XML::RSS::Parser" => "0";
2130+
2131+on 'build' => sub {
2132+ requires "File::Copy" => "0";
2133+ requires "File::Find" => "0";
2134+};
2135+
2136+on 'test' => sub {
2137+ requires "Cwd" => "0";
2138+ requires "File::Path" => "0";
2139+ requires "Test::More" => "0";
2140+ requires "Test::WWW::Mechanize" => "0";
2141+};
2142+
2143+on 'configure' => sub {
2144+ requires "ExtUtils::MakeMaker" => "6.30";
2145+};
2146
2147=== added directory 'css'
2148=== added file 'css/common.css'
2149--- css/common.css 1970-01-01 00:00:00 +0000
2150+++ css/common.css 2013-01-26 22:10:25 +0000
2151@@ -0,0 +1,84 @@
2152+#categories li {
2153+ display: inline;
2154+}
2155+#categories ul {
2156+ list-style: none;
2157+}
2158+
2159+#adminMenu li, #mainMenu li {
2160+ display: inline;
2161+ text-decoration: underline;
2162+}
2163+
2164+#adminMenu ul, #mainMenu ul {
2165+ list-style: none;
2166+ padding: 0;
2167+ margin: 0;
2168+ border: 0;
2169+}
2170+
2171+#adminMenu li:hover, #mainMenu li:hover {
2172+ text-decoration: none;
2173+}
2174+
2175+
2176+
2177+#container li {
2178+ list-style-position: inside;
2179+}
2180+
2181+#container .storyColumn {
2182+ float: left;
2183+ width: 75%;
2184+}
2185+
2186+#container .boxColumn .sidetitle {
2187+ margin-top: 0;
2188+}
2189+
2190+#container .boxColumn {
2191+ padding: 0 0 16px 0;
2192+ width: 20%;
2193+ float: right;
2194+ padding-right: 20px;
2195+}
2196+
2197+.bottomRow {
2198+ clear: both;
2199+}
2200+
2201+.siteSearch {
2202+ font-size: 12pt;
2203+ color: black;
2204+}
2205+
2206+
2207+#body-container {
2208+ height: 100%;
2209+}
2210+
2211+#footer {
2212+ text-align: right;
2213+ /*
2214+ position: absolute;
2215+ bottom: 20px;
2216+ right: 160px;
2217+ */
2218+}
2219+
2220+#links {
2221+ padding-top: 10pt;
2222+ padding-bottom: 10pt;
2223+}
2224+
2225+#banner .description {
2226+ line-height:300%;
2227+}
2228+
2229+TH {
2230+ text-align: left;
2231+ background: #7D775C;
2232+ color: white;
2233+ font-size: small;
2234+ -moz-opacity: 0.9;
2235+}
2236
2237=== added file 'css/styles-hlb.css'
2238--- css/styles-hlb.css 1970-01-01 00:00:00 +0000
2239+++ css/styles-hlb.css 2013-01-26 22:10:25 +0000
2240@@ -0,0 +1,241 @@
2241+@import "common.css";
2242+
2243+/* block */
2244+body {
2245+ color: #070707;
2246+ background-color: #ccc;
2247+ margin: 10px; padding: 0;
2248+}
2249+
2250+div#banner {
2251+}
2252+
2253+.description {
2254+ padding-left: 30px;
2255+}
2256+
2257+div#content {
2258+ margin: 0px;
2259+ border-top: 2px solid #666;
2260+ border-left: 1px solid #666;
2261+ border-right: 1px solid #666;
2262+ background: #fffff7;
2263+}
2264+
2265+h2.title {
2266+ padding: 10px;
2267+}
2268+
2269+div.upper-nav {
2270+ border-top: 1px solid #ccc;
2271+ border-bottom: 1px solid #ddd;
2272+ margin: 0;
2273+ padding: 0 20px;
2274+ background: #eee;
2275+}
2276+
2277+.edit {
2278+ display: block;
2279+ border-top: 1px solid #ccc;
2280+ border-bottom: 1px solid #ddd;
2281+ margin: 0;
2282+ padding: 5px 20px;
2283+ background: #eee;
2284+}
2285+
2286+.sidetitle, .side {
2287+ display: none;
2288+}
2289+
2290+.powered {
2291+ border: 1px solid #666;
2292+ padding: 5px;
2293+ background: #eee;
2294+}
2295+
2296+h2.comments-head {
2297+ width: 5em;
2298+ border-right: 1px inset #666;
2299+ border-top: 1px groove #fff;
2300+ border-bottom: 1px inset #666;
2301+ background: #eef;
2302+}
2303+
2304+.comments-post {
2305+ padding: 0 20px 20px 20px;
2306+}
2307+
2308+/* basic text style */
2309+body {
2310+ font-family: "Palatino Linotype", Georgia, "Times New Roman", Times, serif;
2311+}
2312+
2313+div#content {
2314+ line-height: 180%;
2315+}
2316+
2317+h2.title {
2318+ font-size: xx-large;
2319+ margin: 0;
2320+ border: 0;
2321+}
2322+
2323+.powered {
2324+ font-size: x-small;
2325+ text-align: center;
2326+}
2327+
2328+div a:link {
2329+ text-decoration: none;
2330+ color: #993300; }
2331+
2332+div a:visited {
2333+ text-decoration: none;
2334+ color: #660000;}
2335+
2336+div a:hover {
2337+ text-decoration: underline;
2338+ color: #cc0000;}
2339+
2340+div a:active {
2341+ text-decoration: none;
2342+ color: #cc0000;}
2343+
2344+/* content style */
2345+div p {
2346+ margin: 15px;
2347+}
2348+
2349+h1, h2, h3, h4, h5, h6 {
2350+ color: #333;
2351+ margin: 0 10% 0 0;
2352+ padding: 0 10px;
2353+ border-bottom: 1px solid #666;
2354+ text-decoration: none;
2355+}
2356+
2357+li {
2358+ color: black;
2359+ margin-bottom: 0.2em;
2360+ margin-right: 5%;
2361+}
2362+
2363+ul {
2364+ color: black;
2365+}
2366+
2367+/* this reverses the 2nd and 3rd level list item bullets */
2368+ul>li>ul {list-style-type: square;}
2369+ul>li>ul>li>ul {list-style-type: circle;}
2370+
2371+/* latex style list item */
2372+ol li ol li { list-style-type: lower-alpha; }
2373+ol li ol li ol li { list-style-type: lower-roman; }
2374+
2375+blockquote pre {
2376+ font-family: courier, "courier new", monaco, monospace;
2377+ color: #000;
2378+ background: #f0f0f0;
2379+ margin: 0.5em;
2380+}
2381+
2382+code, pre, tt {
2383+ font-family: courier, "courier new", monaco, monospace;
2384+ color:#333333;
2385+}
2386+
2387+div#content div.blog div.upper-nav {
2388+ display: inline;
2389+}
2390+
2391+a.empty:before {
2392+ vertical-align: top;
2393+ font-size: xx-small;
2394+ content: '?'
2395+}
2396+
2397+a.empty:after {
2398+ vertical-align: top;
2399+ font-size: xx-small;
2400+ content: '?'
2401+}
2402+a.private {color: black}
2403+
2404+a {text-decoration: none}
2405+a:link {color: #d64}
2406+a:visited {color: #864}
2407+a:hover {text-decoration: underline}
2408+a:active {text-decoration: underline}
2409+a.empty {color: gray}
2410+a.private {color: black}
2411+
2412+.error {color: #f00;}
2413+
2414+pre {
2415+ font-family: monospace;
2416+ font-size: 13px;
2417+ color: #EEE;
2418+ background-color: #333;
2419+ border: 1px dashed #EEE;
2420+ padding: 2px;
2421+ padding-left: 10px;
2422+ margin-left: 30px;
2423+ margin-right: 75px;
2424+}
2425+
2426+del {
2427+ text-decoration: none;
2428+ background-color: yellow;
2429+ color: blue;
2430+}
2431+ins {
2432+ text-decoration: none;
2433+ background-color: lightgreen;
2434+ color: blue;
2435+}
2436+
2437+.title,
2438+.side,
2439+.sidetitle {
2440+ font-size: large;
2441+}
2442+
2443+.description,
2444+.blogbody,
2445+.date,
2446+.comments-body,
2447+.comments-post,
2448+.comments-head {
2449+ font-size: medium;
2450+}
2451+
2452+.posted {
2453+ font-size: small;
2454+}
2455+
2456+.syndicate,
2457+.powered {
2458+ font-size: x-small;
2459+}
2460+
2461+table.changes {
2462+ width: 100%;
2463+ table-layout: fixed;
2464+} /* fix width of table from RecentChange page */
2465+
2466+table.changes td.page-id {
2467+} /* do nothing to "Page-ID" cell from RecentChange table */
2468+
2469+table.changes td.edit-by {
2470+ text-align: right;
2471+} /* make "Edit-By" cell from RecentChange table align to right */
2472+
2473+table.changes td.edit-time {
2474+ font-size: x-small;
2475+} /* decrease font size of "Edit-Time" cell from RecentChange table */
2476+
2477+div.side a { display: list-item; list-style-type: none }
2478+div.upper-nav { display: none; }
2479+.blog h1 { display: none; }
2480+textarea { width: 100% }
2481+body div#content div.blog div.blogbody h1 { display: inline; }
2482
2483=== added directory 'css/trac'
2484=== added file 'css/trac/browser.css'
2485--- css/trac/browser.css 1970-01-01 00:00:00 +0000
2486+++ css/trac/browser.css 2013-01-26 22:10:25 +0000
2487@@ -0,0 +1,89 @@
2488+@import url(code.css);
2489+@import url(changeset.css);
2490+@import url(text-diff-html.css);
2491+
2492+/* Browser */
2493+h1 { font-size: 16px; letter-spacing: -0.028em; margin: 0; padding: 0 0 .5em }
2494+h1 :link, h1 :visited, h1 .filename { border: none; padding: 0 .2em }
2495+h1 :link, h1 :visited { color: #b00 }
2496+h1 .first:link, h1 .first:visited { color: #998 }
2497+h1 .sep { color: #666; padding: 0 .1em }
2498+
2499+img.icon { vertical-align: middle; }
2500+
2501+#navpath { float: left; }
2502+
2503+#language-selection { float: right; font-size: 10px; }
2504+#language-selection select { font-size: 10px; }
2505+#language-selection input { font-size: 10px; }
2506+
2507+#content { clear: both; }
2508+
2509+#jumprev { float: right; font-size: 10px; margin: 0 0 0 }
2510+#jumprev form { margin: 0 }
2511+#jumprev input { font-size: 10px; margin-right: 0 }
2512+
2513+/* Styles for the directory entries table
2514+ (extends the styles for "table.listing") */
2515+#dirlist { margin-top: 0 }
2516+#dirlist td.rev, #dirlist td.age, #dirlist td.change, #dirlist td.size {
2517+ color: #888;
2518+ white-space: nowrap;
2519+}
2520+#dirlist td.size { text-align: right; }
2521+#dirlist td.name { width: 100% }
2522+#dirlist td.name a, #dirlist td.name span {
2523+ background-position: 0% 50%;
2524+ background-repeat: no-repeat;
2525+ padding-left: 20px;
2526+}
2527+#dirlist td.name a.parent { background-image: url(parent.png) }
2528+#dirlist td.name a.dir { background-image: url(folder.png) }
2529+#dirlist td.name span.dir { background-image: url(folderdeny.png) }
2530+#dirlist td.name a.file { background-image: url(file.png) }
2531+#dirlist td.name span.file { background-image: url(filedeny.png) }
2532+#dirlist td.name a, #dirlist td.rev a { border-bottom: none; display: block }
2533+#dirlist td.change * { font-size: 9px }
2534+
2535+/* Styles for the property list table
2536+ (extends the styles for "table.listing") */
2537+#proplist td.propvalue { width: 100%; }
2538+
2539+/* Styles for the revision log table
2540+ (extends the styles for "table.listing") */
2541+#chglist { margin-top: 0 }
2542+#chglist td.date, #chglist td.diff { white-space: nowrap }
2543+#chglist td.rev, #chglist td.chgset { text-align: center }
2544+#chglist td.rev a, #chglist td.chgset a { border-bottom: none }
2545+#chglist td.summary { width: 100%; }
2546+
2547+/* Styles for the revision info in the file module */
2548+#info {
2549+ background: #f7f7f0;
2550+ border: 1px solid #d7d7d7;
2551+ border-collapse: collapse;
2552+ border-spacing: 0;
2553+ clear: both;
2554+ width: 100%;
2555+}
2556+#info th {
2557+ font-size: 11px;
2558+ font-weight: bold;
2559+ padding: 2px .5em;
2560+ white-space: nowrap;
2561+ vertical-align: top;
2562+}
2563+#info td.message {
2564+ font-size: 11px;
2565+ padding: 2px .5em;
2566+ vertical-align: top;
2567+ width: 100%;
2568+}
2569+#info .message ul { padding: 0; margin: 0 2em }
2570+#info .message p { margin: 0; padding: 0 }
2571+
2572+/* Styles for the HTML preview */
2573+#preview { background: #fff; clear: both; margin: 0 }
2574+#preview .code-block { border-top: 1px solid #999; margin: 0 }
2575+#preview .image-file { overflow: hidden }
2576+#preview .image-file img { max-width: 100% }
2577
2578=== added file 'css/trac/changeset.css'
2579--- css/trac/changeset.css 1970-01-01 00:00:00 +0000
2580+++ css/trac/changeset.css 2013-01-26 22:10:25 +0000
2581@@ -0,0 +1,20 @@
2582+@import url(diff.css);
2583+
2584+/* Changeset overview */
2585+#overview .files { padding-top: 1em }
2586+#overview .files ul { margin: 0; padding: 0 }
2587+#overview .files li { list-style-type: none }
2588+#overview .files li .comment { display: none }
2589+#overview .files li div {
2590+ border: 1px solid #999;
2591+ float: left;
2592+ margin: .2em .5em 0 0;
2593+ overflow: hidden;
2594+ width: .8em; height: .8em;
2595+}
2596+#overview .message { padding: 1em 0 }
2597+#overview dd.message p, #overview dd.message ul, #overview dd.message ol {
2598+ margin-bottom: 1em;
2599+ margin-top: 0;
2600+}
2601+#overview .files { padding: 1px 0 }
2602
2603=== added file 'css/trac/code.css'
2604--- css/trac/code.css 1970-01-01 00:00:00 +0000
2605+++ css/trac/code.css 2013-01-26 22:10:25 +0000
2606@@ -0,0 +1,108 @@
2607+.code-block {
2608+ border: 1px dotted #d7d7d7;
2609+ margin: 1em 0;
2610+ padding: .3em;
2611+ overflow: auto
2612+}
2613+.image-file { background: #eee; padding: .3em }
2614+.image-file img { }
2615+
2616+/* Default */
2617+.css_default, .c_default, .code_default, .pl_default, .p_default,
2618+.hphp_default, .yaml_default, .code-block span {
2619+ font-family: monospace;
2620+}
2621+
2622+/* Comments */
2623+.code-comment, .css_comment, .c_comment, .c_commentdoc, .c_commentline,
2624+.c_commentlinedoc, .h_comment,.pl_commentline, .p_commentblock,
2625+.p_commentline, .hphp_commentblock, .hphp_commentline,
2626+.yaml_comment {
2627+ color: #998;
2628+ font-style: italic;
2629+}
2630+
2631+/* Language keyword */
2632+.code-keyword, .pl_word { color: #789; font-weight: bold }
2633+
2634+/* Type */
2635+.code-type, .c_word, .c_word2, .p_classname, .hphp_classname{
2636+ color: #468;
2637+ font-weight: bold;
2638+}
2639+
2640+/* Function */
2641+.code-func, .p_defname {
2642+ color: #900;
2643+ font-weight: bold;
2644+ border-bottom: none;
2645+}
2646+
2647+/* Pre-processor */
2648+.code-prep, .c_preprocessor, .pl_preprocessor, .yaml_identifier {
2649+ color: #999;
2650+ font-weight: bold;
2651+}
2652+
2653+/* Language construct */
2654+.code-lang, .p_word { color: #000; font-weight: bold }
2655+
2656+/* String */
2657+.code-string, .c_string, .c_stringeol, .css_doublestring, .css_singlestring,
2658+.h_singlestring, .h_doublestring, .pl_string, .pl_string_q, .pl_string_qq,
2659+.pl_string_qr, .pl_string_qw, .pl_string_qx, .pl_backticks, .pl_character,
2660+.p_string, .p_stringeol, .hphp_string, .hphp_stringeol, .hphp_triple,
2661+.hphp_tripledouble, .p_character, .p_triple, .p_tripledouble {
2662+ color: #b84;
2663+ font-weight: normal;
2664+}
2665+
2666+/* Variable name */
2667+.code-var { color: #f9f }
2668+
2669+/* SilverCity-specific styles */
2670+.css_id, .css_class, .css_pseudoclass, .css_tag { color: #900000 }
2671+.css_directive { color: #009000; font-weight: bold }
2672+.css_important { color: blue }
2673+.css_operator { color: #000090; font-weight: bold }
2674+.css_tag { font-weight: bold }
2675+.css_unknown_identifier, .css_unknown_pseudoclass { color: red }
2676+.css_value { color: navy }
2677+.c_commentdockeyword { color: navy; font-weight: bold }
2678+.c_commentdockeyworderror { color: red; font-weight: bold }
2679+.c_character, .c_regex, .c_uuid, .c_verbatim { color: olive }
2680+.c_number { color: #099 }
2681+.h_asp { color: #ff0 }
2682+.h_aspat { color: #ffdf00 }
2683+.h_attribute { color: teal }
2684+.h_attributeunknown { color: red }
2685+.h_cdata { color: #ffdf00 }
2686+.h_entity { color: purple }
2687+.h_number { color: #099 }
2688+.h_other { color: purple }
2689+.h_script, .h_tag, .h_tagend { color: navy }
2690+.h_tagunknown { color: red }
2691+.h_xmlend, .h_xmlstart { color: blue }
2692+.pl_datasection { color: olive }
2693+.pl_error { color: red; font-weight: bold }
2694+.pl_hash { color: #000 }
2695+.pl_here_delim, .pl_here_q, .pl_here_qq, .pl_here_qx, .pl_longquote { color: olive }
2696+.pl_number { color: #099 }
2697+.pl_pod { font-style: italic }
2698+.pl_regex, .pl_regsubst { color: olive }
2699+.p_number { color: #099 }
2700+.hphp_character { color: olive }
2701+.hphp_defname { color: #099; font-weight: bold }
2702+.hphp_number { color: #099 }
2703+.hphp_word { color: navy; font-weight: bold }
2704+.yaml_document { color: gray; font-style: italic }
2705+.yaml_keyword { color: #808 }
2706+.yaml_number { color: #800 }
2707+.yaml_reference { color: #088 }
2708+.v_comment { color: gray; font-style: italic }
2709+.v_commentline, .v_commentlinebang { color: red; font-style: italic }
2710+.v_number, .v_preprocessor { color: #099 }
2711+.v_string, .v_stringeol { color: olive }
2712+.v_user{ color: blue; font-weight: bold }
2713+.v_word, .v_word3 { color: navy; font-weight: bold }
2714+.v_word2 { color: green; font-weight: bold }
2715
2716=== added file 'css/trac/diff.css'
2717--- css/trac/diff.css 1970-01-01 00:00:00 +0000
2718+++ css/trac/diff.css 2013-01-26 22:10:25 +0000
2719@@ -0,0 +1,153 @@
2720+/* Diff preferences */
2721+#prefs fieldset { margin: 1em .5em .5em; padding: .5em 1em 0 }
2722+
2723+/* Diff/change overview */
2724+#overview {
2725+ line-height: 130%;
2726+ margin-top: 1em;
2727+ padding: .5em;
2728+}
2729+#overview dt {
2730+ font-weight: bold;
2731+ padding-right: .25em;
2732+ position: absolute;
2733+ left: 0;
2734+ text-align: right;
2735+ width: 7.75em;
2736+}
2737+#overview dd { margin-left: 8em }
2738+
2739+/* Colors for change types */
2740+#overview .mod, .diff #legend .mod { background: #fd8 }
2741+#overview .rem, .diff #legend .rem { background: #f88 }
2742+#overview .add, .diff #legend .add { background: #dfd }
2743+
2744+/* Legend for diff colors */
2745+.diff #legend {
2746+ float: left;
2747+ font-size: 9px;
2748+ line-height: 1em;
2749+ margin: 1em 0;
2750+ padding: .5em;
2751+}
2752+.diff #legend h3 { display: none; }
2753+.diff #legend dt {
2754+ background: #fff;
2755+ border: 1px solid #999;
2756+ float: left;
2757+ margin: .1em .5em .1em 2em;
2758+ overflow: hidden;
2759+ width: .8em; height: .8em;
2760+}
2761+.diff #legend dl, .diff #legend dd {
2762+ display: inline;
2763+ float: left;
2764+ padding: 0;
2765+ margin: 0;
2766+ margin-right: .5em;
2767+}
2768+
2769+/* Styles for the list of diffs */
2770+.diff ul { clear: both; margin: 0; padding: 0 }
2771+.diff li {
2772+ background: #f7f7f7;
2773+ border: 1px solid #d7d7d7;
2774+ list-style-type: none;
2775+ margin: 0 0 2em;
2776+ padding: 2px;
2777+ position: relative;
2778+}
2779+.diff h2 {
2780+ color: #333;
2781+ font-size: 14px;
2782+ letter-spacing: normal;
2783+ margin: 0 auto;
2784+ padding: .1em 0 .25em;
2785+ text-align: center;
2786+}
2787+
2788+/* Styles for the actual diff tables (side-by-side and inline) */
2789+.diff table {
2790+ border: 1px solid #ddd;
2791+ border-spacing: 0;
2792+ border-top: 0;
2793+ empty-cells: show;
2794+ font-size: 12px;
2795+ line-height: 130%;
2796+ padding: 0;
2797+ margin: 0 auto;
2798+ table-layout: fixed;
2799+ width: 100%;
2800+}
2801+.diff table col.lineno { width: 4em }
2802+.diff table th {
2803+ border-right: 1px solid #d7d7d7;
2804+ border-bottom: 1px solid #998;
2805+ font-size: 11px;
2806+}
2807+.diff table thead th {
2808+ background: #eee;
2809+ border-top: 1px solid #d7d7d7;
2810+ color: #999;
2811+ padding: 0 .25em;
2812+ text-align: center;
2813+ white-space: nowrap;
2814+}
2815+.diff table tbody th {
2816+ background: #eed;
2817+ color: #886;
2818+ font-weight: normal;
2819+ padding: 0 .5em;
2820+ text-align: right;
2821+ vertical-align: top;
2822+}
2823+.diff table tbody td {
2824+ background: #fff;
2825+ font: normal 11px monospace;
2826+ overflow: hidden;
2827+ padding: 1px 2px;
2828+ vertical-align: top;
2829+}
2830+.diff table tbody.skippedlines td {
2831+ background: #f7f7f7;
2832+ border: 1px solid #d7d7d7;
2833+}
2834+.diff table td del, .diff table td ins { text-decoration: none }
2835+.diff table td del { color: #600 }
2836+.diff table td ins { color: #060 }
2837+
2838+/* Styles for the inline diff */
2839+.diff table.inline tbody.mod td.base, .diff table.inline tbody.rem td.base {
2840+ background: #fdd;
2841+ border-color: #c00;
2842+ border-style: solid;
2843+ border-width: 0 1px 0 1px;
2844+}
2845+.diff table.inline tbody.mod td.chg, .diff table.inline tbody.add td.chg {
2846+ background: #dfd;
2847+ border-color: #0a0;
2848+ border-style: solid;
2849+ border-width: 0 1px 0 1px;
2850+}
2851+.diff table.inline tbody.mod tr.first td.base,
2852+.diff table.inline tbody.rem tr.first td.base { border-top-width: 1px }
2853+.diff table.inline tbody.mod tr.last td.base,
2854+.diff table.inline tbody.rem tr.last td.base { border-bottom-width: 1px }
2855+.diff table.inline tbody.mod tr.first td.chg,
2856+.diff table.inline tbody.add tr.first td.chg { border-top-width: 1px }
2857+.diff table.inline tbody.mod tr.last td.chg,
2858+.diff table.inline tbody.add tr.last td.chg { border-bottom-width: 1px }
2859+.diff table.inline tbody.mod td del { background: #e99; color: #000 }
2860+.diff table.inline tbody.mod td ins { background: #9e9; color: #000 }
2861+
2862+/* Styles for the side-by-side diff */
2863+.diff table.sidebyside colgroup.content { width: 50% }
2864+.diff table.sidebyside tbody.mod td.base { background: #fe9 }
2865+.diff table.sidebyside tbody.mod td.chg { background: #fd8 }
2866+.diff table.sidebyside tbody.add td.base { background: #dfd }
2867+.diff table.sidebyside tbody.add td.chg { background: #cfc }
2868+.diff table.sidebyside tbody.rem td.base { background: #f88 }
2869+.diff table.sidebyside tbody.rem td.chg { background: #faa }
2870+.diff table.sidebyside tbody.mod del, .diff table.sidebyside tbody.mod ins {
2871+ background: #fc0;
2872+}
2873
2874=== added file 'css/trac/feed-icon-16x16.png'
2875Binary files css/trac/feed-icon-16x16.png 1970-01-01 00:00:00 +0000 and css/trac/feed-icon-16x16.png 2013-01-26 22:10:25 +0000 differ
2876=== added file 'css/trac/file.png'
2877Binary files css/trac/file.png 1970-01-01 00:00:00 +0000 and css/trac/file.png 2013-01-26 22:10:25 +0000 differ
2878=== added file 'css/trac/filedeny.png'
2879Binary files css/trac/filedeny.png 1970-01-01 00:00:00 +0000 and css/trac/filedeny.png 2013-01-26 22:10:25 +0000 differ
2880=== added file 'css/trac/folder.png'
2881Binary files css/trac/folder.png 1970-01-01 00:00:00 +0000 and css/trac/folder.png 2013-01-26 22:10:25 +0000 differ
2882=== added file 'css/trac/folderdeny.png'
2883Binary files css/trac/folderdeny.png 1970-01-01 00:00:00 +0000 and css/trac/folderdeny.png 2013-01-26 22:10:25 +0000 differ
2884=== added file 'css/trac/parent.png'
2885Binary files css/trac/parent.png 1970-01-01 00:00:00 +0000 and css/trac/parent.png 2013-01-26 22:10:25 +0000 differ
2886=== added file 'css/trac/svnweb.css'
2887--- css/trac/svnweb.css 1970-01-01 00:00:00 +0000
2888+++ css/trac/svnweb.css 2013-01-26 22:10:25 +0000
2889@@ -0,0 +1,24 @@
2890+@import url(trac.css);
2891+@import url(browser.css);
2892+
2893+/* _action_bar template formatting */
2894+div.actions {
2895+ margin-bottom: 1em;
2896+}
2897+
2898+div.actions ul {
2899+ margin-left: 0;
2900+ padding-left: 0;
2901+ display: inline;
2902+}
2903+
2904+div.actions ul li {
2905+ padding: 0.5em;
2906+ list-style: none;
2907+ display: inline;
2908+}
2909+
2910+.reponame {
2911+ color: #888;
2912+ font-size: 9px;
2913+}
2914
2915=== added file 'css/trac/text-diff-html.css'
2916--- css/trac/text-diff-html.css 1970-01-01 00:00:00 +0000
2917+++ css/trac/text-diff-html.css 2013-01-26 22:10:25 +0000
2918@@ -0,0 +1,32 @@
2919+.file span {
2920+ display: block;
2921+}
2922+.file .fileheader, .file .hunkheader {
2923+ color: #888;
2924+}
2925+.file .hunk {
2926+ font-family: monospace;
2927+ white-space: pre;
2928+}
2929+.file .hunk .ctx {
2930+ background: #fff;
2931+}
2932+.file .hunk .ins {
2933+ background: #dfd;
2934+ text-decoration: none;
2935+ display: block;
2936+}
2937+.file .hunk .del {
2938+ background: #fdd;
2939+ text-decoration: none;
2940+ display: block;
2941+}
2942+.ins {
2943+ border: 1px solid #0c0;
2944+}
2945+.del {
2946+ border: 1px solid #c00;
2947+}
2948+span.diff-leader {
2949+ display: none;
2950+}
2951
2952=== added file 'css/trac/trac.css'
2953--- css/trac/trac.css 1970-01-01 00:00:00 +0000
2954+++ css/trac/trac.css 2013-01-26 22:10:25 +0000
2955@@ -0,0 +1,360 @@
2956+/* Trac CSS */
2957+body {
2958+ background: #fff;
2959+ color: #000;
2960+ margin: 10px;
2961+}
2962+body, th, td {
2963+ font: normal 13px verdana,arial,'Bitstream Vera Sans',helvetica,sans-serif;
2964+}
2965+h1, h2, h3, h4 {
2966+ font-family: arial,verdana,'Bitstream Vera Sans',helvetica,sans-serif;
2967+ font-weight: bold;
2968+ letter-spacing: -0.018em;
2969+}
2970+h1 { font-size: 19px; margin: .15em 1em 0 0 }
2971+h2 { font-size: 16px }
2972+h3 { font-size: 14px }
2973+hr { border: none; border-top: 1px solid #ccb; margin: 2em 0 }
2974+address { font-style: normal }
2975+img { border: none }
2976+
2977+.underline { text-decoration: underline; }
2978+ol.loweralpha { list-style-type: lower-alpha }
2979+ol.upperalpha { list-style-type: upper-alpha }
2980+ol.lowerroman { list-style-type: lower-roman }
2981+ol.upperroman { list-style-type: upper-roman }
2982+ol.arabic { list-style-type: decimal }
2983+
2984+/* Link styles */
2985+:link, :visited {
2986+ text-decoration: none;
2987+ color: #b00;
2988+ border-bottom: 1px dotted #bbb;
2989+}
2990+:link:hover, :visited:hover {
2991+ background-color: #eee;
2992+ color: #555;
2993+}
2994+h1 :link, h1 :visited ,h2 :link, h2 :visited, h3 :link, h3 :visited,
2995+h4 :link, h4 :visited, h5 :link, h5 :visited, h6 :link, h6 :visited {
2996+ color: inherit;
2997+}
2998+
2999+.ext-link { background: no-repeat 0 58%; padding-left: 16px }
3000+* html .ext-link { background-position: 0 .35em } /* IE hack, see #937 */
3001+
3002+/* Forms */
3003+input, textarea, select { margin: 2px }
3004+input, select { vertical-align: middle }
3005+input[type=submit], input[type=reset] {
3006+ background: #eee;
3007+ color: #222;
3008+ border: 1px outset #ccc;
3009+ padding: .1em .5em;
3010+}
3011+input[type=submit]:hover, input[type=reset]:hover { background: #ccb }
3012+input[type=text], input.textwidget, textarea {
3013+ background: #fff;
3014+ color: #000;
3015+ border: 1px solid #d7d7d7;
3016+}
3017+input[type=text], input.textwidget { padding: .25em .5em }
3018+input[type=text]:focus, textarea:focus { border: 1px solid #886 }
3019+option { border-bottom: 1px dotted #d7d7d7 }
3020+fieldset { border: 1px solid #d7d7d7; padding: .5em; margin: 0 }
3021+fieldset.iefix { border: none; padding: 0; margin: 0 }
3022+* html fieldset.iefix { width: 98% }
3023+fieldset.iefix p { margin: 0 }
3024+legend { color: #999; padding: 0 .25em; font-size: 90%; font-weight: bold }
3025+label.disabled { color: #d7d7d7 }
3026+.buttons { margin: .5em .5em .5em 0 }
3027+.buttons form, .buttons form div { display: inline }
3028+.buttons input { margin: 1em .5em .1em 0 }
3029+
3030+/* Header */
3031+#header hr { display: none }
3032+#header img { border: none; margin: 0 0 -3em }
3033+#header :link, #header :visited, #header :link:hover, #header :visited:hover {
3034+ background: transparent;
3035+ margin-bottom: 2px;
3036+ border: none;
3037+}
3038+
3039+/* Quick search */
3040+#search {
3041+ clear: both;
3042+ font-size: 10px;
3043+ height: 2.2em;
3044+ margin: 0 0 1em;
3045+ text-align: right;
3046+}
3047+#search input { font-size: 10px }
3048+#search label { display: none }
3049+
3050+/* Navigation */
3051+.nav h2, .nav hr { display: none }
3052+.nav ul { font-size: 10px; list-style: none; margin: 0; text-align: right }
3053+.nav li {
3054+ border-right: 1px solid #d7d7d7;
3055+ display: inline;
3056+ padding: 0 .75em;
3057+ white-space: nowrap;
3058+}
3059+.nav li.last { border-right: none }
3060+
3061+/* Main navigation bar */
3062+#mainnav {
3063+ background: #f7f7f7 0 0;
3064+ border: 1px solid #000;
3065+ font: normal 10px verdana,'Bitstream Vera Sans',helvetica,arial,sans-serif;
3066+ margin: .66em 0 .33em;
3067+ padding: .2em 0;
3068+}
3069+#mainnav li { border-right: none; padding: .25em 0 }
3070+#mainnav :link, #mainnav :visited {
3071+ background: 0 0 no-repeat;
3072+ border-right: 1px solid #fff;
3073+ border-bottom: none;
3074+ border-left: 1px solid #555;
3075+ color: #000;
3076+ padding: .2em 20px;
3077+}
3078+* html #mainnav :link, * html #mainnav :visited { background-position: 1px 0 }
3079+#mainnav :link:hover, #mainnav :visited:hover {
3080+ background-color: #ccc;
3081+ border-right: 1px solid #ddd;
3082+}
3083+#mainnav .active:link, #mainnav .active:visited {
3084+ background: #333 0 0 repeat-x;
3085+ border-top: none;
3086+ border-right: 1px solid #000;
3087+ color: #eee;
3088+ font-weight: bold;
3089+}
3090+#mainnav .active:link:hover, #mainnav .active:visited:hover {
3091+ border-right: 1px solid #000;
3092+}
3093+
3094+/* Context-dependent navigation links */
3095+#ctxtnav { height: 1em }
3096+#ctxtnav li ul {
3097+ background: #f7f7f7;
3098+ color: #ccc;
3099+ border: 1px solid;
3100+ padding: 0;
3101+ display: inline;
3102+ margin: 0;
3103+}
3104+#ctxtnav li li { padding: 0; }
3105+#ctxtnav li li :link, #ctxtnav li li :visited { padding: 0 1em }
3106+#ctxtnav li li :link:hover, #ctxtnav li li :visited:hover {
3107+ background: #bba;
3108+ color: #fff;
3109+}
3110+
3111+/* Alternate links */
3112+#altlinks { clear: both; text-align: center }
3113+#altlinks h3 { font-size: 12px; letter-spacing: normal; margin: 0 }
3114+#altlinks ul { list-style: none; margin: 0; padding: 0 0 1em }
3115+#altlinks li {
3116+ border-right: 1px solid #d7d7d7;
3117+ display: inline;
3118+ font-size: 11px;
3119+ line-height: 16px;
3120+ padding: 0 1em;
3121+ white-space: nowrap;
3122+}
3123+#altlinks li.last { border-right: none }
3124+#altlinks li :link, #altlinks li :visited {
3125+ background-position: 0 -1px;
3126+ background-repeat: no-repeat;
3127+ border: none;
3128+}
3129+#altlinks li a.ics { padding-left: 22px }
3130+#altlinks li a.rss { padding-left: 42px }
3131+
3132+/* Footer */
3133+#footer {
3134+ clear: both;
3135+ color: #bbb;
3136+ font-size: 10px;
3137+ border-top: 1px solid;
3138+ height: 31px;
3139+ padding: .25em 0;
3140+}
3141+#footer :link, #footer :visited { color: #bbb; }
3142+#footer hr { display: none }
3143+#footer #tracpowered { border: 0; float: left }
3144+#footer #tracpowered:hover { background: transparent }
3145+#footer p { margin: 0 }
3146+#footer p.left {
3147+ float: left;
3148+ margin-left: 1em;
3149+ padding: 0 1em;
3150+ border-left: 1px solid #d7d7d7;
3151+ border-right: 1px solid #d7d7d7;
3152+}
3153+#footer p.right {
3154+ float: right;
3155+ text-align: right;
3156+}
3157+
3158+#content { padding-bottom: 2em; position: relative }
3159+
3160+#help {
3161+ clear: both;
3162+ color: #999;
3163+ font-size: 90%;
3164+ margin: 1em;
3165+ text-align: right;
3166+}
3167+#help :link, #help :visited { cursor: help }
3168+#help hr { display: none }
3169+
3170+/* Page preferences form */
3171+#prefs {
3172+ background: #f7f7f0;
3173+ border: 1px outset #998;
3174+ float: right;
3175+ font-size: 9px;
3176+ padding: .8em;
3177+ position: relative;
3178+ margin: 0 1em 1em;
3179+}
3180+* html #prefs { width: 26em } /* Set width only for IE */
3181+#prefs input, #prefs select { font-size: 9px; vertical-align: middle }
3182+#prefs fieldset { border: none; margin: .5em; padding: 0 }
3183+#prefs fieldset legend {
3184+ background: transparent;
3185+ color: #000;
3186+ font-size: 9px;
3187+ font-weight: normal;
3188+ margin: 0 0 0 -1.5em;
3189+ padding: 0;
3190+}
3191+#prefs .buttons { text-align: right }
3192+
3193+/* Wiki */
3194+a.missing:link,a.missing:visited { background: #fafaf0; color: #998 }
3195+a.missing:hover { color: #000; }
3196+
3197+#content.wiki { line-height: 140% }
3198+.wikitoolbar {
3199+ border: solid #d7d7d7;
3200+ border-width: 1px 1px 1px 0;
3201+ float: left;
3202+ height: 18px;
3203+}
3204+.wikitoolbar :link, .wikitoolbar :visited {
3205+ background: transparent no-repeat;
3206+ border: 1px solid #fff;
3207+ border-left-color: #d7d7d7;
3208+ cursor: default;
3209+ display: block;
3210+ float: left;
3211+ width: 24px;
3212+ height: 16px;
3213+}
3214+.wikitoolbar :link:hover, .wikitoolbar :visited:hover {
3215+ background-color: transparent;
3216+ border: 1px solid #fb2;
3217+}
3218+.wikitoolbar a#em { background-position: 0 0 }
3219+.wikitoolbar a#strong { background-position: 0 -16px }
3220+.wikitoolbar a#heading { background-position: 0 -32px }
3221+.wikitoolbar a#link { background-position: 0 -48px }
3222+.wikitoolbar a#code { background-position: 0 -64px }
3223+.wikitoolbar a#hr { background-position: 0 -80px }
3224+
3225+/* Styles for the form for adding attachments. */
3226+#attachment .field { margin-top: 1.3em }
3227+#attachment label { padding-left: .2em }
3228+#attachment fieldset { margin-top: 2em }
3229+#attachment fieldset .field { float: left; margin: 0 1em .5em 0 }
3230+#attachment br { clear: left }
3231+
3232+/* Styles for tabular listings such as those used for displaying directory
3233+ contents and report results. */
3234+table.listing {
3235+ clear: both;
3236+ border-bottom: 1px solid #d7d7d7;
3237+ border-collapse: collapse;
3238+ border-spacing: 0;
3239+ margin-top: 1em;
3240+ width: 100%;
3241+}
3242+table.listing th { text-align: left; padding: 0 1em .1em 0; font-size: 12px }
3243+table.listing thead { background: #f7f7f0 }
3244+table.listing thead th {
3245+ border: 1px solid #d7d7d7;
3246+ border-bottom-color: #999;
3247+ font-size: 11px;
3248+ font-weight: bold;
3249+ padding: 2px .5em;
3250+ vertical-align: bottom;
3251+}
3252+table.listing thead th :link:hover, table.listing thead th :visited:hover {
3253+ background-color: transparent;
3254+}
3255+table.listing thead th a { border: none; padding-right: 12px }
3256+table.listing th.asc a, table.listing th.desc a { font-weight: bold }
3257+table.listing th.asc a, table.listing th.desc a {
3258+ background-position: 100% 50%;
3259+ background-repeat: no-repeat;
3260+}
3261+table.listing th.asc a { }
3262+table.listing th.desc a { }
3263+table.listing tbody td, table.listing tbody th {
3264+ border: 1px dotted #ddd;
3265+ padding: .33em .5em;
3266+ vertical-align: top;
3267+}
3268+table.listing tbody td a:hover, table.listing tbody th a:hover {
3269+ background-color: transparent;
3270+}
3271+table.listing tbody tr { border-top: 1px solid #ddd }
3272+table.listing tbody tr.even { background-color: #fcfcfc }
3273+table.listing tbody tr.odd { background-color: #f7f7f7 }
3274+table.listing tbody tr:hover { background: #eed !important }
3275+
3276+.wikipage p { margin-left: 1em }
3277+pre.wiki, pre.literal-block {
3278+ background: #f7f7f7;
3279+ border: 1px solid #d7d7d7;
3280+ margin: 1em 1.75em;
3281+ padding: .25em;
3282+ overflow: auto;
3283+}
3284+table.wiki {
3285+ border: 2px solid #ccc;
3286+ border-collapse: collapse;
3287+ border-spacing: 0;
3288+}
3289+table.wiki td { border: 1px solid #ccc; padding: .1em .25em; }
3290+
3291+/* Styles for the error page (and rst errors) */
3292+#content.error .message, div.system-message {
3293+ background: #fdc;
3294+ border: 2px solid #d00;
3295+ color: #500;
3296+ padding: .5em;
3297+ margin: 1em 0;
3298+}
3299+#content.error pre, div.system-message pre { margin-left: 1em; overflow: auto }
3300+div.system-message p { margin: 0; }
3301+div.system-message p.system-message-title { font-weight: bold; }
3302+
3303+/* Styles for search word highlighting */
3304+@media screen {
3305+ .searchword0 { background: #ff9 }
3306+ .searchword1 { background: #cfc }
3307+ .searchword2 { background: #cff }
3308+ .searchword3 { background: #ccf }
3309+ .searchword4 { background: #fcf }
3310+}
3311+
3312+@media print {
3313+ #header, #altlinks, #footer { display: none }
3314+ .nav, form, .buttons form { display: none }
3315+}
3316
3317=== modified file 'debian/changelog'
3318--- debian/changelog 2012-06-11 23:29:21 +0000
3319+++ debian/changelog 2013-01-26 22:10:25 +0000
3320@@ -1,3 +1,18 @@
3321+libsvn-web-perl (0.63-1ubuntu1) raring; urgency=low
3322+
3323+ * debian/rules: Resolve FTBFS, explictly run tests with UTF-8 encoding.
3324+
3325+ -- Allison Randal <allison@ubuntu.com> Sat, 26 Jan 2013 13:53:36 -0800
3326+
3327+libsvn-web-perl (0.63-1) unstable; urgency=low
3328+
3329+ * New Upstream version
3330+ * Updated dependencies
3331+ * Switched to Debhelper 8
3332+ * Set locale for running tests
3333+
3334+ -- Hilko Bengen <bengen@debian.org> Mon, 22 Oct 2012 21:08:14 +0200
3335+
3336 libsvn-web-perl (0.53-4) unstable; urgency=low
3337
3338 * Adopted package after mail exchange with David Moreno.
3339
3340=== modified file 'debian/compat'
3341--- debian/compat 2007-11-30 14:01:12 +0000
3342+++ debian/compat 2013-01-26 22:10:25 +0000
3343@@ -1,1 +1,1 @@
3344-5
3345+8
3346
3347=== modified file 'debian/control'
3348--- debian/control 2012-06-11 23:29:21 +0000
3349+++ debian/control 2013-01-26 22:10:25 +0000
3350@@ -1,16 +1,19 @@
3351 Source: libsvn-web-perl
3352 Section: perl
3353 Priority: optional
3354-Build-Depends: debhelper (>= 5.0.0),
3355+Build-Depends: debhelper (>= 8.1.3~),
3356 libexception-class-perl,
3357 liblocale-maketext-lexicon-perl,
3358 libmodule-build-perl,
3359+ libplack-perl,
3360 libsvn-perl,
3361 libtemplate-perl,
3362+ libtemplate-plugin-number-format-perl,
3363 libtest-www-mechanize-perl,
3364 subversion,
3365 Build-Depends-Indep: perl
3366-Maintainer: Hilko Bengen <bengen@debian.org>
3367+Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
3368+XSBC-Original-Maintainer: Hilko Bengen <bengen@debian.org>
3369 Standards-Version: 3.9.3
3370 Homepage: http://search.cpan.org/dist/SVN-Web/
3371
3372@@ -21,6 +24,7 @@
3373 libhtml-parser-perl,
3374 libhttp-server-simple-perl,
3375 liblocale-maketext-lexicon-perl,
3376+ libplack-perl,
3377 libsvn-perl,
3378 libtemplate-perl,
3379 libtemplate-plugin-number-format-perl,
3380
3381=== added file 'debian/docs'
3382--- debian/docs 1970-01-01 00:00:00 +0000
3383+++ debian/docs 2013-01-26 22:10:25 +0000
3384@@ -0,0 +1,2 @@
3385+README
3386+TODO
3387
3388=== modified file 'debian/rules'
3389--- debian/rules 2012-06-11 23:29:21 +0000
3390+++ debian/rules 2013-01-26 22:10:25 +0000
3391@@ -1,79 +1,7 @@
3392 #!/usr/bin/make -f
3393-# This debian/rules file is provided as a template for normal perl
3394-# packages. It was created by Marc Brockschmidt <marc@dch-faq.de> for
3395-# the Debian Perl Group (http://pkg-perl.alioth.debian.org/) but may
3396-# be used freely wherever it is useful.
3397-#
3398-# It was later modified by Jason Kohles <email@jasonkohles.com>
3399-# http://www.jasonkohles.com/ to support Module::Build installed modules
3400-
3401-# Uncomment this to turn on verbose mode.
3402-export DH_VERBOSE=1
3403-
3404-# If set to a true value then MakeMaker's prompt function will
3405-# always return the default without waiting for user input.
3406-export PERL_MM_USE_DEFAULT=1
3407-
3408-PACKAGE=$(shell dh_listpackages)
3409-
3410-ifndef PERL
3411-PERL = /usr/bin/perl
3412-endif
3413-
3414-TMP =$(CURDIR)/debian/$(PACKAGE)
3415-
3416-build: build-arch build-indep
3417-build-arch: build-stamp
3418-build-indep: build-stamp
3419-build-stamp:
3420- dh_testdir
3421-
3422- # Add commands to compile the package here
3423- $(PERL) Build.PL installdirs=vendor
3424- $(PERL) Build
3425-# $(PERL) Build test
3426-
3427- touch build-stamp
3428-
3429-clean:
3430- dh_testdir
3431- dh_testroot
3432-
3433- dh_clean build-stamp install-stamp
3434-
3435- # Add commands to clean up after the build process here
3436- [ ! -f Build ] || $(PERL) Build distclean
3437-
3438-install: build install-stamp
3439-install-stamp:
3440- dh_testdir
3441- dh_testroot
3442- dh_clean -k
3443-
3444- # Add commands to install the package into debian/$PACKAGE_NAME here
3445- $(PERL) Build install destdir=$(TMP) create_packlist=0
3446-
3447- touch install-stamp
3448-
3449-binary-arch:
3450-# We have nothing to do here for an architecture-independent package
3451-
3452-binary-indep: build install
3453- dh_testdir
3454- dh_testroot
3455- dh_installdocs README TODO
3456- dh_installexamples
3457- dh_installchangelogs
3458- dh_perl
3459- dh_compress
3460- dh_fixperms
3461- dh_installdeb
3462- dh_gencontrol
3463- dh_md5sums
3464- dh_builddeb
3465-
3466-source diff:
3467- @echo >&2 'source and diff are obsolete - use dpkg-source -b'; false
3468-
3469-binary: binary-indep binary-arch
3470-.PHONY: build clean binary-indep binary-arch binary
3471+
3472+%:
3473+ dh $@
3474+
3475+override_dh_auto_test:
3476+ dh_auto_test -- LC_ALL=C.UTF-8
3477
3478=== added file 'dist.ini'
3479--- dist.ini 1970-01-01 00:00:00 +0000
3480+++ dist.ini 2013-01-26 22:10:25 +0000
3481@@ -0,0 +1,77 @@
3482+name = SVN-Web
3483+version = 0.63
3484+author = Dean Hamstead <dean@fragfest.com.au>
3485+license = Perl_5
3486+copyright_holder = Dean Hamstad
3487+copyright_year = 2012
3488+
3489+[GatherDir]
3490+[MetaYAML]
3491+[MetaJSON]
3492+[MetaTests]
3493+[Manifest]
3494+[ManifestSkip]
3495+[PruneCruft]
3496+[License]
3497+[MakeMaker]
3498+[ExtraTests]
3499+[CPANFile]
3500+[Test::Perl::Critic]
3501+critic_config = t/perlcriticrc
3502+[PodCoverageTests]
3503+[PodSyntaxTests]
3504+[TestRelease]
3505+[ConfirmRelease]
3506+[UploadToCPAN]
3507+[ExecDir]
3508+
3509+[Twitter]
3510+hash_tags = #perl #cpan
3511+
3512+[Prereqs]
3513+Alien::SVN = 0
3514+Carp = 0
3515+Encode = 0
3516+Exception::Class = 1.22
3517+File::Basename = 0
3518+File::Path = 0
3519+File::Spec = 0
3520+File::Temp = 0
3521+FindBin = 0
3522+IO::File = 0
3523+List::Util = 0
3524+Locale::Maketext = 0
3525+Locale::Maketext::Lexicon = 0
3526+POSIX = 0
3527+Plack = 0
3528+Number::Format = 0
3529+Template = 0
3530+Template::Plugin::Number::Format = 0
3531+Time::Zone = 0
3532+URI::Escape = 0
3533+YAML = 0
3534+base = 0
3535+perl = 5.00404
3536+strict = 0
3537+vars = 0
3538+warnings = 0
3539+
3540+
3541+[Prereqs / BuildRequires]
3542+File::Copy = 0
3543+File::Find = 0
3544+
3545+[Prereqs / RuntimeRecommends ]
3546+Cache::Cache = 0
3547+Template::Plugin::Subst = 0
3548+Template::Plugin::Clickable = 0
3549+Template::Plugin::Clickable::Email = 0
3550+Test::Benchmark = 0
3551+Test::HTML::Tidy = 0
3552+XML::RSS::Parser = 0
3553+
3554+[Prereqs / TestRequires]
3555+Cwd = 0
3556+Test::More = 0
3557+Test::WWW::Mechanize = 0
3558+File::Path = 0
3559
3560=== modified file 'lib/SVN/Web.pm'
3561--- lib/SVN/Web.pm 2007-11-30 14:01:12 +0000
3562+++ lib/SVN/Web.pm 2013-01-26 22:10:25 +0000
3563@@ -1,15 +1,17 @@
3564+#!/bin/false
3565 package SVN::Web;
3566
3567 use strict;
3568 use warnings;
3569
3570+use Encode ();
3571 use URI::Escape;
3572 use SVN::Client;
3573 use SVN::Ra;
3574 use YAML ();
3575 use Template;
3576 use File::Spec;
3577-use POSIX ();
3578+use Plack::Request;
3579
3580 use SVN::Web::X;
3581 use FindBin;
3582@@ -21,14 +23,10 @@
3583 # any error messages generated *before* it's overridden are generated
3584 # properly.
3585 SVN::Web::I18N::add_directory(
3586- File::Spec->catdir(substr(__FILE__, 0, -3), 'I18N')
3587-);
3588+ File::Spec->catdir( substr( __FILE__, 0, -3 ), 'I18N' ) );
3589 SVN::Web::I18N::loc_lang('en');
3590
3591-use constant mod_perl_2 =>
3592- (exists $ENV{MOD_PERL_API_VERSION} and $ENV{MOD_PERL_API_VERSION} >= 2);
3593-
3594-our $VERSION = 0.53;
3595+our $VERSION = 0.63;
3596
3597 my $template;
3598 my $config;
3599@@ -43,45 +41,48 @@
3600 }
3601
3602 sub canonicalise_config {
3603+
3604 # Catch missing / incorrect 'version' entries
3605 die "Config file does not define a 'version' key."
3606- unless exists $config->{version} and defined $config->{version};
3607+ unless exists $config->{version} and defined $config->{version};
3608
3609- die "Configuration file version ($config->{version}) does not match SVN::Web version ($VERSION)"
3610- if $config->{version} != $VERSION;
3611+ die
3612+"Configuration file version ($config->{version}) does not match SVN::Web version ($VERSION)"
3613+ if $config->{version} != $VERSION;
3614
3615 # Deal with possibly conflicting 'templatedir' and 'templatedirs' settings.
3616
3617 # If neither of them are set, use 'templatedirs'
3618- if(!exists $config->{templatedir} and !exists $config->{templatedirs}) {
3619- $config->{templatedirs} = [File::Spec->catdir(qw(template trac))];
3620+ if ( !exists $config->{templatedir} and !exists $config->{templatedirs} ) {
3621+ $config->{templatedirs} = [ File::Spec->catdir(qw(template trac)) ];
3622 }
3623
3624 # If 'templatedir' is the only one set, use it.
3625- if(exists $config->{templatedir} and !exists $config->{templatedirs}) {
3626- $config->{templatedirs} = [$config->{templatedir}];
3627+ if ( exists $config->{templatedir} and !exists $config->{templatedirs} ) {
3628+ $config->{templatedirs} = [ $config->{templatedir} ];
3629 delete $config->{templatedir};
3630 }
3631
3632 # If they're both set then throw an error
3633- if(exists $config->{templatedir} and exists $config->{templatedirs}) {
3634+ if ( exists $config->{templatedir} and exists $config->{templatedirs} ) {
3635 die "templatedir and templatedirs both defined in config.yaml";
3636 }
3637
3638 # Handle tt_compile_dir. If it doesn't exist then set it to undef.
3639 # If it does exist, and is defined, append a '.' and the current
3640 # real UID, to help ensure uniqueness.
3641- if(!exists $config->{tt_compile_dir}) {
3642+ unless ( exists $config->{tt_compile_dir} ) {
3643 $config->{tt_compile_dir} = undef; # undef == no compiling
3644- } else {
3645- if(defined $config->{tt_compile_dir}) {
3646+ }
3647+ else {
3648+ if ( defined $config->{tt_compile_dir} ) {
3649 $config->{tt_compile_dir} .= '.' . $<;
3650 }
3651 }
3652
3653 # Handle timedate_format
3654- if(! exists $config->{timedate_format}) {
3655- $config->{timedate_format} = '%Y/%m/%d %H:%M:%S';
3656+ unless ( exists $config->{timedate_format} ) {
3657+ $config->{timedate_format} = '%Y/%m/%d %H:%M:%S';
3658 }
3659
3660 # Set the timezone, if not already specified.
3661@@ -90,15 +91,15 @@
3662 # If cache/opts/directory_umask is configured, and it has a leading
3663 # 0 then ensure it's treated as an octal number.
3664 $config->{cache}{opts}{directory_umask} =
3665- oct($config->{cache}{opts}{directory_umask})
3666- if exists $config->{cache}{opts}{directory_umask}
3667- and $config->{cache}{opts}{directory_umask} =~ /^0/;;
3668+ oct( $config->{cache}{opts}{directory_umask} )
3669+ if exists $config->{cache}{opts}{directory_umask}
3670+ and $config->{cache}{opts}{directory_umask} =~ m/^0/;
3671
3672 # Add any additional language directories
3673- if(defined $config->{language_dirs}) {
3674- foreach my $dir (@{ $config->{language_dirs} }) {
3675- SVN::Web::I18N::add_directory($dir);
3676- }
3677+ if ( defined $config->{language_dirs} ) {
3678+ for my $dir ( @{ $config->{language_dirs} } ) {
3679+ SVN::Web::I18N::add_directory($dir);
3680+ }
3681 }
3682
3683 return;
3684@@ -117,7 +118,7 @@
3685 my $repospool = SVN::Pool->new();
3686
3687 sub get_repos {
3688- my($repos) = @_;
3689+ my $repos = shift;
3690
3691 SVN::Web::X->throw(
3692 error => '(unconfigured repository)',
3693@@ -125,37 +126,46 @@
3694 ) unless exists $config->{repos}{$repos} || $config->{reposparent};
3695
3696 my $repo_uri =
3697- $config->{reposparent}
3698- ? File::Spec->catdir($config->{reposparent}, $repos)
3699- : $config->{repos}{$repos};
3700+ $config->{reposparent}
3701+ ? File::Spec->catdir( $config->{reposparent}, $repos )
3702+ : $config->{repos}{$repos};
3703
3704 SVN::Web::X->throw(
3705 error => '(no such repo %1 %2)',
3706- vars => [$repos, $repo_uri]
3707- ) unless defined $repos and (exists $config->{repos}{$repos} or -e $repo_uri);
3708+ vars => [ $repos, $repo_uri ]
3709+ )
3710+ unless defined $repos
3711+ and ( exists $config->{repos}{$repos} or -e $repo_uri );
3712
3713- $repo_uri =~ s{/$}{}g; # Trim trailing '/', SVN::Repos::open fails
3714- # otherwise
3715+ $repo_uri =~ s{/$}{}g; # Trim trailing '/', SVN::Repos::open fails
3716+ # otherwise
3717
3718 # If there's a leading '/' then tack 'file://' on to the start
3719 $repo_uri = "file://$repo_uri" if $repo_uri =~ m{^/};
3720
3721+ # warn "REPO_URI: $repo_uri";
3722+
3723 eval {
3724- $REPOS{$repos}{uri} ||= $repo_uri;
3725- $REPOS{$repos}{ra} ||= SVN::Ra->new(url => $repo_uri,
3726- pool => $repospool);
3727+ my $client = SVN::Client->new( pool => $repospool );
3728+ my $auth = $client->auth;
3729+ $REPOS{$repos}{uri} ||= $repo_uri;
3730+ $REPOS{$repos}{ra} ||= SVN::Ra->new(
3731+ url => $repo_uri,
3732+ pool => $repospool,
3733+ auth => $auth,
3734+ );
3735 };
3736
3737- if($@) {
3738+ if ($@) {
3739 my $e = $@;
3740 SVN::Web::X->throw(
3741 error => '(SVN::Client->new() failed: %1 %2)',
3742- vars => [$repo_uri, $e]
3743+ vars => [ $repo_uri, $e ]
3744 );
3745 }
3746
3747- if($config->{block}) {
3748- foreach my $blocked (@{ $config->{block} }) {
3749+ if ( $config->{block} ) {
3750+ for my $blocked ( @{ $config->{block} } ) {
3751 delete $REPOS{$blocked};
3752 }
3753 }
3754@@ -165,25 +175,25 @@
3755 my $cfg = shift;
3756 my $action_pkg;
3757
3758- if(exists $config->{actions}{ $cfg->{action} }) {
3759- if(ref($config->{actions}{ $cfg->{action} }) eq 'HASH') {
3760- if(exists $config->{actions}{ $cfg->{action} }{class}) {
3761+ if ( exists $config->{actions}{ $cfg->{action} } ) {
3762+ if ( ref( $config->{actions}{ $cfg->{action} } ) eq 'HASH' ) {
3763+ if ( exists $config->{actions}{ $cfg->{action} }{class} ) {
3764 $action_pkg = $config->{actions}{ $cfg->{action} }{class};
3765 }
3766 }
3767 }
3768
3769- unless($action_pkg) {
3770+ unless ($action_pkg) {
3771 $action_pkg = $cfg->{action};
3772 $action_pkg =~ s{^(\w)}{\U$1};
3773 $action_pkg = __PACKAGE__ . "::$action_pkg";
3774 }
3775
3776 eval "require $action_pkg && $action_pkg->can('run')"
3777- or SVN::Web::X->throw(
3778+ or SVN::Web::X->throw(
3779 error => '(missing package %1 for action %2: %3)',
3780- vars => [$action_pkg, $cfg->{action}, $@]
3781- );
3782+ vars => [ $action_pkg, $cfg->{action}, $@ ]
3783+ );
3784
3785 my $repos = $cfg->{repos} ? $REPOS{ $cfg->{repos} } : undef;
3786
3787@@ -202,130 +212,114 @@
3788 my $html;
3789 my $cache;
3790
3791- if(defined $config->{cache}{class}) {
3792- eval "require $config->{cache}{class}"
3793- or SVN::Web::X->throw(error => '(require %1 failed: %2)',
3794- vars => [$config->{cache}{class}, $@]
3795- );
3796-
3797- $config->{cache}{opts} = {} unless exists $config->{cache}{opts};
3798- $config->{cache}{opts}{namespace} = $cfg->{repos};
3799- $cache = $config->{cache}{class}->new($config->{cache}{opts});
3800- }
3801-
3802- if(defined $cfg->{repos} && length $cfg->{repos}) {
3803- get_repos($cfg->{repos});
3804- }
3805-
3806- if($cfg->{repos} && $REPOS{ $cfg->{repos} }) {
3807- @{ $cfg->{navpaths} } = File::Spec::Unix->splitdir($cfg->{path});
3808+ if ( defined $config->{cache}{class} ) {
3809+ eval "require $config->{cache}{class}"
3810+ or SVN::Web::X->throw(
3811+ error => '(require %1 failed: %2)',
3812+ vars => [ $config->{cache}{class}, $@ ]
3813+ );
3814+
3815+ $config->{cache}{opts} = {} unless exists $config->{cache}{opts};
3816+ $config->{cache}{opts}{namespace} = $cfg->{repos};
3817+ $cache = $config->{cache}{class}->new( $config->{cache}{opts} );
3818+ }
3819+
3820+ if ( defined $cfg->{repos} && length $cfg->{repos} ) {
3821+ get_repos( $cfg->{repos} );
3822+ }
3823+
3824+ if ( $cfg->{repos} && $REPOS{ $cfg->{repos} } ) {
3825+ @{ $cfg->{navpaths} } = File::Spec::Unix->splitdir( $cfg->{path} );
3826 shift @{ $cfg->{navpaths} };
3827
3828 # should use attribute or things alike
3829- $action = get_action({
3830- %$cfg,
3831- opts => exists $config->{actions}{ $cfg->{action} }{opts}
3832+ $action = get_action(
3833+ {
3834+ %$cfg,
3835+ opts => exists $config->{actions}{ $cfg->{action} }{opts}
3836 ? $config->{actions}{ $cfg->{action} }{opts}
3837- : {},
3838- });
3839- } else {
3840+ : {},
3841+ }
3842+ );
3843+ }
3844+ else {
3845 $cfg->{action} = 'list';
3846- $action = get_action({
3847- %$cfg,
3848- opts => exists $config->{actions}{ $cfg->{action} }{opts}
3849+ $action = get_action(
3850+ {
3851+ %$cfg,
3852+ opts => exists $config->{actions}{ $cfg->{action} }{opts}
3853 ? $config->{actions}{ $cfg->{action} }{opts}
3854- : {},
3855- });
3856+ : {},
3857+ }
3858+ );
3859 }
3860
3861 # Determine the language to use
3862- my $lang = get_language($cfg->{cgi}, $config->{languages},
3863- $config->{default_language});
3864-
3865- $cfg->{lang} = $lang; # Note the preference, stored in a cookie
3866- # later
3867-
3868- SVN::Web::I18N::loc_lang($lang); # Set the localisation language
3869+ my $lang =
3870+ get_language( $cfg->{cgi}, $config->{languages},
3871+ $config->{default_language} );
3872+
3873+ $cfg->{lang} = $lang; # Note the preference, stored in a cookie
3874+ # later
3875+
3876+ SVN::Web::I18N::loc_lang($lang); # Set the localisation language
3877
3878 # Generate output, from the cache if necessary.
3879
3880 # Does the action support caching? If so, get the cache key
3881 my $cache_key;
3882- if(defined $cache and $action->can('cache_key')) {
3883- $cache_key = join(':', $cfg->{action}, $lang) . ':' . $action->cache_key();
3884+ if ( defined $cache and $action->can('cache_key') ) {
3885+ $cache_key =
3886+ join( ':', $cfg->{action}, $lang ) . ':' . $action->cache_key();
3887 }
3888
3889 # If there's a key, retrieve the data from the cache
3890 $html = $cache->get($cache_key) if defined $cache_key;
3891
3892 # No data? Get the action to generate it, then cache it
3893- if(! defined $html) {
3894- # Create a default pool for the action's allocation
3895- my $pool = SVN::Pool->new_default();
3896-
3897- $REPOS{$cfg->{repos}}{client} = SVN::Client->new(config => {});
3898-
3899- $html = $action->run();
3900-
3901- $pool->clear();
3902-
3903- if(defined $cache_key) {
3904- $cache->set($cache_key, $html, $cfg->{cache}{expires_in});
3905- }
3906+ unless ( defined $html ) {
3907+
3908+ # Create a default pool for the action's allocation
3909+ my $pool = SVN::Pool->new_default();
3910+
3911+ $REPOS{ $cfg->{repos} }{client} = SVN::Client->new( config => {} );
3912+
3913+ $html = $action->run();
3914+
3915+ $pool->clear();
3916+
3917+ if ( defined $cache_key ) {
3918+ $cache->set( $cache_key, $html, $cfg->{cache}{expires_in} );
3919+ }
3920 }
3921
3922 return $html;
3923 }
3924
3925 sub get_language {
3926- my $obj = shift; # CGI or Apache instance
3927- my $languages = shift; # Hash ref of valid langauges
3928- my $default_lang = shift; # Default language
3929+ my $obj = shift; # Plack object
3930+ my $languages = shift; # Hash ref of valid langauges
3931+ my $default_lang = shift; # Default language
3932
3933 my $lang = $obj->param('lang');
3934
3935 # If lang was included in the query string then delete it now we've
3936- # got it. This stops it showing up in from calls to self_url(). Have
3937- # to do this in three different ways, depending on whether this is an
3938- # Apache::Request, Apache2::Request, or a CGI object.
3939- if(defined $lang) {
3940- if(ref($obj) eq 'Apache::Request') {
3941- my $table = $obj->parms();
3942- delete $table->{lang};
3943- } elsif(ref($obj) eq 'Apache2::Request') {
3944- # Get the query string, remove lang param, replace queue string
3945- my $args = $obj->args();
3946- $args =~ s/lang = $lang (?:&|;)?//xms;
3947- $obj->args($args);
3948- } else {
3949- $obj->delete('lang'); # Remove from self_url() invocations
3950- }
3951- }
3952+ # got it. This stops it showing up in from calls to self_url().
3953+
3954+ ## FIXME for Plack
3955
3956 # If no valid lang=.. param was found then check the user's cookies
3957- if(! defined $lang) {
3958- if(ref($obj) eq 'Apache::Request') {
3959- my $cookies = Apache::Cookie->fetch();
3960- if(defined $cookies->{'svnweb-lang'}) {
3961- $lang = $cookies->{'svnweb-lang'}->value();
3962- }
3963- } elsif(ref($obj) eq 'Apache2::Request') {
3964- my $jar = Apache2::Cookie::Jar->new($obj);
3965- my $lang_in_cookie = $jar->cookies('svnweb-lang');
3966- if(defined $lang_in_cookie) {
3967- $lang = $lang_in_cookie->value();;
3968- }
3969- } else {
3970- $lang = $obj->cookie('svnweb-lang');
3971- }
3972+
3973+ unless ( defined $lang ) {
3974+ $lang = $obj->cookies->{'svnweb-lang'};
3975 }
3976
3977 # If $lang is not defined, or if it's not in the hash of valid languages
3978 # then use the default configured language, falling back to English as
3979 # a last resort.
3980- if(! defined $lang or ! exists $languages->{$lang}) {
3981- $lang = $default_lang;
3982- $lang = 'en' unless defined $lang;
3983+ if ( !defined $lang or !exists $languages->{$lang} ) {
3984+ $lang = $default_lang;
3985+ $lang = 'en' unless defined $lang;
3986 }
3987
3988 die "lang is not defined" unless defined $lang;
3989@@ -333,312 +327,196 @@
3990 return $lang;
3991 }
3992
3993-sub cgi_output {
3994- my($cfg, $html) = @_;
3995+sub psgi_output {
3996+ my ( $req, $cfg, $html ) = @_;
3997
3998 return unless defined $html;
3999
4000- my @cookies = ();
4001- push @cookies, $cfg->{cgi}->cookie(-name => 'svnweb-lang',
4002- -value => $cfg->{lang},
4003- );
4004-
4005- if(ref($html)) {
4006- print $cfg->{cgi}->header(
4007- -charset => $html->{charset} || 'UTF-8',
4008- -type => $html->{mimetype} || 'text/html',
4009- -cookie => \@cookies,
4010- );
4011-
4012- $cfg->{path} = encode_path($cfg->{path});
4013- if($html->{template}) {
4014- $template->process($html->{template}, {
4015- c => $cfg,
4016- %{ $html->{data} }
4017- }) or die "Template::process() error: " . $template->error;
4018- } else {
4019- print $html->{body};
4020- }
4021- } else {
4022- print $cfg->{cgi}->header(
4023- -charset => 'UTF-8',
4024- -type => 'text/html',
4025- -cookie => \@cookies,
4026- );
4027- print $html;
4028- }
4029-}
4030-
4031-sub mod_perl_output {
4032- my($cfg, $html) = @_;
4033-
4034- my @cookies = ();
4035-
4036- if(mod_perl_2) {
4037- push @cookies, Apache2::Cookie->new($cfg->{request},
4038- -name => 'svnweb-lang',
4039- -value => $cfg->{lang},
4040- );
4041- $_->bake($cfg->{request}) foreach @cookies;
4042- } else {
4043- push @cookies, Apache::Cookie->new($cfg->{request},
4044- -name => 'svnweb-lang',
4045- -value => $cfg->{lang},
4046- );
4047- $_->bake() foreach @cookies;
4048- }
4049-
4050- if(ref($html)) {
4051- my $content_type = $html->{mimetype} || 'text/html';
4052- $content_type .= '; charset=';
4053- $content_type .= $html->{charset} || 'UTF-8';
4054- $cfg->{request}->content_type($content_type);
4055-
4056- if(mod_perl_2) {
4057- $cfg->{request}->headers_out();
4058- } else {
4059- $cfg->{request}->send_http_header();
4060- }
4061-
4062- if($html->{template}) {
4063- $template ||= get_template();
4064- $cfg->{path} = encode_path($cfg->{path});
4065- $template->process($html->{template},
4066- { c => $cfg, %{ $html->{data} } },
4067- $cfg->{request})
4068- or die $template->error;
4069- } else {
4070- $cfg->{request}->print($html->{body});
4071- }
4072- } else {
4073- $cfg->{request}->content_type('text/html; charset=UTF-8');
4074-
4075- if(mod_perl_2) {
4076- $cfg->{request}->headers_out();
4077- } else {
4078- $cfg->{request}->send_http_header();
4079- }
4080-
4081- $cfg->{request}->print($html);
4082- }
4083+ my $res = $req->new_response(200);
4084+ $res->cookies->{ 'svnweb-lang' } = $cfg->{lang};
4085+
4086+
4087+ if ( ref $html ) {
4088+
4089+ if ( $html->{template} ) {
4090+ my $body;
4091+ $template->process(
4092+ $html->{template},
4093+ {
4094+ c => $cfg,
4095+ %{ $html->{data} }
4096+ }, \$body
4097+ ) or die "Template::process() error: " . $template->error;
4098+
4099+ $res->content_type('text/html; charset=utf-8');
4100+ $res->body(Encode::encode('utf8',$body));
4101+ }
4102+ else {
4103+ $res->content_type($html->{mimetype} || 'text/plain');
4104+ $res->body($html->{body});
4105+ }
4106+ }
4107+ else {
4108+ $res->content_type('text/plain');
4109+ $res->body($html);
4110+ }
4111+
4112+ return $res->finalize
4113+
4114 }
4115
4116 sub get_template {
4117- Template->new({
4118- INCLUDE_PATH => $config->{templatedirs},
4119- COMPILE_DIR => $config->{tt_compile_dir},
4120- PRE_CHOMP => 2,
4121- POST_CHOMP => 2,
4122- FILTERS => {
4123- l => ([\&loc_filter, 1]),
4124- }
4125- });
4126+ Template->new(
4127+ {
4128+ INCLUDE_PATH => $config->{templatedirs},
4129+ COMPILE_DIR => $config->{tt_compile_dir},
4130+ PRE_CHOMP => 2,
4131+ POST_CHOMP => 2,
4132+ FILTERS => {
4133+ l => ( [ \&loc_filter, 1 ] ),
4134+ anchor => ( [ \&anchor_filter, 1 ] ),
4135+ },
4136+ ENCODING => 'utf8',
4137+ }
4138+ );
4139 }
4140
4141-sub run_cgi {
4142- my %opts = @_;
4143- die $@ if $@;
4144-
4145- load_config('config.yaml');
4146-
4147- $config->{$_} = $opts{$_} foreach keys %opts;
4148- $template ||= get_template();
4149-
4150- # Pull in the configured CGI class. Propogate any errors back, and
4151- # call the correct import() routine.
4152- #
4153- # This is more complicated than it should be. If $config->{cgi_class}
4154- # is defined then use that. If not, use CGI::Fast. If that can't be
4155- # loaded then use CGI.
4156- #
4157- # There's a problem with (at least) CGI::Fast. It's possible for the
4158- # require() to fail, but for CGI::Fast's entry in %INC to be populated.
4159- # This seems to happen when CGI::Fast loads, but its dependency (such
4160- # as FCGI) fails to load. So if the require() fails for any reason
4161- # we explicitly remove the %INC entry.
4162-
4163- my $cgi_class;
4164- my $eval_result;
4165-
4166- if(exists $config->{cgi_class}) {
4167- $eval_result = eval "require $config->{cgi_class}";
4168- die $@ if $@;
4169- $cgi_class = $config->{cgi_class};
4170- } else {
4171- foreach('CGI::Fast', 'CGI') {
4172- $eval_result = eval "require $_";
4173- if($@) {
4174- my $path = $_;
4175- my @path_components = split('::', $path);
4176- $path = File::Spec->catfile(@path_components);
4177- $path .= '.pm';
4178- delete $INC{$path};
4179- } else {
4180- $cgi_class = $_;
4181- last;
4182- }
4183- }
4184+sub run_psgi {
4185+
4186+ my $c = shift;
4187+ my $env = shift;
4188+ my $req = Plack::Request->new($env);
4189+
4190+ $template ||= get_template();
4191+
4192+ my ( $html, $cfg );
4193+
4194+ $cfg = {
4195+ style => $config->{style},
4196+ cgi => $req,
4197+ languages => $config->{languages},
4198+ };
4199+
4200+ eval {
4201+ my ( $action, $base, $repo, $script, $path ) = crack_url($req);
4202+
4203+ SVN::Web::X->throw(
4204+ error => '(action %1 not supported)',
4205+ vars => [$action]
4206+ ) unless exists $config->{actions}{ lc($action) };
4207+
4208+ $cfg->{repos} = $repo;
4209+ $cfg->{action} = $action;
4210+ $cfg->{path} = $path;
4211+ $cfg->{script} = $script;
4212+ $cfg->{base_uri} = $base;
4213+ $cfg->{self_uri} = $req->path();
4214+ $cfg->{config} = $config;
4215+
4216+ $html = run($cfg);
4217+ };
4218+
4219+ if ( my $e = SVN::Web::X->caught() ) {
4220+ $html->{template} = 'x';
4221+ $html->{data}{error_msg} =
4222+ SVN::Web::I18N::loc( $e->error(), @{ $e->vars() } );
4223 }
4224-
4225- die "Could not load a CGI class" unless $eval_result;
4226- $cgi_class->import();
4227-
4228- # Save the selected module so that future calls to this routine
4229- # don't waste time trying to find the correct class.
4230- $config->{cgi_class} = $cgi_class unless exists $config->{cgi_class};
4231-
4232- while(my $cgi = $cgi_class->new) {
4233- my($html, $cfg);
4234-
4235- $cfg = {
4236- style => $config->{style},
4237- cgi => $cgi,
4238- languages => $config->{languages},
4239- };
4240-
4241- eval {
4242- my($action, $base, $repo, $script, $path) = crack_url($cgi);
4243-
4244- SVN::Web::X->throw(
4245- error => '(action %1 not supported)',
4246- vars => [$action]
4247- ) unless exists $config->{actions}{ lc($action) };
4248-
4249- $cfg->{repos} = $repo;
4250- $cfg->{action} = $action;
4251- $cfg->{path} = $path;
4252- $cfg->{script} = $script;
4253- $cfg->{base_uri} = $base;
4254- $cfg->{self_uri} = $cgi->self_url();
4255- $cfg->{config} = $config;
4256-
4257- $html = run($cfg);
4258- };
4259-
4260- my $e;
4261- if($e = SVN::Web::X->caught()) {
4262+ else {
4263+ if ($@) {
4264 $html->{template} = 'x';
4265- $html->{data}{error_msg} = SVN::Web::I18N::loc($e->error(), @{ $e->vars() });
4266- } else {
4267- if($@) {
4268- $html->{template} = 'x';
4269- $html->{data}{error_msg} = $@;
4270- }
4271+ $html->{data}{error_msg} = $@;
4272 }
4273-
4274- cgi_output($cfg, $html);
4275- last if $cgi_class eq 'CGI';
4276 }
4277+
4278+ return psgi_output( $req, $cfg, $html );
4279 }
4280
4281 sub loc_filter {
4282 my $context = shift;
4283 my @args = @_;
4284- return sub { SVN::Web::I18N::loc($_[0], @args) };
4285-}
4286-
4287-# Crack a URL and determine the components we need. Takes either a CGI
4288-# or Apache object as the only argument, so this is misnamed.
4289+ return sub { SVN::Web::I18N::loc( $_[0], @args ) };
4290+}
4291+
4292+sub anchor_filter {
4293+ my $context = shift;
4294+ return sub {
4295+ my $str = shift;
4296+ $str =~ s/[\/% ]/_/g;
4297+ return $str;
4298+ };
4299+}
4300+
4301+# Crack a URL and determine the components we need.
4302 sub crack_url {
4303+
4304 my $obj = shift;
4305
4306-# warn "REF: ", ref($obj), "\n";
4307-
4308- my($location, $filename, $path_info, $uri);
4309-
4310- if(ref($obj) eq 'Apache' or ref($obj) eq 'Apache2::RequestRec') {
4311- $location = $obj->location();
4312- $filename = $obj->filename();
4313- $path_info = $obj->path_info();
4314- $uri = $obj->uri();
4315- } else {
4316- # For compatibility with Apache::Request->filename():
4317- # 1. $location is the current working directory
4318- # 2. $filename is $location + the first component of path_info()
4319- $location = POSIX::getcwd();
4320-
4321- # Split path_info, keeping trailing fields
4322- my @path = split('/', $obj->path_info(), -1);
4323- $filename = $location;
4324- if($#path) {
4325- shift @path; # Leading empty null field
4326- if(defined $path[0]) {
4327- $filename .= '/' . shift @path;
4328- }
4329- }
4330-
4331- $path_info = '/' . join('/', @path);
4332- $uri = $obj->url(-relative => 1, -path_info => 1);
4333- }
4334-
4335-# warn "LOCATION: $location\n";
4336-# warn "FILENAME: $filename\n";
4337-# warn "PATH_INFO: $path_info\n";
4338-# warn "URI: $uri\n";
4339-
4340- my($action, $base, $repo, $script, $path);
4341+ my $path_info = Encode::decode('utf8',$obj->path);
4342+
4343+ # warn "PATH_INFO: $path_info";
4344+
4345+ my ( $action, $base, $repo, $script, $path );
4346
4347 # Determine $repo.
4348 #
4349 # This is used as the key in to the hash of configured repositories.
4350 # It may be the empty string, in which case the action to run is
4351 # the 'list repositories' action.
4352- if($location eq $filename) {
4353- $repo = ''; # No repo, show repo list
4354- $action = 'list';
4355- } else {
4356- # Start with $repo equal to $filename. Then remove $location.
4357- # This needs to be quoted for systems where the path may include
4358- # backslashes. There may also be a trailing directory separator
4359- # which needs removing.
4360- #
4361- # XXX In an ideal world File::Spec would tell us what the directory
4362- # separator is. For the time being, punt, and use both forward and
4363- # backward slashes.
4364- $repo = $filename;
4365- my $quoted_location = quotemeta($location);
4366- $repo =~ s{^ $quoted_location [/\\]? }{}x;
4367- $repo = uri_unescape($repo);
4368- }
4369-
4370-# warn "REPO: $repo\n";
4371+ if ( $path_info eq '/' ) {
4372+ $repo = ''; # No repo, show repo list
4373+ $action = 'list';
4374+ }
4375+ else {
4376+
4377+ # Start with $repo equal to $filename. Then remove $location.
4378+ # This needs to be quoted for systems where the path may include
4379+ # backslashes. There may also be a trailing directory separator
4380+ # which needs removing.
4381+ #
4382+ # XXX In an ideal world File::Spec would tell us what the directory
4383+ # separator is. For the time being, punt, and use both forward and
4384+ # backward slashes.
4385+ ($repo) = $path_info =~ m{^/([^/]+)/?};
4386+ $repo = uri_unescape($repo);
4387+ }
4388+
4389+ # warn "REPO: $repo";
4390
4391 # Determine $action
4392 #
4393 # This will be used as the key in to the hash of configured actions
4394 # and their classes. If no action is included in the URL then the
4395 # default action is 'browse'.
4396- if(! defined $action) {
4397- if($path_info eq '/' or $path_info eq '') {
4398- $action = 'browse';
4399- } else {
4400- my @path = split('/', $path_info);
4401- $action = $path[1];
4402- }
4403+ unless ( defined $action ) {
4404+ my @path = split( '/', $path_info );
4405+ # warn "SPLIT PATH: ", join('|', @path);
4406+ $action = $path[2] || 'browse';
4407 }
4408
4409-# warn "ACTION: $action\n";
4410+ # warn "ACTION: $action";
4411
4412 # Determine $path
4413 #
4414 # This is the path in the repository that we will be acting on. Some
4415 # actions don't need this set.
4416- if($action eq 'list') {
4417- $path = '/';
4418- } else {
4419- if($path_info eq '' or $path_info eq '/') {
4420- $path = '/';
4421- } else {
4422- $path = $path_info;
4423- $path =~ s{^/$action}{};
4424- $path =~ s{/+$}{} unless $path eq '/';
4425- }
4426+ if ( $action eq 'list' ) {
4427+ $path = '/';
4428+ }
4429+ else {
4430+ if ( $path_info eq '/' ) {
4431+ $path = '/';
4432+ }
4433+ else {
4434+ $path = $path_info;
4435+ $path =~ s{^/$repo(/$action)?}{};
4436+ $path =~ s{/+$}{} unless $path eq '/';
4437+ }
4438 }
4439
4440 # Unescape it, as it will have been escaped on the web page
4441 $path = uri_unescape($path);
4442
4443-# warn "PATH: $path\n";
4444+ # warn "PATH: $path";
4445
4446 # Determine $script
4447 #
4448@@ -646,39 +524,10 @@
4449 # is CGI then it's something like 'http://host//svnweb/index.cgi'.
4450 # If it's an Apache handler then it will be a directory reference,
4451 # like '/svnweb', or possibly '/'.
4452- #
4453- # In the CGI case this is just the SCRIPT_NAME environment
4454- # variable. There's no Apache equivalent, so for Apache 1 take
4455- # the URI, prepend the protocol, host, and port, then starting
4456- # from the right end, remove the path, the action, and the
4457- # repository name. The result is the root URI for the handler.
4458- #
4459- # For Apache 2 use Apache2::URI::construct_url() to get the full
4460- # URL (without the query string), and then perform the same
4461- # substitutions as for the Apache 1 case.
4462- if(ref($obj) eq 'Apache') {
4463- my $port = $obj->server()->port();
4464-
4465- $script = sprintf('%s://%s:%s%s',
4466- $port == 443 ? 'https' : 'http',
4467- $obj->server()->server_hostname(),
4468- $port,
4469- $uri);
4470- $script =~ s{$path/?$}{};
4471- $script =~ s{/$action$}{};
4472- $script =~ s{/$repo$}{};
4473- } elsif(ref($obj) eq 'Apache2::RequestRec') {
4474- $script = $obj->construct_url();
4475- $script =~ s{$path/?$}{};
4476- $script =~ s{/$action$}{};
4477- $script =~ s{/$repo$}{};
4478- } else {
4479- $script = $ENV{SCRIPT_NAME};
4480- }
4481-
4482- $script =~ s{/$}{}; # Remove trailing slash
4483-
4484-# warn "SCRIPT: $script\n";
4485+
4486+ $script = $obj->script_name;
4487+
4488+ # warn "SCRIPT: $script";
4489
4490 # Determine $base
4491 #
4492@@ -688,127 +537,14 @@
4493
4494 # In all cases, $base is a substring of $script. In the mod_perl and
4495 # svnweb-server cases it's identical
4496- $base = $script; # Only in mod_perl case
4497-
4498- # If we're running as a CGI then SCRIPT_FILENAME will (or should)
4499- # be set in the environment. If it is, find the filename component,
4500- # which should be the name of this script, and remove that component
4501- # from $base.
4502- #
4503- # This turns '/svnweb/index.cgi' into '/svnweb/'. We go through these
4504- # shenanigans so that the script can be called something other than
4505- # index.cgi.
4506- if(ref($obj) ne 'Apache') {
4507- if(exists $ENV{SCRIPT_FILENAME}) {
4508- my $path = $ENV{SCRIPT_FILENAME};
4509- my(undef, undef, $file) = File::Spec->splitpath($path);
4510- $base =~ s{$file$}{};
4511- } else {
4512-# warn 'SCRIPT_FILENAME not set in environment, assuming script is called index.cgi';
4513- $base =~ s{index.cgi$}{};
4514- }
4515- }
4516- $base =~ s{/$}{}; # Remove trailing slash
4517-
4518-# warn "BASE: $base\n";
4519-
4520- return($action, $base, $repo, $script, $path);
4521-}
4522-
4523-sub handler {
4524- my $ok;
4525- require CGI;
4526-
4527- eval {
4528- if(mod_perl_2) {
4529- require Apache2::RequestRec;
4530- require Apache2::RequestUtil;
4531- require Apache2::RequestIO;
4532- require Apache2::Response;
4533- require Apache2::Request;
4534- require Apache2::Const;
4535- require Apache2::Cookie;
4536- require Apache2::URI;
4537- Apache2::Const->import(-compile => qw(OK DECLINED));
4538- $ok = &Apache2::Const::OK;
4539- } else {
4540- require Apache::Request;
4541- require Apache::Constants;
4542- require Apache::Cookie;
4543- Apache::Constants->import(qw(OK DECLINED));
4544- $ok = &Apache::Constants::OK;
4545- }
4546- };
4547-
4548- die $@ if $@; # Fail if the mod_perl imports failed
4549-
4550- my $r = shift; # Apache or Apache2::RequestRec object
4551-
4552- my $apr = mod_perl_2 ? Apache2::Request->new($r)
4553- : Apache::Request->new($r);
4554-
4555- my($action, $base, $repo, $script, $path) = crack_url($r);
4556-
4557- chdir($r->location());
4558- load_config('config.yaml');
4559-
4560- my($html, $cfg);
4561-
4562- $cfg = {
4563- style => $config->{style},
4564- cgi => $apr,
4565- languages => $config->{languages},
4566- request => $r,
4567- };
4568-
4569- eval {
4570- SVN::Web::X->throw(
4571- error => '(action %1 not supported)',
4572- vars => [$action]
4573- ) unless exists $config->{actions}{ lc($action) };
4574-
4575- $cfg->{repos} = $repo;
4576- $cfg->{action} = $action;
4577- $cfg->{path} = $path;
4578- $cfg->{script} = $script;
4579- $cfg->{base_uri} = $base;
4580- $cfg->{config} = $config;
4581-
4582- $cfg->{self_uri} = $r->uri();
4583- my $args = $r->args();
4584- if($args) {
4585- $cfg->{self_uri} .= "?$args";
4586- }
4587-
4588- $html = run($cfg);
4589- };
4590-
4591- my $e;
4592- if($e = SVN::Web::X->caught()) {
4593- $html->{template} = 'x';
4594- $html->{data}{error_msg} = SVN::Web::I18N::loc($e->error(),
4595- @{ $e->vars() });
4596- } else {
4597- if($@) {
4598- $html->{template} = 'x';
4599- $html->{data}{error_msg} = $@;
4600- }
4601- }
4602-
4603- mod_perl_output($cfg, $html);
4604- return $ok;
4605-}
4606-
4607-sub encode_path {
4608- my $path = shift;
4609-
4610- return unless defined $path;
4611-
4612- my @path = split('/', $path);
4613-
4614- $path = join('/', map { uri_escape($_) } @path);
4615-
4616- return $path;
4617+ # $base = $script; # Only in mod_perl case
4618+ $base = $obj->base; # Only in mod_perl case
4619+
4620+ $base =~ s{/$}{}; # Remove trailing slash
4621+
4622+ # warn "BASE: $base";
4623+
4624+ return ( $action, $base, $repo, $script, $path );
4625 }
4626
4627 1;
4628@@ -858,24 +594,18 @@
4629 =item 4.
4630
4631 Either configure your web server (see L</"WEB SERVERS">) to use SVN::Web,
4632-or run C<svnweb-server> to start a simple web server for testing.
4633-
4634- svnweb-server
4635-
4636-Note: C<svnweb-server> requires HTTP::Server::Simple to run, which is not
4637-a requirement of SVN::Web. You may have to install HTTP::Server::Simple
4638-first.
4639+or run with C<plackup> to start a simple web server for testing.
4640+
4641+ plackup -Ilib/ ./SVN-Web.psgi
4642
4643 =item 5.
4644
4645 Point your web browser at the correct URL to browse your repository.
4646-If you've run C<svnweb-server> then this is L<http://localhost:8080/>.
4647+If you've run C<plackup> then this is L<http://localhost:5000/>.
4648
4649 =back
4650
4651-See
4652-L<http://jc.ngo.org.uk/svnweb/jc/browse/nik/CPAN/SVN-Web/trunk/>
4653-for the SVN::Web source code, browsed using SVN::Web.
4654+See L<https://github.com/djzort/SVN-Web> for the SVN::Web source code.
4655
4656 =head1 DESCRIPTION
4657
4658@@ -1545,113 +1275,48 @@
4659 SVN::Web. In all cases, C</path/to/svnweb> in the examples is the
4660 directory you ran C<svnweb-install> in, and contains F<config.yaml>.
4661
4662+SVN::Web now uses L<Plack> to provide connectivity to the web server.
4663+Previously a cgi, stand alone, fastcgi, mod_perl1 and a mod_perl2
4664+interface was provided as part of this software. All of which have been
4665+removed and replaced by Plack. In doing so, Plack now will connect
4666+SVN::Web to all of the above, plus PSGI, nginx_perl and anything else
4667+cooked up in the future.
4668+
4669 If you've configured a web server that isn't listed here for SVN::Web,
4670 please send in the instructions so they can be included in a future
4671 release.
4672
4673-=head2 svnweb-server
4674+=head2 plackup
4675
4676-C<svnweb-server> is a simple web server that runs SVN::Web, and is
4677-included and installed by this module. It may be all you need to
4678+C<plackups> is a simple web server that can run SVN::Web stand alone,
4679+and is included and installed by Plack. It may be all you need to
4680 productively use SVN::Web without needing to install a larger server.
4681 To use it, run:
4682
4683- svnweb-server --root /path/to/svnweb
4684+ plackup SVN-Web.psgi
4685
4686-See C<perldoc svnweb-server> for details about additional options you can
4687+See C<perldoc plackup> for details about additional options you can
4688 use.
4689
4690-=head2 Apache as CGI
4691-
4692-Apache must be configured to support CGI scripts in the directory in which
4693-you ran C<svnweb-install>
4694-
4695- <Directory /path/to/svnweb>
4696- Options All ExecCGI
4697- </Directory>
4698-
4699-If F</path/to/svnweb> is not under your normal Apache web hosting root then
4700-you will need to alias a URL to that path too.
4701-
4702- Alias /svnweb /path/to/svnweb
4703-
4704-With that configuration the full path to browse the repository would be:
4705-
4706- http://server/svnweb/index.cgi
4707+=head2 Apache as CGI (not recommended)
4708+
4709+See L<Plack::Handler::CGI>
4710
4711 =head2 Apache with mod_perl or mod_perl2
4712
4713-You can use mod_perl or mod_perl2 with SVN::Web. You must install
4714-L<Apache::Request|Apache::Request> (for mod_perl) or
4715-L<Apache2::Request|Apache2::Request> (for mod_perl2) to enable this support.
4716-
4717-The following Apache configuration is suitable.
4718-
4719- <Directory /path/to/svnweb>
4720- AllowOverride None
4721- Options None
4722- SetHandler perl-script
4723- PerlHandler SVN::Web
4724- </Directory>
4725-
4726- <Directory /path/to/svnweb/css>
4727- SetHandler default-handler
4728- </Directory>
4729-
4730-If F</path/to/svnweb> is not under your normal Apache web hosting root then
4731-you will need to alias a URL to that path too.
4732-
4733- Alias /svnweb /path/to/svnweb/
4734-
4735-With that configuration the full path to browse the repository would be:
4736-
4737- http://server/svnweb
4738+See L<Plack::Handler::Apache1> or L<Plack::Handler::Apache2> respectively.
4739
4740 =head2 Apache with FastCGI
4741
4742-SVN::Web works with Apache and FastCGI. The following Apache configuration
4743-is suitable.
4744-
4745- FastCgiServer /path/to/svnweb/index.cgi
4746- ScriptAlias /svnweb /path/to/svnweb/index.cgi
4747-
4748- Alias /svnweb/css /path/to/svnweb/css
4749- <Directory /path/to/svnweb/css>
4750- SetHandler default-handler
4751- </Directory>
4752+See L<Plack::Handler::FCGI>
4753
4754 =head2 IIS
4755
4756-SVN::Web works as a CGI script with IIS and Subversion on Windows servers.
4757-
4758-After following the instructions in L</SYNOPSIS>, ensure that IIS makes
4759-the new F<svnweb> directory available either as a directory or a
4760-virtual host.
4761-
4762-Using IIS Manager:
4763-
4764-=over
4765-
4766-=item
4767-
4768-Allow executable access to this directory (see I<Execute Permissions> in
4769-the I<Home Directory> tab under I<Properties>).
4770-
4771-=item
4772-
4773-Add F<index.cgi> to the list of default content pages under I<Documents>.
4774-
4775-=back
4776-
4777-=head1 MAILING LIST
4778-
4779-There is a mailing list for SVN::Web users and developers. The address
4780-is svnweb@ngo.org.uk. To subscribe please visit
4781-L<http://jc.ngo.org.uk/mailman/listinfo/svnweb>.
4782+For now this is probably broken.
4783
4784 =head1 SEE ALSO
4785
4786-L<SVN::Web::action>, svnweb-install(1), svnweb-server(1)
4787+L<SVN::Web::action>, svnweb-install(1), plackup(1), L<Plack>
4788
4789 =head1 BUGS
4790
4791@@ -1667,12 +1332,16 @@
4792
4793 Nik Clayton C<< <nik@FreeBSD.org> >>
4794
4795+Dean Hamstead C<< <dean@fragfest.com.au> >>
4796+
4797 =head1 COPYRIGHT
4798
4799 Copyright 2003-2004 by Chia-liang Kao C<< <clkao@clkao.org> >>.
4800
4801 Copyright 2005-2007 by Nik Clayton C<< <nik@FreeBSD.org> >>.
4802
4803+Copyright 2012 by Dean Hamstead C<< <dean@fragfest.com.au> >>.
4804+
4805 This program is free software; you can redistribute it and/or modify it
4806 under the same terms as Perl itself.
4807
4808
4809=== modified file 'lib/SVN/Web/Blame.pm'
4810--- lib/SVN/Web/Blame.pm 2007-11-30 14:01:12 +0000
4811+++ lib/SVN/Web/Blame.pm 2013-01-26 22:10:25 +0000
4812@@ -5,7 +5,9 @@
4813
4814 use base 'SVN::Web::action';
4815
4816-our $VERSION = 0.53;
4817+use Encode ();
4818+
4819+our $VERSION = 0.62;
4820
4821 =head1 NAME
4822
4823@@ -117,51 +119,54 @@
4824 my $self = shift;
4825 my $path = $self->{path};
4826
4827- my(undef, undef, $act_rev, $head) = $self->get_revs();
4828+ my ( undef, undef, $act_rev, $head ) = $self->get_revs();
4829
4830 return "$act_rev:$head:$path";
4831 }
4832
4833 sub run {
4834 my $self = shift;
4835- my $ctx = $self->{repos}{client};
4836- my $ra = $self->{repos}{ra};
4837- my $uri = $self->{repos}{uri};
4838- my $path = $self->{path};
4839+ my $uri = $self->{repos}{uri} . $self->{path};
4840
4841- my($exp_rev, $yng_rev, $act_rev, $head) = $self->get_revs();
4842+ my ( $exp_rev, $yng_rev, $act_rev, $head ) = $self->get_revs();
4843
4844 my $rev = $act_rev;
4845
4846 my @blame_details;
4847
4848- $ctx->blame("$uri$path", 1, $rev, sub {
4849- push @blame_details, {
4850- line_no => $_[0],
4851- rev => $_[1],
4852- author => $_[2],
4853- date => $self->format_svn_timestamp($_[3]),
4854- line => $_[4],
4855- };
4856- });
4857+ $self->ctx_blame(
4858+ $uri,
4859+ 1, $rev,
4860+ sub {
4861+ push @blame_details,
4862+ {
4863+ line_no => $_[0],
4864+ rev => $_[1],
4865+ author => $_[2],
4866+ date => $self->format_svn_timestamp( $_[3] ),
4867+ line => Encode::decode('utf8',$_[4]),
4868+ };
4869+ }
4870+ );
4871
4872 my $mime_type;
4873- my $props = $ctx->propget('svn:mime-type', $uri . $path, $rev, 0);
4874- if(exists $props->{$uri . $path}) {
4875- $mime_type = $props->{$uri . $path};
4876- } else {
4877- $mime_type = 'text/plain';
4878+ my $props = $self->ctx_propget( 'svn:mime-type', $uri, $rev, 0 );
4879+ if ( exists $props->{$uri} ) {
4880+ $mime_type = $props->{$uri};
4881+ }
4882+ else {
4883+ $mime_type = 'text/plain';
4884 }
4885
4886 return {
4887 template => 'blame',
4888 data => {
4889- context => 'file',
4890+ context => 'file',
4891 rev => $act_rev,
4892 youngest_rev => $yng_rev,
4893- at_head => $head,
4894+ at_head => $head,
4895 mimetype => $mime_type,
4896- blame_details => \@blame_details,
4897+ blame_details => \@blame_details,
4898 }
4899 };
4900 }
4901
4902=== modified file 'lib/SVN/Web/Browse.pm'
4903--- lib/SVN/Web/Browse.pm 2007-11-30 14:01:12 +0000
4904+++ lib/SVN/Web/Browse.pm 2013-01-26 22:10:25 +0000
4905@@ -5,11 +5,12 @@
4906
4907 use base 'SVN::Web::action';
4908
4909+use Encode ();
4910 use SVN::Ra;
4911 use SVN::Client;
4912 use SVN::Web::X;
4913
4914-our $VERSION = 0.53;
4915+our $VERSION = 0.63;
4916
4917 =head1 NAME
4918
4919@@ -136,91 +137,85 @@
4920 my $self = shift;
4921 my $path = $self->{path};
4922
4923- my(undef, undef, $act_rev, $at_head) = $self->get_revs();
4924+ my ( undef, undef, $act_rev, $at_head ) = $self->get_revs();
4925
4926 return "$act_rev:$at_head:$path";
4927 }
4928
4929 sub run {
4930 my $self = shift;
4931- my $ctx = $self->{repos}{client};
4932- my $ra = $self->{repos}{ra};
4933- my $path = $self->{path};
4934-
4935- my $uri = $path eq '/' ? $self->{repos}{uri}
4936- : $self->{repos}{uri} . $path;
4937-
4938- my($exp_rev, $yng_rev, $act_rev, $at_head) = $self->get_revs();
4939-
4940- my $rev = $act_rev;
4941-
4942- my $node_kind;
4943- $ctx->info($uri, $rev, $rev,
4944- sub { $node_kind = $_[1]->kind(); }, 0);
4945-
4946- if($node_kind == $SVN::Node::none) {
4947+ my $uri = $self->{repos}{uri};
4948+ $uri .= '/'.$self->rpath if $self->rpath;
4949+
4950+ my ( $exp_rev, $yng_rev, $act_rev, $at_head ) = $self->get_revs();
4951+
4952+ my $rev = $act_rev;
4953+
4954+ my $node_kind = $self->svn_get_node_kind($uri, $rev, $rev);
4955+
4956+ if ( $node_kind == $SVN::Node::none ) {
4957 SVN::Web::X->throw(
4958 error => '(path %1 does not exist in revision %2)',
4959- vars => [$path, $rev]
4960- );
4961- }
4962-
4963- if($node_kind != $SVN::Node::dir) {
4964- SVN::Web::X->throw(
4965- error => '(path %1 is not a directory in revision %2)',
4966- vars => [$path, $rev],
4967- );
4968- }
4969-
4970- my $dirents = $ctx->ls($uri, $rev, 0);
4971+ vars => [ $self->rpath, $rev ]
4972+ );
4973+ }
4974+
4975+ if ( $node_kind != $SVN::Node::dir ) {
4976+ SVN::Web::X->throw(
4977+ error => '(path %1 is not a directory in revision %2)',
4978+ vars => [ $self->rpath, $rev ],
4979+ );
4980+ }
4981+
4982+ my $dirents = $self->ctx_ls( $uri, $rev, 0 );
4983
4984 my $entries = [];
4985- my($name, $dirent);
4986 my $current_time = time();
4987
4988- while(($name, $dirent) = each %{ $dirents }) {
4989- my $kind = $dirent->kind();
4990- my $entry_path = $path eq '/' ? "$path$name"
4991- : "$path/$name";
4992-
4993- my @log_result = $self->recent_interesting_rev($entry_path, $rev);
4994-
4995- push @{ $entries }, {
4996- name => $name,
4997- rev => $log_result[1],
4998- kind => $kind,
4999- isdir => ($kind == $SVN::Node::dir),
5000- size => ($kind == $SVN::Node::dir ? '' : $dirent->size()),
The diff has been truncated for viewing.

Subscribers

People subscribed via source and target branches