# Copyright (c) 2024 Tenstorrent AI ULC
#
# SPDX-License-Identifier: Apache-2.0

# A pykwalify schema for basic validation of the patches.yml format.

# The schema for individual patch objects
schema;patch-schema:
  type: seq
  sequence:
    - type: map
      mapping:

        # The path to the patch file, relative to the root of the module
        # E.g. zephyr/kernel-pipe-fix-not-k-no-wait-and-ge-min-xfer-bytes.patch
        path:
          required: true
          type: str

        # The SHA-256 checksum of the patch file
        # e.g. e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
        sha256sum:
          required: true
          type: str
          pattern: "^[0-9a-f]{64}$"

        # The path of the module the patch is for, relative to the west workspace
        # e.g. zephyr, or bootloader/mcuboot
        module:
          required: true
          type: str

        # The name of the primary author of the patch, e.g. Kermit D. Frog
        author:
          required: true
          type: str

        # The email address of the primary author of the patch, e.g. itsnoteasy@being.gr
        email:
          required: true
          type: str
          pattern: ".+@.+"

        # The date the patch was created, in ISO 8601 date format YYYY-MM-DD
        date:
          required: true
          type: date
          format: "%Y-%m-%d"

        # Whether the patch should be submitted upstream
        upstreamable:
          type: bool
          default: true

        # The URL of the upstream pull request to merge the patch
        # e.g. https://github.com/zephyrproject-rtos/zephyr/pull/24486
        merge-pr:
          type: str
          pattern: "^https?://"

        # The URL of the upstream issue associated with the patch, such as an enhancement issue
        # or bug report, e.g. https://github.com/zephyrproject-rtos/zephyr/issues/24485
        issue:
          type: str
          pattern: "^https?://"

        # Whether the associated merge-pr has been merged
        merge-status:
          type: bool

        # The SHA-1 hash of the upstream git commit incorporating the associated merge-pr
        # e.g. af926ae728c78affa89cbc1de811ab4211ed0f69
        merge-commit:
          type: str
          pattern: "^[0-9a-f]{40}"

        # The date the associated merge-pr was merged, in ISO 8601 date format YYYY-MM-DD
        merge-date:
          type: date
          format: "%Y-%m-%d"

        # The command used to apply the change represented by the patch
        apply-command:
          type: str
          default: "git apply"

        # Comments useful to other developers about the patch,
        # e.g. "This is a workaround for xyz and probably should not go upstream"
        comments:
          type: str

        # Custom field that may be used for any purpose. For example, if the chosen apply-patch
        # command is able to filter based on semantic versioning and a particular patch file
        # only applies to version 1.2.3, one could specify e.g. custom: [1, 2, 3].
        # This field may be of any type and is not validated.
        custom:
          type: any

# The top-level schema for patches.yml files
type: map
mapping:

  # The list of patch objects
  patches:
    include: patch-schema

  # The command used to undo local changes to each module when "west patch clean" is run
  checkout-command:
    type: str
    default: "git checkout ."

  # The command used to clean each module when "west patch clean" is run
  clean-command:
    type: str
    default: "git clean -d -f -x"
