cmdpath = os.path.join(exepath, 'cmd')
sys.path[:0] = [libpath]
os.environ['PYTHONPATH'] = libpath + ':' + os.environ.get('PYTHONPATH', '')
+os.environ['BUP_MAIN_EXE'] = os.path.abspath(exe)
from bup.helpers import *
ftp = 'Browse backup sets using an ftp-like client',
fsck = 'Check backup sets for damage and add redundancy information',
fuse = 'Mount your backup sets as a filesystem',
+ help = 'Print detailed help for the given command',
index = 'Create or display the index of files to back up',
- join = 'The reverse operation to "bup split"',
+ join = 'Retrieve a file backed up using "bup split"',
ls = 'Browse the files in your backup sets',
midx = 'Index objects to speed up future backups',
save = 'Save files into a backup set (note: run "bup index" first)',
def force_tty():
if fix_stdout or fix_stderr:
- os.environ['BUP_FORCE_TTY'] = '1'
+ amt = (fix_stdout and 1 or 0) + (fix_stderr and 2 or 0)
+ os.environ['BUP_FORCE_TTY'] = str(amt)
+ os.setsid() # make sure ctrl-c is sent just to us, not to child too
if fix_stdout or fix_stderr:
realf = fix_stderr and 2 or 1
n = subprocess.Popen([subpath('newliner')],
stdin=subprocess.PIPE, stdout=os.dup(realf),
close_fds=True, preexec_fn=force_tty)
- outf = fix_stdout and n.stdin.fileno() or 1
- errf = fix_stderr and n.stdin.fileno() or 2
+ outf = fix_stdout and n.stdin.fileno() or None
+ errf = fix_stderr and n.stdin.fileno() or None
else:
n = None
- outf = 1
- errf = 2
+ outf = None
+ errf = None
class SigException(Exception):
- pass
+ def __init__(self, signum):
+ self.signum = signum
+ Exception.__init__(self, 'signal %d received' % signum)
def handler(signum, frame):
- raise SigException('signal %d received' % signum)
+ raise SigException(signum)
signal.signal(signal.SIGTERM, handler)
signal.signal(signal.SIGINT, handler)
ret = 95
+p = None
+killsig = signal.SIGTERM
try:
try:
p = subprocess.Popen([subpath(subcmd)] + argv[2:],
log('%s: %s\n' % (subpath(subcmd), e))
ret = 98
except SigException, e:
+ log('\nbup: %s\n' % e)
+ killsig = e.signum
ret = 94
finally:
if p and p.poll() == None:
- os.kill(p.pid, signal.SIGTERM)
+ os.kill(p.pid, killsig)
p.wait()
if n:
n.stdin.close()