Exemplo n.º 1
0
    def rename(self, old_task_name, new_task_name):
        """ Renames an existing task directory.

            `old_task_name`
                Current task name.
            `new_task_name`
                New task name.

            Returns ``True`` if rename successful.
            """

        if not old_task_name or old_task_name.startswith('-'):
            raise ValueError('Old task name is invalid')

        if not new_task_name or new_task_name.startswith('-'):
            raise ValueError('New new task name is invalid')

        if old_task_name == new_task_name:
            raise ValueError('Cannot rename task to itself')

        try:
            old_task_dir = self._get_task_dir(old_task_name)
            if not self.exists(old_task_dir):
                raise errors.TaskNotFound(old_task_name)

            new_task_dir = self._get_task_dir(new_task_name)
            if self.exists(new_task_dir):
                raise errors.TaskExists(new_task_name)

            os.rename(old_task_dir, new_task_dir)
            return True

        except OSError:
            return False
Exemplo n.º 2
0
    def rename(self, old_name, new_name):
        if not hasattr(self, 'test__renamed'):
            self.test__renamed = {}

        if old_name == new_name:
            raise ValueError

        if not old_name in self.test__renamed:
            raise errors.TaskNotFound(old_name)

        if new_name in self.test__renamed:
            raise errors.TaskExists(new_name)

        self.test__renamed[new_name] = True
        if old_name in self.test__renamed:
            del self.test__renamed[old_name]

        return True
Exemplo n.º 3
0
    def create(self, task_name, clone_task=None):
        """ Creates a new task directory.

            `task_name`
                Task name.
            `clone_task`
                Existing task name to use as a template for new task.

            Returns boolean.

            * Raises ``Value`` if task name is invalid, ``TaskExists`` if task
              already exists, or ``TaskNotFound`` if task for `clone_from`
              doesn't exist.
            """

        if not task_name or task_name.startswith('-'):
            raise ValueError('Invalid task name')

        try:
            task_dir = self._get_task_dir(task_name)

            if self.exists(task_dir):
                raise errors.TaskExists(task_name)

            task_cfg = self.get_config_path(task_name)

            if clone_task:
                if not self.exists(clone_task):
                    raise errors.TaskNotFound(clone_task)

                # copy task directory
                shutil.copytree(self._get_task_dir(clone_task), task_dir)

            else:
                os.mkdir(task_dir)

                # write default task configuration
                shutil.copy(self._default_task_config, task_cfg)

            return True

        except OSError:
            shutil.rmtree(task_dir, ignore_errors=True)
            return False
    def execute(self, env, args):
        """ Prints task information.

            `env`
                Runtime ``Environment`` instance.
            `args`
                Arguments object from arg parser.
            """

        task_name = args.task_name

        if task_name is None:
            if not env.task.active:
                raise errors.NoActiveTask
            task_name = env.task.name

        tasks = env.task.get_list_info(task_name)
        if not tasks:
            raise errors.TaskNotFound(task_name)

        _print_tasks(env, tasks)
    def execute(self, env, args):
        """ Edits task configuration.

            `env`
                Runtime ``Environment`` instance.
            `args`
                Arguments object from arg parser.
            """

        task_name = args.task_name

        if not env.task.exists(task_name):
            raise errors.TaskNotFound(task_name)

        if env.task.active and task_name == env.task.name:
            raise errors.ActiveTask

        # open in task config in editor
        task_config = env.task.get_config_path(task_name)

        if not _edit_task_config(env, task_config, confirm=True):
            raise errors.FocusError(
                u'Could not open task config: {0}'.format(task_config))
    def execute(self, env, args):
        """ Removes a task.

            `env`
                Runtime ``Environment`` instance.
            `args`
                Arguments object from arg parser.
            """

        # extract args
        task_name = args.task_name
        force = args.force

        if env.task.active and env.task.name == task_name:
            raise errors.ActiveTask

        if not env.task.exists(task_name):
            raise errors.TaskNotFound(task_name)

        if force:
            env.task.remove(task_name)

        else:
            try:
                while True:
                    prompt = ('Are you sure you want to delete "{0}" (y/n)? '.
                              format(task_name))
                    resp = env.io.prompt(prompt, newline=False).lower()

                    if resp in ('y', 'n'):
                        if resp == 'y':
                            env.task.remove(task_name)
                        break

            except KeyboardInterrupt:
                pass
Exemplo n.º 7
0
    def start(self, task_name):
        """ Starts a new task matching the provided name.

            `task_name`
                Name of existing task to start.

            Returns boolean.

            * Raises a ``TaskNotFound`` exception if task doesn't exist, an
              ``InvalidTaskConfig` exception if task config file is invalid, or
              ``DaemonFailStart`` exception if task daemons failed to fork.
            """

        self._clean_prior()

        if self._loaded:
            raise errors.ActiveTask

        # get paths
        task_dir = os.path.join(self._paths['base_dir'], 'tasks', task_name)
        task_config = os.path.join(task_dir, 'task.cfg')

        if not os.path.isdir(task_dir):
            raise errors.TaskNotFound(task_name)

        try:
            # raise if task config is missing
            if not os.path.isfile(task_config):
                reason = u"Config file could not be found."
                raise errors.InvalidTaskConfig(task_config, reason=reason)

            # parse task config and send its options to registered plugins
            _parser = parser.parse_config(task_config, self.HEADER_TASK_CONFIG)
            registration.run_option_hooks(_parser)

        except parser.ParseError as exc:
            raise errors.InvalidTaskConfig(task_config, reason=unicode(exc))

        # populate task info
        self._name = common.from_utf8(task_name)
        self._start_time = datetime.datetime.now()
        self._owner = os.getuid()
        self._paths['task_dir'] = task_dir
        self._paths['task_config'] = task_config
        self._loaded = True

        # task is setup, save active file
        # note, order is *important*; this is needed first
        # for the daemon to load
        self._save_active_file()

        # shell the focusd daemon
        try:
            started = daemon.shell_focusd(self._paths['base_dir'])

        # user cancelled or passwords failed?
        except (KeyboardInterrupt, ValueError):
            self._clean()
            return False

        # no event plugins registered, carry on
        except errors.NoPluginsRegistered:
            return True

        # failed, cleanup our mess
        if not started:
            self._clean()
            raise errors.DaemonFailStart

        return True