import argparse import logging import dvc.prompt as prompt from dvc.command.base import append_doc_link from dvc.command.base import CmdBase from dvc.exceptions import DvcException logger = logging.getLogger(__name__) class CmdRemove(CmdBase): def _is_outs_only(self, target): if not self.args.purge: return True if self.args.force: return False msg = "Are you sure you want to remove '{}' with its outputs?".format( target ) if prompt.confirm(msg): return False raise DvcException( "Cannot purge without a confirmation from the user." " Use `-f` to force." ) def run(self): for target in self.args.targets: try: outs_only = self._is_outs_only(target) self.repo.remove(target, outs_only=outs_only) except DvcException: logger.exception("failed to remove '{}'".format(target)) return 1 return 0 def add_parser(subparsers, parent_parser): REMOVE_HELP = "Remove DVC-tracked files or directories." remove_parser = subparsers.add_parser( "remove", parents=[parent_parser], description=append_doc_link(REMOVE_HELP, "remove"), help=REMOVE_HELP, formatter_class=argparse.RawDescriptionHelpFormatter, ) remove_parser_group = remove_parser.add_mutually_exclusive_group() remove_parser_group.add_argument( "-o", "--outs", action="store_true", default=True, help="Only remove DVC-file outputs. (Default)", ) remove_parser_group.add_argument( "-p", "--purge", action="store_true", default=False, help="Remove DVC-file and all its outputs.", ) remove_parser.add_argument( "-f", "--force", action="store_true", default=False, help="Force purge.", ) remove_parser.add_argument( "targets", nargs="+", help="DVC-files to remove." ) remove_parser.set_defaults(func=CmdRemove)