... | ... |
@@ -1,3 +1,5 @@ |
1 |
+1.7 |
|
2 |
+ - allow . as project name. |
|
1 | 3 |
1.6 |
2 | 4 |
- fix bug that can't create collaborator more than one. |
3 | 5 |
- support time zone. |
... | ... |
@@ -9,6 +9,7 @@ use Gitprep::Git; |
9 | 9 |
use Gitprep::Manager; |
10 | 10 |
use Scalar::Util 'weaken'; |
11 | 11 |
use Validator::Custom; |
12 |
+use Mojolicious::Plugin::AutoRoute::Util 'template'; |
|
12 | 13 |
|
13 | 14 |
# Digest::SHA loading to Mojo::Util if not loaded |
14 | 15 |
{ |
... | ... |
@@ -131,25 +132,20 @@ sub startup { |
131 | 132 |
user_name => sub { |
132 | 133 |
my $value = shift; |
133 | 134 |
|
134 |
- return ($value || '') =~ /^[a-zA-Z0-9_\-]+$/ |
|
135 |
+ return ($value || '') =~ /^[a-zA-Z0-9_\-]+$/; |
|
135 | 136 |
}, |
136 | 137 |
project_name => sub { |
137 | 138 |
my $value = shift; |
138 |
- |
|
139 |
- return ($value || '') =~ /^[a-zA-Z0-9_\-]+$/ |
|
139 |
+ return 0 unless defined $value; |
|
140 |
+ return 0 if $value eq '.' || $value eq '..'; |
|
141 |
+ |
|
142 |
+ return ($value || '') =~ /[a-zA-Z0-9_\-\.]+$/; |
|
140 | 143 |
} |
141 | 144 |
); |
142 | 145 |
|
143 | 146 |
# Basic auth plugin |
144 | 147 |
$self->plugin('BasicAuth'); |
145 | 148 |
|
146 |
- # Routes |
|
147 |
- sub template { |
|
148 |
- my $template = shift; |
|
149 |
- |
|
150 |
- return sub { shift->render($template, , 'mojo.maybe' => 1) }; |
|
151 |
- } |
|
152 |
- |
|
153 | 149 |
{ |
154 | 150 |
my $r = $self->routes; |
155 | 151 |
|
... | ... |
@@ -186,16 +182,14 @@ sub startup { |
186 | 182 |
|
187 | 183 |
# Auto routes |
188 | 184 |
$self->plugin('AutoRoute', route => $r); |
189 |
- |
|
185 |
+ |
|
190 | 186 |
# Custom routes |
191 | 187 |
{ |
192 |
- my $id_re = qr/[a-zA-Z0-9_-]+/; |
|
193 |
- |
|
194 | 188 |
# User |
195 |
- my $r = $r->route('/:user', user => $id_re); |
|
189 |
+ my $r = $r->route('/:user'); |
|
196 | 190 |
{ |
197 | 191 |
# Home |
198 |
- $r->get('/' => template '/user'); |
|
192 |
+ $r->get('/' => [format => 0] => template '/user'); |
|
199 | 193 |
|
200 | 194 |
# Settings |
201 | 195 |
$r->get('/_settings' => template '/user-settings'); |
... | ... |
@@ -203,8 +197,7 @@ sub startup { |
203 | 197 |
|
204 | 198 |
# Smart HTTP |
205 | 199 |
{ |
206 |
- |
|
207 |
- my $r = $r->route('/(:project).git', project => $id_re); |
|
200 |
+ my $r = $r->route('/(#project).git'); |
|
208 | 201 |
|
209 | 202 |
{ |
210 | 203 |
my $r = $r->under(sub { |
... | ... |
@@ -267,7 +260,7 @@ sub startup { |
267 | 260 |
|
268 | 261 |
# Project |
269 | 262 |
{ |
270 |
- my $r = $r->route('/:project', project => $id_re); |
|
263 |
+ my $r = $r->route('/#project'); |
|
271 | 264 |
|
272 | 265 |
{ |
273 | 266 |
my $r = $r->under(sub { |
... | ... |
@@ -314,6 +314,12 @@ note 'Profile'; |
314 | 314 |
ok(-f "$rep_home/kimoto1/t1.git/git-daemon-export-ok"); |
315 | 315 |
ok(-f "$rep_home/kimoto1/t1.git/hooks/post-update"); |
316 | 316 |
|
317 |
+ # Create repository(first character is .) |
|
318 |
+ $t->post_ok('/_new?op=create', form => {project => '.dot', description => 'Dot'}); |
|
319 |
+ $t->content_like(qr/Create a new repository on the command line/); |
|
320 |
+ $t->content_like(qr/\.dot\.git/); |
|
321 |
+ $t->content_like(qr/Dot/); |
|
322 |
+ |
|
317 | 323 |
# Create repository(with readme) |
318 | 324 |
$t->post_ok('/_new?op=create', form => {project => 't2', description => 'Hello', readme => 1}); |
319 | 325 |
$t->content_like(qr/first commit/); |