1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069 |
- From: Berk Cakar <berk2238@hotmail.com>
- Date: Thu, 24 Jun 2021 00:01:23 +0300
- Subject: [PATCH] Added PiSi support back
- ---
- backends/pisi/meson.build | 21 ++
- backends/pisi/pisiBackend.py | 632 ++++++++++++++++++++++++++++++++
- backends/pisi/pk-backend-pisi.c | 369 +++++++++++++++++++
- meson_options.txt | 2 +-
- 4 files changed, 1023 insertions(+), 1 deletion(-)
- create mode 100644 backends/pisi/meson.build
- create mode 100644 backends/pisi/pisiBackend.py
- create mode 100644 backends/pisi/pk-backend-pisi.c
- diff --git a/backends/pisi/meson.build b/backends/pisi/meson.build
- new file mode 100644
- index 000000000..71236ad11
- --- /dev/null
- +++ b/backends/pisi/meson.build
- @@ -0,0 +1,21 @@
- +shared_module(
- + 'pk_backend_pisi',
- + 'pk-backend-pisi.c',
- + include_directories: packagekit_src_include,
- + dependencies: [
- + packagekit_glib2_dep,
- + gmodule_dep,
- + ],
- + c_args: [
- + '-DPK_COMPILATION',
- + '-DG_LOG_DOMAIN="PackageKit-Pisi"',
- + ],
- + install: true,
- + install_dir: pk_plugin_dir,
- +)
- +
- +install_data(
- + 'pisiBackend.py',
- + install_dir: join_paths(get_option('datadir'), 'PackageKit', 'helpers', 'pisi'),
- + install_mode: 'rwxr--r--',
- +)
- diff --git a/backends/pisi/pisiBackend.py b/backends/pisi/pisiBackend.py
- new file mode 100644
- index 000000000..f9c19eeaf
- --- /dev/null
- +++ b/backends/pisi/pisiBackend.py
- @@ -0,0 +1,632 @@
- +#!/usr/bin/python
- +# -*- coding: utf-8 -*-
- +#
- +# Licensed under the GNU General Public License Version 2
- +#
- +# This program is free software; you can redistribute it and/or modify
- +# it under the terms of the GNU General Public License as published by
- +# the Free Software Foundation; either version 2 of the License, or
- +# (at your option) any later version.
- +#
- +# This program is distributed in the hope that it will be useful,
- +# but WITHOUT ANY WARRANTY; without even the implied warranty of
- +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- +# GNU General Public License for more details.
- +#
- +# You should have received a copy of the GNU General Public License
- +# along with this program; if not, write to the Free Software
- +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- +#
- +# Copyright (C) 2007 S.Çağlar Onur <caglar@pardus.org.tr>
- +# Copyright (C) 2013 Ikey Doherty <ikey@solusos.com>
- +# Copyright (C) 2021 Berk Çakar <berk2238@hotmail.com>
- +
- +# Notes to PiSi based distribution maintainers
- +# /etc/PackageKit/pisi.conf must contain a mapping of PiSi component to
- +# PackageKit groups for correct operation, i.e.
- +# system.utils = system
- +# desktop.gnome = desktop-gnome
- +# If you have a BTS you must also provide Bug-Regex and Bug-URI fields, i.e:
- +# Bug-Regex = Bug-SolusOS: T(\d+)
- +# Bug-URI = http://inf.solusos.com/T%s
- +# We use simple python string formatting to replace the %s with the first
- +# matched group in the regular expression. So in the example above, we expect
- +# to see "Bug-SolusOS: T9" for example, on its own line in a package update
- +# comment.
- +
- +import pisi
- +import pisi.ui
- +from packagekit.backend import *
- +from packagekit.package import PackagekitPackage
- +from packagekit import enums
- +import os.path
- +import piksemel
- +import re
- +
- +class SimplePisiHandler(pisi.ui.UI):
- +
- + def __init(self):
- + pisi.ui.UI.__init__(self, False, False)
- +
- + def display_progress(self, **ka):
- + self.the_callback(**ka)
- +
- +
- +class PackageKitPisiBackend(PackageKitBaseBackend, PackagekitPackage):
- +
- + SETTINGS_FILE = "/etc/PackageKit/pisi.conf"
- +
- + def __init__(self, args):
- + self.bug_regex = None
- + self.bug_uri = None
- + self._load_settings()
- + PackageKitBaseBackend.__init__(self, args)
- +
- + self.componentdb = pisi.db.componentdb.ComponentDB()
- + # self.filesdb = pisi.db.filesdb.FilesDB()
- + self.installdb = pisi.db.installdb.InstallDB()
- + self.packagedb = pisi.db.packagedb.PackageDB()
- + self.repodb = pisi.db.repodb.RepoDB()
- +
- + # Do not ask any question to users
- + self.options = pisi.config.Options()
- + self.options.yes_all = True
- +
- + self.saved_ui = pisi.context.ui
- +
- + def _load_settings(self):
- + """ Load the PK Group-> PiSi component mapping """
- + if os.path.exists(self.SETTINGS_FILE):
- + with open(self.SETTINGS_FILE, "r") as mapping:
- + self.groups = {}
- + for line in mapping.readlines():
- + line = line.replace("\r", "").replace("\n", "").strip()
- + if line.strip() == "" or "#" in line:
- + continue
- +
- + splits = line.split("=")
- + key = splits[0].strip()
- + value = splits[1].strip()
- +
- + # Check if this contains our bug keys
- + if key == "Bug-Regex":
- + self.bug_regex = re.compile(value)
- + continue
- + if key == "Bug-URI":
- + self.bug_uri = value
- + continue
- + self.groups[key] = value
- + else:
- + self.groups = {}
- +
- + def __get_package_version(self, package):
- + """ Returns version string of given package """
- + # Internal FIXME: PiSi may provide this
- + if package.build is not None:
- + version = "%s-%s-%s" % (package.version, package.release,
- + package.build)
- + else:
- + version = "%s-%s" % (package.version, package.release)
- + return version
- +
- + def __get_package(self, package, filters=None):
- + """ Returns package object suitable for other methods """
- + if self.installdb.has_package(package):
- + status = INFO_INSTALLED
- + pkg = self.installdb.get_package(package)
- + elif self.packagedb.has_package(package):
- + status = INFO_AVAILABLE
- + pkg = self.packagedb.get_package(package)
- + else:
- + self.error(ERROR_PACKAGE_NOT_FOUND, "Package was not found")
- +
- + if filters:
- + if "none" not in filters:
- + if FILTER_INSTALLED in filters and status != INFO_INSTALLED:
- + return
- + if FILTER_NOT_INSTALLED in filters and status == INFO_INSTALLED:
- + return
- + if FILTER_GUI in filters and "app:gui" not in pkg.isA:
- + return
- + if FILTER_NOT_GUI in filters and "app:gui" in pkg.isA:
- + return
- +
- + version = self.__get_package_version(pkg)
- +
- + id = self.get_package_id(pkg.name, version, pkg.architecture, "")
- +
- + return self.package(id, status, pkg.summary)
- +
- + def depends_on(self, filters, package_ids, recursive):
- + """ Prints a list of depends for a given package """
- + self.allow_cancel(True)
- + self.percentage(None)
- +
- + package = self.get_package_from_id(package_ids[0])[0]
- +
- + for pkg in self.packagedb.get_package(package).runtimeDependencies():
- + # FIXME: PiSi API has really inconsistent for return types
- + # and arguments!
- + self.__get_package(pkg.package)
- +
- + def get_details(self, package_ids):
- + """ Prints a detailed description for a given package """
- + self.allow_cancel(True)
- + self.percentage(None)
- +
- + package = self.get_package_from_id(package_ids[0])[0]
- +
- + if self.packagedb.has_package(package):
- + pkg = self.packagedb.get_package(package)
- + repo = self.packagedb.get_package_repo(pkg.name, None)
- + pkg_id = self.get_package_id(pkg.name,
- + self.__get_package_version(pkg),
- + pkg.architecture, repo[1])
- +
- + if pkg.partOf in self.groups:
- + group = self.groups[pkg.partOf]
- + else:
- + group = GROUP_UNKNOWN
- +
- + homepage = pkg.source.homepage if pkg.source.homepage is not None\
- + else ''
- +
- + self.details(pkg_id, '', ",".join(pkg.license), group, pkg.description,
- + homepage, pkg.packageSize)
- + else:
- + self.error(ERROR_PACKAGE_NOT_FOUND, "Package was not found")
- +
- + def get_files(self, package_ids):
- + """ Prints a file list for a given package """
- + self.allow_cancel(True)
- + self.percentage(None)
- +
- + package = self.get_package_from_id(package_ids[0])[0]
- +
- + if self.installdb.has_package(package):
- + pkg = self.packagedb.get_package(package)
- + repo = self.packagedb.get_package_repo(pkg.name, None)
- + pkg_id = self.get_package_id(pkg.name,
- + self.__get_package_version(pkg),
- + pkg.architecture, repo[1])
- +
- + pkg = self.installdb.get_files(package)
- +
- + files = map(lambda y: "/%s" % y.path, pkg.list)
- +
- + file_list = ";".join(files)
- + self.files(pkg_id, file_list)
- +
- + def get_repo_list(self, filters):
- + """ Prints available repositories """
- + self.allow_cancel(True)
- + self.percentage(None)
- +
- + for repo in pisi.api.list_repos():
- + # Internal FIXME: What an ugly way to get repo uri
- + # FIXME: Use repository enabled/disabled state
- + uri = self.repodb.get_repo(repo).indexuri.get_uri()
- + self.repo_detail(repo, uri, True)
- +
- + def required_by(self, filters, package_ids, recursive):
- + """ Prints a list of requires for a given package """
- + self.allow_cancel(True)
- + self.percentage(None)
- +
- + package = self.get_package_from_id(package_ids[0])[0]
- +
- + # FIXME: Handle packages which is not installed from repository
- + for pkg in self.packagedb.get_rev_deps(package):
- + self.__get_package(pkg[0])
- +
- + def get_updates(self, filter):
- + """ Prints available updates and types """
- + self.allow_cancel(True)
- + self.percentage(None)
- +
- + self._updates = dict()
- + for package in pisi.api.list_upgradable():
- + pkg = self.packagedb.get_package(package)
- + version = self.__get_package_version(pkg)
- + id = self.get_package_id(pkg.name, version, pkg.architecture, "")
- + installed_package = self.installdb.get_package(package)
- +
- + repo = self.packagedb.get_package_repo(pkg.name, None)[1]
- + pindex = "/var/lib/pisi/index/%s/pisi-index.xml" % repo
- +
- + self._updates[pkg.name] = \
- + self._extract_update_details(pindex, pkg.name)
- + bug_uri = self._updates[pkg.name][3]
- +
- + # FIXME: PiSi must provide this information as a single API call :(
- + updates = [i for i in self.packagedb.get_package(package).history
- + if pisi.version.Version(i.release) >
- + installed_package.release]
- + if pisi.util.any(lambda i: i.type == "security", updates):
- + self.package(id, INFO_SECURITY, pkg.summary)
- + elif bug_uri != "":
- + self.package(id, INFO_BUGFIX, pkg.summary)
- + else:
- + self.package(id, INFO_NORMAL, pkg.summary)
- +
- + def _extract_update_details(self, pindex, package_name):
- + document = piksemel.parse(pindex)
- + packages = document.tags("Package")
- + for pkg in packages:
- + if pkg.getTagData("Name") == package_name:
- + history = pkg.getTag("History")
- + update = history.tags("Update")
- + update_message = "Updated"
- + update_release = 0
- + update_date = ""
- + needsReboot = False
- + bugURI = ""
- + for update in update:
- + if int(update.getAttribute("release")) > update_release:
- + update_release = int(update.getAttribute("release"))
- + # updater = update.getTagData("Name")
- + update_message = update.getTagData("Comment")
- + update_message = update_message.replace("\n", ";")
- + update_date = update.getTagData("Date")
- + needsReboot = False
- + try:
- + requires = update.getTag("Requires")
- + action = requires.getTagData("Action")
- + if action == "systemRestart":
- + needsReboot = True
- + except Exception:
- + pass
- + # Determine if this is a bug fix
- + for line in update_message.split(";"):
- + m = self.bug_regex.match(line)
- + if m is not None:
- + bugURI = self.bug_uri % m.group(1)
- + break
- + return (update_message, update_date, needsReboot, bugURI)
- + pkg = pkg.nextTag("Package")
- + return("Log not found", "", False, "")
- +
- + def get_update_detail(self, package_ids):
- + for package_id in package_ids:
- + package = self.get_package_from_id(package_id)[0]
- + the_package = self.installdb.get_package(package)
- + updates = [package_id]
- + obsoletes = ""
- + # TODO: Add regex matching for #FIXES:ID or something similar
- + cve_url = ""
- + package_url = the_package.source.homepage
- + vendor_url = package_url if package_url is not None else ""
- + issued = ""
- +
- + changelog = ""
- + # TODO: Set to security_issued if security update
- + issued = updated = ""
- + update_message, security_issued, needsReboot, bugURI = \
- + self._updates[package]
- +
- + # TODO: Add tagging to repo's, or a mapping file
- + state = UPDATE_STATE_STABLE
- + reboot = "system" if needsReboot else "none"
- +
- + self.update_detail(package_id, updates, obsoletes, vendor_url,
- + bugURI, cve_url, reboot, update_message,
- + changelog, state, issued, updated)
- +
- + def download_packages(self, directory, package_ids):
- + """ Download the given packages to a directory """
- + self.allow_cancel(False)
- + self.percentage(None)
- + self.status(STATUS_DOWNLOAD)
- +
- + packages = list()
- +
- + def progress_cb(**kw):
- + self.percentage(int(kw['percent']))
- +
- + ui = SimplePisiHandler()
- + for package_id in package_ids:
- + package = self.get_package_from_id(package_id)[0]
- + packages.append(package)
- + try:
- + pkg = self.packagedb.get_package(package)
- + except:
- + self.error(ERROR_PACKAGE_NOT_FOUND, "Package was not found")
- + try:
- + pisi.api.set_userinterface(ui)
- + ui.the_callback = progress_cb
- + if directory is None:
- + directory = os.path.curdir
- + pisi.api.fetch(packages, directory)
- + # Scan for package
- + for package in packages:
- + package_obj = self.packagedb.get_package(package)
- + uri = package_obj.packageURI.split("/")[-1]
- + location = os.path.join(directory, uri)
- + self.files(package_id, location)
- + pisi.api.set_userinterface(self.saved_ui)
- + except Exception, e:
- + self.error(ERROR_PACKAGE_DOWNLOAD_FAILED,
- + "Could not download package: %s" % e)
- + self.percentage(None)
- +
- + def install_files(self, only_trusted, files):
- + """ Installs given package into system"""
- +
- + # FIXME: use only_trusted
- +
- + # FIXME: install progress
- + self.allow_cancel(False)
- + self.percentage(None)
- +
- + def progress_cb(**kw):
- + self.percentage(int(kw['percent']))
- +
- + ui = SimplePisiHandler()
- +
- + self.status(STATUS_INSTALL)
- + pisi.api.set_userinterface(ui)
- + ui.the_callback = progress_cb
- +
- + try:
- + self.status(STATUS_INSTALL)
- + pisi.api.install(files)
- + except pisi.Error, e:
- + # FIXME: Error: internal-error : Package re-install declined
- + # Force needed?
- + self.error(ERROR_PACKAGE_ALREADY_INSTALLED, e)
- + pisi.api.set_userinterface(self.saved_ui)
- +
- + def _report_all_for_package(self, package, remove=False):
- + """ Report all deps for the given package """
- + if not remove:
- + deps = self.packagedb.get_package(package).runtimeDependencies()
- + # TODO: Add support to report conflicting packages requiring removal
- + #conflicts = self.packagedb.get_package (package).conflicts
- + for dep in deps:
- + if not self.installdb.has_package(dep.name()):
- + dep_pkg = self.packagedb.get_package(dep.name())
- + repo = self.packagedb.get_package_repo(dep_pkg.name, None)
- + version = self.__get_package_version(dep_pkg)
- + pkg_id = self.get_package_id(dep_pkg.name, version,
- + dep_pkg.architecture, repo[1])
- + self.package(pkg_id, INFO_INSTALLING, dep_pkg.summary)
- + else:
- + rev_deps = self.installdb.get_rev_deps(package)
- + for rev_dep, depinfo in rev_deps:
- + if self.installdb.has_package(rev_dep):
- + dep_pkg = self.packagedb.get_package(rev_dep)
- + repo = self.packagedb.get_package_repo(dep_pkg.name, None)
- + version = self.__get_package_version(dep_pkg)
- + pkg_id = self.get_package_id(dep_pkg.name, version,
- + dep_pkg.architecture, repo[1])
- + self.package(pkg_id, INFO_REMOVING, dep_pkg.summary)
- +
- + def install_packages(self, transaction_flags, package_ids):
- + """ Installs given package into system"""
- + # FIXME: fetch/install progress
- + self.allow_cancel(False)
- + self.percentage(None)
- +
- + packages = list()
- +
- + # FIXME: use only_trusted
- + for package_id in package_ids:
- + package = self.get_package_from_id(package_id)[0]
- + if self.installdb.has_package(package):
- + self.error(ERROR_PACKAGE_NOT_INSTALLED,
- + "Package is already installed")
- + packages.append(package)
- +
- + def progress_cb(**kw):
- + self.percentage(int(kw['percent']))
- +
- + ui = SimplePisiHandler()
- +
- + self.status(STATUS_INSTALL)
- + pisi.api.set_userinterface(ui)
- + ui.the_callback = progress_cb
- +
- + if TRANSACTION_FLAG_SIMULATE in transaction_flags:
- + # Simulated, not real.
- + for package in packages:
- + self._report_all_for_package(package)
- + return
- + try:
- + pisi.api.install(packages)
- + except pisi.Error, e:
- + self.error(ERROR_UNKNOWN, e)
- + pisi.api.set_userinterface(self.saved_ui)
- +
- + def refresh_cache(self, force):
- + """ Updates repository indexes """
- + # TODO: use force ?
- + self.allow_cancel(False)
- + self.percentage(0)
- + self.status(STATUS_REFRESH_CACHE)
- +
- + slice = (100 / len(pisi.api.list_repos())) / 2
- +
- + percentage = 0
- + for repo in pisi.api.list_repos():
- + pisi.api.update_repo(repo)
- + percentage += slice
- + self.percentage(percentage)
- +
- + self.percentage(100)
- +
- + def remove_packages(self, transaction_flags, package_ids,
- + allowdeps, autoremove):
- + """ Removes given package from system"""
- + self.allow_cancel(False)
- + self.percentage(None)
- + # TODO: use autoremove
- + packages = list()
- +
- + for package_id in package_ids:
- + package = self.get_package_from_id(package_id)[0]
- + if not self.installdb.has_package(package):
- + self.error(ERROR_PACKAGE_NOT_INSTALLED,
- + "Package is not installed")
- + packages.append(package)
- +
- + def progress_cb(**kw):
- + self.percentage(int(kw['percent']))
- +
- + ui = SimplePisiHandler()
- +
- + package = self.get_package_from_id(package_ids[0])[0]
- + self.status(STATUS_REMOVE)
- +
- + if TRANSACTION_FLAG_SIMULATE in transaction_flags:
- + # Simulated, not real.
- + for package in packages:
- + self._report_all_for_package(package, remove=True)
- + return
- + try:
- + pisi.api.remove(packages)
- + except pisi.Error, e:
- + self.error(ERROR_CANNOT_REMOVE_SYSTEM_PACKAGE, e)
- + pisi.api.set_userinterface(self.saved_ui)
- +
- + def repo_set_data(self, repo_id, parameter, value):
- + """ Sets a parameter for the repository specified """
- + self.allow_cancel(False)
- + self.percentage(None)
- +
- + if parameter == "add-repo":
- + try:
- + pisi.api.add_repo(repo_id, value, parameter)
- + except pisi.Error, e:
- + self.error(ERROR_UNKNOWN, e)
- +
- + try:
- + pisi.api.update_repo(repo_id)
- + except pisi.fetcher.FetchError:
- + pisi.api.remove_repo(repo_id)
- + err = "Could not reach the repository, removing from system"
- + self.error(ERROR_REPO_NOT_FOUND, err)
- + elif parameter == "remove-repo":
- + try:
- + pisi.api.remove_repo(repo_id)
- + except pisi.Error:
- + self.error(ERROR_REPO_NOT_FOUND, "Repository does not exist")
- + else:
- + self.error(ERROR_NOT_SUPPORTED, "Parameter not supported")
- +
- + def resolve(self, filters, package):
- + """ Turns a single package name into a package_id
- + suitable for the other methods """
- + self.allow_cancel(True)
- + self.percentage(None)
- +
- + self.__get_package(package[0], filters)
- +
- + def search_details(self, filters, values):
- + """ Prints a detailed list of packages contains search term """
- + self.allow_cancel(True)
- + self.percentage(None)
- + self.status(STATUS_INFO)
- +
- + # Internal FIXME: Use search_details instead of _package when API
- + # gains that ability :)
- + for pkg in pisi.api.search_package(values):
- + self.__get_package(pkg, filters)
- +
- + def search_file(self, filters, values):
- + """ Prints the installed package which contains the specified file """
- + self.allow_cancel(True)
- + self.percentage(None)
- + self.status(STATUS_INFO)
- +
- + for value in values:
- + # Internal FIXME: Why it is needed?
- + value = value.lstrip("/")
- +
- + for pkg, files in pisi.api.search_file(value):
- + self.__get_package(pkg)
- +
- + def search_group(self, filters, values):
- + """ Prints a list of packages belongs to searched group """
- + self.allow_cancel(True)
- + self.percentage(None)
- + self.status(STATUS_INFO)
- +
- + for value in values:
- + packages = list()
- + for item in self.groups:
- + if self.groups[item] == value:
- + try:
- + pkgs = self.componentdb.get_packages(item, walk=False)
- + packages.extend(pkgs)
- + except:
- + self.error(ERROR_GROUP_NOT_FOUND,
- + "Component %s was not found" % value)
- + for pkg in packages:
- + self.__get_package(pkg, filters)
- +
- + def search_name(self, filters, values):
- + """ Prints a list of packages contains search term in its name """
- + self.allow_cancel(True)
- + self.percentage(None)
- + self.status(STATUS_INFO)
- +
- + for value in values:
- + for pkg in pisi.api.search_package([value]):
- + self.__get_package(pkg, filters)
- +
- + def update_packages(self, transaction_flags, package_ids):
- + """ Updates given package to its latest version """
- +
- + # FIXME: use only_trusted
- +
- + # FIXME: fetch/install progress
- + self.allow_cancel(False)
- + self.percentage(None)
- +
- + packages = list()
- + for package_id in package_ids:
- + package = self.get_package_from_id(package_id)[0]
- + if not self.installdb.has_package(package):
- + self.error(ERROR_PACKAGE_NOT_INSTALLED,
- + "Cannot update a package that is not installed")
- + packages.append(package)
- +
- + def progress_cb(**kw):
- + self.percentage(int(kw['percent']))
- +
- + ui = SimplePisiHandler()
- + pisi.api.set_userinterface(ui)
- + ui.the_callback = progress_cb
- +
- + if TRANSACTION_FLAG_SIMULATE in transaction_flags:
- + for package in packages:
- + self._report_all_for_package(package)
- + return
- + try:
- + pisi.api.upgrade(packages)
- + except pisi.Error, e:
- + self.error(ERROR_UNKNOWN, e)
- + pisi.api.set_userinterface(self.saved_ui)
- +
- + def update_system(self, only_trusted):
- + """ Updates all available packages """
- + # FIXME: use only_trusted
- + # FIXME: fetch/install progress
- + self.allow_cancel(False)
- + self.percentage(None)
- +
- + if not len(pisi.api.list_upgradable()) > 0:
- + self.error(ERROR_NO_PACKAGES_TO_UPDATE, "System is already up2date")
- +
- + try:
- + pisi.api.upgrade(pisi.api.list_upgradable())
- + except pisi.Error, e:
- + self.error(ERROR_UNKNOWN, e)
- +
- +
- +def main():
- + backend = PackageKitPisiBackend('')
- + backend.dispatcher(sys.argv[1:])
- +
- +if __name__ == "__main__":
- + main()
- \ No newline at end of file
- diff --git a/backends/pisi/pk-backend-pisi.c b/backends/pisi/pk-backend-pisi.c
- new file mode 100644
- index 000000000..beb2f5836
- --- /dev/null
- +++ b/backends/pisi/pk-backend-pisi.c
- @@ -0,0 +1,369 @@
- +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
- + *
- + * Copyright (C) 2007 Richard Hughes <richard@hughsie.com>
- + * Copyright (C) 2007 S.Çağlar Onur <caglar@pardus.org.tr>
- + *
- + * Licensed under the GNU General Public License Version 2
- + *
- + * This program is free software; you can redistribute it and/or modify
- + * it under the terms of the GNU General Public License as published by
- + * the Free Software Foundation; either version 2 of the License, or
- + * (at your option) any later version.
- + *
- + * This program is distributed in the hope that it will be useful,
- + * but WITHOUT ANY WARRANTY; without even the implied warranty of
- + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- + * GNU General Public License for more details.
- + *
- + * You should have received a copy of the GNU General Public License
- + * along with this program; if not, write to the Free Software
- + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- + */
- +
- +#include <pk-backend.h>
- +#include <pk-backend-spawn.h>
- +
- +static PkBackendSpawn *spawn;
- +
- +void
- +pk_backend_start_job (PkBackend *backend, PkBackendJob *job)
- +{
- + if (pk_backend_spawn_is_busy (spawn)) {
- + pk_backend_job_error_code (job,
- + PK_ERROR_ENUM_LOCK_REQUIRED,
- + "spawned backend requires lock");
- + return;
- + }
- +}
- +
- +void
- +pk_backend_initialize (GKeyFile *conf, PkBackend *backend)
- +{
- + g_debug ("backend: initialize");
- +
- + /* BACKEND MAINTAINER: feel free to remove this when you've
- + * added support for ONLY_DOWNLOAD and merged the simulate
- + * methods as specified in backends/PORTING.txt */
- + /*g_error ("Backend needs to be ported to 0.8.x -- "
- + "see backends/PORTING.txt for details"); */
- +
- + spawn = pk_backend_spawn_new (conf);
- + pk_backend_spawn_set_name (spawn, "pisi");
- +}
- +
- +void
- +pk_backend_destroy (PkBackend *backend)
- +{
- + g_debug ("backend: destroy");
- + g_object_unref (spawn);
- +}
- +
- +PkBitfield
- +pk_backend_get_groups (PkBackend *backend)
- +{
- + return pk_bitfield_from_enums (
- + PK_GROUP_ENUM_ACCESSORIES,
- + PK_GROUP_ENUM_EDUCATION,
- + PK_GROUP_ENUM_GAMES,
- + PK_GROUP_ENUM_INTERNET,
- + PK_GROUP_ENUM_OTHER,
- + PK_GROUP_ENUM_PROGRAMMING,
- + PK_GROUP_ENUM_MULTIMEDIA,
- + PK_GROUP_ENUM_SYSTEM,
- + PK_GROUP_ENUM_DESKTOP_GNOME,
- + PK_GROUP_ENUM_DESKTOP_KDE,
- + PK_GROUP_ENUM_DESKTOP_OTHER,
- + PK_GROUP_ENUM_PUBLISHING,
- + PK_GROUP_ENUM_SERVERS,
- + PK_GROUP_ENUM_FONTS,
- + PK_GROUP_ENUM_ADMIN_TOOLS,
- + PK_GROUP_ENUM_LOCALIZATION,
- + PK_GROUP_ENUM_VIRTUALIZATION,
- + PK_GROUP_ENUM_SECURITY,
- + PK_GROUP_ENUM_POWER_MANAGEMENT,
- + PK_GROUP_ENUM_UNKNOWN,
- + -1);
- +}
- +
- +PkBitfield
- +pk_backend_get_filters (PkBackend *backend)
- +{
- + return pk_bitfield_from_enums(
- + PK_FILTER_ENUM_GUI,
- + PK_FILTER_ENUM_INSTALLED,
- + -1);
- +}
- +
- +void
- +pk_backend_cancel (PkBackend *backend, PkBackendJob *job)
- +{
- + /* this feels bad... */
- + pk_backend_spawn_kill (spawn);
- +}
- +
- +void
- +pk_backend_download_packages (PkBackend *backend, PkBackendJob *job, gchar **package_ids, const gchar *directory)
- +{
- + gchar *package_ids_temp;
- +
- + /* send the complete list as stdin */
- + package_ids_temp = pk_package_ids_to_string (package_ids);
- + pk_backend_spawn_helper (spawn, job, "pisiBackend.py", "download-packages", directory, package_ids_temp, NULL);
- + g_free (package_ids_temp);
- +}
- +
- +void
- +pk_backend_depends_on (PkBackend *backend, PkBackendJob *job, PkBitfield filters, gchar **package_ids, gboolean recursive)
- +{
- + gchar *filters_text;
- + gchar *package_ids_temp;
- + package_ids_temp = pk_package_ids_to_string (package_ids);
- + filters_text = pk_filter_bitfield_to_string (filters);
- + pk_backend_spawn_helper (spawn, job, "pisiBackend.py", "depends-on", filters_text, package_ids_temp, pk_backend_bool_to_string (recursive), NULL);
- + g_free (filters_text);
- + g_free (package_ids_temp);
- +}
- +
- +void
- +pk_backend_get_details (PkBackend *backend, PkBackendJob *job, gchar **package_ids)
- +{
- + gchar *package_ids_temp;
- + package_ids_temp = pk_package_ids_to_string (package_ids);
- + pk_backend_spawn_helper (spawn, job, "pisiBackend.py", "get-details", package_ids_temp, NULL);
- + g_free (package_ids_temp);
- +}
- +
- +void
- +pk_backend_get_files (PkBackend *backend, PkBackendJob *job, gchar **package_ids)
- +{
- + gchar *package_ids_temp;
- + package_ids_temp = pk_package_ids_to_string (package_ids);
- + pk_backend_spawn_helper (spawn, job, "pisiBackend.py", "get-files", package_ids_temp, NULL);
- + g_free (package_ids_temp);
- +}
- +
- +void
- +pk_backend_required_by (PkBackend *backend, PkBackendJob *job, PkBitfield filters, gchar **package_ids, gboolean recursive)
- +{
- + gchar *filters_text;
- + gchar *package_ids_temp;
- + package_ids_temp = pk_package_ids_to_string (package_ids);
- + filters_text = pk_filter_bitfield_to_string (filters);
- + pk_backend_spawn_helper (spawn, job, "pisiBackend.py", "required-by", filters_text, package_ids_temp, pk_backend_bool_to_string (recursive), NULL);
- + g_free (filters_text);
- + g_free (package_ids_temp);
- +}
- +
- +void
- +pk_backend_get_updates (PkBackend *backend, PkBackendJob *job, PkBitfield filters)
- +{
- + gchar *filters_text;
- + filters_text = pk_filter_bitfield_to_string (filters);
- + pk_backend_spawn_helper (spawn, job, "pisiBackend.py", "get-updates", filters_text, NULL);
- + g_free (filters_text);
- +}
- +
- +void
- +pk_backend_get_update_detail (PkBackend *backend, PkBackendJob *job, gchar **package_ids)
- +{
- + gchar *package_ids_temp;
- + package_ids_temp = pk_package_ids_to_string (package_ids);
- + pk_backend_spawn_helper (spawn, job, "pisiBackend.py", "get-update-detail", package_ids_temp, NULL);
- + g_free (package_ids_temp);
- +}
- +
- +void
- +pk_backend_install_packages (PkBackend *backend, PkBackendJob *job, PkBitfield transaction_flags, gchar **package_ids)
- +{
- + gchar *package_ids_temp;
- + gchar *transaction_flags_temp;
- +
- + /* check network state */
- + if (!pk_backend_is_online (backend)) {
- + pk_backend_job_error_code (job, PK_ERROR_ENUM_NO_NETWORK, "Cannot install when offline");
- + pk_backend_job_finished (job);
- + return;
- + }
- +
- + /* send the complete list as stdin */
- + package_ids_temp = pk_package_ids_to_string (package_ids);
- + transaction_flags_temp = pk_transaction_flag_bitfield_to_string (transaction_flags);
- +
- + pk_backend_spawn_helper (spawn, job, "pisiBackend.py", "install-packages", transaction_flags_temp, package_ids_temp, NULL);
- + g_free (package_ids_temp);
- + g_free (transaction_flags_temp);
- +}
- +
- +void
- +pk_backend_install_files (PkBackend *backend, PkBackendJob *job, PkBitfield transaction_flags, gchar **full_paths)
- +{
- + gchar *package_ids_temp;
- + gchar *transaction_flags_temp;
- +
- + /* send the complete list as stdin */
- + package_ids_temp = g_strjoinv (PK_BACKEND_SPAWN_FILENAME_DELIM, full_paths);
- + transaction_flags_temp = pk_transaction_flag_bitfield_to_string (transaction_flags);
- +
- + pk_backend_spawn_helper (spawn, job, "pisiBackend.py", "install-files", transaction_flags_temp, package_ids_temp, NULL);
- + g_free (package_ids_temp);
- + g_free (transaction_flags_temp);
- +}
- +
- +void
- +pk_backend_refresh_cache (PkBackend *backend, PkBackendJob *job, gboolean force)
- +{
- + /* check network state */
- + if (!pk_backend_is_online (backend)) {
- + pk_backend_job_error_code (job, PK_ERROR_ENUM_NO_NETWORK, "Cannot refresh cache whilst offline");
- + pk_backend_job_finished (job);
- + return;
- + }
- +
- + pk_backend_spawn_helper (spawn, job, "pisiBackend.py", "refresh-cache", pk_backend_bool_to_string (force), NULL);
- +}
- +
- +void
- +pk_backend_remove_packages (PkBackend *backend, PkBackendJob *job,
- + PkBitfield transaction_flags,
- + gchar **package_ids,
- + gboolean allow_deps,
- + gboolean autoremove)
- +{
- + gchar *package_ids_temp;
- + gchar *transaction_flags_temp;
- +
- + /* send the complete list as stdin */
- + package_ids_temp = pk_package_ids_to_string (package_ids);
- + transaction_flags_temp = pk_transaction_flag_bitfield_to_string (transaction_flags);
- + pk_backend_spawn_helper (spawn,
- + job, "pisiBackend.py",
- + "remove-packages",
- + transaction_flags_temp,
- + package_ids_temp,
- + pk_backend_bool_to_string (allow_deps),
- + pk_backend_bool_to_string (autoremove),
- + NULL);
- +
- + g_free (transaction_flags_temp);
- + g_free (package_ids_temp);
- +}
- +
- +void
- +pk_backend_search_details (PkBackend *backend, PkBackendJob *job, PkBitfield filters, gchar **values)
- +{
- + gchar *filters_text;
- + gchar *search;
- + filters_text = pk_filter_bitfield_to_string (filters);
- + search = g_strjoinv ("&", values);
- + pk_backend_spawn_helper (spawn, job, "pisiBackend.py", "search-details", filters_text, search, NULL);
- + g_free (search);
- + g_free (filters_text);
- +}
- +
- +void
- +pk_backend_search_files (PkBackend *backend, PkBackendJob *job, PkBitfield filters, gchar **values)
- +{
- + gchar *filters_text;
- + gchar *search;
- + filters_text = pk_filter_bitfield_to_string (filters);
- + search = g_strjoinv ("&", values);
- + pk_backend_spawn_helper (spawn, job, "pisiBackend.py", "search-file", filters_text, search, NULL);
- + g_free (search);
- + g_free (filters_text);
- +}
- +
- +void
- +pk_backend_search_groups (PkBackend *backend, PkBackendJob *job, PkBitfield filters, gchar **values)
- +{
- + gchar *filters_text;
- + gchar *search;
- + filters_text = pk_filter_bitfield_to_string (filters);
- + search = g_strjoinv ("&", values);
- + pk_backend_spawn_helper (spawn, job, "pisiBackend.py", "search-group", filters_text, search, NULL);
- + g_free (search);
- + g_free (filters_text);
- +}
- +
- +void
- +pk_backend_search_names (PkBackend *backend, PkBackendJob *job, PkBitfield filters, gchar **values)
- +{
- + gchar *filters_text;
- + gchar *search;
- + filters_text = pk_filter_bitfield_to_string (filters);
- + search = g_strjoinv ("&", values);
- + pk_backend_spawn_helper (spawn, job, "pisiBackend.py", "search-name", filters_text, search, NULL);
- + g_free (search);
- + g_free (filters_text);
- +}
- +
- +void
- +pk_backend_update_packages (PkBackend *backend, PkBackendJob *job, PkBitfield transaction_flags, gchar **package_ids)
- +{
- + gchar *package_ids_temp;
- + gchar *transaction_flags_temp;
- +
- + /* check network state */
- + if (!pk_backend_is_online (backend)) {
- + pk_backend_job_error_code (job, PK_ERROR_ENUM_NO_NETWORK, "Cannot install when offline");
- + pk_backend_job_finished (job);
- + return;
- + }
- +
- + /* send the complete list as stdin */
- + package_ids_temp = pk_package_ids_to_string (package_ids);
- + transaction_flags_temp = pk_transaction_flag_bitfield_to_string (transaction_flags);
- +
- + pk_backend_spawn_helper (spawn, job, "pisiBackend.py", "update-packages", transaction_flags_temp, package_ids_temp, NULL);
- + g_free (package_ids_temp);
- + g_free (transaction_flags_temp);
- +}
- +
- +void
- +pk_backend_update_system (PkBackend *backend, PkBackendJob *job, PkBitfield transaction_flags)
- +{
- + gchar *transaction_flags_temp;
- + transaction_flags_temp = pk_transaction_flag_bitfield_to_string (transaction_flags);
- +
- + pk_backend_spawn_helper (spawn, job, "pisiBackend.py", "update-system", transaction_flags_temp, NULL);
- +
- + g_free (transaction_flags_temp);
- +}
- +
- +void
- +pk_backend_resolve (PkBackend *backend, PkBackendJob *job, PkBitfield filters, gchar **package_ids)
- +{
- + gchar *filters_text;
- + gchar *package_ids_temp;
- + filters_text = pk_filter_bitfield_to_string (filters);
- + package_ids_temp = pk_package_ids_to_string (package_ids);
- + pk_backend_spawn_helper (spawn, job, "pisiBackend.py", "resolve", filters_text, package_ids_temp, NULL);
- + g_free (filters_text);
- + g_free (package_ids_temp);
- +}
- +
- +void
- +pk_backend_get_repo_list (PkBackend *backend, PkBackendJob *job, PkBitfield filters)
- +{
- + gchar *filters_text;
- + filters_text = pk_filter_bitfield_to_string (filters);
- + pk_backend_spawn_helper (spawn, job, "pisiBackend.py", "get-repo-list", filters_text, NULL);
- + g_free (filters_text);
- +}
- +
- +void
- +pk_backend_repo_set_data (PkBackend *backend, PkBackendJob *job, const gchar *rid, const gchar *parameter, const gchar *value)
- +{
- + pk_backend_spawn_helper (spawn, job, "pisiBackend.py", "repo-set-data", rid, parameter, value, NULL);
- +}
- +
- +const gchar *
- +pk_backend_get_description (PkBackend *backend)
- +{
- + return "PiSi - Packages Installed Successfully as Intended";
- +}
- +
- +const gchar *
- +pk_backend_get_author (PkBackend *backend)
- +{
- + return "S.Çağlar Onur <caglar@pardus.org.tr>\nIkey Doherty <ikey@solusos.com>\nBerk Çakar <berk2238@hotmail.com>";
- +}
- diff --git a/meson_options.txt b/meson_options.txt
- index 2f3a1dac9..7623dc9c2 100644
- --- a/meson_options.txt
- +++ b/meson_options.txt
- @@ -1,4 +1,4 @@
- -option('packaging_backend', type : 'array', choices : ['alpm', 'aptcc', 'dnf', 'dummy', 'entropy', 'poldek', 'portage', 'slack', 'zypp', 'nix'], value : ['dummy'], description : 'The name of the backend to use')
- +option('packaging_backend', type : 'array', choices : ['alpm', 'aptcc', 'dnf', 'dummy', 'entropy', 'pisi', 'poldek', 'portage', 'slack', 'zypp', 'nix'], value : ['dummy'], description : 'The name of the backend to use')
- option('dnf_vendor', type : 'combo', choices : ['fedora', 'mageia', 'openmandriva', 'rosa', 'opensuse'], value : 'fedora', description : 'Vendor configuration when using the dnf backend')
- option('systemd', type : 'boolean', value : true, description : 'Use systemd and logind')
- option('systemdsystemunitdir', type : 'string', value : '', description : 'Directory for systemd service files')
- --
- 2.24.3 (Apple Git-128)
|