forked from carlosmn/git-httpd
-
Notifications
You must be signed in to change notification settings - Fork 0
/
git-httpd.py
executable file
·64 lines (54 loc) · 2.07 KB
/
git-httpd.py
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
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#Copyright (c) 2012, Carlos Martín Nieto <[email protected]>
#
#Permission to use, copy, modify, and/or distribute this software for
#any purpose with or without fee is hereby granted, provided that the
#above copyright notice and this permission notice appear in all
#copies.
#
#THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
#WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
#WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
#AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
#DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
#PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
#TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
#PERFORMANCE OF THIS SOFTWARE.
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
import mimetypes, os
import pygit2 as git
REPO_NAME = os.getenv('HOME') + "/git/libgit2/"
REF_NAME = 'refs/heads/gh-pages'
repo = git.Repository(REPO_NAME)
mimetypes.init()
class git_httpd(BaseHTTPRequestHandler):
def not_found(self):
self.send_response(404)
self.send_header('Content-Type', 'text/plain')
self.end_headers()
o = self.wfile
o.write('404 File Not Found')
def send_blob(self, entry):
(type, encoding) = mimetypes.guess_type(entry.name)
self.send_response(200)
self.send_header('Content-Type', type)
self.end_headers()
o = self.wfile
o.write(repo[entry.oid].data)
def do_GET(self):
if self.path[-1:] == '/': # catch trailing slahes
self.path += 'index.html'
self.path = self.path[1:] # and remove the first one
oid = repo.lookup_reference(REF_NAME).resolve().target
tree = repo[oid].tree
try:
entry = tree[self.path]
return self.send_blob(entry)
except KeyError:
return self.not_found()
try:
server = HTTPServer(('', 8080), git_httpd)
server.serve_forever()
except KeyboardInterrupt:
server.socket.close()