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