import tarfile import os from thefuck import shells from thefuck.utils import for_app def _is_tar_extract(cmd): if '--extract' in cmd: return True cmd = cmd.split() return len(cmd) > 1 and 'x' in cmd[1] def _tar_file(cmd): tar_extensions = ('.tar', '.tar.Z', '.tar.bz2', '.tar.gz', '.tar.lz', '.tar.lzma', '.tar.xz', '.taz', '.tb2', '.tbz', '.tbz2', '.tgz', '.tlz', '.txz', '.tz') for c in cmd.split(): for ext in tar_extensions: if c.endswith(ext): return (c, c[0:len(c) - len(ext)]) @for_app('tar') def match(command, settings): return ('-C' not in command.script and _is_tar_extract(command.script) and _tar_file(command.script) is not None) def get_new_command(command, settings): return shells.and_('mkdir -p {dir}', '{cmd} -C {dir}') \ .format(dir=_tar_file(command.script)[1], cmd=command.script) def side_effect(old_cmd, command, settings): with tarfile.TarFile(_tar_file(old_cmd.script)[0]) as archive: for file in archive.getnames(): try: os.remove(file) except OSError: # does not try to remove directories as we cannot know if they # already existed before pass