Fixed tree view for repos with / in name
[catagits/Gitalist.git] / lib / Gitalist.pm
1 package Gitalist;
2 use Moose;
3 BEGIN { require 5.008006; }
4 use Catalyst::Runtime 5.80;
5 use namespace::autoclean;
6
7 extends 'Catalyst';
8
9 use Catalyst qw/
10                 ConfigLoader
11                 Unicode::Encoding
12                 Static::Simple
13                 StackTrace
14                 SubRequest
15 /;
16
17 our $VERSION = '0.002009';
18 $VERSION = eval $VERSION;
19
20 __PACKAGE__->config(
21     name => 'Gitalist',
22     default_view => 'Default',
23     default_model => 'CollectionOfRepos',
24     use_request_uri_for_path => 1,
25     disable_component_resolution_regex_fallback => 1,
26 );
27
28 __PACKAGE__->setup();
29
30 after prepare_path => sub {
31     my ($ctx) = @_;
32     if ($ctx->req->param('a')) {
33         $ctx->request->uri->path('/legacy' . $ctx->request->uri->path);
34     }
35 };
36
37 around uri_for => sub {
38   my ($orig, $c) = (shift, shift);
39   my $uri = $c->$orig(@_);
40   $$uri =~ tr[&][;] if defined $uri;
41   return $uri;
42 };
43
44 sub uri_with {
45   my ($self, @args) = @_;
46   my $uri = $self->request->uri_with(@args);
47   # Wow this awful.
48   $uri =~ s[/fragment\b][];
49   return $uri;  
50 }
51
52 1;
53
54 __END__
55
56 =encoding UTF-8
57
58 =head1 NAME
59
60 Gitalist - A modern git web viewer
61
62 =head1 SYNOPSIS
63
64     perl script/gitalist_server.pl --repo_dir /home/me/code/git
65
66 =head1 INSTALL
67
68 As Gitalist follows the usual Perl module format the usual approach
69 for installation should work, e.g.:
70
71     perl Makefile.PL
72     make
73     make test
74     make install
75
76 or
77
78     cpan -i Gitalist
79
80 You can also L<check Gitalist out from its git repository|/"GETTING GITALIST">
81 and run it, in this case you'll additionally need the author modules,
82 but no configuration will be needed as it will default to looking
83 for repositories the directory above the checkout.
84
85 =head1 DESCRIPTION
86
87 Gitalist is a web frontend for git repositories based on
88 L<gitweb.cgi|https://git.wiki.kernel.org/index.php/Gitweb> and backed by
89 L<Catalyst>.
90
91 =head2 History
92
93 This project started off as an attempt to port I<gitweb.cgi> to a
94 Catalyst app in a piecemeal fashion. As it turns out, thanks largely
95 to Florian Ragwitz's earlier effort, it was easier to use I<gitweb.cgi>
96 as a template for building a new Catalyst application.
97
98 =head1 GETTING GITALIST
99
100 You can install Gitalist from CPAN in the usual way:
101
102     cpan -i Gitalist
103
104 Alternatively, you can get Gitalist using git.
105
106 The canonical repository for the master branch is:
107
108     git://git.shadowcat.co.uk/catagits/Gitalist.git
109
110 Gitalist is also mirrored to GitHub at L<https://github.com/broquaint/Gitalist>,
111 and a number of people have active forks
112 with branches and/or new features in the master branch.
113
114 =head1 BOOTSTRAPPING
115
116 As of C<0.002001> Gitalist can now be bootstrapped to run out of its
117 own directory by installing its prerequisites locally with the help of
118 L<local::lib>. So instead of installing the prerequisites to the
119 system path with CPAN they are installed under the Gitalist directory.
120
121 To do this clone Gitalist from the L<Shadowcat repository mentioned
122 above|/"GETTING GITALIST"> or grab a snapshot from broquaint's GitHub repository:
123
124     https://github.com/broquaint/Gitalist/downloads
125
126 With the source acquired and unpacked run the following from within the
127 Gitalist directory:
128
129     perl script/bootstrap.pl
130
131 This will install the necessary modules for the build process which in
132 turn installs the prerequisites locally.
133
134 B<NB:> The relevant bootstrap scripts aren't available in the CPAN dist
135 as the bootstrap scripts should not be installed.
136
137 =head1 INITIAL CONFIGURATION
138
139 Gitalist is configured using L<Catalyst::Plugin::Configloader>. The supplied sample
140 configuration is in L<Config::General> format, however it is possible to configure
141 Gitalist using other config file formats (such as YAML) if you prefer.
142
143 =head2 WHEN CHECKING GITALIST OUT OF GIT
144
145 Gitalist from git includes a minimal C<gitalist_local.conf>, which sets the repository
146 directory to one directory higher than the Gitalist repository.
147
148 This means that if you check Gitalist out next to your other git checkouts, then starting
149 the demo server needs no parameters at all:
150
151     Gitalist [master]$ perl script/gitalist_server.pl
152     You can connect to your server at http://localhost:3000
153
154 =head2 FOR CPAN INSTALLS
155
156 Gitalist can be supplied with a config file by setting the C<< GITALIST_CONFIG >>
157 environment variable to point to a configuration file.
158
159 If you install Gitalist from CPAN, a default configuration is installed along with gitalist,
160 which is complete except for a repository directory. You can get a copy of this configuration
161 by running:
162
163   cp `perl -Ilib -MGitalist -e'print Gitalist->path_to("gitalist.conf")'` gitalist.conf
164
165 You can then edit this configuration, adding a C<repo_dir> path and customising
166 other settings as desired.
167
168 You can then start the Gitalist demo server by setting C<< GITALIST_CONFIG >>. For example:
169
170     GITALIST_CONFIG=/usr/local/etc/gitalist.conf gitalist_server.pl
171
172 Alternatively, if you only want to set a repository directory and are otherwise happy with
173 the default configuration, then you can set the C<< GITALIST_REPO_DIR >> environment
174 variable, or pass the C<< --repo_dir >> flag to any of the scripts.
175
176     GITALIST_REPO_DIR=/home/myuser/code/git gitalist_server.pl
177     gitalist_server.pl --repo_dir home/myuser/code/git
178
179 The C<< GITALIST_REPO_DIR >> environment variable will override the repository directory set
180 in configuration, and will itself be overridden by he C<< --repo_dir >> flag.
181
182 =head1 RUNNING
183
184 Once you have followed the instructions above to install and configure Gitalist, you may want
185 to run it in a more production facing environment than using the single threaded developement
186 server.
187
188 The recommended deployment method for Gitalist is FastCGI, although Gitalist can also be run
189 under L<mod_perl|https://perl.apache.org/> or as pure Perl with L<Catalyst::Engine::PreFork>.
190
191 Assuming that you have installed Gitalist's dependencies into a L<local::lib>, and you
192 are running from a git checkout, adding a trivial FCGI script as C<script/gitalist.fcgi>
193 (this file is specifically in C<.gitignore> so you can have your own copy):
194
195     #!/bin/sh
196     exec /home/t0m/public_html/Gitalist/script/gitalist_fastcgi.pl
197
198 This example can be seen live here:
199
200     http://example.gitalist.com
201
202 =head1 CONFIGURATION
203
204 The Gitalist config is loaded with L<Catalyst::Plugin::ConfigLoader>
205 and the available config options are:
206
207 =head2 Model::CollectionOfRepos
208
209 =over
210
211 =item git
212
213 Path to the C<git> binary.
214
215 =item repo_dir
216
217 A directory containing the directories to show.
218
219 If no repositories are found in this directory then Gitalist will
220 search recursively in that directory for repositories.
221
222 =item search_recursively
223
224 A boolean indicating whether to always search recursively for
225 repositories within C<repo_dir>.
226
227 =item whitelist
228
229 Path a file containing a list of repositories that can be shown. Each
230 line in the file will represent the name of a repo to show e.g
231
232   Gitalist
233   some-bare-repo.git
234
235 This is compatible with C<gitweb>'s C<projects.list>.
236
237 =item export_ok
238
239 If provided every must contain a file of the same name to be
240 visible. This is similar to C<gitweb>'s functionality.
241
242 =back
243
244 =head2 paging
245
246 =over
247
248 =item log
249
250 The number of commits to show in the 
251
252 =back
253
254 =head2 FASTCGI
255
256 Running Gitalist in FastCGI mode requires a webserver with FastCGI
257 support (such as apache with L<mod_fcgi|http://www.fastcgi.com/drupal/node/3>
258 or L<mod_fcgid|https://httpd.apache.org/mod_fcgid/>). Below is a sample
259 configuration using Apache2 with mod_fcgid in a dynamic configuration
260 (as opposed to static or standalone mode). More information on these modes and
261 their configuration can be found at L<Catalyst::Engine::FastCGI/"Standalone server mode">.
262
263 In Apache's F<mime.conf>, add C<AddHandler fcgid-script .fcgi>
264 (or C<AddHandler fastcgi-script .fcgi> for mod_fcgi).
265
266 And a quick VirtualHost configuration:
267
268     <VirtualHost *:80>
269         ServerName gitalist.yourdomain.com
270         DocumentRoot /path/to/gitalist.fcgi
271         <Directory "/path/to/gitalist.fcgi">
272             AllowOverride all
273             Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
274             Order allow,deny
275             Allow from all
276         </Directory>
277
278         # Tell Apache this is a FastCGI application
279         <Files gitalist.fcgi>
280             #change the below to fastcgi-script if using mod_fcgi
281             SetHandler fcgid-script
282         </Files>
283     </VirtualHost>
284
285 Now to access your Gitalist instance, you'll go to
286 C<gitalist.yourdomain.com/gitalist.fcgi/> (B<do not forget that trailing> C</>).
287 If you'd like a different URL, of course, you'll likely want to use
288 L<mod_rewrite|https://httpd.apache.org/docs/mod/mod_rewrite.html> or equivalent.
289
290 If you find the need to do some troubleshooting, you can call
291 C<http://url_to_gitalist.fcgi?dump_info=1> and/or add export C<GITALIST_DEBUG=1>
292 to the top of your F<gitalist.fcgi> file (just below the shebang line).
293
294 Also, note that Apache will refuse C<%2F> in Gitalist URLs
295 unless configured otherwise. Make sure C<AllowEncodedSlashes On>
296 is in your F<httpd.conf> file in order for this to run smoothly.
297
298 =head1 CONTRIBUTING
299
300 Patches are welcome, please feel free to fork on github and send pull requests, send patches
301 from git format-patch to the bug tracker, or host your own copy of gitalist somewhere and
302 ask us to pull from it.
303
304 =head1 SUPPORT
305
306 Gitalist has an active irc community in C<#gitalist> on irc.perl.org, please feel free to stop
307 by and ask questions, report bugs or installation issues or generally for a chat about where
308 we plan to go with the project.
309
310 =head1 SEE ALSO
311
312 L<Gitalist::Controller::Root>
313
314 L<Gitalist::Git::Repository>
315
316 L<Catalyst>
317
318 =head1 AUTHORS AND COPYRIGHT
319
320   Catalyst application:
321     © 2009 Venda Ltd and Dan Brook <broq@cpan.org>
322     © 2009, Tom Doran <bobtfish@bobtfish.net>
323     © 2009, Zac Stevens <zts@cryptocracy.com>
324
325   Original gitweb.cgi from which this was derived:
326     © 2005-2006, Kay Sievers <kay.sievers@vrfy.org>
327     © 2005, Christian Gierke
328
329   Model based on http://github.com/rafl/gitweb
330     © 2008, Florian Ragwitz
331
332 =head1 LICENSE
333
334 Licensed under GNU GPL v2