rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5 heartwood145b4cb6100bae5848e645f40bab4827d024e787
{
"request": "trigger",
"version": 1,
"event_type": "patch",
"repository": {
"id": "rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5",
"name": "heartwood",
"description": "Radicle Heartwood Protocol & Stack",
"private": false,
"default_branch": "master",
"delegates": [
"did:key:z6MksFqXN3Yhqk8pTJdUGLwATkRfQvwZXPqR2qMEhbS9wzpT",
"did:key:z6MkireRatUThvd3qzfKht1S44wpm4FEWSSa4PRMTSQZ3voM",
"did:key:z6MkkPvBfjP4bQmco5Dm7UGsX2ruDBieEHi8n9DVJWX5sTEz"
]
},
"action": "Created",
"patch": {
"id": "25b907ff91c9124bbfb5c86b010a0a7eff736fd1",
"author": {
"id": "did:key:z6MkireRatUThvd3qzfKht1S44wpm4FEWSSa4PRMTSQZ3voM",
"alias": null
},
"title": "cli: test concurrent divergence",
"state": {
"status": "archived",
"conflicts": []
},
"before": "6dd52c94fb1472e251110e439fe656aaed74019f",
"after": "145b4cb6100bae5848e645f40bab4827d024e787",
"commits": [
"145b4cb6100bae5848e645f40bab4827d024e787"
],
"target": "d285eccb23f3986bfa88fc1af033e6dcb0dc3a65",
"labels": [],
"assignees": [],
"revisions": [
{
"id": "25b907ff91c9124bbfb5c86b010a0a7eff736fd1",
"author": {
"id": "did:key:z6MkireRatUThvd3qzfKht1S44wpm4FEWSSa4PRMTSQZ3voM",
"alias": null
},
"description": "Test the scenario where 2 peers push to the canonical branch concurrently and\nshow it can be resolved.",
"base": "6dd52c94fb1472e251110e439fe656aaed74019f",
"oid": "145b4cb6100bae5848e645f40bab4827d024e787",
"timestamp": 1715014530
}
]
}
}
{
"response": "triggered",
"run_id": {
"id": "89023835-8bb4-42af-8018-3648b8e426ed"
},
"info_url": "https://cci.rad.levitte.org//89023835-8bb4-42af-8018-3648b8e426ed.html"
}
Started at: 2026-09-07 20:00:40.151310+02:00
Commands:
$ rad clone rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5 .
✓ Creating checkout in ./...
✓ Remote cloudhead@z6MksFqXN3Yhqk8pTJdUGLwATkRfQvwZXPqR2qMEhbS9wzpT added
✓ Remote-tracking branch cloudhead@z6MksFqXN3Yhqk8pTJdUGLwATkRfQvwZXPqR2qMEhbS9wzpT/master created for z6MksFqXN3Yhqk8pTJdUGLwATkRfQvwZXPqR2qMEhbS9wzpT
✓ Remote fintohaps@z6MkireRatUThvd3qzfKht1S44wpm4FEWSSa4PRMTSQZ3voM added
✓ Remote-tracking branch fintohaps@z6MkireRatUThvd3qzfKht1S44wpm4FEWSSa4PRMTSQZ3voM/master created for z6MkireRatUThvd3qzfKht1S44wpm4FEWSSa4PRMTSQZ3voM
✓ Remote lorenz@z6MkkPvBfjP4bQmco5Dm7UGsX2ruDBieEHi8n9DVJWX5sTEz added
✓ Remote-tracking branch lorenz@z6MkkPvBfjP4bQmco5Dm7UGsX2ruDBieEHi8n9DVJWX5sTEz/master created for z6MkkPvBfjP4bQmco5Dm7UGsX2ruDBieEHi8n9DVJWX5sTEz
✓ Repository successfully cloned under /opt/radcis/ci.rad.levitte.org/cci/state/89023835-8bb4-42af-8018-3648b8e426ed/w/
╭────────────────────────────────────╮
│ heartwood │
│ Radicle Heartwood Protocol & Stack │
│ 189 issues · 38 patches │
╰────────────────────────────────────╯
Run `cd ./.` to go to the repository directory.
Exit code: 0
$ rad patch checkout 25b907ff91c9124bbfb5c86b010a0a7eff736fd1
✓ Switched to branch patch/25b907f at revision 25b907f
✓ Branch patch/25b907f setup to track rad/patches/25b907ff91c9124bbfb5c86b010a0a7eff736fd1
Exit code: 0
$ git config advice.detachedHead false
Exit code: 0
$ git checkout 145b4cb6100bae5848e645f40bab4827d024e787
HEAD is now at 145b4cb6 cli: test concurrent divergence
Exit code: 0
$ rad patch show 25b907ff91c9124bbfb5c86b010a0a7eff736fd1 -p
╭────────────────────────────────────────────────────────────────────────────────╮
│ Title cli: test concurrent divergence │
│ Patch 25b907ff91c9124bbfb5c86b010a0a7eff736fd1 │
│ Author fintohaps z6Mkire…SQZ3voM │
│ Head 145b4cb6100bae5848e645f40bab4827d024e787 │
│ Base 6dd52c94fb1472e251110e439fe656aaed74019f │
│ Target master │
│ Branches patch/25b907f │
│ Commits ahead 1, behind 1383 │
│ Status archived │
│ │
│ Test the scenario where 2 peers push to the canonical branch concurrently and │
│ show it can be resolved. │
├────────────────────────────────────────────────────────────────────────────────┤
│ 145b4cb cli: test concurrent divergence │
├────────────────────────────────────────────────────────────────────────────────┤
│ ● Revision 25b907f @ 6dd52c9..145b4cb by fintohaps z6Mkire…SQZ3voM 2 years ago │
╰────────────────────────────────────────────────────────────────────────────────╯
commit 145b4cb6100bae5848e645f40bab4827d024e787
Author: Fintan Halpenny <fintan.halpenny@gmail.com>
Date: Mon May 6 12:31:29 2024 +0100
cli: test concurrent divergence
Test the scenario where 2 peers push to the canonical branch concurrently and
show it can be resolved.
Signed-off-by: Fintan Halpenny <fintan.halpenny@gmail.com>
X-Clacks-Overhead: GNU Terry Pratchett
diff --git a/radicle-cli/examples/git/git-push-concurrent-diverge.md b/radicle-cli/examples/git/git-push-concurrent-diverge.md
new file mode 100644
index 000000000..c4f8a0db6
--- /dev/null
+++ b/radicle-cli/examples/git/git-push-concurrent-diverge.md
@@ -0,0 +1,58 @@
+We want to ensure that concurrent pushes by delegates can be resolved.
+
+So first, we add Bob as a delegate:
+
+``` ~alice
+$ rad id update --title "Add Bob" --description "" --delegate did:key:z6Mkt67GdsW7715MEfRuP4pSZxJRJh6kj6Y48WRqVv4N1tRk --repo rad:z42hL2jL4XNk6K8oHQaSWfMgCL7ji -q
+c036c0d89ce26aef3ad7da402157dba16b5163b4
+```
+
+``` ~bob
+$ rad sync --fetch
+✓ Fetching rad:z42hL2jL4XNk6K8oHQaSWfMgCL7ji from z6MknSL…StBU8Vi..
+✓ Fetched repository from 1 seed(s)
+$ rad inspect --delegates
+did:key:z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi (alice)
+did:key:z6Mkt67GdsW7715MEfRuP4pSZxJRJh6kj6Y48WRqVv4N1tRk (bob)
+```
+
+Alice and Bob simultaneously add commits (without syncing):
+
+``` ~alice
+$ git commit -m "Commit by Alice" --allow-empty -q
+$ git push rad -o no-sync
+```
+
+``` ~bob
+$ git commit -m "Commit by Bob" --allow-empty -q
+$ git push rad -o no-sync
+```
+
+When Alice attempts to `rad sync` it fails, saying that a quorum could not be
+found:
+
+``` ~alice (fails)
+$ rad sync
+✗ Fetching rad:z42hL2jL4XNk6K8oHQaSWfMgCL7ji from z6Mkt67…v4N1tRk.. error: no quorum was found
+✗ Error: repository fetch from 1 seed(s) failed
+✗ Found 1 seed(s)..
+✗ Error: all seeds timed out
+```
+
+Alice can reset to the previous commit and use `allow.rollback` to push to her
+`master` branch:
+
+``` ~alice
+$ git reset HEAD^ --hard
+HEAD is now at f2de534 Second commit
+$ git push rad -o allow.rollback -f
+```
+
+She can successfully `rad sync` again:
+
+``` ~alice
+$ rad sync
+✓ Fetching rad:z42hL2jL4XNk6K8oHQaSWfMgCL7ji from z6Mkt67…v4N1tRk..
+✓ Fetched repository from 1 seed(s)
+✓ Nothing to announce, already in sync with 1 node(s) (see `rad sync status`)
+```
diff --git a/radicle-cli/tests/commands.rs b/radicle-cli/tests/commands.rs
index 2121af6c7..1a7b8b2f5 100644
--- a/radicle-cli/tests/commands.rs
+++ b/radicle-cli/tests/commands.rs
@@ -2294,6 +2294,50 @@ fn git_push_diverge() {
.unwrap();
}
+#[test]
+fn git_push_concurrent_diverge() {
+ let mut environment = Environment::new();
+ let alice = environment.node(Config::test(Alias::new("alice")));
+ let bob = environment.node(Config::test(Alias::new("bob")));
+ let working = environment.tmp().join("working");
+ let acme = RepoId::from_str("z42hL2jL4XNk6K8oHQaSWfMgCL7ji").unwrap();
+
+ fixtures::repository(working.join("alice"));
+
+ test(
+ "examples/rad-init.md",
+ working.join("alice"),
+ Some(&alice.home),
+ [],
+ )
+ .unwrap();
+
+ let alice = alice.spawn();
+ let mut bob = bob.spawn();
+
+ bob.connect(&alice).converge([&alice]);
+ bob.fork(acme, working.join("bob")).unwrap();
+ alice.has_remote_of(&acme, &bob.id);
+
+ formula(
+ &environment.tmp(),
+ "examples/git/git-push-concurrent-diverge.md",
+ )
+ .unwrap()
+ .home(
+ "alice",
+ working.join("alice"),
+ [("RAD_HOME", alice.home.path().display())],
+ )
+ .home(
+ "bob",
+ working.join("bob").join("heartwood"),
+ [("RAD_HOME", bob.home.path().display())],
+ )
+ .run()
+ .unwrap();
+}
+
#[test]
fn rad_push_and_pull_patches() {
let mut environment = Environment::new();
Exit code: 0
shell: 'cargo --version rustc --version cargo fmt --check cargo clippy --all-targets --workspace -- --deny clippy::all cargo build --all-targets --workspace cargo doc --workspace cargo test --workspace --no-fail-fast '
Commands:
$ podman run --name 89023835-8bb4-42af-8018-3648b8e426ed -v /opt/radcis/ci.rad.levitte.org/cci/state/89023835-8bb4-42af-8018-3648b8e426ed/s:/89023835-8bb4-42af-8018-3648b8e426ed/s:ro -v /opt/radcis/ci.rad.levitte.org/cci/state/89023835-8bb4-42af-8018-3648b8e426ed/w:/89023835-8bb4-42af-8018-3648b8e426ed/w -w /89023835-8bb4-42af-8018-3648b8e426ed/w -v /opt/radcis/ci.rad.levitte.org/.radicle:/${id}/.radicle:ro -e RAD_HOME=/${id}/.radicle rust:trixie bash /89023835-8bb4-42af-8018-3648b8e426ed/s/script.sh
+ cargo --version
info: syncing channel updates for '1.77-x86_64-unknown-linux-gnu'
info: latest update on 2024-04-09, rust version 1.77.2 (25ef9e3d8 2024-04-09)
info: downloading component 'cargo'
info: downloading component 'rust-std'
info: downloading component 'rustc'
info: installing component 'cargo'
info: installing component 'rust-std'
info: installing component 'rustc'
cargo 1.77.2 (e52e36006 2024-03-26)
+ rustc --version
rustc 1.77.2 (25ef9e3d8 2024-04-09)
+ cargo fmt --check
error: 'cargo-fmt' is not installed for the toolchain '1.77-x86_64-unknown-linux-gnu'.
To install, run `rustup component add --toolchain 1.77-x86_64-unknown-linux-gnu rustfmt`
Exit code: 1
{
"response": "finished",
"result": "failure"
}