Showing 7 changed files with 63 additions and 19 deletions
+4 -2
lib/Gitprep.pm
... ...
@@ -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');
+17 -5
lib/Gitprep/Git.pm
... ...
@@ -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};
+10 -1
lib/Gitprep/Manager.pm
... ...
@@ -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
+6
templates/project.html.ep
... ...
@@ -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);
+3 -9
templates/settings.html.ep
... ...
@@ -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 {
+5
templates/user.html.ep
... ...
@@ -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) {
+18 -2
xt/user.t
... ...
@@ -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
 }