.. _west-release-notes:

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

v1.5.0
******

Major changes:

- Add support for auto-caching.
  Pass the ``--auto-cache <directory>`` argument to ``west update``.

Other changes:

- Allow combining ``--name-cache`` and ``--path-cache`` for ``west update``.

- Document default revision value in the manifest schema.

Bug fixes:

- Allow empty or missing manifest projects list.

- Make ``manifest.group-filter`` list order deterministic when freezing or resolving manifest files.

v1.4.0
******

Changes:

- Allow appending data to configuration strings.
  To append to a value for ``<name>``, type: ``west config -a <name> <value>``.

- Add ``--untracked`` argument option to ``west manifest``.
  Run ``west manifest --untracked`` in a workspace to print all files and
  directories that are not tracked or managed by west.

- Add ``--inactive`` argument option to ``west list`` to support printing inactive projects.

- Support ``--active-only`` argument option for the ``west manifest --resolve`` and
  ``west manifest --freeze`` commands.
  This allows freezing workspaces with active project or group filters.

API changes:

- ``west.manifest.Manifest`` methods ``as_dict()``, ``as_frozen_dict()``, ``as_yaml()`` and
  ``as_frozen_yaml()`` now have an optional ``active_only`` argument (defaults to ``False``)
  to return an object containing all projects or only the active ones.

v1.3.0
******

Major changes:

- Added support for :ref:`west-aliases` commands.

- Adopt the `pyproject TOML specification`_ for packaging.

.. _pyproject TOML specification:
   https://packaging.python.org/en/latest/specifications/pyproject-toml/

Other changes:

- Add cache support for submodules.

- Decode manifest files as UTF-8 by default.

- Pass unknown arguments for ``west diff`` and ``west status`` to underlying ``git`` commands.

- Added ``--manifest`` argument to ``west diff`` to allow comparing
  the current workspace to the manifest revisions.

- Environment variables can be used with west forall
  The following are defined:

  - ``WEST_PROJECT_NAME``
  - ``WEST_PROJECT_PATH``
  - ``WEST_PROJECT_ABSPATH``
  - ``WEST_PROJECT_REVISION``
  - ``WEST_PROJECT_URL``
  - ``WEST_PROJECT_REMOTE``

- Added support for early argument ``-q/--quiet`` to reduce verbosity.

- Added ``-o/--clone-opt`` argument to ``west init`` to pass to ``git clone``.

- Support Python 3.13 and drop support for Python 3.8.

- Prevent manifests from having projects in the ``.west`` directory.

- Add NTFS workarounds and ``--rename-delay`` for ``west init``.

- Print a stack trace when calling die in debug ``-vvv``.

Bug fixes:

- Use ``'backslashreplace'`` not to crash on malformed UTF from subprocess.

- Fix handling in ``west diff`` for repositories with merge conflicts.
  Additionally improve error printing and handle ``git diff`` return codes.

- Fix ``--freeze`` and ``--resolve`` for the ``west manifest`` command when git submodules are used.

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
