.. _version_and_tag_generation:

Version and tag generation
==========================

For automatic version generation from Git project metadata, rpkg offers :ref:`git_version <git_version>`
family of macros that rely on Git tags (or at least the most recent one) having names of a certain structure,
that structure being:

::

    <name>-<version>-<release>

When ``git_version`` macro is being evaluated, it looks up name of the most recent tag that fits
the above pattern and from that tag name, it determines the current package version. Apart from
the latest tag name, also commit count from that latest tag and Git working tree "dirtiness" are taken
into account when generating the version string. See full details :ref:`here <git_version>`.

If you are creating a new tag with ``rpkg tag`` command, a similar procedure takes place but this
time, rpkg hints ``git_version`` macro that it should "bump" the version instead of generating it in
the usual manner and the macro will react by incrementing "follow" number in the latest tag's
`<version>` string and using that resulting version string as its output value (see again
:ref:`git_version <git_version>` for details and exact definition of the "follow" number).

When ``git_version`` and all the other rpkg macros in the input spec file template are evaluated and
the final rpm spec file is rendered, rpkg reads out resulting values of ``Name:``, ``Version:`` and ``Release:``
rpm fields from that spec file and uses those values to create a new tag named ``<name>-<version>-<release>``,
where ``<name>``, ``<version>``, and ``<release>`` are the individual discovered values for the fields.

Note that when spec file is evaluated to get the tag name, value of ``%{?dist}`` rpm macro is unset by rpkg so
that it never occurs in the resulting tag name. This macro is typically used in ``Release:`` rpm spec field.