#!/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 . Original author: Maciej Barć 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()