=================
buildstream 1.3.2
=================

  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).

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