diff --git a/src/forge/bitbucket.rs b/src/forge/bitbucket.rs index b5b8adb9..b0225688 100644 --- a/src/forge/bitbucket.rs +++ b/src/forge/bitbucket.rs @@ -27,8 +27,10 @@ impl Forge for BitbucketForge { } let url = format!( - "{}/repositories/{}/refs/tags/{tag}", - self.api_base, self.slug + "{}/repositories/{}/refs/tags/{}", + self.api_base, + self.slug, + crate::config::percent_encode_path(tag) ); let response: serde_json::Value = self .agent diff --git a/src/forge/bitbucket/api_tests.rs b/src/forge/bitbucket/api_tests.rs index 33727985..f563b4b3 100644 --- a/src/forge/bitbucket/api_tests.rs +++ b/src/forge/bitbucket/api_tests.rs @@ -39,6 +39,20 @@ fn a_cloud_release_resolves_the_tag_and_returns_its_page() { assert_eq!(req.header("authorization"), Some("Bearer bb-secret")); } +#[test] +fn a_cloud_release_encodes_a_tag_that_would_cut_the_url() { + let server = FakeServer::start(vec![Reply::json(200, json!({}))]); + + cloud(&server) + .create_release("api@v1.0.0+build#7", "notes", false, false) + .unwrap(); + + assert_eq!( + server.only_request().path, + "/repositories/workspace/repo/refs/tags/api%40v1.0.0%2Bbuild%237" + ); +} + #[test] fn a_missing_cloud_tag_is_a_create_release_error() { let server = FakeServer::start(vec![Reply::json(