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