-#!/usr/bin/env python
+#!/bin/sh
+"""": # -*-python-*-
+bup_python="$(dirname "$0")/bup-python" || exit $?
+exec "$bup_python" "$0" ${1+"$@"}
+"""
+# end of bup preamble
# Copyright (C) 2010 Rob Browning
#
# TODO: Add tar-like -C option.
+from __future__ import absolute_import
import sys
from bup import metadata
from bup import options
+from bup.compat import argv_bytes
+from bup.io import byte_stream
from bup.helpers import handle_ctrl_c, log, saved_errors
def open_input(name):
- if not name or name == '-':
- return sys.stdin
- return open(name, 'r')
+ if not name or name == b'-':
+ return byte_stream(sys.stdin)
+ return open(name, 'rb')
def open_output(name):
- if not name or name == '-':
- return sys.stdout
- return open(name, 'w')
+ if not name or name == b'-':
+ sys.stdout.flush()
+ return byte_stream(sys.stdout)
+ return open(name, 'wb')
optspec = """
bup meta --create [OPTION ...] <PATH ...>
+bup meta --list [OPTION ...]
bup meta --extract [OPTION ...]
bup meta --start-extract [OPTION ...]
bup meta --finish-extract [OPTION ...]
handle_ctrl_c()
o = options.Options(optspec)
-(opt, flags, remainder) = o.parse(['--paths', '--symlinks'] + sys.argv[1:])
+(opt, flags, remainder) = o.parse(['--paths', '--symlinks', '--recurse']
+ + sys.argv[1:])
opt.verbose = opt.verbose or 0
opt.quiet = opt.quiet or 0
metadata.verbose = opt.verbose - opt.quiet
+opt.file = argv_bytes(opt.file) if opt.file else None
action_count = sum([bool(x) for x in [opt.create, opt.list, opt.extract,
opt.start_extract, opt.finish_extract,
o.fatal("no paths specified for create")
output_file = open_output(opt.file)
metadata.save_tree(output_file,
- remainder,
+ [argv_bytes(r) for r in remainder],
recurse=opt.recurse,
write_paths=opt.paths,
save_symlinks=opt.symlinks,
if len(remainder) > 0:
o.fatal("cannot specify paths for --list")
src = open_input(opt.file)
- metadata.display_archive(src)
+ metadata.display_archive(src, open_output(b'-'))
elif opt.start_extract:
if len(remainder) > 0:
o.fatal("cannot specify paths for --start-extract")
unset_group = True
for path in remainder:
- f = open(path, 'r')
+ f = open(argv_bytes(path), 'rb')
try:
for m in metadata._ArchiveIterator(f):
if opt.set_uid is not None:
o.fatal("gid must be an integer")
if unset_user:
- m.user = ''
+ m.user = b''
elif opt.set_user is not None:
- m.user = opt.set_user
+ m.user = argv_bytes(opt.set_user)
if unset_group:
- m.group = ''
+ m.group = b''
elif opt.set_group is not None:
- m.group = opt.set_group
+ m.group = argv_bytes(opt.set_group)
m.write(output_file)
finally: