=================
buildstream 1.6.2
=================

  o Fix some issues with a previous fix for #532

  o Ported to github CI infrastructure

  o Ensure paths specified in user configuration are absolute

  o Import some symbols from collections.abc, required for python 3.10

=================
buildstream 1.6.1
=================

  o Fix failure handling with CAS (#1403)

=================
buildstream 1.6.0
=================

  o Fixed edge case issue when dealing with git remotes (#1372)

=================
buildstream 1.5.1
=================

  o Support `buildstream1.conf` as well as `buildstream.conf` for
    parallel installations.

  o Lazy resolution of variables, this allows junctions to use variables
    without requiring the project to have fully resolved variables, while
    still reporting the right error messages if a junction uses unresolved
    variables.

  o Fix an issue where conditional statements were being lost instead of
    processed at include time, only when the include happens in project.conf

  o Backport some artifact cache related structural changes, and allow
    BuildStream 1 clients to interface with BuildStream 2 remote asset
    caches, while still allowing BuildStream 1 to interface with its own
    bst-artifact-server implementation.

  o Added sandbox configuration for `os` and `architecture` to mirror
    the added options in BuildStream 2, fixing issue #523.

=================
buildstream 1.5.0
=================

  o Process options in included files in the context of the project they
    were included from.

    This is technically a breaking change, however it is highly unlikely
    that this will break projects. In some cases projects were working around
    the broken behavior by ensuring matching project option names in junctioned
    projects, and in other cases simply avoiding including files which have
    project option conditional statements.

  o Added errors when trying to load BuildStream 2 projects, recommending to
    install the appropriate BuildStream version for the project.

  o Added errors when loading BuildStream 2 plugins in a BuildStream 1
    project, recommending to use BuildStream 1 plugins with BuildStream 1 projects.

=================
buildstream 1.4.3
=================

  o Fix support for conditional list append/prepend in project.conf,
    Merge request !1857

  o Fix internal imports to import from "collections" instead
    of "collections.abc", this improves support for Python 3.8,
    see issue #831

  o Fix some downloads from gitlab.com by setting custom user agent,
    fixes issue #1285

  o Work around python API break from ostree's repo.remote_gpg_import(),
    this was changed in ostree commit v2019.2-10-gaa5df899, and we now
    have a fallback to support both versions of the API, see merge request !1917.

=================
buildstream 1.4.2
=================

  o Support for python 3.8

  o Fix a stacktrace with a hang we can experience when we CTRL-C a job twice.

  o Workaround some servers which do not honor the 'If-None-Match' HTTP header
    and avoid downloading files redundantly in these cases.

  o Allow specifying absolute paths in overlap-whitelist (issue #721)

  o Support systems with fuse3 (avoid passing unsupported argument
    to fusermount3)

=================
buildstream 1.4.1
=================

  o Depend on a newer version of ruamel.yaml (>= 0.16).

=================
buildstream 1.4.0
=================

  o Elements may now specify 'build-depends' and 'runtime-depends' fields
    to avoid having to specify the dependency type for every entry in
    'depends'.

  o Elements may now specify cross-junction dependencies as simple strings
    using the format '{junction-name}:{element-name}'.

  o New `fatal-warnings` has been added to the project.conf format, allowing
    projects to specify which warnings they want to consider as fatal.

    Support for the following warnings is included:

      o overlaps: When staged artifact files overlap
                  (deprecates: 'fail-on-overlap')

      o ref-not-in-track: When the source implementation finds that
                          the ref is out of bounds for the tracking config

      o git:inconsistent-submodule: A .gitmodules file is present but the
                                    submodule was never added to the repo.

      o git:unlisted-submodule: A submodule exists but is not specified
                                in the YAML declaration.

      o git:invalid-submodule: A submodule is specified in the YAML
                               declaration but does not exist at the
			       given ref in the git repository.

  o BuildStream now depends on python3 ujson (for some internal serializations)

  o Workspaces can now be opened as relative paths.

    Existing open workspaces will not be converted to relative paths,
    (they need to be closed and opened again to get the new behavior).

  o Dependencies can now be specified as strict to force rebuild in
    non-strict mode. This is useful for statically linked dependencies
    (#254).

  o Git source plugins can optionally track human readable refs using
    the output of `git describe`.

=================
buildstream 1.3.1
=================

  o The `max-jobs` variable is now controllable in user configuration
    and on the command line.

  o Source plugins may now request access access to previous during track and
    fetch by setting `BST_REQUIRES_PREVIOUS_SOURCES_TRACK` and/or
    `BST_REQUIRES_PREVIOUS_SOURCES_FETCH` attributes.

  o Add new `pip` source plugin for downloading python packages using pip,
    based on requirements files from previous sources.

=================
buildstream 1.2.8
=================

  o Fixed issues with workspaced junctions which need fetches (#1030)

  o Bail out with informative error if stdout/stderr are O_NONBLOCK (#929)

=================
buildstream 1.2.7
=================

  o Improved messaging around unknown artifact cache keys (#981)

  o Fixed crash which occurs when deleting artifact cache with
    open workspaces (#1017)

  o Fixed `bst --no-strict build --track-all ...` which sometimes
    exited successfully without building anything (#1014)

  o Fixed incorrect error message with malformed YAML in project.conf (#1019)

=================
buildstream 1.2.6
=================

  o Fix 'quit' option when interrupting a build (#525)

  o Only queue one cache size calculation job at a time

  o Fix stack traces on forceful termination

  o Fix scheduler processing order regression (#712)

  o Fix race condition in bzr source plugin

  o Better error messages for insufficient disk space

  o UI/Logging improvements regarding cache quota usage

  o Fix `bst push` in non-strict mode (#990)

  o Fix crash (regression) when tracking a single element (#1012)

=================
buildstream 1.2.5
=================

  o Fixed failure to process some elements when workspaces are open (#919)

  o Better error reporting when files are missing, or when encountering
    errors in sub projects (#947)

  o Do not require exact versions of dependencies for running tests (#916)

  o Fail on overlap policy no longer inherited from subprojects (#926)

=================
buildstream 1.2.4
=================

  o Migration of scripts to use tox

  o Force updating tags when fetching from git repos (#812)

  o Avoid downloading unused submodules (#804)

  o Fixed cleanup of cache server with disk is full (#609)

  o Fixed possible artifact cache corruption (#749)

  o Fixed `bst checkout --deps none` behavior (#670)

=================
buildstream 1.2.3
=================

 o Fixed an unhandled exception when cleaning up a build sandbox (#153)

 o Fixed race condition when calculating cache size and commiting artifacts

 o Fixed regression where terminating with `^C` results in a double user interrogation (#693)

 o Fixed regression in summary when builds are terminated (#479)

 o Fixed regression where irrelevant status messages appear from git sources

 o Improve performance of artifact uploads by batching file transfers (#676/#677)

 o Fixed performance of artifact downloads by batching file transfers (#554)

 o Fixed checks for paths which escape the project directory (#673)

=================
buildstream 1.2.2
=================

 * Fixed incomplete removal of blessings dependency

=================
buildstream 1.2.1
=================

  o Fixed corruption of artifact cache at cache cleanup time (#623)

  o Fixed accidental deletion of artifacts when tracking is enabled

  o Error out when protected variables are set by project authors (#287)

  o Fixed option resolution in project wide element & source configurations (#658)

  o Error out gracefully when push remote is mal-specified (#625)

  o Improved logging regarding skipped push / pull jobs (#515)

  o Fixed crash in `bst fetch` when project.refs and source mirroring are in use (#666)

  o Removed blessings dependency

  o Support for batch file downloads on the artifact cache server

=================
buildstream 1.2.0
=================

  o Various last minute bug fixes

  o Final update to the SourceFetcher related mirroring APIs

=================
buildstream 1.1.7
=================

  o Fix CAS resource_name format

    Artifact servers need to be updated.

  o Improved startup performance and performance of
    calculating artifact cache size

  o Various other bug fixes


=================
buildstream 1.1.6
=================

  o A lot of bug fixes


=================
buildstream 1.1.5
=================

  o Add a `--tar` option to `bst checkout` which allows a tarball to be
    created from the artifact contents.

  o Fetching and tracking will consult mirrors defined in project config,
    and the preferred mirror to fetch from can be defined in the command
    line or user config.

  o Added new `remote` source plugin for downloading file blobs

  o Add support for the new include '(@)' directive in project.conf and .bst files

=================
buildstream 1.1.4
=================

  o `bst workspace` commands and `bst track` will substitute their
    source elements when performing those operations, e.g. performing
    `bst track` on a filter element will track the sources on the
    element that it depends on (if it has sources).

  o Added new simple `make` element

  o Switch to Remote Execution CAS-based artifact cache on all platforms.

    Artifact servers need to be migrated.

  o BuildStream now requires python version >= 3.5

  o BuildStream will now automatically clean up old artifacts when it
    runs out of space. The exact behavior is configurable in the user's
    buildstream.conf.


=================
buildstream 1.1.3
=================

  o Added new `bst init` command to initialize a new project.

  o Cross junction tracking is now disabled by default for projects
    which can support this by using project.refs ref-storage

    New options have been added to explicitly enable cross-junction
    tracking.

  o Failed jobs are now summarised at the end of a build.

    Use `--verbose` and `--no-verbose` to adjust the amount of detail given.

  o BuildElements' `configure-commands` are only run once for
    workspaces now, which allows for incremental builds.

    Appropriate API for plugins is also exposed through
    `Element.prepare`.

  o The `cmake` plugin now supports building with ninja with the
    newly added `generator` configuration option.

  o `bst workspace close` and `bst workspace reset` now support multiple
    elements. All elements can be specified using `--all`.

  o The elements whose cache keys had to be determined during the build
    are summarised at the end of the build.

  o Fixed versioning introspection to be dynamic, many users use
    a developer install mode so they can update with git, now the
    version information is always up to date in logs.

    This causes a minor API break: The --version output now only
    outputs the version.


=================
buildstream 1.1.2
=================

  o New ref-storage option allows one to store source refs, such
    as git shas, in one central project.refs file instead of inline
    with the source declarations.

  o Deprecated `--track-save` optionality in `bst build`, this
    does not make sense to support now that we have project.refs.

  o Added the `sandbox` configuration option which can be used in
    `project.conf` and elements, to control the user ID and group ID
    used in build sandboxes.

  o Added new `deb` source implementation, for staging of downloaded
    deb package files.


=================
buildstream 1.1.1
=================

  o New project configuration controlling how the sandbox behaves
    when `bst shell` is used; allowing projects to provide a more
    functional shell environment.

  o The `bst shell` command now has a `--mount` option allowing
    users to mount files and directories into the sandbox for
    testing purposes.

  o Log lines are now configurable with the new "message-format"
    user configuration, allowing one to express optional fields
    such as microsecond precision and wallclock time.

  o Newly added filter element

  o Git source plugin now allows disabling of submodule checkouts

  o In the same way we allow overriding element configurations
    by their 'kind' in project.conf, we now support the same
    for source plugin configurations.

  o Tar and zip sources now automatically recall an `etag`
    from the http headers, optimizing tracking of tarballs
    significantly (issue #62)


=================
buildstream 1.1.0
=================

  o Multiple artifact caches are now supported in project and
    user configuration with a priority order (issue #85)
  o Add junction support for subprojects
  o Changes towards incremental builds in workspaces
  o `bst shell --build` now creates true build sandbox
  o Many bug fixes


=================
buildstream 1.0.0
=================
First stable release of BuildStream

BuildStream 1.0.0 is all about API stability - for the past months we
have been reviewing our various API surfaces, implementing strategies
for revisioning of our interfaces and cleaning up. Long term stability
is very important for build reproducibility over time, and this release
is the first promise we are making on any API surfaces.

Stable API surfaces include:
  o The command line interface
  o The YAML user configuration file format
  o The YAML project `.bst` file format
  o The core Python module imported by external plugins
