# ostree-rs
[![pipeline status](https://gitlab.com/fkrull/ostree-rs/badges/master/pipeline.svg)](https://gitlab.com/fkrull/ostree-rs/commits/master)
[![Crates.io](https://img.shields.io/crates/v/ostree.svg)](https://crates.io/crates/ostree)
[![master-docs](https://img.shields.io/badge/docs-master-brightgreen.svg)](https://fkrull.gitlab.io/ostree-rs/ostree)

**Rust** bindings for [libostree](https://ostree.readthedocs.io).

libostree is both a shared library and suite of command line tools that combines
a "git-like" model for committing and downloading bootable filesystem trees,
along with a layer for deploying them and managing the bootloader configuration.

> **Note**: this crate was renamed from the `libostree` crate.

## Status
Most bindings that can be auto-generated are being auto-generated by now.
Anything that is not yet supported by the crate probably requires handwritten
bindings. These will most likely be added on an as-needed basis.

## Using

### Requirements
The `ostree` crate requires libostree and the libostree development headers.
On Debian/Ubuntu, they can be installed with:

```ShellSession
$ sudo apt-get install libostree-1 libostree-dev
```

### Installing
To use the crate, add it to your `Cargo.toml`:

```toml
[dependencies]
ostree = "0.7"
```

To use features from later libostree versions, you need to specify the release
version as well:

```toml
[dependencies.ostree]
version = "0.7"
features = ["v2019_6"]
```

## Developing
The `ostree` and `ostree-sys` crates can be built and tested using regular
Cargo commands.

### Generated code
Most code is generated based on the gir files using the
[gir](https://github.com/gtk-rs/gir) tool. These parts can be regenerated using
the included Makefile:

```ShellSession
$ make gir
```

Run the following command to update the bundled gir files:

```ShellSession
$ make update-gir-files
```

The `OSTree-1.0.gir` file needs to be updated manually, either from a recent
Debian package (`libostree-dev`) or by building from source.

### Documentation
The libostree API documentation is not included in the code by default because
of its LGPL license. This means normal `cargo doc` runs don't include API docs
for the generated code. Run the `merge-lgpl-docs` Makefile target to include
the API docs in the source so they can be consumed by `cargo doc`:

```ShellSession
$ make merge-lgpl-docs
```

Keep in mind that if you build the crate with the API docs included, it's
effectively LGPL-licensed and you need to comply with the LGPL requirements
(specifically, allowing users of your end product to swap out the LGPL'd
parts).

CI includes the LGPL docs in the documentation build.

### Releases
Releases can be done using the publish_* jobs in the pipeline. There's no
versioning helper yet so version bumps need to be done manually.

The version needs to be changed in the following places (if applicable):
* in `sys/Cargo.toml` for the -sys crate version
* in the `ostree-sys =` dependency in `Cargo.toml`
* in `Cargo.toml` for the main crate version
* in `README.md` in the *Installing* section in case of major version bumps

 Then tag the commit as `ostree/x.y.z` and/or `ostree-sys/x.y.z`. This will run
 the crates.io deployment jobs. Main and -sys crate don't have to be released in
 lockstep.

## License
The `ostree` crate is licensed under the MIT license. See the LICENSE file for
details.

libostree itself is licensed under the LGPL2+. See its
[licensing information](https://ostree.readthedocs.io#licensing) for more
information.

The libostree GIR file (`gir-files/OSTree-1.0.gir`) is derived from the
libostree source code and is also licensed under the LGPL2+. A copy of the
LGPL version 2 is included in the LICENSE.LGPL2 file.

The remaining GIR files (`gir-files/*.gir`) are from the glib project and
are licensed under the LGPL2.1+. A copy of the LGPL version 2.1 is included
in the LICENSE.LGPL2.1 file.
