scripts/src/install-ebuild-deps

114 lines
2.7 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, either version 3 of the License, or
(at your option) any later version.
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@protonmail.com)
Copyright (c) 2020, 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
from subprocess import call
parser = argparse.ArgumentParser(
description="Install Ebuild Dependencies",
epilog="Copyright (c) 2020, src_prepare group (License: ISC)"
)
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
proper = ""
# Strip required use
for i in ["["]:
if i in pkg_str:
proper = pkg_str.split(i)[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():
if adddeps:
# TODO: Find a better pkg match method
if "/" in line:
deps.append(
pkg_name(line.strip())
)
elif "\"" in line:
adddeps = False
# TODO: Find a better way to find the depend "block"
elif "DEPEND" in line:
adddeps = True
return deps
def main():
"""The main function"""
print("Ebuilds:", args.ebuild)
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()