From da1cca82695274bddb54aab5ca042b50f6f5303b Mon Sep 17 00:00:00 2001 From: Takeru Ohta Date: Mon, 9 Feb 2026 20:32:06 +0900 Subject: [PATCH 1/5] chore: update edition to 2024 --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index b877487..3556c11 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,7 +8,7 @@ repository = "https://github.com/sile/plumtree" readme = "README.md" license = "MIT" categories = ["algorithms"] -edition = "2021" +edition = "2024" [dev-dependencies] rand = "0.9" From d929d7d0620137dcaae508b5ba18dc91f03ad1c4 Mon Sep 17 00:00:00 2001 From: Takeru Ohta Date: Mon, 9 Feb 2026 20:32:43 +0900 Subject: [PATCH 2/5] refactor: use let-else chain in handle_graft --- src/node.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/node.rs b/src/node.rs index c5e10fd..92c0e36 100644 --- a/src/node.rs +++ b/src/node.rs @@ -304,13 +304,12 @@ impl Node { fn handle_graft(&mut self, mut graft: GraftMessage) { self.eager_push_peers.insert(graft.sender.clone()); self.lazy_push_peers.remove(&graft.sender); - if let Some(message_id) = graft.message_id.take() { - if let Some(payload) = self.messages.get(&message_id).cloned() { + if let Some(message_id) = graft.message_id.take() + && let Some(payload) = self.messages.get(&message_id).cloned() { let gossip = GossipMessage::new(&self.id, Message::new(message_id, payload), graft.round); self.actions.send(graft.sender, gossip); } - } } fn handle_prune(&mut self, prune: PruneMessage) { From aba1deec1820356aadc3523c0cea56f24be404de Mon Sep 17 00:00:00 2001 From: Takeru Ohta Date: Mon, 9 Feb 2026 20:37:05 +0900 Subject: [PATCH 3/5] chore: update CI/CD workflows and add fuzzing + release automation --- .github/workflows/ci.yml | 28 +++++++++++++++++++++++----- .github/workflows/release.yml | 31 +++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 5 deletions(-) create mode 100644 .github/workflows/release.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a127045..cebad93 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -11,8 +11,9 @@ jobs: toolchain: [stable, beta, nightly] steps: - name: Checkout sources - uses: actions/checkout@v4 + uses: actions/checkout@v6 - run: rustup update ${{ matrix.toolchain }} + - run: rustup default ${{ matrix.toolchain }} - run: cargo check --all test: @@ -23,8 +24,9 @@ jobs: toolchain: [stable, beta, nightly] steps: - name: Checkout sources - uses: actions/checkout@v4 + uses: actions/checkout@v6 - run: rustup update ${{ matrix.toolchain }} + - run: rustup default ${{ matrix.toolchain }} - run: cargo test --all lints: @@ -32,10 +34,26 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - toolchain: [stable, beta, nightly] + toolchain: [stable] steps: - name: Checkout sources - uses: actions/checkout@v4 + uses: actions/checkout@v6 - run: rustup update ${{ matrix.toolchain }} + - run: rustup default ${{ matrix.toolchain }} + - run: rustup component add rustfmt clippy - run: cargo fmt --all -- --check - - run: cargo clippy --all -- -D warnings + - run: cargo clippy --all --all-targets -- -D warnings + + fuzz: + name: Fuzz + runs-on: ubuntu-latest + steps: + - name: Checkout sources + uses: actions/checkout@v6 + - run: rustup update nightly + - run: rustup default nightly + - run: rustup component add rust-src + - run: cargo install cargo-fuzz + - name: Run fuzz target + run: cargo +nightly fuzz run fuzz_target -- -max_len=4096 -max_total_time=60 + diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..179e5c4 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,31 @@ +name: Create GitHub Release and Publish to crates.io + +on: + push: + tags: ['v*'] + +jobs: + github-release: + runs-on: ubuntu-latest + permissions: + contents: write + steps: + - uses: actions/checkout@v6 + - id: create-release + run: gh release create ${{ github.ref_name }} --title "${{ github.ref_name }}" --generate-notes + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + publish: + needs: github-release + runs-on: ubuntu-latest + # environment: release # Optional: for enhanced security + permissions: + id-token: write + steps: + - uses: actions/checkout@v6 + - uses: rust-lang/crates-io-auth-action@v1 + id: auth + - run: cargo publish + env: + CARGO_REGISTRY_TOKEN: ${{ steps.auth.outputs.token }} From 148d2f1bdb86f6efd81a2ddfbe4ec9cb0de6a8a1 Mon Sep 17 00:00:00 2001 From: Takeru Ohta Date: Mon, 9 Feb 2026 20:41:26 +0900 Subject: [PATCH 4/5] style: organize imports alphabetically --- src/action.rs | 2 +- src/missing.rs | 2 +- src/node.rs | 13 +++++++------ 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/action.rs b/src/action.rs index 156d084..545528c 100644 --- a/src/action.rs +++ b/src/action.rs @@ -1,5 +1,5 @@ -use crate::message::{Message, ProtocolMessage}; use crate::System; +use crate::message::{Message, ProtocolMessage}; use std::collections::VecDeque; use std::fmt; diff --git a/src/missing.rs b/src/missing.rs index 1d8318c..1cb80d3 100644 --- a/src/missing.rs +++ b/src/missing.rs @@ -1,6 +1,6 @@ +use crate::System; use crate::message::IhaveMessage; use crate::time::{Clock, NodeTime}; -use crate::System; use std::cmp::Ordering; use std::collections::{BinaryHeap, HashMap}; use std::fmt; diff --git a/src/node.rs b/src/node.rs index 92c0e36..3cb7a00 100644 --- a/src/node.rs +++ b/src/node.rs @@ -1,10 +1,10 @@ +use crate::System; use crate::action::{Action, ActionQueue}; use crate::message::{ GossipMessage, GraftMessage, IhaveMessage, Message, ProtocolMessage, PruneMessage, }; use crate::missing::MissingMessages; use crate::time::{Clock, NodeTime}; -use crate::System; use std::collections::{HashMap, HashSet}; use std::fmt; use std::time::Duration; @@ -305,11 +305,12 @@ impl Node { self.eager_push_peers.insert(graft.sender.clone()); self.lazy_push_peers.remove(&graft.sender); if let Some(message_id) = graft.message_id.take() - && let Some(payload) = self.messages.get(&message_id).cloned() { - let gossip = - GossipMessage::new(&self.id, Message::new(message_id, payload), graft.round); - self.actions.send(graft.sender, gossip); - } + && let Some(payload) = self.messages.get(&message_id).cloned() + { + let gossip = + GossipMessage::new(&self.id, Message::new(message_id, payload), graft.round); + self.actions.send(graft.sender, gossip); + } } fn handle_prune(&mut self, prune: PruneMessage) { From 428d59e250d8463e4d551c2cde0186bdbd764b51 Mon Sep 17 00:00:00 2001 From: Takeru Ohta Date: Mon, 9 Feb 2026 20:41:52 +0900 Subject: [PATCH 5/5] chore: remove fuzz job from CI workflow --- .github/workflows/ci.yml | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index cebad93..162a7c3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -43,17 +43,3 @@ jobs: - run: rustup component add rustfmt clippy - run: cargo fmt --all -- --check - run: cargo clippy --all --all-targets -- -D warnings - - fuzz: - name: Fuzz - runs-on: ubuntu-latest - steps: - - name: Checkout sources - uses: actions/checkout@v6 - - run: rustup update nightly - - run: rustup default nightly - - run: rustup component add rust-src - - run: cargo install cargo-fuzz - - name: Run fuzz target - run: cargo +nightly fuzz run fuzz_target -- -max_len=4096 -max_total_time=60 -