.. _west-release-notes:

West Release Notes
##################

v1.2.0
******

Major changes:

- New ``west grep`` command for running a "grep tool" in your west workspace's
  repositories. Currently, ``git grep``, `ripgrep`_, and standard ``grep`` are
  supported grep tools.

  To run this command to get ``git grep foo`` results from all cloned,
  active repositories, run:

  .. code-block:: console

     west grep foo

  Here are some other examples for running different grep commands
  with ``west grep``:

  .. list-table::

     * - ``git grep --untracked``
       - ``west grep --untracked foo``
     * - ``ripgrep``
       - ``west grep --tool ripgrep foo``
     * - ``grep --recursive``
       - ``west grep --tool grep foo``

  To switch the default grep tool in your workspace, run the appropriate
  command in this table:

  .. list-table::

     * - ``ripgrep``
       - ``west config grep.tool ripgrep``
     * - ``grep``
       - ``west config grep.tool grep``

  For more details, run ``west help grep``.

Other changes:

- The manifest file format now supports a ``description`` field in each
  ``projects:`` element. See :ref:`west-manifests-projects` for examples.

- ``west list --format`` now accepts ``{description}`` in the format
  string, which prints the project's ``description:`` value.

- ``west compare`` now always prints information about
  :ref:`west-manifest-rev`.

Bug fixes:

- ``west init`` aborts if the destination directory already exists.

API changes:

- ``west.commands.WestCommand`` methods ``check_call()`` and
  ``check_output()`` now take any kwargs that can be passed on
  to the underlying subprocess function.

- ``west.commands.WestCommand.run_subprocess()``: new wrapper
  around ``subprocess.run()``. This could not be named ``run()``
  because ``WestCommand`` already had a method by this name.

- ``west.commands.WestCommand`` methods ``dbg()``, ``inf()``,
  ``wrn()``, and ``err()`` now all take an ``end`` kwarg, which
  is passed on to the call to ``print()``.

- ``west.manifest.Project`` now has a ``description`` attribute,
  which contains the parsed value of the ``description:`` field
  in the manifest data.

.. _ripgrep: https://github.com/BurntSushi/ripgrep#readme

v1.1.0
******

Major changes:

- ``west compare``: new command that compares the state of the
  workspace against the manifest.

- Support for a new ``manifest.project-filter`` configuration option.
  See :ref:`west-config-index` for details. The ``west manifest --freeze``
  and ``west manifest --resolve`` commands currently cannot be used when
  this option is set. This restriction can be removed in a later release.

- Project names which contain comma (``,``) or whitespace now generate
  warnings. These warnings are errors if the new ``manifest.project-filter``
  configuration option is set. The warnings may be promoted to errors in a
  future major version of west.

Other changes:

- ``west forall`` now takese a ``--group`` argument that can be used
  to restrict the command to only run in one or more groups. Run
  ``west help forall`` for details.

- All west commands will now output log messages from west API modules at
  warning level or higher. In addition, the ``--verbose`` argument to west
  can be used once to include informational messages, or twice to include
  debug messages, from all commands.

Bug fixes:

- Various improvements to error messages, debug logging, and error handling.

API changes:

- ``west.manifest.Manifest.is_active()`` now respects the
  ``manifest.project-filter`` configuration option's value.

v1.0.1
******

Major changes:

- Manifest schema version "1.0" is now available for use in this release. This
  is identical to the "0.13" schema version in terms of features, but can be
  used by applications that do not wish to use a "0.x" manifest "version:"
  field. See :ref:`west-manifest-schema-version` for details on this feature.

Bug fixes:

- West no longer exits with a successful error code when sent an
  interrupt signal. Instead, it exits with a platform-specific
  error code and signals to the calling environment that the
  process was interrupted.

v1.0.0
******

Major changes in this release:

- The :ref:`west-apis` are now declared stable. Any breaking changes will be
  communicated by a major version bump from v1.x.y to v2.x.y.

- West v1.0 no longer works with the Zephyr v1.14 LTS releases. This LTS has
  long been obsoleted by Zephyr v2.7 LTS. If you need to use Zephyr v1.14, you
  must use west v0.14 or earlier.

