From f440ebdfb8322bf70872d8ddba58d58fe403994d Mon Sep 17 00:00:00 2001 From: Jose Celano Date: Wed, 1 Jul 2026 08:19:21 +0100 Subject: [PATCH 1/3] feat(workspace): adopt independent package versioning policy Define and document the policy that all workspace packages version independently, replacing the implicit shared workspace version. Includes: - Issue spec with four-tier versioning model and Appendix A - ADR documenting the decision - EPIC and DECISIONS log updates - CI workflows (deployment-packages.yaml, deployment.yaml) - Release process documentation update - Branch format validation and output injection protection - Secret scoping and review feedback from all rounds --- .github/workflows/deployment-packages.yaml | 162 +++++++ .github/workflows/deployment.yaml | 38 +- ...ontract-first_architecture_for_rest_api.md | 6 + ...00_adopt_independent_package_versioning.md | 179 ++++++++ docs/adrs/index.md | 1 + .../open/1669-overhaul-packages/DECISIONS.md | 66 ++- .../open/1669-overhaul-packages/EPIC.md | 43 +- ...i-32-define-package-versioning-strategy.md | 421 +++++++++++++++--- docs/release_process.md | 176 +++++++- project-words.txt | 4 + 10 files changed, 963 insertions(+), 133 deletions(-) create mode 100644 .github/workflows/deployment-packages.yaml create mode 100644 docs/adrs/20260629000000_adopt_independent_package_versioning.md diff --git a/.github/workflows/deployment-packages.yaml b/.github/workflows/deployment-packages.yaml new file mode 100644 index 000000000..55c1ebc53 --- /dev/null +++ b/.github/workflows/deployment-packages.yaml @@ -0,0 +1,162 @@ +# Deployment (Workspace Packages) +# +# adr: docs/adrs/20260629000000_adopt_independent_package_versioning.md +# +# PRIMARY publishing path for publishable workspace packages. Every publishable crate versions +# independently and is published independently via this workflow as it +# evolves. By the time a tracker release happens, all dependency crates +# are already on crates.io — the tracker release workflow only needs to +# publish the final `torrust-tracker` binary crate. +# +# This workflow is tier-independent — it handles any publishable workspace crate +# regardless of whether it's a runtime, API contract, or utility package. +# The four-tier model (runtime / API contract / platform-utility / unpublished tooling) describes +# versioning semantics, not publish mechanics. +# +# When to use: +# - You bumped a publishable crate version and it needs to be published. +# - You need to publish a crate for extraction to a standalone repository. +# +# Triggered by: +# - Pushing a branch matching releases/pkg//v +# - Manual workflow_dispatch with a package name (for urgent patches) +# +# Branch/tag conventions: +# Branch: releases/pkg//v +# Tag: pkg//v (signed, created manually after CI success) +# +# See docs/release_process.md for the full manual workflow. + +name: Deployment (Packages) + +on: + push: + branches: + - "releases/pkg/**" + workflow_dispatch: + inputs: + crate-name: + description: "Crate to publish (e.g., torrust-tracker-udp-protocol)" + required: true + type: string + +jobs: + extract-crate: + name: Extract Crate Name + runs-on: ubuntu-latest + outputs: + crate-name: ${{ steps.extract.outputs.crate-name }} + steps: + - id: extract + name: Extract Crate Name from Branch or Input + env: + INPUT_CRATE_NAME: ${{ inputs.crate-name }} + run: | + if [ -n "$INPUT_CRATE_NAME" ]; then + # Use heredoc to avoid output injection via newlines in input + CRATE=$(echo "$INPUT_CRATE_NAME" | tr -d '\r\n') + if [ -z "$CRATE" ]; then + echo "ERROR: Crate name is empty after sanitization" + exit 1 + fi + { + echo 'crate-name<> "$GITHUB_OUTPUT" + else + # Branch format: releases/pkg//v + BRANCH="${GITHUB_REF#refs/heads/}" + # Validate branch matches expected pattern + case "$BRANCH" in + releases/pkg/*/v*) + # Remove releases/pkg/ prefix -> /v + # Then remove /v suffix -> + CRATE="${BRANCH#releases/pkg/}" + CRATE="${CRATE%/v*}" + if [ -z "$CRATE" ]; then + echo "ERROR: Could not extract crate name from branch '$BRANCH'" + echo "Expected format: releases/pkg//v" + exit 1 + fi + # Reject crate names containing '/' (extra path segments) + case "$CRATE" in + */*) + echo "ERROR: Invalid branch format: '$BRANCH'" + echo "Crate name '$CRATE' contains '/' which indicates extra path segments" + echo "Expected format: releases/pkg//v" + echo "Example: releases/pkg/torrust-tracker-udp-protocol/v0.2.0" + exit 1 + ;; + esac + echo "crate-name=${CRATE}" >> "$GITHUB_OUTPUT" + ;; + *) + echo "ERROR: Branch '$BRANCH' does not match expected pattern" + echo "Expected format: releases/pkg//v" + echo "Example: releases/pkg/torrust-tracker-udp-protocol/v0.2.0" + exit 1 + ;; + esac + fi + + test: + name: Test + needs: extract-crate + runs-on: ubuntu-latest + strategy: + matrix: + toolchain: [nightly, stable] + steps: + - id: checkout + name: Checkout Repository + uses: actions/checkout@v7 + - id: setup + name: Setup Toolchain + uses: dtolnay/rust-toolchain@stable + with: + toolchain: ${{ matrix.toolchain }} + - id: test + name: Run Tests for ${{ needs.extract-crate.outputs.crate-name }} + run: cargo test -p "${{ needs.extract-crate.outputs.crate-name }}" + + publish: + name: Publish + environment: deployment + needs: [extract-crate, test] + runs-on: ubuntu-latest + strategy: + matrix: + toolchain: [stable] + steps: + - id: checkout + name: Checkout Repository + uses: actions/checkout@v7 + - id: setup + name: Setup Toolchain + uses: dtolnay/rust-toolchain@stable + with: + toolchain: ${{ matrix.toolchain }} + - id: verify-version + name: Verify Explicit Version + run: | + CRATE="${{ needs.extract-crate.outputs.crate-name }}" + # Find the Cargo.toml that declares this crate name + TOML_FILE=$(grep -rl "name = \"$CRATE\"" --include='Cargo.toml' . | head -1) + if [ -z "$TOML_FILE" ]; then + echo "ERROR: Could not find Cargo.toml for crate '$CRATE'" + exit 1 + fi + if grep -q 'version.workspace = true' "$TOML_FILE"; then + echo "ERROR: Crate '$CRATE' still uses 'version.workspace = true' in $TOML_FILE" + echo "Each crate must have its own explicit 'version' field before publishing." + echo "See docs/issues/open/1926-1669-si-32-define-package-versioning-strategy.md" + exit 1 + fi + echo "✓ Crate '$CRATE' has an explicit version field" + - id: publish + name: Publish ${{ needs.extract-crate.outputs.crate-name }} + env: + CARGO_REGISTRY_TOKEN: "${{ secrets.TORRUST_UPDATE_CARGO_REGISTRY_TOKEN }}" + run: | + cargo publish -p "${{ needs.extract-crate.outputs.crate-name }}" diff --git a/.github/workflows/deployment.yaml b/.github/workflows/deployment.yaml index 810bf78c2..eed78c6de 100644 --- a/.github/workflows/deployment.yaml +++ b/.github/workflows/deployment.yaml @@ -1,9 +1,18 @@ -name: Deployment +name: Deployment (Tracker) + +# adr: docs/adrs/20260629000000_adopt_independent_package_versioning.md +# +# Publishes only the root `torrust-tracker` binary crate to crates.io. +# All dependency crates are published independently via `deployment-packages.yaml` +# as they evolve. By the time a tracker release happens, they are already on +# crates.io — this workflow only needs to publish the final binary crate. +# +# See docs/release_process.md for the full release workflow. on: push: branches: - - "releases/**/*" + - "releases/v*" jobs: test: @@ -51,31 +60,8 @@ jobs: toolchain: ${{ matrix.toolchain }} - id: publish - name: Publish Crates + name: Publish torrust-tracker env: CARGO_REGISTRY_TOKEN: "${{ secrets.TORRUST_UPDATE_CARGO_REGISTRY_TOKEN }}" run: | - cargo publish -p torrust-located-error - cargo publish -p torrust-tracker-http-core - cargo publish -p torrust-tracker-http-protocol - cargo publish -p torrust-tracker-client-lib - cargo publish -p torrust-tracker-core - cargo publish -p torrust-tracker-udp-core - cargo publish -p torrust-tracker-udp-protocol - cargo publish -p torrust-tracker-axum-health-check-api-server - cargo publish -p torrust-tracker-axum-http-server - cargo publish -p torrust-tracker-axum-rest-api-server - cargo publish -p torrust-tracker-axum-server - cargo publish -p torrust-tracker-rest-api-client - cargo publish -p torrust-server-lib cargo publish -p torrust-tracker - cargo publish -p torrust-tracker-client - cargo publish -p torrust-clock - cargo publish -p torrust-tracker-configuration - cargo publish -p torrust-tracker-events - cargo publish -p torrust-metrics - cargo publish -p torrust-tracker-primitives - cargo publish -p torrust-tracker-swarm-coordination-registry - cargo publish -p torrust-tracker-test-helpers - cargo publish -p torrust-tracker-torrent-repository-benchmarking - cargo publish -p torrust-tracker-udp-server diff --git a/docs/adrs/20260623200526_adopt_contract-first_architecture_for_rest_api.md b/docs/adrs/20260623200526_adopt_contract-first_architecture_for_rest_api.md index be2b87d27..bc0ba3f01 100644 --- a/docs/adrs/20260623200526_adopt_contract-first_architecture_for_rest_api.md +++ b/docs/adrs/20260623200526_adopt_contract-first_architecture_for_rest_api.md @@ -38,6 +38,12 @@ A dedicated crate for versioned REST contract artifacts. It owns: - Auth contract surface (transport-agnostic semantics). - Optional API capability/introspection structures for future interoperability. +> **Version coexistence**: multiple API versions coexist in the same codebase under +> versioned namespace modules (e.g., `v1/`, `v2/`) — a pattern called **version by +> namespace convention**. See ADR +> [20260629000000](20260629000000_adopt_independent_package_versioning.md) for the +> rationale and decision. + It does **not** own Axum, runtime server wiring, or tracker database logic. ### Layer 2 — Application Package (`torrust-tracker-rest-api-application`) diff --git a/docs/adrs/20260629000000_adopt_independent_package_versioning.md b/docs/adrs/20260629000000_adopt_independent_package_versioning.md new file mode 100644 index 000000000..7c2f0f976 --- /dev/null +++ b/docs/adrs/20260629000000_adopt_independent_package_versioning.md @@ -0,0 +1,179 @@ +--- +semantic-links: + skill-links: + - create-adr + related-artifacts: + - docs/issues/open/1926-1669-si-32-define-package-versioning-strategy.md + - docs/issues/open/1669-overhaul-packages/EPIC.md + - docs/issues/open/1669-overhaul-packages/DECISIONS.md + - docs/release_process.md + - .github/workflows/deployment.yaml + - .github/workflows/deployment-packages.yaml +--- + +# Adopt Independent Package Versioning + +## Description + +All workspace packages previously shared a single lockstep version (`version.workspace = true` +→ `3.0.0-develop`). This coupled unrelated packages to the same release cadence, inflated +SemVer churn on packages with no changes, and gave weak signals to external consumers about +change risk. + +The workspace contains packages with very different consumer surfaces: tightly-coupled tracker +runtime crates, protocol crates, utility crates, and tool crates. A single shared version +cannot accurately reflect the maturity and change frequency of all of them. + +## Agreement + +**All packages in the `torrust-tracker` workspace version independently.** +Publishable packages are published to crates.io via `deployment-packages.yaml` as they evolve. + +The tracker release (`deployment.yaml`) publishes **only** the root `torrust-tracker` +binary crate — all dependency crates are already on crates.io from their independent +publishing cycles. + +The release model splits into two distinct concepts with dedicated branch/tag conventions +and CI automation: + +| Concept | Description | Branch convention | Tag convention | CI workflow | Trigger | Publishes | +| ------------------------------- | --------------------------------------------------------------- | ------------------------------------- | ------------------------------------- | -------------------------- | ----------------- | ---------------------- | +| **Tracker application release** | Root binary crate `torrust-tracker` | `releases/v` | `v` (signed) | `deployment.yaml` | `releases/v*` | Only `torrust-tracker` | +| **Individual package publish** | Any workspace crate published independently (primary mechanism) | `releases/pkg//v` | `pkg//v` (signed) | `deployment-packages.yaml` | `releases/pkg/**` | Exactly one crate | + +While all packages version independently, the workspace has four distinct **versioning semantics** +tiers. These describe **what a version bump signals** for external consumers — they do **not** +determine how publishing works. + +| Tier | Version bump signals | Example packages | +| ----------------------- | ----------------------------------------------------------- | ------------------------------------------------------------------------------- | +| **Tracker runtime** | Tracker application behaviour or feature set changed | `tracker-core`, `udp-server`, `primitives`, `http-protocol`, `axum-http-server` | +| **API contract** | REST API or configuration schema changed | `rest-api-protocol`, `configuration`, `axum-rest-api-server` | +| **Platform/utility** | Crate's own library API changed | `test-helpers` | +| **Unpublished tooling** | Version changes only when internal API changes meaningfully | `e2e-tools`, `persistence-benchmark`, `workspace-coupling` | + +GitHub Releases are used **only for tracker application releases**. Workspace packages +are published to crates.io only. + +### Rationale + +1. **Path dependencies guarantee compatibility**: since all inter-package dependencies use + `path = "..."` within the workspace, Cargo always resolves the local copy regardless of + the declared version number. Linked version numbers add no safety. +2. **Accurate SemVer signals**: external consumers can infer change risk from version + numbers because each package's version reflects its own history, not the workspace's. +3. **Avoids unnecessary churn**: a bugfix in one package no longer forces a version bump + on every unrelated package in the workspace. +4. **Aligns with EPIC #1669 extraction goal**: packages moving to standalone repositories + already version independently. This formalises the same approach for every package. +5. **Emergent coupling, not imposed coupling**: if packages naturally evolve together over + time, that coupling can be formalised later when there is evidence, not before. +6. **Glob safety**: `releases/v*` in GitHub Actions does **not** match `releases/pkg/...` + because `*` does not cross `/` boundaries. This keeps trigger patterns mutually exclusive + without complex negative matching. +7. **Tag prefixes disambiguate ownership**: `pkg/` prefix in tags makes it immediately + clear which package a tag refers to, avoiding ambiguity with tracker app tags. + +### CI Automation Design + +Two separate workflows with complementary responsibilities: + +| Aspect | `deployment.yaml` (tracker) | `deployment-packages.yaml` (packages) | +| ---------- | --------------------------- | ------------------------------------------ | +| Trigger | `releases/v*` | `releases/pkg/**` (or `workflow_dispatch`) | +| Publishes | Only `torrust-tracker` | Single crate extracted from branch name | +| Role | Tracker application release | Primary publishing path for all packages | +| Complexity | Low (one crate) | Low (one shot) | + +**Why `deployment.yaml` publishes only one crate**: by the time a tracker release happens, +all dependency crates have already been published independently via `deployment-packages.yaml` +as they evolved during the development cycle. The tracker release is the final step that +publishes the binary crate consumers actually download. + +### GitHub Releases + +GitHub Releases (release notes, downloadable assets, etc.) are used **only for the tracker +application binary**. The tracker binary is the primary deliverable for end-users; workspace +crates are library/tool code consumed via crates.io. + +For workspace packages, the crate README and `Cargo.toml` metadata serve as the documentation +surface. crates.io handles distribution and version tracking. + +### What Does Not Change + +- The existing **tracker application release process** (branch, tag, PR into `main`, + CI deployment) continues to work — it now only publishes `torrust-tracker` itself. +- Path dependencies within the workspace are unaffected — Cargo always resolves the + local copy regardless of the declared version number. + +### Version by Namespace for Public Contracts + +The project uses a **version by namespace** pattern +for public contracts — the REST API and configuration schema. Multiple +protocol/schema versions coexist in the same branch under versioned namespace +modules (`rest-api-protocol/src/v1/`, `configuration/src/v2_0_0/`). This is the +agreed approach; versioning via separate Git branches (branch-based versioning) +was considered and rejected for this project. + +From the issue spec's pros/cons analysis, the key reasons are: + +- Multiple API/config versions coexist during long migration periods without branch + management overhead. +- Consumer migration is incremental — old and new code coexist. +- Configuration schema migration scripts can read/write both old and new schemas. +- A single CI pipeline tests all supported versions together. +- hotfixes apply to all supported versions simultaneously without cherry-pick effort. + +### Why API Contract Packages Still Version Independently + +The REST API server, client, and protocol packages share a wire protocol, but they +still version independently in `Cargo.toml`: + +- The API contract version is tracked by the **`v1/` namespace**, not the `Cargo.toml` version. +- `Cargo.toml` versions are a **distribution/packaging concern** — they track the crate's + release history, not the API contract. +- A bugfix in the client's HTTP transport layer should not force a server version bump. +- The convention "major.minor should reflect the API contract; patches are independent" + is sufficient without mechanical enforcement. +- The crates.io dependency solver handles compatibility naturally via version constraints + in downstream `Cargo.toml` files. + +### Alternatives Considered + +#### A) Keep all crates on one shared workspace version (discarded) + +Why considered: minimal tooling complexity, very easy coordinated release process. + +Why discarded: over-couples unrelated packages and inflates churn; weak SemVer signal for +external consumers; conflicts with EPIC extraction goals and independent release cadence. + +#### B) Hybrid two-tier strategy (discarded) + +Why considered: appeared to balance coordination simplicity for tightly-coupled runtime +crates against independent evolution for utility crates. + +Why discarded: the linked-tier advantage is illusory — path dependencies already guarantee +compatibility within the workspace, so linked version numbers add no safety. Imposes a +guess about future coupling that may not hold. Adds unnecessary policy complexity over +the simple "all independent" approach. + +#### C) Link versions for API contract packages only (discarded) + +Why considered: the REST API server and client share a wire protocol — bumping the API +version on the server without a matching client bump would confuse consumers. + +Why discarded: the coupling is already handled by version by namespace (`v1/` modules); +the `Cargo.toml` version is a distribution concern, not a protocol version indicator. +Linking them would reintroduce unnecessary churn. See [Version by Namespace](#version-by-namespace-for-public-contracts) +for the full rationale. + +## Date + +2026-06-29 + +## References + +- Issue: [#1926](https://github.com/torrust/torrust-tracker/issues/1926) — Define package versioning strategy +- Issue spec: [`docs/issues/open/1926-1669-si-32-define-package-versioning-strategy.md`](../../docs/issues/open/1926-1669-si-32-define-package-versioning-strategy.md) +- EPIC: [#1669](https://github.com/torrust/torrust-tracker/issues/1669) — Overhaul: Packages +- ADR: [20260527175600](20260527175600_keep_protocol_and_domain_types_decoupled.md) — related ADR on protocol/domain decoupling diff --git a/docs/adrs/index.md b/docs/adrs/index.md index 77fb8b7e0..200a1d48a 100644 --- a/docs/adrs/index.md +++ b/docs/adrs/index.md @@ -22,6 +22,7 @@ semantic-links: | [20260617093046](20260617093046_reject_wildcard_external_ip.md) | 2026-06-17 | Reject wildcard IPs as invalid `external_ip` values | Reject `0.0.0.0`/`::` in `external_ip` config at startup, change default to `None`. Fail fast on invalid config. | | [20260620000000](20260620000000_add_ipv6_v6only_config_option.md) | 2026-06-20 | Add `ipv6_v6only` config option for separate sockets | Add `ipv6_v6only` boolean flag to `UdpTracker` and `HttpTracker` configs, defaulting to `false` (dual-stack), so operators can opt into separate IPv4/IPv6 sockets. | | [20260623200526](20260623200526_adopt_contract-first_architecture_for_rest_api.md) | 2026-06-23 | Adopt a contract-first architecture for the REST API | Structure the REST API into four layers: protocol contract, application/use-case, runtime adapter, and transport adapter. Enables a future tracker-agnostic REST API standard. | +| [20260629000000](20260629000000_adopt_independent_package_versioning.md) | 2026-06-29 | Adopt independent package versioning | All workspace packages version independently. Path dependencies guarantee compatibility, so linked versions are unnecessary. Enables per-package publishing and aligns with EPIC #1669 extraction goals. | ## ADR Lifecycle diff --git a/docs/issues/open/1669-overhaul-packages/DECISIONS.md b/docs/issues/open/1669-overhaul-packages/DECISIONS.md index bdc533fa2..1c59d2aea 100644 --- a/docs/issues/open/1669-overhaul-packages/DECISIONS.md +++ b/docs/issues/open/1669-overhaul-packages/DECISIONS.md @@ -20,6 +20,60 @@ the proposal, the reasoning, and a reference to any supporting artifact. --- +## DEC-16 — Adopt independent package versioning + +**Date**: 2026-06-29 +**Status**: Adopted +**Related issue**: [#1926](https://github.com/torrust/torrust-tracker/issues/1926) + +### Proposal considered + +All workspace packages previously shared a single lockstep version +(`version.workspace = true` → `3.0.0-develop`). Options evaluated: + +1. **Keep shared workspace version**: simplest coordination, but inflates SemVer churn + and gives weak signals to external consumers. +2. **Hybrid two-tier**: runtime crates keep a linked version, utility crates version + independently — imposes a guess about future coupling. +3. **Independent versioning for all packages** (chosen). + +### Alternative chosen + +Option 3: **All packages version independently**. Each package declares its own +`version` field, starting from their current value with an appropriate initial +release version. + +### Why this alternative was adopted + +1. **Path dependencies guarantee compatibility**: since all inter-package dependencies + use `path = "..."` within the workspace, Cargo always resolves the local copy + regardless of the declared version number. Linked versions add no safety. +2. **Accurate SemVer signals**: external consumers can infer change risk from version + numbers because each package's version reflects its own history. +3. **Avoids unnecessary churn**: a bugfix in one package no longer forces a version + bump on every unrelated package. +4. **Aligns with EPIC extraction goals**: packages moving to standalone repos already + version independently; this formalises the same approach for every package. +5. **Emergent coupling, not imposed coupling**: if packages naturally evolve together + over time, that coupling can be formalised later when there is evidence. + +### Trade-offs accepted + +- The release model splits into two concepts: tracker application release (existing + bundle process) and per-package publishing (new). Both must be documented. +- CI workflows must be updated to support per-package `workflow_dispatch` triggers. +- Contributors must consciously set version numbers per package rather than relying + on the workspace default. + +### Supporting artifacts + +- `docs/adrs/20260629000000_adopt_independent_package_versioning.md` — ADR documenting + the policy decision +- `docs/issues/open/1926-1669-si-32-define-package-versioning-strategy.md` — policy + definition issue + +--- + ## DEC-14 — Move `Driver` enum from `configuration` to `primitives` **Date**: 2026-06-18 @@ -358,10 +412,10 @@ For example: | Crate name | Folder | | --------------------------------------------- | ----------------------------- | -| `torrust-tracker-http-core` | `http-core` | -| `torrust-tracker-http-protocol` | `http-protocol` | -| `torrust-tracker-udp-core` | `udp-core` | -| `torrust-tracker-udp-protocol` | `udp-protocol` | +| `torrust-tracker-http-core` | `http-core` | +| `torrust-tracker-http-protocol` | `http-protocol` | +| `torrust-tracker-udp-core` | `udp-core` | +| `torrust-tracker-udp-protocol` | `udp-protocol` | | `torrust-tracker-primitives` | `primitives` | | `torrust-tracker-swarm-coordination-registry` | `swarm-coordination-registry` | @@ -770,8 +824,8 @@ crates controlled by Cargo features (`udp` and `http`, both disabled by default) | ---------------------------------- | ------------------------------------------------------------- | | `packages/udp-protocol` | _(removed)_ | | `packages/http-protocol` | _(removed)_ | -| `packages/udp-core` | _(removed)_ | -| `packages/http-core` | _(removed)_ | +| `packages/udp-core` | _(removed)_ | +| `packages/http-core` | _(removed)_ | | _(new)_ | `packages/protocol` | | `packages/tracker-core` (existing) | `packages/tracker-core` (expanded with `udp`/`http` features) | diff --git a/docs/issues/open/1669-overhaul-packages/EPIC.md b/docs/issues/open/1669-overhaul-packages/EPIC.md index df547e62a..5df4ceb13 100644 --- a/docs/issues/open/1669-overhaul-packages/EPIC.md +++ b/docs/issues/open/1669-overhaul-packages/EPIC.md @@ -15,7 +15,9 @@ semantic-links: - docs/issues/open/1669-overhaul-packages/ - docs/issues/open/1835-1669-14-decouple-http-protocol-from-tracker-primitives.md - docs/issues/open/1889-1669-21-migrate-from-bittorrent-primitives-to-torrust-info-hash.md + - docs/issues/open/1926-1669-si-32-define-package-versioning-strategy.md - docs/adrs/20260527175600_keep_protocol_and_domain_types_decoupled.md + - docs/adrs/20260629000000_adopt_independent_package_versioning.md - docs/adrs/index.md - docs/issues/open/1669-overhaul-packages/DECISIONS.md - AGENTS.md @@ -51,14 +53,17 @@ concerns are mixed together: evolution harder. Protocol packages (`udp-protocol`, `http-protocol`) also have high reuse potential but are intentionally kept in the tracker workspace — see the naming and ownership policy in the Decision Log (DEC-14). -- **Versioning policy is implicit**: all packages share the workspace version; packages - extracted to separate repos will need their own release cadence. +- **Versioning policy is now explicit**: ADR [20260629000000](../../adrs/20260629000000_adopt_independent_package_versioning.md) + establishes independent versioning for all workspace packages. See also issue + [#1926](https://github.com/torrust/torrust-tracker/issues/1926). - **Only 6 of originally 27 packages were published on crates.io** (as of May 2026); the remaining 21 packages were unpublished, in particular every `bittorrent-*` crate. As of June 2026, 4 more packages have been published from standalone repositories (`torrust-clock`, `torrust-located-error`, `torrust-metrics`, `torrust-net-primitives`), bringing the total published across the organisation to 10. Publishing them in-workspace conflicted with giving them independent versions; extraction resolved this tension. + ADR [20260629000000](../../adrs/20260629000000_adopt_independent_package_versioning.md) now + formalises independent versioning for all remaining workspace packages. The approach is not all-or-nothing. Each small extraction or structural improvement is a self-contained win. Re-evaluation happens naturally after each change, or when the package @@ -742,28 +747,18 @@ Decision criteria to apply per candidate: ### Versioning strategy for remaining packages -The proposed policy — to be confirmed in an ADR — is: - -- **Extracted packages** (destination repository): independent versioning from the day of - extraction. Each extracted package gets its own semver starting point. -- **`torrust-tracker-*` workspace packages**: remain on the shared workspace version. - These packages are tightly coupled to the tracker's server releases and should bump - together. Known exceptions that will version independently once extracted: - - `torrust-tracker-client` — CLI tool being extracted to its own repository. - - `torrust-located-error` — generic utility package, expected to version independently once - extracted. -- **`torrust-` workspace packages** (e.g., `torrust-server-lib`): currently follow the - workspace version but are not tightly bound to the tracker release cadence. Versioning - strategy for these should be reviewed when they are extracted or decoupled. -- **`bittorrent-*` packages**: independent versions once extracted. - -This policy needs a formal ADR before it is enforced. The key open question is: should any -`torrust-tracker-*` package be broken out of the shared workspace version before being -extracted to its own repository? - -Current intent (tracked in SI-15 draft) is to define the policy now but defer implementation -until boundary-refactor preconditions are met (at minimum SI-13 and SI-14), so version -migration does not run ahead of layer decoupling. +The adopted policy (confirmed in ADR [20260629000000](../../adrs/20260629000000_adopt_independent_package_versioning.md), +issue [#1926](https://github.com/torrust/torrust-tracker/issues/1926)) is: + +**All packages version independently.** Each package declares its own `version` field, +starting from their current value with an appropriate initial release version. + +Rationale: path dependencies guarantee compatibility within the workspace, so linked +versions add no safety. Independent versioning gives accurate SemVer signals to external +consumers and avoids unnecessary churn when only part of the workspace changes. + +See the ADR for full details, including the two-concept release model split +(tracker application release vs individual package publish). ### Extraction ordering: crates.io publication constraints diff --git a/docs/issues/open/1926-1669-si-32-define-package-versioning-strategy.md b/docs/issues/open/1926-1669-si-32-define-package-versioning-strategy.md index c72195e94..276b179ae 100644 --- a/docs/issues/open/1926-1669-si-32-define-package-versioning-strategy.md +++ b/docs/issues/open/1926-1669-si-32-define-package-versioning-strategy.md @@ -5,9 +5,9 @@ status: open priority: p1 github-issue: 1926 spec-path: docs/issues/open/1926-1669-si-32-define-package-versioning-strategy.md -branch: null +branch: 1926-1669-si-32-define-package-versioning-strategy related-pr: null -last-updated-utc: 2026-06-20 00:00 +last-updated-utc: 2026-06-29 12:00 semantic-links: skill-links: - create-issue @@ -15,26 +15,31 @@ semantic-links: - Cargo.toml - docs/issues/open/1669-overhaul-packages/EPIC.md - docs/issues/open/1669-overhaul-packages/DECISIONS.md + - docs/issues/open/1926-1669-si-32-review-phase-1.md - docs/packages.md - AGENTS.md + - docs/adrs/20260629000000_adopt_independent_package_versioning.md + - .github/workflows/deployment.yaml + - .github/workflows/deployment-packages.yaml + - docs/release_process.md --- -# Issue #1926 - Define package versioning strategy for EPIC #1669 +# Issue #1926 — Define and implement package versioning strategy for EPIC #1669 ## Goal Define an explicit and maintainable SemVer policy for workspace packages, replacing the implicit "everything shares one workspace version" rule with independent versioning -for every package. - -This issue defines policy only — actual version migration is deferred to a follow-up -implementation issue. +for every package — and implement all resulting changes (version migration, release process, +CI automation). This issue is a subissue of EPIC [#1669](../open/1669-overhaul-packages/EPIC.md) (Overhaul: Packages). +All work happens on a single branch and is merged together into `develop`. + ## Problem Statement Current state: @@ -73,7 +78,111 @@ Conclusion: (not `version.workspace = true`), starting from their current `3.0.0-develop` value with an appropriate initial release version. -Rationale: +### Four-Tier Versioning Model + +While all packages version independently, the workspace has four distinct **versioning semantics** +tiers. These describe **what a version bump signals** for external consumers — they do **not** +determine how publishing works. All publishable packages are published **independently** via +`deployment-packages.yaml` as they evolve. The tracker release (`deployment.yaml`) only +publishes the root `torrust-tracker` binary crate. + +| Tier | Description | What a version bump signals | Packages | +| ----------------------- | ----------------------------------------------- | ----------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **Tracker runtime** | Binary + tightly-coupled runtime crates | The tracker application behaviour or feature set changed | `torrust-tracker`, `tracker-core`, `udp-core`, `http-core`, `udp-server`, `axum-http-server`, `axum-server`, `axum-health-check-api-server`, `swarm-coordination-registry`, `tracker-client-lib`, `torrust-tracker-client` (console binary), `events`, `http-protocol`, `udp-protocol`, `primitives` | +| **API contract** | Packages sharing a wire protocol with consumers | The REST API or config schema changed | `rest-api-protocol`, `rest-api-client`, `axum-rest-api-server`, `rest-api-application`, `rest-api-runtime-adapter`, `rest-api-core`, `configuration` | +| **Platform/utility** | Generic reusable crates, test infrastructure | The crate's own library API changed | `test-helpers` | +| **Unpublished tooling** | Workspace members with no external consumers | Version changes only when internal API changes meaningfully | `e2e-tools`, `persistence-benchmark`, `torrent-repository-benchmarking`, `workspace-coupling` | + +> **Note on `torrust-tracker-client`** (console binary): this package is planned for extraction +> to a standalone repository (see +> [`docs/issues/drafts/1669-extract-torrust-tracker-client-to-standalone-repo.md`](../drafts/1669-extract-torrust-tracker-client-to-standalone-repo.md)). +> Key points: + +1. **All publishable workspace crates are published independently** via `deployment-packages.yaml` whenever a + crate's version changes. By the time a tracker release happens, all dependency crates are + already on crates.io — `deployment.yaml` only publishes `torrust-tracker` itself. + +2. **For API contract packages**, a major/minor bump should be coordinated across server and + client (a human convention, not a mechanical link or separate workflow). If you release + `axum-rest-api-server` v2.0.0, you should also bump `rest-api-client` to v2.0.0 and publish + it independently at the same time via `deployment-packages.yaml`. + +3. **`rest-api-protocol`** sits at the root of the REST API contract tree. Its version is + the canonical API version. Server and client implementations carry matching major.minor + as a convention. + +### Version by Namespace for Public Contracts + +> **Also known as**: **version by namespace convention** (the official term from ASP.NET API +> Versioning's `VersionByNamespaceConvention`), **namespace-based versioning**, **co-located +> versioning**. +> +> The opposite approach (separate Git branches per version) is called **branch-based versioning** +> or **version branches**. +> +> **Naming decision**: the project adopts **"version by namespace"** as the preferred term +> because it: +> +> - Has a direct, well-known analogue in the ASP.NET ecosystem (`VersionByNamespaceConvention`) +> - Describes exactly what we do (derive versions from namespace/directory names) +> - Is unambiguous ("in-code versioning" could be confused with runtime version negotiation) +> - Is concise enough for ADR titles and commit messages + +The project already uses a **version by namespace** pattern for public contracts. +Multiple versions of the same contract coexist in the codebase under versioned namespace modules: + +```text +# REST API — all versions live in the same repository +packages/rest-api-protocol/src/v1/ # protocol DTOs for API v1 +packages/rest-api-client/src/v1/ # client implementation for API v1 +packages/axum-rest-api-server/src/v1/ # server implementation for API v1 + +# Configuration schema — all versions live in the same repository +packages/configuration/src/v2_0_0/ # schema v2.0.0 +``` + +The latest version of `develop` and `main` defaults to the latest API/config version, +but the code for older versions is retained alongside. This was chosen over maintaining +separate Git branches per version because: + +**Pros of version by namespace:** + +- Multiple API versions coexist during long migration periods (consumers may take months + or years to migrate) +- Consumers can use multiple API versions simultaneously during incremental migration +- Configuration schema migrations can read/write both old and new schemas in the same + codebase, enabling zero-downtime schema migration scripts +- No branch management overhead (cherry-pick conflicts, stale branches, merge hell) +- CI always tests all supported versions together +- A single `develop` → `main` flow is easier to reason about + +**Cons of version by namespace:** + +- Source tree is larger (older versions accumulate) +- Removing an old version requires a deliberate code removal commit (not just branch deletion) +- Risk of accidental changes to old versions if tests are not careful +- Can encourage "keep everything forever" if there is no deprecation policy + +**Pros of Git-branch-per-version:** + +- Clean separation of concerns — each branch has only the code it needs +- Removing an old version is as simple as deleting a branch +- No risk of accidentally modifying old version code + +**Cons of Git-branch-per-version:** + +- Cherry-pick fixes across N active version branches is painful and error-prone +- Branches diverge over time — hotfixes may not apply cleanly +- Consumers on older versions cannot easily see what the new API looks like +- CI must be configured to test N branches instead of one +- Configuration schema migrations require two branches (or complex cross-branch coordination) + +**Decision**: version by namespace is the right approach for this project. The ability to +support long-lived parallel versions, seamless configuration migration, and a single +CI pipeline outweighs the source tree size cost. A deprecation policy should be +defined separately to prevent unbounded accumulation of old versions. + +### Rationale - Path dependencies make linked versions unnecessary — the workspace always resolves the local copy regardless of the declared version. @@ -89,21 +198,16 @@ independent versioning (e.g. `torrust-clock` 3.0.0, `torrust-metrics` 0.1.0, `torrust-net-primitives` 0.1.0). This issue formalises the same approach for every package in the workspace. -Out of scope for this policy issue: - -- Migration execution (changing `Cargo.toml` files) is out of scope — this issue - defines the policy only. -- Setting specific initial versions for each package — that is a follow-up - implementation concern. - ## Release Process Implications Independent versioning splits the current unified release model into two distinct concepts: -| Concept | Description | Cadence | -| ------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------- | -| **Tracker application release** | Root binary `torrust-tracker` + the tightly-coupled runtime crates (`tracker-core`, `udp-server`, `http-core`, `axum-*`, `configuration`, `primitives`, etc.) | Existing process: tag `releases/v*`, CI publishes the whole set as a bundle | -| **Individual package publish** | Any workspace crate published independently at its own cadence (e.g., `torrust-tracker-udp-protocol` unblocks the client extraction) | Per-package decision — no need to wait for a full tracker release | +| Concept | Description | Branch convention | Tag convention | CI | +| ------------------------------- | ------------------------------------------- | ------------------------------------- | ------------------------------------- | --------------------------------------------------------- | +| **Tracker application release** | Root binary `torrust-tracker` | `releases/v` | `v` (signed) | `deployment.yaml` triggered by `releases/v*` | +| **Individual package publish** | Any workspace crate published independently | `releases/pkg//v` | `pkg//v` (signed) | `deployment-packages.yaml` triggered by `releases/pkg/**` | + +The glob `releases/v*` does **not** match `releases/pkg/...` because `*` does not cross `/` boundaries in GitHub Actions pattern matching. This keeps triggers mutually exclusive. ### Why This Matters Now @@ -122,44 +226,101 @@ With independent versioning, each can be published with a single `cargo publish **`docs/release_process.md`**: -- Rename to "Tracker Application Release Process" (the existing workflow stays as one path). -- Add a second "Publishing an Individual Package" path documenting the per-package workflow. +- Split the current monolithic process into two sections: + - "Tracker Application Release" — the existing process, now publishing only `torrust-tracker`. + - "Publishing a Workspace Package" — the **primary** publishing path for all packages. + Includes branch/tag conventions, CI trigger, manual fallback, and a + [real-world example](../../release_process.md#real-world-example-a-full-release-cycle) showing how package + publishing works over a full release cycle. +- Remove stale crate entries from the tracker release checklist. **`.github/workflows/deployment.yaml`**: -- Remove crates that have been extracted to standalone repos (they publish from their own CI). -- Convert from one monolithic publish list to either: - - A reusable workflow that accepts a package name parameter, or - - A split into a "tracker release" workflow for the runtime bundle and individual `workflow_dispatch` triggers per package. -- Current stale entries (still listing extracted crates like `torrust-located-error`, `torrust-clock`, etc.) must be cleaned up in Phase 2. +- Refined to publish **only** `torrust-tracker` (the root binary crate). +- All dependency crates are published independently via `deployment-packages.yaml` before + the tracker release. -### What Does Not Change +**`.github/workflows/deployment-packages.yaml`**: -- The existing **tracker application release process** continues to work as before — tagged releases still publish the runtime bundle together. -- Path dependencies within the workspace are unaffected — Cargo always resolves the local copy. +- **Created** — the primary publishing path for all workspace packages. +- Trigger: `on.push.branches: "releases/pkg/**"` or `workflow_dispatch`. +- Extracts the package name from the branch ref and runs `cargo publish -p `. + +> **Design decision**: `deployment.yaml` publishes only the root binary crate. +> All publishable dependency crates are published independently via `deployment-packages.yaml` as they +> evolve. This avoids conflating versioning semantics (four-tier model) with publish +> mechanics (single workflow per package). -## Implementation Strategy +### GitHub Releases -### Phase 1 (this issue): policy definition only +GitHub Releases (with release notes, assets, etc.) are used **only for the tracker +application binary**. Workspace packages are published to crates.io only — they do not +get GitHub Releases. The crate's README and `Cargo.toml` metadata serve as their +documentation surface. -1. Define the policy contract: all packages version independently. -2. Create an ADR in `docs/adrs/` documenting the decision. -3. Document release process impact: - - What constitutes a "release" now (per-package vs unified). - - How per-package publishing works in CI. - - Update `docs/release_process.md`. - - Update `.github/workflows/deployment.yaml`. -4. Document in the EPIC and EPIC references the ADR. -5. Open a follow-up implementation issue for Phase 2 (version migration) - and another for release process automation changes. +### What Does Not Change -Phase 2 (follow-up implementation issue): +- The existing **tracker application release process** continues to work as before — tagged releases now publish only `torrust-tracker` (all dependency crates are independently published beforehand). +- Path dependencies within the workspace are unaffected — Cargo always resolves the local copy. -1. Remove `version.workspace = true` from all packages. -2. Set appropriate initial versions (likely `0.1.0` for unpublished tool crates, - matching existing releases for published ones). -3. Add CI checks to prevent reintroducing `version.workspace = true`. -4. Validate publish workflows for per-package versioning. +## Implementation + +The work is organised into three phases, all executed within this single branch. +Each phase produces its own commit(s). + +### Phase 1 — Policy Definition (already done) + +1. Define the policy contract: all packages version independently. ✓ +2. Create an ADR in `docs/adrs/` documenting the decision. ✓ +3. Update EPIC documentation with the ADR reference. ✓ + +### Phase 2 — Version Migration + +1. Remove `version.workspace = true` from all workspace `Cargo.toml` package manifests. + This includes: + - All packages under `packages/*/Cargo.toml` (24 crates) + - `console/tracker-client/Cargo.toml` — the console binary crate, planned for + extraction to a standalone repository (see + [`docs/issues/drafts/1669-extract-torrust-tracker-client-to-standalone-repo.md`](../drafts/1669-extract-torrust-tracker-client-to-standalone-repo.md)) + - `contrib/dev-tools/analysis/workspace-coupling/Cargo.toml` — the workspace + coupling analysis tool +2. Set appropriate initial versions for each package: + - `0.1.0` for unpublished tool crates (axum-\*, events, etc.). + - Matching existing published versions for crates already on crates.io. +3. Remove the `version` key from `[workspace.package]` in the root `Cargo.toml`. + The `torrust-tracker` binary crate gets its own explicit `version = "3.0.0-develop"` field. + The `[workspace.package]` section keeps all metadata fields (authors, description, + edition, etc.) but no longer carries a shared version for other packages to inherit. +4. Update all `version` fields in `[dependencies]` and `[dev-dependencies]` in the root + `Cargo.toml` to match each workspace package's new explicit version. Without this, + `cargo publish` for `torrust-tracker` would declare a wrong required version range + (e.g., `>= 3.0.0-develop` for a crate actually published as `0.1.0`), causing publish + failures. +5. Validate that `cargo publish -p ` (dry-run) succeeds for a representative + subset of packages. +6. Update package READMEs where they reference the shared version. + +### Phase 3 — Release Process and CI Automation + +1. Update `docs/release_process.md` with both release paths: + - "Tracker Application Release" — existing process, now publishes only `torrust-tracker`. + - "Publishing a Workspace Package" — the **primary** publishing path for all packages, + with branch/tag conventions, CI automation, manual fallback, and a real-world example. +2. Update `.github/workflows/deployment.yaml`: + - Refine trigger to `releases/v*` (tracker only). + - Reduce publish step to only `cargo publish -p torrust-tracker`. +3. Create `.github/workflows/deployment-packages.yaml`: + - Trigger: `releases/pkg/**` and `workflow_dispatch` (manual crate name input). + - Single publish job that extracts the crate name from branch name or input. + - Tests the specific crate before publishing. + - Add a `Verify explicit version` step that checks the crate has its own `version` + field (not `version.workspace = true`) before attempting to publish. This prevents + confusing Cargo errors if someone pushes a branch for a crate still using + `version.workspace = true`. +4. Document the branch and tag naming convention: + - Tracker: `releases/v` / `v`. + - Package: `releases/pkg//v` / `pkg//v`. +5. Verify that `releases/v*` does NOT match `releases/pkg/...` (glob safety). ## Alternatives Considered @@ -191,38 +352,96 @@ Why discarded: emergent coupling patterns drive future decisions. - Adds unnecessary policy complexity over the simple "all independent" approach. +### Alternative C - Link versions for API contract packages only (discarded) + +Why considered: + +- The REST API server and client share a wire protocol — bumping the API version + on the server without a matching client bump would confuse consumers. +- The same reasoning applies to configuration schema consumers. +- A "semi-independent" model seemed simpler than the three-tier model above. + +Why discarded: + +- The coupling is already handled by **version by namespace** (the `v1/` modules): + the server and client both implement `v1` of the protocol. They are always in + sync because they live in the same branch at the same protocol version. +- The `Cargo.toml` version is a **distribution/packaging concern**, not a protocol + version indicator. The protocol version is tracked by the `v1/` namespace. +- Linking `Cargo.toml` versions across API packages would reintroduce the same + churn problem that independent versioning solves: a bugfix in the client's HTTP + transport layer would force a version bump on the server crate. +- The convention "major.minor tracks the API contract; patches are independent" is + sufficient without mechanical enforcement. If the `cargo publish` workflow for + the REST API server bumps its version, it's a human responsibility to also bump + the client if the API contract changed. +- Proving that linking is unnecessary: if `axum-rest-api-server` v2.1.0 adds a new + endpoint and `rest-api-client` v2.0.3 doesn't support it yet, the consumer simply + knows they need client ≥ v2.1.0 — the crates.io solver handles this naturally via + version constraints. No mechanical link needed. + +### Alternative D - Automated CI check to prevent `version.workspace = true` regression (discarded) + +Why considered: + +- A CI check could catch accidental reintroduction of `version.workspace = true` + in a crate's `Cargo.toml` before a publish attempt. +- Would provide a clear error message instead of a confusing Cargo failure. + +Why discarded: + +- The existing `deployment-packages.yaml` already has a `Verify explicit version` + step that catches this before publishing — the check was moved to the point of + use (the publish workflow) rather than a standalone CI gate. +- Adding a separate CI check on every `push`/`pull_request` would add noise for + little benefit: the publish workflow check is sufficient. +- Pre-commit hooks are team-local and cannot be enforced in CI without duplicating + the publish workflow logic. +- If a crate accidentally uses `version.workspace = true`, it will be caught at + publish time with a clear message. No intermediate gate needed. + ## Scope ### In Scope -- Define and document the independent versioning policy. -- Document the rationale (path deps make linked versions unnecessary). -- Create an ADR documenting the policy decision for permanent reference in `docs/adrs/`. -- Update EPIC documentation with the adopted proposal once approved. -- Open a follow-up implementation issue for Phase 2 (execution). -- Document required changes to the release process and deployment CI to support - per-package publishing (affects `docs/release_process.md` and - `.github/workflows/deployment.yaml`). +- Define and document the independent versioning policy. ✓ +- Create an ADR documenting the policy decision for permanent reference in `docs/adrs/`. ✓ +- Update EPIC documentation with the ADR reference. ✓ +- Remove `version.workspace = true` from all workspace `Cargo.toml` package manifests. ✓ +- Set appropriate initial versions for each package. ✓ +- Remove `version` from `[workspace.package]` in root `Cargo.toml` (tracker crate gets its own). ✓ +- Add CI checks to prevent reintroducing `version.workspace = true`. (Discarded — see Alternative D) +- Split `docs/release_process.md` into two release paths (tracker + packages). ✓ +- Refine `.github/workflows/deployment.yaml` trigger and publish list. ✓ +- Create `.github/workflows/deployment-packages.yaml`. ✓ ### Out of Scope -- Migrating any package to independent versions — that is a follow-up - implementation issue. -- Setting specific initial versions for each package. -- Publishing extracted crates in external repositories. -- Renaming packages as part of this policy issue. +- Publishing any crate to crates.io (that is the release process itself). +- Renaming packages or restructuring the workspace. +- Changes to packages extracted to standalone repositories (they publish from their own CI). ## Acceptance Criteria -- [ ] The policy explicitly states that all packages version independently. -- [ ] The rationale explains why linked versions are unnecessary (path deps guarantee compatibility). -- [ ] An ADR is created in `docs/adrs/` documenting the independent versioning decision. -- [ ] ADR is linked from EPIC #1669 documentation. -- [ ] At least two alternatives are documented with discard reasons. -- [ ] EPIC #1669 references the approved versioning policy. -- [ ] Release process impact is documented in this spec and a follow-up issue is opened for execution. -- [ ] Deployment CI impact is documented in this spec and a follow-up issue is opened for execution. -- [ ] A follow-up implementation issue is opened for Phase 2 (version migration). +- [x] The policy explicitly states that all packages version independently. +- [x] The rationale explains why linked versions are unnecessary (path deps guarantee compatibility). +- [x] An ADR is created in `docs/adrs/` documenting the independent versioning decision. +- [x] ADR is linked from EPIC #1669 documentation. +- [x] At least two alternatives are documented with discard reasons. +- [x] EPIC #1669 references the approved versioning policy. +- [x] No package uses `version.workspace = true`. +- [x] Each package has an explicit `version` field appropriate to its maturity and publication status. +- [x] `[workspace.package]` in root `Cargo.toml` no longer has a `version` key. + `torrust-tracker` has its own explicit `version` field. +- [x] All `version` fields in root `Cargo.toml` `[dependencies]` and `[dev-dependencies]` match + each package's new explicit version. +- [ ] `cargo publish -p ` (dry-run) succeeds for representative packages. +- [x] All existing tests and linters pass. +- [x] `docs/release_process.md` documents both publishing paths (tracker release + per-package). +- [x] `.github/workflows/deployment.yaml` no longer lists extracted crates. +- [x] `.github/workflows/deployment-packages.yaml` is created and documents the package release path. +- [x] Crate dependency publish order is documented (or validated by CI). +- [x] Branch/tag naming conventions are documented and verified to not conflict. ## Verification Plan @@ -244,5 +463,69 @@ Why discarded: - EPIC: [docs/issues/open/1669-overhaul-packages/EPIC.md](../open/1669-overhaul-packages/EPIC.md) - Decisions: [docs/issues/open/1669-overhaul-packages/DECISIONS.md](../open/1669-overhaul-packages/DECISIONS.md) +- ADR: [docs/adrs/20260629000000_adopt_independent_package_versioning.md](../../adrs/20260629000000_adopt_independent_package_versioning.md) - Workspace manifest: [Cargo.toml](../../../Cargo.toml) - Package catalog: [docs/packages.md](../../packages.md) +- Tracker release workflow: [.github/workflows/deployment.yaml](../../../.github/workflows/deployment.yaml) +- Package release workflow: [.github/workflows/deployment-packages.yaml](../../../.github/workflows/deployment-packages.yaml) +- Release process: [docs/release_process.md](../../release_process.md) + +## Appendix A — Version Assignment Table + +Crates.io status verified 2026-06-29. This table is the authoritative source for +Phase 2 version migration. + +### Published on crates.io (carry forward existing version) + +| Package | Crate Name | crates.io Version | Proposed Initial Version | +| ------------------------------- | ------------------------------- | ----------------- | ----------------------------------- | +| `torrust-tracker` (root binary) | `torrust-tracker` | `3.0.0` | `3.0.0-develop` (retain dev suffix) | +| `primitives` | `torrust-tracker-primitives` | `3.0.0` | `3.0.0` | +| `configuration` | `torrust-tracker-configuration` | `3.0.0` | `3.0.0` | +| `test-helpers` | `torrust-tracker-test-helpers` | `3.0.0` | `3.0.0` | + +### Extracted to standalone repos (not in workspace — out of scope) + +| Package | Crate Name | crates.io Version | Repository | +| ---------------- | ------------------------ | ----------------- | -------------------------------- | +| `clock` | `torrust-clock` | `3.0.0` | `torrust/torrust-clock` | +| `located-error` | `torrust-located-error` | `3.0.0` | `torrust/torrust-located-error` | +| `metrics` | `torrust-metrics` | `0.1.0` | `torrust/torrust-metrics` | +| `net-primitives` | `torrust-net-primitives` | `0.1.0` | `torrust/torrust-net-primitives` | +| `server-lib` | `torrust-server-lib` | `0.1.0` | `torrust/torrust-server-lib` | + +### Not on crates.io (unpublished — initial version `0.1.0`) + +| Package | Crate Name | Tier | +| ------------------------------------------------------------ | ------------------------------------------------- | -------------------------------------- | +| `tracker-core` | `torrust-tracker-core` | Tracker runtime | +| `udp-core` | `torrust-tracker-udp-core` | Tracker runtime | +| `http-core` | `torrust-tracker-http-core` | Tracker runtime | +| `udp-server` | `torrust-tracker-udp-server` | Tracker runtime | +| `udp-protocol` | `torrust-tracker-udp-protocol` | Tracker runtime | +| `http-protocol` | `torrust-tracker-http-protocol` | Tracker runtime | +| `events` | `torrust-tracker-events` | Tracker runtime | +| `swarm-coordination-registry` | `torrust-tracker-swarm-coordination-registry` | Tracker runtime | +| `axum-health-check-api-server` | `torrust-tracker-axum-health-check-api-server` | Tracker runtime | +| `axum-http-server` | `torrust-tracker-axum-http-server` | Tracker runtime | +| `axum-server` | `torrust-tracker-axum-server` | Tracker runtime | +| `tracker-client` (lib, `packages/tracker-client/`) | `torrust-tracker-client-lib` | Tracker runtime | +| `tracker-client` (console binary, `console/tracker-client/`) | `torrust-tracker-client` | Tracker runtime (extraction candidate) | +| `rest-api-protocol` | `torrust-tracker-rest-api-protocol` | API contract | +| `rest-api-core` | `torrust-tracker-rest-api-core` | API contract | +| `rest-api-client` | `torrust-tracker-rest-api-client` | API contract | +| `rest-api-application` | `torrust-tracker-rest-api-application` | API contract | +| `rest-api-runtime-adapter` | `torrust-tracker-rest-api-runtime-adapter` | API contract | +| `axum-rest-api-server` | `torrust-tracker-axum-rest-api-server` | API contract | +| `e2e-tools` | `torrust-tracker-e2e-tools` | Unpublished tooling | +| `persistence-benchmark` | `torrust-tracker-persistence-benchmark` | Unpublished tooling | +| `torrent-repository-benchmarking` | `torrust-tracker-torrent-repository-benchmarking` | Unpublished tooling | +| `workspace-coupling` (contrib) | `torrust-tracker-workspace-coupling` | Unpublished tooling | + +**Summary**: 4 crates keep `3.0.0`, 23 crates start at `0.1.0`, the root binary +keeps `3.0.0-develop`. 5 extracted crates are out of scope. + +> **Publishability**: The "Unpublished tooling" tier crates (`e2e-tools`, +> `persistence-benchmark`, `torrent-repository-benchmarking`, `workspace-coupling`) are internal +> testing, benchmarking, and analysis tools with no external consumers. They are never published to +> crates.io. All other workspace crates are publishable via `deployment-packages.yaml`. diff --git a/docs/release_process.md b/docs/release_process.md index dc712f565..f24f55128 100644 --- a/docs/release_process.md +++ b/docs/release_process.md @@ -5,11 +5,20 @@ semantic-links: related-artifacts: - docs/index.md - .github/workflows/deployment.yaml + - .github/workflows/deployment-packages.yaml - Cargo.toml + - docs/adrs/20260629000000_adopt_independent_package_versioning.md --- # Torrust Tracker Release Process (v2.2.2) +> **Per-package versioning policy**: as of ADR [20260629000000](adrs/20260629000000_adopt_independent_package_versioning.md), +> all publishable workspace packages version **and are published** independently. +> The tracker application release process below publishes only +> `torrust-tracker` (the root binary crate). All dependency crates are published +> via `deployment-packages.yaml` as they evolve throughout the development cycle. +> For details, see [Publishing a Workspace Package](#publishing-a-workspace-package). + ## Version > **The `[semantic version]` is bumped according to releases, new features, and breaking changes.** @@ -77,15 +86,11 @@ git tag --sign v[semantic version] git push --tags torrust ``` -Make sure the [deployment](https://github.com/torrust/torrust-tracker/actions/workflows/deployment.yaml) workflow was successfully executed and the new version for the following crates were published: +Make sure the [deployment](https://github.com/torrust/torrust-tracker/actions/workflows/deployment.yaml) workflow was successfully executed and the new version for the `torrust-tracker` binary crate was published on [crates.io](https://crates.io/crates/torrust-tracker). -- [torrust-located-error](https://crates.io/crates/torrust-located-error) -- [torrust-tracker-primitives](https://crates.io/crates/torrust-tracker-primitives) -- [torrust-clock](https://crates.io/crates/torrust-clock) -- [torrust-tracker-configuration](https://crates.io/crates/torrust-tracker-configuration) -- [torrust-tracker-torrent-repository](https://crates.io/crates/torrust-tracker-torrent-repository) -- [torrust-tracker-test-helpers](https://crates.io/crates/torrust-tracker-test-helpers) -- [torrust-tracker](https://crates.io/crates/torrust-tracker) +All dependency crates are published independently via +`deployment-packages.yaml` as they evolve throughout the release cycle — +they should already be on crates.io by this point. ### 7. Create Release on Github from Tag @@ -117,3 +122,158 @@ git push torrust Pull request title format: "Version `[semantic version]` was Released". This pull request merges the new release into the `develop` branch and bumps the version number. + +## Publishing a Workspace Package + +With independent package versioning, any workspace crate can be published at its own cadence +without waiting for a full tracker release. + +> **Important**: all workspace packages are published **independently** via +> `deployment-packages.yaml` as they evolve throughout the development cycle. +> By the time a tracker release happens, all dependency crates are already on +> crates.io — the tracker release workflow only publishes `torrust-tracker` +> itself. See [Real-World Example](#real-world-example-a-full-release-cycle) below. + +### Branch and Tag Conventions + +| Concept | Convention | Example | +| -------------- | ------------------------------------- | -------------------------------------------------- | +| Release branch | `releases/pkg//v` | `releases/pkg/torrust-tracker-udp-protocol/v0.2.0` | +| Release tag | `pkg//v` (signed) | `pkg/torrust-tracker-udp-protocol/v0.2.0` | + +Pushing a branch matching `releases/pkg/**` triggers the CI workflow +`deployment-packages.yaml`, which publishes the package to crates.io. + +### When to Publish Independently + +Whenever a workspace crate's version changes. Examples: + +- You fixed a bug in `torrust-tracker-core` and bumped it from v0.3.0 to v0.3.1. +- You added a new endpoint in `torrust-tracker-rest-api-protocol` and bumped it to v0.4.0. +- You need to publish a crate for the first time (initial release). +- You need to publish a crate for extraction to a standalone repository. + +### Automated Workflow (primary path) + +1. Ensure the package has its own explicit `version` field (not `version.workspace = true`). +2. Verify the package builds and passes tests: + + ```sh + cargo test -p + ``` + +3. Create the release branch from `develop`: + + ```sh + git fetch --all + git push torrust develop:releases/pkg//v + ``` + +4. CI (`deployment-packages.yaml`) runs tests and publishes to crates.io automatically. +5. Once successful, create the signed tag: + + ```sh + git fetch --all + git push torrust torrust/main:pkg//v # fast-forward tag branch + git tag --sign pkg//v # or tag from any reachable commit + git push --tags torrust + ``` + +6. Update the `version` field in the workspace root `Cargo.toml` dependency entry for + the published crate (e.g., from `3.0.0-develop` to `0.1.0`). Do **not** remove the + `path = "..."` — it ensures workspace builds always use the local copy regardless + of the published version. + +### Manual Fallback + +If CI is unavailable or you need to publish without creating a Git reference: + +1. Ensure the package has its own explicit `version` field. +2. Verify the package builds and passes tests: + + ```sh + cargo test -p + ``` + +3. Perform a dry-run publish: + + ```sh + cargo publish -p --dry-run + ``` + +4. Publish: + + ```sh + cargo publish -p + ``` + +> **Note on dependency order**: if the package has workspace-internal dependencies that are +> not yet published, publish them first. The workspace root `Cargo.toml` documents the +> dependency graph. + +### Real-World Example: A Full Release Cycle + +This example shows how independent package publishing works in practice over a typical +release cycle, from development through tracker release. + +#### Starting Point + +Workspace has three packages: + +- `torrust-tracker-primitives` v0.1.0 (published) +- `torrust-tracker-core` v0.2.0 (published, depends on `primitives`) +- `torrust-tracker` v3.0.0-develop (unpublished, depends on both) + +The tracker binary `v3.0.0-develop` references `primitives 0.1.0` and `core 0.2.0` +via `path = "..."` in the workspace. + +#### Week 1 — Bugfix in `primitives` + +A bug is discovered in `torrust-tracker-primitives`. Fix is merged to `develop`, +version bumped to `0.1.1`. + +```sh +# Publish independently — no need to wait for tracker release +git push torrust develop:releases/pkg/torrust-tracker-primitives/v0.1.1 +# CI publishes v0.1.1 to crates.io +git tag --sign pkg/torrust-tracker-primitives/v0.1.1 && git push --tags torrust +``` + +External consumers can now use `primitives 0.1.1`. The tracker still uses the +`path` dependency, so it gets the fix automatically. + +#### Week 3 — New feature in `core` + +A new API is added to `torrust-tracker-core`. Version bumped to `0.3.0`. + +```sh +git push torrust develop:releases/pkg/torrust-tracker-core/v0.3.0 +# CI publishes v0.3.0 to crates.io +git tag --sign pkg/torrust-tracker-core/v0.3.0 && git push --tags torrust +``` + +External consumers of `core` can now use the new feature. The tracker workspace +still uses the local `path` dependency. + +#### Week 5 — Tracker release + +The release commit bumps the tracker version from `3.0.0-develop` to `3.0.0`. + +```sh +# Create release branch — only publishes torrust-tracker itself +git push torrust main:releases/v3.0.0 +# CI publishes only torrust-tracker v3.0.0 +# primitives 0.1.1 and core 0.3.0 are already on crates.io +``` + +**Key observation**: the tracker release did NOT need to publish `primitives` or `core`. +They were already on crates.io from weeks 1 and 3. The tracker release only published +one crate: `torrust-tracker` itself. + +#### Why This Matters + +- Each crate's version history reflects its own changes (accurate SemVer signals). +- No unnecessary version bumps on unrelated crates. +- External consumers get fixes and features immediately, not whenever the next + tracker release happens. +- The tracker release is a lightweight final step, not a batch bottleneck. diff --git a/project-words.txt b/project-words.txt index 9196fd97e..641ceee3b 100644 --- a/project-words.txt +++ b/project-words.txt @@ -116,6 +116,7 @@ epoll eprint eprintln Eray +esac eventfd exploitability fastrand @@ -156,6 +157,7 @@ hexdigit hexlify hlocalhost hmac +hotfixes hotspot hotspots httpclientpeerid @@ -266,6 +268,7 @@ opentrackers optimisation optimisations organisation +organised ostr overengineered Pando @@ -290,6 +293,7 @@ programatik proot proto PRRT +Publishability PUID qbittorrent QJSF From b24149fc1eae884af97884f6c3ba91cc185c7c62 Mon Sep 17 00:00:00 2001 From: Jose Celano Date: Wed, 1 Jul 2026 08:20:46 +0100 Subject: [PATCH 2/3] feat(workspace): migrate all packages to independent versions Remove version.workspace = true from all 26 workspace Cargo.toml manifests and set explicit versions per the approved version assignment table (Appendix A in issue spec). Key changes: - Root torrust-tracker binary: 3.0.0-develop - Published crates (4): 3.0.0 (primitives, configuration, test-helpers) - Unpublished crates (23): 0.1.0 - Removed version from [workspace.package] - Updated all inter-package dependency version references - Set publish = false for unpublished tooling crates - Regenerated Cargo.lock for consistency --- Cargo.lock | 486 ++++++------------ Cargo.toml | 35 +- console/tracker-client/Cargo.toml | 6 +- .../analysis/workspace-coupling/Cargo.toml | 2 +- .../axum-health-check-api-server/Cargo.toml | 16 +- packages/axum-http-server/Cargo.toml | 18 +- packages/axum-rest-api-server/Cargo.toml | 30 +- packages/axum-server/Cargo.toml | 4 +- packages/configuration/Cargo.toml | 4 +- packages/e2e-tools/Cargo.toml | 2 +- packages/events/Cargo.toml | 2 +- packages/http-core/Cargo.toml | 16 +- packages/http-protocol/Cargo.toml | 2 +- packages/persistence-benchmark/Cargo.toml | 8 +- packages/primitives/Cargo.toml | 2 +- packages/rest-api-application/Cargo.toml | 6 +- packages/rest-api-client/Cargo.toml | 4 +- packages/rest-api-protocol/Cargo.toml | 2 +- packages/rest-api-runtime-adapter/Cargo.toml | 20 +- .../swarm-coordination-registry/Cargo.toml | 6 +- packages/test-helpers/Cargo.toml | 4 +- .../Cargo.toml | 6 +- packages/tracker-client/Cargo.toml | 6 +- packages/tracker-core/Cargo.toml | 12 +- packages/udp-core/Cargo.toml | 14 +- packages/udp-protocol/Cargo.toml | 2 +- packages/udp-server/Cargo.toml | 20 +- 27 files changed, 294 insertions(+), 441 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7c027819e..c19292bcc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -25,9 +25,9 @@ checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" [[package]] name = "alloc-stdlib" -version = "0.2.2" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" +checksum = "0e76a019e91224d279006ff972f1e984179a6e9feb050adba6ce8274aef23195" dependencies = [ "alloc-no-stdlib", ] @@ -114,30 +114,30 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.102" +version = "1.0.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" +checksum = "2a4385e2e34eb35d6b3efe798b9eb88096925d87726c0798709bf56d9ed84af3" [[package]] name = "arc-swap" -version = "1.9.1" +version = "1.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a3a1fd6f75306b68087b831f025c712524bcb19aad54e557b1129cfa0a2b207" +checksum = "c049c0be4daef0b145cb3555416b3b8ef5b7888a38aea1a3a155801fe7b0810b" dependencies = [ "rustversion", ] [[package]] name = "astral-tokio-tar" -version = "0.6.2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb50a7aae84a03bf55b067832bc376f4961b790c97e64d3eacee97d389b90277" +checksum = "08648fef353ab39a9d26f909ad53fc4f071be4c91853b78523f5cc3d9e5ebffd" dependencies = [ - "filetime", "futures-core", "libc", "portable-atomic", "rustc-hash", + "rustix 0.38.44", "tokio", "tokio-stream", "xattr", @@ -426,9 +426,9 @@ dependencies = [ [[package]] name = "block-buffer" -version = "0.12.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdd35008169921d80bc60d3d0ab416eecb028c4cd653352907921d95084790be" +checksum = "d2f6c7dbe95a6ed67ad9f18e57daf93a2f034c524b99fd2b76d18fdfeb6660aa" dependencies = [ "hybrid-array", ] @@ -528,9 +528,9 @@ dependencies = [ [[package]] name = "brotli" -version = "8.0.3" +version = "8.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8119e4516436f5708bbc474a9d395bf12f1b5395e93a92a56e647ac3388c8610" +checksum = "5cc91aac060a7a1e25823bdccbfb6af1875b88f17c6daac97894eed8207166b3" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -539,9 +539,9 @@ dependencies = [ [[package]] name = "brotli-decompressor" -version = "5.0.1" +version = "5.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5962523e1b92ce1b5e793d9169b9943eece10d39f62550bc04bb605d75b94924" +checksum = "3a32acac15fe1967bc3986b2a6347dffc965602354ea6f450ad07e8bfd253583" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -576,9 +576,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.11.1" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" +checksum = "8ae3f5d315924270530207e2a68396c3cc547f6dca3fbdca317cfb1a51edb593" [[package]] name = "camino" @@ -606,9 +606,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.63" +version = "1.2.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "556e016178bb5662a08681bbe0f00f8e17631781a4dfc8c45e466e4b185ec27f" +checksum = "e228eec9be7c17ccb640b59b36a5cd805ea2a564a4c5e162c2f659fea30d3b96" dependencies = [ "find-msvc-tools", "jobserver", @@ -630,9 +630,9 @@ checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] name = "chacha20" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f8d983286843e49675a4b7a2d174efe136dc93a18d69130dd18198a6c167601" +checksum = "d524456ba66e72eb8b115ff89e01e497f8e6d11d78b70b1aa13c0fbd97540a81" dependencies = [ "cfg-if", "cpufeatures 0.3.0", @@ -1143,7 +1143,6 @@ version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" dependencies = [ - "powerfmt", "serde_core", ] @@ -1246,7 +1245,7 @@ version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1dd6dbb5841937940781866fa1281a1ff7bd3bf827091440879f9994983d5c2" dependencies = [ - "block-buffer 0.12.0", + "block-buffer 0.12.1", "const-oid 0.10.2", "crypto-common 0.2.2", "ctutils", @@ -1318,9 +1317,9 @@ dependencies = [ [[package]] name = "env_filter" -version = "1.0.1" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32e90c2accc4b07a8456ea0debdc2e7587bdd890680d71173a15d4ae604f6eef" +checksum = "900d271a03799a1ee8d1ca9b19893b48ca674a9284fefcfb85f05e74ed314217" dependencies = [ "log", "regex", @@ -1328,9 +1327,9 @@ dependencies = [ [[package]] name = "env_logger" -version = "0.11.10" +version = "0.11.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0621c04f2196ac3f488dd583365b9c09be011a4ab8b9f37248ffcc8f6198b56a" +checksum = "de671bd27a75a797dc9ae289ba1e77276e75e2026408aab65185384e2d5cd3f6" dependencies = [ "env_filter", "log", @@ -1417,16 +1416,6 @@ dependencies = [ "version_check", ] -[[package]] -name = "filetime" -version = "0.2.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c287a33c7f0a620c38e641e7f60827713987b3c0f26e8ddc9462cc69cf75759" -dependencies = [ - "cfg-if", - "libc", -] - [[package]] name = "find-msvc-tools" version = "0.1.9" @@ -1669,25 +1658,22 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555" +checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" dependencies = [ "cfg-if", "libc", "r-efi 6.0.0", "rand_core 0.10.1", - "wasip2", - "wasip3", ] [[package]] name = "getset" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf0fc11e47561d47397154977bc219f4cf809b2974facc3ccb3b89e2436f912" +checksum = "6cf442baaabe4213ce7d1239afc26c039180b6456da2cededa316ae2c8a77a77" dependencies = [ - "proc-macro-error2", "proc-macro2", "quote", "syn", @@ -1701,9 +1687,9 @@ checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" [[package]] name = "h2" -version = "0.4.14" +version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "171fefbc92fe4a4de27e0698d6a5b392d6a0e333506bc49133760b3bcf948733" +checksum = "6cb093c84e8bd9b188d4c4a8cb6579fc016968d14c99882163cd3ff402a4f155" dependencies = [ "atomic-waker", "bytes", @@ -1868,9 +1854,9 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hybrid-array" -version = "0.4.12" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9155a582abd142abc056962c29e3ce5ff2ad5469f4246b537ed42c5deba857da" +checksum = "818356c5132c1fede50f837ca96afbe78ff42413047f4abb886217845e1b6c8c" dependencies = [ "typenum", ] @@ -2086,12 +2072,6 @@ dependencies = [ "zerovec", ] -[[package]] -name = "id-arena" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" - [[package]] name = "ident_case" version = "1.0.1" @@ -2274,9 +2254,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.100" +version = "0.3.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2025f20d7a4fa7785846e7b63d10a76d3f1cee98ee5cb79ea59703f95e42162" +checksum = "53b44bfcdb3f8d5837a46dae1ca9660a837176eee74a28b229bc626816589102" dependencies = [ "cfg-if", "futures-util", @@ -2292,12 +2272,6 @@ dependencies = [ "spin", ] -[[package]] -name = "leb128fmt" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" - [[package]] name = "libc" version = "0.2.186" @@ -2333,6 +2307,12 @@ dependencies = [ "vcpkg", ] +[[package]] +name = "linux-raw-sys" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" + [[package]] name = "linux-raw-sys" version = "0.12.1" @@ -2367,9 +2347,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.32" +version = "0.4.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "953f07c43838f8e6f9758cab68bf5bed85465e7587ebe0b823f1bcd81978ad3a" +checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad" [[package]] name = "lru-slab" @@ -2395,9 +2375,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.8.1" +version = "2.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b947ae49db0d222b1dbc6b113ce7248a3fc3a6ca21b696717bfc000ba4484d8" +checksum = "88904434abc2901f197fe8cc55f0445e7ded921dba5911dad2e2b39b48e663c4" [[package]] name = "mime" @@ -2438,9 +2418,9 @@ dependencies = [ [[package]] name = "mockall" -version = "0.14.0" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f58d964098a5f9c6b63d0798e5372fd04708193510a7af313c22e9f29b7b620b" +checksum = "1a6ceddfe3ce334925e96bf420fdb2dcee5bed6c632a168ece622676dadeaf8a" dependencies = [ "cfg-if", "downcast", @@ -2452,9 +2432,9 @@ dependencies = [ [[package]] name = "mockall_derive" -version = "0.14.0" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca41ce716dda6a9be188b385aa78ee5260fc25cd3802cb2a8afdc6afbe6b6dbf" +checksum = "9cfe16fbe8a314aeec0b861ac24e60b1e123e97634bab045475b9d6a18416fd8" dependencies = [ "cfg-if", "proc-macro2", @@ -2659,9 +2639,9 @@ dependencies = [ [[package]] name = "openssl" -version = "0.10.80" +version = "0.10.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a45fa2aa886c42762255da344f0a0d313e254066c46aad76f300c3d3da62d967" +checksum = "77823a27f0babb03091cb9ed9ef80af3b39dbc82f97e8fa530374b7dafd87a45" dependencies = [ "bitflags", "cfg-if", @@ -2690,9 +2670,9 @@ checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" [[package]] name = "openssl-sys" -version = "0.9.116" +version = "0.9.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f28a22dc7140cda5f096e5e7724a6962ca81a7f8bfd2979f9b18c11af56318c4" +checksum = "b47e7e6bb2c38cd930d25a23b40fa52e068c10e85f3e03a7f5ba5aaca5713695" dependencies = [ "cc", "libc", @@ -3055,16 +3035,6 @@ dependencies = [ "yansi", ] -[[package]] -name = "prettyplease" -version = "0.2.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" -dependencies = [ - "proc-macro2", - "syn", -] - [[package]] name = "proc-macro-crate" version = "3.5.0" @@ -3074,28 +3044,6 @@ dependencies = [ "toml_edit 0.25.12+spec-1.1.0", ] -[[package]] -name = "proc-macro-error-attr2" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" -dependencies = [ - "proc-macro2", - "quote", -] - -[[package]] -name = "proc-macro-error2" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" -dependencies = [ - "proc-macro-error-attr2", - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "proc-macro2" version = "1.0.106" @@ -3174,9 +3122,9 @@ dependencies = [ [[package]] name = "quinn" -version = "0.11.9" +version = "0.11.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" +checksum = "0c1a41e437b6bbd489372cd4971de128e85c855f56c57f283d20ff016cf7c0a8" dependencies = [ "bytes", "cfg_aliases", @@ -3194,9 +3142,9 @@ dependencies = [ [[package]] name = "quinn-proto" -version = "0.11.14" +version = "0.11.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "434b42fec591c96ef50e21e886936e66d3cc3f737104fdb9b737c40ffb94c098" +checksum = "4fcb935c5bec503c2f0e306bdd3e58bb9029dcb14fa8d9ac76e3a5256ac0763e" dependencies = [ "aws-lc-rs", "bytes", @@ -3230,9 +3178,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.45" +version = "1.0.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" +checksum = "dfbc457d0c7a0759a614551b11a6409e5951f6c7537be1f1b7682b9ae9230368" dependencies = [ "proc-macro2", ] @@ -3277,7 +3225,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2e8e8bcc7961af1fdac401278c6a831614941f6164ee3bf4ce61b7edb162207" dependencies = [ "chacha20", - "getrandom 0.4.2", + "getrandom 0.4.3", "rand_core 0.10.1", ] @@ -3453,7 +3401,7 @@ dependencies = [ "tokio", "tokio-rustls", "tower", - "tower-http", + "tower-http 0.6.11", "tower-service", "url", "wasm-bindgen", @@ -3556,6 +3504,19 @@ dependencies = [ "semver", ] +[[package]] +name = "rustix" +version = "0.38.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" +dependencies = [ + "bitflags", + "errno", + "libc", + "linux-raw-sys 0.4.15", + "windows-sys 0.59.0", +] + [[package]] name = "rustix" version = "1.1.4" @@ -3565,15 +3526,15 @@ dependencies = [ "bitflags", "errno", "libc", - "linux-raw-sys", + "linux-raw-sys 0.12.1", "windows-sys 0.61.2", ] [[package]] name = "rustls" -version = "0.23.40" +version = "0.23.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef86cd5876211988985292b91c96a8f2d298df24e75989a43a3c73f2d4d8168b" +checksum = "6b92b125634d9b795e7beca796cc790df15a7fb38323bf3196fda83292d06b1f" dependencies = [ "aws-lc-rs", "log", @@ -4011,9 +3972,9 @@ checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" [[package]] name = "smallvec" -version = "1.15.1" +version = "1.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" +checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90" dependencies = [ "serde", ] @@ -4296,9 +4257,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" -version = "2.0.117" +version = "2.0.118" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" +checksum = "1b9ae57f904213ebb649ce6895b8a66c66f0203b9319718f69a5612a065b1422" dependencies = [ "proc-macro2", "quote", @@ -4370,9 +4331,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" dependencies = [ "fastrand", - "getrandom 0.4.2", + "getrandom 0.4.3", "once_cell", - "rustix", + "rustix 1.1.4", "windows-sys 0.61.2", ] @@ -4464,12 +4425,11 @@ dependencies = [ [[package]] name = "time" -version = "0.3.47" +version = "0.3.51" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c" +checksum = "85c17d80feb7334b40c484e45ed1a5273dfd8bfda537c3be2e74a06a6686f327" dependencies = [ "deranged", - "itoa", "num-conv", "powerfmt", "serde_core", @@ -4479,15 +4439,15 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" +checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109" [[package]] name = "time-macros" -version = "0.2.27" +version = "0.2.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215" +checksum = "dcef1a61bdb119096e153208ec5cbec23944ce8bca13be5c7f60c634f7403935" dependencies = [ "num-conv", "time-core", @@ -4833,7 +4793,7 @@ dependencies = [ "derive_more 2.1.1", "tokio", "torrust-net-primitives", - "tower-http", + "tower-http 0.7.0", "tracing", ] @@ -4884,7 +4844,7 @@ dependencies = [ [[package]] name = "torrust-tracker-axum-health-check-api-server" -version = "3.0.0-develop" +version = "0.1.0" dependencies = [ "axum", "axum-server", @@ -4904,14 +4864,14 @@ dependencies = [ "torrust-tracker-configuration", "torrust-tracker-test-helpers", "torrust-tracker-udp-server", - "tower-http", + "tower-http 0.7.0", "tracing", "url", ] [[package]] name = "torrust-tracker-axum-http-server" -version = "3.0.0-develop" +version = "0.1.0" dependencies = [ "axum", "axum-client-ip", @@ -4944,14 +4904,14 @@ dependencies = [ "torrust-tracker-swarm-coordination-registry", "torrust-tracker-test-helpers", "tower", - "tower-http", + "tower-http 0.7.0", "tracing", "uuid", ] [[package]] name = "torrust-tracker-axum-rest-api-server" -version = "3.0.0-develop" +version = "0.1.0" dependencies = [ "axum", "axum-extra", @@ -4983,7 +4943,7 @@ dependencies = [ "torrust-tracker-udp-core", "torrust-tracker-udp-server", "tower", - "tower-http", + "tower-http 0.7.0", "tracing", "url", "uuid", @@ -4991,7 +4951,7 @@ dependencies = [ [[package]] name = "torrust-tracker-axum-server" -version = "3.0.0-develop" +version = "0.1.0" dependencies = [ "axum-server", "camino", @@ -5011,7 +4971,7 @@ dependencies = [ [[package]] name = "torrust-tracker-client" -version = "3.0.0-develop" +version = "0.1.0" dependencies = [ "anyhow", "bencode2json", @@ -5037,7 +4997,7 @@ dependencies = [ [[package]] name = "torrust-tracker-client-lib" -version = "3.0.0-develop" +version = "0.1.0" dependencies = [ "derive_more 2.1.1", "hyper", @@ -5061,7 +5021,7 @@ dependencies = [ [[package]] name = "torrust-tracker-configuration" -version = "3.0.0-develop" +version = "3.0.0" dependencies = [ "camino", "derive_more 2.1.1", @@ -5081,7 +5041,7 @@ dependencies = [ [[package]] name = "torrust-tracker-core" -version = "3.0.0-develop" +version = "0.1.0" dependencies = [ "async-trait", "chrono", @@ -5110,7 +5070,7 @@ dependencies = [ [[package]] name = "torrust-tracker-e2e-tools" -version = "3.0.0-develop" +version = "0.1.0" dependencies = [ "anyhow", "tokio", @@ -5119,7 +5079,7 @@ dependencies = [ [[package]] name = "torrust-tracker-events" -version = "3.0.0-develop" +version = "0.1.0" dependencies = [ "futures", "mockall", @@ -5128,7 +5088,7 @@ dependencies = [ [[package]] name = "torrust-tracker-http-core" -version = "3.0.0-develop" +version = "0.1.0" dependencies = [ "criterion 0.5.1", "futures", @@ -5153,7 +5113,7 @@ dependencies = [ [[package]] name = "torrust-tracker-http-protocol" -version = "3.0.0-develop" +version = "0.1.0" dependencies = [ "derive_more 2.1.1", "multimap", @@ -5170,7 +5130,7 @@ dependencies = [ [[package]] name = "torrust-tracker-persistence-benchmark" -version = "3.0.0-develop" +version = "0.1.0" dependencies = [ "anyhow", "chrono", @@ -5188,7 +5148,7 @@ dependencies = [ [[package]] name = "torrust-tracker-primitives" -version = "3.0.0-develop" +version = "3.0.0" dependencies = [ "binascii", "derive_more 2.1.1", @@ -5205,7 +5165,7 @@ dependencies = [ [[package]] name = "torrust-tracker-rest-api-application" -version = "3.0.0-develop" +version = "0.1.0" dependencies = [ "async-trait", "torrust-info-hash", @@ -5215,7 +5175,7 @@ dependencies = [ [[package]] name = "torrust-tracker-rest-api-client" -version = "3.0.0-develop" +version = "0.1.0" dependencies = [ "hyper", "reqwest", @@ -5228,7 +5188,7 @@ dependencies = [ [[package]] name = "torrust-tracker-rest-api-protocol" -version = "3.0.0-develop" +version = "0.1.0" dependencies = [ "serde", "serde_with", @@ -5237,7 +5197,7 @@ dependencies = [ [[package]] name = "torrust-tracker-rest-api-runtime-adapter" -version = "3.0.0-develop" +version = "0.1.0" dependencies = [ "async-trait", "tokio", @@ -5257,7 +5217,7 @@ dependencies = [ [[package]] name = "torrust-tracker-swarm-coordination-registry" -version = "3.0.0-develop" +version = "0.1.0" dependencies = [ "chrono", "crossbeam-skiplist", @@ -5278,7 +5238,7 @@ dependencies = [ [[package]] name = "torrust-tracker-test-helpers" -version = "3.0.0-develop" +version = "3.0.0" dependencies = [ "rand 0.10.1", "torrust-tracker-configuration", @@ -5288,7 +5248,7 @@ dependencies = [ [[package]] name = "torrust-tracker-torrent-repository-benchmarking" -version = "3.0.0-develop" +version = "0.1.0" dependencies = [ "criterion 0.8.2", "crossbeam-skiplist", @@ -5304,7 +5264,7 @@ dependencies = [ [[package]] name = "torrust-tracker-udp-core" -version = "3.0.0-develop" +version = "0.1.0" dependencies = [ "async-trait", "bloom", @@ -5334,7 +5294,7 @@ dependencies = [ [[package]] name = "torrust-tracker-udp-protocol" -version = "3.0.0-develop" +version = "0.1.0" dependencies = [ "byteorder", "either", @@ -5347,7 +5307,7 @@ dependencies = [ [[package]] name = "torrust-tracker-udp-server" -version = "3.0.0-develop" +version = "0.1.0" dependencies = [ "async-trait", "derive_more 2.1.1", @@ -5406,22 +5366,38 @@ name = "tower-http" version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840" +dependencies = [ + "bitflags", + "bytes", + "futures-util", + "http", + "http-body", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", + "url", +] + +[[package]] +name = "tower-http" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b11f75e912b0c2be01b63d8cf8057b8c3f97cf34abb3d431a3a4c8675498e233" dependencies = [ "async-compression", "bitflags", "bytes", "futures-core", - "futures-util", "http", "http-body", + "percent-encoding", "pin-project-lite", "tokio", "tokio-util", - "tower", "tower-layer", "tower-service", "tracing", - "url", "uuid", ] @@ -5646,11 +5622,11 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.23.3" +version = "1.23.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "144d6b123cef80b301b8f72a9e2ca4370ddec21950d0a103dd22c437006d2db7" +checksum = "bf80a72845275afea99e7f2b434723d3bc7e38470fcd1c7ed39a599c73319a53" dependencies = [ - "getrandom 0.4.2", + "getrandom 0.4.3", "js-sys", "wasm-bindgen", ] @@ -5700,20 +5676,11 @@ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasip2" -version = "1.0.3+wasi-0.2.9" +version = "1.0.4+wasi-0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20064672db26d7cdc89c7798c48a0fdfac8213434a1186e5ef29fd560ae223d6" +checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487" dependencies = [ - "wit-bindgen 0.57.1", -] - -[[package]] -name = "wasip3" -version = "0.4.0+wasi-0.3.0-rc-2026-01-06" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" -dependencies = [ - "wit-bindgen 0.51.0", + "wit-bindgen", ] [[package]] @@ -5724,9 +5691,9 @@ checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" [[package]] name = "wasm-bindgen" -version = "0.2.123" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a254a4b10c19a76f09a27640e7ffbf9bc30bf67e16a3bf28aaefa4920fe81563" +checksum = "4b067c0c11094aef6b7a801c1e34a26affafdf3d051dba08456b868789aaf9a4" dependencies = [ "cfg-if", "once_cell", @@ -5737,9 +5704,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.73" +version = "0.4.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54568702fabf5d4849ce2b90fadfa64168a097eaf4b351ce9df8b687a0086aaf" +checksum = "c62df1340f32221cb9c54d6a27b030e3dba64361d4a95bed55f9aacb44da291d" dependencies = [ "js-sys", "wasm-bindgen", @@ -5747,9 +5714,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.123" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24a40fc75b0ec6f3746ceb10d36f53a93dcd68a93b11b6445983945d79eba0dc" +checksum = "167ce5e579f6bcf889c4f7175a8a5a585de84e8ff93976ce393efa5f2837aab1" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -5757,9 +5724,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.123" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "908f34bd9b9ce3d4caf07b72dfab63d61504d156856c6bd3cd87fa350cf3985b" +checksum = "f3997c7839262f4ef12cf90b818d6340c18e80f263f1a94bf157d0ec4420380e" dependencies = [ "bumpalo", "proc-macro2", @@ -5770,52 +5737,18 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.123" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7acbf7616c27b194bbb550bf77ed0c2c3e5b7fd1260a93082b95fb7f47959b92" +checksum = "dc1b4cb0cc549fcf58d7dfc081778139b3d283a081644e833e84682ad71cea24" dependencies = [ "unicode-ident", ] -[[package]] -name = "wasm-encoder" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" -dependencies = [ - "leb128fmt", - "wasmparser", -] - -[[package]] -name = "wasm-metadata" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" -dependencies = [ - "anyhow", - "indexmap 2.14.0", - "wasm-encoder", - "wasmparser", -] - -[[package]] -name = "wasmparser" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" -dependencies = [ - "bitflags", - "hashbrown 0.15.5", - "indexmap 2.14.0", - "semver", -] - [[package]] name = "web-sys" -version = "0.3.100" +version = "0.3.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e0871acf327f283dc6da28a1696cdc64fb355ba9f935d052021fa77f35cce69" +checksum = "8622dcb61c0bcc9fffa6938bed81210af2da9a7e4a1a834b2e37a59b6dfb6141" dependencies = [ "js-sys", "wasm-bindgen", @@ -5833,9 +5766,9 @@ dependencies = [ [[package]] name = "webpki-root-certs" -version = "1.0.7" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f31141ce3fc3e300ae89b78c0dd67f9708061d1d2eda54b8209346fd6be9a92c" +checksum = "0d46a5a140e6f7afeccd8eae97eff335163939eac8b929834875168b29b3d267" dependencies = [ "rustls-pki-types", ] @@ -5969,6 +5902,15 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + [[package]] name = "windows-sys" version = "0.60.2" @@ -6191,103 +6133,15 @@ dependencies = [ "memchr", ] -[[package]] -name = "wit-bindgen" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" -dependencies = [ - "wit-bindgen-rust-macro", -] - [[package]] name = "wit-bindgen" version = "0.57.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" -[[package]] -name = "wit-bindgen-core" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" -dependencies = [ - "anyhow", - "heck", - "wit-parser", -] - -[[package]] -name = "wit-bindgen-rust" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" -dependencies = [ - "anyhow", - "heck", - "indexmap 2.14.0", - "prettyplease", - "syn", - "wasm-metadata", - "wit-bindgen-core", - "wit-component", -] - -[[package]] -name = "wit-bindgen-rust-macro" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a" -dependencies = [ - "anyhow", - "prettyplease", - "proc-macro2", - "quote", - "syn", - "wit-bindgen-core", - "wit-bindgen-rust", -] - -[[package]] -name = "wit-component" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" -dependencies = [ - "anyhow", - "bitflags", - "indexmap 2.14.0", - "log", - "serde", - "serde_derive", - "serde_json", - "wasm-encoder", - "wasm-metadata", - "wasmparser", - "wit-parser", -] - -[[package]] -name = "wit-parser" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" -dependencies = [ - "anyhow", - "id-arena", - "indexmap 2.14.0", - "log", - "semver", - "serde", - "serde_derive", - "serde_json", - "unicode-xid", - "wasmparser", -] - [[package]] name = "workspace-coupling" -version = "3.0.0-develop" +version = "0.1.0" dependencies = [ "serde", "serde_json", @@ -6308,7 +6162,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32e45ad4206f6d2479085147f02bc2ef834ac85886624a23575ae137c8aa8156" dependencies = [ "libc", - "rustix", + "rustix 1.1.4", ] [[package]] @@ -6383,9 +6237,9 @@ dependencies = [ [[package]] name = "zeroize" -version = "1.8.2" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" +checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e" [[package]] name = "zerotrie" diff --git a/Cargo.toml b/Cargo.toml index 88964f778..d6aa7476b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,7 +13,7 @@ license.workspace = true publish.workspace = true repository.workspace = true rust-version.workspace = true -version.workspace = true +version = "3.0.0-develop" [lib] name = "torrust_tracker_lib" @@ -33,15 +33,14 @@ license = "AGPL-3.0-only" publish = true repository = "https://github.com/torrust/torrust-tracker" rust-version = "1.88" -version = "3.0.0-develop" [dependencies] anyhow = "1" axum-server = { version = "0", features = [ "tls-rustls-no-provider" ] } base64 = "0.22.1" -torrust-tracker-http-core = { version = "3.0.0-develop", path = "packages/http-core" } -torrust-tracker-core = { version = "3.0.0-develop", path = "packages/tracker-core" } -torrust-tracker-udp-core = { version = "3.0.0-develop", path = "packages/udp-core" } +torrust-tracker-http-core = { version = "0.1.0", path = "packages/http-core" } +torrust-tracker-core = { version = "0.1.0", path = "packages/tracker-core" } +torrust-tracker-udp-core = { version = "0.1.0", path = "packages/udp-core" } chrono = { version = "0", default-features = false, features = [ "clock" ] } clap = { version = "4", features = [ "derive", "env" ] } pbkdf2 = "0.13.0" @@ -57,26 +56,26 @@ thiserror = "2.0.12" tokio = { version = "1", features = [ "macros", "net", "rt-multi-thread", "signal", "sync" ] } tokio-util = "0.7.15" toml = "1" -torrust-tracker-axum-health-check-api-server = { version = "3.0.0-develop", path = "packages/axum-health-check-api-server" } -torrust-tracker-axum-http-server = { version = "3.0.0-develop", path = "packages/axum-http-server" } -torrust-tracker-axum-rest-api-server = { version = "3.0.0-develop", path = "packages/axum-rest-api-server" } -torrust-tracker-axum-server = { version = "3.0.0-develop", path = "packages/axum-server" } -torrust-tracker-rest-api-client = { version = "3.0.0-develop", path = "packages/rest-api-client" } -torrust-tracker-rest-api-runtime-adapter = { version = "3.0.0-develop", path = "packages/rest-api-runtime-adapter" } -torrust-tracker-rest-api-protocol = { version = "3.0.0-develop", path = "packages/rest-api-protocol" } +torrust-tracker-axum-health-check-api-server = { version = "0.1.0", path = "packages/axum-health-check-api-server" } +torrust-tracker-axum-http-server = { version = "0.1.0", path = "packages/axum-http-server" } +torrust-tracker-axum-rest-api-server = { version = "0.1.0", path = "packages/axum-rest-api-server" } +torrust-tracker-axum-server = { version = "0.1.0", path = "packages/axum-server" } +torrust-tracker-rest-api-client = { version = "0.1.0", path = "packages/rest-api-client" } +torrust-tracker-rest-api-runtime-adapter = { version = "0.1.0", path = "packages/rest-api-runtime-adapter" } +torrust-tracker-rest-api-protocol = { version = "0.1.0", path = "packages/rest-api-protocol" } torrust-server-lib = "0.1.0" torrust-clock = "3.0.0" -torrust-tracker-configuration = { version = "3.0.0-develop", path = "packages/configuration" } -torrust-tracker-primitives = { version = "3.0.0-develop", path = "packages/primitives" } -torrust-tracker-swarm-coordination-registry = { version = "3.0.0-develop", path = "packages/swarm-coordination-registry" } -torrust-tracker-udp-server = { version = "3.0.0-develop", path = "packages/udp-server" } +torrust-tracker-configuration = { version = "3.0.0", path = "packages/configuration" } +torrust-tracker-primitives = { version = "3.0.0", path = "packages/primitives" } +torrust-tracker-swarm-coordination-registry = { version = "0.1.0", path = "packages/swarm-coordination-registry" } +torrust-tracker-udp-server = { version = "0.1.0", path = "packages/udp-server" } tracing = "0" tracing-subscriber = { version = "0", features = [ "json" ] } [dev-dependencies] torrust-info-hash = "=0.2.0" -torrust-tracker-client = { package = "torrust-tracker-client-lib", version = "3.0.0-develop", path = "packages/tracker-client" } -torrust-tracker-test-helpers = { version = "3.0.0-develop", path = "packages/test-helpers" } +torrust-tracker-client = { package = "torrust-tracker-client-lib", version = "0.1.0", path = "packages/tracker-client" } +torrust-tracker-test-helpers = { version = "3.0.0", path = "packages/test-helpers" } [workspace] members = [ diff --git a/console/tracker-client/Cargo.toml b/console/tracker-client/Cargo.toml index 5cb4fd1d4..3a8a91303 100644 --- a/console/tracker-client/Cargo.toml +++ b/console/tracker-client/Cargo.toml @@ -12,7 +12,7 @@ homepage.workspace = true publish.workspace = true repository.workspace = true rust-version.workspace = true -version.workspace = true +version = "0.1.0" [lints] workspace = true @@ -23,10 +23,10 @@ name = "torrust_tracker_console_client" [dependencies] anyhow = "1" bencode2json = "0.1" -torrust-tracker-udp-protocol = { version = "3.0.0-develop", path = "../../packages/udp-protocol" } +torrust-tracker-udp-protocol = { version = "0.1.0", path = "../../packages/udp-protocol" } torrust-peer-id = "0.1.0" torrust-info-hash = "=0.2.0" -torrust-tracker-client = { package = "torrust-tracker-client-lib", version = "3.0.0-develop", path = "../../packages/tracker-client" } +torrust-tracker-client = { package = "torrust-tracker-client-lib", version = "0.1.0", path = "../../packages/tracker-client" } clap = { version = "4", features = [ "derive", "env" ] } futures = "0" hyper = "1" diff --git a/contrib/dev-tools/analysis/workspace-coupling/Cargo.toml b/contrib/dev-tools/analysis/workspace-coupling/Cargo.toml index 5104dcccf..e8d2319ce 100644 --- a/contrib/dev-tools/analysis/workspace-coupling/Cargo.toml +++ b/contrib/dev-tools/analysis/workspace-coupling/Cargo.toml @@ -6,7 +6,7 @@ publish = false authors.workspace = true edition.workspace = true rust-version.workspace = true -version.workspace = true +version = "0.1.0" [lints] workspace = true diff --git a/packages/axum-health-check-api-server/Cargo.toml b/packages/axum-health-check-api-server/Cargo.toml index e2220f967..16a6de97a 100644 --- a/packages/axum-health-check-api-server/Cargo.toml +++ b/packages/axum-health-check-api-server/Cargo.toml @@ -11,7 +11,7 @@ publish.workspace = true readme = "README.md" repository.workspace = true rust-version.workspace = true -version.workspace = true +version = "0.1.0" [dependencies] axum = { version = "0", features = [ "macros" ] } @@ -21,9 +21,9 @@ hyper = "1" serde = { version = "1", features = [ "derive" ] } serde_json = { version = "1", features = [ "preserve_order" ] } tokio = { version = "1", features = [ "macros", "net", "rt-multi-thread", "signal", "sync" ] } -torrust-tracker-axum-server = { version = "3.0.0-develop", path = "../axum-server" } +torrust-tracker-axum-server = { version = "0.1.0", path = "../axum-server" } torrust-server-lib = "0.1.0" -torrust-tracker-configuration = { version = "3.0.0-develop", path = "../configuration" } +torrust-tracker-configuration = { version = "3.0.0", path = "../configuration" } torrust-net-primitives = "0.1.0" tower-http = { version = "0", features = [ "compression-full", "cors", "propagate-header", "request-id", "trace" ] } tracing = "0" @@ -31,9 +31,9 @@ url = "2.5.4" [dev-dependencies] reqwest = { version = "0", features = [ "json" ] } -torrust-tracker-axum-health-check-api-server = { version = "3.0.0-develop", path = "../axum-health-check-api-server" } -torrust-tracker-axum-http-server = { version = "3.0.0-develop", path = "../axum-http-server" } -torrust-tracker-axum-rest-api-server = { version = "3.0.0-develop", path = "../axum-rest-api-server" } +torrust-tracker-axum-health-check-api-server = { version = "0.1.0", path = "../axum-health-check-api-server" } +torrust-tracker-axum-http-server = { version = "0.1.0", path = "../axum-http-server" } +torrust-tracker-axum-rest-api-server = { version = "0.1.0", path = "../axum-rest-api-server" } torrust-clock = "3.0.0" -torrust-tracker-test-helpers = { version = "3.0.0-develop", path = "../test-helpers" } -torrust-tracker-udp-server = { version = "3.0.0-develop", path = "../udp-server" } +torrust-tracker-test-helpers = { version = "3.0.0", path = "../test-helpers" } +torrust-tracker-udp-server = { version = "0.1.0", path = "../udp-server" } diff --git a/packages/axum-http-server/Cargo.toml b/packages/axum-http-server/Cargo.toml index 1c9a89915..37cba1e76 100644 --- a/packages/axum-http-server/Cargo.toml +++ b/packages/axum-http-server/Cargo.toml @@ -11,16 +11,16 @@ publish.workspace = true readme = "README.md" repository.workspace = true rust-version.workspace = true -version.workspace = true +version = "0.1.0" [dependencies] axum = { version = "0", features = [ "macros" ] } axum-client-ip = "0" axum-server = { version = "0", features = [ "tls-rustls-no-provider" ] } -torrust-tracker-http-core = { version = "3.0.0-develop", path = "../http-core" } -torrust-tracker-http-protocol = { version = "3.0.0-develop", path = "../http-protocol" } +torrust-tracker-http-core = { version = "0.1.0", path = "../http-core" } +torrust-tracker-http-protocol = { version = "0.1.0", path = "../http-protocol" } torrust-info-hash = "=0.2.0" -torrust-tracker-core = { version = "3.0.0-develop", path = "../tracker-core" } +torrust-tracker-core = { version = "0.1.0", path = "../tracker-core" } derive_more = { version = "2", features = [ "as_ref", "constructor", "from" ] } futures = "0" hyper = "1" @@ -28,13 +28,13 @@ reqwest = { version = "0", features = [ "json" ] } serde = { version = "1", features = [ "derive" ] } tokio = { version = "1", features = [ "macros", "net", "rt-multi-thread", "signal", "sync" ] } tokio-util = "0.7.15" -torrust-tracker-axum-server = { version = "3.0.0-develop", path = "../axum-server" } +torrust-tracker-axum-server = { version = "0.1.0", path = "../axum-server" } torrust-server-lib = "0.1.0" torrust-clock = "3.0.0" -torrust-tracker-configuration = { version = "3.0.0-develop", path = "../configuration" } +torrust-tracker-configuration = { version = "3.0.0", path = "../configuration" } torrust-net-primitives = "0.1.0" -torrust-tracker-primitives = { version = "3.0.0-develop", path = "../primitives" } -torrust-tracker-swarm-coordination-registry = { version = "3.0.0-develop", path = "../swarm-coordination-registry" } +torrust-tracker-primitives = { version = "3.0.0", path = "../primitives" } +torrust-tracker-swarm-coordination-registry = { version = "0.1.0", path = "../swarm-coordination-registry" } tower = { version = "0", features = [ "timeout" ] } tower-http = { version = "0", features = [ "compression-full", "cors", "propagate-header", "request-id", "trace" ] } tracing = "0" @@ -48,7 +48,7 @@ serde_bencode = "0" serde_bytes = "0" serde_repr = "0" torrust-peer-id = "0.1.0" -torrust-tracker-test-helpers = { version = "3.0.0-develop", path = "../test-helpers" } +torrust-tracker-test-helpers = { version = "3.0.0", path = "../test-helpers" } uuid = { version = "1", features = [ "v4" ] } # cargo-machete cannot detect `serde_bytes` usage via `#[serde(with = "serde_bytes")]` diff --git a/packages/axum-rest-api-server/Cargo.toml b/packages/axum-rest-api-server/Cargo.toml index 31edde9dd..6fd497b0f 100644 --- a/packages/axum-rest-api-server/Cargo.toml +++ b/packages/axum-rest-api-server/Cargo.toml @@ -11,16 +11,16 @@ publish.workspace = true readme = "README.md" repository.workspace = true rust-version.workspace = true -version.workspace = true +version = "0.1.0" [dependencies] axum = { version = "0", features = [ "macros" ] } axum-extra = { version = "0", features = [ "query" ] } axum-server = { version = "0", features = [ "tls-rustls-no-provider" ] } -torrust-tracker-http-core = { version = "3.0.0-develop", path = "../http-core" } +torrust-tracker-http-core = { version = "0.1.0", path = "../http-core" } torrust-info-hash = "=0.2.0" -torrust-tracker-core = { version = "3.0.0-develop", path = "../tracker-core" } -torrust-tracker-udp-core = { version = "3.0.0-develop", path = "../udp-core" } +torrust-tracker-core = { version = "0.1.0", path = "../tracker-core" } +torrust-tracker-udp-core = { version = "0.1.0", path = "../udp-core" } derive_more = { version = "2", features = [ "as_ref", "constructor", "from" ] } futures = "0" hyper = "1" @@ -29,26 +29,26 @@ serde = { version = "1", features = [ "derive" ] } serde_json = { version = "1", features = [ "preserve_order" ] } thiserror = "2" tokio = { version = "1", features = [ "macros", "net", "rt-multi-thread", "signal", "sync" ] } -torrust-tracker-axum-server = { version = "3.0.0-develop", path = "../axum-server" } -torrust-tracker-rest-api-client = { version = "3.0.0-develop", path = "../rest-api-client" } -torrust-tracker-rest-api-application = { version = "3.0.0-develop", path = "../rest-api-application" } -torrust-tracker-rest-api-protocol = { version = "3.0.0-develop", path = "../rest-api-protocol" } -torrust-tracker-rest-api-runtime-adapter = { version = "3.0.0-develop", path = "../rest-api-runtime-adapter" } +torrust-tracker-axum-server = { version = "0.1.0", path = "../axum-server" } +torrust-tracker-rest-api-client = { version = "0.1.0", path = "../rest-api-client" } +torrust-tracker-rest-api-application = { version = "0.1.0", path = "../rest-api-application" } +torrust-tracker-rest-api-protocol = { version = "0.1.0", path = "../rest-api-protocol" } +torrust-tracker-rest-api-runtime-adapter = { version = "0.1.0", path = "../rest-api-runtime-adapter" } torrust-server-lib = "0.1.0" torrust-clock = "3.0.0" -torrust-tracker-configuration = { version = "3.0.0-develop", path = "../configuration" } +torrust-tracker-configuration = { version = "3.0.0", path = "../configuration" } torrust-metrics = "0.1.0" torrust-net-primitives = "0.1.0" -torrust-tracker-primitives = { version = "3.0.0-develop", path = "../primitives" } -torrust-tracker-swarm-coordination-registry = { version = "3.0.0-develop", path = "../swarm-coordination-registry" } -torrust-tracker-udp-server = { version = "3.0.0-develop", path = "../udp-server" } +torrust-tracker-primitives = { version = "3.0.0", path = "../primitives" } +torrust-tracker-swarm-coordination-registry = { version = "0.1.0", path = "../swarm-coordination-registry" } +torrust-tracker-udp-server = { version = "0.1.0", path = "../udp-server" } tower = { version = "0", features = [ "timeout" ] } tower-http = { version = "0", features = [ "compression-full", "cors", "propagate-header", "request-id", "trace" ] } tracing = "0" url = "2" [dev-dependencies] -torrust-tracker-rest-api-client = { version = "3.0.0-develop", path = "../rest-api-client" } -torrust-tracker-test-helpers = { version = "3.0.0-develop", path = "../test-helpers" } +torrust-tracker-rest-api-client = { version = "0.1.0", path = "../rest-api-client" } +torrust-tracker-test-helpers = { version = "3.0.0", path = "../test-helpers" } url = { version = "2", features = [ "serde" ] } uuid = { version = "1", features = [ "v4" ] } diff --git a/packages/axum-server/Cargo.toml b/packages/axum-server/Cargo.toml index 4106e4170..7f849185c 100644 --- a/packages/axum-server/Cargo.toml +++ b/packages/axum-server/Cargo.toml @@ -11,7 +11,7 @@ publish.workspace = true readme = "README.md" repository.workspace = true rust-version.workspace = true -version.workspace = true +version = "0.1.0" [dependencies] axum-server = { version = "0", features = [ "tls-rustls-no-provider" ] } @@ -24,7 +24,7 @@ pin-project-lite = "0" thiserror = "2" tokio = { version = "1", features = [ "macros", "net", "rt-multi-thread", "signal", "sync" ] } torrust-server-lib = "0.1.0" -torrust-tracker-configuration = { version = "3.0.0-develop", path = "../configuration" } +torrust-tracker-configuration = { version = "3.0.0", path = "../configuration" } torrust-located-error = "3.0.0" tower = { version = "0", features = [ "timeout" ] } tracing = "0" diff --git a/packages/configuration/Cargo.toml b/packages/configuration/Cargo.toml index b6ec7e9c3..4e90edcfe 100644 --- a/packages/configuration/Cargo.toml +++ b/packages/configuration/Cargo.toml @@ -12,7 +12,7 @@ license.workspace = true publish.workspace = true repository.workspace = true rust-version.workspace = true -version.workspace = true +version = "3.0.0" [dependencies] camino = { version = "1", features = [ "serde", "serde1" ] } @@ -24,7 +24,7 @@ serde_with = "3" thiserror = "2" toml = "0" torrust-located-error = "3.0.0" -torrust-tracker-primitives = { version = "3.0.0-develop", path = "../primitives" } +torrust-tracker-primitives = { version = "3.0.0", path = "../primitives" } tracing = "0" tracing-subscriber = { version = "0", features = [ "json" ] } url = "2" diff --git a/packages/e2e-tools/Cargo.toml b/packages/e2e-tools/Cargo.toml index b107b75bf..323a2e5aa 100644 --- a/packages/e2e-tools/Cargo.toml +++ b/packages/e2e-tools/Cargo.toml @@ -12,7 +12,7 @@ license.workspace = true publish = false repository.workspace = true rust-version.workspace = true -version.workspace = true +version = "0.1.0" [lints] workspace = true diff --git a/packages/events/Cargo.toml b/packages/events/Cargo.toml index 165ecca68..5d699efde 100644 --- a/packages/events/Cargo.toml +++ b/packages/events/Cargo.toml @@ -12,7 +12,7 @@ license.workspace = true publish.workspace = true repository.workspace = true rust-version.workspace = true -version.workspace = true +version = "0.1.0" [dependencies] futures = "0" diff --git a/packages/http-core/Cargo.toml b/packages/http-core/Cargo.toml index 5c4e1983b..dc6a4c939 100644 --- a/packages/http-core/Cargo.toml +++ b/packages/http-core/Cargo.toml @@ -11,12 +11,12 @@ publish.workspace = true readme = "README.md" repository.workspace = true rust-version.workspace = true -version.workspace = true +version = "0.1.0" [dependencies] -torrust-tracker-http-protocol = { version = "3.0.0-develop", path = "../http-protocol" } +torrust-tracker-http-protocol = { version = "0.1.0", path = "../http-protocol" } torrust-info-hash = "=0.2.0" -torrust-tracker-core = { version = "3.0.0-develop", path = "../tracker-core" } +torrust-tracker-core = { version = "0.1.0", path = "../tracker-core" } criterion = { version = "0.5.1", features = [ "async_tokio" ] } futures = "0" serde = "1.0.219" @@ -24,17 +24,17 @@ thiserror = "2" tokio = { version = "1", features = [ "macros", "net", "rt-multi-thread", "signal", "sync" ] } tokio-util = "0.7.15" torrust-clock = "3.0.0" -torrust-tracker-configuration = { version = "3.0.0-develop", path = "../configuration" } -torrust-tracker-events = { version = "3.0.0-develop", path = "../events" } +torrust-tracker-configuration = { version = "3.0.0", path = "../configuration" } +torrust-tracker-events = { version = "0.1.0", path = "../events" } torrust-metrics = "0.1.0" torrust-net-primitives = "0.1.0" -torrust-tracker-primitives = { version = "3.0.0-develop", path = "../primitives" } -torrust-tracker-swarm-coordination-registry = { version = "3.0.0-develop", path = "../swarm-coordination-registry" } +torrust-tracker-primitives = { version = "3.0.0", path = "../primitives" } +torrust-tracker-swarm-coordination-registry = { version = "0.1.0", path = "../swarm-coordination-registry" } tracing = "0" [dev-dependencies] mockall = "0" -torrust-tracker-test-helpers = { version = "3.0.0-develop", path = "../test-helpers" } +torrust-tracker-test-helpers = { version = "3.0.0", path = "../test-helpers" } [[bench]] harness = false diff --git a/packages/http-protocol/Cargo.toml b/packages/http-protocol/Cargo.toml index 6a00d9bb7..4fd814aa1 100644 --- a/packages/http-protocol/Cargo.toml +++ b/packages/http-protocol/Cargo.toml @@ -12,7 +12,7 @@ license.workspace = true publish.workspace = true repository.workspace = true rust-version.workspace = true -version.workspace = true +version = "0.1.0" [dependencies] torrust-info-hash = "=0.2.0" diff --git a/packages/persistence-benchmark/Cargo.toml b/packages/persistence-benchmark/Cargo.toml index 0ff1bb03c..95c126d43 100644 --- a/packages/persistence-benchmark/Cargo.toml +++ b/packages/persistence-benchmark/Cargo.toml @@ -12,7 +12,7 @@ license.workspace = true publish = false repository.workspace = true rust-version.workspace = true -version.workspace = true +version = "0.1.0" [lints] workspace = true @@ -27,6 +27,6 @@ serde_json = { version = "1", features = [ "preserve_order" ] } sqlx = { version = "0.8", features = [ "macros", "mysql", "postgres", "runtime-tokio-native-tls", "sqlite" ] } testcontainers = "0" tokio = { version = "1", features = [ "macros", "rt-multi-thread" ] } -torrust-tracker-configuration = { version = "3.0.0-develop", path = "../configuration" } -torrust-tracker-core = { version = "3.0.0-develop", path = "../tracker-core" } -torrust-tracker-primitives = { version = "3.0.0-develop", path = "../primitives" } +torrust-tracker-configuration = { version = "3.0.0", path = "../configuration" } +torrust-tracker-core = { version = "0.1.0", path = "../tracker-core" } +torrust-tracker-primitives = { version = "3.0.0", path = "../primitives" } diff --git a/packages/primitives/Cargo.toml b/packages/primitives/Cargo.toml index e7e1e78d3..e2f35549b 100644 --- a/packages/primitives/Cargo.toml +++ b/packages/primitives/Cargo.toml @@ -12,7 +12,7 @@ license.workspace = true publish.workspace = true repository.workspace = true rust-version.workspace = true -version.workspace = true +version = "3.0.0" [dependencies] torrust-peer-id = "0.1.0" diff --git a/packages/rest-api-application/Cargo.toml b/packages/rest-api-application/Cargo.toml index 792306d5d..dd6902eea 100644 --- a/packages/rest-api-application/Cargo.toml +++ b/packages/rest-api-application/Cargo.toml @@ -11,10 +11,10 @@ publish.workspace = true readme = "README.md" repository.workspace = true rust-version.workspace = true -version.workspace = true +version = "0.1.0" [dependencies] -torrust-tracker-rest-api-protocol = { version = "3.0.0-develop", path = "../rest-api-protocol" } +torrust-tracker-rest-api-protocol = { version = "0.1.0", path = "../rest-api-protocol" } torrust-info-hash = "=0.2.0" -torrust-tracker-primitives = { version = "3.0.0-develop", path = "../primitives" } +torrust-tracker-primitives = { version = "3.0.0", path = "../primitives" } async-trait = "0.1" diff --git a/packages/rest-api-client/Cargo.toml b/packages/rest-api-client/Cargo.toml index 31e012f20..a92a12437 100644 --- a/packages/rest-api-client/Cargo.toml +++ b/packages/rest-api-client/Cargo.toml @@ -12,13 +12,13 @@ homepage.workspace = true publish.workspace = true repository.workspace = true rust-version.workspace = true -version.workspace = true +version = "0.1.0" [dependencies] hyper = "1" reqwest = { version = "0", features = [ "json", "query" ] } serde = { version = "1", features = [ "derive" ] } thiserror = "2" -torrust-tracker-rest-api-protocol = { version = "3.0.0-develop", path = "../rest-api-protocol" } +torrust-tracker-rest-api-protocol = { version = "0.1.0", path = "../rest-api-protocol" } url = { version = "2", features = [ "serde" ] } uuid = { version = "1", features = [ "v4" ] } diff --git a/packages/rest-api-protocol/Cargo.toml b/packages/rest-api-protocol/Cargo.toml index ca492a3d3..3cd69c6de 100644 --- a/packages/rest-api-protocol/Cargo.toml +++ b/packages/rest-api-protocol/Cargo.toml @@ -11,7 +11,7 @@ publish.workspace = true readme = "README.md" repository.workspace = true rust-version.workspace = true -version.workspace = true +version = "0.1.0" [dependencies] serde = { version = "1", features = [ "derive" ] } diff --git a/packages/rest-api-runtime-adapter/Cargo.toml b/packages/rest-api-runtime-adapter/Cargo.toml index 73a401df9..7653cd52e 100644 --- a/packages/rest-api-runtime-adapter/Cargo.toml +++ b/packages/rest-api-runtime-adapter/Cargo.toml @@ -11,18 +11,18 @@ publish.workspace = true readme = "README.md" repository.workspace = true rust-version.workspace = true -version.workspace = true +version = "0.1.0" [dependencies] -torrust-tracker-configuration = { version = "3.0.0-develop", path = "../configuration" } -torrust-tracker-rest-api-application = { version = "3.0.0-develop", path = "../rest-api-application" } -torrust-tracker-rest-api-protocol = { version = "3.0.0-develop", path = "../rest-api-protocol" } -torrust-tracker-core = { version = "3.0.0-develop", path = "../tracker-core" } -torrust-tracker-primitives = { version = "3.0.0-develop", path = "../primitives" } -torrust-tracker-http-core = { version = "3.0.0-develop", path = "../http-core" } -torrust-tracker-udp-core = { version = "3.0.0-develop", path = "../udp-core" } -torrust-tracker-udp-server = { version = "3.0.0-develop", path = "../udp-server" } -torrust-tracker-swarm-coordination-registry = { version = "3.0.0-develop", path = "../swarm-coordination-registry" } +torrust-tracker-configuration = { version = "3.0.0", path = "../configuration" } +torrust-tracker-rest-api-application = { version = "0.1.0", path = "../rest-api-application" } +torrust-tracker-rest-api-protocol = { version = "0.1.0", path = "../rest-api-protocol" } +torrust-tracker-core = { version = "0.1.0", path = "../tracker-core" } +torrust-tracker-primitives = { version = "3.0.0", path = "../primitives" } +torrust-tracker-http-core = { version = "0.1.0", path = "../http-core" } +torrust-tracker-udp-core = { version = "0.1.0", path = "../udp-core" } +torrust-tracker-udp-server = { version = "0.1.0", path = "../udp-server" } +torrust-tracker-swarm-coordination-registry = { version = "0.1.0", path = "../swarm-coordination-registry" } torrust-metrics = "0.1.0" torrust-info-hash = "=0.2.0" async-trait = "0.1" diff --git a/packages/swarm-coordination-registry/Cargo.toml b/packages/swarm-coordination-registry/Cargo.toml index ff18eba5f..0339dd793 100644 --- a/packages/swarm-coordination-registry/Cargo.toml +++ b/packages/swarm-coordination-registry/Cargo.toml @@ -13,7 +13,7 @@ license.workspace = true publish.workspace = true repository.workspace = true rust-version.workspace = true -version.workspace = true +version = "0.1.0" [dependencies] torrust-info-hash = "=0.2.0" @@ -25,9 +25,9 @@ thiserror = "2.0.12" tokio = { version = "1", features = [ "macros", "net", "rt-multi-thread", "signal", "sync" ] } tokio-util = "0.7.15" torrust-clock = "3.0.0" -torrust-tracker-events = { version = "3.0.0-develop", path = "../events" } +torrust-tracker-events = { version = "0.1.0", path = "../events" } torrust-metrics = "0.1.0" -torrust-tracker-primitives = { version = "3.0.0-develop", path = "../primitives" } +torrust-tracker-primitives = { version = "3.0.0", path = "../primitives" } tracing = "0" [dev-dependencies] diff --git a/packages/test-helpers/Cargo.toml b/packages/test-helpers/Cargo.toml index fb240730d..8b35a4e15 100644 --- a/packages/test-helpers/Cargo.toml +++ b/packages/test-helpers/Cargo.toml @@ -12,10 +12,10 @@ license.workspace = true publish.workspace = true repository.workspace = true rust-version.workspace = true -version.workspace = true +version = "3.0.0" [dependencies] rand = "0" -torrust-tracker-configuration = { version = "3.0.0-develop", path = "../configuration" } +torrust-tracker-configuration = { version = "3.0.0", path = "../configuration" } tracing = "0" tracing-subscriber = { version = "0", features = [ "json" ] } diff --git a/packages/torrent-repository-benchmarking/Cargo.toml b/packages/torrent-repository-benchmarking/Cargo.toml index 39b6df297..00bf0daf2 100644 --- a/packages/torrent-repository-benchmarking/Cargo.toml +++ b/packages/torrent-repository-benchmarking/Cargo.toml @@ -10,10 +10,10 @@ documentation.workspace = true edition.workspace = true homepage.workspace = true license.workspace = true -publish.workspace = true +publish = false repository.workspace = true rust-version.workspace = true -version.workspace = true +version = "0.1.0" [lints] workspace = true @@ -26,7 +26,7 @@ futures = "0" parking_lot = "0" tokio = { version = "1", features = [ "macros", "net", "rt-multi-thread", "signal", "sync" ] } torrust-clock = "3.0.0" -torrust-tracker-primitives = { version = "3.0.0-develop", path = "../primitives" } +torrust-tracker-primitives = { version = "3.0.0", path = "../primitives" } [dev-dependencies] criterion = { version = "0", features = [ "async_tokio" ] } diff --git a/packages/tracker-client/Cargo.toml b/packages/tracker-client/Cargo.toml index 17d7c6fee..6c73b764e 100644 --- a/packages/tracker-client/Cargo.toml +++ b/packages/tracker-client/Cargo.toml @@ -12,13 +12,13 @@ homepage.workspace = true publish.workspace = true repository.workspace = true rust-version.workspace = true -version.workspace = true +version = "0.1.0" [lib] name = "torrust_tracker_client" [dependencies] -torrust-tracker-udp-protocol = { version = "3.0.0-develop", path = "../udp-protocol" } +torrust-tracker-udp-protocol = { version = "0.1.0", path = "../udp-protocol" } torrust-info-hash = "=0.2.0" torrust-peer-id = "0.1.0" derive_more = { version = "2", features = [ "as_ref", "constructor", "display", "from" ] } @@ -33,7 +33,7 @@ thiserror = "2" tokio = { version = "1", features = [ "macros", "net", "rt-multi-thread", "signal", "sync" ] } torrust-located-error = "3.0.0" torrust-net-primitives = "0.1.0" -torrust-tracker-primitives = { version = "3.0.0-develop", path = "../primitives" } +torrust-tracker-primitives = { version = "3.0.0", path = "../primitives" } tracing = "0" zerocopy = "0.8" diff --git a/packages/tracker-core/Cargo.toml b/packages/tracker-core/Cargo.toml index 1a9524d6b..9040df60e 100644 --- a/packages/tracker-core/Cargo.toml +++ b/packages/tracker-core/Cargo.toml @@ -11,7 +11,7 @@ publish.workspace = true readme = "README.md" repository.workspace = true rust-version.workspace = true -version.workspace = true +version = "0.1.0" [features] default = [ ] @@ -31,16 +31,16 @@ thiserror = "2" tokio = { version = "1", features = [ "macros", "net", "rt-multi-thread", "signal", "sync" ] } tokio-util = "0.7.15" torrust-clock = "3.0.0" -torrust-tracker-configuration = { version = "3.0.0-develop", path = "../configuration" } -torrust-tracker-events = { version = "3.0.0-develop", path = "../events" } +torrust-tracker-configuration = { version = "3.0.0", path = "../configuration" } +torrust-tracker-events = { version = "0.1.0", path = "../events" } torrust-located-error = "3.0.0" torrust-metrics = "0.1.0" -torrust-tracker-primitives = { version = "3.0.0-develop", path = "../primitives" } -torrust-tracker-swarm-coordination-registry = { version = "3.0.0-develop", path = "../swarm-coordination-registry" } +torrust-tracker-primitives = { version = "3.0.0", path = "../primitives" } +torrust-tracker-swarm-coordination-registry = { version = "0.1.0", path = "../swarm-coordination-registry" } tracing = "0" [dev-dependencies] mockall = "0" testcontainers = "0" -torrust-tracker-test-helpers = { version = "3.0.0-develop", path = "../test-helpers" } +torrust-tracker-test-helpers = { version = "3.0.0", path = "../test-helpers" } url = "2.5.4" diff --git a/packages/udp-core/Cargo.toml b/packages/udp-core/Cargo.toml index 724857bf9..266ddefbf 100644 --- a/packages/udp-core/Cargo.toml +++ b/packages/udp-core/Cargo.toml @@ -11,12 +11,12 @@ publish.workspace = true readme = "README.md" repository.workspace = true rust-version.workspace = true -version.workspace = true +version = "0.1.0" [dependencies] torrust-info-hash = "=0.2.0" -torrust-tracker-core = { version = "3.0.0-develop", path = "../tracker-core" } -torrust-tracker-udp-protocol = { version = "3.0.0-develop", path = "../udp-protocol" } +torrust-tracker-core = { version = "0.1.0", path = "../tracker-core" } +torrust-tracker-udp-protocol = { version = "0.1.0", path = "../udp-protocol" } bloom = "0.3.2" blowfish = "0" cipher = "0.5" @@ -28,12 +28,12 @@ thiserror = "2" tokio = { version = "1", features = [ "macros", "net", "rt-multi-thread", "signal", "sync", "time" ] } tokio-util = "0.7.15" torrust-clock = "3.0.0" -torrust-tracker-configuration = { version = "3.0.0-develop", path = "../configuration" } -torrust-tracker-events = { version = "3.0.0-develop", path = "../events" } +torrust-tracker-configuration = { version = "3.0.0", path = "../configuration" } +torrust-tracker-events = { version = "0.1.0", path = "../events" } torrust-metrics = "0.1.0" torrust-net-primitives = "0.1.0" -torrust-tracker-primitives = { version = "3.0.0-develop", path = "../primitives" } -torrust-tracker-swarm-coordination-registry = { version = "3.0.0-develop", path = "../swarm-coordination-registry" } +torrust-tracker-primitives = { version = "3.0.0", path = "../primitives" } +torrust-tracker-swarm-coordination-registry = { version = "0.1.0", path = "../swarm-coordination-registry" } tracing = "0" zerocopy = "0.8" async-trait = "0" diff --git a/packages/udp-protocol/Cargo.toml b/packages/udp-protocol/Cargo.toml index 8073c50b3..c5ea73358 100644 --- a/packages/udp-protocol/Cargo.toml +++ b/packages/udp-protocol/Cargo.toml @@ -12,7 +12,7 @@ license.workspace = true publish.workspace = true repository.workspace = true rust-version.workspace = true -version.workspace = true +version = "0.1.0" [features] default = [ ] diff --git a/packages/udp-server/Cargo.toml b/packages/udp-server/Cargo.toml index 74a16bd4a..00b615b61 100644 --- a/packages/udp-server/Cargo.toml +++ b/packages/udp-server/Cargo.toml @@ -11,15 +11,15 @@ publish.workspace = true readme = "README.md" repository.workspace = true rust-version.workspace = true -version.workspace = true +version = "0.1.0" [dependencies] -torrust_tracker_udp_protocol = { package = "torrust-tracker-udp-protocol", version = "3.0.0-develop", path = "../udp-protocol" } +torrust_tracker_udp_protocol = { package = "torrust-tracker-udp-protocol", version = "0.1.0", path = "../udp-protocol" } torrust-peer-id = "0.1.0" torrust-info-hash = "=0.2.0" -torrust-tracker-client = { package = "torrust-tracker-client-lib", version = "3.0.0-develop", path = "../tracker-client" } -torrust-tracker-core = { version = "3.0.0-develop", path = "../tracker-core" } -torrust-tracker-udp-core = { version = "3.0.0-develop", path = "../udp-core" } +torrust-tracker-client = { package = "torrust-tracker-client-lib", version = "0.1.0", path = "../tracker-client" } +torrust-tracker-core = { version = "0.1.0", path = "../tracker-core" } +torrust-tracker-udp-core = { version = "0.1.0", path = "../udp-core" } derive_more = { version = "2", features = [ "as_ref", "constructor", "from" ] } futures = "0" futures-util = "0" @@ -30,12 +30,12 @@ tokio = { version = "1", features = [ "macros", "net", "rt-multi-thread", "signa tokio-util = "0.7.15" torrust-server-lib = "0.1.0" torrust-clock = "3.0.0" -torrust-tracker-configuration = { version = "3.0.0-develop", path = "../configuration" } -torrust-tracker-events = { version = "3.0.0-develop", path = "../events" } +torrust-tracker-configuration = { version = "3.0.0", path = "../configuration" } +torrust-tracker-events = { version = "0.1.0", path = "../events" } torrust-metrics = "0.1.0" torrust-net-primitives = "0.1.0" -torrust-tracker-primitives = { version = "3.0.0-develop", path = "../primitives" } -torrust-tracker-swarm-coordination-registry = { version = "3.0.0-develop", path = "../swarm-coordination-registry" } +torrust-tracker-primitives = { version = "3.0.0", path = "../primitives" } +torrust-tracker-swarm-coordination-registry = { version = "0.1.0", path = "../swarm-coordination-registry" } tracing = "0" url = { version = "2", features = [ "serde" ] } async-trait = "0" @@ -46,4 +46,4 @@ socket2 = "0.6.4" [dev-dependencies] mockall = "0" rand = "0.9" -torrust-tracker-test-helpers = { version = "3.0.0-develop", path = "../test-helpers" } +torrust-tracker-test-helpers = { version = "3.0.0", path = "../test-helpers" } From f82f49a5655a3b554d2cacaf5db40d34b1184c29 Mon Sep 17 00:00:00 2001 From: Jose Celano Date: Wed, 1 Jul 2026 09:24:13 +0100 Subject: [PATCH 3/3] fix: add --all-targets --all-features to per-package publish test step --- .github/workflows/deployment-packages.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deployment-packages.yaml b/.github/workflows/deployment-packages.yaml index 55c1ebc53..5e9f13b31 100644 --- a/.github/workflows/deployment-packages.yaml +++ b/.github/workflows/deployment-packages.yaml @@ -118,7 +118,7 @@ jobs: toolchain: ${{ matrix.toolchain }} - id: test name: Run Tests for ${{ needs.extract-crate.outputs.crate-name }} - run: cargo test -p "${{ needs.extract-crate.outputs.crate-name }}" + run: cargo test -p "${{ needs.extract-crate.outputs.crate-name }}" --all-targets --all-features publish: name: Publish