#!/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 . 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()