From 377491ee22795b6a8b737d1f0489d7e79a83ae5a Mon Sep 17 00:00:00 2001 From: OscarL Date: Thu, 19 Oct 2023 12:42:49 -0300 Subject: [PATCH] Fix #256. (#275) --- HaikuPorter/DependencyResolver.py | 21 ++++++++++++++++----- HaikuPorter/Port.py | 7 ++++--- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/HaikuPorter/DependencyResolver.py b/HaikuPorter/DependencyResolver.py index a0e55793..c0e389fc 100644 --- a/HaikuPorter/DependencyResolver.py +++ b/HaikuPorter/DependencyResolver.py @@ -7,7 +7,7 @@ import os import re -from subprocess import CalledProcessError, check_output +import subprocess from .Options import getOption from .PackageInfo import PackageInfo, ResolvableExpression @@ -238,15 +238,26 @@ def _addImmediate(self, parent, requires, typeString, forBuildhost): if getOption('getDependencies'): try: print('Fetching package for ' + str(requires) + ' ...') - output = check_output(['pkgman', 'install', '-y', str(requires).replace(' ', '')]).decode('utf-8') + output = subprocess.check_output(['pkgman', 'install', '-y', + str(requires).replace(' ', '')], stderr=subprocess.PIPE).decode('utf-8') for pkg in re.findall(r'://.*/([^/\n]+\.hpkg)', output): pkginfo = PackageInfo('/boot/system/packages/' + pkg) self._providesManager.addProvidesFromPackageInfo(pkginfo) provides = self._providesManager.getMatchingProvides(requires, isPrerequiresType, self._ignoreBase) - except CalledProcessError: + except subprocess.CalledProcessError as e: + # `pkgman install -y` failed, propagate the why. + error = e.stderr.decode('utf-8') + output = e.output.decode('utf-8').splitlines() + for index, line in enumerate(output): + if line.startswith('Encountered problems:'): + break + else: + index = -1 + lines = ['\t' + line for line in output[index + 1:]] + lines = '\n'.join(lines) raise RestartDependencyResolutionException(parent, - 'failed to install package for {}'.format(requires)) + 'failed to install package for {}.\n{}'.format(requires, error or lines)) else: message = '%s "%s" of package "%s" could not be resolved' \ % (typeString, str(requires), parent.versionedName) @@ -283,7 +294,7 @@ def _parsePackageInfo(self, packageInfoFile, fatal): try: packageInfo = PackageInfo(packageInfoFile) DependencyResolver.packageInfoCache[packageInfoFile] = packageInfo - except CalledProcessError: + except subprocess.CalledProcessError: message = 'failed to parse "%s"' % packageInfoFile sysExit(message) if fatal else warn(message) return None diff --git a/HaikuPorter/Port.py b/HaikuPorter/Port.py index 0bb87d77..9af05005 100644 --- a/HaikuPorter/Port.py +++ b/HaikuPorter/Port.py @@ -1581,15 +1581,16 @@ def _resolveDependencies(self, dependencyInfoFiles, requiresTypes, try: return buildPlatform.resolveDependencies(dependencyInfoFiles, requiresTypes, repositories, **kwargs) - except (CalledProcessError, LookupError): + except (CalledProcessError, LookupError) as e: if getOption('buildMaster'): raise sysExit(('unable to resolve %s for %s\n' + '\tdependency-infos:\n\t\t%s\n' - + '\trepositories:\n\t\t%s\n') + + '\trepositories:\n\t\t%s\n' + + '\tReason: %s') % (description, self.versionedName, - '\n\t\t'.join(dependencyInfoFiles), repositories)) + '\n\t\t'.join(dependencyInfoFiles), repositories, e)) def _createSourcePackage(self, name, rigged): # copy all recipe attributes from base package, but set defaults