add fs state read/write of repos
[?]
Jan 12, 2025, 1:26 PM
KLR5FRIBS6UOH3S3XAOE22TJACVSVOY7TOLW22DIWNGY27S6WZRACDependencies
- [2]
6YZAVBWUInitial commit
Change contents
- file addition: rustfmt.toml[2.2]
max_width = 80hard_tabs = falsetab_spaces = 4newline_style = "Auto"indent_style = "Block"use_small_heuristics = "Default"fn_call_width = 60attr_fn_like_width = 70struct_lit_width = 18struct_variant_width = 35array_width = 60chain_width = 60single_line_if_else_max_width = 50single_line_let_else_max_width = 50wrap_comments = trueformat_code_in_doc_comments = truedoc_comment_code_block_width = 80comment_width = 80normalize_comments = truenormalize_doc_attributes = falseformat_strings = falseformat_macro_matchers = falseformat_macro_bodies = trueskip_macro_invocations = []hex_literal_case = "Preserve"empty_item_single_line = truestruct_lit_single_line = truefn_single_line = falsewhere_single_line = falseimports_indent = "Block"imports_layout = "Mixed"imports_granularity = "Module"group_imports = "Preserve"reorder_imports = truereorder_modules = truereorder_impl_items = falsetype_punctuation_density = "Wide"space_before_colon = falsespace_after_colon = truespaces_around_ranges = falsebinop_separator = "Front"remove_nested_parens = truecombine_control_expr = trueshort_array_element_width_threshold = 10overflow_delimited_expr = falsestruct_field_align_threshold = 0enum_discrim_align_threshold = 0match_arm_blocks = truematch_arm_leading_pipes = "Never"force_multiline_blocks = falsefn_params_layout = "Tall"brace_style = "SameLineWhere"control_brace_style = "AlwaysSameLine"trailing_semicolon = truetrailing_comma = "Vertical"match_block_trailing_comma = falseblank_lines_upper_bound = 1blank_lines_lower_bound = 0edition = "2021"style_edition = "2021"inline_attribute_width = 0format_generated_files = truegenerated_marker_line_search_limit = 5merge_derives = trueuse_try_shorthand = falseuse_field_init_shorthand = falseforce_explicit_abi = truecondense_wildcard_suffixes = falsecolor = "Auto"required_version = "1.8.0"unstable_features = falsedisable_all_formatting = falseskip_children = falseshow_parse_errors = trueerror_on_line_overflow = falseerror_on_unformatted = falseignore = []emit_mode = "Files"make_backup = false - file addition: rust-toolchain.toml[2.2]
[toolchain]channel = "1.83.0" - edit in justfile at line 11
nightly := "nightly-2024-11-14" - replacement in justfile at line 25
cargo fmt -- --checkcargo +{{nightly}} fmt -- --check - replacement in justfile at line 28
cargo fmtcargo +{{nightly}} fmt - replacement in justfile at line 31
cargo clippycargo +{{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
pub mod dir;[2.1801]pub mod fs;pub mod prelude; - file addition: fs[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 foundreturn 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 locklet 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
- replacement in crates/libflowers/Cargo.toml at line 10
std = ["dep:directories"]std = ["dep:async-fd-lock", "dep:directories", "dep:toml_edit", "tokio/io-util"] - edit in crates/libflowers/Cargo.toml at line 15
[dependencies.async-fd-lock]workspace = trueoptional = 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 = trueoptional = true - replacement in crates/flowers-ui/src/main.rs at line 2
use iced::Element;use iced::Theme;use iced::{Element, Theme}; - replacement in crates/flowers-ui/src/main.rs at line 5
iced::application("Flowers UI 🌺", update, view)iced::application("Flowers UI 🌻", update, view) - edit in Cargo.toml at line 24
[workspace.dependencies.async-fd-lock]version = "0.2.0" - replacement in Cargo.toml at line 39
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
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
"thiserror","thiserror 1.0.69", - edit in Cargo.lock at line 170
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
[[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
"thiserror","thiserror 1.0.69", - replacement in Cargo.lock at line 450
"thiserror","thiserror 1.0.69", - replacement in Cargo.lock at line 547
"thiserror","thiserror 1.0.69", - edit in Cargo.lock at line 1241
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
"thiserror","thiserror 1.0.69", - replacement in Cargo.lock at line 1419
"thiserror","thiserror 1.0.69", - replacement in Cargo.lock at line 1437
"thiserror","thiserror 1.0.69", - replacement in Cargo.lock at line 1469
"thiserror","thiserror 1.0.69", - replacement in Cargo.lock at line 1482
"thiserror","thiserror 1.0.69", - replacement in Cargo.lock at line 1494
"thiserror","thiserror 1.0.69", - replacement in Cargo.lock at line 1527
"thiserror","thiserror 1.0.69", - replacement in Cargo.lock at line 1541
"thiserror","thiserror 1.0.69", - replacement in Cargo.lock at line 1555
"thiserror","thiserror 1.0.69", - replacement in Cargo.lock at line 1594
"thiserror","thiserror 1.0.69", - edit in Cargo.lock at line 1661
"async-fd-lock", - edit in Cargo.lock at line 1663
"serde","terrors","thiserror 2.0.11","tokio","toml_edit", - replacement in Cargo.lock at line 1819
"thiserror","thiserror 1.0.69", - replacement in Cargo.lock at line 1835
"thiserror","thiserror 1.0.69", - edit in Cargo.lock at line 2128
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
"thiserror","thiserror 1.0.69", - edit in Cargo.lock at line 2589
[[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
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
"thiserror","thiserror 1.0.69", - replacement in Cargo.lock at line 2829
"thiserror","thiserror 1.0.69", - edit in Cargo.lock at line 2972
[[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
"thiserror-impl","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
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
[[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
dependencies = ["serde",] - edit in Cargo.lock at line 3100
"serde","serde_spanned", - replacement in Cargo.lock at line 3535
"thiserror","thiserror 1.0.69", - replacement in Cargo.lock at line 3577
"thiserror","thiserror 1.0.69", - replacement in Cargo.lock at line 3638
"thiserror","thiserror 1.0.69",