Showing 5 changed files with 143 additions and 138 deletions
+15 -29
lib/Gitprep/Git.pm
... ...
@@ -755,38 +755,24 @@ sub project_urls {
755 755
   return \@urls;
756 756
 }
757 757
 
758
-sub projects {
759
-  my ($self, $user, $opts) = @_;
758
+sub repository {
759
+  my ($self, $user, $project) = @_;
760
+
761
+  return unless -d $self->rep($user, $project);
760 762
   
761
-  my $home = $self->rep_home;
762
-  my $dir = "$home/$user";
763
-  
764
-  # Repositories
765
-  opendir my $dh, $self->_enc($dir)
766
-    or croak qq/Can't open directory $dir: $!/;
767
-  my @reps;
768
-  while (my $rep_name = readdir $dh) {
769
-    next unless $rep_name =~ /\.git$/;
770
-    my $project = $rep_name;
771
-    $project =~ s/\.git$//;
772
-    my $rep_path = "$home/$user/$rep_name";
773
-    my @activity = $self->last_activity($user, $project);
774
-    
775
-    my $rep = {};
776
-    $rep->{name} = $project;
777
-    if (@activity) {
778
-      $rep->{age} = $activity[0];
779
-      $rep->{age_string} = $activity[1];
780
-    }
781
-    else { $rep->{age} = 0 }
782
-    
783
-    my $description = $self->description($user, $project) || '';
784
-    $rep->{description} = $self->_chop_str($description, 25, 5);
785
-    
786
-    push @reps, $rep;
763
+
764
+  my $rep = {};
765
+  my @activity = $self->last_activity($user, $project);
766
+  if (@activity) {
767
+    $rep->{age} = $activity[0];
768
+    $rep->{age_string} = $activity[1];
787 769
   }
770
+  else { $rep->{age} = 0 }
771
+  
772
+  my $description = $self->description($user, $project) || '';
773
+  $rep->{description} = $self->_chop_str($description, 25, 5);
788 774
   
789
-  return \@reps;
775
+  return $rep;
790 776
 }
791 777
 
792 778
 sub references {
+108 -103
lib/Gitprep/Manager.pm
... ...
@@ -30,6 +30,46 @@ sub default_branch {
30 30
   return $default_branch;
31 31
 }
32 32
 
33
+sub fork_project {
34
+  my ($self, $user, $original_user, $project) = @_;
35
+  
36
+  # Fork project
37
+  my $dbi = $self->app->dbi;
38
+  my $error;
39
+  eval {
40
+    $dbi->connector->txn(sub {
41
+      
42
+      # Original project id
43
+      my $original_pid = $dbi->model('project')
44
+        ->select('original_pid', id => [$original_user, $project])->value;
45
+      
46
+      croak "Can't get original project id"
47
+        unless defined $original_pid && $original_pid > 0;
48
+      
49
+      # Create project
50
+      eval {
51
+        $self->_create_project(
52
+          $user,
53
+          $project,
54
+          {
55
+            original_user => $original_user,
56
+            original_project => $project,
57
+            original_pid => $original_pid
58
+          }
59
+        );
60
+      };
61
+      croak $error = $@ if $@;
62
+      
63
+      # Create repository
64
+      eval {
65
+        $self->_fork_rep($original_user, $project, $user, $project);
66
+      };
67
+      croak $error = $@ if $@;
68
+    });
69
+  };
70
+  croak $error if $@;
71
+}
72
+
33 73
 sub is_admin {
34 74
   my ($self, $user) = @_;
35 75
   
... ...
@@ -162,12 +202,23 @@ sub original_user {
162 202
   return $original_user;
163 203
 }
164 204
 
205
+sub projects {
206
+  my ($self, $user) = @_;
207
+
208
+  # Projects
209
+  my $projects = $self->app->dbi->model('project')->select(
210
+    where => {user_id => $user},
211
+    append => 'order by name'
212
+  )->all;
213
+  
214
+  return $projects;
215
+}
216
+
165 217
 sub users {
166 218
   my $self = shift;
167 219
   
168 220
   # Users
169 221
   my $users = $self->app->dbi->model('user')->select(
170
-    'id',
171 222
     where => [':admin{<>}',{admin => 1}],
172 223
     append => 'order by id'
173 224
   )->all;
... ...
@@ -175,119 +226,22 @@ sub users {
175 226
   return $users;
176 227
 }
177 228
 
178
-sub _delete_db_user {
179
-  my ($self, $user) = @_;
180
-  
181
-  # Delete database user
182
-  $self->app->dbi->model('user')->delete(id => $user);
183
-}
184
-
185
-sub _delete_user_dir {
186
-  my ($self, $user) = @_;
187
-  
188
-  # Delete user directory
189
-  my $rep_home = $self->app->git->rep_home;
190
-  my $user_dir = "$rep_home/$user";
191
-  rmtree $user_dir;
192
-}
193
-
194
-sub _create_db_user {
195
-  my ($self, $user, $data) = @_;
196
-  
197
-  # Create database user
198
-  $self->app->dbi->model('user')->insert($data, id => $user);
199
-}
200
-
201
-sub _create_user_dir {
202
-  my ($self, $user) = @_;
203
-  
204
-  # Create user directory
205
-  my $rep_home = $self->app->git->rep_home;
206
-  my $user_dir = "$rep_home/$user";
207
-  mkpath $user_dir;
208
-}
209
-
210
-sub fork_project {
211
-  my ($self, $user, $original_user, $project) = @_;
212
-  
213
-  # DBI
214
-  my $dbi = $self->app->dbi;
215
-  
216
-  # Fork project
217
-  my $error;
218
-  eval {
219
-    $dbi->connector->txn(sub {
220
-      
221
-      # Original project id
222
-      my $original_pid = $dbi->model('project')
223
-        ->select('original_pid', id => [$original_user, $project])->value;
224
-      
225
-      croak "Can't get original project id"
226
-        unless defined $original_pid && $original_pid > 0;
227
-      
228
-      # Create project
229
-      eval {
230
-        $self->_create_project(
231
-          $user,
232
-          $project,
233
-          {
234
-            original_user => $original_user,
235
-            original_project => $project,
236
-            original_pid => $original_pid
237
-          }
238
-        );
239
-      };
240
-      croak $error = $@ if $@;
241
-      
242
-      # Create repository
243
-      eval {
244
-        $self->_fork_rep($original_user, $project, $user, $project);
245
-      };
246
-      croak $error = $@ if $@;
247
-    });
248
-  };
249
-  croak $error if $@;
250
-}
251
-
252
-sub _fork_rep {
253
-  my ($self, $user, $project, $to_user, $to_project) = @_;
254
-  
255
-  # Git
256
-  my $git = $self->app->git;
257
-  
258
-  # Git clone
259
-  my $rep = $git->rep($user, $project);
260
-  my $to_rep = $git->rep($to_user, $to_project);
261
-  my @git_clone_cmd = (
262
-    $git->bin,
263
-    'clone',
264
-    '-q',
265
-    '--bare',
266
-    $rep,
267
-    $to_rep
268
-  );
269
-  system(@git_clone_cmd) == 0
270
-    or croak "Can't execute git clone";
271
-}
272
-
273 229
 sub rename_project {
274
-  my ($self, $user, $project, $renamed_project) = @_;
230
+  my ($self, $user, $project, $to_project) = @_;
275 231
   
232
+  # Rename project
276 233
   my $git = $self->app->git;
277 234
   my $dbi = $self->app->dbi;
278
-  
279 235
   my $error = {};
280
-  
281
-  if ($self->exists_project($user, $renamed_project)
282
-    || $self->_exists_rep($user, $renamed_project))
236
+  if ($self->exists_project($user, $to_project))
283 237
   {
284 238
     $error->{message} = 'Already exists';
285 239
     return $error;
286 240
   }
287 241
   else {
288 242
     $dbi->connector->txn(sub {
289
-      $self->_rename_project($user, $project, $renamed_project);
290
-      $self->_rename_rep($user, $project, $renamed_project);
243
+      $self->_rename_project($user, $project, $to_project);
244
+      $self->_rename_rep($user, $project, $to_project);
291 245
     });
292 246
     if ($@) {
293 247
       $error->{message} = 'Rename failed';
... ...
@@ -535,6 +489,38 @@ sub _create_rep {
535 489
   }
536 490
 }
537 491
 
492
+sub _create_db_user {
493
+  my ($self, $user, $data) = @_;
494
+  
495
+  # Create database user
496
+  $self->app->dbi->model('user')->insert($data, id => $user);
497
+}
498
+
499
+sub _create_user_dir {
500
+  my ($self, $user) = @_;
501
+  
502
+  # Create user directory
503
+  my $rep_home = $self->app->git->rep_home;
504
+  my $user_dir = "$rep_home/$user";
505
+  mkpath $user_dir;
506
+}
507
+
508
+sub _delete_db_user {
509
+  my ($self, $user) = @_;
510
+  
511
+  # Delete database user
512
+  $self->app->dbi->model('user')->delete(id => $user);
513
+}
514
+
515
+sub _delete_user_dir {
516
+  my ($self, $user) = @_;
517
+  
518
+  # Delete user directory
519
+  my $rep_home = $self->app->git->rep_home;
520
+  my $user_dir = "$rep_home/$user";
521
+  rmtree $user_dir;
522
+}
523
+
538 524
 sub _delete_project {
539 525
   my ($self, $user, $project) = @_;
540 526
   
... ...
@@ -571,6 +557,25 @@ sub _exists_rep {
571 557
   return -e $rep;
572 558
 }
573 559
 
560
+sub _fork_rep {
561
+  my ($self, $user, $project, $to_user, $to_project) = @_;
562
+  
563
+  # Git clone
564
+  my $git = $self->app->git;
565
+  my $rep = $git->rep($user, $project);
566
+  my $to_rep = $git->rep($to_user, $to_project);
567
+  my @cmd = (
568
+    $git->bin,
569
+    'clone',
570
+    '-q',
571
+    '--bare',
572
+    $rep,
573
+    $to_rep
574
+  );
575
+  system(@cmd) == 0
576
+    or croak "Can't fork repository: @cmd";
577
+}
578
+
574 579
 sub _rename_project {
575 580
   my ($self, $user, $project, $renamed_project) = @_;
576 581
   
+1 -1
templates/project.html.ep
... ...
@@ -109,7 +109,7 @@
109 109
     % }
110 110
     
111 111
     %= include '/include/project_header';
112
-
112
+    
113 113
     <h3 style="margin:20px 0px 20px 0;font-size:16px;line-height:0">
114 114
       <%= $desc %>
115 115
     </h3>
+2 -2
templates/settings.html.ep
... ...
@@ -2,7 +2,7 @@
2 2
   my $api = gitprep_api;
3 3
   my $logined = $api->logined;
4 4
   my $user_is_valid = $logined && $user eq session('user');
5
-  my $default_branch = app->manager->default_branch($user, $project);
5
+  my $default_branch_name = app->manager->default_branch($user, $project);
6 6
 
7 7
   my $git = app->git;
8 8
 
... ...
@@ -217,7 +217,7 @@
217 217
         Default Branch
218 218
         % my $branches = $git->branches($user, $project);
219 219
         % my $branch_names = [map { $_->{name} } @$branches];
220
-        % push @$branch_names, $default_branch->{name} unless @$branch_names;
220
+        % push @$branch_names, $default_branch_name unless @$branch_names;
221 221
         %= select_field 'default_branch' => $branch_names, style => 'margin-top:5px';
222 222
       </div>
223 223
     </div>
+17 -3
templates/user.html.ep
... ...
@@ -3,13 +3,20 @@
3 3
   if (my $deleted_project = param('deleted_project')) {
4 4
     flash('deleted_project', $deleted_project);
5 5
     $self->redirect_to('current');
6
-    return 1;
6
+    $self->finish_rendering;
7
+    return;
7 8
   }
8 9
   
9 10
   my $user = param('user');
10 11
   
11 12
   # Projects
12
-  my $reps = app->git->projects($user);
13
+  my $projects = app->manager->projects($user);
14
+  my $reps = [];
15
+  for my $project (@$projects) {
16
+    my $rep = app->git->repository($user, $project->{name}) || {none => 1};
17
+    $rep->{name} = $project->{name};
18
+    push $reps, $rep;
19
+  }
13 20
 %>
14 21
 
15 22
 % layout 'common';
... ...
@@ -51,7 +58,14 @@
51 58
                 <%= $rep->{description} %>
52 59
               </td>
53 60
               % my $age = $rep->{age_string};
54
-              <td class="muted"><%= $age ? "last updated $age" : 'new repository' %></td>
61
+              <td class="muted">
62
+                % if ($rep->{none}) {
63
+                  <span style="color:red">Repository not exists</span>
64
+                  <a class="btn btn-mini">Delete</a>
65
+                % } else {
66
+                  <%= $age ? "last updated $age" : 'new repository' %>
67
+                % }
68
+              </td>
55 69
             </div>
56 70
           </tr>
57 71
         % }