Esempio n. 1
0
    def _process_parts(self):
        for part_name in self._parts_data:
            if '/' in part_name:
                logger.warning('DEPRECATED: Found a "/" '
                               'in the name of the {!r} part'.format(
                                part_name))
            self._part_names.append(part_name)
            properties = self._parts_data[part_name] or {}

            plugin_name = properties.get('plugin')

            if 'after' in properties:
                self.after_requests[part_name] = properties.pop('after')

            if 'filesets' in properties:
                del properties['filesets']

            # Handle the deprecated snap keyword.
            if 'snap' in properties:
                snap = properties.pop('snap')
                if snap:
                    deprecations.handle_deprecation_notice('dn1')
                    properties['prime'] = snap

            self.load_part(part_name, plugin_name, properties)

        self._compute_dependencies()
        self.all_parts = self._sort_parts()
Esempio n. 2
0
    def _process_parts(self):
        for part_name in self._parts_data:
            if "/" in part_name:
                logger.warning(
                    'DEPRECATED: Found a "/" '
                    "in the name of the {!r} part".format(part_name)
                )
            self._part_names.append(part_name)
            properties = self._parts_data[part_name] or {}

            plugin_name = properties.get("plugin")

            if "after" in properties:
                self.after_requests[part_name] = properties.pop("after")

            if "filesets" in properties:
                del properties["filesets"]

            # Handle the deprecated snap keyword.
            if "snap" in properties:
                snap = properties.pop("snap")
                if snap:
                    deprecations.handle_deprecation_notice("dn1")
                    properties["prime"] = snap

            self.load_part(part_name, plugin_name, properties)

        self._compute_dependencies()
        self.all_parts = self._sort_parts()
    def finalize_snap_meta_version(self) -> None:
        # Reparse the version, the order should stick.
        version = self._config_data["version"]
        version_script = self._config_data.get("version-script")

        if version_script:
            # Deprecation warning for use of version-script.
            handle_deprecation_notice("dn10")

        self._snap_meta.version = _version.get_version(version, version_script)
Esempio n. 4
0
    def _compose_snap_yaml(self):
        """Create a new dictionary from config_data to obtain snap.yaml.

        Missing key exceptions will be raised if config_data does not contain
        all the _MANDATORY_PACKAGE_KEYS, config_data can be validated against
        the snapcraft schema.

        Keys that are in _OPTIONAL_PACKAGE_KEYS are ignored if not there.
        """
        snap_yaml = collections.OrderedDict()

        for key_name in _MANDATORY_PACKAGE_KEYS:
            snap_yaml[key_name] = self._config_data[key_name]

        # If the base is core in snapcraft.yaml we do not set it in
        # snap.yaml LP: #1819290
        if "base" in self._config_data and self._config_data["base"] != "core":
            snap_yaml["base"] = self._config_data["base"]

        # Reparse the version, the order should stick.
        version = self._config_data["version"]
        version_script = self._config_data.get("version-script")

        if version_script:
            # Deprecation warning for use of version-script.
            handle_deprecation_notice("dn10")

        snap_yaml["version"] = _version.get_version(version, version_script)

        for key_name in _OPTIONAL_PACKAGE_KEYS:
            if key_name in self._config_data:
                snap_yaml[key_name] = self._config_data[key_name]

        if self._apps:
            # This really should be environment (PATH and LD_LIBRARY_PATH),
            # anything else should be provided by an extension.
            command_chain = self._generate_command_chain()
            apps = {
                k: v.get_yaml(prepend_command_chain=command_chain)
                for k, v in self._apps.items()
            }
            snap_yaml["apps"] = apps

            assumes = _determine_assumes(apps)
            if assumes:
                # Sorting for consistent results (order doesn't matter)
                snap_yaml["assumes"] = sorted(
                    set(snap_yaml.get("assumes", list())) | assumes)

        self._process_passthrough_properties(snap_yaml)

        return snap_yaml
