Merge remote branch 'seveas/seveas/tree_speedup'
[catagits/Gitalist.git] / lib / Gitalist / Controller / Root.pm
1 package Gitalist::Controller::Root;
2
3 use Moose;
4 use Moose::Autobox;
5 use Digest::MD5 qw(md5_hex);
6 use Gitalist::Utils qw/ age_string mode_string /;
7
8 use namespace::autoclean;
9
10 BEGIN { extends 'Gitalist::Controller' }
11
12 __PACKAGE__->config(namespace => '');
13
14 sub root : Chained('/') PathPart('') CaptureArgs(0) {}
15
16 sub index : Chained('base') PathPart('') Args(0) {
17     my ( $self, $c ) = @_;
18     $c->stash( search_text => $c->req->param('s') || '' ) # FIXME - XSS?
19 }
20
21 # XXX Fragile much?
22 sub css : Chained('/root') PathPart('core.css') Args(0) {
23     my ( $self, $c ) = @_;
24
25     $c->stash( template => 'static/css/core.css', content_type => 'text/css' );
26 }
27
28 sub base : Chained('/root') PathPart('') CaptureArgs(0) {
29   my($self, $c) = @_;
30
31   my $git_version = `git --version`;
32   chomp($git_version);
33   $c->stash(
34     git_version => $git_version,
35     version     => $Gitalist::VERSION,
36
37     time_since => sub {
38       return 'never' unless $_[0];
39       return age_string(time - $_[0]->epoch);
40     },
41     short_cmt => sub {
42       my $cmt = shift;
43       my($line) = split /\n/, $cmt;
44       $line =~ s/^(.{70,80}\b).*/$1 \x{2026}/ if defined $line;
45       return $line;
46     },
47     abridged_description => sub {
48         join(' ', grep { defined } (split / /, shift)[0..10]);
49     },
50     uri_for_gravatar => sub {
51         my $email = shift;
52         my $size = shift;
53         my $uri = 'http://www.gravatar.com/avatar/' . md5_hex($email);
54         $uri .= "?s=$size" if $size;
55         return $uri;
56     },
57     mode_string => sub {
58         return mode_string(oct shift);
59     }
60   );
61 }
62
63 sub search : Chained('base') Args(0) {}
64
65 =head2 search_help
66
67 Provides some help for the search form.
68
69 =cut
70
71 sub search_help : Chained('base') Args(0) {}
72
73 sub end : ActionClass('Serialize') {
74     my ($self, $c) = @_;
75     # Give repository views the current HEAD.
76     if ($c->stash->{Repository}) {
77         $c->stash->{HEAD} = $c->stash->{Repository}->head_hash;
78     }
79     if ($c->stash->{data} && blessed $c->stash->{data}) {
80         $c->stash->{rest} = $c->stash->{data}->pack;
81     }
82 }
83
84 sub error_404 : Action {
85     my ($self, $c) = @_;
86     $c->response->status(404);
87     $c->response->body('Page not found');
88 }
89
90 __PACKAGE__->config(
91     default => 'text/html',
92     map => {
93         'application/json' => [qw/ JSON /],
94         map { $_ => [qw/ View Default /] }
95              qw( text/css text/html text/plain
96                  application/atom+xml application/rss+xml application/rss )
97     },
98     content_type_stash_key => 'content_type',
99 );
100
101 __PACKAGE__->meta->make_immutable;
102
103 __END__
104
105 =head1 NAME
106
107 Gitalist::Controller::Root - Root controller for the application
108
109 =head1 DESCRIPTION
110
111 This controller handles all of the root level paths for the application
112
113 =head1 METHODS
114
115 =head2 root
116
117 Root of chained actions
118
119 =head2 base
120
121 Populate the header and footer. Perhaps not the best location.
122
123 =head2 index
124
125 Provides the repository listing.
126
127 =head2 end
128
129 Attempt to render a view, if needed.
130
131 =head2 error_404
132
133 =head1 AUTHORS
134
135 See L<Gitalist> for authors.
136
137 =head1 LICENSE
138
139 See L<Gitalist> for the license.
140
141 =cut