... | ... |
@@ -79,9 +79,13 @@ sub startup { |
79 | 79 |
# Home |
80 | 80 |
$r->get('/')->to('#home'); |
81 | 81 |
|
82 |
- #User |
|
82 |
+ # Repositories |
|
83 | 83 |
$r->get('/:user')->to('#repositories'); |
84 | 84 |
|
85 |
+ # Repository |
|
86 |
+ $r->get('/:user/:repository')->to('#repository'); |
|
87 |
+ |
|
88 |
+=pod |
|
85 | 89 |
# Projects |
86 | 90 |
$r->get('/(*home)/projects')->to('#projects')->name('projects'); |
87 | 91 |
|
... | ... |
@@ -141,6 +145,7 @@ sub startup { |
141 | 145 |
$r->get('/snapshot/(:id)', {id => 'HEAD'}) |
142 | 146 |
->to('#snapshot')->name('snapshot'); |
143 | 147 |
} |
148 |
+=cut |
|
144 | 149 |
|
145 | 150 |
# File cache |
146 | 151 |
$git->search_projects; |
... | ... |
@@ -403,6 +403,83 @@ sub log { |
403 | 403 |
|
404 | 404 |
has 'root' => '/gitpub'; |
405 | 405 |
|
406 |
+sub _root_ns { |
|
407 |
+ my $self = shift; |
|
408 |
+ |
|
409 |
+ my $root = $self->root; |
|
410 |
+ $root =~ s/^\///; |
|
411 |
+ |
|
412 |
+ return $root; |
|
413 |
+} |
|
414 |
+ |
|
415 |
+sub repository { |
|
416 |
+ my $self = shift; |
|
417 |
+ |
|
418 |
+ # Parameters |
|
419 |
+ my $user = $self->param('user'); |
|
420 |
+ my $repository = $self->param('repository'); |
|
421 |
+ my $root_ns = $self->_root_ns; |
|
422 |
+ |
|
423 |
+ my $project_ns = "$root_ns/$user/$repository.git"; |
|
424 |
+ my $project = "/$project_ns"; |
|
425 |
+ my $home_ns = dirname $project_ns; |
|
426 |
+ my $home = "/$home_ns"; |
|
427 |
+ my $id_dir = $self->param('id_dir') || 'master/'; |
|
428 |
+ |
|
429 |
+ # Id and directory |
|
430 |
+ my ($id, $dir) = $self->_parse_id_path($project, $id_dir); |
|
431 |
+ |
|
432 |
+ # Git |
|
433 |
+ my $git = $self->app->git; |
|
434 |
+ |
|
435 |
+ # Tree id |
|
436 |
+ my $tid; |
|
437 |
+ my $commit = $git->parse_commit($project, $id); |
|
438 |
+ unless (defined $tid) { |
|
439 |
+ if (defined $dir && $dir ne '') { |
|
440 |
+ $tid = $git->id_by_path($project, $id, $dir, 'tree'); |
|
441 |
+ } |
|
442 |
+ else { $tid = $commit->{tree} } |
|
443 |
+ } |
|
444 |
+ $self->render_not_found unless defined $tid; |
|
445 |
+ |
|
446 |
+ # Get tree (command "git ls-tree") |
|
447 |
+ my @entries = (); |
|
448 |
+ my $show_sizes = 0; |
|
449 |
+ open my $fh, '-|', $git->cmd($project), 'ls-tree', '-z', |
|
450 |
+ ($show_sizes ? '-l' : ()), $tid |
|
451 |
+ or croak 'Open git-ls-tree failed'; |
|
452 |
+ local $/ = "\0"; |
|
453 |
+ @entries = map { chomp; $git->dec($_) } <$fh>; |
|
454 |
+ close $fh |
|
455 |
+ or croak 404, "Reading tree failed"; |
|
456 |
+ |
|
457 |
+ # Parse tree |
|
458 |
+ my @trees; |
|
459 |
+ for my $line (@entries) { |
|
460 |
+ my $tree = $git->parse_ls_tree_line($line, -z => 1, -l => $show_sizes); |
|
461 |
+ $tree->{mode_str} = $git->_mode_str($tree->{mode}); |
|
462 |
+ push @trees, $tree; |
|
463 |
+ } |
|
464 |
+ |
|
465 |
+ # References |
|
466 |
+ my $refs = $git->references($project); |
|
467 |
+ |
|
468 |
+ # Render |
|
469 |
+ $self->render( |
|
470 |
+ home => $home, |
|
471 |
+ home_ns => $home_ns, |
|
472 |
+ project => $project, |
|
473 |
+ project_ns => $project_ns, |
|
474 |
+ dir => $dir, |
|
475 |
+ id => $id, |
|
476 |
+ tid => $tid, |
|
477 |
+ commit => $commit, |
|
478 |
+ trees => \@trees, |
|
479 |
+ refs => $refs |
|
480 |
+ ); |
|
481 |
+} |
|
482 |
+ |
|
406 | 483 |
sub repositories { |
407 | 484 |
my $self = shift; |
408 | 485 |
|
... | ... |
@@ -1,9 +1,13 @@ |
1 |
+* { |
|
2 |
+ margin:0; |
|
3 |
+ padding:0; |
|
4 |
+} |
|
5 |
+ |
|
1 | 6 |
body { |
2 | 7 |
font-family: sans-serif; |
3 | 8 |
font-size: 100%; |
4 | 9 |
border: solid #d9d8d1; |
5 | 10 |
border-width: 1px; |
6 |
- margin: 10px; |
|
7 | 11 |
background-color: #ffffff; |
8 | 12 |
color: #000000; |
9 | 13 |
} |
... | ... |
@@ -0,0 +1,22 @@ |
1 |
+%= stylesheet begin |
|
2 |
+ #header { |
|
3 |
+ margin-bottom:10px; |
|
4 |
+ border-bottom:1px solid black; |
|
5 |
+ height:40px; |
|
6 |
+ } |
|
7 |
+ |
|
8 |
+ #header li{ |
|
9 |
+ float:left; |
|
10 |
+ padding: 10px 20px; |
|
11 |
+ } |
|
12 |
+% end |
|
13 |
+<div id="header"> |
|
14 |
+ <ul> |
|
15 |
+ <li><a href="<%= url_for('/') %>">Home</a></li> |
|
16 |
+ <li><a href="<%= url_for("/$user") %>"><%= $user %></a></li> |
|
17 |
+ <li><a href="<%= url_for("/new") %>">Create a new repo</a></li> |
|
18 |
+ <li><a href="<%= url_for("/setting/profile") %>">Account setting</a></li> |
|
19 |
+ <li><a href="<%= url_for("/logout") %>">Sign out</a></li> |
|
20 |
+ </ul> |
|
21 |
+</div> |
|
22 |
+<div style="clear:both"/> |
... | ... |
@@ -0,0 +1,81 @@ |
1 |
+% layout 'common'; |
|
2 |
+ %= include '/include/new_header'; |
|
3 |
+ |
|
4 |
+ %= stylesheet begin |
|
5 |
+ #menu-item li { |
|
6 |
+ float:left; |
|
7 |
+ border: 1px solid black; |
|
8 |
+ padding: 10px 20px; |
|
9 |
+ margin-bottom:10px; |
|
10 |
+ } |
|
11 |
+ .clear { |
|
12 |
+ clear:both; |
|
13 |
+ } |
|
14 |
+ % end |
|
15 |
+ |
|
16 |
+ <div> |
|
17 |
+ <a href="<%= url_for("/$user") %>"><%= $user %></a> / <%= $repository %> |
|
18 |
+ </div> |
|
19 |
+ |
|
20 |
+ <ul id="menu-item"> |
|
21 |
+ <li>Code</li> |
|
22 |
+ <li>Issues</li> |
|
23 |
+ <li>Wiki</li> |
|
24 |
+ <li>Admin</li> |
|
25 |
+ </ul> |
|
26 |
+ |
|
27 |
+ <div class="header" style="clear:both"> |
|
28 |
+ <a class="title" href="<%= url_for('commit', project => $project_ns, id => $id) %>"> |
|
29 |
+ <%= $commit->{title} %> |
|
30 |
+ </a> |
|
31 |
+ </div> |
|
32 |
+ |
|
33 |
+ %= include '/include/page_path', project_ns => $project_ns, id => $id, Path => $dir, type => 'tree'; |
|
34 |
+ |
|
35 |
+ <div class="page_body"> |
|
36 |
+ %= include 'include/refs', project => $project_ns, commit => $commit, refs => $refs; |
|
37 |
+ <table class="tree"> |
|
38 |
+ % for (my $i = 0; $i <@$trees; $i++) { |
|
39 |
+ |
|
40 |
+ % my $tree = $trees->[$i]; |
|
41 |
+ % my $type = $tree->{type}; |
|
42 |
+ % my $name = $tree->{name}; |
|
43 |
+ |
|
44 |
+ % my $child_dir = defined $dir && length $dir ? join('/', $dir, $name) : $name; |
|
45 |
+ <tr class="<%= $i % 2 ? 'light' : 'dark' %>"> |
|
46 |
+ <td class="mode"> |
|
47 |
+ <%= $tree->{mode_str} %> |
|
48 |
+ </td> |
|
49 |
+ % my $file = defined $dir ? "$dir/$name" : $name; |
|
50 |
+ % $file =~ s/^\///; |
|
51 |
+ |
|
52 |
+ <td class="list"> |
|
53 |
+ % if ($type eq 'blob') { |
|
54 |
+ <a class="list" href="<%= url_for('blob', project => $project_ns, id_file => "$id/$file") %>"> |
|
55 |
+ <%= $name %> |
|
56 |
+ </a> |
|
57 |
+ % } elsif ($tree) { |
|
58 |
+ <a href="<%= url_for('tree', project => $project_ns, id_dir => "$id/$child_dir") %>"> |
|
59 |
+ <%= $name %> |
|
60 |
+ </a> |
|
61 |
+ % } |
|
62 |
+ </td> |
|
63 |
+ <td class="link"> |
|
64 |
+ % if ($type eq 'blob') { |
|
65 |
+ <a href="<%= url_for('blob', project => $project_ns, id_file => "$id/$file") %>"> |
|
66 |
+ blob |
|
67 |
+ </a> |
|
68 |
+ | |
|
69 |
+ <a href="<%= url_for('blob_plain', project => $project_ns, id_file => "$id/$file") %>"> |
|
70 |
+ raw |
|
71 |
+ </a> |
|
72 |
+ % } elsif ($type eq 'tree') { |
|
73 |
+ <a href="<%= url_for('tree', project => $project_ns, id_dir => "$id/$child_dir") %>"> |
|
74 |
+ tree |
|
75 |
+ </a> |
|
76 |
+ % } |
|
77 |
+ </td> |
|
78 |
+ </tr> |
|
79 |
+ % } |
|
80 |
+ </table> |
|
81 |
+ </div> |