def _handle_build_step_error(self, recipe, step, trace, arch): if step in [BuildSteps.FETCH, BuildSteps.EXTRACT]: # if any of the source steps failed, wipe the directory and reset # the recipe status to start from scratch next time shutil.rmtree(recipe.build_dir) self.cookbook.reset_recipe_status(recipe.name) raise BuildStepError(recipe, step, trace=trace, arch=arch)
def _cook_recipe(self, recipe, count, total): if not self.cookbook.recipe_needs_build(recipe.name) and \ not self.force: m.build_step(count, total, recipe.name, _("already built")) return if self.missing_files: # create a temp file that will be used to find newer files tmp = tempfile.NamedTemporaryFile() recipe.force = self.force for desc, step in recipe.steps: m.build_step(count, total, recipe.name, step) # check if the current step needs to be done if self.cookbook.step_done(recipe.name, step) and not self.force: m.action(_("Step done")) continue try: # call step function stepfunc = getattr(recipe, step) if not stepfunc: raise FatalError(_('Step %s not found') % step) shell.set_logfile_output("%s/%s-%s.log" % (recipe.config.logs, recipe, step)) stepfunc() # update status successfully self.cookbook.update_step_status(recipe.name, step) shell.close_logfile_output() except FatalError, e: shell.close_logfile_output(dump=True) self._handle_build_step_error(recipe, step, e.arch) except Exception: shell.close_logfile_output(dump=True) raise BuildStepError(recipe, step, traceback.format_exc())
def _cook_recipe(self, recipe, count, total): if not self.cookbook.recipe_needs_build(recipe.name) and \ not self.force: m.build_step(count, total, recipe.name, _("already built")) return if self.missing_files: # create a temp file that will be used to find newer files tmp = tempfile.NamedTemporaryFile() recipe.force = self.force for desc, step in recipe.steps: m.build_step(count, total, recipe.name, step) # check if the current step needs to be done if self.cookbook.step_done(recipe.name, step) and not self.force: m.action(_("Step done")) continue try: # call step function stepfunc = getattr(recipe, step) if not stepfunc: raise FatalError(_('Step %s not found') % step) stepfunc() # update status successfully self.cookbook.update_step_status(recipe.name, step) except FatalError: self._handle_build_step_error(recipe, step) except Exception: raise BuildStepError(recipe, step, traceback.format_exc()) self.cookbook.update_build_status(recipe.name, recipe.built_version()) if self.missing_files: self._print_missing_files(recipe, tmp)
def _cook_recipe(self, recipe, count, total): if not self.cookbook.recipe_needs_build(recipe.name) and \ not self.force: m.build_step(count, total, recipe.name, _("already built")) return if self.missing_files: # create a temp file that will be used to find newer files tmp = tempfile.NamedTemporaryFile() recipe.force = self.force for desc, step in recipe.steps: m.build_step(count, total, recipe.name, step) # check if the current step needs to be done if self.cookbook.step_done(recipe.name, step) and not self.force: m.action(_("Step done")) continue try: # call step function stepfunc = getattr(recipe, step) if not stepfunc: raise FatalError(_('Step %s not found') % step) if asyncio.iscoroutinefunction(stepfunc): loop = asyncio.get_event_loop() # On Windows the default SelectorEventLoop is not available: # https://docs.python.org/3.5/library/asyncio-subprocess.html#windows-event-loop if recipe.config.platform == Platform.WINDOWS and \ not isinstance(loop, asyncio.ProactorEventLoop): loop = asyncio.ProactorEventLoop() asyncio.set_event_loop(loop) loop.run_until_complete(stepfunc(recipe)) else: stepfunc() # update status successfully self.cookbook.update_step_status(recipe.name, step) except FatalError as e: exc_traceback = sys.exc_info()[2] trace = '' # Don't print trace if the FatalError is merely that the # subprocess exited with a non-zero status. The traceback # is just confusing and useless in that case. if not isinstance(e.__context__, CalledProcessError): tb = traceback.extract_tb(exc_traceback)[-1] if tb.filename.endswith('.recipe'): # Print the recipe and line number of the exception # if it starts in a recipe trace += 'Exception at {}:{}\n'.format( tb.filename, tb.lineno) trace += e.args[0] + '\n' self._handle_build_step_error(recipe, step, trace, e.arch) except Exception: raise BuildStepError(recipe, step, traceback.format_exc()) self.cookbook.update_build_status(recipe.name, recipe.built_version()) if self.missing_files: self._print_missing_files(recipe, tmp) tmp.close()
def _cook_recipe(self, recipe, count, total): # A Recipe depending on a static library that has been rebuilt # also needs to be rebuilt to pick up the latest build. if recipe.library_type != LibraryType.STATIC: if len(set(self._static_libraries_built) & set(recipe.deps)) != 0: self.cookbook.reset_recipe_status(recipe.name) if not self.cookbook.recipe_needs_build(recipe.name) and \ not self.force: m.build_step(count, total, recipe.name, _("already built")) return if self.missing_files: # create a temp file that will be used to find newer files tmp = tempfile.NamedTemporaryFile() recipe.force = self.force for desc, step in recipe.steps: m.build_step(count, total, recipe.name, step) # check if the current step needs to be done if self.cookbook.step_done(recipe.name, step) and not self.force: m.action(_("Step done")) continue try: # call step function stepfunc = getattr(recipe, step) if not stepfunc: raise FatalError(_('Step %s not found') % step) if asyncio.iscoroutinefunction(stepfunc): run_until_complete(stepfunc()) else: stepfunc() # update status successfully self.cookbook.update_step_status(recipe.name, step) except FatalError as e: exc_traceback = sys.exc_info()[2] trace = '' # Don't print trace if the FatalError is merely that the # subprocess exited with a non-zero status. The traceback # is just confusing and useless in that case. if not isinstance(e.__context__, CalledProcessError): tb = traceback.extract_tb(exc_traceback)[-1] if tb.filename.endswith('.recipe'): # Print the recipe and line number of the exception # if it starts in a recipe trace += 'Exception at {}:{}\n'.format( tb.filename, tb.lineno) trace += e.args[0] + '\n' self._handle_build_step_error(recipe, step, trace, e.arch) except Exception: raise BuildStepError(recipe, step, traceback.format_exc()) self.cookbook.update_build_status(recipe.name, recipe.built_version()) if recipe.library_type == LibraryType.STATIC: self._static_libraries_built.append(recipe.name) if self.missing_files: self._print_missing_files(recipe, tmp) tmp.close()
def _cook_recipe(self, recipe, count, total): if not self.cookbook.recipe_needs_build(recipe.name) and \ not self.force: m.build_step(count, total, recipe.name, _("already built")) return if self.missing_files: # create a temp file that will be used to find newer files tmp = tempfile.NamedTemporaryFile() recipe.force = self.force for desc, step in recipe.steps: m.build_step(count, total, recipe.name, step) # check if the current step needs to be done if self.cookbook.step_done(recipe.name, step) and not self.force: m.action(_("Step done")) continue try: # call step function stepfunc = getattr(recipe, step) if not stepfunc: raise FatalError(_('Step %s not found') % step) shell.set_logfile_output("%s/%s-%s.log" % (recipe.config.logs, recipe, step)) stepfunc() # update status successfully self.cookbook.update_step_status(recipe.name, step) shell.close_logfile_output() except FatalError as e: shell.close_logfile_output(dump=True) exc_traceback = sys.exc_info()[2] trace = '' # Don't print trace if the FatalError is merely that the # subprocess exited with a non-zero status. The traceback # is just confusing and useless in that case. if not isinstance(e.__context__, CalledProcessError): tb = traceback.extract_tb(exc_traceback)[-1] if tb.filename.endswith('.recipe'): # Print the recipe and line number of the exception # if it starts in a recipe trace += 'Exception at {}:{}\n'.format( tb.filename, tb.lineno) trace += e.args[0] + '\n' self._handle_build_step_error(recipe, step, trace, e.arch) except Exception: shell.close_logfile_output(dump=True) raise BuildStepError(recipe, step, traceback.format_exc()) self.cookbook.update_build_status(recipe.name, recipe.built_version()) if self.missing_files: self._print_missing_files(recipe, tmp) tmp.close()
async def _cook_recipe_step(self, recipe, step, count): # check if the current step needs to be done if self.cookbook.step_done(recipe.name, step) and not self.force: self._build_status_printer.update_recipe_step( count, recipe.name, step) return try: # call step function stepfunc = getattr(recipe, step) if not stepfunc: self._build_status_printer.update_recipe_step( count, recipe.name, step) raise FatalError(_('Step %s not found') % step) self._build_status_printer.update_recipe_step( count, recipe.name, step) ret = stepfunc() if asyncio.iscoroutine(ret): await ret self._build_status_printer.remove_recipe(recipe.name) # update status successfully self.cookbook.update_step_status(recipe.name, step) except asyncio.CancelledError: raise except FatalError as e: exc_traceback = sys.exc_info()[2] trace = '' # Don't print trace if the FatalError is merely that the # subprocess exited with a non-zero status. The traceback # is just confusing and useless in that case. if not isinstance(e.__context__, CalledProcessError): tb = traceback.extract_tb(exc_traceback)[-1] if tb.filename.endswith('.recipe'): # Print the recipe and line number of the exception # if it starts in a recipe trace += 'Exception at {}:{}\n'.format( tb.filename, tb.lineno) trace += e.args[0] + '\n' self._handle_build_step_error(recipe, step, trace, e.arch) except Exception: raise BuildStepError(recipe, step, traceback.format_exc())
def _apply_steps(self, recipe, steps, count, total): for desc, step in steps: m.build_step(count, total, recipe.name, step) # check if the current step needs to be done if self.cookbook.step_done(recipe.name, step) and not self.force: m.action(_("Step done")) continue # call step function stepfunc = getattr(self, step) if not stepfunc: raise FatalError(_('Step %s not found') % step) try: stepfunc(recipe) # update status successfully self.cookbook.update_step_status(recipe.name, step) except Exception as e: m.warning(str(e)) raise BuildStepError(recipe, step, traceback.format_exc()) # Update the recipe status p = self.store.get_package('%s-pkg' % recipe.name) v = p.version.rsplit('-')[0] self.cookbook.update_build_status(recipe.name, v)