def installPipDeps(deps): try: deps['pip'] except: return color.note('Found pip dependencies, installing.....') depss = " ".join( deps['pip'] ) color.debug(f"pip3 install{' --user' if os.path.exists('/etc/portage') else ''} {depss}") os.system(f"pip3 install{' --user' if os.path.exists('/etc/portage') else ''} {depss}")
def installDeps(flags, paths, args): pkg = getPackageInfo(paths, args[0]) if pkg['deps']: color.note("Found dependencies, installing.....") pkgdeps = pkg['deps'] if os.path.exists("/usr/bin/apt"): installAptDeps(pkgdeps) installBuildDepDeps(pkgdeps) installAvalonDeps(flags, paths, args, pkgdeps) installPipDeps(pkgdeps) reqTxt(args[0], paths)
def installPackage(flags, paths, args): if os.path.exists(args[0]): installLocalPackage(flags, paths, args) quit() if os.path.exists(f"{paths[0]}/{args[0].lower()}") and not flags.fresh: updatePackage(flags, paths, *args) quit() color.isDebug = flags.debug args[0] = args[0].lower() if not os.path.exists(f"{paths[2]}/R2Boyo25"): downloadMainRepo(paths[2]) packagename = args[0] if ":" in packagename: branch = None commit = packagename.split(":")[-1] packagename = packagename.split(":")[0] elif packagename.count("/") > 1: branch = packagename.split("/")[-1] packagename = "/".join(packagename.split(":")[:-1]) commit = None elif ( ":" in packagename ) and ( packagename.count("/") > 1 ): commit = packagename.split(":")[-1] packagename = packagename.split(":")[0] branch = packagename.split("/")[-1] packagename = "/".join(packagename.split(":")[:-1]) else: branch = None commit = None args[0] = packagename color.note("Deleting old binaries and source files.....") deletePackage(paths[0], paths[1], args[0], paths, branch = branch, commit = commit) color.note("Downloading from github.....") color.debug(paths[0], "https://github.com/" + args[0], args[0]) downloadPackage(paths[0], "https://github.com/" + args[0], args[0], branch = branch, commit = commit) if isInMainRepo(args[0], paths) and not isAvalonPackage(args[0], paths[0], args[0]): color.note("Package is not an Avalon package, but it is in the main repository... installing from there.....") moveMainRepoToAvalonFolder(paths[2], args[0], paths[0], paths) else: color.debug("Not in the main repo") checkReqs(paths, args[0]) installDeps(flags, paths, args) if not flags.noinstall: color.note("Beginning compilation/installation.....") compilePackage(paths[0], paths[1], args[0], paths, flags) color.success("Done!") else: color.warn("-ni specified, skipping installation/compilation")
def installBuildDepDeps(deps): try: deps['build-dep'] except: return if deps['build-dep']: color.note("Found build-dep (apt) dependencies, installing..... (this will require your password)") depss = " ".join( deps['build-dep'] ) username = getpass.getuser() if username != 'root' and not username.startswith("u0_a"): color.debug(f'sudo apt build-dep -y {depss}') if os.system(f'sudo apt build-dep -y {depss}'): error("apt error") else: color.debug(f'apt build-dep -y {depss}') if os.system(f'apt build-dep -y {depss}'): error("apt error")
def installAptDeps(deps): try: deps['apt'] except: return if deps['apt']: filtered_deps = aptFilter(deps['apt']) if len(filtered_deps) > 0: color.note("Found apt dependencies, installing..... (this will require your password)") depss = " ".join(filtered_deps) username = getpass.getuser() if username != 'root' and not username.startswith("u0_a"): color.debug(f'sudo apt install -y {depss}') os.system(f'sudo apt install -y {depss}') else: color.debug(f'apt install -y {depss}') os.system(f'apt install -y {depss}')
def uninstallPackage(flags, paths, args): color.isDebug = flags.debug args[0] = args[0].lower() if not os.path.exists(f"{paths[2]}/R2Boyo25"): downloadMainRepo(paths[2]) if isInMainRepo(args[0], paths) and not isAvalonPackage(args[0], paths[0], args[0]): color.note("Package is not an Avalon package, but it is in the main repository... uninstalling from there.....") moveMainRepoToAvalonFolder(paths[2], args[0], paths[0], paths) checkReqs(paths, args[0]) pkg = getPackageInfo(paths, args[0]) color.note("Uninstalling.....") if not pkg['uninstallScript']: color.warn("Uninstall script not found... Assuming uninstall not required and deleting files.....") deletePackage(paths[0], paths[1], args[0], paths) else: color.note("Uninstall script found, running.....") os.chdir(paths[1]) if runScript(paths[0] + "/" + args[0] + '/' + pkg['uninstallScript'], paths[0], paths[1], args[0], pkg['binname'], paths[4]+args[0]): color.error("Uninstall script failed! Deleting files anyways.....") deletePackage(paths[0], paths[1], args[0], paths) color.success("Successfully uninstalled package!")
def installLocalPackage(flags, paths, args): tmppath = paths[5] color.isDebug = flags.debug color.note("Unpacking package.....") if not os.path.exists(args[0]): error(f"{args[0]} does not exist") elif os.path.isdir(args[0]): color.debug(f"cp -r {args[0]}/./ {tmppath}") if os.system(f"cp -r {args[0]}/./ {tmppath}"): error("Failed to copy files") else: color.debug(f"tar -xf {args[0]} -C {tmppath}") if os.system(f"tar -xf {args[0]} -C {tmppath}"): error("Error unpacking package, not a tar.gz file") cfgfile = json.load(open(f"{tmppath}/.avalon/package", "r")) try: args[0] = (cfgfile["author"] + "/" + cfgfile["repo"]).lower() except: error("Package's package file need 'author' and 'repo'") color.note("Deleting old binaries and source files.....") deletePackage(paths[0], paths[1], args[0], paths, cfgfile) color.note("Copying package files....") color.debug(f"mkdir -p {paths[0]}/{args[0]}") if os.system(f"mkdir -p {paths[0]}/{args[0]}"): error("Failed to make src folder") color.debug(f"cp -a {tmppath}/. {paths[0]}/{args[0]}") if os.system(f"cp -a {tmppath}/. {paths[0]}/{args[0]}"): error("Failed to copy files from temp folder to src folder") shutil.rmtree(tmppath) checkReqs(paths, args[0]) installDeps(flags, paths, args) if not flags.noinstall: color.note("Beginning compilation/installation.....") compilePackage(paths[0], paths[1], args[0], paths, flags) color.success("Done!") else: color.warn("-ni specified, skipping installation/compilation")
def updatePackage(flags, paths, *args): "Update to newest version of a repo, then recompile + reinstall program" args = list(args) if len(args) == 0: args.append("r2boyo25/avalonpackagemanager") #if not os.path.exists(f"{paths[0]}/{args[0].lower()}"): # installPackage(flags, paths, args) # quit() if not os.path.exists(f"{paths[2]}/R2Boyo25"): downloadMainRepo(paths[2]) color.isDebug = flags.debug args[0] = args[0].lower() #color.note("Deleting old binaries and source files.....") #deletePackage(paths[0], paths[1], args[0], paths, branch = branch, commit = commit) #rmFromBin(paths[1], packagename, paths) color.note("Pulling from github.....") #color.debug(paths[0], "https://github.com/" + args[0], args[0]) if os.system(f"cd {paths[0]}/{args[0]}; git pull"): if os.system(f"cd {paths[0]}/{args[0]}; git reset --hard; git pull"): error("Git error") #downloadPackage(paths[0], "https://github.com/" + args[0], args[0], branch = branch, commit = commit) if isInMainRepo(args[0], paths): color.note("Package is not an Avalon package, but it is in the main repository... installing from there.....") moveMainRepoToAvalonFolder(paths[2], args[0], paths[0], paths) else: color.debug("Not in the main repo") checkReqs(paths, args[0]) installDeps(flags, paths, args) if not flags.noinstall: color.note("Beginning compilation/installation.....") compilePackage(paths[0], paths[1], args[0], paths, flags) color.success("Done!") else: color.warn("-ni specified, skipping installation/compilation")
def installAvalonDeps(flags, paths, args, deps): try: deps['avalon'] except: return args = args.copy() if deps['avalon']: color.note("Found avalon dependencies, installing.....") for dep in deps['avalon']: if not os.path.exists(paths[0] + dep.lower()) or flags.update: color.note("Installing", dep) color.silent() args[0] = dep installPackage(flags, paths, args) color.silent() color.note("Installed", dep)
def compilePackage(srcFolder, binFolder, packagename, paths, flags): pkg = getPackageInfo(paths, packagename) os.chdir(f"{srcFolder}/{packagename}") os.makedirs(f"{paths[4]}/{packagename}", exist_ok = True) if pkg['needsCompiled']: if not pkg['binname']: color.warn("Package needs compiled but there is no binname for Avalon to install, assuming installed by compile script.....") if pkg['compileScript']: color.note("Compile script found, compiling.....") if runScript(pkg['compileScript'], f"\"{srcFolder+f'/{packagename}'}\" \"{pkg['binname']}\" \"{paths[4]+packagename}\""): error("Compile script failed!") else: error("Program needs compiling but no compilation script found... exiting.....") else: color.warn("Program does not need to be compiled, moving to installation.....") if pkg['binname'] and not pkg['mvBinAfterInstallScript']: rmFromBin(binFolder, packagename, paths) if pkg['binfile']: mvBinToBin(binFolder, paths[4]+packagename, srcFolder + "/" + packagename + "/", pkg['binfile'], pkg['binname']) else: mvBinToBin(binFolder, paths[4]+packagename, srcFolder + "/" + packagename + "/", pkg['binname'], pkg['binname']) if pkg['installScript']: color.note("Installing.....") if pkg['needsCompiled'] or pkg['compileScript'] or pkg['binname']: if runScript(pkg['installScript'], f"\"{paths[4]+ '/' + packagename + '/' + pkg['binname']}\" \"{paths[4]+packagename}\" \"{binFolder}\" \"{srcFolder}\""): error("Install script failed!") else: if runScript(pkg['installScript'], f"\"{paths[4] + '/' + packagename}\" \"{srcFolder}\" \"{packagename}\""): error("Install script failed!") if pkg['toCopy']: color.note("Copying files needed by program.....") copyFilesToFiles(paths, packagename, pkg['toCopy']) if pkg['mvBinAfterInstallScript'] and pkg['binname']: rmFromBin(binFolder, packagename, paths) if pkg['binfile']: mvBinToBin(binFolder, paths[4]+packagename, srcFolder + "/" + packagename + "/", pkg['binfile'], pkg['binname']) else: mvBinToBin(binFolder, paths[4]+packagename, srcFolder + "/" + packagename + "/", pkg['binname'], pkg['binname']) else: color.warn('No installation script found... Assuming installation beyond APM\'s autoinstaller isn\'t neccessary')
def reqTxt(pkgname, paths): color.debug(paths[0] + "/" + pkgname + '/' + 'requirements.txt') color.debug(os.curdir) if os.path.exists(paths[0] + "/" + pkgname + '/' + 'requirements.txt'): color.note("Requirements.txt found, installing.....") os.system(f"pip3 --disable-pip-version-check -q install{' --user' if os.path.exists('/etc/portage') else ''} -r {paths[0]}/{pkgname}/requirements.txt")