Skip to content
41 changes: 10 additions & 31 deletions delete
Original file line number Diff line number Diff line change
Expand Up @@ -4,30 +4,14 @@ import logging
import optparse
import os
import shutil
import stat
import sys

import afs.fs
import libdelete
from libdelete import perror

logger = logging.getLogger('delete')
whoami = os.path.basename(sys.argv[0])

import libdelete

def debug_callback(option, opt_str, value, parser):
"""
An OptionParser callback that enables debugging.
"""
all_loggers = [logger.name, 'libdelete']
loggers = [x.strip() for x in value.split(',')]
if value.lower() == 'all':
loggers = all_loggers
else:
if not set(loggers) == set(all_loggers):
parser.error('Valid debug targets: {0}'.format(
", ".join(all_loggers)))
for l in loggers:
logging.getLogger(l).setLevel(logging.DEBUG)

def ask(question, *args, **kwargs):
"""
Expand All @@ -42,16 +26,6 @@ def ask(question, *args, **kwargs):
except KeyboardInterrupt:
sys.exit(0)

def perror(message, **kwargs):
"""
Format an error message, log it in the debug log
and maybe also print it to stderr.
"""
should_print = kwargs.pop('_maybe', False)
msg = "{0}: {1}".format(whoami, message.format(**kwargs))
logger.debug("Error: %s", msg)
if should_print:
print >>sys.stderr, msg

def actually_delete(filename, options):
"""
Expand All @@ -67,7 +41,8 @@ def actually_delete(filename, options):
filename):
return False
if options.noop:
print >>sys.stderr, "{0}: {1} would be removed".format(whoami, filename)
print >>sys.stderr, "{0}: {1} would be removed".format(
whoami, filename)
return True
(dirname, basename) = os.path.split(filename)
newname = os.path.join(dirname, '.#' + basename)
Expand All @@ -85,6 +60,7 @@ def actually_delete(filename, options):
os.utime(newname, None)
return True


def delete(filename, options):
logger.debug("delete(%s)", filename)
if not os.path.lexists(filename):
Expand Down Expand Up @@ -135,6 +111,7 @@ def delete(filename, options):
else:
return actually_delete(filename, options)


def main():
parser = optparse.OptionParser(usage="%prog [options] filename ...")
# This is probably a terrible idea, but the old code did it
Expand Down Expand Up @@ -167,8 +144,9 @@ def main():
default=linked_to_rmdir,
help="Only remove empty directories (refuse to remove files)")
parser.add_option(
"--debug", action="callback", type='string', help="Enable debugging (logger target or 'all')",
callback=debug_callback, metavar='target')
"--debug", action="callback", type='string',
help="Enable debugging (logger target or 'all')",
callback=libdelete.make_debug_callback(logger), metavar='target')
(options, args) = parser.parse_args()
if options.filesonly and options.directoriesonly:
parser.error("-F and -D are mutually exclusive")
Expand All @@ -188,6 +166,7 @@ def main():
errors = 1
return errors


if __name__ == "__main__":
logging.basicConfig(level=logging.WARNING)
sys.exit(main())
48 changes: 18 additions & 30 deletions expunge
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import os
import sys

import libdelete
from libdelete import perror

header = "The following deleted files are going to be expunged:\n"
footer = """
Expand All @@ -17,20 +18,6 @@ confirmation = "Do you wish to continue [return = no]? "
logger = logging.getLogger('expunge')
whoami = os.path.basename(sys.argv[0])

def debug_callback(option, opt_str, value, parser):
"""
An OptionParser callback that enables debugging.
"""
all_loggers = [logger.name, 'libdelete']
loggers = [x.strip() for x in value.split(',')]
if value.lower() == 'all':
loggers = all_loggers
else:
if not set(loggers) == set(all_loggers):
parser.error('Valid debug targets: {0}'.format(
", ".join(all_loggers)))
for l in loggers:
logging.getLogger(l).setLevel(logging.DEBUG)

def ask(question, *args, **kwargs):
"""
Expand All @@ -45,29 +32,21 @@ def ask(question, *args, **kwargs):
except KeyboardInterrupt:
sys.exit(0)

def perror(message, **kwargs):
"""
Format an error message, log it in the debug log
and maybe also print it to stderr.
"""
should_print = not kwargs.pop('_maybe', False)
msg = "{0}: {1}".format(whoami, message.format(**kwargs))
logger.debug("Error: %s", msg)
if should_print:
print >>sys.stderr, msg

def getsize(path):
size = os.path.getsize(path)
return (size, "(%dKB)" % (libdelete.to_kb(size),))


def expunge(deleted_files, options):
expunged_size = 0
errors = 0
if options.listfiles:
print header
print libdelete.format_columns(sorted(
sys.stdout.write(libdelete.format_columns(
sorted(
[libdelete.relpath(
libdelete.undeleted_name(x)) for x in deleted_files]))
libdelete.undeleted_name(x)) for x in deleted_files])))
print footer
if not options.force and \
not ask(confirmation, nowhoami=True):
Expand Down Expand Up @@ -97,7 +76,11 @@ def expunge(deleted_files, options):
# We exit here, not keep going, as the original code did
sys.exit(errors)
if options.verbose:
print "{whoami}: {path} {size} {maybe}expunged ({total}KB total)".format(whoami=whoami, path=f, size=size_str, maybe='would be ' if options.noop else '', total=libdelete.to_kb(expunged_size))
print("{whoami}: {path} {size} {maybe}expunged "
"({total}KB total)".format(
whoami=whoami, path=f, size=size_str,
maybe='would be ' if options.noop else '',
total=libdelete.to_kb(expunged_size)))
if not options.noop:
if os.path.isdir(f) and not os.path.islink(f):
logger.debug("rmdir: %s", f)
Expand All @@ -110,6 +93,7 @@ def expunge(deleted_files, options):
print "Total expunged: {0}KB".format(libdelete.to_kb(expunged_size))
return errors


def parse_options():
parser = optparse.OptionParser(usage="%prog [options] filename ...")
parser.add_option(
Expand Down Expand Up @@ -143,14 +127,16 @@ def parse_options():
"-m", dest="f_mounts", action="store_true", default=False,
help="Follow mount points")
parser.add_option(
"--debug", action="callback", type='string', help="Enable debugging (logger target or 'all')",
callback=debug_callback, metavar='target')
"--debug", action="callback", type='string',
help="Enable debugging (logger target or 'all')",
callback=libdelete.make_debug_callback(logger), metavar='target')
(options, args) = parser.parse_args()
if options.noop:
# -n implies -v
options.verbose = True
return (options, args)


def main():
rv = 0
if ((whoami == "purge") and len(sys.argv) > 1):
Expand Down Expand Up @@ -185,11 +171,13 @@ def main():
# Doesn't cover all corner cases, but covers everything the old
# code supported. In particular, weird symlinks will make this
# sad
deleted_files.sort(reverse=True, key=lambda x: x.count(os.path.sep))
deleted_files.sort(reverse=True,
key=lambda x: x.count(os.path.sep))
rv += expunge(deleted_files, options)

return rv


if __name__ == "__main__":
logging.basicConfig(level=logging.WARNING)
sys.exit(main())
Loading