# Release Information

## Introduction

This section documents the tag that can be part of a `component` to provide information about releases made for the respective component.

Alternatively to being embedded in a component metainfo file, the data may also be split into a dedicated XML file to be updated separately.

## Locations

Release data may be present directly in a component metainfo file, but also optionally be split out into an external metadata file.

If the `releases` XML is part of a metainfo file, it is embedded into it following the semantics described in the document.

If the `releases` XML is external, the metainfo file must contain a tag with the `type` property set to `external` as described for component XML. The data described in this section is placed in a separate XML file with `releases` being its root node. The file must be installed as `/usr/share/metainfo/releases/%{cid}.releases.xml`, where `cid` is the component ID of the component the release information belongs to.

## Example data

Release information may look like this:

    <releases>
      <release version="1.2" date="2014-04-12" urgency="high">
        <description>
          <p>This stable release fixes bugs.</p>
        </description>

        <url>https://example.org/releases/version-1.2.html</url>

        <issues>
          <issue url="https://example.com/bugzilla/12345">bz#12345</issue>
          <issue type="cve">CVE-2019-123456</issue>
        </issues>

        <artifacts>
          <artifact type="binary" platform="x86_64-linux-gnu">
            <location>https://example.com/mytarball.bin.tar.xz</location>
            <checksum type="sha256">....</checksum>
            <checksum type="blake2b">....</checksum>
            <size type="download">12345678</size>
            <size type="installed">42424242</size>
          </artifact>
          <artifact type="binary" platform="x86_64-windows-msvc">
            <location>https://example.com/mytarball.bin.exe</location>
          </artifact>
          <artifact type="source">
            <location>https://example.com/mytarball.tar.xz</location>
            <checksum type="sha256">....</checksum>
          </artifact>
        </artifacts>
      </release>
      <release version="1.1" type="development" date="2013-10-20" />
      <release version="1.0" date="2012-08-26" />
    </releases>

## Releases tag specification

The `<releases>` tag contains `<release/>` children which contain metadata about individual releases of a component. Each release of the software component should ideally have a `<release/>` tag describing it, but at least one `release` child is recommended to be present for the current release of the software. The `release` children must be sorted in a latest-to-oldest order to simplify reading the metadata file.

A `release` tag can have the properties `version`, `date` and `timestamp`. The `date` property can have any time in ISO 8601 format as its value and should be present for every release. At least day-level granularity is required, which means that the ISO 8601 string must contain at least a full date (e.g. 2020-08-12). The `timestamp` tag contains the release time in the form of a UNIX epoch. This tag should not be used in metainfo files in newly written metadata, but will still be parsed in case it is present. The `timestamp` property is mainly used in generated distro-metadata. In case both release-time tags are present, the `timestamp` tag will take precedence over `date`.

The algorithm used for comparing release version numbers is described at .

A `release` tag may also have a `date_eol` property that denotes the date when the release stops to receive support from the software developers (end-of-life). Its value can be any complete date or time in ISO 8601.

Optionally, the `<release/>` tag may also have an `urgency` property, having one of the following values:

- `low`

- `medium`

- `high`

- `critical`

The `urgency` defines how important it is to install the new release as an update. This is especially important for `type=firmware` components. If no urgency is defined, a `medium` urgency is implicitly assumed. The urgency defines how the update will be presented to the user, and sometimes if it will be installed automatically and immediately, or delayed.

A `release` tag may have a `type` property to classify releases with one of the following values:

- `stable`

- `development`

- `snapshot`

By default, if no release type is defined, `stable` is assumed. A software displaying a listing of releases should only show stable releases and discard any development release if the current version is itself stable. It can show both `stable` and `development` versions when development versions of the software are also distributed. Instead, a `snapshot` release identifies an automated snapshot of the current development status. It should not be shown unless instructed to.

The `release` itself may have the following children:

<description/>

  A `description` tag contains a brief description of what is new in the release. The intended audience of the description are the users of the component (who are typically not developers), and so the description should mention only the user visible changes in the release. The `description` tag supports child tags as described in .

  Descriptions must not contain embedded web links to issue trackers or bug reports, as these typically make no sense to users. If particular issues need to be highlighted (for example, CVEs fixed in this release), they should be listed in the `issues` tag.