Esempio n. 5
0
    def _setup_gui(self):
        # Handles the setup directory which only contains gui assets.
        setup_dir = "setup"
        if not os.path.exists(setup_dir):
            return

        handle_deprecation_notice("dn3")

        gui_src = os.path.join(setup_dir, "gui")
        if os.path.exists(gui_src):
            for f in os.listdir(gui_src):
                if not os.path.exists(self.meta_gui_dir):
                    os.mkdir(self.meta_gui_dir)
                shutil.copy2(os.path.join(gui_src, f), self.meta_gui_dir)
Esempio n. 6
0
 def get_command(self, ctx, cmd_name):
     new_cmd_name = _CMD_DEPRECATED_REPLACEMENTS.get(cmd_name)
     if new_cmd_name:
         if _CMD_DEPRECATION_NOTICES.get(cmd_name):
             deprecations.handle_deprecation_notice(
                 _CMD_DEPRECATION_NOTICES.get(cmd_name))
         else:
             echo.warning("DEPRECATED: Use {!r} instead of {!r}".format(
                 new_cmd_name, cmd_name))
         cmd = click.Group.get_command(self, ctx, new_cmd_name)
     else:
         cmd_name = _CMD_ALIASES.get(cmd_name, cmd_name)
         cmd = click.Group.get_command(self, ctx, cmd_name)
     return cmd
Esempio n. 7
0
 def get_command(self, ctx, cmd_name):
     new_cmd_name = _CMD_DEPRECATED_REPLACEMENTS.get(cmd_name)
     if new_cmd_name:
         if _CMD_DEPRECATION_NOTICES.get(cmd_name):
             deprecations.handle_deprecation_notice(
                 _CMD_DEPRECATION_NOTICES.get(cmd_name))
         else:
             echo.warning('DEPRECATED: Use {!r} instead of {!r}'.format(
                 new_cmd_name, cmd_name))
         cmd = click.Group.get_command(self, ctx, new_cmd_name)
     else:
         cmd_name = _CMD_ALIASES.get(cmd_name, cmd_name)
         cmd = click.Group.get_command(self, ctx, cmd_name)
     return cmd
Esempio n. 8
0
    def _setup_gui(self):
        # Handles the setup directory which only contains gui assets.
        setup_dir = 'setup'
        if not os.path.exists(setup_dir):
            return

        handle_deprecation_notice('dn3')

        gui_src = os.path.join(setup_dir, 'gui')
        gui_dst = os.path.join(self.meta_dir, 'gui')
        if os.path.exists(gui_src):
            for f in os.listdir(gui_src):
                if not os.path.exists(gui_dst):
                    os.mkdir(gui_dst)
                shutil.copy2(os.path.join(gui_src, f), gui_dst)
Esempio n. 9
0
    def _setup_gui(self):
        # Handles the setup directory which only contains gui assets.
        setup_dir = 'setup'
        if not os.path.exists(setup_dir):
            return

        handle_deprecation_notice('dn3')

        gui_src = os.path.join(setup_dir, 'gui')
        gui_dst = os.path.join(self.meta_dir, 'gui')
        if os.path.exists(gui_src):
            for f in os.listdir(gui_src):
                if not os.path.exists(gui_dst):
                    os.mkdir(gui_dst)
                shutil.copy2(os.path.join(gui_src, f), gui_dst)
