... | ... |
@@ -49,6 +49,11 @@ sub startup { |
49 | 49 |
croak $error; |
50 | 50 |
} |
51 | 51 |
$git->bin($git_bin); |
52 |
+ |
|
53 |
+ # Repository Manager |
|
54 |
+ my $manager = Gitprep::RepManager->new(app => $self); |
|
55 |
+ weaken $manager->{app}; |
|
56 |
+ $self->manager($manager); |
|
52 | 57 |
|
53 | 58 |
# Repository home |
54 | 59 |
my $rep_home = $self->home->rel_file('rep'); |
... | ... |
@@ -59,18 +64,6 @@ sub startup { |
59 | 64 |
} |
60 | 65 |
$self->git($git); |
61 | 66 |
|
62 |
- # Reverse proxy support |
|
63 |
- $ENV{MOJO_REVERSE_PROXY} = 1; |
|
64 |
- $self->hook('before_dispatch' => sub { |
|
65 |
- my $self = shift; |
|
66 |
- |
|
67 |
- if ($self->req->headers->header('X-Forwarded-Host')) { |
|
68 |
- my $prefix = shift @{$self->req->url->path->parts}; |
|
69 |
- push @{$self->req->url->base->path->parts}, $prefix |
|
70 |
- if defined $prefix; |
|
71 |
- } |
|
72 |
- }); |
|
73 |
- |
|
74 | 67 |
# DBI |
75 | 68 |
my $db_file = $self->home->rel_file('db/gitprep.db'); |
76 | 69 |
my $dbi = DBIx::Custom->connect( |
... | ... |
@@ -143,100 +136,83 @@ EOS |
143 | 136 |
|
144 | 137 |
# Helper |
145 | 138 |
$self->helper(gitprep_api => sub { Gitprep::API->new(shift) }); |
146 |
- |
|
147 |
- # Route |
|
148 |
- my $r = $self->routes->route->to('main#'); |
|
149 |
- |
|
139 |
+ |
|
150 | 140 |
# DBViewer(only development) |
151 | 141 |
if ($self->mode eq 'development') { |
152 | 142 |
eval { |
153 | 143 |
$self->plugin( |
154 | 144 |
'DBViewer', |
155 | 145 |
dsn => "dbi:SQLite:database=$db_file", |
156 |
- route => $r |
|
157 | 146 |
); |
158 | 147 |
}; |
159 | 148 |
} |
149 |
+ |
|
150 |
+ # Auto route |
|
151 |
+ $self->plugin('AutoRoute'); |
|
160 | 152 |
|
161 |
- # Repository Manager |
|
162 |
- my $manager = Gitprep::RepManager->new(app => $self); |
|
163 |
- weaken $manager->{app}; |
|
164 |
- $self->manager($manager); |
|
165 |
- |
|
166 |
- # Home |
|
167 |
- $r->get('/')->name('home'); |
|
168 |
- |
|
169 |
- # Start |
|
170 |
- $r->any('/_start')->name('_start'); |
|
171 |
- |
|
172 |
- # Sign in |
|
173 |
- $r->any('/_login')->name('login'); |
|
174 |
- |
|
175 |
- # Admin |
|
176 |
- $r->get('/_admin')->name('_admin'); |
|
177 |
- |
|
178 |
- # Admin |
|
153 |
+ # User defined Routes |
|
179 | 154 |
{ |
180 |
- my $r = $r->route('/_admin')->to('_admin#'); |
|
155 |
+ my $r = $self->routes->route->to('main#'); |
|
181 | 156 |
|
182 |
- # Users |
|
183 |
- $r->any('/users')->to('#users'); |
|
184 |
- |
|
185 | 157 |
# User |
158 |
+ $r->get('/:user')->name('user'); |
|
159 |
+ |
|
160 |
+ # Project |
|
186 | 161 |
{ |
187 |
- my $r = $r->route('/user')->to('_admin-user#'); |
|
162 |
+ my $r = $r->route('/:user/:project'); |
|
163 |
+ $r->get('/')->name('project'); |
|
188 | 164 |
|
189 |
- # Create user |
|
190 |
- $r->any('/create')->to('#create'); |
|
191 |
- } |
|
192 |
- } |
|
165 |
+ # Commit |
|
166 |
+ $r->get('/commit/#diff')->name('commit'); |
|
167 |
+ |
|
168 |
+ # Commits |
|
169 |
+ $r->get('/commits/#rev', {id => 'HEAD'})->name('commits'); |
|
170 |
+ $r->get('/commits/#rev/(*blob)')->name('commits'); |
|
171 |
+ |
|
172 |
+ # Branches |
|
173 |
+ $r->get('/branches'); |
|
193 | 174 |
|
194 |
- # User |
|
195 |
- $r->get('/:user')->name('user'); |
|
196 |
- |
|
197 |
- # Project |
|
198 |
- { |
|
199 |
- my $r = $r->route('/:user/:project'); |
|
200 |
- $r->get('/')->name('project'); |
|
201 |
- |
|
202 |
- # Commit |
|
203 |
- $r->get('/commit/#diff')->name('commit'); |
|
204 |
- |
|
205 |
- # Commits |
|
206 |
- $r->get('/commits/#rev', {id => 'HEAD'})->name('commits'); |
|
207 |
- $r->get('/commits/#rev/(*blob)')->name('commits'); |
|
208 |
- |
|
209 |
- # Branches |
|
210 |
- $r->get('/branches')->name('branches'); |
|
175 |
+ # Tags |
|
176 |
+ $r->get('/tags'); |
|
211 | 177 |
|
212 |
- # Tags |
|
213 |
- $r->get('/tags')->name('tags'); |
|
178 |
+ # Tree |
|
179 |
+ $r->get('/tree/(*object)')->name('tree'); |
|
180 |
+ |
|
181 |
+ # Blob |
|
182 |
+ $r->get('/blob/(*object)')->name('blob'); |
|
183 |
+ |
|
184 |
+ # Blob diff |
|
185 |
+ $r->get('/blobdiff/(#diff)/(*file)')->name('blobdiff'); |
|
186 |
+ |
|
187 |
+ # Raw |
|
188 |
+ $r->get('/raw/(*object)')->name('raw'); |
|
189 |
+ |
|
190 |
+ # Archive |
|
191 |
+ $r->get('/archive/(#rev).tar.gz')->name('archive')->to(archive_type => 'tar'); |
|
192 |
+ $r->get('/archive/(#rev).zip')->name('archive')->to(archive_type => 'zip'); |
|
193 |
+ |
|
194 |
+ # Compare |
|
195 |
+ $r->get('/compare/(#rev1)...(#rev2)')->name('compare'); |
|
196 |
+ |
|
197 |
+ # Settings |
|
198 |
+ $r->any('/settings'); |
|
199 |
+ |
|
200 |
+ # Fork |
|
201 |
+ $r->any('/fork'); |
|
202 |
+ } |
|
203 |
+ } |
|
214 | 204 |
|
215 |
- # Tree |
|
216 |
- $r->get('/tree/(*object)')->name('tree'); |
|
217 |
- |
|
218 |
- # Blob |
|
219 |
- $r->get('/blob/(*object)')->name('blob'); |
|
220 |
- |
|
221 |
- # Blob diff |
|
222 |
- $r->get('/blobdiff/(#diff)/(*file)')->name('blobdiff'); |
|
223 |
- |
|
224 |
- # Raw |
|
225 |
- $r->get('/raw/(*object)')->name('raw'); |
|
226 |
- |
|
227 |
- # Archive |
|
228 |
- $r->get('/archive/(#rev).tar.gz')->name('archive')->to(archive_type => 'tar'); |
|
229 |
- $r->get('/archive/(#rev).zip')->name('archive')->to(archive_type => 'zip'); |
|
230 |
- |
|
231 |
- # Compare |
|
232 |
- $r->get('/compare/(#rev1)...(#rev2)')->name('compare'); |
|
233 |
- |
|
234 |
- # Settings |
|
235 |
- $r->any('/settings')->name('settings'); |
|
205 |
+ # Reverse proxy support |
|
206 |
+ $ENV{MOJO_REVERSE_PROXY} = 1; |
|
207 |
+ $self->hook('before_dispatch' => sub { |
|
208 |
+ my $self = shift; |
|
236 | 209 |
|
237 |
- # Fork |
|
238 |
- $r->any('/fork')->name('fork'); |
|
239 |
- } |
|
210 |
+ if ($self->req->headers->header('X-Forwarded-Host')) { |
|
211 |
+ my $prefix = shift @{$self->req->url->path->parts}; |
|
212 |
+ push @{$self->req->url->base->path->parts}, $prefix |
|
213 |
+ if defined $prefix; |
|
214 |
+ } |
|
215 |
+ }); |
|
240 | 216 |
} |
241 | 217 |
|
242 | 218 |
1; |
... | ... |
@@ -0,0 +1,118 @@ |
1 |
+package Mojolicious::Plugin::AutoRoute; |
|
2 |
+use Mojo::Base 'Mojolicious::Plugin'; |
|
3 |
+ |
|
4 |
+our $VERSION = '0.07'; |
|
5 |
+ |
|
6 |
+sub register { |
|
7 |
+ my ($self, $app, $conf) = @_; |
|
8 |
+ |
|
9 |
+ # Parent route |
|
10 |
+ my $r = $conf->{route} || $app->routes; |
|
11 |
+ |
|
12 |
+ # Top directory |
|
13 |
+ my $top_dir = $conf->{top_dir} || 'auto'; |
|
14 |
+ $top_dir =~ s#^/##; |
|
15 |
+ $top_dir =~ s#/$##; |
|
16 |
+ |
|
17 |
+ # Condition |
|
18 |
+ $app->routes->add_condition(__auto_route_plugin_file_exists => sub { |
|
19 |
+ my ($r, $c, $captures, $pattern) = @_; |
|
20 |
+ |
|
21 |
+ my $path = $captures->{__auto_route_plugin_path}; |
|
22 |
+ $path = 'index' unless defined $path; |
|
23 |
+ |
|
24 |
+ return if $path =~ /\.\./; |
|
25 |
+ |
|
26 |
+ my $found; |
|
27 |
+ for my $dir (@{$c->app->renderer->paths}) { |
|
28 |
+ if (-f "$dir/$top_dir/$path.html.ep") { |
|
29 |
+ return 1; |
|
30 |
+ } |
|
31 |
+ } |
|
32 |
+ |
|
33 |
+ return; |
|
34 |
+ }); |
|
35 |
+ |
|
36 |
+ # Index |
|
37 |
+ $r->route('/') |
|
38 |
+ ->over('__auto_route_plugin_file_exists') |
|
39 |
+ ->to(cb => sub { shift->render("/$top_dir/index") }); |
|
40 |
+ |
|
41 |
+ # Route |
|
42 |
+ $r->route('/(*__auto_route_plugin_path)') |
|
43 |
+ ->over('__auto_route_plugin_file_exists') |
|
44 |
+ ->to(cb => sub { |
|
45 |
+ my $c = shift; |
|
46 |
+ |
|
47 |
+ my $path = $c->stash('__auto_route_plugin_path'); |
|
48 |
+ |
|
49 |
+ $c->render("/$top_dir/$path"); |
|
50 |
+ }); |
|
51 |
+} |
|
52 |
+ |
|
53 |
+1; |
|
54 |
+ |
|
55 |
+=head1 NAME |
|
56 |
+ |
|
57 |
+Mojolicious::Plugin::AutoRoute - Mojolicious Plugin to create routes automatically |
|
58 |
+ |
|
59 |
+=head1 CAUTION |
|
60 |
+ |
|
61 |
+B<This is beta release. Implementation will be changed without warnings>. |
|
62 |
+ |
|
63 |
+=head1 SYNOPSIS |
|
64 |
+ |
|
65 |
+ # Mojolicious |
|
66 |
+ $self->plugin('AutoRoute'); |
|
67 |
+ |
|
68 |
+ # Mojolicious::Lite |
|
69 |
+ plugin 'AutoRoute'; |
|
70 |
+ |
|
71 |
+=head1 DESCRIPTION |
|
72 |
+ |
|
73 |
+L<Mojolicious::Plugin::AutoRoute> is a L<Mojolicious> plugin |
|
74 |
+to create routes automatically. |
|
75 |
+ |
|
76 |
+Routes corresponding to URL is created . |
|
77 |
+ |
|
78 |
+ TEMPLATES ROUTES |
|
79 |
+ templates/auto/index.html.ep # / |
|
80 |
+ /foo.html.ep # /foo |
|
81 |
+ /foo/bar.html.ep # /foo/bar |
|
82 |
+ /foo/bar/baz.html.ep # /foo/bar/baz |
|
83 |
+ |
|
84 |
+If you like C<PHP>, this plugin is very good. |
|
85 |
+You only put file into C<auto> directory. |
|
86 |
+ |
|
87 |
+=head1 OPTIONS |
|
88 |
+ |
|
89 |
+=head2 C<route> |
|
90 |
+ |
|
91 |
+ route => $route; |
|
92 |
+ |
|
93 |
+You can set parent route if you need. |
|
94 |
+This is L<Mojolicious::Routes> object. |
|
95 |
+Default is C<$app->routes>. |
|
96 |
+ |
|
97 |
+=head2 C<top_dir> |
|
98 |
+ |
|
99 |
+ top_dir => 'myauto' |
|
100 |
+ |
|
101 |
+Top directory. default is C<auto>. |
|
102 |
+ |
|
103 |
+=head1 METHODS |
|
104 |
+ |
|
105 |
+L<Mojolicious::Plugin::AutoRoute> inherits all methods from |
|
106 |
+L<Mojolicious::Plugin> and implements the following new ones. |
|
107 |
+ |
|
108 |
+=head2 C<register> |
|
109 |
+ |
|
110 |
+ $plugin->register($app); |
|
111 |
+ |
|
112 |
+Register plugin in L<Mojolicious> application. |
|
113 |
+ |
|
114 |
+=head1 SEE ALSO |
|
115 |
+ |
|
116 |
+L<Mojolicious>, L<Mojolicious::Guides>, L<http://mojolicio.us>. |
|
117 |
+ |
|
118 |
+=cut |