]> arthur.barton.de Git - bup.git/blobdiff - lib/bup/ls.py
PackWriter._end: always try to release objcache and parentfd
[bup.git] / lib / bup / ls.py
index 970995dfd7e2a5cedc961ba8e1796a9dc498470e..c70fa4e76ed24b2e449d7897d714fe0be8487d5d 100644 (file)
@@ -3,16 +3,16 @@
 from __future__ import absolute_import
 from binascii import hexlify
 from itertools import chain
-from stat import S_ISDIR, S_ISLNK
-import copy, locale, os.path, stat, sys
+from stat import S_ISDIR
+import os.path
 import posixpath
 
-from bup import metadata, options, vfs, xstat
+from bup import metadata, vfs, xstat
 from bup.compat import argv_bytes
 from bup.io import path_msg
 from bup.options import Options
 from bup.repo import LocalRepo, RemoteRepo
-from bup.helpers import columnate, istty1, last, log
+from bup.helpers import columnate, istty1, log
 
 def item_hash(item, tree_for_commit):
     """If the item is a Commit, return its commit oid, otherwise return
@@ -114,14 +114,19 @@ def within_repo(repo, opt, out, pwd=b''):
                          human_readable=opt.human_readable)
 
     ret = 0
+    want_meta = bool(opt.long_listing or opt.classification)
     pending = []
-    for path in opt.paths:
-        path = posixpath.join(pwd, path)
+    last_n = len(opt.paths) - 1
+    for n, printpath in enumerate(opt.paths):
+        path = posixpath.join(pwd, printpath)
         try:
+            if last_n > 0:
+                out.write(b'%s:\n' % printpath)
+
             if opt.directory:
                 resolved = vfs.resolve(repo, path, follow=False)
             else:
-                resolved = vfs.try_resolve(repo, path)
+                resolved = vfs.try_resolve(repo, path, want_meta=want_meta)
 
             leaf_name, leaf_item = resolved[-1]
             if not leaf_item:
@@ -131,7 +136,7 @@ def within_repo(repo, opt, out, pwd=b''):
                 ret = 1
                 continue
             if not opt.directory and S_ISDIR(vfs.item_mode(leaf_item)):
-                items = vfs.contents(repo, leaf_item)
+                items = vfs.contents(repo, leaf_item, want_meta=want_meta)
                 if opt.show_hidden == 'all':
                     # Match non-bup "ls -a ... /".
                     parent = resolved[-2] if len(resolved) > 1 else resolved[0]
@@ -145,7 +150,7 @@ def within_repo(repo, opt, out, pwd=b''):
                     if opt.l:
                         sub_item = vfs.ensure_item_has_metadata(repo, sub_item,
                                                                 include_size=True)
-                    else:
+                    elif want_meta:
                         sub_item = vfs.augment_item_meta(repo, sub_item,
                                                          include_size=True)
                     line = item_line(sub_item, sub_name)
@@ -155,8 +160,9 @@ def within_repo(repo, opt, out, pwd=b''):
                         out.write(line)
                         out.write(b'\n')
             else:
-                leaf_item = vfs.augment_item_meta(repo, leaf_item,
-                                                  include_size=True)
+                if opt.long_listing:
+                    leaf_item = vfs.augment_item_meta(repo, leaf_item,
+                                                      include_size=True)
                 line = item_line(leaf_item, os.path.normpath(path))
                 if not opt.long_listing and istty1:
                     pending.append(line)
@@ -167,8 +173,12 @@ def within_repo(repo, opt, out, pwd=b''):
             log('bup: %s\n' % ex)
             ret = 1
 
-    if pending:
-        out.write(columnate(pending, b''))
+        if pending:
+            out.write(columnate(pending, b''))
+            pending = []
+
+        if n < last_n:
+            out.write(b'\n')
 
     return ret
 
@@ -183,5 +193,6 @@ def via_cmdline(args, out=None, onabort=None):
     """
     assert out
     opt = opts_from_cmdline(args, onabort=onabort)
-    repo = RemoteRepo(argv_bytes(opt.remote)) if opt.remote else LocalRepo()
-    return within_repo(repo, opt, out)
+    with RemoteRepo(argv_bytes(opt.remote)) if opt.remote \
+         else LocalRepo() as repo:
+        return within_repo(repo, opt, out)