Esempio n. 10
0
    def _compose_snap_yaml(self):
        """Create a new dictionary from config_data to obtain snap.yaml.

        Missing key exceptions will be raised if config_data does not contain
        all the _MANDATORY_PACKAGE_KEYS, config_data can be validated against
        the snapcraft schema.

        Keys that are in _OPTIONAL_PACKAGE_KEYS are ignored if not there.
        """
        snap_yaml = collections.OrderedDict()

        for key_name in _MANDATORY_PACKAGE_KEYS:
            snap_yaml[key_name] = self._config_data[key_name]

        # If the base is core in snapcraft.yaml we do not set it in
        # snap.yaml LP: #1819290
        if "base" in self._config_data and self._config_data["base"] != "core":
            snap_yaml["base"] = self._config_data["base"]

        # Reparse the version, the order should stick.
        version = self._config_data["version"]
        version_script = self._config_data.get("version-script")

        if version_script:
            # Deprecation warning for use of version-script.
            handle_deprecation_notice("dn10")

        snap_yaml["version"] = _version.get_version(version, version_script)

        for key_name in _OPTIONAL_PACKAGE_KEYS:
            if key_name in self._config_data:
                snap_yaml[key_name] = self._config_data[key_name]

        if "apps" in self._config_data:
            _verify_app_paths(basedir=self._prime_dir,
                              apps=self._config_data["apps"])
            snap_yaml["apps"] = self._wrap_apps(self._config_data["apps"])
            self._render_socket_modes(snap_yaml["apps"])
            self._validate_command_chain(snap_yaml["apps"])

        self._process_passthrough_properties(snap_yaml)
        assumes = _determine_assumes(self._config_data)
        if assumes:
            # Sorting for consistent results (order doesn't matter)
            snap_yaml["assumes"] = sorted(
                set(snap_yaml.get("assumes", [])) | assumes)

        return snap_yaml
Esempio n. 11
0
def snap(directory, output, **kwargs):
    """Create a snap.

    \b
    Examples:
        snapcraft snap
        snapcraft snap --output renamed-snap.snap

    If you want to snap a directory, you should use the pack command
    instead.
    """
    if directory:
        deprecations.handle_deprecation_notice("dn6")
        _pack(directory, output=output)
    else:
        _execute(steps.PRIME, parts=tuple(), pack_project=True, output=output, **kwargs)
Esempio n. 12
0
    def _ensure_no_duplicate_app_aliases(self):
        # Prevent multiple apps within a snap from having duplicate alias names
        aliases = []
        for app_name, app in self.data.get("apps", {}).items():
            aliases.extend(app.get("aliases", []))

        # The aliases property is actually deprecated:
        if aliases:
            deprecations.handle_deprecation_notice("dn5")
        seen = set()
        duplicates = set()
        for alias in aliases:
            if alias in seen:
                duplicates.add(alias)
            else:
                seen.add(alias)
        if duplicates:
            raise errors.DuplicateAliasError(aliases=duplicates)
Esempio n. 13
0
    def _ensure_no_duplicate_app_aliases(self):
        # Prevent multiple apps within a snap from having duplicate alias names
        aliases = []
        for app_name, app in self.data.get('apps', {}).items():
            aliases.extend(app.get('aliases', []))

        # The aliases property is actually deprecated:
        if aliases:
            deprecations.handle_deprecation_notice('dn5')
        seen = set()
        duplicates = set()
        for alias in aliases:
            if alias in seen:
                duplicates.add(alias)
            else:
                seen.add(alias)
        if duplicates:
            raise errors.DuplicateAliasError(aliases=duplicates)
Esempio n. 14
0
def _run_store_command(args):  # noqa: C901
    if args['list-registered'] or args['registered']:
        snapcraft.list_registered()
    elif args['list-keys'] or args['keys']:
        snapcraft.list_keys()
    elif args['create-key']:
        snapcraft.create_key(args['<key-name>'])
    elif args['register-key']:
        snapcraft.register_key(args['<key-name>'])
    elif args['register']:
        snapcraft.register(args['<snap-name>'], args['--private'])
    elif args['sign-build']:
        snapcraft.sign_build(
            args['<snap-file>'], args['--key-name'], args['--local'])
    elif args['upload']:
        logger.warning('DEPRECATED: Use `push` instead of `upload`')
        snapcraft.push(args['<snap-file>'])
    elif args['push']:
        if args['--release']:
            release_channels = args['--release'].split(',')
        else:
            release_channels = []
        snapcraft.push(args['<snap-file>'], release_channels)
    elif args['release']:
        snapcraft.release(
            args['<snap-name>'], args['<revision>'], [args['<channel>']])
    elif args['validate']:
        snapcraft.validate(args['<snap-name>'], args['<validation>'],
                           key=args['--key-name'])
    elif args['gated']:
        snapcraft.gated(args['<snap-name>'])
    elif args['status']:
        snapcraft.status(
            args['<snap-name>'], args['--series'], args['--arch'])
    elif args['revisions'] or args['list-revisions'] or args['history']:
        if args['history']:
            deprecations.handle_deprecation_notice('dn4')
        snapcraft.revisions(
            args['<snap-name>'], args['--series'], args['--arch'])
    elif args['close']:
        snapcraft.close(args['<snap-name>'], args['<channel_names>'])
    elif args['collaborate']:
        snapcraft.collaborate(args['<snap-name>'], key=args['--key-name'])
