Files
ngit-grasp/Cargo.toml
T
DanConwayDev 25c535f96a fix(purgatory): recover from abandoned Git process groups
A primary and its delayed hedge could remain silent indefinitely, while cancellation killed only the direct Git child. In either case helpers could retain repository resources after admission guards returned and prevent alternative sources from making progress.

Keep a synchronous process-group guard armed from spawn through completion. Cancellation kills the group before Rust releases repository and domain guards. Five minutes without output initiates explicit SIGTERM cleanup; the unreaped leader anchors the group identity through a ten-second grace period before SIGKILL and wait. An unproductive pair then tries remaining URLs sequentially.

Normal completion disarms immediately when Git has joined its helpers, avoiding any signal after the leader is reaped and its PGID could be reused. Continuously active large transfers remain unbounded; activity is not source scoring.

Validated by focused tests proving active output survives, inactivity forcibly reaps a TERM-resistant descendant, cancellation reaps descendants before follow-up work, a failed pair reaches a third source, and git diff --check passes.
2026-08-11 20:31:35 +00:00

159 lines
3.7 KiB
TOML

[package]
name = "ngit-grasp"
version = "2.1.2"
edition = "2021"
authors = ["ngit-grasp contributors"]
license = "MIT"
description = "A GRASP (Git Relays Authorized via Signed-Nostr Proofs) implementation in Rust"
repository = "https://gitworkshop.dev/danconwaydev.com/ngit-grasp"
[dependencies]
# Async runtime
tokio = { version = "1.35", features = ["full"] }
# HTTP server (hyper for relay integration)
hyper = { version = "1.4", features = ["full"] }
hyper-util = { version = "0.1", features = ["tokio", "server", "http1", "http2"] }
http-body-util = "0.1"
# Nostr
#
# The stable 0.45 series contains the upstream NEG-OPEN handling fix used by
# the embedded relay. Caret requirements accept compatible patch releases.
nostr = "0.45.0"
# `local-relay` carries the embedded relay implementation, previously the
# separate `nostr-relay-builder` crate.
nostr-sdk = { version = "0.45.0", features = ["local-relay"] }
nostr-lmdb = "0.45.0"
nostr-memory = "0.45.0"
# Utilities
# SHA-1 for the `Sec-WebSocket-Accept` handshake. `nostr` uses this same crate
# internally but stopped re-exporting it as `nostr::hashes` in 0.45,
# so depend on it directly rather than pulling in a second hash implementation.
bitcoin_hashes = "0.14"
futures-util = "0.3"
base64 = "0.22"
flate2 = "1.0"
tar = "0.4"
fs2 = "0.4"
libc = "0.2"
# Metrics
prometheus = { version = "0.14", features = ["process"] }
dashmap = "6"
lazy_static = "1.4"
# Data structures
indexmap = "2"
# Random (for startup jitter)
rand = "0.10"
# Serialization
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
# Logging
tracing = "0.1"
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
# Configuration
dotenvy = "0.15"
clap = { version = "4.5", features = ["derive", "env"] }
# Error handling
anyhow = "1.0"
# Async traits
async-trait = "0.1"
# Temporary directories (used for GRASP-06 empty-repo synthesis)
tempfile = "3"
reqwest = { version = "0.13", default-features = false, features = ["native-tls"] }
# Git (for future use)
# git-http-backend = "0.3"
[dev-dependencies]
# Testing
grasp-audit = { path = "grasp-audit", version = "0.2.0" }
tempfile = "3"
tokio = { version = "1.35", features = ["full", "test-util"] }
tokio-tungstenite = "0.28.0"
[lib]
name = "ngit_grasp"
path = "src/lib.rs"
[[bin]]
name = "ngit-grasp"
path = "src/main.rs"
[[test]]
name = "nip09_announcement_cascade"
path = "tests/lifecycle/nip09_announcement_cascade.rs"
[[test]]
name = "nip09_blacklist_ops"
path = "tests/lifecycle/nip09_blacklist_ops.rs"
[[test]]
name = "nip09_cascade_event_types"
path = "tests/lifecycle/nip09_cascade_event_types.rs"
[[test]]
name = "nip09_disrespector"
path = "tests/lifecycle/nip09_disrespector.rs"
[[test]]
name = "nip09_git_archive_cleanup"
path = "tests/lifecycle/nip09_git_archive_cleanup.rs"
[[test]]
name = "nip09_holding_cleanup"
path = "tests/lifecycle/nip09_holding_cleanup.rs"
[[test]]
name = "nip09_holding_db"
path = "tests/lifecycle/nip09_holding_db.rs"
[[test]]
name = "nip09_multi_maintainer"
path = "tests/lifecycle/nip09_multi_maintainer.rs"
[[test]]
name = "nip09_recovery"
path = "tests/lifecycle/nip09_recovery.rs"
[[test]]
name = "nip09_state_cascade"
path = "tests/lifecycle/nip09_state_cascade.rs"
[[test]]
name = "nip09_state_multi_maintainer"
path = "tests/lifecycle/nip09_state_multi_maintainer.rs"
[[test]]
name = "nip09_validation"
path = "tests/lifecycle/nip09_validation.rs"
[[test]]
name = "deletion_request_retention"
path = "tests/lifecycle/deletion_request_retention.rs"
[[test]]
name = "nip62_lifecycle"
path = "tests/lifecycle/nip62_lifecycle.rs"
[[test]]
name = "nip62_validation"
path = "tests/lifecycle/nip62_validation.rs"
[[test]]
name = "replaceable_history"
path = "tests/lifecycle/replaceable_history.rs"
[workspace]
members = [".", "grasp-audit"]