+def is_par2_parallel():
+ # A true result means it definitely allows -t1; a false result is
+ # technically inconclusive, but likely means no.
+ tmpdir = mkdtemp(prefix="bup-fsck")
+ try:
+ canary = tmpdir + '/canary'
+ with open(canary, 'w') as f:
+ print('canary', file=f)
+ p = subprocess.Popen(('par2', 'create', '-qq', '-t1', canary),
+ stderr=PIPE, stdin=nullf)
+ _, err = p.communicate()
+ parallel = p.returncode == 0
+ if opt.verbose:
+ if err != b'Invalid option specified: -t1\n':
+ log('Unexpected par2 error output\n')
+ log(err)
+ if parallel:
+ log('Assuming par2 supports parallel processing\n')
+ else:
+ log('Assuming par2 does not support parallel processing\n')
+ return parallel
+ finally:
+ rmtree(tmpdir)
+
+_par2_parallel = None
+
+def par2(action, args, verb_floor=0):
+ global _par2_parallel
+ if _par2_parallel is None:
+ _par2_parallel = is_par2_parallel()
+ cmd = ['par2', action]
+ if opt.verbose >= verb_floor and not istty2:
+ cmd.append('-q')