Esempio n. 15
0
def snap(directory, output, **kwargs):
    """Create a snap.

    \b
    Examples:
        snapcraft snap
        snapcraft snap --output renamed-snap.snap

    If you want to snap a directory, you should use the pack command
    instead.
    """
    if directory:
        deprecations.handle_deprecation_notice("dn6")
    else:
        project = _execute(steps.PRIME, parts=[], **kwargs)
        directory = project.prime_dir

    snap_name = lifecycle.pack(directory, output)
    echo.info("Snapped {}".format(snap_name))
Esempio n. 16
0
def _run_store_command(args):  # noqa: C901
    if args['list-registered'] or args['registered']:
        snapcraft.list_registered()
    elif args['list-keys'] or args['keys']:
        snapcraft.list_keys()
    elif args['create-key']:
        snapcraft.create_key(args['<key-name>'])
    elif args['register-key']:
        snapcraft.register_key(args['<key-name>'])
    elif args['register']:
        snapcraft.register(args['<snap-name>'], args['--private'])
    elif args['sign-build']:
        snapcraft.sign_build(
            args['<snap-file>'], args['--key-name'], args['--local'])
    elif args['upload']:
        logger.warning('DEPRECATED: Use `push` instead of `upload`')
        snapcraft.push(args['<snap-file>'])
    elif args['push']:
        if args['--release']:
            release_channels = args['--release'].split(',')
        else:
            release_channels = []
        snapcraft.push(args['<snap-file>'], release_channels)
    elif args['release']:
        snapcraft.release(
            args['<snap-name>'], args['<revision>'], [args['<channel>']])
    elif args['validate']:
        snapcraft.validate(args['<snap-name>'], args['<validation>'],
                           key=args['--key-name'])
    elif args['gated']:
        snapcraft.gated(args['<snap-name>'])
    elif args['status']:
        snapcraft.status(
            args['<snap-name>'], args['--series'], args['--arch'])
    elif args['revisions'] or args['list-revisions'] or args['history']:
        if args['history']:
            deprecations.handle_deprecation_notice('dn4')
        snapcraft.revisions(
            args['<snap-name>'], args['--series'], args['--arch'])
    elif args['close']:
        snapcraft.close(args['<snap-name>'], args['<channel_names>'])
Esempio n. 17
0
    def __init__(self, *, part_properties: Dict[str, Any], sourcedir: str,
                 builddir: str, stagedir: str, primedir: str,
                 builtin_functions: 'Dict[str, Callable[..., None]]') -> None:
        """Create a new Runner.
        :param dict part_properties: YAML properties set for this part.
        :param str sourcedir: The source directory for this part.
        :param str builddir: The build directory for this part.
        :param str stagedir: The staging area.
        :param str primedir: The priming area.
        :param dict builtin_functions: Dict of builtin function names to
                                       actual callables.
        """
        self._sourcedir = sourcedir
        self._builddir = builddir
        self._stagedir = stagedir
        self._primedir = primedir
        self._builtin_functions = builtin_functions

        self._override_pull_scriptlet = part_properties.get('override-pull')
        self._override_build_scriptlet = part_properties.get('override-build')
        self._override_stage_scriptlet = part_properties.get('override-stage')
        self._override_prime_scriptlet = part_properties.get('override-prime')

        # These are all deprecated
        self._prepare_scriptlet = part_properties.get('prepare')
        if self._prepare_scriptlet:
            deprecations.handle_deprecation_notice('dn7')

        self._build_scriptlet = part_properties.get('build')
        if self._build_scriptlet:
            deprecations.handle_deprecation_notice('dn8')

        self._install_scriptlet = part_properties.get('install')
        if self._install_scriptlet:
            deprecations.handle_deprecation_notice('dn9')
