Showing 5 changed files with 191 additions and 2 deletions
+6 -1
lib/Gitpub.pm
... ...
@@ -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;
+77
lib/Gitpub/Main.pm
... ...
@@ -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
 
+5 -1
public/gitweb.css
... ...
@@ -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
 }
+22
templates/include/new_header.html.ep
... ...
@@ -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"/>
+81
templates/main/repository.html.ep
... ...
@@ -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>