env:
CARGO_TERM_COLOR: always
- CARGO_PROJECT_FEATURES: "v2021_5,cap-std-apis"
+ CARGO_PROJECT_FEATURES: "v2022_6"
# TODO: Automatically query this from the C side
LATEST_LIBOSTREE: "v2022_6"
# Pinned toolchain for linting
[dependencies]
base64 = "0.20.0"
bitflags = "1.2.1"
-cap-std = { version = "1.0", optional = true}
-io-lifetimes = { version = "1.0", optional = true}
ffi = { package = "ostree-sys", path = "rust-bindings/sys", version = "0.13.0" }
gio = "0.16"
glib = "0.16"
[dev-dependencies]
maplit = "1.0.2"
tempfile = "3"
-cap-tempfile = "1.0"
+io-lifetimes = "1"
+cap-tempfile = "2"
[features]
-cap-std-apis = ["cap-std", "io-lifetimes", "v2017_10"]
dox = ["ffi/dox"]
v2014_9 = ["ffi/v2014_9"]
v2015_7 = ["v2014_9", "ffi/v2015_7"]
// Re-export our dependencies. See https://gtk-rs.org/blog/2021/06/22/new-release.html
// "Dependencies are re-exported". Users will need e.g. `gio::File`, so this avoids
// them needing to update matching versions.
-#[cfg(feature = "cap-std-apis")]
-pub use cap_std;
pub use ffi;
pub use gio;
pub use glib;
#[cfg(any(feature = "v2016_4", feature = "dox"))]
use crate::RepoListRefsExtFlags;
-#[cfg(feature = "cap-std-apis")]
use crate::RepoMode;
use crate::{Checksum, ObjectDetails, ObjectName, ObjectType, Repo, RepoTransactionStats};
use ffi::OstreeRepoListObjectsFlags;
use glib::ffi as glib_sys;
use glib::{self, translate::*, Error, IsA};
+use std::os::fd::BorrowedFd;
use std::{
collections::{HashMap, HashSet},
future::Future,
Repo::new(&gio::File::for_path(path.as_ref()))
}
- #[cfg(feature = "cap-std-apis")]
- /// A version of [`open_at`] which uses cap-std.
- pub fn open_at_dir(dir: &cap_std::fs::Dir, path: &str) -> Result<Repo, glib::Error> {
+ /// Open using the target directory file descriptor.
+ #[cfg(any(feature = "v2017_10", feature = "dox"))]
+ pub fn open_at_dir(dir: BorrowedFd<'_>, path: &str) -> Result<Repo, glib::Error> {
use std::os::unix::io::AsRawFd;
crate::Repo::open_at(dir.as_raw_fd(), path, gio::Cancellable::NONE)
}
- #[cfg(feature = "cap-std-apis")]
- /// A version of [`create_at`] which uses cap-std, and also returns the opened repo.
+ /// A version of [`create_at`] which resolves the path relative to the provided directory file descriptor, and also returns the opened repo.
+ #[cfg(any(feature = "v2017_10", feature = "dox"))]
pub fn create_at_dir(
- dir: &cap_std::fs::Dir,
+ dir: BorrowedFd<'_>,
path: &str,
mode: RepoMode,
options: Option<&glib::Variant>,
}
/// Borrow the directory file descriptor for this repository.
- #[cfg(feature = "cap-std-apis")]
- pub fn dfd_borrow(&self) -> io_lifetimes::BorrowedFd {
- unsafe { io_lifetimes::BorrowedFd::borrow_raw(self.dfd()) }
- }
-
- /// Return a new `cap-std` directory reference for this repository.
- #[cfg(feature = "cap-std-apis")]
- pub fn dfd_as_dir(&self) -> std::io::Result<cap_std::fs::Dir> {
- use io_lifetimes::AsFd;
- let dfd = self.dfd_borrow();
- cap_std::fs::Dir::reopen_dir(&dfd.as_fd())
+ #[cfg(feature = "v2017_10")]
+ pub fn dfd_borrow(&self) -> BorrowedFd {
+ unsafe { BorrowedFd::borrow_raw(self.dfd()) }
}
/// Find all objects reachable from a commit.
use crate::util::*;
+#[cfg(feature = "v2017_10")]
+use cap_std::fs::Dir;
+#[cfg(feature = "v2017_10")]
+use cap_tempfile::cap_std;
use ostree::prelude::*;
use ostree::{ObjectName, ObjectType};
+#[cfg(feature = "v2017_10")]
+use std::os::fd::AsFd;
#[cfg(any(feature = "v2016_8", feature = "dox"))]
mod checkout_at;
}
#[test]
-#[cfg(feature = "cap-std-apis")]
+#[cfg(feature = "v2017_10")]
fn cap_std_commit() {
let test_repo = CapTestRepo::new();
assert!(test_repo.dir.exists("config"));
// Also test re-acquiring a new dfd
- assert!(test_repo.repo.dfd_as_dir().unwrap().exists("config"));
+ assert!(Dir::reopen_dir(&test_repo.repo.dfd_borrow())
+ .unwrap()
+ .exists("config"));
assert!(test_repo.repo.require_rev("nosuchrev").is_err());
assert_eq!(test_repo.repo.require_rev("test").unwrap(), checksum);
- let repo2 = ostree::Repo::open_at_dir(&test_repo.dir, ".").unwrap();
+ let repo2 = ostree::Repo::open_at_dir(test_repo.dir.as_fd(), ".").unwrap();
let refs = repo2
.list_refs(None, gio::Cancellable::NONE)
.expect("failed to list refs");
+#[cfg(feature = "v2017_10")]
+use cap_tempfile::cap_std;
use glib::prelude::*;
use glib::GString;
+#[cfg(feature = "v2017_10")]
+use std::os::fd::AsFd;
use std::path::Path;
#[derive(Debug)]
}
#[derive(Debug)]
-#[cfg(feature = "cap-std-apis")]
+#[cfg(feature = "v2017_10")]
pub struct CapTestRepo {
pub dir: cap_tempfile::TempDir,
pub repo: ostree::Repo,
}
-#[cfg(feature = "cap-std-apis")]
+#[cfg(feature = "v2017_10")]
impl CapTestRepo {
pub fn new() -> Self {
Self::new_with_mode(ostree::RepoMode::Archive)
pub fn new_with_mode(repo_mode: ostree::RepoMode) -> Self {
let dir = cap_tempfile::tempdir(cap_std::ambient_authority()).unwrap();
- let repo = ostree::Repo::create_at_dir(&dir, ".", repo_mode, None).expect("repo create");
+ let repo =
+ ostree::Repo::create_at_dir(dir.as_fd(), ".", repo_mode, None).expect("repo create");
Self { dir, repo }
}
}