Esempio n. 18
0
def snap(directory, output, **kwargs):
    """Create a snap.

    \b
    Examples:
        snapcraft snap
        snapcraft snap --output renamed-snap.snap

    If you want to snap a directory, you should use the pack command
    instead.
    """
    if directory:
        deprecations.handle_deprecation_notice('dn6')

    project_options = get_project_options(**kwargs)
    container_config = env.get_container_config()
    if container_config.use_container:
        lifecycle.containerbuild('snap', project_options,
                                 container_config, output, directory)
    else:
        snap_name = lifecycle.snap(
            project_options, directory=directory, output=output)
        echo.info('Snapped {}'.format(snap_name))
Esempio n. 19
0
def snap(directory, output, **kwargs):
    """Create a snap.

    \b
    Examples:
        snapcraft snap
        snapcraft snap --output renamed-snap.snap

    If you want to snap a directory, you should use the pack command
    instead.
    """
    if directory:
        deprecations.handle_deprecation_notice('dn6')

    project_options = get_project_options(**kwargs)
    container_config = env.get_container_config()
    if container_config.use_container:
        lifecycle.containerbuild('snap', project_options,
                                 container_config, output, directory)
    else:
        snap_name = lifecycle.snap(
            project_options, directory=directory, output=output)
        echo.info('Snapped {}'.format(snap_name))
Esempio n. 20
0
    def __init__(
        self,
        *,
        part_properties: Dict[str, Any],
        sourcedir: str,
        builddir: str,
        stagedir: str,
        primedir: str,
        builtin_functions: "Dict[str, Callable[..., None]]"
    ) -> None:
        """Create a new Runner.
        :param dict part_properties: YAML properties set for this part.
        :param str sourcedir: The source directory for this part.
        :param str builddir: The build directory for this part.
        :param str stagedir: The staging area.
        :param str primedir: The priming area.
        :param dict builtin_functions: Dict of builtin function names to
                                       actual callables.
        """
        self._sourcedir = sourcedir
        self._builddir = builddir
        self._stagedir = stagedir
        self._primedir = primedir
        self._builtin_functions = builtin_functions

        self._override_pull_scriptlet = part_properties.get("override-pull")
        self._override_build_scriptlet = part_properties.get("override-build")
        self._override_stage_scriptlet = part_properties.get("override-stage")
        self._override_prime_scriptlet = part_properties.get("override-prime")

        # These are all deprecated
        self._prepare_scriptlet = part_properties.get("prepare")
        if self._prepare_scriptlet:
            deprecations.handle_deprecation_notice("dn7")

        self._build_scriptlet = part_properties.get("build")
        if self._build_scriptlet:
            deprecations.handle_deprecation_notice("dn8")

        self._install_scriptlet = part_properties.get("install")
        if self._install_scriptlet:
            deprecations.handle_deprecation_notice("dn9")
Esempio n. 21
0
 def local_plugins_dir(self):
     deprecated_plugins_dir = os.path.join(self.parts_dir, 'plugins')
     if os.path.exists(deprecated_plugins_dir):
         handle_deprecation_notice('dn2')
         return deprecated_plugins_dir
     return os.path.join(self.__project_dir, 'snap', 'plugins')
Esempio n. 22
0
 def local_plugins_dir(self):
     deprecated_plugins_dir = os.path.join(self.parts_dir, "plugins")
     if os.path.exists(deprecated_plugins_dir):
         handle_deprecation_notice("dn2")
         return deprecated_plugins_dir
     return os.path.join(self.__project_dir, "snap", "plugins")
Esempio n. 23
0
 def local_plugins_dir(self):
     deprecated_plugins_dir = os.path.join(self.parts_dir, 'plugins')
     if os.path.exists(deprecated_plugins_dir):
         handle_deprecation_notice('dn2')
         return deprecated_plugins_dir
     return os.path.join(self.__project_dir, 'snap', 'plugins')