scripts/src/install-ebuild-deps

125 lines
2.8 KiB
Python
Executable File

#!/usr/bin/env python3
"""
This file is part of scripts.
scripts is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, version 3.
scripts is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with scripts. If not, see <https://www.gnu.org/licenses/>.
Original author: Maciej Barć <xgqt@riseup.net>
Copyright (c) 2020-2021, src_prepare group
Licensed under the GNU GPL v3 License
Install Ebuild Dependencies
This script is strictly for working with ebuild files.
In normal situaltion when we already have a repository (/var/db/repos/repo),
to emerge dependencies we would just do "emerge --oneshot --onlydeps PKG".
"""
import argparse
import sys
from subprocess import call
parser = argparse.ArgumentParser(
description="Install Ebuild Dependencies",
epilog="Copyright (c) 2020-2021, src_prepare group (License: GPLv3)"
)
parser.add_argument(
"ebuild",
nargs="*",
type=str
)
args = parser.parse_args()
def pkg_name(pkg_str):
"""
Parse string and return a pkg name.
"""
# TODO: don't strip but force
# Strip required use
proper = pkg_str.split("[")[0]
# Strip conditional use
for i in ["$", "DEPEND", "||", "!", "?", "(", ")"]:
if i in proper:
proper = ""
return proper
def ebuild_deps(ebuild_file):
"""
Returns dependencies from a ebuild file.
"""
deps = []
adddeps = False
with open(ebuild_file) as ebuild:
for line in ebuild.read().splitlines():
# TODO: Find a better way to find the depend "block"
if "DEPEND" in line:
adddeps = True
elif adddeps:
# TODO: Find a better pkg match method
if "/" in line:
deps.append(
pkg_name(line.strip())
)
elif "\"" in line:
adddeps = False
return deps
def main():
"""
The main function.
"""
print("Ebuilds:", args.ebuild)
if args.ebuild == []:
print("[ERROR]: No ebuilds given")
sys.exit(1)
all_deps = []
for ebuild in args.ebuild:
all_deps += ebuild_deps(ebuild)
print("Dependencies:", all_deps)
# TODO: Maybe use Portage API
call(
[
"emerge",
"--autounmask",
"--noreplace",
"--oneshot"
]
+
list(filter(None, all_deps))
)
if __name__ == "__main__":
main()