"""distutils.command.clean

Implements the Distutils 'clean' command."""

# contributed by Bastian Kleineidam <calvin@cs.uni-sb.de>, added 2000-03-18

import os
from distutils.core import Command
from distutils.dir_util import remove_tree
from distutils import log


class clean(Command):
    description = "clean up temporary files from 'build' command"
    user_options = [
        ("build-base=", "b", "base build directory (default: 'build.build-base')"),
        (
            "build-lib=",
            None,
            "build directory for all modules (default: 'build.build-lib')",
        ),
        ("build-temp=", "t", "temporary build directory (default: 'build.build-temp')"),
        (
            "build-scripts=",
            None,
            "build directory for scripts (default: 'build.build-scripts')",
        ),
        ("bdist-base=", None, "temporary directory for built distributions"),
        ("all", "a", "remove all build output, not just temporary by-products"),
    ]

    boolean_options = ["all"]

    def initialize_options(self):
        self.build_base = None
        self.build_lib = None
        self.build_temp = None
        self.build_scripts = None
        self.bdist_base = None
        self.all = None

    def finalize_options(self):
        self.set_undefined_options(
            "build",
            ("build_base", "build_base"),
            ("build_lib", "build_lib"),
            ("build_scripts", "build_scripts"),
            ("build_temp", "build_temp"),
        )
        self.set_undefined_options("bdist", ("bdist_base", "bdist_base"))

    def run(self):
        # remove the build/temp.<plat> directory (unless it's already
        # gone)
        if os.path.exists(self.build_temp):
            remove_tree(self.build_temp, dry_run=self.dry_run)
        else:
            log.debug("'%s' does not exist -- can't clean it", self.build_temp)

        if self.all:
            # remove build directories
            for directory in (self.build_lib, self.bdist_base, self.build_scripts):
                if os.path.exists(directory):
                    remove_tree(directory, dry_run=self.dry_run)
                else:
                    log.warn("'%s' does not exist -- can't clean it", directory)

        # just for the heck of it, try to remove the base build directory:
        # we might have emptied it right now, but if not we don't care
        if not self.dry_run:
            try:
                os.rmdir(self.build_base)
                log.info("removing '%s'", self.build_base)
            except OSError:
                pass
