+def try_fail_repeat(command, *args):
+ """Execute a command multiple times until it succeeds"""
+ times = (0.1, 0.5, 1, 2)
+ i = iter(times)
+ while True:
+ try:
+ command(*args)
+ return
+ except sh.ErrorReturnCode:
+ try:
+ wait = i.next()
+ except StopIteration:
+ break
+ time.sleep(wait)
+
+ raise FatalError("Command: `%s %s' failed" % (command, " ".join(args)))
+
+
+def free_space(dirname):
+ """Compute the free space in a directory"""
+ stat = os.statvfs(dirname)
+ return stat.f_bavail * stat.f_frsize
+
+