<url/>

  The `url` tag must point to a web location containing additional information (usually detailed release notes) about this particular release. The `url` tag may have a `type` property with `details` as the only currently allowed value. If the `type` is missing, a URL type of `details` is implicitly assumed.

<issues/>

  The `issues` tag contains `issue` children defining issues resolved by this release. It is used most commonly to mention CVE IDs. Software which is interpreting the release notes for the component should present the list of issues separately from the release description. They should not be thought of as a bullet-point list of issues which follow straight on in prose from the `description` element’s value.

  The value of an `issue` tag must be the bug number, ticket name, or CVE ID and is typically displayed to the user, but may also in case of CVE IDs be read by machines. The content of an `issue` element is not translatable, but can be a string appropriate for the project's bug tracker.

  The `issue` tag may have a `type` property, which should have a value of `generic` or `cve`. If the `type` property is missing, a type of `generic` is assumed.

  It may also have a `url` property, which should be a URL for a details page on the respective issue.

  If `type` is `cve`, the element’s value must be a CVE ID in the format defined by MITRE. For example, `CVE-2023-12345`. Software consuming the release data of a component should be able to append the element’s value to `https://nvd.nist.gov/vuln/detail/` to get a page of information about the CVE. If a `url` property is given, its value overrides any URL constructed from the CVE identifier. The `url` property is optional if `type` is `cve`.

  For example:

      <issue url="https://example.com/bugzilla/12345">bz#12345</issue>

  If `type` is `generic` or unspecified, the element’s value is a free-form issue identifier, and the `url` property must be specified. The issue identifier should be shorthand for an issue in the project’s bug tracker, and it does not have to be globally unique. It should be human readable, but does not have to be appropriate for non-technical audiences.

  For example:

      <issues>
        <issue type="cve">CVE-2021-28153</issue>
        <issue url="https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-27218">CVE-2021-27218</issue>
      </issues>

<artifacts/>

  The `artifacts` child tag contains information about downloadable release artifacts. It itself contains the artifacts as `artifact` children. Each artifact tag must have a `type` property with the value of either `binary` or `source` to indicate whether the artifact is the releases' source-code or a binary distribution.

  In case of a `binary` type, an optional `platform` property may also be set, containing a platform triplet (also known as normalized GNU triplet), such as `x86_64-linux-gnu`. Refer to Debian multiarch tuples for more information on normalized GNU triplets, and AppStream's platforms.yml for the triplet parts AppStream currently recognizes. Note that AppStream only supports strictly three-part triplets in the form of `arch-oskernel-osenvironment`. Parts of the triplets which do not apply can be replaced with `any`.

  Binary artifacts may also have a `bundle` property to indicate the bundling system the binary distribution is made for. Refer to the bundle types in for a list of possible values. Each `artifact` can have a number of children:

  location

    Each artifact must have a `location` child, denoting the web location (HTTP or HTTPS) where it can be downloaded from. Multiple location tags are allowed to make it possible to have mirror options to download the same artifact from.

  checksum

    At least one `checksum` child must be present to contain the checksum of the released artifact. The `<checksum/>` tag has a `type` attribute, containing the name of the hash function that was used to create it. Currently aupported values (and hash sums) are: `sha1`, `sha256`, `sha512`, `blake2b` and `blake3`. For most purposes (on 64-bit machines), using BLAKE2b via `cksum -ablake2b [FILE]` from GNU Coreutils is a good choice.

  size

    One or multiple `size` tags may also be present, which define the installed and download size of this component release artifact. The size type is defined via a `type` property on the `size` tag, and may assume the value `download` or `installed`. The size itself is set as the value and must be given in bytes.

  filename

    An artifact may have a `filename` child, containing a non-absolute filename that the artifact may be stored under. The file name is only a naming hint and applications are not required to follow it when downloading the file. If no `filename` tag is present, a file name may be generated from the artifact `location` URL. This tag must only appear once.

<tags/>

  The `tags` element can be used to tag releases with user-defined tags. It follows the same semantics as the one for components, as described in .