Source code for craft_parts.steps

# -*- Mode:Python; indent-tabs-mode:nil; tab-width:4 -*-
#
# Copyright 2021-2023 Canonical Ltd.
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License version 3 as published by the Free Software Foundation.
#
# This program 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
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

"""Definitions and helpers to handle lifecycle steps."""

import enum
from typing import List, Optional

from craft_parts.features import Features


[docs]@enum.unique class Step(enum.IntEnum): """All the steps needed to fully process a part. Steps correspond to the tasks that must be fulfilled in order to process each of the parts in the project specification. In the ``PULL`` step sources for a part are retrieved and unpacked. The ``OVERLAY`` step is used to change the underlying filesystem. In the ``BUILD`` step artifacts are built and installed. In the ``STAGE`` step installed build artifacts from all parts and overlay contents are added to a staging area. These files are further processed in the ``PRIME`` step to obtain the final tree with the final payload for deployment. """ PULL = 1 OVERLAY = 2 BUILD = 3 STAGE = 4 PRIME = 5 def __repr__(self) -> str: return f"{self.__class__.__name__}.{self.name}"
[docs] def previous_steps(self) -> List["Step"]: """List the steps that should happen before the current step. :returns: The list of previous steps. """ steps = [] if self >= Step.OVERLAY: steps.append(Step.PULL) if self >= Step.BUILD and Features().enable_overlay: steps.append(Step.OVERLAY) if self >= Step.STAGE: steps.append(Step.BUILD) if self >= Step.PRIME: steps.append(Step.STAGE) return steps
[docs] def next_steps(self) -> List["Step"]: """List the steps that should happen after the current step. :returns: The list of next steps. """ steps = [] if self == Step.PULL and Features().enable_overlay: steps.append(Step.OVERLAY) if self <= Step.OVERLAY: steps.append(Step.BUILD) if self <= Step.BUILD: steps.append(Step.STAGE) if self <= Step.STAGE: steps.append(Step.PRIME) return steps
[docs]def dependency_prerequisite_step(step: Step) -> Optional[Step]: """Obtain the step a given step may depend on. :returns: The prerequisite step. """ # With V2 plugins we don't need to repull if dependency is restaged if step <= Step.OVERLAY: return None if step <= Step.STAGE: return Step.STAGE return step