add fs state read/write of repos

[?]
Jan 12, 2025, 1:26 PM
KLR5FRIBS6UOH3S3XAOE22TJACVSVOY7TOLW22DIWNGY27S6WZRAC

Dependencies

Change contents

  • file addition: rustfmt.toml (----------)
    [2.2]
    max_width = 80
    hard_tabs = false
    tab_spaces = 4
    newline_style = "Auto"
    indent_style = "Block"
    use_small_heuristics = "Default"
    fn_call_width = 60
    attr_fn_like_width = 70
    struct_lit_width = 18
    struct_variant_width = 35
    array_width = 60
    chain_width = 60
    single_line_if_else_max_width = 50
    single_line_let_else_max_width = 50
    wrap_comments = true
    format_code_in_doc_comments = true
    doc_comment_code_block_width = 80
    comment_width = 80
    normalize_comments = true
    normalize_doc_attributes = false
    format_strings = false
    format_macro_matchers = false
    format_macro_bodies = true
    skip_macro_invocations = []
    hex_literal_case = "Preserve"
    empty_item_single_line = true
    struct_lit_single_line = true
    fn_single_line = false
    where_single_line = false
    imports_indent = "Block"
    imports_layout = "Mixed"
    imports_granularity = "Module"
    group_imports = "Preserve"
    reorder_imports = true
    reorder_modules = true
    reorder_impl_items = false
    type_punctuation_density = "Wide"
    space_before_colon = false
    space_after_colon = true
    spaces_around_ranges = false
    binop_separator = "Front"
    remove_nested_parens = true
    combine_control_expr = true
    short_array_element_width_threshold = 10
    overflow_delimited_expr = false
    struct_field_align_threshold = 0
    enum_discrim_align_threshold = 0
    match_arm_blocks = true
    match_arm_leading_pipes = "Never"
    force_multiline_blocks = false
    fn_params_layout = "Tall"
    brace_style = "SameLineWhere"
    control_brace_style = "AlwaysSameLine"
    trailing_semicolon = true
    trailing_comma = "Vertical"
    match_block_trailing_comma = false
    blank_lines_upper_bound = 1
    blank_lines_lower_bound = 0
    edition = "2021"
    style_edition = "2021"
    inline_attribute_width = 0
    format_generated_files = true
    generated_marker_line_search_limit = 5
    merge_derives = true
    use_try_shorthand = false
    use_field_init_shorthand = false
    force_explicit_abi = true
    condense_wildcard_suffixes = false
    color = "Auto"
    required_version = "1.8.0"
    unstable_features = false
    disable_all_formatting = false
    skip_children = false
    show_parse_errors = true
    error_on_line_overflow = false
    error_on_unformatted = false
    ignore = []
    emit_mode = "Files"
    make_backup = false
  • file addition: rust-toolchain.toml (----------)
    [2.2]
    [toolchain]
    channel = "1.83.0"
  • edit in justfile at line 11
    [2.181]
    [2.181]
    nightly := "nightly-2024-11-14"
  • replacement in justfile at line 25
    [2.309][2.309:334]()
    cargo fmt -- --check
    [2.309]
    [2.334]
    cargo +{{nightly}} fmt -- --check
  • replacement in justfile at line 28
    [2.340][2.340:354]()
    cargo fmt
    [2.340]
    [2.354]
    cargo +{{nightly}} fmt
  • replacement in justfile at line 31
    [2.363][2.363:380]()
    cargo clippy
    [2.363]
    [2.380]
    cargo +{{nightly}} clippy
  • file addition: prelude.rs (----------)
    [2.1759]
    #[doc(inline)]
    pub use serde::{Deserialize, Serialize};
    #[doc(inline)]
    pub use terrors::OneOf;
    #[doc(inline)]
    pub use thiserror::Error;
  • replacement in crates/libflowers/src/lib.rs at line 2
    [2.1801][2.1801:1814]()
    pub mod dir;
    [2.1801]
    pub mod fs;
    pub mod prelude;
  • file addition: fs (d--r------)
    [2.1759]
  • file addition: state.rs (----------)
    [0.2582]
    use crate::prelude::*;
    use super::dir;
    use async_fd_lock::{LockError, LockRead, LockWrite};
    use std::collections::BTreeMap;
    use std::path::{Path, PathBuf};
    use tokio::fs::File;
    use tokio::io::{AsyncReadExt, AsyncWriteExt};
    pub type Repos = BTreeMap<String, Repo>;
    #[derive(Debug, Serialize, Deserialize)]
    pub struct Repo {
    path: PathBuf,
    }
    #[derive(Debug, Error)]
    #[error("Another file-lock is blocking")]
    pub struct BlockingLockError;
    /// Acquire a read-lock to try to read [`Repos`]. If there's an active
    /// write-lock the call will fail with a [`BlockingLockError`].
    pub async fn read_repos() -> Result<Repos, ReadErr> {
    let file = match File::options().create_new(false).open(repos_path()).await
    {
    Err(err) if matches!(err.kind(), std::io::ErrorKind::NotFound) => {
    // Create a default `Repos` if file not found
    return Ok(Repos::default());
    }
    result => result.map_err(OneOf::new)?,
    };
    let mut read_guard = match file.lock_read().await {
    Err(err)
    if matches!(err.error.kind(), std::io::ErrorKind::WouldBlock) =>
    {
    return Err(OneOf::new(BlockingLockError));
    }
    result => result.map_err(OneOf::new)?,
    };
    let mut buffer = Vec::new();
    read_guard
    .read_to_end(&mut buffer)
    .await
    .map_err(OneOf::new)?;
    toml_edit::de::from_slice(&buffer).map_err(OneOf::new)
    }
    /// Acquire a write-lock to try to read [`Repos`]. If there's another active
    /// write-lock the call will fail with a [`BlockingLockError`].
    pub async fn write_repos(repos: &Repos) -> Result<(), WriteErr> {
    let file = File::options()
    .create_new(true)
    .open(repos_path())
    .await
    .map_err(OneOf::new)?;
    // Optimistically encode first to reduce the scope of the lock
    let repos_bytes =
    toml_edit::ser::to_string_pretty(repos).map_err(OneOf::new)?;
    let mut write_guard = match file.lock_write().await {
    Err(err)
    if matches!(err.error.kind(), std::io::ErrorKind::WouldBlock) =>
    {
    return Err(OneOf::new(BlockingLockError));
    }
    result => result.map_err(OneOf::new)?,
    };
    write_guard
    .write_all(repos_bytes.as_bytes())
    .await
    .map_err(OneOf::new)
    }
    pub type ReadErr = OneOf<(
    BlockingLockError,
    std::io::Error,
    LockError<tokio::fs::File>,
    toml_edit::de::Error,
    )>;
    pub type WriteErr = OneOf<(
    BlockingLockError,
    std::io::Error,
    LockError<tokio::fs::File>,
    toml_edit::ser::Error,
    )>;
    fn repos_path() -> PathBuf {
    PathBuf::from_iter([dir::data().as_path(), Path::new(REPOS_FILE)])
    }
    const REPOS_FILE: &str = "repos.toml";
  • file addition: mod.rs (----------)
    [0.2582]
    pub mod dir;
    pub mod state;
  • file move: dir.rs (----------)dir.rs (----------)
    [0.2582]
    [2.1847]
  • replacement in crates/libflowers/Cargo.toml at line 10
    [2.2557][2.2557:2583]()
    std = ["dep:directories"]
    [2.2557]
    [2.2583]
    std = ["dep:async-fd-lock", "dep:directories", "dep:toml_edit", "tokio/io-util"]
  • edit in crates/libflowers/Cargo.toml at line 15
    [2.2624]
    [2.2624]
    [dependencies.async-fd-lock]
    workspace = true
    optional = true
  • edit in crates/libflowers/Cargo.toml at line 23
    [2.2685]
    [dependencies.serde]
    workspace = true
    [dependencies.terrors]
    workspace = true
    [dependencies.thiserror]
    workspace = true
    [dependencies.tokio]
    workspace = true
    [dependencies.toml_edit]
    workspace = true
    optional = true
  • replacement in crates/flowers-ui/src/main.rs at line 2
    [2.2798][2.2798:2834]()
    use iced::Element;
    use iced::Theme;
    [2.2798]
    [2.2834]
    use iced::{Element, Theme};
  • replacement in crates/flowers-ui/src/main.rs at line 5
    [2.2867][2.2867:2922]()
    iced::application("Flowers UI 🌺", update, view)
    [2.2867]
    [2.2922]
    iced::application("Flowers UI 🌻", update, view)
  • edit in Cargo.toml at line 24
    [2.4172]
    [2.4172]
    [workspace.dependencies.async-fd-lock]
    version = "0.2.0"
  • replacement in Cargo.toml at line 39
    [2.4432][2.4432:4458]()
    path = "../pijul/libpijul"
    [2.4432]
    path = "../pijul/libpijul"
    [workspace.dependencies.serde]
    version = "1.0"
    [workspace.dependencies.terrors]
    version = "0.3"
    [workspace.dependencies.thiserror]
    version = "2.0"
    [workspace.dependencies.tokio]
    version = "1.36"
    features = ["fs"]
    [workspace.dependencies.toml_edit]
    version = "0.22"
    features = ["serde"]
  • edit in Cargo.lock at line 22
    [2.5072]
    [2.5072]
    name = "addr2line"
    version = "0.24.2"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1"
    dependencies = [
    "gimli",
    ]
    [[package]]
  • replacement in Cargo.lock at line 78
    [2.6159][2.6159:6173]()
    "thiserror",
    [2.6159]
    [2.6173]
    "thiserror 1.0.69",
  • edit in Cargo.lock at line 170
    [2.8569]
    [2.8569]
    name = "async-fd-lock"
    version = "0.2.0"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "7569377d7062165f6f7834d9cb3051974a2d141433cc201c2f94c149e993cccf"
    dependencies = [
    "async-trait",
    "cfg-if",
    "pin-project",
    "rustix",
    "thiserror 1.0.69",
    "tokio",
    "windows-sys 0.52.0",
    ]
    [[package]]
  • edit in Cargo.lock at line 301
    [2.11293]
    [2.11293]
    [[package]]
    name = "backtrace"
    version = "0.3.74"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a"
    dependencies = [
    "addr2line",
    "cfg-if",
    "libc",
    "miniz_oxide",
    "object",
    "rustc-demangle",
    "windows-targets 0.52.6",
    ]
  • replacement in Cargo.lock at line 436
    [2.14538][2.14538:14552]()
    "thiserror",
    [2.14538]
    [2.14552]
    "thiserror 1.0.69",
  • replacement in Cargo.lock at line 450
    [2.14822][2.14822:14836]()
    "thiserror",
    [2.14822]
    [2.14836]
    "thiserror 1.0.69",
  • replacement in Cargo.lock at line 547
    [2.17387][2.17387:17401]()
    "thiserror",
    [2.17387]
    [2.17401]
    "thiserror 1.0.69",
  • edit in Cargo.lock at line 1241
    [2.35034]
    [2.35034]
    name = "gimli"
    version = "0.31.1"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f"
    [[package]]
  • replacement in Cargo.lock at line 1323
    [2.36949][2.36949:36963]()
    "thiserror",
    [2.36949]
    [2.36963]
    "thiserror 1.0.69",
  • replacement in Cargo.lock at line 1419
    [2.39472][2.39472:39486]()
    "thiserror",
    [2.39472]
    [2.39486]
    "thiserror 1.0.69",
  • replacement in Cargo.lock at line 1437
    [2.39829][2.39829:39843]()
    "thiserror",
    [2.39829]
    [2.39843]
    "thiserror 1.0.69",
  • replacement in Cargo.lock at line 1469
    [2.40525][2.40525:40539]()
    "thiserror",
    [2.40525]
    [2.40539]
    "thiserror 1.0.69",
  • replacement in Cargo.lock at line 1482
    [2.40834][2.40834:40848]()
    "thiserror",
    [2.40834]
    [2.40848]
    "thiserror 1.0.69",
  • replacement in Cargo.lock at line 1494
    [2.41121][2.41121:41135]()
    "thiserror",
    [2.41121]
    [2.41135]
    "thiserror 1.0.69",
  • replacement in Cargo.lock at line 1527
    [2.41811][2.41811:41825]()
    "thiserror",
    [2.41811]
    [2.41825]
    "thiserror 1.0.69",
  • replacement in Cargo.lock at line 1541
    [2.42128][2.42128:42142]()
    "thiserror",
    [2.42128]
    [2.42142]
    "thiserror 1.0.69",
  • replacement in Cargo.lock at line 1555
    [2.42456][2.42456:42470]()
    "thiserror",
    [2.42456]
    [2.42470]
    "thiserror 1.0.69",
  • replacement in Cargo.lock at line 1594
    [2.43290][2.43290:43304]()
    "thiserror",
    [2.43290]
    [2.43304]
    "thiserror 1.0.69",
  • edit in Cargo.lock at line 1661
    [2.44936]
    [2.44936]
    "async-fd-lock",
  • edit in Cargo.lock at line 1663
    [2.44952]
    [2.44952]
    "serde",
    "terrors",
    "thiserror 2.0.11",
    "tokio",
    "toml_edit",
  • replacement in Cargo.lock at line 1819
    [2.48734][2.48734:48748]()
    "thiserror",
    [2.48734]
    [2.48748]
    "thiserror 1.0.69",
  • replacement in Cargo.lock at line 1835
    [2.49071][2.49071:49085]()
    "thiserror",
    [2.49071]
    [2.49085]
    "thiserror 1.0.69",
  • edit in Cargo.lock at line 2128
    [2.56079]
    [2.56079]
    name = "object"
    version = "0.36.7"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87"
    dependencies = [
    "memchr",
    ]
    [[package]]
  • replacement in Cargo.lock at line 2565
    [2.67109][2.67109:67123]()
    "thiserror",
    [2.67109]
    [2.67123]
    "thiserror 1.0.69",
  • edit in Cargo.lock at line 2589
    [2.67760]
    [2.67760]
    [[package]]
    name = "rustc-demangle"
    version = "0.1.24"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f"
  • edit in Cargo.lock at line 2710
    [2.70663]
    [2.70663]
    name = "serde_spanned"
    version = "0.6.8"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1"
    dependencies = [
    "serde",
    ]
    [[package]]
  • replacement in Cargo.lock at line 2804
    [2.72935][2.72935:72949]()
    "thiserror",
    [2.72935]
    [2.72949]
    "thiserror 1.0.69",
  • replacement in Cargo.lock at line 2829
    [2.73475][2.73475:73489]()
    "thiserror",
    [2.73475]
    [2.73489]
    "thiserror 1.0.69",
  • edit in Cargo.lock at line 2972
    [2.76842]
    [2.76842]
    [[package]]
    name = "terrors"
    version = "0.3.2"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "a09a4471bca83dc547eb7829f7fe0b96ad3d04d21ad155e1e14084e163fe0e07"
  • replacement in Cargo.lock at line 2985
    [2.77053][2.77053:77072]()
    "thiserror-impl",
    [2.77053]
    [2.77072]
    "thiserror-impl 1.0.69",
    ]
    [[package]]
    name = "thiserror"
    version = "2.0.11"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "d452f284b73e6d76dd36758a0c8684b1d5be31f92b89d07fd5822175732206fc"
    dependencies = [
    "thiserror-impl 2.0.11",
  • edit in Cargo.lock at line 3002
    [2.77273]
    [2.77273]
    dependencies = [
    "proc-macro2",
    "quote",
    "syn",
    ]
    [[package]]
    name = "thiserror-impl"
    version = "2.0.11"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2"
  • edit in Cargo.lock at line 3072
    [2.78604]
    [2.78604]
    [[package]]
    name = "tokio"
    version = "1.43.0"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "3d61fa4ffa3de412bfea335c6ecff681de2b609ba3c77ef3e00e521813a9ed9e"
    dependencies = [
    "backtrace",
    "bytes",
    "pin-project-lite",
    ]
  • edit in Cargo.lock at line 3089
    [2.78801]
    [2.78801]
    dependencies = [
    "serde",
    ]
  • edit in Cargo.lock at line 3100
    [2.79026]
    [2.79026]
    "serde",
    "serde_spanned",
  • replacement in Cargo.lock at line 3535
    [2.90080][2.90080:90094]()
    "thiserror",
    [2.90080]
    [2.90094]
    "thiserror 1.0.69",
  • replacement in Cargo.lock at line 3577
    [2.90829][2.90829:90843]()
    "thiserror",
    [2.90829]
    [2.90843]
    "thiserror 1.0.69",
  • replacement in Cargo.lock at line 3638
    [2.92423][2.92423:92437]()
    "thiserror",
    [2.92423]
    [2.92437]
    "thiserror 1.0.69",