... | ... |
@@ -132,27 +132,6 @@ sub fill_from_file_info { |
132 | 132 |
return $diff; |
133 | 133 |
} |
134 | 134 |
|
135 |
-sub fill_projects { |
|
136 |
- my ($self, $home, $ps) = @_; |
|
137 |
- |
|
138 |
- # Fill project info |
|
139 |
- my @projects; |
|
140 |
- for my $project (@$ps) { |
|
141 |
- my (@activity) = $self->last_activity("$home/$project->{path}"); |
|
142 |
- next unless @activity; |
|
143 |
- ($project->{age}, $project->{age_string}) = @activity; |
|
144 |
- if (!defined $project->{descr}) { |
|
145 |
- my $descr = $self->project_description("$home/$project->{path}") || ''; |
|
146 |
- $project->{descr_long} = $descr; |
|
147 |
- $project->{descr} = $self->_chop_str($descr, 25, 5); |
|
148 |
- } |
|
149 |
- |
|
150 |
- push @projects, $project; |
|
151 |
- } |
|
152 |
- |
|
153 |
- return \@projects; |
|
154 |
-} |
|
155 |
- |
|
156 | 135 |
sub difftree { |
157 | 136 |
my ($self, $project, $cid, $parent, $parents) = @_; |
158 | 137 |
|
... | ... |
@@ -330,6 +309,16 @@ sub project_description { |
330 | 309 |
return $description; |
331 | 310 |
} |
332 | 311 |
|
312 |
+sub repository_description { |
|
313 |
+ my ($self, $rep) = @_; |
|
314 |
+ |
|
315 |
+ # Description |
|
316 |
+ my $file = "$rep/description"; |
|
317 |
+ my $description = $self->_slurp($file) || ''; |
|
318 |
+ |
|
319 |
+ return $description; |
|
320 |
+} |
|
321 |
+ |
|
333 | 322 |
sub last_activity { |
334 | 323 |
my ($self, $project) = @_; |
335 | 324 |
|
... | ... |
@@ -387,25 +376,6 @@ sub project_urls { |
387 | 376 |
return \@urls; |
388 | 377 |
} |
389 | 378 |
|
390 |
-sub projects { |
|
391 |
- my ($self, $home, %opt) = @_; |
|
392 |
- |
|
393 |
- my $filter = $opt{filter}; |
|
394 |
- |
|
395 |
- # Projects |
|
396 |
- opendir my $dh, $self->enc($home) |
|
397 |
- or croak qq/Can't open directory $home: $!/; |
|
398 |
- my @projects; |
|
399 |
- while (my $project = readdir $dh) { |
|
400 |
- next unless $project =~ /\.git$/; |
|
401 |
- next unless $self->check_head_link("$home/$project"); |
|
402 |
- next if defined $filter && $project !~ /\Q$filter\E/; |
|
403 |
- push @projects, { path => $project }; |
|
404 |
- } |
|
405 |
- |
|
406 |
- return \@projects; |
|
407 |
-} |
|
408 |
- |
|
409 | 379 |
sub references { |
410 | 380 |
my ($self, $project, $type) = @_; |
411 | 381 |
|
... | ... |
@@ -430,6 +400,60 @@ sub references { |
430 | 400 |
return \%refs; |
431 | 401 |
} |
432 | 402 |
|
403 |
+sub fill_repositories { |
|
404 |
+ my ($self, $home, $ps) = @_; |
|
405 |
+ |
|
406 |
+ # Fill rep info |
|
407 |
+ my @resp; |
|
408 |
+ for my $rep (@$ps) { |
|
409 |
+ my (@activity) = $self->last_activity("$home/$rep->{path}"); |
|
410 |
+ next unless @activity; |
|
411 |
+ ($rep->{age}, $rep->{age_string}) = @activity; |
|
412 |
+ if (!defined $rep->{descr}) { |
|
413 |
+ my $descr = $self->repository_description("$home/$rep->{path}") || ''; |
|
414 |
+ $rep->{descr_long} = $descr; |
|
415 |
+ $rep->{descr} = $self->_chop_str($descr, 25, 5); |
|
416 |
+ } |
|
417 |
+ |
|
418 |
+ push @resp, $rep; |
|
419 |
+ } |
|
420 |
+ |
|
421 |
+ return \@resp; |
|
422 |
+} |
|
423 |
+ |
|
424 |
+sub repositories { |
|
425 |
+ my ($self, $dir, %opt) = @_; |
|
426 |
+ |
|
427 |
+ my $filter = $opt{filter}; |
|
428 |
+ |
|
429 |
+ # Repositories |
|
430 |
+ opendir my $dh, $self->enc($dir) |
|
431 |
+ or croak qq/Can't open directory $dir: $!/; |
|
432 |
+ my @reps; |
|
433 |
+ while (my $rep = readdir $dh) { |
|
434 |
+ next unless $rep =~ /\.git$/; |
|
435 |
+ next unless $self->check_head_link("$dir/$rep"); |
|
436 |
+ next if defined $filter && $rep !~ /\Q$filter\E/; |
|
437 |
+ my $rep_name = $rep; |
|
438 |
+ $rep_name =~ s/\.git$//; |
|
439 |
+ push @reps, { name => $rep_name, path => $rep }; |
|
440 |
+ } |
|
441 |
+ |
|
442 |
+ # Fill repositroies information |
|
443 |
+ for my $rep (@reps) { |
|
444 |
+ my (@activity) = $self->last_activity("$dir/$rep->{path}"); |
|
445 |
+ next unless @activity; |
|
446 |
+ ($rep->{age}, $rep->{age_string}) = @activity; |
|
447 |
+ if (!defined $rep->{descr}) { |
|
448 |
+ my $descr = $self->repository_description("$dir/$rep->{path}") || ''; |
|
449 |
+ $rep->{descr_long} = $descr; |
|
450 |
+ $rep->{descr} = $self->_chop_str($descr, 25, 5); |
|
451 |
+ } |
|
452 |
+ } |
|
453 |
+ |
|
454 |
+ return \@reps; |
|
455 |
+} |
|
456 |
+ |
|
433 | 457 |
sub short_id { |
434 | 458 |
my ($self, $project) = (shift, shift); |
435 | 459 |
|
... | ... |
@@ -401,69 +401,19 @@ sub log { |
401 | 401 |
); |
402 | 402 |
}; |
403 | 403 |
|
404 |
-sub projects { |
|
405 |
- my $self = shift; |
|
406 |
- |
|
407 |
- # Parameters |
|
408 |
- my $home_ns = $self->param('home'); |
|
409 |
- my $home = "/$home_ns"; |
|
410 |
- |
|
411 |
- # Git |
|
412 |
- my $git = $self->app->git; |
|
413 |
- |
|
414 |
- # Fill project information |
|
415 |
- my $projects = $git->projects($home); |
|
416 |
- $projects = $git->fill_projects($home, $projects); |
|
417 |
- |
|
418 |
- # Fill owner and HEAD commit id |
|
419 |
- for my $project (@$projects) { |
|
420 |
- my $pname = "$home/$project->{path}"; |
|
421 |
- $project->{path_abs_ns} = "$home_ns/$project->{path}"; |
|
422 |
- $project->{owner} = $git->project_owner($pname); |
|
423 |
- my $head_commit = $git->parse_commit($pname, 'HEAD'); |
|
424 |
- $project->{head_id} = $head_commit->{id} |
|
425 |
- } |
|
426 |
- |
|
427 |
- # Render |
|
428 |
- $self->render( |
|
429 |
- home => $home, |
|
430 |
- home_ns => $home_ns, |
|
431 |
- projects => $projects |
|
432 |
- ); |
|
433 |
-} |
|
434 |
- |
|
435 | 404 |
has 'root' => '/gitpub'; |
436 | 405 |
|
437 | 406 |
sub repositories { |
438 | 407 |
my $self = shift; |
439 | 408 |
|
440 | 409 |
my $root = $self->root; |
410 |
+ my $user = $self->param('user'); |
|
441 | 411 |
|
442 |
- # Parameters |
|
443 |
- my $home_ns = 'gitpub/' . $self->param('user'); |
|
444 |
- my $home = "/$home_ns"; |
|
445 |
- |
|
446 |
- # Git |
|
447 |
- my $git = $self->app->git; |
|
448 |
- |
|
449 |
- # Fill project information |
|
450 |
- my $projects = $git->projects($home); |
|
451 |
- $projects = $git->fill_projects($home, $projects); |
|
452 |
- |
|
453 |
- # Fill owner and HEAD commit id |
|
454 |
- for my $project (@$projects) { |
|
455 |
- my $pname = "$home/$project->{path}"; |
|
456 |
- $project->{path_abs_ns} = "$home_ns/$project->{path}"; |
|
457 |
- my $head_commit = $git->parse_commit($pname, 'HEAD'); |
|
458 |
- $project->{head_id} = $head_commit->{id} |
|
459 |
- } |
|
412 |
+ # Repositories |
|
413 |
+ my $reps = $self->app->git->repositories("/$root/$user"); |
|
460 | 414 |
|
461 | 415 |
# Render |
462 |
- $self->render( |
|
463 |
- home => $home, |
|
464 |
- home_ns => $home_ns, |
|
465 |
- projects => $projects |
|
466 |
- ); |
|
416 |
+ $self->render(reps => $reps); |
|
467 | 417 |
} |
468 | 418 |
|
469 | 419 |
sub snapshot { |
... | ... |
@@ -1,42 +0,0 @@ |
1 |
-% layout 'common'; |
|
2 |
- %= include '/include/header', title => 'Projects'; |
|
3 |
- <table class="project_list"> |
|
4 |
- <a href="<%= url_for '/' %>">home</a> > |
|
5 |
- <a href="<%= url_for('projects', home => $home_ns) %>"><%= $home %></a> |
|
6 |
- <tr> |
|
7 |
- <th>Project</th> |
|
8 |
- <th>Description</th> |
|
9 |
- <th>Owner</th> |
|
10 |
- <th>Last Change</th> |
|
11 |
- <th></th> |
|
12 |
- </tr> |
|
13 |
- % my $toggle = 0; |
|
14 |
- % for my $project (@$projects) { |
|
15 |
- % my $pname = $project->{path}; |
|
16 |
- % my $pname_ns = $project->{path_abs_ns}; |
|
17 |
- <tr class="<%= $toggle++ ? 'light' : 'dark' %>"> |
|
18 |
- <td> |
|
19 |
- <a class="list" href="<%= url_for('summary', project => $pname_ns) %>"> |
|
20 |
- <%= $project->{path} %> |
|
21 |
- </a> |
|
22 |
- </td> |
|
23 |
- <td> |
|
24 |
- <a class="list" title="<%= $project->{descr_long} %>" |
|
25 |
- href="<%= url_for('summary', project => $pname_ns) %>"> |
|
26 |
- <%= $project->{descr} %> |
|
27 |
- </a> |
|
28 |
- </td> |
|
29 |
- <td><i><%= $project->{owner} %></i></td> |
|
30 |
- <td class="age2"><%= $project->{age_string} %></td> |
|
31 |
- <td class="link"> |
|
32 |
- <a href="<%= url_for('summary', project => $pname_ns) %>">summary</a> | |
|
33 |
- <a href="<%= url_for('shortlog', project => $pname_ns) %>">shortlog</a> | |
|
34 |
- <a href="<%= url_for('log', project => $pname_ns) %>">log</a> | |
|
35 |
- <a href="<%= url_for('tree', project => $pname_ns) %>"> |
|
36 |
- tree |
|
37 |
- </a> |
|
38 |
- </td> |
|
39 |
- </tr> |
|
40 |
- % } |
|
41 |
- </table> |
|
42 |
- <div class="page_footer"></div> |
... | ... |
@@ -10,19 +10,18 @@ |
10 | 10 |
<th></th> |
11 | 11 |
</tr> |
12 | 12 |
% my $toggle = 0; |
13 |
- % for my $project (@$projects) { |
|
14 |
- % my $pname = $project->{path}; |
|
15 |
- % my $pname_ns = $project->{path_abs_ns}; |
|
13 |
+ % for my $rep (@$reps) { |
|
14 |
+ % my $pname = $rep->{name}; |
|
16 | 15 |
<tr class="<%= $toggle++ ? 'light' : 'dark' %>"> |
17 | 16 |
<td> |
18 |
- <a class="list" href="<%= url_for('tree', project => $pname_ns) %>"> |
|
19 |
- <%= $project->{path} %> |
|
17 |
+ <a class="list" href="<%= url_for("/$user/$pname") %>"> |
|
18 |
+ <%= $rep->{name} %> |
|
20 | 19 |
</a> |
21 | 20 |
</td> |
22 | 21 |
<td> |
23 |
- <%= $project->{descr} %> |
|
22 |
+ <%= $rep->{descr} %> |
|
24 | 23 |
</td> |
25 |
- <td class="age2"><%= $project->{age_string} %></td> |
|
24 |
+ <td class="age2"><%= $rep->{age_string} %></td> |
|
26 | 25 |
</tr> |
27 | 26 |
% } |
28 | 27 |
</table> |