From ac0efd1bd6c703147bd8d3caedf489fab87d6131 Mon Sep 17 00:00:00 2001 From: V3n3RiX Date: Sat, 6 Jun 2020 16:22:04 +0100 Subject: big rewrite : split the backend in smaller pieces, rework the cli frontend to work with the new backend ... gui frontend wip --- src/backend/__init__.py | 0 src/backend/binhost.py | 15 + src/backend/branchinject.py | 41 ++ src/backend/branchmaster.py | 73 ++++ src/backend/branchnext.py | 73 ++++ src/backend/branchreset.py | 38 ++ src/backend/check.py | 49 +++ src/backend/clean.py | 13 + src/backend/csvfiles.py | 21 + src/backend/database.py | 61 +++ src/backend/help.py | 61 +++ src/backend/install.py | 122 ++++++ src/backend/killportage.py | 4 + src/backend/libsisyphus.py | 865 --------------------------------------- src/backend/metadata.py | 35 ++ src/backend/mirror.py | 60 +++ src/backend/removeorphans.py | 11 + src/backend/rescue.py | 24 ++ src/backend/search.py | 6 + src/backend/setjobs.py | 8 + src/backend/setprofile.py | 9 + src/backend/solvedeps.py | 69 ++++ src/backend/sync.py | 46 +++ src/backend/sysinfo.py | 7 + src/backend/uninstall.py | 11 + src/backend/uninstallforce.py | 11 + src/backend/update.py | 39 ++ src/backend/upgrade.py | 123 ++++++ src/frontend/cli/sisyphus-cli.py | 67 +-- 29 files changed, 1069 insertions(+), 893 deletions(-) create mode 100644 src/backend/__init__.py create mode 100644 src/backend/binhost.py create mode 100644 src/backend/branchinject.py create mode 100644 src/backend/branchmaster.py create mode 100644 src/backend/branchnext.py create mode 100644 src/backend/branchreset.py create mode 100644 src/backend/check.py create mode 100644 src/backend/clean.py create mode 100644 src/backend/csvfiles.py create mode 100644 src/backend/database.py create mode 100644 src/backend/help.py create mode 100644 src/backend/install.py create mode 100644 src/backend/killportage.py delete mode 100644 src/backend/libsisyphus.py create mode 100644 src/backend/metadata.py create mode 100644 src/backend/mirror.py create mode 100644 src/backend/removeorphans.py create mode 100644 src/backend/rescue.py create mode 100644 src/backend/search.py create mode 100644 src/backend/setjobs.py create mode 100644 src/backend/setprofile.py create mode 100644 src/backend/solvedeps.py create mode 100644 src/backend/sync.py create mode 100644 src/backend/sysinfo.py create mode 100644 src/backend/uninstall.py create mode 100644 src/backend/uninstallforce.py create mode 100644 src/backend/update.py create mode 100644 src/backend/upgrade.py diff --git a/src/backend/__init__.py b/src/backend/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/backend/binhost.py b/src/backend/binhost.py new file mode 100644 index 0000000..5bcf20c --- /dev/null +++ b/src/backend/binhost.py @@ -0,0 +1,15 @@ +#!/usr/bin/python3 + +import subprocess +import io + +def getURL(): + binhostURL = [] + portageExec = subprocess.Popen(['emerge', '--info', '--verbose'], stdout=subprocess.PIPE) + + for portageOutput in io.TextIOWrapper(portageExec.stdout, encoding="utf-8"): + if "PORTAGE_BINHOST" in portageOutput.rstrip(): + binhostURL = str(portageOutput.rstrip().split("=")[1].strip('\"')) + + portageExec.wait() + return binhostURL diff --git a/src/backend/branchinject.py b/src/backend/branchinject.py new file mode 100644 index 0000000..7c9a09f --- /dev/null +++ b/src/backend/branchinject.py @@ -0,0 +1,41 @@ +#!/usr/bin/python3 + +import sisyphus.check +import sisyphus.branchreset +import sisyphus.branchmaster +import sisyphus.branchnext +import sisyphus.metadata +import sisyphus.setjobs +import sisyphus.setprofile + +def gitlabMaster(): + sisyphus.check.root() + sisyphus.branchreset.start() + sisyphus.branchmaster.startGitlab() + sisyphus.setjobs.start() + sisyphus.setprofile.start() + sisyphus.metadata.regenAnimated() + +def PagureMaster(): + sisyphus.check.root() + sisyphus.branchreset.start() + sisyphus.branchmaster.startPagure() + sisyphus.setjobs.start() + sisyphus.setprofile.start() + sisyphus.metadata.regenAnimated() + +def GitlabNext(): + sisyphus.check.root() + sisyphus.branchreset.start() + sisyphus.branchnext.startGitlab() + sisyphus.setjobs.start() + sisyphus.setprofile.start() + sisyphus.metadata.regenAnimated() + +def PagureNext(): + sisyphus.check.root() + sisyphus.branchreset.start() + sisyphus.branchnext.startPagure() + sisyphus.setjobs.start() + sisyphus.setprofile.start() + sisyphus.metadata.regenAnimated() diff --git a/src/backend/branchmaster.py b/src/backend/branchmaster.py new file mode 100644 index 0000000..6229511 --- /dev/null +++ b/src/backend/branchmaster.py @@ -0,0 +1,73 @@ +#!/usr/bin/python3 + +import animation +import os +import subprocess + +gentooEbuildDir = '/usr/ports/gentoo' +redcoreEbuildDir = '/usr/ports/redcore' +portageConfigDir = '/opt/redcore-build' + +@animation.wait('injecting gentoo linux portage tree - branch master') +def setGitlabMasterStage1(): + if not os.path.isdir(os.path.join(gentooEbuildDir, '.git')): + os.chdir(gentooEbuildDir) + subprocess.call(['git', 'init', '-q']) + subprocess.call(['git', 'remote', 'add', 'origin', 'https://gitlab.com/redcore/portage.git']) + subprocess.call(['git', 'fetch', '--depth=1', 'origin', 'master', '--quiet']) + subprocess.call(['git', 'checkout', '-b', 'master', 'origin/master', '--quiet']) + +@animation.wait('injecting redcore linux ebuild tree - branch master') +def setGitlabMasterStage2(): + if not os.path.isdir(os.path.join(redcoreEbuildDir, '.git')): + os.chdir(redcoreEbuildDir) + subprocess.call(['git', 'init', '-q']) + subprocess.call(['git', 'remote', 'add', 'origin', 'https://gitlab.com/redcore/redcore-desktop.git']) + subprocess.call(['git', 'fetch', '--depth=1', 'origin', 'master', '--quiet']) + subprocess.call(['git', 'checkout', '-b', 'master', 'origin/master', '--quiet']) + +@animation.wait('injecting redcore linux portage configuration - branch master') +def setGitlabMasterStage3(): + if not os.path.isdir(os.path.join(portageConfigDir, '.git')): + os.chdir(portageConfigDir) + subprocess.call(['git', 'init', '-q']) + subprocess.call(['git', 'remote', 'add', 'origin', 'https://gitlab.com/redcore/redcore-build.git']) + subprocess.call(['git', 'fetch', '--depth=1', 'origin', 'master', '--quiet']) + subprocess.call(['git', 'checkout', '-b', 'master', 'origin/master', '--quiet']) + +def gitlabStart(): + setGitlabMasterStage1() + setGitlabMasterStage2() + setGitlabMasterStage3() + +@animation.wait('injecting gentoo linux portage tree - branch master') +def setPagureMasterStage1(): + if not os.path.isdir(os.path.join(gentooEbuildDir, '.git')): + os.chdir(gentooEbuildDir) + subprocess.call(['git', 'init', '-q']) + subprocess.call(['git', 'remote', 'add', 'origin', 'https://pagure.io/redcore/portage.git']) + subprocess.call(['git', 'fetch', '--depth=1', 'origin', 'master', '--quiet']) + subprocess.call(['git', 'checkout', '-b', 'master', 'origin/master', '--quiet']) + +@animation.wait('injecting redcore linux ebuild tree - branch master') +def setPagureMasterStage2(): + if not os.path.isdir(os.path.join(redcoreEbuildDir, '.git')): + os.chdir(redcoreEbuildDir) + subprocess.call(['git', 'init', '-q']) + subprocess.call(['git', 'remote', 'add', 'origin', 'https://pagure.io/redcore/redcore-desktop.git']) + subprocess.call(['git', 'fetch', '--depth=1', 'origin', 'master', '--quiet']) + subprocess.call(['git', 'checkout', '-b', 'master', 'origin/master', '--quiet']) + +@animation.wait('injecting redcore linux portage configuration - branch master') +def setPagureMasterStage3(): + if not os.path.isdir(os.path.join(portageConfigDir, '.git')): + os.chdir(portageConfigDir) + subprocess.call(['git', 'init', '-q']) + subprocess.call(['git', 'remote', 'add', 'origin', 'https://pagure.io/redcore/redcore-build.git']) + subprocess.call(['git', 'fetch', '--depth=1', 'origin', 'master', '--quiet']) + subprocess.call(['git', 'checkout', '-b', 'master', 'origin/master', '--quiet']) + +def pagureStart(): + setPagureMasterStage1() + setPagureMasterStage2() + setPagureMasterStage3() diff --git a/src/backend/branchnext.py b/src/backend/branchnext.py new file mode 100644 index 0000000..bb29b04 --- /dev/null +++ b/src/backend/branchnext.py @@ -0,0 +1,73 @@ +#!/usr/bin/python3 + +import animation +import os +import subprocess + +gentooEbuildDir = '/usr/ports/gentoo' +redcoreEbuildDir = '/usr/ports/redcore' +portageConfigDir = '/opt/redcore-build' + +@animation.wait('injecting gentoo linux portage tree - branch next') +def setGitlabNextStage1(): + if not os.path.isdir(os.path.join(gentooEbuildDir, '.git')): + os.chdir(gentooEbuildDir) + subprocess.call(['git', 'init', '-q']) + subprocess.call(['git', 'remote', 'add', 'origin', 'https://gitlab.com/redcore/portage.git']) + subprocess.call(['git', 'fetch', '--depth=1', 'origin', 'next', '--quiet']) + subprocess.call(['git', 'checkout', '-b', 'next', 'origin/next', '--quiet']) + +@animation.wait('injecting redcore linux ebuild tree - branch next') +def setGitlabNextStage2(): + if not os.path.isdir(os.path.join(redcoreEbuildDir, '.git')): + os.chdir(redcoreEbuildDir) + subprocess.call(['git', 'init', '-q']) + subprocess.call(['git', 'remote', 'add', 'origin', 'https://gitlab.com/redcore/redcore-desktop.git']) + subprocess.call(['git', 'fetch', '--depth=1', 'origin', 'next', '--quiet']) + subprocess.call(['git', 'checkout', '-b', 'next', 'origin/next', '--quiet']) + +@animation.wait('injecting redcore linux portage configuration - branch next') +def setGitlabNextStage3(): + if not os.path.isdir(os.path.join(portageConfigDir, '.git')): + os.chdir(portageConfigDir) + subprocess.call(['git', 'init', '-q']) + subprocess.call(['git', 'remote', 'add', 'origin', 'https://gitlab.com/redcore/redcore-build.git']) + subprocess.call(['git', 'fetch', '--depth=1', 'origin', 'next', '--quiet']) + subprocess.call(['git', 'checkout', '-b', 'next', 'origin/next', '--quiet']) + +def startGitlab(): + setGitlabNextStage1() + setGitlabNextStage2() + setGitlabNextStage3() + +@animation.wait('injecting gentoo linux portage tree - branch next') +def setPagureNextStage1(): + if not os.path.isdir(os.path.join(gentooEbuildDir, '.git')): + os.chdir(gentooEbuildDir) + subprocess.call(['git', 'init', '-q']) + subprocess.call(['git', 'remote', 'add', 'origin', 'https://pagure.io/redcore/portage.git']) + subprocess.call(['git', 'fetch', '--depth=1', 'origin', 'next', '--quiet']) + subprocess.call(['git', 'checkout', '-b', 'next', 'origin/next', '--quiet']) + +@animation.wait('injecting redcore linux ebuild tree - branch next') +def setPagureNextStage2(): + if not os.path.isdir(os.path.join(redcoreEbuildDir, '.git')): + os.chdir(redcoreEbuildDir) + subprocess.call(['git', 'init', '-q']) + subprocess.call(['git', 'remote', 'add', 'origin', 'https://pagure.io/redcore/redcore-desktop.git']) + subprocess.call(['git', 'fetch', '--depth=1', 'origin', 'next', '--quiet']) + subprocess.call(['git', 'checkout', '-b', 'next', 'origin/next', '--quiet']) + +@animation.wait('injecting redcore linux portage configuration - branch next') +def setPagureNextStage3(): + if not os.path.isdir(os.path.join(portageConfigDir, '.git')): + os.chdir(portageConfigDir) + subprocess.call(['git', 'init', '-q']) + subprocess.call(['git', 'remote', 'add', 'origin', 'https://pagure.io/redcore/redcore-build.git']) + subprocess.call(['git', 'fetch', '--depth=1', 'origin', 'next', '--quiet']) + subprocess.call(['git', 'checkout', '-b', 'next', 'origin/next', '--quiet']) + +def startPagure(): + setPagureNextStage1() + setPagureNextStage2() + setPagureNextStage3() diff --git a/src/backend/branchreset.py b/src/backend/branchreset.py new file mode 100644 index 0000000..6168a25 --- /dev/null +++ b/src/backend/branchreset.py @@ -0,0 +1,38 @@ +#!/usr/bin/python3 + +import animation +import os +import shutil + +gentooEbuildDir = '/usr/ports/gentoo' +redcoreEbuildDir = '/usr/ports/redcore' +portageConfigDir = '/opt/redcore-build' + +@animation.wait('resetting branch configuration') +def start(): + if os.path.isdir(gentooEbuildDir): + for files in os.listdir(gentooEbuildDir): + if os.path.isfile(os.path.join(gentooEbuildDir, files)): + os.remove(os.path.join(gentooEbuildDir, files)) + else: + shutil.rmtree(os.path.join(gentooEbuildDir, files)) + else: + os.makedirs(gentooEbuildDir) + + if os.path.isdir(redcoreEbuildDir): + for files in os.listdir(redcoreEbuildDir): + if os.path.isfile(os.path.join(redcoreEbuildDir, files)): + os.remove(os.path.join(redcoreEbuildDir, files)) + else: + shutil.rmtree(os.path.join(redcoreEbuildDir, files)) + else: + os.makedirs(redcoreEbuildDir) + + if os.path.isdir(portageConfigDir): + for files in os.listdir(portageConfigDir): + if os.path.isfile(os.path.join(portageConfigDir, files)): + os.remove(os.path.join(portageConfigDir, files)) + else: + shutil.rmtree(os.path.join(portageConfigDir, files)) + else: + os.makedirs(portageConfigDir) diff --git a/src/backend/check.py b/src/backend/check.py new file mode 100644 index 0000000..eb786aa --- /dev/null +++ b/src/backend/check.py @@ -0,0 +1,49 @@ +#!/usr/bin/python3 + +import os +import sys +import subprocess + +gentooEbuildDir = '/usr/ports/gentoo' +redcoreEbuildDir = '/usr/ports/redcore' + +def root(): + if not os.getuid() == 0: + sys.exit("\nYou need root permissions to do this, exiting!\n") + +def portage(): + os.chdir(gentooEbuildDir) + needsPortageSync = int() + + localBranch = subprocess.check_output(['git', 'rev-parse', '--abbrev-ref', 'HEAD']) + localHash = subprocess.check_output(['git', 'rev-parse', '@']) + remoteHash = subprocess.check_output(['git', 'rev-parse', '@{u}']) + + gitExec = subprocess.Popen(['git', 'fetch', '--depth=1', 'origin'] + localBranch.decode().strip().split() + ['--quiet'], stdout=subprocess.PIPE) + + if not localHash.decode().strip() == remoteHash.decode().strip(): + needsPortageSync = int(1) + + gitExec.wait() + return needsPortageSync + +def overlay(): + os.chdir(redcoreEbuildDir) + needsOverlaySync = int() + + localBranch = subprocess.check_output(['git', 'rev-parse', '--abbrev-ref', 'HEAD']) + localHash = subprocess.check_output(['git', 'rev-parse', '@']) + remoteHash = subprocess.check_output(['git', 'rev-parse', '@{u}']) + + gitExec = subprocess.Popen(['git', 'fetch', '--depth=1', 'origin'] + localBranch.decode().strip().split() + ['--quiet'], stdout=subprocess.PIPE) + + if not localHash.decode().strip() == remoteHash.decode().strip(): + needsOverlaySync = int(1) + + gitExec.wait() + return needsOverlaySync + +def update(): + portage() + overlay() + diff --git a/src/backend/clean.py b/src/backend/clean.py new file mode 100644 index 0000000..2460d9e --- /dev/null +++ b/src/backend/clean.py @@ -0,0 +1,13 @@ +#!/usr/bin/python3 + +import os + +portageCacheDir = '/var/cache/packages' + +def cache(): + if os.path.isdir(portageCacheDir): + for files in os.listdir(portageCacheDir): + if os.path.isfile(os.path.join(portageCacheDir, files)): + os.remove(os.path.join(portageCacheDir, files)) + else: + shutil.rmtree(os.path.join(portageCacheDir, files)) diff --git a/src/backend/csvfiles.py b/src/backend/csvfiles.py new file mode 100644 index 0000000..67daec4 --- /dev/null +++ b/src/backend/csvfiles.py @@ -0,0 +1,21 @@ +#!/usr/bin/python3 + +import subprocess +import io + +def getURL(): + remotePkgCsv = [] + remoteDescCsv = [] + portageExec = subprocess.Popen(['emerge', '--info', '--verbose'], stdout=subprocess.PIPE) + + for portageOutput in io.TextIOWrapper(portageExec.stdout, encoding="utf-8"): + if "PORTAGE_BINHOST" in portageOutput.rstrip(): + if "packages-next" in portageOutput.rstrip(): + remotePkgCsv = str(portageOutput.rstrip().split("=")[1].strip('\"').replace('packages-next', 'csv-next') + 'remotePackagesPre.csv') + remoteDescCsv = str(portageOutput.rstrip().split("=")[1].strip('\"').replace('packages-next', 'csv-next') + 'remoteDescriptionsPre.csv') + else: + remotePkgCsv = str(portageOutput.rstrip().split("=")[1].strip('\"').replace('packages', 'csv') + 'remotePackagesPre.csv') + remoteDescCsv = str(portageOutput.rstrip().split("=")[1].strip('\"').replace('packages', 'csv') + 'remoteDescriptionsPre.csv') + + portageExec.wait() + return remotePkgCsv,remoteDescCsv diff --git a/src/backend/database.py b/src/backend/database.py new file mode 100644 index 0000000..277a265 --- /dev/null +++ b/src/backend/database.py @@ -0,0 +1,61 @@ +#!/usr/bin/python3 + +import csv +import shutil +import urllib3 +import sqlite3 +import subprocess +import sisyphus.csvfiles + +remotePkgsDB = '/var/lib/sisyphus/csv/remotePackagesPre.csv' +remoteDscsDB = '/var/lib/sisyphus/csv/remoteDescriptionsPre.csv' +localPkgsDB = '/var/lib/sisyphus/csv/localPackagesPre.csv' +sisyphusDB = '/var/lib/sisyphus/db/sisyphus.db' + +def getRemote(): + remotePkgCsv,remoteDescCsv = sisyphus.csvfiles.getURL() + http = urllib3.PoolManager() + + with http.request('GET', remotePkgCsv, preload_content=False) as tmp_buffer, open(remotePkgsDB, 'wb') as output_file: + shutil.copyfileobj(tmp_buffer, output_file) + + with http.request('GET', remoteDescCsv, preload_content=False) as tmp_buffer, open(remoteDscsDB, 'wb') as output_file: + shutil.copyfileobj(tmp_buffer, output_file) + +def makeLocal(): + subprocess.call(['/usr/share/sisyphus/helpers/make_local_csv']) + +def syncRemote(): + getRemote() + + sisyphusdb = sqlite3.connect(sisyphusDB) + sisyphusdb.cursor().execute('''drop table if exists remote_packages''') + sisyphusdb.cursor().execute('''drop table if exists remote_descriptions''') + sisyphusdb.cursor().execute('''create table remote_packages (category TEXT,name TEXT,version TEXT,slot TEXT)''') + sisyphusdb.cursor().execute('''create table remote_descriptions (category TEXT,name TEXT,description TEXT)''') + + with open(remotePkgsDB) as rmtCsv: + for row in csv.reader(rmtCsv): + sisyphusdb.cursor().execute("insert into remote_packages (category, name, version, slot) values (?, ?, ?, ?);", row) + + with open(remoteDscsDB) as rmtCsv: + for row in csv.reader(rmtCsv): + sisyphusdb.cursor().execute("insert into remote_descriptions (category, name, description) values (?, ?, ?);", row) + + sisyphusdb.commit() + sisyphusdb.close() + +def syncLocal(): + makeLocal() + + sisyphusdb = sqlite3.connect(sisyphusDB) + sisyphusdb.cursor().execute('''drop table if exists local_packages''') + sisyphusdb.cursor().execute('''create table local_packages (category TEXT,name TEXT,version TEXT,slot TEXT)''') + + with open(localPkgsDB) as lclCsv: + for row in csv.reader(lclCsv): + sisyphusdb.cursor().execute("insert into local_packages (category, name, version, slot) values (?, ?, ?, ?);", row) + + sisyphusdb.commit() + sisyphusdb.close() + diff --git a/src/backend/help.py b/src/backend/help.py new file mode 100644 index 0000000..d62e212 --- /dev/null +++ b/src/backend/help.py @@ -0,0 +1,61 @@ +#!/usr/bin/python3 + +def show(): + print("\n" + "Usage : sisyphus command [package(s)] || [file(s)]" + "\n") + print("Sisyphus is a simple python wrapper around portage, gentoolkit, and portage-utils which provides") + print("an apt-get/yum-alike interface to these commands, to assist newcomer people transitioning from") + print("Debian/RedHat-based systems to Gentoo." + "\n") + print("Commands :" + "\n") + print("--install") + print("* Install binary and/or ebuild (source) packages" + "\n") + print("--uninstall") + print("* Uninstall packages *SAFELY* by checking for reverse dependencies") + print("* If reverse dependencies exist, the package(s) will NOT be uninstalled to prevent the possible breakage of the system") + print("* If you really want to uninstall the package, make sure you uninstall all reverse dependencies as well") + print("* This will not allways be possible, as the reverse dependency chain may be way to long and require you to uninstall critical system packages" + "\n") + print("--force-uninstall") + print("* Uninstall packages *UNSAFELY* by ignoring reverse dependencies") + print("* This may break your system if you uninstall critical system packages") + print("* It will try the best it can to preserve the libraries required by other packages to prevent such a breakage") + print("* Upgrading the system may pull the packages back in, to fix the reverse dependency chain" + "\n") + print("--remove-orphans") + print("* Uninstall packages that are no longer needed") + print("* When you uninstall a package without it's reverse dependencies, those dependencies will become orphans if nothing else requires them") + print("* In addition, a package may no longer depend on another one, so that other package becomes orphan as well if nothing else requires it") + print("* Use this option to check the whole dependency chain for such packages, and uninstall them" + "\n") + print("--update") + print("* Update the Portage tree, the Redcore Overlay(s), Portage configs && Sisyphus's package database" + "\n") + print("--upgrade") + print("* Upgrade the system using binary and/or ebuild (source) packages" + "\n") + print("--search") + print("* Search for binary and/or ebuild (source) packages" + "\n") + print("--spmsync") + print("* Sync Sisyphus's package database with Portage's package database") + print("* When you install something with Portage directly (emerge), Sisyphus is not aware of that package, and it doesn't track it in it's database") + print("* Use this option to synchronize Sisyphus's package database with Portage's package database" + "\n") + print("--rescue") + print("* Resurrect Sisyphus's package database if lost or corrupted") + print("* If for some reason Sisyphus's package database is lost or corrupted, it can be resurrected using Portage's package database") + print("* If Portage's package database is corrupted (in this case you're screwed anyway :D), only a partial resurrection will be possible") + print("* If Portage's package database is intact, full resurrection will be possible" + "\n") + print("--mirror --list") + print("* List available binary package repository mirrors (the active one is marked with *)" + "\n") + print("--mirror --set 'INDEX'") + print("* Change the binary package repository to the selected mirror" + "\n") + print("--branch='BRANCH' --remote='REMOTE'") + print("* Pull the branch 'BRANCH' of the Portage tree, Redcore overlay && Portage configs. Use 'REMOTE' git repositories.") + print("* 'BRANCH' can be one of the following : master, next") + print("* 'REMOTE' can be one of the following : gitlab, pagure") + print("*") + print("* Examples: ") + print("* '--branch=master --remote=gitlab' will pull the branch 'master' from gitlab.com") + print("* '--branch=next --remote=pagure' will pull the branch 'next' from pagure.io") + print("*") + print("* !!! WARNING !!!") + print("* Once you changed the branch, you must pair the branch 'BRANCH' with the correct binary repository") + print("* Branch 'master' must be paired with the stable binary repository (odd numbers in 'sisyphus --mirror --list'). Examples : 'sisyphus --mirror --set 1' or 'sisyphus --mirror --set 5' ") + print("* Branch 'next' must be paired with the testing binary repository (even numbers in 'sisyphus --mirror --list'). Examples : 'sisyphus --mirror --set 2' or 'sisyphus --mirror --set 8'" + "\n") + print("--sysinfo") + print("* Display information about installed core packages and portage configuration" + "\n") + print("--help") + print("* Display this help information" + "\n") diff --git a/src/backend/install.py b/src/backend/install.py new file mode 100644 index 0000000..ba1cfa0 --- /dev/null +++ b/src/backend/install.py @@ -0,0 +1,122 @@ +#!/usr/bin/python3 + +import os +import shutil +import subprocess +import sys +import io +import wget +import sisyphus.binhost +import sisyphus.database +import sisyphus.solvedeps +import sisyphus.update + +portageCacheDir = '/var/cache/packages' + +def start(pkgList): + sisyphus.update.start() + + binhostURL = sisyphus.binhost.getURL() + areBinaries,areSources,needsConfig = sisyphus.solvedeps.package(pkgList) + + if needsConfig == 0: + if len(areSources) == 0: + if not len(areBinaries) == 0: + os.chdir(portageCacheDir) + print("\n" + "These are the binary packages that would be merged, in order:" + "\n\n" + str(areBinaries) + "\n\n" + "Total:" + " " + str(len(areBinaries)) + " " + "binary package(s)" + "\n") + if input("Would you like to proceed?" + " " + "[y/N]" + " ").lower().strip()[:1] == "y": + for index, binary in enumerate([package + '.tbz2' for package in areBinaries]): + print(">>> Fetching" + " " + binhostURL + binary) + wget.download(binhostURL + binary) + print("\n") + + subprocess.call(['qtbz2', '-x'] + binary.rstrip().split("/")[1].split()) + CATEGORY = subprocess.check_output(['qxpak', '-x', '-O'] + binary.rstrip().split("/")[1].replace('tbz2', 'xpak').split() + ['CATEGORY']) + + if os.path.exists(binary.rstrip().split("/")[1].replace('tbz2', 'xpak')): + os.remove(binary.rstrip().split("/")[1].replace('tbz2', 'xpak')) + + if os.path.isdir(os.path.join(portageCacheDir, CATEGORY.decode().strip())): + shutil.move(binary.rstrip().split("/")[1], os.path.join(os.path.join(portageCacheDir, CATEGORY.decode().strip()), os.path.basename(binary.rstrip().split("/")[1]))) + else: + os.makedirs(os.path.join(portageCacheDir, CATEGORY.decode().strip())) + shutil.move(binary.rstrip().split("/")[1], os.path.join(os.path.join(portageCacheDir, CATEGORY.decode().strip()), os.path.basename(binary.rstrip().split("/")[1]))) + + if os.path.exists(binary.rstrip().split("/")[1]): + os.remove(binary.rstrip().split("/")[1]) + + portageExec = subprocess.Popen(['emerge', '--usepkg', '--usepkgonly', '--rebuilt-binaries', '--misspell-suggestion=n', '--fuzzy-search=n'] + pkgList, stdout=subprocess.PIPE) + + for portageOutput in io.TextIOWrapper(portageExec.stdout, encoding="utf-8"): + if not "These are the packages that would be merged, in order:" in portageOutput.rstrip(): + if not "Calculating dependencies" in portageOutput.rstrip(): + print(portageOutput.rstrip()) + + portageExec.wait() + sisyphus.database.syncLocal() + else: + sys.exit("\n" + "Ok; Quitting." + "\n") + else: + sys.exit("\n" + "No package found; Quitting." + "\n") + else: + if not len(areBinaries) == 0: + os.chdir(portageCacheDir) + print("\n" + "These are the binary packages that would be merged, in order:" + "\n\n" + str(areBinaries) + "\n\n" + "Total:" + " " + str(len(areBinaries)) + " " + "binary package(s)" + "\n") + print("\n" + "These are the source packages that would be merged, in order:" + "\n\n" + str(areSources) + "\n\n" + "Total:" + " " + str(len(areSources)) + " " + "source package(s)" + "\n") + if input("Would you like to proceed?" + " " + "[y/N]" + " ").lower().strip()[:1] == "y": + for index, binary in enumerate([package + '.tbz2' for package in areBinaries]): + print(">>> Fetching" + " " + binhostURL + binary) + wget.download(binhostURL + binary) + print("\n") + + subprocess.call(['qtbz2', '-x'] + binary.rstrip().split("/")[1].split()) + CATEGORY = subprocess.check_output(['qxpak', '-x', '-O'] + binary.rstrip().split("/")[1].replace('tbz2', 'xpak').split() + ['CATEGORY']) + + if os.path.exists(binary.rstrip().split("/")[1].replace('tbz2', 'xpak')): + os.remove(binary.rstrip().split("/")[1].replace('tbz2', 'xpak')) + + if os.path.isdir(os.path.join(portageCacheDir, CATEGORY.decode().strip())): + shutil.move(binary.rstrip().split("/")[1], os.path.join(os.path.join(portageCacheDir, CATEGORY.decode().strip()), os.path.basename(binary.rstrip().split("/")[1]))) + else: + os.makedirs(os.path.join(portageCacheDir, CATEGORY.decode().strip())) + shutil.move(binary.rstrip().split("/")[1], os.path.join(os.path.join(portageCacheDir, CATEGORY.decode().strip()), os.path.basename(binary.rstrip().split("/")[1]))) + + if os.path.exists(binary.rstrip().split("/")[1]): + os.remove(binary.rstrip().split("/")[1]) + + portageExec = subprocess.Popen(['emerge', '--usepkg', '--rebuilt-binaries', '--misspell-suggestion=n', '--fuzzy-search=n'] + pkgList, stdout=subprocess.PIPE) + + for portageOutput in io.TextIOWrapper(portageExec.stdout, encoding="utf-8"): + if not "These are the packages that would be merged, in order:" in portageOutput.rstrip(): + if not "Calculating dependencies" in portageOutput.rstrip(): + print(portageOutput.rstrip()) + + portageExec.wait() + sisyphus.database.syncLocal() + else: + sys.exit("\n" + "Ok; Quitting." + "\n") + else: + print("\n" + "These are the source packages that would be merged, in order:" + "\n\n" + str(areSources) + "\n\n" + "Total:" + " " + str(len(areSources)) + " " + "source package(s)" + "\n") + if input("Would you like to proceed?" + " " + "[y/N]" + " ").lower().strip()[:1] == "y": + portageExec = subprocess.Popen(['emerge', '--misspell-suggestion=n', '--fuzzy-search=n'] + pkgList, stdout=subprocess.PIPE) + + for portageOutput in io.TextIOWrapper(portageExec.stdout, encoding="utf-8"): + if not "These are the packages that would be merged, in order:" in portageOutput.rstrip(): + if not "Calculating dependencies" in portageOutput.rstrip(): + print(portageOutput.rstrip()) + + portageExec.wait() + sisyphus.database.syncLocal() + else: + sys.exit("\n" + "Ok; Quitting." + "\n") + else: + portageExec = subprocess.Popen(['emerge', '--quiet', '--pretend', '--getbinpkg', '--rebuilt-binaries', '--misspell-suggestion=n', '--fuzzy-search=n'] + pkgList, stdout=subprocess.PIPE) + + for portageOutput in io.TextIOWrapper(portageExec.stdout, encoding="utf-8"): + if not "Local copy of remote index is up-to-date and will be used." in portageOutput.rstrip(): + if not "ebuild" in portageOutput.rstrip(): + if not "binary" in portageOutput.rstrip(): + print(portageOutput.rstrip()) + + portageExec.wait() + sys.exit("\n" + "Cannot proceed; Apply the above changes to your portage configuration files and try again; Quitting." + "\n") diff --git a/src/backend/killportage.py b/src/backend/killportage.py new file mode 100644 index 0000000..f01af6b --- /dev/null +++ b/src/backend/killportage.py @@ -0,0 +1,4 @@ +#!/usr/bin/python3 + +def start(portageCmd): + portageCmd.terminate() diff --git a/src/backend/libsisyphus.py b/src/backend/libsisyphus.py deleted file mode 100644 index 1a54fe7..0000000 --- a/src/backend/libsisyphus.py +++ /dev/null @@ -1,865 +0,0 @@ -#!/usr/bin/python3 - -import animation -import csv -import os -import shutil -import sqlite3 -import subprocess -import sys -import urllib3 -import io -import wget - -gentooEbuildDir = '/usr/ports/gentoo' -redcoreEbuildDir = '/usr/ports/redcore' -portageConfigDir = '/opt/redcore-build' -portageCacheDir = '/var/cache/packages' -portageMetadataDir = '/var/cache/edb' -remotePkgsDB = '/var/lib/sisyphus/csv/remotePackagesPre.csv' -remoteDscsDB = '/var/lib/sisyphus/csv/remoteDescriptionsPre.csv' -localPkgsDB = '/var/lib/sisyphus/csv/localPackagesPre.csv' -sisyphusDB = '/var/lib/sisyphus/db/sisyphus.db' -mirrorCfg = '/etc/sisyphus/mirrors.conf' - -def checkRoot(): - if not os.getuid() == 0: - sys.exit("\nYou need root permissions to do this, exiting!\n") - -def getMirrorList(): - mirrorList = [] - - with open(mirrorCfg) as mirrorFile: - for line in mirrorFile.readlines(): - if 'PORTAGE_BINHOST=' in line: - url = line.split("=")[1].replace('"', '').rstrip() - mirror = {'isActive': True, 'Url': url} - if line.startswith('#'): - mirror['isActive'] = False - mirrorList.append(mirror) - mirrorFile.close() - - return mirrorList - -def getBinhostURL(): - binhostURL = [] - portageExec = subprocess.Popen(['emerge', '--info', '--verbose'], stdout=subprocess.PIPE) - - for portageOutput in io.TextIOWrapper(portageExec.stdout, encoding="utf-8"): - if "PORTAGE_BINHOST" in portageOutput.rstrip(): - binhostURL = str(portageOutput.rstrip().split("=")[1].strip('\"')) - - portageExec.wait() - return binhostURL - -def getCsvUrl(): - remotePkgCsv = [] - remoteDescCsv = [] - portageExec = subprocess.Popen(['emerge', '--info', '--verbose'], stdout=subprocess.PIPE) - - for portageOutput in io.TextIOWrapper(portageExec.stdout, encoding="utf-8"): - if "PORTAGE_BINHOST" in portageOutput.rstrip(): - if "packages-next" in portageOutput.rstrip(): - remotePkgCsv = str(portageOutput.rstrip().split("=")[1].strip('\"').replace('packages-next', 'csv-next') + 'remotePackagesPre.csv') - remoteDescCsv = str(portageOutput.rstrip().split("=")[1].strip('\"').replace('packages-next', 'csv-next') + 'remoteDescriptionsPre.csv') - else: - remotePkgCsv = str(portageOutput.rstrip().split("=")[1].strip('\"').replace('packages', 'csv') + 'remotePackagesPre.csv') - remoteDescCsv = str(portageOutput.rstrip().split("=")[1].strip('\"').replace('packages', 'csv') + 'remoteDescriptionsPre.csv') - - portageExec.wait() - return remotePkgCsv,remoteDescCsv - -@animation.wait('resolving dependencies') -def getPackageDeps(pkgList): - areBinaries = [] - areSources = [] - needsConfig = int() - portageExec = subprocess.Popen(['emerge', '--quiet', '--pretend', '--getbinpkg', '--rebuilt-binaries', '--misspell-suggestion=n', '--fuzzy-search=n'] + pkgList, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - - for portageOutput in io.TextIOWrapper(portageExec.stderr, encoding="utf-8"): - if "The following keyword changes are necessary to proceed:" in portageOutput.rstrip(): - needsConfig = int(1) - - if "The following mask changes are necessary to proceed:" in portageOutput.rstrip(): - needsConfig = int(1) - - if "The following USE changes are necessary to proceed:" in portageOutput.rstrip(): - needsConfig = int(1) - - if "The following REQUIRED_USE flag constraints are unsatisfied:" in portageOutput.rstrip(): - needsConfig = int(1) - - for portageOutput in io.TextIOWrapper(portageExec.stdout, encoding="utf-8"): - if "[binary" in portageOutput.rstrip(): - isBinary = str(portageOutput.rstrip().split("]")[1].split("[")[0].strip("\ ")) - areBinaries.append(isBinary) - - if "[ebuild" in portageOutput.rstrip(): - isSource = str(portageOutput.rstrip().split("]")[1].split("[")[0].strip("\ ")) - areSources.append(isSource) - - portageExec.wait() - return areBinaries,areSources,needsConfig - -@animation.wait('resolving dependencies') -def getWorldDeps(): - areBinaries = [] - areSources = [] - needsConfig = int() - portageExec = subprocess.Popen(['emerge', '--quiet', '--update', '--deep', '--newuse', '--pretend', '--getbinpkg', '--rebuilt-binaries', '--backtrack=100', '--with-bdeps=y', '--misspell-suggestion=n', '--fuzzy-search=n', '@world'], stdout=subprocess.PIPE, stderr=subprocess.PIPE) - - for portageOutput in io.TextIOWrapper(portageExec.stderr, encoding="utf-8"): - if "The following keyword changes are necessary to proceed:" in portageOutput.rstrip(): - needsConfig = int(1) - - if "The following mask changes are necessary to proceed:" in portageOutput.rstrip(): - needsConfig = int(1) - - if "The following USE changes are necessary to proceed:" in portageOutput.rstrip(): - needsConfig = int(1) - - if "The following REQUIRED_USE flag constraints are unsatisfied:" in portageOutput.rstrip(): - needsConfig = int(1) - - for portageOutput in io.TextIOWrapper(portageExec.stdout, encoding="utf-8"): - if "[binary" in portageOutput.rstrip(): - isBinary = str(portageOutput.rstrip().split("]")[1].split("[")[0].strip("\ ")) - areBinaries.append(isBinary) - - if "[ebuild" in portageOutput.rstrip(): - isSource = str(portageOutput.rstrip().split("]")[1].split("[")[0].strip("\ ")) - areSources.append(isSource) - - portageExec.wait() - return areBinaries,areSources,needsConfig - -def fetchRemoteDatabase(): - remotePkgCsv,remoteDescCsv = getCsvUrl() - http = urllib3.PoolManager() - - with http.request('GET', remotePkgCsv, preload_content=False) as tmp_buffer, open(remotePkgsDB, 'wb') as output_file: - shutil.copyfileobj(tmp_buffer, output_file) - - with http.request('GET', remoteDescCsv, preload_content=False) as tmp_buffer, open(remoteDscsDB, 'wb') as output_file: - shutil.copyfileobj(tmp_buffer, output_file) - -def makeLocalDatabase(): - subprocess.call(['/usr/share/sisyphus/helpers/make_local_csv']) - -def syncRemoteDatabase(): - fetchRemoteDatabase() - - sisyphusdb = sqlite3.connect(sisyphusDB) - sisyphusdb.cursor().execute('''drop table if exists remote_packages''') - sisyphusdb.cursor().execute('''drop table if exists remote_descriptions''') - sisyphusdb.cursor().execute('''create table remote_packages (category TEXT,name TEXT,version TEXT,slot TEXT)''') - sisyphusdb.cursor().execute('''create table remote_descriptions (category TEXT,name TEXT,description TEXT)''') - - with open(remotePkgsDB) as rmtCsv: - for row in csv.reader(rmtCsv): - sisyphusdb.cursor().execute("insert into remote_packages (category, name, version, slot) values (?, ?, ?, ?);", row) - - with open(remoteDscsDB) as rmtCsv: - for row in csv.reader(rmtCsv): - sisyphusdb.cursor().execute("insert into remote_descriptions (category, name, description) values (?, ?, ?);", row) - - sisyphusdb.commit() - sisyphusdb.close() - -def syncLocalDatabase(): - makeLocalDatabase() - - sisyphusdb = sqlite3.connect(sisyphusDB) - sisyphusdb.cursor().execute('''drop table if exists local_packages''') - sisyphusdb.cursor().execute('''create table local_packages (category TEXT,name TEXT,version TEXT,slot TEXT)''') - - with open(localPkgsDB) as lclCsv: - for row in csv.reader(lclCsv): - sisyphusdb.cursor().execute("insert into local_packages (category, name, version, slot) values (?, ?, ?, ?);", row) - - sisyphusdb.commit() - sisyphusdb.close() - -def checkPortageTree(): - os.chdir(gentooEbuildDir) - needsPortageTreeSync = int() - - localBranch = subprocess.check_output(['git', 'rev-parse', '--abbrev-ref', 'HEAD']) - localHash = subprocess.check_output(['git', 'rev-parse', '@']) - remoteHash = subprocess.check_output(['git', 'rev-parse', '@{u}']) - - gitExec = subprocess.Popen(['git', 'fetch', '--depth=1', 'origin'] + localBranch.decode().strip().split() + ['--quiet'], stdout=subprocess.PIPE) - - if not localHash.decode().strip() == remoteHash.decode().strip(): - needsPortageTreeSync = int(1) - - gitExec.wait() - return needsPortageTreeSync - -def checkOverlayTree(): - os.chdir(redcoreEbuildDir) - needsOverlayTreeSync = int() - - localBranch = subprocess.check_output(['git', 'rev-parse', '--abbrev-ref', 'HEAD']) - localHash = subprocess.check_output(['git', 'rev-parse', '@']) - remoteHash = subprocess.check_output(['git', 'rev-parse', '@{u}']) - - gitExec = subprocess.Popen(['git', 'fetch', '--depth=1', 'origin'] + localBranch.decode().strip().split() + ['--quiet'], stdout=subprocess.PIPE) - - if not localHash.decode().strip() == remoteHash.decode().strip(): - needsOverlayTreeSync = int(1) - - gitExec.wait() - return needsOverlayTreeSync - -def syncPortageTree(): - os.chdir(gentooEbuildDir) - localBranch = subprocess.check_output(['git', 'rev-parse', '--abbrev-ref', 'HEAD']) - remoteBranch = subprocess.check_output(['git', 'rev-parse', '--symbolic-full-name', '@{u}']) - - gitExecStage1 = subprocess.Popen(['git', 'fetch', '--depth=1', 'origin'] + localBranch.decode().strip().split() + ['--quiet'], stdout=subprocess.PIPE) - gitExecStage1.wait() - gitExecStage2 = subprocess.Popen(['git', 'reset', '--hard'] + remoteBranch.decode().strip().replace('refs/remotes/','').split() + ['--quiet'], stdout=subprocess.PIPE) - gitExecStage2.wait() - -def syncOverlayTree(): - os.chdir(redcoreEbuildDir) - localBranch = subprocess.check_output(['git', 'rev-parse', '--abbrev-ref', 'HEAD']) - remoteBranch = subprocess.check_output(['git', 'rev-parse', '--symbolic-full-name', '@{u}']) - - gitExecStage1 = subprocess.Popen(['git', 'fetch', '--depth=1', 'origin'] + localBranch.decode().strip().split() + ['--quiet'], stdout=subprocess.PIPE) - gitExecStage1.wait() - gitExecStage2 = subprocess.Popen(['git', 'reset', '--hard'] + remoteBranch.decode().strip().replace('refs/remotes/','').split() + ['--quiet'], stdout=subprocess.PIPE) - gitExecStage2.wait() - -def syncPortageConfig(): - os.chdir(portageConfigDir) - localBranch = subprocess.check_output(['git', 'rev-parse', '--abbrev-ref', 'HEAD']) - remoteBranch = subprocess.check_output(['git', 'rev-parse', '--symbolic-full-name', '@{u}']) - - gitExecStage1 = subprocess.Popen(['git', 'stash'], stdout=subprocess.PIPE) - gitExecStage1.wait() - gitExecStage2 = subprocess.Popen(['git', 'fetch', '--depth=1', 'origin'] + localBranch.decode().strip().split() + ['--quiet'], stdout=subprocess.PIPE) - gitExecStage2.wait() - gitExecStage3 = subprocess.Popen(['git', 'reset', '--hard'] + remoteBranch.decode().strip().replace('refs/remotes/','').split() + ['--quiet'], stdout=subprocess.PIPE) - gitExecStage3.wait() - gitExecStage4 = subprocess.Popen(['git', 'stash', 'apply'], stdout=subprocess.PIPE) - gitExecStage4.wait() - gitExecStage5 = subprocess.Popen(['git', 'stash', 'clear'], stdout=subprocess.PIPE) - gitExecStage5.wait() - gitExecStage6 = subprocess.Popen(['git', 'gc', '--prune=now', '--quiet'], stdout=subprocess.PIPE) - gitExecStage6.wait() - -def refreshPortageMetadata(): - if os.path.isdir(portageMetadataDir): - for files in os.listdir(portageMetadataDir): - if os.path.isfile(os.path.join(portageMetadataDir, files)): - os.remove(os.path.join(portageMetadataDir, files)) - else: - shutil.rmtree(os.path.join(portageMetadataDir, files)) - - portageExecStage1 = subprocess.Popen(['emerge', '--quiet', '--regen'], stdout=subprocess.PIPE) - portageExecStage1.wait() - portageExecStage2 = subprocess.Popen(['emerge', '--quiet', '--metadata'], stdout=subprocess.PIPE) - portageExecStage2.wait() - -def cleanCacheDir(): - if os.path.isdir(portageCacheDir): - for files in os.listdir(portageCacheDir): - if os.path.isfile(os.path.join(portageCacheDir, files)): - os.remove(os.path.join(portageCacheDir, files)) - else: - shutil.rmtree(os.path.join(portageCacheDir, files)) - -def checkUpdate(): - checkPortageTree() - checkOverlayTree() - -@animation.wait('fetching updates') -def startUpdate(): - checkRoot() - cleanCacheDir() - - needsPortageTreeSync = checkPortageTree() - needsOverlayTreeSync = checkOverlayTree() - - if needsPortageTreeSync == 1: - if needsOverlayTreeSync == 1: - syncPortageTree() - syncOverlayTree() - syncPortageConfig() - syncRemoteDatabase() - refreshPortageMetadata() - elif not needsOverlayTreeSync == 1: - syncPortageTree() - syncOverlayTree() - syncPortageConfig() - syncRemoteDatabase() - refreshPortageMetadata() - elif not needsPortageTreeSync == 1: - if needsOverlayTreeSync == 1: - syncPortageTree() - syncOverlayTree() - syncPortageConfig() - syncRemoteDatabase() - refreshPortageMetadata() - elif not needsOverlayTreeSync == 1: - syncPortageConfig() - -@animation.wait('syncing spm changes') -def startSyncSPM(): - syncLocalDatabase() - -@animation.wait('recovering databases') -def rescueDB(): - if os.path.exists(remotePkgsDB): - os.remove(remotePkgsDB) - if os.path.exists(remoteDscsDB): - os.remove(remoteDscsDB) - if os.path.exists(localPkgsDB): - os.remove(localPkgsDB) - if os.path.exists(sisyphusDB): - os.remove(sisyphusDB) - - syncRemoteDatabase() - syncLocalDatabase() - -def startSearch(pkgList): - subprocess.call(['emerge', '--search', '--getbinpkg'] + pkgList) - -def startInstall(pkgList): - startUpdate() - - binhostURL = getBinhostURL() - areBinaries,areSources,needsConfig = getPackageDeps(pkgList) - - if needsConfig == 0: - if len(areSources) == 0: - if not len(areBinaries) == 0: - os.chdir(portageCacheDir) - print("\n" + "These are the binary packages that would be merged, in order:" + "\n\n" + str(areBinaries) + "\n\n" + "Total:" + " " + str(len(areBinaries)) + " " + "binary package(s)" + "\n") - if input("Would you like to proceed?" + " " + "[y/N]" + " ").lower().strip()[:1] == "y": - for index, binary in enumerate([package + '.tbz2' for package in areBinaries]): - print(">>> Fetching" + " " + binhostURL + binary) - wget.download(binhostURL + binary) - print("\n") - - subprocess.call(['qtbz2', '-x'] + binary.rstrip().split("/")[1].split()) - CATEGORY = subprocess.check_output(['qxpak', '-x', '-O'] + binary.rstrip().split("/")[1].replace('tbz2', 'xpak').split() + ['CATEGORY']) - - if os.path.exists(binary.rstrip().split("/")[1].replace('tbz2', 'xpak')): - os.remove(binary.rstrip().split("/")[1].replace('tbz2', 'xpak')) - - if os.path.isdir(os.path.join(portageCacheDir, CATEGORY.decode().strip())): - shutil.move(binary.rstrip().split("/")[1], os.path.join(os.path.join(portageCacheDir, CATEGORY.decode().strip()), os.path.basename(binary.rstrip().split("/")[1]))) - else: - os.makedirs(os.path.join(portageCacheDir, CATEGORY.decode().strip())) - shutil.move(binary.rstrip().split("/")[1], os.path.join(os.path.join(portageCacheDir, CATEGORY.decode().strip()), os.path.basename(binary.rstrip().split("/")[1]))) - - if os.path.exists(binary.rstrip().split("/")[1]): - os.remove(binary.rstrip().split("/")[1]) - - portageExec = subprocess.Popen(['emerge', '--usepkg', '--usepkgonly', '--rebuilt-binaries', '--misspell-suggestion=n', '--fuzzy-search=n'] + pkgList, stdout=subprocess.PIPE) - - for portageOutput in io.TextIOWrapper(portageExec.stdout, encoding="utf-8"): - if not "These are the packages that would be merged, in order:" in portageOutput.rstrip(): - if not "Calculating dependencies" in portageOutput.rstrip(): - print(portageOutput.rstrip()) - - portageExec.wait() - syncLocalDatabase() - else: - sys.exit("\n" + "Ok; Quitting." + "\n") - else: - sys.exit("\n" + "No package found; Quitting." + "\n") - else: - if not len(areBinaries) == 0: - os.chdir(portageCacheDir) - print("\n" + "These are the binary packages that would be merged, in order:" + "\n\n" + str(areBinaries) + "\n\n" + "Total:" + " " + str(len(areBinaries)) + " " + "binary package(s)" + "\n") - print("\n" + "These are the source packages that would be merged, in order:" + "\n\n" + str(areSources) + "\n\n" + "Total:" + " " + str(len(areSources)) + " " + "source package(s)" + "\n") - if input("Would you like to proceed?" + " " + "[y/N]" + " ").lower().strip()[:1] == "y": - for index, binary in enumerate([package + '.tbz2' for package in areBinaries]): - print(">>> Fetching" + " " + binhostURL + binary) - wget.download(binhostURL + binary) - print("\n") - - subprocess.call(['qtbz2', '-x'] + binary.rstrip().split("/")[1].split()) - CATEGORY = subprocess.check_output(['qxpak', '-x', '-O'] + binary.rstrip().split("/")[1].replace('tbz2', 'xpak').split() + ['CATEGORY']) - - if os.path.exists(binary.rstrip().split("/")[1].replace('tbz2', 'xpak')): - os.remove(binary.rstrip().split("/")[1].replace('tbz2', 'xpak')) - - if os.path.isdir(os.path.join(portageCacheDir, CATEGORY.decode().strip())): - shutil.move(binary.rstrip().split("/")[1], os.path.join(os.path.join(portageCacheDir, CATEGORY.decode().strip()), os.path.basename(binary.rstrip().split("/")[1]))) - else: - os.makedirs(os.path.join(portageCacheDir, CATEGORY.decode().strip())) - shutil.move(binary.rstrip().split("/")[1], os.path.join(os.path.join(portageCacheDir, CATEGORY.decode().strip()), os.path.basename(binary.rstrip().split("/")[1]))) - - if os.path.exists(binary.rstrip().split("/")[1]): - os.remove(binary.rstrip().split("/")[1]) - - portageExec = subprocess.Popen(['emerge', '--usepkg', '--rebuilt-binaries', '--misspell-suggestion=n', '--fuzzy-search=n'] + pkgList, stdout=subprocess.PIPE) - - for portageOutput in io.TextIOWrapper(portageExec.stdout, encoding="utf-8"): - if not "These are the packages that would be merged, in order:" in portageOutput.rstrip(): - if not "Calculating dependencies" in portageOutput.rstrip(): - print(portageOutput.rstrip()) - - portageExec.wait() - syncLocalDatabase() - else: - sys.exit("\n" + "Ok; Quitting." + "\n") - else: - print("\n" + "These are the source packages that would be merged, in order:" + "\n\n" + str(areSources) + "\n\n" + "Total:" + " " + str(len(areSources)) + " " + "source package(s)" + "\n") - if input("Would you like to proceed?" + " " + "[y/N]" + " ").lower().strip()[:1] == "y": - portageExec = subprocess.Popen(['emerge', '--misspell-suggestion=n', '--fuzzy-search=n'] + pkgList, stdout=subprocess.PIPE) - - for portageOutput in io.TextIOWrapper(portageExec.stdout, encoding="utf-8"): - if not "These are the packages that would be merged, in order:" in portageOutput.rstrip(): - if not "Calculating dependencies" in portageOutput.rstrip(): - print(portageOutput.rstrip()) - - portageExec.wait() - syncLocalDatabase() - else: - sys.exit("\n" + "Ok; Quitting." + "\n") - else: - portageExec = subprocess.Popen(['emerge', '--quiet', '--pretend', '--getbinpkg', '--rebuilt-binaries', '--misspell-suggestion=n', '--fuzzy-search=n'] + pkgList, stdout=subprocess.PIPE) - - for portageOutput in io.TextIOWrapper(portageExec.stdout, encoding="utf-8"): - if not "Local copy of remote index is up-to-date and will be used." in portageOutput.rstrip(): - if not "ebuild" in portageOutput.rstrip(): - if not "binary" in portageOutput.rstrip(): - print(portageOutput.rstrip()) - - portageExec.wait() - sys.exit("\n" + "Cannot proceed; Apply the above changes to your portage configuration files and try again; Quitting." + "\n") - -def startUpgrade(): - startUpdate() - - binhostURL = getBinhostURL() - areBinaries,areSources,needsConfig = getWorldDeps() - - if needsConfig == 0: - if len(areSources) == 0: - if not len(areBinaries) == 0: - os.chdir(portageCacheDir) - print("\n" + "These are the binary packages that would be merged, in order:" + "\n\n" + str(areBinaries) + "\n\n" + "Total:" + " " + str(len(areBinaries)) + " " + "binary package(s)" + "\n") - if input("Would you like to proceed?" + " " + "[y/N]" + " ").lower().strip()[:1] == "y": - for index, binary in enumerate([package + '.tbz2' for package in areBinaries]): - print(">>> Fetching" + " " + binhostURL + binary) - wget.download(binhostURL + binary) - print("\n") - - subprocess.call(['qtbz2', '-x'] + binary.rstrip().split("/")[1].split()) - CATEGORY = subprocess.check_output(['qxpak', '-x', '-O'] + binary.rstrip().split("/")[1].replace('tbz2', 'xpak').split() + ['CATEGORY']) - - if os.path.exists(binary.rstrip().split("/")[1].replace('tbz2', 'xpak')): - os.remove(binary.rstrip().split("/")[1].replace('tbz2', 'xpak')) - - if os.path.isdir(os.path.join(portageCacheDir, CATEGORY.decode().strip())): - shutil.move(binary.rstrip().split("/")[1], os.path.join(os.path.join(portageCacheDir, CATEGORY.decode().strip()), os.path.basename(binary.rstrip().split("/")[1]))) - else: - os.makedirs(os.path.join(portageCacheDir, CATEGORY.decode().strip())) - shutil.move(binary.rstrip().split("/")[1], os.path.join(os.path.join(portageCacheDir, CATEGORY.decode().strip()), os.path.basename(binary.rstrip().split("/")[1]))) - - if os.path.exists(binary.rstrip().split("/")[1]): - os.remove(binary.rstrip().split("/")[1]) - - portageExec = subprocess.Popen(['emerge', '--update', '--deep', '--newuse', '--usepkg', '--usepkgonly', '--rebuilt-binaries', '--backtrack=100', '--with-bdeps=y', '--misspell-suggestion=n', '--fuzzy-search=n', '@world'], stdout=subprocess.PIPE) - - for portageOutput in io.TextIOWrapper(portageExec.stdout, encoding="utf-8"): - if not "These are the packages that would be merged, in order:" in portageOutput.rstrip(): - if not "Calculating dependencies" in portageOutput.rstrip(): - print(portageOutput.rstrip()) - - portageExec.wait() - syncLocalDatabase() - else: - sys.exit("\n" + "Ok; Quitting." + "\n") - else: - sys.exit("\n" + "No package upgrades found; Quitting." + "\n") - else: - if not len(areBinaries) == 0: - os.chdir(portageCacheDir) - print("\n" + "These are the binary packages that would be merged, in order:" + "\n\n" + str(areBinaries) + "\n\n" + "Total:" + " " + str(len(areBinaries)) + " " + "binary package(s)" + "\n") - print("\n" + "These are the source packages that would be merged, in order:" + "\n\n" + str(areSources) + "\n\n" + "Total:" + " " + str(len(areSources)) + " " + "source package(s)" + "\n") - if input("Would you like to proceed?" + " " + "[y/N]" + " ").lower().strip()[:1] == "y": - for index, binary in enumerate([package + '.tbz2' for package in areBinaries]): - print(">>> Fetching" + " " + binhostURL + binary) - wget.download(binhostURL + binary) - print("\n") - - subprocess.call(['qtbz2', '-x'] + binary.rstrip().split("/")[1].split()) - CATEGORY = subprocess.check_output(['qxpak', '-x', '-O'] + binary.rstrip().split("/")[1].replace('tbz2', 'xpak').split() + ['CATEGORY']) - - if os.path.exists(binary.rstrip().split("/")[1].replace('tbz2', 'xpak')): - os.remove(binary.rstrip().split("/")[1].replace('tbz2', 'xpak')) - - if os.path.isdir(os.path.join(portageCacheDir, CATEGORY.decode().strip())): - shutil.move(binary.rstrip().split("/")[1], os.path.join(os.path.join(portageCacheDir, CATEGORY.decode().strip()), os.path.basename(binary.rstrip().split("/")[1]))) - else: - os.makedirs(os.path.join(portageCacheDir, CATEGORY.decode().strip())) - shutil.move(binary.rstrip().split("/")[1], os.path.join(os.path.join(portageCacheDir, CATEGORY.decode().strip()), os.path.basename(binary.rstrip().split("/")[1]))) - - if os.path.exists(binary.rstrip().split("/")[1]): - os.remove(binary.rstrip().split("/")[1]) - - portageExec = subprocess.Popen(['emerge', '--update', '--deep', '--newuse', '--usepkg', '--rebuilt-binaries', '--backtrack=100', '--with-bdeps=y', '--misspell-suggestion=n', '--fuzzy-search=n', '@world'], stdout=subprocess.PIPE) - - for portageOutput in io.TextIOWrapper(portageExec.stdout, encoding="utf-8"): - if not "These are the packages that would be merged, in order:" in portageOutput.rstrip(): - if not "Calculating dependencies" in portageOutput.rstrip(): - print(portageOutput.rstrip()) - - portageExec.wait() - syncLocalDatabase() - else: - sys.exit("\n" + "Ok; Quitting." + "\n") - else: - print("\n" + "These are the source packages that would be merged, in order:" + "\n\n" + str(areSources) + "\n\n" + "Total:" + " " + str(len(areSources)) + " " + "source package(s)" + "\n") - if input("Would you like to proceed?" + " " + "[y/N]" + " ").lower().strip()[:1] == "y": - portageExec = subprocess.Popen(['emerge', '--update', '--deep', '--newuse', '--backtrack=100', '--with-bdeps=y', '--misspell-suggestion=n', '--fuzzy-search=n', '@world'], stdout=subprocess.PIPE) - - for portageOutput in io.TextIOWrapper(portageExec.stdout, encoding="utf-8"): - if not "These are the packages that would be merged, in order:" in portageOutput.rstrip(): - if not "Calculating dependencies" in portageOutput.rstrip(): - print(portageOutput.rstrip()) - - portageExec.wait() - syncLocalDatabase() - else: - sys.exit("\n" + "Ok; Quitting." + "\n") - else: - portageExec = subprocess.Popen(['emerge', '--quiet', '--update', '--deep', '--newuse', '--pretend', '--getbinpkg', '--rebuilt-binaries', '--backtrack=100', '--with-bdeps=y', '--misspell-suggestion=n', '--fuzzy-search=n', '@world'], stdout=subprocess.PIPE) - - for portageOutput in io.TextIOWrapper(portageExec.stdout, encoding="utf-8"): - if not "Local copy of remote index is up-to-date and will be used." in portageOutput.rstrip(): - if not "ebuild" in portageOutput.rstrip(): - if not "binary" in portageOutput.rstrip(): - print(portageOutput.rstrip()) - - portageExec.wait() - sys.exit("\n" + "Cannot proceed; Apply the above changes to your portage configuration files and try again; Quitting." + "\n") - -def startUninstall(pkgList): - portageExec = subprocess.Popen(['emerge', '--quiet', '--depclean', '--ask'] + pkgList) - portageExec.wait() - syncLocalDatabase() - -def startUninstallForce(pkgList): - portageExec = subprocess.Popen(['emerge', '--quiet', '--unmerge', '--ask'] + pkgList) - portageExec.wait() - syncLocalDatabase() - -def removeOrphans(): - portageExec = subprocess.Popen(['emerge', '--quiet', '--depclean', '--ask']) - portageExec.wait() - syncLocalDatabase() - -def sysInfo(): - subprocess.call(['emerge', '--info']) - -def portageKill(portageCmd): - portageCmd.terminate() - -def printMirrorList(): - mirrorList = getMirrorList() - - for i, line in enumerate(mirrorList): - if line['isActive']: - print(i + 1, '*', line['Url']) - else: - print(i + 1, ' ', line['Url']) - -def writeMirrorCfg(mirrorList): - with open(mirrorCfg, 'w+') as mirrorFile: - mirrorFile.write("#######################################################\n") - mirrorFile.write("# Support for multiple mirrors is somewhat incomplete #\n") - mirrorFile.write("#######################################################\n") - mirrorFile.write("# Please avoid using the Main Repository #\n") - mirrorFile.write("# http://mirrors.redcorelinux.org/redcorelinux #\n") - mirrorFile.write("# as the bandwidth is limited, use mirrors instead #\n") - mirrorFile.write("#######################################################\n") - mirrorFile.write("# Uncomment only one mirror from the list bellow #\n") - mirrorFile.write("#######################################################\n") - mirrorFile.write("\n") - for line in mirrorList: - mirror = 'PORTAGE_BINHOST=' + '"' + line['Url'] + '"' - if not line['isActive']: - mirror = '# ' + mirror - mirrorFile.write(mirror + "\n") - mirrorFile.write("\n") - -def setActiveMirror(mirror): - mirror = int(mirror[0]) - mirrorList = getMirrorList() - if mirror not in range(1, len(mirrorList) + 1): - print("\n" + "Mirror index is wrong, please check with sisyphus --mirror --list" + "\n") - else: - for i in range(0, len(mirrorList)): - indx = i + 1 - if indx == mirror: - mirrorList[i]['isActive'] = True - else: - mirrorList[i]['isActive'] = False - writeMirrorCfg(mirrorList) - -@animation.wait('resetting branch configuration') -def resetBranch(): - if os.path.isdir(gentooEbuildDir): - for files in os.listdir(gentooEbuildDir): - if os.path.isfile(os.path.join(gentooEbuildDir, files)): - os.remove(os.path.join(gentooEbuildDir, files)) - else: - shutil.rmtree(os.path.join(gentooEbuildDir, files)) - else: - os.makedirs(gentooEbuildDir) - - if os.path.isdir(redcoreEbuildDir): - for files in os.listdir(redcoreEbuildDir): - if os.path.isfile(os.path.join(redcoreEbuildDir, files)): - os.remove(os.path.join(redcoreEbuildDir, files)) - else: - shutil.rmtree(os.path.join(redcoreEbuildDir, files)) - else: - os.makedirs(redcoreEbuildDir) - - if os.path.isdir(portageConfigDir): - for files in os.listdir(portageConfigDir): - if os.path.isfile(os.path.join(portageConfigDir, files)): - os.remove(os.path.join(portageConfigDir, files)) - else: - shutil.rmtree(os.path.join(portageConfigDir, files)) - else: - os.makedirs(portageConfigDir) - -@animation.wait('injecting gentoo linux portage tree - branch master') -def setGitlabMasterStage1(): - if not os.path.isdir(os.path.join(gentooEbuildDir, '.git')): - os.chdir(gentooEbuildDir) - subprocess.call(['git', 'init', '-q']) - subprocess.call(['git', 'remote', 'add', 'origin', 'https://gitlab.com/redcore/portage.git']) - subprocess.call(['git', 'fetch', '--depth=1', 'origin', 'master', '--quiet']) - subprocess.call(['git', 'checkout', '-b', 'master', 'origin/master', '--quiet']) - -@animation.wait('injecting redcore linux ebuild tree - branch master') -def setGitlabMasterStage2(): - if not os.path.isdir(os.path.join(redcoreEbuildDir, '.git')): - os.chdir(redcoreEbuildDir) - subprocess.call(['git', 'init', '-q']) - subprocess.call(['git', 'remote', 'add', 'origin', 'https://gitlab.com/redcore/redcore-desktop.git']) - subprocess.call(['git', 'fetch', '--depth=1', 'origin', 'master', '--quiet']) - subprocess.call(['git', 'checkout', '-b', 'master', 'origin/master', '--quiet']) - -@animation.wait('injecting redcore linux portage configuration - branch master') -def setGitlabMasterStage3(): - if not os.path.isdir(os.path.join(portageConfigDir, '.git')): - os.chdir(portageConfigDir) - subprocess.call(['git', 'init', '-q']) - subprocess.call(['git', 'remote', 'add', 'origin', 'https://gitlab.com/redcore/redcore-build.git']) - subprocess.call(['git', 'fetch', '--depth=1', 'origin', 'master', '--quiet']) - subprocess.call(['git', 'checkout', '-b', 'master', 'origin/master', '--quiet']) - -def setGitlabMaster(): - setGitlabMasterStage1() - setGitlabMasterStage2() - setGitlabMasterStage3() - -@animation.wait('injecting gentoo linux portage tree - branch master') -def setPagureMasterStage1(): - if not os.path.isdir(os.path.join(gentooEbuildDir, '.git')): - os.chdir(gentooEbuildDir) - subprocess.call(['git', 'init', '-q']) - subprocess.call(['git', 'remote', 'add', 'origin', 'https://pagure.io/redcore/portage.git']) - subprocess.call(['git', 'fetch', '--depth=1', 'origin', 'master', '--quiet']) - subprocess.call(['git', 'checkout', '-b', 'master', 'origin/master', '--quiet']) - -@animation.wait('injecting redcore linux ebuild tree - branch master') -def setPagureMasterStage2(): - if not os.path.isdir(os.path.join(redcoreEbuildDir, '.git')): - os.chdir(redcoreEbuildDir) - subprocess.call(['git', 'init', '-q']) - subprocess.call(['git', 'remote', 'add', 'origin', 'https://pagure.io/redcore/redcore-desktop.git']) - subprocess.call(['git', 'fetch', '--depth=1', 'origin', 'master', '--quiet']) - subprocess.call(['git', 'checkout', '-b', 'master', 'origin/master', '--quiet']) - -@animation.wait('injecting redcore linux portage configuration - branch master') -def setPagureMasterStage3(): - if not os.path.isdir(os.path.join(portageConfigDir, '.git')): - os.chdir(portageConfigDir) - subprocess.call(['git', 'init', '-q']) - subprocess.call(['git', 'remote', 'add', 'origin', 'https://pagure.io/redcore/redcore-build.git']) - subprocess.call(['git', 'fetch', '--depth=1', 'origin', 'master', '--quiet']) - subprocess.call(['git', 'checkout', '-b', 'master', 'origin/master', '--quiet']) - -def setPagureMaster(): - setPagureMasterStage1() - setPagureMasterStage2() - setPagureMasterStage3() - -@animation.wait('injecting gentoo linux portage tree - branch next') -def setGitlabNextStage1(): - if not os.path.isdir(os.path.join(gentooEbuildDir, '.git')): - os.chdir(gentooEbuildDir) - subprocess.call(['git', 'init', '-q']) - subprocess.call(['git', 'remote', 'add', 'origin', 'https://gitlab.com/redcore/portage.git']) - subprocess.call(['git', 'fetch', '--depth=1', 'origin', 'next', '--quiet']) - subprocess.call(['git', 'checkout', '-b', 'next', 'origin/next', '--quiet']) - -@animation.wait('injecting redcore linux ebuild tree - branch next') -def setGitlabNextStage2(): - if not os.path.isdir(os.path.join(redcoreEbuildDir, '.git')): - os.chdir(redcoreEbuildDir) - subprocess.call(['git', 'init', '-q']) - subprocess.call(['git', 'remote', 'add', 'origin', 'https://gitlab.com/redcore/redcore-desktop.git']) - subprocess.call(['git', 'fetch', '--depth=1', 'origin', 'next', '--quiet']) - subprocess.call(['git', 'checkout', '-b', 'next', 'origin/next', '--quiet']) - -@animation.wait('injecting redcore linux portage configuration - branch next') -def setGitlabNextStage3(): - if not os.path.isdir(os.path.join(portageConfigDir, '.git')): - os.chdir(portageConfigDir) - subprocess.call(['git', 'init', '-q']) - subprocess.call(['git', 'remote', 'add', 'origin', 'https://gitlab.com/redcore/redcore-build.git']) - subprocess.call(['git', 'fetch', '--depth=1', 'origin', 'next', '--quiet']) - subprocess.call(['git', 'checkout', '-b', 'next', 'origin/next', '--quiet']) - -def setGitlabNext(): - setGitlabNextStage1() - setGitlabNextStage2() - setGitlabNextStage3() - -@animation.wait('injecting gentoo linux portage tree - branch next') -def setPagureNextStage1(): - if not os.path.isdir(os.path.join(gentooEbuildDir, '.git')): - os.chdir(gentooEbuildDir) - subprocess.call(['git', 'init', '-q']) - subprocess.call(['git', 'remote', 'add', 'origin', 'https://pagure.io/redcore/portage.git']) - subprocess.call(['git', 'fetch', '--depth=1', 'origin', 'next', '--quiet']) - subprocess.call(['git', 'checkout', '-b', 'next', 'origin/next', '--quiet']) - -@animation.wait('injecting redcore linux ebuild tree - branch next') -def setPagureNextStage2(): - if not os.path.isdir(os.path.join(redcoreEbuildDir, '.git')): - os.chdir(redcoreEbuildDir) - subprocess.call(['git', 'init', '-q']) - subprocess.call(['git', 'remote', 'add', 'origin', 'https://pagure.io/redcore/redcore-desktop.git']) - subprocess.call(['git', 'fetch', '--depth=1', 'origin', 'next', '--quiet']) - subprocess.call(['git', 'checkout', '-b', 'next', 'origin/next', '--quiet']) - -@animation.wait('injecting redcore linux portage configuration - branch next') -def setPagureNextStage3(): - if not os.path.isdir(os.path.join(portageConfigDir, '.git')): - os.chdir(portageConfigDir) - subprocess.call(['git', 'init', '-q']) - subprocess.call(['git', 'remote', 'add', 'origin', 'https://pagure.io/redcore/redcore-build.git']) - subprocess.call(['git', 'fetch', '--depth=1', 'origin', 'next', '--quiet']) - subprocess.call(['git', 'checkout', '-b', 'next', 'origin/next', '--quiet']) - -def setPagureNext(): - setPagureNextStage1() - setPagureNextStage2() - setPagureNextStage3() - -@animation.wait('setting up hardened profile') -def setHardenedProfile(): - subprocess.call(['eselect', 'profile', 'set', 'default/linux/amd64/17.0/hardened']) - subprocess.call(['env-update']) - -@animation.wait('adjusting MAKEOPTS') -def setJobs(): - subprocess.call(['/usr/share/sisyphus/helpers/set_jobs']) - -def injectGitlabMaster(): - checkRoot() - resetBranch() - setGitlabMaster() - setHardenedProfile() - setJobs() - refreshPortageMetadata() - -def injectPagureMaster(): - checkRoot() - resetBranch() - setPagureMaster() - setHardenedProfile() - setJobs() - refreshPortageMetadata() - -def injectGitlabNext(): - checkRoot() - resetBranch() - setGitlabNext() - setHardenedProfile() - setJobs() - refreshPortageMetadata() - -def injectPagureNext(): - checkRoot() - resetBranch() - setPagureNext() - setHardenedProfile() - setJobs() - refreshPortageMetadata() - -def showHelp(): - print("\n" + "Usage : sisyphus command [package(s)] || [file(s)]" + "\n") - print("Sisyphus is a simple python wrapper around portage, gentoolkit, and portage-utils which provides") - print("an apt-get/yum-alike interface to these commands, to assist newcomer people transitioning from") - print("Debian/RedHat-based systems to Gentoo." + "\n") - print("Commands :" + "\n") - print("--install") - print("* Install binary and/or ebuild (source) packages" + "\n") - print("--uninstall") - print("* Uninstall packages *SAFELY* by checking for reverse dependencies") - print("* If reverse dependencies exist, the package(s) will NOT be uninstalled to prevent the possible breakage of the system") - print("* If you really want to uninstall the package, make sure you uninstall all reverse dependencies as well") - print("* This will not allways be possible, as the reverse dependency chain may be way to long and require you to uninstall critical system packages" + "\n") - print("--force-uninstall") - print("* Uninstall packages *UNSAFELY* by ignoring reverse dependencies") - print("* This may break your system if you uninstall critical system packages") - print("* It will try the best it can to preserve the libraries required by other packages to prevent such a breakage") - print("* Upgrading the system may pull the packages back in, to fix the reverse dependency chain" + "\n") - print("--remove-orphans") - print("* Uninstall packages that are no longer needed") - print("* When you uninstall a package without it's reverse dependencies, those dependencies will become orphans if nothing else requires them") - print("* In addition, a package may no longer depend on another one, so that other package becomes orphan as well if nothing else requires it") - print("* Use this option to check the whole dependency chain for such packages, and uninstall them" + "\n") - print("--update") - print("* Update the Portage tree, the Redcore Overlay(s), Portage configs && Sisyphus's package database" + "\n") - print("--upgrade") - print("* Upgrade the system using binary and/or ebuild (source) packages" + "\n") - print("--search") - print("* Search for binary and/or ebuild (source) packages" + "\n") - print("--spmsync") - print("* Sync Sisyphus's package database with Portage's package database") - print("* When you install something with Portage directly (emerge), Sisyphus is not aware of that package, and it doesn't track it in it's database") - print("* Use this option to synchronize Sisyphus's package database with Portage's package database" + "\n") - print("--rescue") - print("* Resurrect Sisyphus's package database if lost or corrupted") - print("* If for some reason Sisyphus's package database is lost or corrupted, it can be resurrected using Portage's package database") - print("* If Portage's package database is corrupted (in this case you're screwed anyway :D), only a partial resurrection will be possible") - print("* If Portage's package database is intact, full resurrection will be possible" + "\n") - print("--mirror --list") - print("* List available binary package repository mirrors (the active one is marked with *)" + "\n") - print("--mirror --set 'INDEX'") - print("* Change the binary package repository to the selected mirror" + "\n") - print("--branch='BRANCH' --remote='REMOTE'") - print("* Pull the branch 'BRANCH' of the Portage tree, Redcore overlay && Portage configs. Use 'REMOTE' git repositories.") - print("* 'BRANCH' can be one of the following : master, next") - print("* 'REMOTE' can be one of the following : gitlab, pagure") - print("*") - print("* Examples: ") - print("* '--branch=master --remote=gitlab' will pull the branch 'master' from gitlab.com") - print("* '--branch=next --remote=pagure' will pull the branch 'next' from pagure.io") - print("*") - print("* !!! WARNING !!!") - print("* Once you changed the branch, you must pair the branch 'BRANCH' with the correct binary repository") - print("* Branch 'master' must be paired with the stable binary repository (odd numbers in 'sisyphus --mirror --list'). Examples : 'sisyphus --mirror --set 1' or 'sisyphus --mirror --set 5' ") - print("* Branch 'next' must be paired with the testing binary repository (even numbers in 'sisyphus --mirror --list'). Examples : 'sisyphus --mirror --set 2' or 'sisyphus --mirror --set 8'" + "\n") - print("--sysinfo") - print("* Display information about installed core packages and portage configuration" + "\n") - print("--help") - print("* Display this help information" + "\n") diff --git a/src/backend/metadata.py b/src/backend/metadata.py new file mode 100644 index 0000000..fc30b15 --- /dev/null +++ b/src/backend/metadata.py @@ -0,0 +1,35 @@ +#!/usr/bin/python3 + +import animation +import os +import shutil +import subprocess + +portageMetadataDir = '/var/cache/edb' + +def regenSilent(): + if os.path.isdir(portageMetadataDir): + for files in os.listdir(portageMetadataDir): + if os.path.isfile(os.path.join(portageMetadataDir, files)): + os.remove(os.path.join(portageMetadataDir, files)) + else: + shutil.rmtree(os.path.join(portageMetadataDir, files)) + + portageExecStage1 = subprocess.Popen(['emerge', '--quiet', '--regen'], stdout=subprocess.PIPE) + portageExecStage1.wait() + portageExecStage2 = subprocess.Popen(['emerge', '--quiet', '--metadata'], stdout=subprocess.PIPE) + portageExecStage2.wait() + +@animation.wait("refreshing metadata") +def regenAnimated(): + if os.path.isdir(portageMetadataDir): + for files in os.listdir(portageMetadataDir): + if os.path.isfile(os.path.join(portageMetadataDir, files)): + os.remove(os.path.join(portageMetadataDir, files)) + else: + shutil.rmtree(os.path.join(portageMetadataDir, files)) + + portageExecStage1 = subprocess.Popen(['emerge', '--quiet', '--regen'], stdout=subprocess.PIPE) + portageExecStage1.wait() + portageExecStage2 = subprocess.Popen(['emerge', '--quiet', '--metadata'], stdout=subprocess.PIPE) + portageExecStage2.wait() diff --git a/src/backend/mirror.py b/src/backend/mirror.py new file mode 100644 index 0000000..7d041cf --- /dev/null +++ b/src/backend/mirror.py @@ -0,0 +1,60 @@ +#!/usr/bin/python3 + +mirrorCfg = '/etc/sisyphus/mirrors.conf' + +def getList(): + mirrorList = [] + + with open(mirrorCfg) as mirrorFile: + for line in mirrorFile.readlines(): + if 'PORTAGE_BINHOST=' in line: + url = line.split("=")[1].replace('"', '').rstrip() + mirror = {'isActive': True, 'Url': url} + if line.startswith('#'): + mirror['isActive'] = False + mirrorList.append(mirror) + mirrorFile.close() + + return mirrorList + +def printList(): + mirrorList = getList() + + for i, line in enumerate(mirrorList): + if line['isActive']: + print(i + 1, '*', line['Url']) + else: + print(i + 1, ' ', line['Url']) + +def writeList(mirrorList): + with open(mirrorCfg, 'w+') as mirrorFile: + mirrorFile.write("#######################################################\n") + mirrorFile.write("# Support for multiple mirrors is somewhat incomplete #\n") + mirrorFile.write("#######################################################\n") + mirrorFile.write("# Please avoid using the Main Repository #\n") + mirrorFile.write("# http://mirrors.redcorelinux.org/redcorelinux #\n") + mirrorFile.write("# as the bandwidth is limited, use mirrors instead #\n") + mirrorFile.write("#######################################################\n") + mirrorFile.write("# Uncomment only one mirror from the list bellow #\n") + mirrorFile.write("#######################################################\n") + mirrorFile.write("\n") + for line in mirrorList: + mirror = 'PORTAGE_BINHOST=' + '"' + line['Url'] + '"' + if not line['isActive']: + mirror = '# ' + mirror + mirrorFile.write(mirror + "\n") + mirrorFile.write("\n") + +def setActive(mirror): + mirror = int(mirror[0]) + mirrorList = getList() + if mirror not in range(1, len(mirrorList) + 1): + print("\n" + "Mirror index is wrong, please check with sisyphus --mirror --list" + "\n") + else: + for i in range(0, len(mirrorList)): + indx = i + 1 + if indx == mirror: + mirrorList[i]['isActive'] = True + else: + mirrorList[i]['isActive'] = False + writeList(mirrorList) diff --git a/src/backend/removeorphans.py b/src/backend/removeorphans.py new file mode 100644 index 0000000..a0b4f30 --- /dev/null +++ b/src/backend/removeorphans.py @@ -0,0 +1,11 @@ +#!/usr/bin/python3 + +import subprocess +import sisyphus.check +import sisyphus.sync + +def start(): + sisyphus.check.root() + portageExec = subprocess.Popen(['emerge', '--quiet', '--depclean', '--ask']) + portageExec.wait() + sisyphus.database.syncLocal() diff --git a/src/backend/rescue.py b/src/backend/rescue.py new file mode 100644 index 0000000..18523d4 --- /dev/null +++ b/src/backend/rescue.py @@ -0,0 +1,24 @@ +#!/usr/bin/python3 + +import animation +import os +import sisyphus.database + +remotePkgsDB = '/var/lib/sisyphus/csv/remotePackagesPre.csv' +remoteDscsDB = '/var/lib/sisyphus/csv/remoteDescriptionsPre.csv' +localPkgsDB = '/var/lib/sisyphus/csv/localPackagesPre.csv' +sisyphusDB = '/var/lib/sisyphus/db/sisyphus.db' + +@animation.wait('recovering databases') +def start(): + if os.path.exists(remotePkgsDB): + os.remove(remotePkgsDB) + if os.path.exists(remoteDscsDB): + os.remove(remoteDscsDB) + if os.path.exists(localPkgsDB): + os.remove(localPkgsDB) + if os.path.exists(sisyphusDB): + os.remove(sisyphusDB) + + sisyphus.database.syncRemote() + sisyphus.database.syncLocal() diff --git a/src/backend/search.py b/src/backend/search.py new file mode 100644 index 0000000..7e5ab2f --- /dev/null +++ b/src/backend/search.py @@ -0,0 +1,6 @@ +#!/usr/bin/python3 + +import subprocess + +def start(pkgList): + subprocess.call(['emerge', '--search', '--getbinpkg'] + pkgList) diff --git a/src/backend/setjobs.py b/src/backend/setjobs.py new file mode 100644 index 0000000..1047913 --- /dev/null +++ b/src/backend/setjobs.py @@ -0,0 +1,8 @@ +#!/usr/bin/python3 + +import animation +import subprocess + +@animation.wait('adjusting MAKEOPTS') +def start(): + subprocess.call(['/usr/share/sisyphus/helpers/set_jobs']) diff --git a/src/backend/setprofile.py b/src/backend/setprofile.py new file mode 100644 index 0000000..c78269f --- /dev/null +++ b/src/backend/setprofile.py @@ -0,0 +1,9 @@ +#!/usr/bin/python3 + +import animation +import subprocess + +@animation.wait('setting up hardened profile') +def start(): + subprocess.call(['eselect', 'profile', 'set', 'default/linux/amd64/17.0/hardened']) + subprocess.call(['env-update']) diff --git a/src/backend/solvedeps.py b/src/backend/solvedeps.py new file mode 100644 index 0000000..256d588 --- /dev/null +++ b/src/backend/solvedeps.py @@ -0,0 +1,69 @@ +#!/usr/bin/python3 + +import animation +import subprocess +import io + +@animation.wait('resolving dependencies') +def package(pkgList): + areBinaries = [] + areSources = [] + needsConfig = int() + portageExec = subprocess.Popen(['emerge', '--quiet', '--pretend', '--getbinpkg', '--rebuilt-binaries', '--misspell-suggestion=n', '--fuzzy-search=n'] + pkgList, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + + for portageOutput in io.TextIOWrapper(portageExec.stderr, encoding="utf-8"): + if "The following keyword changes are necessary to proceed:" in portageOutput.rstrip(): + needsConfig = int(1) + + if "The following mask changes are necessary to proceed:" in portageOutput.rstrip(): + needsConfig = int(1) + + if "The following USE changes are necessary to proceed:" in portageOutput.rstrip(): + needsConfig = int(1) + + if "The following REQUIRED_USE flag constraints are unsatisfied:" in portageOutput.rstrip(): + needsConfig = int(1) + + for portageOutput in io.TextIOWrapper(portageExec.stdout, encoding="utf-8"): + if "[binary" in portageOutput.rstrip(): + isBinary = str(portageOutput.rstrip().split("]")[1].split("[")[0].strip("\ ")) + areBinaries.append(isBinary) + + if "[ebuild" in portageOutput.rstrip(): + isSource = str(portageOutput.rstrip().split("]")[1].split("[")[0].strip("\ ")) + areSources.append(isSource) + + portageExec.wait() + return areBinaries,areSources,needsConfig + +@animation.wait('resolving dependencies') +def world(): + areBinaries = [] + areSources = [] + needsConfig = int() + portageExec = subprocess.Popen(['emerge', '--quiet', '--update', '--deep', '--newuse', '--pretend', '--getbinpkg', '--rebuilt-binaries', '--backtrack=100', '--with-bdeps=y', '--misspell-suggestion=n', '--fuzzy-search=n', '@world'], stdout=subprocess.PIPE, stderr=subprocess.PIPE) + + for portageOutput in io.TextIOWrapper(portageExec.stderr, encoding="utf-8"): + if "The following keyword changes are necessary to proceed:" in portageOutput.rstrip(): + needsConfig = int(1) + + if "The following mask changes are necessary to proceed:" in portageOutput.rstrip(): + needsConfig = int(1) + + if "The following USE changes are necessary to proceed:" in portageOutput.rstrip(): + needsConfig = int(1) + + if "The following REQUIRED_USE flag constraints are unsatisfied:" in portageOutput.rstrip(): + needsConfig = int(1) + + for portageOutput in io.TextIOWrapper(portageExec.stdout, encoding="utf-8"): + if "[binary" in portageOutput.rstrip(): + isBinary = str(portageOutput.rstrip().split("]")[1].split("[")[0].strip("\ ")) + areBinaries.append(isBinary) + + if "[ebuild" in portageOutput.rstrip(): + isSource = str(portageOutput.rstrip().split("]")[1].split("[")[0].strip("\ ")) + areSources.append(isSource) + + portageExec.wait() + return areBinaries,areSources,needsConfig diff --git a/src/backend/sync.py b/src/backend/sync.py new file mode 100644 index 0000000..b8fd91c --- /dev/null +++ b/src/backend/sync.py @@ -0,0 +1,46 @@ +#!/usr/bin/python3 + +import os +import subprocess + +gentooEbuildDir = '/usr/ports/gentoo' +redcoreEbuildDir = '/usr/ports/redcore' +portageConfigDir = '/opt/redcore-build' + +def portage(): + os.chdir(gentooEbuildDir) + localBranch = subprocess.check_output(['git', 'rev-parse', '--abbrev-ref', 'HEAD']) + remoteBranch = subprocess.check_output(['git', 'rev-parse', '--symbolic-full-name', '@{u}']) + + gitExecStage1 = subprocess.Popen(['git', 'fetch', '--depth=1', 'origin'] + localBranch.decode().strip().split() + ['--quiet'], stdout=subprocess.PIPE) + gitExecStage1.wait() + gitExecStage2 = subprocess.Popen(['git', 'reset', '--hard'] + remoteBranch.decode().strip().replace('refs/remotes/','').split() + ['--quiet'], stdout=subprocess.PIPE) + gitExecStage2.wait() + +def overlay(): + os.chdir(redcoreEbuildDir) + localBranch = subprocess.check_output(['git', 'rev-parse', '--abbrev-ref', 'HEAD']) + remoteBranch = subprocess.check_output(['git', 'rev-parse', '--symbolic-full-name', '@{u}']) + + gitExecStage1 = subprocess.Popen(['git', 'fetch', '--depth=1', 'origin'] + localBranch.decode().strip().split() + ['--quiet'], stdout=subprocess.PIPE) + gitExecStage1.wait() + gitExecStage2 = subprocess.Popen(['git', 'reset', '--hard'] + remoteBranch.decode().strip().replace('refs/remotes/','').split() + ['--quiet'], stdout=subprocess.PIPE) + gitExecStage2.wait() + +def portageCfg(): + os.chdir(portageConfigDir) + localBranch = subprocess.check_output(['git', 'rev-parse', '--abbrev-ref', 'HEAD']) + remoteBranch = subprocess.check_output(['git', 'rev-parse', '--symbolic-full-name', '@{u}']) + + gitExecStage1 = subprocess.Popen(['git', 'stash'], stdout=subprocess.PIPE) + gitExecStage1.wait() + gitExecStage2 = subprocess.Popen(['git', 'fetch', '--depth=1', 'origin'] + localBranch.decode().strip().split() + ['--quiet'], stdout=subprocess.PIPE) + gitExecStage2.wait() + gitExecStage3 = subprocess.Popen(['git', 'reset', '--hard'] + remoteBranch.decode().strip().replace('refs/remotes/','').split() + ['--quiet'], stdout=subprocess.PIPE) + gitExecStage3.wait() + gitExecStage4 = subprocess.Popen(['git', 'stash', 'apply'], stdout=subprocess.PIPE) + gitExecStage4.wait() + gitExecStage5 = subprocess.Popen(['git', 'stash', 'clear'], stdout=subprocess.PIPE) + gitExecStage5.wait() + gitExecStage6 = subprocess.Popen(['git', 'gc', '--prune=now', '--quiet'], stdout=subprocess.PIPE) + gitExecStage6.wait() diff --git a/src/backend/sysinfo.py b/src/backend/sysinfo.py new file mode 100644 index 0000000..5ae29c2 --- /dev/null +++ b/src/backend/sysinfo.py @@ -0,0 +1,7 @@ +#!/usr/bin/python3 + +import subprocess + +def show(): + subprocess.call(['emerge', '--info']) + diff --git a/src/backend/uninstall.py b/src/backend/uninstall.py new file mode 100644 index 0000000..8dc9e34 --- /dev/null +++ b/src/backend/uninstall.py @@ -0,0 +1,11 @@ +#!/usr/bin/python3 + +import subprocess +import sisyphus.check +import sisyphus.sync + +def start(pkgList): + sisyphus.check.root() + portageExec = subprocess.Popen(['emerge', '--quiet', '--depclean', '--ask'] + pkgList) + portageExec.wait() + sisyphus.database.syncLocal() diff --git a/src/backend/uninstallforce.py b/src/backend/uninstallforce.py new file mode 100644 index 0000000..e3f4144 --- /dev/null +++ b/src/backend/uninstallforce.py @@ -0,0 +1,11 @@ +#!/usr/bin/python3 + +import subprocess +import sisyphus.check +import sisyphus.sync + +def start(pkgList): + sisyphus.check.root() + portageExec = subprocess.Popen(['emerge', '--quiet', '--unmerge', '--ask'] + pkgList) + portageExec.wait() + sisyphus.database.syncLocal() diff --git a/src/backend/update.py b/src/backend/update.py new file mode 100644 index 0000000..dd184d2 --- /dev/null +++ b/src/backend/update.py @@ -0,0 +1,39 @@ +#!/usr/bin/python3 + +import animation +import sisyphus.check +import sisyphus.clean +import sisyphus.database +import sisyphus.metadata +import sisyphus.sync + +@animation.wait('fetching updates') +def start(): + sisyphus.check.root() + sisyphus.clean.cache() + + needsPortage = sisyphus.check.portage() + needsOverlay = sisyphus.check.overlay() + + if needsPortage == 1: + if needsOverlay == 1: + sisyphus.sync.portage() + sisyphus.sync.overlay() + sisyphus.sync.portageCfg() + sisyphus.database.syncRemote() + sisyphus.metadata.regenSilent() + elif not needsOverlay == 1: + sisyphus.sync.portage() + sisyphus.sync.overlay() + sisyphus.sync.portageCfg() + sisyphus.database.syncRemote() + sisyphus.metadata.regenSilent() + elif not needsPortage == 1: + if needsOverlay == 1: + sisyphus.sync.portage() + sisyphus.sync.overlay() + sisyphus.sync.portageCfg() + sisyphus.database.syncRemote() + sisyphus.metadata.regenSilent() + elif not needsOverlay == 1: + sisyphus.sync.portageCfg() diff --git a/src/backend/upgrade.py b/src/backend/upgrade.py new file mode 100644 index 0000000..0a3762d --- /dev/null +++ b/src/backend/upgrade.py @@ -0,0 +1,123 @@ +#!/usr/bin/python3 + +import os +import shutil +import subprocess +import sys +import io +import wget +import sisyphus.binhost +import sisyphus.database +import sisyphus.solvedeps +import sisyphus.update + +portageCacheDir = '/var/cache/packages' + +def start(): + sisyphus.update.start() + + binhostURL = sisyphus.binhost.getURL() + areBinaries,areSources,needsConfig = sisyphus.solvedeps.world() + + if needsConfig == 0: + if len(areSources) == 0: + if not len(areBinaries) == 0: + os.chdir(portageCacheDir) + print("\n" + "These are the binary packages that would be merged, in order:" + "\n\n" + str(areBinaries) + "\n\n" + "Total:" + " " + str(len(areBinaries)) + " " + "binary package(s)" + "\n") + if input("Would you like to proceed?" + " " + "[y/N]" + " ").lower().strip()[:1] == "y": + for index, binary in enumerate([package + '.tbz2' for package in areBinaries]): + print(">>> Fetching" + " " + binhostURL + binary) + wget.download(binhostURL + binary) + print("\n") + + subprocess.call(['qtbz2', '-x'] + binary.rstrip().split("/")[1].split()) + CATEGORY = subprocess.check_output(['qxpak', '-x', '-O'] + binary.rstrip().split("/")[1].replace('tbz2', 'xpak').split() + ['CATEGORY']) + + if os.path.exists(binary.rstrip().split("/")[1].replace('tbz2', 'xpak')): + os.remove(binary.rstrip().split("/")[1].replace('tbz2', 'xpak')) + + if os.path.isdir(os.path.join(portageCacheDir, CATEGORY.decode().strip())): + shutil.move(binary.rstrip().split("/")[1], os.path.join(os.path.join(portageCacheDir, CATEGORY.decode().strip()), os.path.basename(binary.rstrip().split("/")[1]))) + else: + os.makedirs(os.path.join(portageCacheDir, CATEGORY.decode().strip())) + shutil.move(binary.rstrip().split("/")[1], os.path.join(os.path.join(portageCacheDir, CATEGORY.decode().strip()), os.path.basename(binary.rstrip().split("/")[1]))) + + if os.path.exists(binary.rstrip().split("/")[1]): + os.remove(binary.rstrip().split("/")[1]) + + portageExec = subprocess.Popen(['emerge', '--update', '--deep', '--newuse', '--usepkg', '--usepkgonly', '--rebuilt-binaries', '--backtrack=100', '--with-bdeps=y', '--misspell-suggestion=n', '--fuzzy-search=n', '@world'], stdout=subprocess.PIPE) + + for portageOutput in io.TextIOWrapper(portageExec.stdout, encoding="utf-8"): + if not "These are the packages that would be merged, in order:" in portageOutput.rstrip(): + if not "Calculating dependencies" in portageOutput.rstrip(): + print(portageOutput.rstrip()) + + portageExec.wait() + sisyphus.database.syncLocal() + else: + sys.exit("\n" + "Ok; Quitting." + "\n") + else: + sys.exit("\n" + "No package upgrades found; Quitting." + "\n") + else: + if not len(areBinaries) == 0: + os.chdir(portageCacheDir) + print("\n" + "These are the binary packages that would be merged, in order:" + "\n\n" + str(areBinaries) + "\n\n" + "Total:" + " " + str(len(areBinaries)) + " " + "binary package(s)" + "\n") + print("\n" + "These are the source packages that would be merged, in order:" + "\n\n" + str(areSources) + "\n\n" + "Total:" + " " + str(len(areSources)) + " " + "source package(s)" + "\n") + if input("Would you like to proceed?" + " " + "[y/N]" + " ").lower().strip()[:1] == "y": + for index, binary in enumerate([package + '.tbz2' for package in areBinaries]): + print(">>> Fetching" + " " + binhostURL + binary) + wget.download(binhostURL + binary) + print("\n") + + subprocess.call(['qtbz2', '-x'] + binary.rstrip().split("/")[1].split()) + CATEGORY = subprocess.check_output(['qxpak', '-x', '-O'] + binary.rstrip().split("/")[1].replace('tbz2', 'xpak').split() + ['CATEGORY']) + + if os.path.exists(binary.rstrip().split("/")[1].replace('tbz2', 'xpak')): + os.remove(binary.rstrip().split("/")[1].replace('tbz2', 'xpak')) + + if os.path.isdir(os.path.join(portageCacheDir, CATEGORY.decode().strip())): + shutil.move(binary.rstrip().split("/")[1], os.path.join(os.path.join(portageCacheDir, CATEGORY.decode().strip()), os.path.basename(binary.rstrip().split("/")[1]))) + else: + os.makedirs(os.path.join(portageCacheDir, CATEGORY.decode().strip())) + shutil.move(binary.rstrip().split("/")[1], os.path.join(os.path.join(portageCacheDir, CATEGORY.decode().strip()), os.path.basename(binary.rstrip().split("/")[1]))) + + if os.path.exists(binary.rstrip().split("/")[1]): + os.remove(binary.rstrip().split("/")[1]) + + portageExec = subprocess.Popen(['emerge', '--update', '--deep', '--newuse', '--usepkg', '--rebuilt-binaries', '--backtrack=100', '--with-bdeps=y', '--misspell-suggestion=n', '--fuzzy-search=n', '@world'], stdout=subprocess.PIPE) + + for portageOutput in io.TextIOWrapper(portageExec.stdout, encoding="utf-8"): + if not "These are the packages that would be merged, in order:" in portageOutput.rstrip(): + if not "Calculating dependencies" in portageOutput.rstrip(): + print(portageOutput.rstrip()) + + portageExec.wait() + sisyphus.database.syncLocal() + else: + sys.exit("\n" + "Ok; Quitting." + "\n") + else: + print("\n" + "These are the source packages that would be merged, in order:" + "\n\n" + str(areSources) + "\n\n" + "Total:" + " " + str(len(areSources)) + " " + "source package(s)" + "\n") + if input("Would you like to proceed?" + " " + "[y/N]" + " ").lower().strip()[:1] == "y": + portageExec = subprocess.Popen(['emerge', '--update', '--deep', '--newuse', '--backtrack=100', '--with-bdeps=y', '--misspell-suggestion=n', '--fuzzy-search=n', '@world'], stdout=subprocess.PIPE) + + for portageOutput in io.TextIOWrapper(portageExec.stdout, encoding="utf-8"): + if not "These are the packages that would be merged, in order:" in portageOutput.rstrip(): + if not "Calculating dependencies" in portageOutput.rstrip(): + print(portageOutput.rstrip()) + + portageExec.wait() + sisyphus.database.syncLocal() + else: + sys.exit("\n" + "Ok; Quitting." + "\n") + else: + portageExec = subprocess.Popen(['emerge', '--quiet', '--update', '--deep', '--newuse', '--pretend', '--getbinpkg', '--rebuilt-binaries', '--backtrack=100', '--with-bdeps=y', '--misspell-suggestion=n', '--fuzzy-search=n', '@world'], stdout=subprocess.PIPE) + + for portageOutput in io.TextIOWrapper(portageExec.stdout, encoding="utf-8"): + if not "Local copy of remote index is up-to-date and will be used." in portageOutput.rstrip(): + if not "ebuild" in portageOutput.rstrip(): + if not "binary" in portageOutput.rstrip(): + print(portageOutput.rstrip()) + + portageExec.wait() + sys.exit("\n" + "Cannot proceed; Apply the above changes to your portage configuration files and try again; Quitting." + "\n") + diff --git a/src/frontend/cli/sisyphus-cli.py b/src/frontend/cli/sisyphus-cli.py index c78f939..1393cae 100755 --- a/src/frontend/cli/sisyphus-cli.py +++ b/src/frontend/cli/sisyphus-cli.py @@ -1,10 +1,23 @@ #!/usr/bin/python3 +import sisyphus.branchinject +import sisyphus.check +import sisyphus.help +import sisyphus.install +import sisyphus.mirror +import sisyphus.removeorphans +import sisyphus.rescue +import sisyphus.search +import sisyphus.setjobs +import sisyphus.sysinfo +import sisyphus.uninstall +import sisyphus.uninstallforce +import sisyphus.update +import sisyphus.upgrade import sys -from libsisyphus import * -checkUpdate() -setJobs.__wrapped__() #undecorate +sisyphus.check.update() +sisyphus.setjobs.start.__wrapped__() # undecorate pkgList = sys.argv[2:] if "__main__" == __name__: @@ -13,59 +26,57 @@ if "__main__" == __name__: if not pkgList: sys.exit("\n" + "Nothing to install, please provide at least one package name; quitting" + "\n") else: - startInstall(pkgList) + sisyphus.install.start(pkgList) elif "--uninstall" in sys.argv[1:]: if not pkgList: sys.exit("\n" + "Nothing to uninstall, please provide at least one package name; quitting" + "\n") else: - startUninstall(pkgList) + sisyphus.uninstall.start(pkgList) elif "--force-uninstall" in sys.argv[1:]: if not pkgList: sys.exit("\n" + "Nothing to force uninstall, please provide at least one package name; quitting" + "\n") else: - startUninstallForce(pkgList) + sisyphus.uninstallforce.start(pkgList) elif "--remove-orphans" in sys.argv[1:]: - removeOrphans() - elif "--update" in sys.argv[1:]: - startUpdate() - elif "--upgrade" in sys.argv[1:]: - startUpgrade() + sisyphus.removeorphans.start() elif "--search" in sys.argv[1:]: if not pkgList: sys.exit("\n" + "Nothing to search, please provide at least one package name; quitting" + "\n") else: - startSearch(pkgList) - elif "--spmsync" in sys.argv[1:]: - startSyncSPM() + sisyphus.search.start(pkgList) + elif "--update" in sys.argv[1:]: + sisyphus.update.start() + elif "--upgrade" in sys.argv[1:]: + sisyphus.upgrade.start() elif "--rescue" in sys.argv[1:]: - rescueDB() + sisyphus.rescue.start() elif "--sysinfo" in sys.argv[1:]: - sysInfo() + sisyphus.sysinfo.show() elif "--mirror" in sys.argv[1:]: if "--list" in sys.argv[2:]: - printMirrorList() + sisyphus.mirror.printList() elif "--set" in sys.argv[2:]: if sys.argv[3:]: - setActiveMirror(sys.argv[3:]) + sisyphus.mirror.setActive(sys.argv[3:]) else: - showHelp() + sisyphus.help.show() else: - showHelp() + sisyphus.help.show() elif "--branch=master" in sys.argv[1:]: if "--remote=gitlab" in sys.argv[2:]: - injectGitlabMaster() + sisyphus.branchinject.gitlabMaster() elif "--remote=pagure" in sys.argv[2:]: - injectPagureMaster() + sisyphus.branchinject.pagureMaster() else: - showHelp() + sisyphus.help.show() elif "--branch=next" in sys.argv[1:]: if "--remote=gitlab" in sys.argv[2:]: - injectGitlabNext() + sisyphus.branchinject.gitlabNext() elif "--remote=pagure" in sys.argv[2:]: - injectPagureNext() + sisyphus.branchinject.pagureNext() else: - showHelp() + sisyphus.help.show() elif "--help" in sys.argv[1:]: - showHelp() + sisyphus.help.show() else: - showHelp() + sisyphus.help.show() -- cgit v1.2.3