Showing 3 changed files with 63 additions and 55 deletions
+3 -55
lib/Gitprep.pm
... ...
@@ -24,6 +24,7 @@ has 'dbi';
24 24
 has 'git';
25 25
 has 'manager';
26 26
 has 'validator';
27
+has 'smart_http';
27 28
 
28 29
 use constant BUFFER_SIZE => 8192;
29 30
 
... ...
@@ -186,63 +187,10 @@ sub startup {
186 187
           my $r = $r->route('/(:project).git', project => $id_re);
187 188
           
188 189
           my $sh = Gitprep::SmartHTTP->new;
190
+          $self->smart_http($sh);
189 191
           
190 192
           # Fetch
191
-          $r->get('/info/refs')->to(cb => sub {
192
-            my $self = shift;
193
-            
194
-            my $service = $self->param('service') || '';
195
-            
196
-            my $user = $self->param('user');
197
-            my $project = $self->param('project');
198
-            
199
-            if ($service eq 'git-upload-pack') {
200
-              
201
-              my $rep = $git->rep($user, $project);
202
-              my @cmd = $git->cmd($user, $project, 'upload-pack', '--stateless-rpc', '--advertise-refs', $rep);
203
-              
204
-              warn "@cmd";
205
-              
206
-              use IPC::Open3 'open3';
207
-              use Symbol 'gensym';
208
-              my ($cout, $cerr) = (gensym, gensym );
209
-              my $pid = open3(my $cin, $cout, $cerr, @cmd );
210
-              close $cin;
211
-              my ( $refs, $err, $buf ) = ( '', '', '' );
212
-              my $s = IO::Select->new( $cout, $cerr );
213
-              while (my @ready = $s->can_read) {
214
-                for my $handle (@ready) {
215
-                  while ( sysread( $handle, $buf, BUFFER_SIZE ) ) {
216
-                    if ( $handle == $cerr ) {
217
-                      $err .= $buf;
218
-                    }
219
-                    else {
220
-                      $refs .= $buf;
221
-                    }
222
-                  }
223
-                  $s->remove($handle) if eof($handle);
224
-                }
225
-              }
226
-              close $cout;
227
-              close $cerr;
228
-              waitpid($pid, 0);
229
-
230
-              if ($err) {
231
-                app->log->error($err);
232
-                $self->render_exception($err);
233
-              }
234
-              
235
-              $self->res->headers->content_type('application/x-git-upload-pack-advertisement');
236
-              
237
-              my $data =
238
-                $sh->pkt_write("# service=git-upload-pack\n") . $sh->pkt_flush() . $refs;
239
-              
240
-              $self->render(data => $data);
241
-            }
242
-            else {
243
-              $sh->dumb_info_refs;
244
-            }
245
-          });
193
+          $r->get('/info/refs' => template 'info-refs');
246 194
 
247 195
           # $r->post('/git-upload-pack');
248 196
           # $r->post('/git-receive-pack');
+2
lib/Gitprep/SmartHTTP.pm
... ...
@@ -10,6 +10,8 @@ use IO::Uncompress::Gunzip qw($GunzipError);
10 10
 
11 11
 use constant BUFFER_SIZE => 8192;
12 12
 
13
+has buffer_size => 8192;
14
+
13 15
 our $VERSION = '0.05';
14 16
 my @SERVICES = (
15 17
     [ 'POST', 'service_rpc', qr{(.*?)/git-upload-pack$},  'upload-pack' ],
+58
templates/info-refs.html.ep
... ...
@@ -0,0 +1,58 @@
1
+<%
2
+  use IPC::Open3 ();;
3
+  use Symbol ();
4
+
5
+  my $service = param('service') || '';
6
+  my $user = param('user');
7
+  my $project = param('project');
8
+  my $git = app->git;
9
+  my $sh = app->smart_http;
10
+
11
+  if ($service eq 'git-upload-pack') {
12
+    
13
+    my $rep = $git->rep($user, $project);
14
+    my @cmd = $git->cmd($user, $project, 'upload-pack', '--stateless-rpc', '--advertise-refs', $rep);
15
+    
16
+    my ($cout, $cerr) = (Symbol::gensym, Symbol::gensym);
17
+    my $pid = IPC::Open3::open3(my $cin, $cout, $cerr, @cmd );
18
+    close $cin;
19
+    my ( $refs, $err, $buf ) = ( '', '', '' );
20
+    my $s = IO::Select->new( $cout, $cerr );
21
+    my $buffer_size = $sh->buffer_size;
22
+    while (my @ready = $s->can_read) {
23
+      for my $handle (@ready) {
24
+        while (sysread($handle, $buf,$buffer_size)) {
25
+          if ($handle == $cerr) {
26
+            $err .= $buf;
27
+          }
28
+          else {
29
+            $refs .= $buf;
30
+          }
31
+        }
32
+        $s->remove($handle) if eof($handle);
33
+      }
34
+    }
35
+    close $cout;
36
+    close $cerr;
37
+    waitpid($pid, 0);
38
+
39
+    if ($err) {
40
+      app->log->error($err);
41
+      $self->render_exception($err);
42
+      return;
43
+    }
44
+    
45
+    $self->res->headers->content_type('application/x-git-upload-pack-advertisement');
46
+    
47
+    my $data =
48
+      $sh->pkt_write("# service=git-upload-pack\n") . $sh->pkt_flush() . $refs;
49
+    
50
+    warn $data;
51
+    
52
+    $self->render(data => $data);
53
+    return;
54
+  }
55
+  else {
56
+    $sh->dumb_info_refs;
57
+  }
58
+%>