... | ... |
@@ -156,8 +156,10 @@ sub startup { |
156 | 156 |
|
157 | 157 |
# Custom routes |
158 | 158 |
{ |
159 |
+ my $id_re = qr/[a-zA-Z0-9_-]+/; |
|
160 |
+ |
|
159 | 161 |
# User |
160 |
- my $r = $r->route('/:user'); |
|
162 |
+ my $r = $r->route('/:user', user => $id_re); |
|
161 | 163 |
{ |
162 | 164 |
# Home |
163 | 165 |
$r->get('/' => template '/user'); |
... | ... |
@@ -168,7 +170,7 @@ sub startup { |
168 | 170 |
|
169 | 171 |
# Project |
170 | 172 |
{ |
171 |
- my $r = $r->route('/:project'); |
|
173 |
+ my $r = $r->route('/:project', project => $id_re); |
|
172 | 174 |
|
173 | 175 |
# Home |
174 | 176 |
$r->get('/' => template '/project'); |
... | ... |
@@ -52,16 +52,16 @@ sub branch_status { |
52 | 52 |
return $status; |
53 | 53 |
} |
54 | 54 |
|
55 |
-sub branches { |
|
56 |
- my ($self, $user, $project, $opts) = @_; |
|
55 |
+sub no_merged_branch_h { |
|
56 |
+ my ($self, $user, $project) = @_; |
|
57 | 57 |
|
58 | 58 |
# No merged branches |
59 | 59 |
my $no_merged_branches_h = {}; |
60 | 60 |
{ |
61 |
- my @cmd = $self->cmd($user, $project, 'branch'); |
|
62 |
- push @cmd, , '--no-merged'; |
|
63 |
- open my $fh, '-|', @cmd or return; |
|
61 |
+ my $rep = $self->rep($user, $project); |
|
64 | 62 |
|
63 |
+ my @cmd = $self->cmd($user, $project, 'branch', '--no-merged'); |
|
64 |
+ open my $fh, '-|', @cmd or return; |
|
65 | 65 |
while (my $branch_name = $self->_dec(scalar <$fh>)) { |
66 | 66 |
$branch_name =~ s/^\*//; |
67 | 67 |
$branch_name =~ s/^\s*//; |
... | ... |
@@ -70,12 +70,24 @@ sub branches { |
70 | 70 |
} |
71 | 71 |
} |
72 | 72 |
|
73 |
+ return $no_merged_branches_h; |
|
74 |
+} |
|
75 |
+ |
|
76 |
+sub branches { |
|
77 |
+ my ($self, $user, $project) = @_; |
|
78 |
+ |
|
73 | 79 |
# Branches |
74 | 80 |
my @cmd = $self->cmd($user, $project, 'branch'); |
75 | 81 |
open my $fh, '-|', @cmd or return; |
76 | 82 |
my $branches = []; |
83 |
+ my $start; |
|
84 |
+ my $no_merged_branches_h; |
|
77 | 85 |
while (my $branch_name = $self->_dec(scalar <$fh>)) { |
78 | 86 |
|
87 |
+ # No merged branch |
|
88 |
+ $no_merged_branches_h = $self->no_merged_branch_h($user, $project) |
|
89 |
+ unless $start++; |
|
90 |
+ |
|
79 | 91 |
# Branch |
80 | 92 |
my $branch = $self->branch($user, $project, $branch_name); |
81 | 93 |
$branch->{no_merged} = 1 if $no_merged_branches_h->{$branch_name}; |
... | ... |
@@ -555,6 +555,15 @@ sub exists_project { |
555 | 555 |
return $row ? 1 : 0; |
556 | 556 |
} |
557 | 557 |
|
558 |
+sub exists_user { |
|
559 |
+ my ($self, $user) = @_; |
|
560 |
+ |
|
561 |
+ # Exists project |
|
562 |
+ my $row = $self->app->dbi->model('user')->select(id => $user)->one; |
|
563 |
+ |
|
564 |
+ return $row ? 1 : 0; |
|
565 |
+} |
|
566 |
+ |
|
558 | 567 |
sub _exists_rep { |
559 | 568 |
my ($self, $user, $project) = @_; |
560 | 569 |
|
... | ... |
@@ -587,7 +596,7 @@ sub _rename_project { |
587 | 596 |
my ($self, $user, $project, $renamed_project) = @_; |
588 | 597 |
|
589 | 598 |
# Check arguments |
590 |
- croak "Invalid parameters" |
|
599 |
+ croak "Invalid parameters(_rename_project)" |
|
591 | 600 |
unless defined $user && defined $project && defined $renamed_project; |
592 | 601 |
|
593 | 602 |
# Rename project |
... | ... |
@@ -11,6 +11,12 @@ |
11 | 11 |
my $user = param('user'); |
12 | 12 |
my $project = param('project'); |
13 | 13 |
my $rev = app->manager->default_branch($user, $project); |
14 |
+ |
|
15 |
+ unless (app->manager->exists_project($user, $project)) { |
|
16 |
+ $self->render_not_found; |
|
17 |
+ $self->finish_rendering; |
|
18 |
+ return; |
|
19 |
+ } |
|
14 | 20 |
|
15 | 21 |
# Repository description |
16 | 22 |
my $desc = $git->description($user, $project); |
... | ... |
@@ -22,14 +22,9 @@ |
22 | 22 |
# Validation |
23 | 23 |
my $params = $api->params; |
24 | 24 |
my $rule = [ |
25 |
- user => [ |
|
26 |
- 'user_name' |
|
27 |
- ], |
|
28 |
- project => [ |
|
29 |
- 'project_name' |
|
30 |
- ], |
|
31 | 25 |
'to-project' => [ |
32 |
- 'project_name' |
|
26 |
+ ['not_blank' => 'Repository name is empty.'], |
|
27 |
+ ['project_name' => 'Repository name contains invalid charactor.'] |
|
33 | 28 |
] |
34 | 29 |
]; |
35 | 30 |
my $vresult = app->validator->validate($params, $rule); |
... | ... |
@@ -37,8 +32,6 @@ |
37 | 32 |
if ($vresult->is_ok) { |
38 | 33 |
# Valida parameters |
39 | 34 |
my $data = $vresult->data; |
40 |
- my $user = $data->{user}; |
|
41 |
- my $project = $data->{project}; |
|
42 | 35 |
my $to_project = $data->{'to-project'}; |
43 | 36 |
|
44 | 37 |
# Rename |
... | ... |
@@ -48,6 +41,7 @@ |
48 | 41 |
else { |
49 | 42 |
eval { app->manager->rename_project($user, $project, $to_project) }; |
50 | 43 |
if ($@) { |
44 |
+ app->log->error($@); |
|
51 | 45 |
$errors = ['Internal Error']; |
52 | 46 |
} |
53 | 47 |
else { |
... | ... |
@@ -10,6 +10,11 @@ |
10 | 10 |
my $user = param('user'); |
11 | 11 |
|
12 | 12 |
# Projects |
13 |
+ unless (app->manager->exists_user($user)) { |
|
14 |
+ $self->render_not_found; |
|
15 |
+ $self->finish_rendering; |
|
16 |
+ return; |
|
17 |
+ } |
|
13 | 18 |
my $projects = app->manager->projects($user); |
14 | 19 |
my $reps = []; |
15 | 20 |
for my $project (@$projects) { |
... | ... |
@@ -309,15 +309,31 @@ note 'User Account Settings'; |
309 | 309 |
$t->content_like(qr/first commit/); |
310 | 310 |
$t->content_like(qr/t2\.git/); |
311 | 311 |
$t->content_like(qr/README/); |
312 |
- |
|
312 |
+ |
|
313 | 313 |
# Settings page(don't has README) |
314 | 314 |
$t->get_ok('/kimoto1/t1/settings'); |
315 | 315 |
$t->content_like(qr/Settings/); |
316 |
- |
|
316 |
+ |
|
317 | 317 |
# Settings page(has README) |
318 | 318 |
$t->get_ok('/kimoto1/t2/settings'); |
319 | 319 |
$t->content_like(qr/Settings/); |
320 | 320 |
} |
321 | 321 |
|
322 | 322 |
note 'Project settings'; |
323 |
+ { |
|
324 |
+ note 'Rename project'; |
|
325 |
+ { |
|
326 |
+ # Empty |
|
327 |
+ $t->post_ok('/kimoto1/t2/settings?op=rename-project', form => {}); |
|
328 |
+ $t->content_like(qr/Repository name is empty/); |
|
329 |
+ |
|
330 |
+ # Invalid character |
|
331 |
+ $t->post_ok('/kimoto1/t2/settings?op=rename-project', form => {'to-project' => '&'}); |
|
332 |
+ $t->content_like(qr/Repository name contains invalid charactor/); |
|
333 |
+ |
|
334 |
+ # Rename project |
|
335 |
+ $t->post_ok('/kimoto1/t2/settings?op=rename-project', form => {'to-project' => 't3'}); |
|
336 |
+ $t->content_like(qr/Repository name is renamed to t3/); |
|
337 |
+ } |
|
338 |
+ } |
|
323 | 339 |
} |