Adding Repositories to your Project
===================================

.. toctree::
   :hidden:

   create_repo
   private_repo
   upgrade_repo


What is a Repository
~~~~~~~~~~~~~~~~~~~~

A repository is a version-ed Mynewt project, which is a collection of
Mynewt packages organized in a specific way for redistribution.

What differentiates a repository from a Mynewt project is the presence
of a ``repository.yml`` file describing the repository. This will be
described below. For a basic understanding of repositories you may read
the :doc:`Newt Tool Guide <../../../../newt/index>` and :doc:`How to
create repos <create_repo>`.

**Note:** For the remainder of this document we'll use the term repo as
shorthand for a Mynewt repository.

Repos are useful because they are an organized way for the community to
share Mynewt packages and projects. In fact, the Mynewt-core is
distributed as a repo.

Why does Mynewt need additional repos?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Repos add functionality not included in the Mynewt core. New repos might
be created for several reasons.

-  **Expertise**. Individuals or organizations may have expertise that
   they want to share in the form of repos. For example a chip vendor
   may create a repo to hold the Mynewt support for their chips.
-  **Non-Core component**. Some components, although very useful to
   Mynewt users are not core to all Mynewt users. These are likely
   candidates to be held in different repos.
-  **Software licensing**. Some software have licenses that make them
   incompatible with the ASF (Apache Software Foundation) license
   policies. These may be valuable components to some Mynewt users, but
   cannot be contained in the ``apache-mynewt-core``.

What Repos are in my Project
~~~~~~~~~~~~~~~~~~~~~~~~~~~~

The list of repos used by your project are contained within the
``project.yml`` file. An example can be seen by creating a new project:

.. code-block:: console

    $ mkdir ~/dev
    $ cd ~/dev
    $ newt new myproj
    $ cd myproj

View the ``project.yml`` section and you will see a line describing the
repos:

.. code-block:: console

    project.repositories:
        - apache-Mynewt-core

By default, this newly created project uses a single repo called
``apache-Mynewt-core``.

If you wish to add additional repos, you would add additional lines to
the ``project.repositories`` variable like this.

.. code:: hl_lines="3"

    project.repositories:
        - apache-Mynewt-core
        - another_repo_named_x

Repo Descriptors
~~~~~~~~~~~~~~~~

In addition to the repo name, the ``project.yml`` file must also contain
a repo descriptor for each repository you include that gives ``newt``
information on obtaining the repo.

In the same ``myproj`` above you will see the following repo descriptor.

.. code-block:: console

    repository.apache-Mynewt-core:
        type: github
        vers: 1-latest
        user: apache
        repo: mynewt-core

A repo descriptor starts with ``repository.<name>.``. In this example,
the descriptor specifies the information for the ``apache-Mynewt-core``.

The fields within the descriptor have the following definitions:

-  **type** -- The type of code storage the repo uses. The current
   version of ``newt`` only supports github. Future versions may support
   generic git or other code storage mechanisms.

-  **vers** -- The version of the repo to use for your project. A source
   code repository contains many versions of the source. This field is
   used to specify the one to use for this project. See the section on
   versions below for a detailed description of the format of this
   field.

-  **user** -- The username for the repo. On github, this is the name
   after ``github.com`` in the repo path. Consider the repository
   ``https://github.com/apache/mynewt-core``. It has username
   ``apache``.

-  **repo** -- The name of the repo. On github, this is the name after
   the username described above. Consider the repository
   ``https://github.com/apache/mynewt-core``. It has path
   ``mynewt-core``. This is a path to the source control and should not
   be confused with the name of the repo that you used in the
   ``repository.<name>`` declaration above. That name is contained
   elsewhere within the repo. See Below.

Adding Existing Repos to my Project
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

To add a new repo to your project, you have to complete two steps.

-  Edit the ``project.yml`` file and add a new repo descriptor. The
   previous section includes information on the field required in your
   repo descriptor.

-  Edit the ``project/yml`` file and add a new line to the
   ``project.repositories`` variable with the name of the repo you are
   adding.

An example of a ``project.yml`` file with two repositories is shown
below:

.. code-block:: console

    project.name: "my_project"

    project.repositories:
        - apache-mynewt-core
        - mynewt_arduino_zero
        
    # Use github's distribution mechanism for core ASF libraries.
    # This provides mirroring automatically for us.
    #
    repository.apache-mynewt-core:
        type: github
        vers: 1-latest
        user: apache
        repo: mynewt-core
        
    # a special repo to hold hardware specific stuff for arduino zero
    repository.mynewt_arduino_zero:
        type: github
        vers: 1-latest
        user: runtimeco
        repo: mynewt_arduino_zero

What Version of the Repo to use
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Mynewt repos are version-ed artifacts. They are stored in source control
systems like github. The repo descriptor in your ``project.yml`` file
must specify the version of the repo you will accept into your project.

For now, we are at the beginnings of Mynewt. For testing and evaluation
please use ``1-latest`` in the ``vers`` field in your repo descriptor.

