1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
|
#!/usr/bin/env perl
use strict;
use warnings;
use CGI;
use Switch::Back;
use Template;
use URI::Escape;
use Cwd;
use Data::Dumper;
use Git::Repository;
use lib '.';
BEGIN { require 'config.pl'; }
sub info {
warn join(' ', @_);
}
our $template = Template->new({INCLUDE_PATH => 'template'});
# significant dirs only
sub GN::directories {
my $root = $_[0];
opendir my $dir, $root or die "Cannot open directory '$root': $!";
my @directories;
my %drop = (
'.' => 0,
'..' => 0,
);
foreach (readdir $dir) {
push(@directories, $_) if (-d join('/', $_[0], $_) && ($drop{$_} // 1));
}
closedir $dir;
return \@directories;
}
# probably should output all repos recursively, currently just outputs list of users
sub GN::index { # /
my ($root, $dataref) = @_;
my %data = %$dataref;
my @directories = map { my $i = $_; map { join('/', $i, $_) } @{GN::directories(join('/', $root, $i))} } @{GN::directories($root)};
$data{directories} = \@directories;
if ($data{directories}) { $data{found} = 1; }
return \%data;
}
sub GN::user { # /$username/
my ($root, $dataref) = @_;
my %data = %$dataref;
my @directories = @{GN::directories(join('/', $root, $data{username}))};
$data{directories} = \@directories;
if ($data{directories}) { $data{found} = 1; }
return \%data;
}
sub GN::repository { # /$username/$repository
my ($root, $dataref) = @_;
my %data = %$dataref;
$data{found} = 0;
return \%data;
}
sub serve_template {
my ($file, @rest) = @_;
my %vars = @rest ? @rest : ();
$template->process($file, \%vars)
or info("Template: " . $template->error());
}
my %routes = (
'/' => sub { serve_template("index.tt", @_) },
'/~([a-zA-Z0-9_.]+)' => sub { serve_template("index_user.tt", @_) },
'/~([a-zA-Z0-9_.]+)/([a-zA-Z0-9_.]+)' => sub { serve_template("repository.tt", @_) },
);
my $public = 'git/public';
my $dbfile = 'gorillanest.sqlite3';
my %data = (
found => 0,
);
sub master {
my $cgi = CGI->new;
my %header = (
-Content_Type => 'text/html',
-charset => 'UTF-8',
);
my $method = $ENV{'REQUEST_METHOD'} || '';
my $uri = $ENV{'REQUEST_URI'} || '/';
for my $pattern (keys %routes) {
if ($uri =~ m{^$pattern$}) {
my $handler = $routes{$pattern};
$handler->($uri, $1, $2, $3);
}
}
serve_template("404.tt"); # XXX missing code
}
master() if !caller; 1;
|