Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 0 additions & 19 deletions .github/workflows/ci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -46,22 +46,3 @@ jobs:
- uses: Swatinem/rust-cache@v2
- name: Run tests
run: cargo test --workspace

# Empaquette les crates publiées et les recompile depuis leur tarball. Aucun
# `cargo test` ne fait ça, et c'est la seule étape qui voit ce qui manque au
# paquet : la release 0.6.0 s'est arrêtée sur 65 `include_str!` visant un
# dossier situé hors de la crate, donc absent de l'archive. Sans ce job, cette
# famille de défaut ne se découvre qu'en publiant — et une publication
# crates.io ne se défait pas, elle se yanke.
package:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install system dependencies
run: sudo apt-get update && sudo apt-get install -y libfontconfig1-dev libfreetype6-dev
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
- name: Package publishable crates
# studio et cli ne sont pas publiées ; les exclure évite d'installer la
# pile GTK/WebKit ici pour rien.
run: cargo package --workspace --exclude rustmotion-studio --exclude rustmotion-cli
86 changes: 31 additions & 55 deletions .github/workflows/publish.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,15 @@ jobs:

- uses: dtolnay/rust-toolchain@stable

# La version se lit via `cargo metadata`, pas en grepant un manifeste : elle
# est déclarée dans `[workspace.package]` et héritée, donc un `grep
# '^version'` sur la crate tomberait sur `version.workspace = true` et
# comparerait le tag à cette chaîne. cargo répond la version résolue, où
# qu'elle soit écrite.
- name: Verify tag matches Cargo.toml version
run: |
CARGO_VERSION=$(grep '^version' crates/rustmotion/Cargo.toml | head -1 | sed 's/.*"\(.*\)".*/\1/')
CARGO_VERSION=$(cargo metadata --format-version 1 --no-deps \
| jq -r '.packages[] | select(.name=="rustmotion") | .version')
TAG_VERSION=${GITHUB_REF#refs/tags/}
if [ "$CARGO_VERSION" != "$TAG_VERSION" ]; then
echo "Tag $TAG_VERSION does not match Cargo.toml version $CARGO_VERSION"
Expand All @@ -34,58 +40,28 @@ jobs:
- name: Run tests
run: cargo test --workspace

- name: Publish rustmotion-core
run: cargo publish -p rustmotion-core --token ${{ secrets.CARGO_REGISTRY_TOKEN }}
# Repetition deliberee : l'etape suivante empaquette et verifie deja tout
# avant de televerser, donc ce dry-run recompile les quatre crates une
# seconde fois et n'attrape rien de plus. Ce qu'il achete est un signal, pas
# une garantie — un echec ici arrive avant que la commande de publication
# soit lancee, donc le log dit sans ambiguite que rien n'a pu partir. Apres
# 0.6.0, qui s'est arretee avec une crate deja publiee, la distinction vaut
# le temps de compilation.
- name: Dry-run the workspace publish
run: cargo publish --workspace --dry-run

- name: Wait for rustmotion-core on crates.io
run: |
VERSION=$(grep '^version' crates/rustmotion-core/Cargo.toml | head -1 | sed 's/.*"\(.*\)".*/\1/')
for i in $(seq 1 30); do
if curl -sf "https://crates.io/api/v1/crates/rustmotion-core/$VERSION" > /dev/null; then
echo "rustmotion-core $VERSION available"
exit 0
fi
echo "Waiting... ($i)"
sleep 5
done
echo "Timeout waiting for rustmotion-core" && exit 1

- name: Publish rustmotion-components
run: cargo publish -p rustmotion-components --token ${{ secrets.CARGO_REGISTRY_TOKEN }}

- name: Wait for rustmotion-components on crates.io
run: |
VERSION=$(grep '^version' crates/rustmotion-components/Cargo.toml | head -1 | sed 's/.*"\(.*\)".*/\1/')
for i in $(seq 1 30); do
if curl -sf "https://crates.io/api/v1/crates/rustmotion-components/$VERSION" > /dev/null; then
echo "rustmotion-components $VERSION available"
exit 0
fi
echo "Waiting... ($i)"
sleep 5
done
echo "Timeout waiting for rustmotion-components" && exit 1

# rustmotion dépend de rustmotion-html au même titre que de core et
# components. Sans cette étape, `cargo publish -p rustmotion` échoue sur une
# dépendance introuvable — mais en troisième position, core et components
# étant alors déjà publiées. Une publication crates.io ne se défait pas :
# l'échec obligerait à repasser tout le workspace en version suivante.
- name: Publish rustmotion-html
run: cargo publish -p rustmotion-html --token ${{ secrets.CARGO_REGISTRY_TOKEN }}

- name: Wait for rustmotion-html on crates.io
run: |
VERSION=$(grep '^version' crates/rustmotion-html/Cargo.toml | head -1 | sed 's/.*"\(.*\)".*/\1/')
for i in $(seq 1 30); do
if curl -sf "https://crates.io/api/v1/crates/rustmotion-html/$VERSION" > /dev/null; then
echo "rustmotion-html $VERSION available"
exit 0
fi
echo "Waiting... ($i)"
sleep 5
done
echo "Timeout waiting for rustmotion-html" && exit 1

- name: Publish rustmotion
run: cargo publish -p rustmotion --token ${{ secrets.CARGO_REGISTRY_TOKEN }}
# Un seul appel, et c'est ce qui porte la garantie : cargo empaquette et
# recompile les quatre crates depuis leur propre tarball AVANT de televerser
# quoi que ce soit. Si une seule ne se construit pas, rien ne part. Il
# televerse ensuite dans l'ordre des dependances et attend lui-meme la
# propagation de l'index.
#
# Les sept etapes manuelles qui precedaient interrogeaient
# https://crates.io/api/v1/crates/<nom>/<version> pour attendre chaque crate.
# Cet endpoint refuse une requete sans User-Agent identifiant : la boucle ne
# pouvait donc jamais reussir, et la release 0.6.0 s'est arretee la — apres
# avoir publie rustmotion-core, definitivement.
#
# studio et cli portent `publish = false` : cargo les saute tout seul.
- name: Publish all crates
run: cargo publish --workspace --token ${{ secrets.CARGO_REGISTRY_TOKEN }}
12 changes: 6 additions & 6 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

15 changes: 15 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,21 @@ members = [
"crates/rustmotion-html",
]

# Les six crates avancent ensemble. La version se change ici, et nulle part
# ailleurs : elle était auparavant répétée dix fois — une par manifeste, plus une
# par dépendance interne — et une seule oubliée fait échouer la publication après
# que les précédentes soient parties, ce qui ne se rattrape pas.
[workspace.package]
version = "0.6.1"

# Les dépendances internes portent aussi la version, donc elles se déclarent ici
# pour la même raison. `path` sert au développement, `version` à ce que cargo
# écrit dans le paquet publié : les deux doivent coexister, et rester d'accord.
[workspace.dependencies]
rustmotion-core = { path = "crates/rustmotion-core", version = "0.6.1" }
rustmotion-components = { path = "crates/rustmotion-components", version = "0.6.1" }
rustmotion-html = { path = "crates/rustmotion-html", version = "0.6.1" }

# Optimize dependencies even in dev builds. Our own crates stay at opt-level 0
# (fast incremental + debuggable), but heavy compute in deps (image encoding,
# etc.) runs optimized — without this, `cargo run` image encode is ~20x slower.
Expand Down
2 changes: 1 addition & 1 deletion crates/rustmotion-cli/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "rustmotion-cli"
version = "0.6.0"
version.workspace = true
edition = "2021"
publish = false

Expand Down
4 changes: 2 additions & 2 deletions crates/rustmotion-components/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "rustmotion-components"
version = "0.6.0"
version.workspace = true
edition = "2021"
description = "Component library for rustmotion (51 components)"
license = "MIT"
Expand All @@ -14,7 +14,7 @@ default = ["lottie-native"]
lottie-native = ["dep:thorvg", "dep:dashmap"]

[dependencies]
rustmotion-core = { path = "../rustmotion-core", version = "0.6.0" }
rustmotion-core.workspace = true
skia-safe = "0.82"
serde = { version = "1", features = ["derive"] }
serde_json = "1"
Expand Down
2 changes: 1 addition & 1 deletion crates/rustmotion-core/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "rustmotion-core"
version = "0.6.0"
version.workspace = true
edition = "2021"
description = "Core types, traits, and rendering utilities for rustmotion"
license = "MIT"
Expand Down
2 changes: 1 addition & 1 deletion crates/rustmotion-html/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "rustmotion-html"
version = "0.6.0"
version.workspace = true
edition = "2021"
description = "HTML/CSS front-end transpiler for rustmotion scenarios"
license = "MIT"
Expand Down
2 changes: 1 addition & 1 deletion crates/rustmotion-studio/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "rustmotion-studio"
version = "0.6.0"
version.workspace = true
edition = "2021"
publish = false

Expand Down
8 changes: 4 additions & 4 deletions crates/rustmotion/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "rustmotion"
version = "0.6.0"
version.workspace = true
edition = "2021"
description = "A CLI tool that renders motion design videos from JSON scenarios. No browser, no Node.js — just a single Rust binary."
license = "MIT"
Expand All @@ -10,9 +10,9 @@ repository = "https://github.com/LeadcodeDev/rustmotion"
path = "src/lib.rs"

[dependencies]
rustmotion-core = { path = "../rustmotion-core", version = "0.6.0" }
rustmotion-components = { path = "../rustmotion-components", version = "0.6.0", features = ["lottie-native"] }
rustmotion-html = { path = "../rustmotion-html", version = "0.6.0" }
rustmotion-core.workspace = true
rustmotion-components = { workspace = true, features = ["lottie-native"] }
rustmotion-html.workspace = true
skia-safe = "0.82"
serde = { version = "1", features = ["derive"] }
serde_json = "1"
Expand Down
Loading