Пример #1
0
 def parse_and_reformat(self):
     self._parser = configparser.ConfigParser(interpolation=None)
     self._parser.optionxform = str
     self._parser.read(self._path, encoding="utf-8")
     section = "Desktop Entry"
     if section not in self._parser.sections():
         raise errors.InvalidDesktopFileError(
             self._filename, "missing 'Desktop Entry' section")
     if "Exec" not in self._parser[section]:
         raise errors.InvalidDesktopFileError(self._filename,
                                              "missing 'Exec' key")
     # XXX: do we want to allow more parameters for Exec?
     if self._name == self._snap_name:
         exec_value = "{} %U".format(self._name)
     else:
         exec_value = "{}.{} %U".format(self._snap_name, self._name)
     self._parser[section]["Exec"] = exec_value
     if "Icon" in self._parser[section]:
         icon = self._parser[section]["Icon"]
         if icon.startswith("/"):
             icon = icon.lstrip("/")
             if os.path.exists(os.path.join(self._prime_dir, icon)):
                 self._parser[section]["Icon"] = "${{SNAP}}/{}".format(icon)
             else:
                 logger.warning(
                     "Icon {} specified in desktop file {} not found "
                     "in prime directory".format(icon, self._filename))
Пример #2
0
 def __init__(self, *, name, filename, snap_name, prime_dir):
     self._name = name
     self._filename = filename
     self._snap_name = snap_name
     self._prime_dir = prime_dir
     self._path = os.path.join(prime_dir, filename)
     if not os.path.exists(self._path):
         raise errors.InvalidDesktopFileError(
             filename,
             'does not exist (defined in the app {!r})'.format(name))
Пример #3
0
    def parse_and_reformat(self, extracted_metadata: _metadata.ExtractedMetadata):
        self._parser = configparser.ConfigParser(interpolation=None)
        # mypy type checking ignored, see https://github.com/python/mypy/issues/506
        self._parser.optionxform = str  # type: ignore
        self._parser.read(self._path, encoding="utf-8")
        section = "Desktop Entry"
        if section not in self._parser.sections():
            raise errors.InvalidDesktopFileError(
                self._filename, "missing 'Desktop Entry' section"
            )
        if "Exec" not in self._parser[section]:
            raise errors.InvalidDesktopFileError(self._filename, "missing 'Exec' key")
        # XXX: do we want to allow more parameters for Exec?
        if self._name == self._snap_name:
            exec_value = "{} %U".format(self._name)
        else:
            exec_value = "{}.{} %U".format(self._snap_name, self._name)
        self._parser[section]["Exec"] = exec_value
        if "Icon" in self._parser[section]:
            icon = self._parser[section]["Icon"]

            # Extracted metadata (e.g. from the AppStream) can override the
            # icon location.
            if extracted_metadata:
                metadata_icon = extracted_metadata.get_icon()
                if metadata_icon is not None:
                    icon = metadata_icon

            icon = icon.lstrip("/")
            if icon.startswith("${SNAP}/") and os.path.exists(
                os.path.join(self._prime_dir, icon[8:])
            ):
                self._parser[section]["Icon"] = icon
            elif os.path.exists(os.path.join(self._prime_dir, icon)):
                self._parser[section]["Icon"] = "${{SNAP}}/{}".format(icon)
            else:
                logger.warning(
                    "Icon {} specified in desktop file {} not found "
                    "in prime directory".format(icon, self._filename)
                )