Drop cap-std from our public APIs
authorColin Walters <walters@verbum.org>
Thu, 31 Aug 2023 18:08:15 +0000 (14:08 -0400)
committerColin Walters <walters@verbum.org>
Thu, 31 Aug 2023 19:34:26 +0000 (15:34 -0400)
Since it bumped semver (when I didn't expect it to; xref
https://github.com/bytecodealliance/cap-std/commit/963eebf3ab52b04a2e8b9ba88ce6308bbed5cbd0#r121651362

It's not load-bearing enough here to matter versus just passing
an untyped file descriptor.

This mainly means that it will be the `glib` ecosystem which
forces transitive semver bumps for us, not both.

.github/workflows/rust.yml
Cargo.toml
rust-bindings/src/lib.rs
rust-bindings/src/repo.rs
rust-bindings/tests/repo/mod.rs
rust-bindings/tests/util/mod.rs

index a3bb8678b81bc99e83e945c083cec012be72ece0..faa44bab2ddc5e5393b7bba662897f0fdf3210a5 100644 (file)
@@ -11,7 +11,7 @@ on:
 
 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
index 37959f6df8d47f96ea55ee1a88a098e109171527..21f4a2f1108a83aab70a6b1fa1d1fb9de2d7a0cd 100644 (file)
@@ -40,8 +40,6 @@ members = [".", "rust-bindings/sys"]
 [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"
@@ -53,10 +51,10 @@ thiserror = "1.0.20"
 [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"]
index 01f8ad08f53f4830f33a5a7054b3d93128b924b7..69a72cdc4a05a4b76c7542f9704ef8182d8b4002 100644 (file)
@@ -12,8 +12,6 @@
 // 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;
index 1333fd5f653b41856d5eaf7eb604c19efd96383f..5739953e50103dc476ce9f1912fe62db56ee90b7 100644 (file)
@@ -1,11 +1,11 @@
 #[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,
@@ -105,17 +105,17 @@ impl Repo {
         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>,
@@ -152,17 +152,9 @@ impl Repo {
     }
 
     /// 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.
index a8d2b9d05c5de370438bf8910444f438d5d98894..f0b562f6a7d92df849eab28bde3e869662414a78 100644 (file)
@@ -1,6 +1,12 @@
 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;
@@ -54,13 +60,15 @@ fn list_commits() {
 }
 
 #[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());
 
@@ -69,7 +77,7 @@ fn cap_std_commit() {
 
     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");
index 80886910c902cafe11691deae1154e65ba81075f..aed56d431ab1e43ee56469a3058fe3123f022937 100644 (file)
@@ -1,5 +1,9 @@
+#[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)]
@@ -28,13 +32,13 @@ impl TestRepo {
 }
 
 #[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)
@@ -42,7 +46,8 @@ impl CapTestRepo {
 
     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 }
     }
 }