*********************
Repo Tool & Manifests
*********************
`repo tool`_ is a wrapper around the git version control system to manage
multiple git repositories, it simplifies several git operations, in particular
the *sync* (download) of software sources to a local environment.
To achieve this, repo uses a manifest file, which is a collection of
repositories with some attributes to specify for example the revision of a
particular repository or the local path that repository will have once
downloaded to our local environment.
Manifest File in Detail
=======================
A manifest file is written in Extensible Markup Language (XML), for a full list
of supported elements and attributes please see `repo manifest format`_.
Take the excerpt of an existing manifest file in Neoverse reference design
gitlab repository to understand how manifests are defined.
.. code-block:: xml
:linenos:
| Line #2, the element ``remote`` defines two attributes, ``fetch`` and
``name``.
| - **fetch** is the base url of a git repository.
| - **name** is an alias for that repository.
| Line #5, the element ``project`` also defines the attributes ``name``,
``path`` and ``revision``.
| - **name** is the name of the project in the git repository.
| - **path** is the local path where the project will be cloned to, relative
to where the manifest is initialised.
| - **revision** is the git revision to clone, this can be a *branch*, a *tag*
or a *commit sha id*.
A remote can have multiple repositories, the link from a remote to a project is
given by the alias set in line #2 and used in line #5 as ``remote="arm"``.
The ``revision`` attribute when set to *tag* or a *commit sha id* is what
makes the software stack being reproducible because it will fetch the same
software sources consistently. More details provided in the section
:ref:`Pinned vs Non-Pinned `.
Translating the syntax of a manifest file to git, the underlying command
of line #5 to run would be:
.. code-block:: shell
git clone --branch refs/tags/RD-INFRA-2023.12.22 https://git.gitlab.arm.com/infra-solutions/reference-design/platsw/scp-firmware ./scp
.. _pinned-vs-nonpinned:
Manifest (Pinned vs Non-Pinned)
===============================
Now that the user knows how a manifest file is defined, let's stablish the
concept of *Pinned* and *Non-Pinned* manifests.
When we release a software stack, we test the integration of all the components
and validate that they work together to achieve the goal of providing users
with a usable code base, thus we tag the manifest and the components to have a
reference of this code base validity. This is the *Pinned* manifest and the
file name convention is ``pinned-.xml``.
But as software evolves, new features and/or security fixes will be made
availble in the participating components of the software stack, therefore we
provide a manifest where the revision of the components is set to a branch that
is updated more frequently with their upstream counterparts. This is the
*Non-Pinned* manifest, and the file name simply is the platform name, i.e.:
``.xml``.
.. _repo tool: https://source.android.com/setup/develop/repo
.. _repo manifest format: https://gerrit.googlesource.com/git-repo/+/main/docs/manifest-format.md