45 lines
1.5 KiB
Python
45 lines
1.5 KiB
Python
|
import os.path
|
||
|
import os
|
||
|
import shutil
|
||
|
|
||
|
from dbt.task.base import BaseTask, move_to_nearest_project_dir
|
||
|
from dbt.logger import GLOBAL_LOGGER as logger
|
||
|
from dbt.config import UnsetProfileConfig
|
||
|
|
||
|
|
||
|
class CleanTask(BaseTask):
|
||
|
ConfigType = UnsetProfileConfig
|
||
|
|
||
|
def __is_project_path(self, path):
|
||
|
proj_path = os.path.abspath('.')
|
||
|
return not os.path.commonprefix(
|
||
|
[proj_path, os.path.abspath(path)]
|
||
|
) == proj_path
|
||
|
|
||
|
def __is_protected_path(self, path):
|
||
|
"""
|
||
|
This function identifies protected paths, so as not to clean them.
|
||
|
"""
|
||
|
abs_path = os.path.abspath(path)
|
||
|
protected_paths = self.config.source_paths + \
|
||
|
self.config.test_paths + ['.']
|
||
|
protected_abs_paths = [os.path.abspath(p) for p in protected_paths]
|
||
|
return abs_path in set(protected_abs_paths) or \
|
||
|
self.__is_project_path(abs_path)
|
||
|
|
||
|
def run(self):
|
||
|
"""
|
||
|
This function takes all the paths in the target file
|
||
|
and cleans the project paths that are not protected.
|
||
|
"""
|
||
|
move_to_nearest_project_dir(self.args)
|
||
|
for path in self.config.clean_targets:
|
||
|
logger.info("Checking {}/*".format(path))
|
||
|
if not self.__is_protected_path(path):
|
||
|
shutil.rmtree(path, True)
|
||
|
logger.info(" Cleaned {}/*".format(path))
|
||
|
else:
|
||
|
logger.info("ERROR: not cleaning {}/* because it is "
|
||
|
"protected".format(path))
|
||
|
logger.info("Finished cleaning all paths.")
|