]> arthur.barton.de Git - bup.git/blobdiff - lib/bup/cmd/web.py
Update base_version to 0.34~ for 0.34 development
[bup.git] / lib / bup / cmd / web.py
old mode 100755 (executable)
new mode 100644 (file)
index 83c7ca6..c609d87
@@ -1,14 +1,13 @@
 
 from __future__ import absolute_import, print_function
 from collections import namedtuple
-import mimetypes, os, posixpath, signal, stat, sys, time, urllib, webbrowser
+import mimetypes, os, posixpath, signal, stat, sys, time, webbrowser
 from binascii import hexlify
 
 
 from bup import options, git, vfs
-from bup.helpers import (chunkyreader, debug1, format_filesize, handle_ctrl_c,
+from bup.helpers import (chunkyreader, debug1, format_filesize,
                          log, saved_errors)
-from bup.metadata import Metadata
 from bup.path import resource_path
 from bup.repo import LocalRepo
 from bup.io import path_msg
@@ -65,7 +64,7 @@ def _dir_contents(repo, resolution, show_hidden=False):
 
     url_query = b'?hidden=1' if show_hidden else b''
 
-    def display_info(name, item, resolved_item, display_name=None):
+    def display_info(name, item, resolved_item, display_name=None, omitsize=False):
         global opt
         # link should be based on fully resolved type to avoid extra
         # HTTP redirect.
@@ -74,32 +73,36 @@ def _dir_contents(repo, resolution, show_hidden=False):
             link += '/'
         link = link.encode('ascii')
 
-        size = vfs.item_size(repo, item)
-        if opt.human_readable:
-            display_size = format_filesize(size)
+        if not omitsize:
+            size = vfs.item_size(repo, item)
+            if opt.human_readable:
+                display_size = format_filesize(size)
+            else:
+                display_size = size
         else:
-            display_size = size
+            display_size = None
 
         if not display_name:
             mode = vfs.item_mode(item)
             if stat.S_ISDIR(mode):
                 display_name = name + b'/'
+                display_size = None
             elif stat.S_ISLNK(mode):
                 display_name = name + b'@'
+                display_size = None
             else:
                 display_name = name
 
         return display_name, link + url_query, display_size
 
-    dir_item = resolution[-1][1]    
+    dir_item = resolution[-1][1]
     for name, item in vfs.contents(repo, dir_item):
         if not show_hidden:
             if (name not in (b'.', b'..')) and name.startswith(b'.'):
                 continue
         if name == b'.':
-            yield display_info(name, item, item, b'.')
             parent_item = resolution[-2][1] if len(resolution) > 1 else dir_item
-            yield display_info(b'..', parent_item, parent_item, b'..')
+            yield display_info(b'..', parent_item, parent_item, b'..', omitsize=True)
             continue
         res_item = vfs.ensure_item_has_metadata(repo, item, include_size=True)
         yield display_info(name, item, res_item)
@@ -120,7 +123,7 @@ class BupRequestHandler(tornado.web.RequestHandler):
 
     def head(self, path):
         return self._process_request(path)
-    
+
     def _process_request(self, path):
         print('Handling request for %s' % path)
         sys.stdout.flush()
@@ -161,6 +164,7 @@ class BupRequestHandler(tornado.web.RequestHandler):
             hidden_shown=show_hidden,
             dir_contents=_dir_contents(self.repo, resolution,
                                        show_hidden=show_hidden))
+        return None
 
     @gen.coroutine
     def _get_file(self, repo, path, resolved):
@@ -175,7 +179,7 @@ class BupRequestHandler(tornado.web.RequestHandler):
         ctype = self._guess_type(path)
         self.set_header("Last-Modified", http_date_from_utc_ns(meta.mtime))
         self.set_header("Content-Type", ctype)
-        
+
         self.set_header("Content-Length", str(meta.size))
         assert len(file_item.oid) == 20
         self.set_header("Etag", hexlify(file_item.oid))
@@ -286,30 +290,30 @@ def main(argv):
     except AttributeError:
         sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)
 
-    application = tornado.web.Application([
-        (r"(?P<path>/.*)", BupRequestHandler, dict(repo=LocalRepo())),
-    ], **settings)
-
-    http_server = HTTPServer(application)
-    io_loop_pending = IOLoop.instance()
-
-    if isinstance(address, InetAddress):
-        sockets = tornado.netutil.bind_sockets(address.port, address.host)
-        http_server.add_sockets(sockets)
-        print('Serving HTTP on %s:%d...' % sockets[0].getsockname()[0:2])
-        if opt.browser:
-            browser_addr = 'http://' + address[0] + ':' + str(address[1])
-            io_loop_pending.add_callback(lambda : webbrowser.open(browser_addr))
-    elif isinstance(address, UnixAddress):
-        unix_socket = bind_unix_socket(address.path)
-        http_server.add_socket(unix_socket)
-        print('Serving HTTP on filesystem socket %r' % address.path)
-    else:
-        log('error: unexpected address %r', address)
-        sys.exit(1)
+    with LocalRepo() as repo:
+        handlers = [ (r"(?P<path>/.*)", BupRequestHandler, dict(repo=repo))]
+        application = tornado.web.Application(handlers, **settings)
+
+        http_server = HTTPServer(application)
+        io_loop_pending = IOLoop.instance()
+
+        if isinstance(address, InetAddress):
+            sockets = tornado.netutil.bind_sockets(address.port, address.host)
+            http_server.add_sockets(sockets)
+            print('Serving HTTP on %s:%d...' % sockets[0].getsockname()[0:2])
+            if opt.browser:
+                browser_addr = 'http://' + address[0] + ':' + str(address[1])
+                io_loop_pending.add_callback(lambda : webbrowser.open(browser_addr))
+        elif isinstance(address, UnixAddress):
+            unix_socket = bind_unix_socket(address.path)
+            http_server.add_socket(unix_socket)
+            print('Serving HTTP on filesystem socket %r' % address.path)
+        else:
+            log('error: unexpected address %r', address)
+            sys.exit(1)
 
-    io_loop = io_loop_pending
-    io_loop.start()
+        io_loop = io_loop_pending
+        io_loop.start()
 
     if saved_errors:
         log('WARNING: %d errors encountered while saving.\n' % len(saved_errors))