::

        vers:1-latest

See :doc:`Create a Repo <create_repo>` for a description of the versioning
system and all the possible ways to specify a version to use.

Identifying a Repo
~~~~~~~~~~~~~~~~~~

A repo contains Mynewt packages organized in a specific way and stored
in one of the supported code storage methods described above. In other
words, it is a Mynewt project with an additional file ``repository.yml``
which describes the repo for use by ``newt`` (and humans browsing them).
It contains a mapping of version numbers to the actual github branches
containing the source code.

Note that the ``repository.yml`` file lives only in the master branch of
the git repository. ``Newt`` will always fetch this file from the master
branch and then use that to determine the actual branch required
depending on the version specified in your ``project.yml`` file. Special
care should be taken to ensure that this file exists only in the master
branch.

Here is the ``repository.yml`` file from the apache-mynewt-core:

.. code-block:: console

    repo.name: apache-mynewt-core
    repo.versions:
        "0.0.0": "master"
        "0.0.1": "master"
        "0.7.9": "mynewt_0_8_0_b2_tag"
        "0.8.0": "mynewt_0_8_0_tag"
        "0.9.0": "mynewt_0_9_0_tag"
        "0.9.9": "mynewt_1_0_0_b1_tag"
        "0.9.99": "mynewt_1_0_0_b2_tag"
        "0.9.999": "mynewt_1_0_0_rc1_tag"
        "1.0.0": "mynewt_1_0_0_tag"

        "0-latest": "1.0.0"    # 1.0.0
        "0-dev": "0.0.0"       # master

        "0.8-latest": "0.8.0"
        "0.9-latest": "0.9.0"
        "1.0-latest": "1.0.0"  # 1.0.0

It contains the following:

-  **repo.name** The external name that is used to include the library
   in your ``project.yml`` file. This is the name you in include in the
   ``project.repositories`` variable when adding this repository to your
   project.
-  **repo.versions** A description of what versions to give the user
   depending on the settings in their ``project.yml`` file.

Repo Version
~~~~~~~~~~~~

The repo version number resolves to an actual git branch depending on
the mapping specified in ``repository.yml`` for that repo. The version
field argument in your ``project.yml`` file supports multiple formats
for flexibility:

.. code-block:: console

    <major_num>.<minor_num>.<revision_num>

or

.. code-block:: console

    <major_num>.<minor_num>-<stability string>

or

.. code-block:: console

    <major_num>-<stability string>

The stability string can be one of 3 pre-defined stability values.

1. stable -- A stable release version of the repository
2. dev -- A development version from the repository
3. latest -- The latest from the repository

In your ``project.yml`` file you can specify different combinations of
the version number and stability value. For example:

-  ``1-latest`` -- The latest version with major number 1
-  ``1.2-stable`` -- The latest stable version with major and minor
   number 1.2
-  ``1.2-dev`` -- The development version from 1.2
-  ``1.1.1`` -- a specific version 1.1.1

You cannot specify a stability string with a fully numbered version,
e.g.

.. code-block:: console

    1.2.8-stable

Repo Versions Available
~~~~~~~~~~~~~~~~~~~~~~~

A ``repository.yml`` file contains information to match a version
request into a git branch to fetch for your project.

It's up to the repository maintainer to map these to branches of the
repository. For example, let's say in a fictitious repository the
following are defined.

.. code-block:: console

    repo.versions:
        "0.8.0": "xxx_branch_0_8_0"
        "1.0.0": "xxx_branch_1_0_0"
        "1.0.2": "xxx_branch_1_0_2"
        "1.1.1": "xxx_branch_1_1_0"
        "1.1.2": "xxx_branch_1_1_2"
        "1.2.0": "xxx_branch_1_2_0"
        "1.2.1": "xxx_branch_1_2_1"
        "1.2-dev": "1.2.1"
        "1-dev": "1.2-dev"
        "1.2-stable": "1.2.0"
        "0-latest": "0.8.0"
        "1-latest": "1-dev"
        ....

When the ``project.yml`` file asks for ``1.2-stable`` it is resolved to
version ``1.2.0`` (perhaps ``1.2.1`` is not stable yet), which in turn
resolves to a specific branch ``xxx_branch_1_2_0``. This is the branch
that ``newt`` fetches into your project.

**Note:** Make sure a repo version exists in the ``repository.yml`` file
of a repo you wish to add. Otherwise Newt will not be able to resolve
the version and will fail to fetch the repo into your project.

How to find out what Repos are available for Mynewt components
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Currently, there is no ``newt`` command to locate/search Mynewt package
repositories. However, since the ``newt`` tool supports only github,
searching github by keyword is a satisfactory option until a search tool
is created.

When searching Github, recall that a Mynewt repository must have a
``repository.yml`` file in its root directory. If you don't see that
file, it's not a Mynewt repository and can't be included in your project
via the newt tool.

Once you find a repository, the Github URL and ``repository.yml`` file
should give you all the information to add it to your ``project.yml``
file.