- Like the rest of Zephyr, west now requires Python v3.8 or later

- West commands no longer accept abbreviated command line arguments. For
  example, you must now specify ``west update --keep-descendants`` instead of
  using an abbreviation like ``west update --keep-d``. This is part of a change
  applied to all of Zephyr's Python scripts' command-line interfaces. The
  abbreviations were causing problems in practice when commands were updated to
  add new options with similar names but different behavior to existing ones.

Other changes:

- All built-in west functions have stopped using ``west.log``

- ``west update``: new ``--submodule-init-config`` option.
  See commit `9ba92b05`_ for details.

Bug fixes:

- West extension commands that failed to load properly sometimes dumped stack.
  This has been fixed and west now prints a sensible error message in this case.

- ``west config`` now fails on malformed configuration option arguments
  which lack a ``.`` in the option name

API changes:

- The west package now contains the metadata files necessary for some static
  analyzers (such as `mypy`_) to auto-detect its type annotations.
  See commit `d9f00e24`_ for details.

- the deprecated ``west.build`` module used for Zephyr v1.14 LTS compatibility was
  removed

- the deprecated ``west.cmake`` module used for Zephyr v1.14 LTS compatibility was
  removed

- the ``west.log`` module is now deprecated. This module uses global state,
  which can make it awkward to use it as an API which multiple different python
  modules may rely on.

- The :ref:`west-apis-commands` module got some new APIs which lay groundwork
  for a future change to add a global verbosity control to a command's output,
  and work to remove global state from the ``west`` package's API:

  - New ``west.commands.WestCommand.__init__()`` keyword argument: ``verbosity``
  - New ``west.commands.WestCommand`` property: ``color_ui``
  - New ``west.commands.WestCommand`` methods, which should be used to print output
    from extension commands instead of writing directly to sys.stdout or
    sys.stderr: ``inf()``, ``wrn()``, ``err()``, ``die()``, ``banner()``,
    ``small_banner()``
  - New ``west.commands.VERBOSITY`` enum

.. _9ba92b05: https://github.com/zephyrproject-rtos/west/commit/9ba92b054500d75518ff4c4646590bfe134db523
.. _d9f00e24: https://github.com/zephyrproject-rtos/west/commit/d9f00e242b8cb297b56e941982adf231281c6bae
.. _mypy: https://www.mypy-lang.org/

v0.14.0
*******

Bug fixes:

- West commands that were run with a bad local configuration file dumped stack
  in a confusing way. This has been fixed and west now prints a sensible error
  message in this case.

- A bug in the way west looks for the zephyr repository was fixed. The bug
  itself usually appeared when running an extension command like ``west build``
  in a new workspace for the first time; this used to fail (just for the first
  time, not on subsequent command invocations) unless you ran the command in
  the workspace's top level directory.

- West now prints sensible error messages when the user lacks permission to
  open the manifest file instead of dumping stack traces.

API changes:

- The ``west.manifest.MalformedConfig`` exception type has been moved to the
  ``west.configuration`` module

- The ``west.manifest.MalformedConfig`` exception type has been moved to the
  :ref:`west.configuration <west-apis-configuration>` module

- The ``west.configuration.Configuration`` class now raises ``MalformedConfig``
  instead of ``RuntimeError`` in some cases

v0.13.1
*******

Bug fix:

- When calling west.manifest.Manifest.from_file() when outside of a
  workspace, west again falls back on the ZEPHYR_BASE environment
  variable to locate the workspace.

v0.13.0
*******

New features:

- You can now associate arbitrary user data with the manifest repository
  itself in the ``manifest: self: userdata:`` value, like so:

  .. code-block:: YAML

     manifest:
       self:
         userdata: <any YAML value can go here>

Bug fixes:

- The path to the manifest repository reported by west could be incorrect in
  certain circumstances detailed in [issue
  #572](https://github.com/zephyrproject-rtos/west/issues/572). This has been
  fixed as part of a larger overhaul of path handling support in the
  ``west.manifest`` API module.

- The ``west.Manifest.ManifestProject.__repr__`` return value was fixed

:ref:`API <west-apis>` changes:

- ``west.configuration.Configuration``: new object-oriented interface to the
  current configuration. This reflects the system, global, and workspace-local
  configuration values, and allows you to read, write, and delete configuration
  options from any or all of these locations.

- ``west.commands.WestCommand``:

  - ``config``: new attribute, returns a ``Configuration`` object or aborts the
    program if none is set. This is always usable from within extension command
    ``do_run()`` implementations.
  - ``has_config``: new boolean attribute, which is ``True`` if and only if
    reading ``self.config`` will abort the program.

- The path handling in the ``west.manifest`` package has been overhauled in a
  backwards-incompatible way. For more details, see commit
  [56cfe8d1d1](https://github.com/zephyrproject-rtos/west/commit/56cfe8d1d1f3c9b45de3e793c738acd62db52aca).

- ``west.manifest.Manifest.validate()``: this now returns the validated data as
  a Python dict. This can be useful if the value passed to this function was a
  str, and the dict is desired.

- ``west.manifest.Manifest``: new:

  - path attributes ``abspath``, ``posixpath``, ``relative_path``,
    ``yaml_path``, ``repo_path``, ``repo_posixpath``
  - ``userdata`` attribute, which contains the parsed value
    from ``manifest: self: userdata:``, or is None
  - ``from_topdir()`` factory method

- ``west.manifest.ManifestProject``: new ``userdata`` attribute, which also
  contains the parsed value from ``manifest: self: userdata:``, or is None

- ``west.manifest.ManifestImportFailed``: the constructor can now take any
  value; this can be used to reflect failed imports from a :ref:`map
  <west-manifest-import-map>` or other compound value.

- Deprecated configuration APIs:

  The following APIs are now deprecated in favor of using a ``Configuration``
  object. Usually this will be done via ``self.config`` from a ``WestCommand``
  instance, but this can be done directly by instantiating a ``Configuration``
  object for other usages.

  - ``west.configuration.config``
  - ``west.configuration.read_config``
  - ``west.configuration.update_config``
  - ``west.configuration.delete_config``

v0.12.0
*******

New features:

- West now works on the `MSYS2 <https://www.msys2.org/>`_ platform.

- West manifest files can now contain arbitrary user data associated with each
  project. See :ref:`west-project-userdata` for details.

Bug fixes:

- The ``west list`` command's ``{sha}`` format key has been fixed for
  the manifest repository; it now prints ``N/A`` ("not applicable")
  as expected.

:ref:`API <west-apis>` changes:

- The ``west.manifest.Project.userdata`` attribute was added to support
  project user data.

v0.11.1
*******

New features:

- ``west status`` now only prints output for projects which have a nonempty
  status.

Bug fixes:

- The manifest file parser was incorrectly allowing project names which contain
  the path separator characters ``/`` and ``\``. These invalid characters are
  now rejected.

  Note: if you need to place a project within a subdirectory of the workspace
  topdir, use the ``path:`` key. If you need to customize a project's fetch URL
  relative to its remote ``url-base:``, use ``repo-path:``. See
  :ref:`west-manifests-projects` for examples.

- The changes made in west v0.10.1 to the ``west init --manifest-rev`` option
  which selected the default branch name were leaving the manifest repository
  in a detached HEAD state. This has been fixed by using ``git clone`` internally
  instead of ``git init`` and ``git fetch``. See `issue #522`_ for details.

- The ``WEST_CONFIG_LOCAL`` environment variable now correctly
  overrides the default location, :file:`<workspace topdir>/.west/config`.

- ``west update --fetch=smart`` (``smart`` is the default) now correctly skips
  fetches for project revisions which are `lightweight tags`_ (it already
  worked correctly for annotated tags; only lightweight tags were unnecessarily
  fetched).

Other changes:

- The fix for issue #522 mentioned above introduces a new restriction. The
  ``west init --manifest-rev`` option value, if given, must now be either a
  branch or a tag. In particular, "pseudo-branches" like GitHub's
  ``pull/1234/head`` references which could previously be used to fetch a pull
  request can no longer be passed to ``--manifest-rev``. Users must now fetch
  and check out such revisions manually after running ``west init``.

:ref:`API <west-apis>` changes:

- ``west.manifest.Manifest.get_projects()`` avoids incorrect results in
  some edge cases described in `issue #523`_.

- ``west.manifest.Project.sha()`` now works correctly for tag revisions.
  (This applies to both lightweight and annotated tags.)

.. _lightweight tags: https://git-scm.com/book/en/v2/Git-Basics-Tagging
.. _issue #522: https://github.com/zephyrproject-rtos/west/issues/522
.. _issue #523: https://github.com/zephyrproject-rtos/west/issues/523

v0.11.0
*******

New features:

- ``west update`` now supports ``--narrow``, ``--name-cache``, and
  ``--path-cache`` options. These can be influenced by the ``update.narrow``,
  ``update.name-cache``, and ``update.path-cache`` :ref:`west-config` options.
  These can be used to optimize the speed of the update.
- ``west update`` now supports a ``--fetch-opt`` option that will be passed to
  the ``git fetch`` command used to fetch remote revisions when updating each
  project.

Bug fixes:

- ``west update`` now synchronizes Git submodules in projects by default. This
  avoids issues if the URL changes in the manifest file from when the submodule
  was first initialized. This behavior can be disabled by setting the
  ``update.sync-submodules`` configuration option to ``false``.

Other changes:

- the :ref:`west-apis-manifest` module has fixed docstrings for the Project
  class

v0.10.1
*******

New features:

- The :ref:`west-init` command's ``--manifest-rev`` (``--mr``) option no longer
  defaults to ``master``. Instead, the command will query the repository for
  its default branch name and use that instead. This allows users to move from
  ``master`` to ``main`` without breaking scripts that do not provide this
  option.

.. _west_0_10_0:

v0.10.0
*******

New features:

- The ``name`` key in a project's :ref:`submodules list
  <west-manifest-submodules>` is now optional.

Bug fixes:

- West now checks that the manifest schema version is one of the explicitly
  allowed values documented in :ref:`west-manifest-schema-version`. The old
  behavior was just to check that the schema version was newer than the west
  version where the ``manifest: version:`` key was introduced. This incorrectly
  allowed invalid schema versions, like ``0.8.2``.

Other changes:

- A manifest file's ``group-filter`` is now propagated through an ``import``.
  This is a change from how west v0.9.x handled this. In west v0.9.x, only the
  top level manifest file's ``group-filter`` had any effect; the group filter
  lists from any imported manifests were ignored.

  Starting with west v0.10.0, the group filter lists from imported manifests
  are also imported. For details, see :ref:`west-group-filter-imports`.

  The new behavior will take effect if ``manifest: version:`` is not given or
  is at least ``0.10``. The old behavior is still available in the top level
  manifest file only with an explicit ``manifest: version: 0.9``. See
  :ref:`west-manifest-schema-version` for more information on schema versions.

  See `west pull request #482
  <https://github.com/zephyrproject-rtos/west/pull/482>`_ for the motivation
  for this change and additional context.

v0.9.1
******

Bug fixes:

- Commands like ``west manifest --resolve`` now correctly include group and
  group filter information.

Other changes:

- West now warns if you combine ``import`` with ``group-filter``. Semantics for
  this combination have changed starting with v0.10.x. See the v0.10.0 release
  notes above for more information.

.. _west_0_9_0:

v0.9.0
******

.. warning::

   The ``west config`` fix described below comes at a cost: any comments or
   other manual edits in configuration files will be removed when setting a
   configuration option via that command or the ``west.configuration`` API.

.. warning::

   Combining the ``group-filter`` feature introduced in this release with
   manifest imports is discouraged. The resulting behavior has changed in west
   v0.10.

New features:

- West manifests now support :ref:`west-manifest-submodules`. This allows you
  to clone `Git submodules
  <https://git-scm.com/book/en/v2/Git-Tools-Submodules>`_ into a west project
  repository in addition to the project repository itself.

- West manifests now support :ref:`west-manifest-groups`. Project groups can be
  enabled and disabled to determine what projects are "active", and therefore
  will be acted upon by the following commands: ``west update``, ``west list``,
  ``west diff``, ``west status``, ``west forall``.

- ``west update`` no longer updates inactive projects by default. It now
  supports a ``--group-filter`` option which allows for one-time modifications
  to the set of enabled and disabled project groups.

- Running ``west list``, ``west diff``, ``west status``, or ``west forall``
  with no arguments does not print information for inactive projects by
  default. If the user specifies a list of projects explicitly at the command
  line, output for them is included regardless of whether they are active.

  These commands also now support ``--all`` arguments to include all
  projects, even inactive ones.

- ``west list`` now supports a ``{groups}`` format string key in its
  ``--format`` argument.

Bug fixes:

- The ``west config`` command and ``west.configuration`` API did not correctly
  store some configuration values, such as strings which contain commas. This
  has been fixed; see `commit 36f3f91e
  <https://github.com/zephyrproject-rtos/west/commit/36f3f91e270782fb05f6da13800f433a9c48f130>`_
  for details.

- A manifest file with an empty ``manifest: self: path:`` value is invalid, but
  west used to let it pass silently. West now rejects such manifests.

- A bug affecting the behavior of the ``west init -l .`` command was fixed; see
  `issue #435 <https://github.com/zephyrproject-rtos/west/issues/435>`_.

:ref:`API <west-apis>` changes:

- added ``west.manifest.Manifest.is_active()``
- added ``west.manifest.Manifest.group_filter``
- added ``submodules`` attribute to ``west.manifest.Project``, which has
  newly added type ``west.manifest.Submodule``

Other changes:

- The :ref:`west-manifest-import` feature now supports the terms ``allowlist``
  and ``blocklist`` instead of ``whitelist`` and ``blacklist``, respectively.

  The old terms are still supported for compatibility, but the documentation
  has been updated to use the new ones exclusively.

v0.8.0
******

This is a feature release which changes the manifest schema by adding support
for a ``path-prefix:`` key in an ``import:`` mapping, along with some other
features and fixes.

- Manifest import mappings now support a ``path-prefix:`` key, which places
  the project and its imported repositories in a subdirectory of the workspace.
  See :ref:`west-manifest-ex3.4` for an example.
- The west command line application can now also be run using ``python3 -m
  west``. This makes it easier to run west under a particular Python
  interpreter without modifying the :envvar:`PATH` environment variable.
- :ref:`west manifest --path <west-manifest-path>` prints the absolute path to
  west.yml
- ``west init`` now supports an ``--mf foo.yml`` option, which initializes the
  workspace using :file:`foo.yml` instead of :file:`west.yml`.
- ``west list`` now prints the manifest repository's path using the
  ``manifest.path`` :ref:`configuration option <west-config>`, which may differ
  from the ``self: path:`` value in the manifest data. The old behavior is
  still available, but requires passing a new ``--manifest-path-from-yaml``
  option.
- Various Python API changes; see :ref:`west-apis` for details.

v0.7.3
******

This is a bugfix release.

- Fix an error where a failed import could leave the workspace in an unusable
  state (see [PR #415](https://github.com/zephyrproject-rtos/west/pull/415) for
  details)

v0.7.2
******

This is a bugfix and minor feature release.

- Filter out duplicate extension commands brought in by manifest imports
- Fix ``west.Manifest.get_projects()`` when finding the manifest repository by
  path

v0.7.1
******

This is a bugfix and minor feature release.

- ``west update --stats`` now prints timing for operations which invoke a
  subprocess, time spent in west's Python process for each project, and total
  time updating each project.
- ``west topdir`` always prints a POSIX style path
- minor console output changes

v0.7.0
******

The main user-visible feature in west 0.7 is the :ref:`west-manifest-import`
feature. This allows users to load west manifest data from multiple different
files, resolving the results into a single logical manifest.

Additional user-visible changes:

- The idea of a "west installation" has been renamed to "west workspace" in
  this documentation and in the west API documentation. The new term seems to
  be easier for most people to work with than the old one.
- West manifests now support a :ref:`schema version
  <west-manifest-schema-version>`.
- The "west config" command can now be run outside of a workspace, e.g.
  to run ``west config --global section.key value`` to set a configuration
  option's value globally.
- There is a new :ref:`west topdir <west-built-in-misc>` command, which
  prints the root directory of the current west workspace.
- The ``west -vv init`` command now prints the git operations being performed,
  and their results.
- The restriction that no project can be named "manifest" is now enforced; the
  name "manifest" is reserved for the manifest repository, and is usable as
  such in commands like ``west list manifest``, instead of ``west list
  path-to-manifest-repository`` being the only way to say that
- It's no longer an error if there is no project named "zephyr". This is
  part of an effort to make west generally usable for non-Zephyr use cases.
- Various bug fixes.

The developer-visible changes to the :ref:`west-apis` are:

- west.build and west.cmake: deprecated; this is Zephyr-specific functionality
  and should never have been part of west. Since Zephyr v1.14 LTS relies on it,
  it will continue to be included in the distribution, but will be removed
  when that version of Zephyr is obsoleted.
- west.commands:

  - WestCommand.requires_installation: deprecated; use requires_workspace instead
  - WestCommand.requires_workspace: new
  - WestCommand.has_manifest: new
  - WestCommand.manifest: this is now settable
- west.configuration: callers can now identify the workspace directory
  when reading and writing configuration files
- west.log:

  - msg(): new
- west.manifest:

  - The module now uses the standard logging module instead of west.log
  - QUAL_REFS_WEST: new
  - SCHEMA_VERSION: new
  - Defaults: removed
  - Manifest.as_dict(): new
  - Manifest.as_frozen_yaml(): new
  - Manifest.as_yaml(): new
  - Manifest.from_file() and from_data(): these factory methods are more
    flexible to use and less reliant on global state
  - Manifest.validate(): new
  - ManifestImportFailed: new
  - ManifestProject: semi-deprecated and will likely be removed later.
  - Project: the constructor now takes a topdir argument
  - Project.format() and its callers are removed. Use f-strings instead.
  - Project.name_and_path: new
  - Project.remote_name: new
  - Project.sha() now captures stderr
  - Remote: removed

West now requires Python 3.6 or later. Additionally, some features may rely on
Python dictionaries being insertion-ordered; this is only an implementation
detail in CPython 3.6, but it is part of the language specification as of
Python 3.7.

v0.6.3
******

This point release fixes an error in the behavior of the deprecated
``west.cmake`` module.

v0.6.2
******

This point release fixes an error in the behavior of ``west
update --fetch=smart``, introduced in v0.6.1.

All v0.6.1 users must upgrade.

v0.6.1
******

.. warning::

   Do not use this point release. Make sure to use v0.6.2 instead.

The user-visible features in this point release are:

- The :ref:`west-update` command has a new ``--fetch``
  command line flag and ``update.fetch`` :ref:`configuration option
  <west-config>`. The default value, "smart", skips fetching SHAs and tags
  which are available locally.
- Better and more consistent error-handling in the ``west diff``, ``west
  status``, ``west forall``, and ``west update`` commands. Each of these
  commands can operate on multiple projects; if a subprocess related to one
  project fails, these commands now continue to operate on the rest of the
  projects. All of them also now report a nonzero error code from the west
  process if any of these subprocesses fails (this was previously not true of
  ``west forall`` in particular).
- The :ref:`west manifest <west-built-in-misc>` command also handles errors
  better.
- The :ref:`west list <west-built-in-misc>` command now works even when the
  projects are not cloned, as long as its format string only requires
  information which can be read from the manifest file. It still fails if the
  format string requires data stored in the project repository, e.g. if it
  includes the ``{sha}`` format string key.
- Commands and options which operate on git revisions now accept abbreviated
  SHAs. For example, ``west init --mr SHA_PREFIX`` now works. Previously, the
  ``--mr`` argument needed to be the entire 40 character SHA if it wasn't a
  branch or a tag.

The developer-visible changes to the :ref:`west-apis` are:

- west.log.banner(): new
- west.log.small_banner(): new
- west.manifest.Manifest.get_projects(): new
- west.manifest.Project.is_cloned(): new
- west.commands.WestCommand instances can now access the parsed
  Manifest object via a new self.manifest property during the
  do_run() call. If read, it returns the Manifest object or
  aborts the command if it could not be parsed.
- west.manifest.Project.git() now has a capture_stderr kwarg


v0.6.0
******

- No separate bootstrapper

  In west v0.5.x, the program was split into two components, a bootstrapper and
  a per-installation clone. See `Multiple Repository Management in the v1.14
  documentation`_ for more details.

  This is similar to how Google's Repo tool works, and lets west iterate quickly
  at first. It caused confusion, however, and west is now stable enough to be
  distributed entirely as one piece via PyPI.

  From v0.6.x onwards, all of the core west commands and helper classes are
  part of the west package distributed via PyPI. This eliminates complexity
  and makes it possible to import west modules from anywhere in the system,
  not just extension commands.
- The ``selfupdate`` command still exists for backwards compatibility, but
  now simply exits after printing an error message.
- Manifest syntax changes

  - A west manifest file's ``projects`` elements can now specify their fetch
    URLs directly, like so:

    .. code-block:: yaml

       manifest:
         projects:
           - name: example-project-name
             url: https://github.com/example/example-project

    Project elements with ``url`` attributes set in this way may not also have
    ``remote`` attributes.
  - Project names must be unique: this restriction is needed to support future
    work, but was not possible in west v0.5.x because distinct projects may
    have URLs with the same final pathname component, like so:

    .. code-block:: yaml

       manifest:
         remotes:
           - name: remote-1
             url-base: https://github.com/remote-1
           - name: remote-2
             url-base: https://github.com/remote-2
         projects:
           - name: project
             remote: remote-1
             path: remote-1-project
           - name: project
             remote: remote-2
             path: remote-2-project

    These manifests can now be written with projects that use ``url``
    instead of ``remote``, like so:

    .. code-block:: yaml

       manifest:
         projects:
           - name: remote-1-project
             url: https://github.com/remote-1/project
           - name: remote-2-project
             url: https://github.com/remote-2/project

- The ``west list`` command now supports a ``{sha}`` format string key

- The default format string for ``west list`` was changed to ``"{name:12}
  {path:28} {revision:40} {url}"``.

- The command ``west manifest --validate`` can now be run to load and validate
  the current manifest file, among other error-handling fixes related to
  manifest parsing.

- Incompatible API changes were made to west's APIs. Further changes are
  expected until API stability is declared in west v1.0.

  - The ``west.manifest.Project`` constructor's ``remote`` and ``defaults``
    positional arguments are now kwargs. A new ``url`` kwarg was also added; if
    given, the ``Project`` URL is set to that value, and the ``remote`` kwarg
    is ignored.

  - ``west.manifest.MANIFEST_SECTIONS`` was removed. There is only one section
    now, namely ``manifest``. The *sections* kwargs in the
    ``west.manifest.Manifest`` factory methods and constructor were also
    removed.

  - The ``west.manifest.SpecialProject`` class was removed. Use
    ``west.manifest.ManifestProject`` instead.


v0.5.x
******

West v0.5.x is the first version used widely by the Zephyr Project as part of
its v1.14 Long-Term Support (LTS) release. The `west v0.5.x documentation`_ is
available as part of the Zephyr's v1.14 documentation.

West's main features in v0.5.x are:

- Multiple repository management using Git repositories, including self-update
  of west itself
- Hierarchical configuration files
- Extension commands

Versions Before v0.5.x
**********************

Tags in the west repository before v0.5.x are prototypes which are of
historical interest only.

.. _Multiple Repository Management in the v1.14 documentation:
   https://docs.zephyrproject.org/1.14.0/guides/west/repo-tool.html

.. _west v0.5.x documentation:
   https://docs.zephyrproject.org/1.14.0/guides/west/index.html
