=================
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
