Пример #1
0
    def handle_presets(self, preset_action, save, preset, **kwargs):
        """Handle preset related arguments.

        This logic lives here so that the underlying selectors don't need
        special preset handling. They can all save and load presets the same
        way.
        """
        from tryselect.util.dicttools import merge

        user_presets = self.presets.handlers[0]
        if preset_action == 'list':
            self.presets.list()
            sys.exit()

        if preset_action == 'edit':
            user_presets.edit()
            sys.exit()

        default = self.parser.get_default
        if save:
            selector = self.subcommand or self._mach_context.settings['try'][
                'default']

            # Only save non-default values for simplicity.
            kwargs = {k: v for k, v in kwargs.items() if v != default(k)}
            user_presets.save(save, selector=selector, **kwargs)
            print('preset saved, run with: --preset={}'.format(save))
            sys.exit()

        if preset:
            if preset not in self.presets:
                self.parser.error("preset '{}' does not exist".format(preset))

            name = preset
            preset = self.presets[name]
            selector = preset.pop('selector')
            preset.pop('description',
                       None)  # description isn't used by any selectors

            if not self.subcommand:
                self.subcommand = selector
            elif self.subcommand != selector:
                print("error: preset '{}' exists for a different selector "
                      "(did you mean to run 'mach try {}' instead?)".format(
                          name, selector))
                sys.exit(1)

            # Order of precedence is defaults -> presets -> cli. Configuration
            # from the right overwrites configuration from the left.
            defaults = {}
            nondefaults = {}
            for k, v in kwargs.items():
                if v == default(k):
                    defaults[k] = v
                else:
                    nondefaults[k] = v

            kwargs = merge(defaults, preset, nondefaults)

        return kwargs
Пример #2
0
    def handle_try_config(self, **kwargs):
        from tryselect.util.dicttools import merge
        kwargs.setdefault('try_config', {})
        for cls in self.parser.templates.itervalues():
            try_config = cls.try_config(**kwargs)
            if try_config is not None:
                kwargs['try_config'] = merge(kwargs['try_config'], try_config)

            for name in cls.dests:
                del kwargs[name]

        return kwargs
Пример #3
0
    def handle_try_config(self, **kwargs):
        from tryselect.util.dicttools import merge

        to_validate = []
        kwargs.setdefault('try_config', {})
        for cls in six.itervalues(self.parser.task_configs):
            try_config = cls.try_config(**kwargs)
            if try_config is not None:
                to_validate.append(cls)
                kwargs['try_config'] = merge(kwargs['try_config'], try_config)

            for name in cls.dests:
                del kwargs[name]

        # Validate task_configs after they have all been parsed to avoid
        # depending on the order they were processed.
        for cls in to_validate:
            cls.validate(**kwargs)
        return kwargs
Пример #4
0
    def handle_presets(self, preset_action, save, preset, **kwargs):
        """Handle preset related arguments.

        This logic lives here so that the underlying selectors don't need
        special preset handling. They can all save and load presets the same
        way.
        """
        from tryselect.preset import MergedHandler, migrate_old_presets
        from tryselect.util.dicttools import merge

        # Create our handler using both local and in-tree presets. The first
        # path in this list will be treated as the 'user' file for the purposes
        # of saving and editing. All subsequent paths are 'read-only'. We check
        # an environment variable first for testing purposes.
        if os.environ.get('MACH_TRY_PRESET_PATHS'):
            preset_paths = os.environ['MACH_TRY_PRESET_PATHS'].split(
                os.pathsep)
        else:
            preset_paths = [
                os.path.join(get_state_dir(), 'try_presets.yml'),
                os.path.join(self.topsrcdir, 'tools', 'tryselect',
                             'try_presets.yml'),
            ]

        presets = MergedHandler(*preset_paths)
        user_presets = presets.handlers[0]

        # TODO: Remove after Jan 1, 2020.
        migrate_old_presets(user_presets)

        if preset_action == 'list':
            presets.list()
            sys.exit()

        if preset_action == 'edit':
            user_presets.edit()
            sys.exit()

        default = self.parser.get_default
        if save:
            selector = self.subcommand or self._mach_context.settings['try'][
                'default']

            # Only save non-default values for simplicity.
            kwargs = {k: v for k, v in kwargs.items() if v != default(k)}
            user_presets.save(save, selector=selector, **kwargs)
            print('preset saved, run with: --preset={}'.format(save))
            sys.exit()

        if preset:
            if preset not in presets:
                self.parser.error("preset '{}' does not exist".format(preset))

            name = preset
            preset = presets[name]
            selector = preset.pop('selector')
            preset.pop('description',
                       None)  # description isn't used by any selectors

            if not self.subcommand:
                self.subcommand = selector
            elif self.subcommand != selector:
                print("error: preset '{}' exists for a different selector "
                      "(did you mean to run 'mach try {}' instead?)".format(
                          name, selector))
                sys.exit(1)

            # Order of precedence is defaults -> presets -> cli. Configuration
            # from the right overwrites configuration from the left.
            defaults = {}
            nondefaults = {}
            for k, v in kwargs.items():
                if v == default(k):
                    defaults[k] = v
                else:
                    nondefaults[k] = v

            kwargs = merge(defaults, preset, nondefaults)

        return kwargs