diff --git a/CHANGELOG.md b/CHANGELOG.md index 835234e91010ddead34651f0d81bd856a44c163c..937ee5434ab9e84587cc868580c717e97c1f998b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ## Additions * Add support for GitLab API authentication with job tokens. + * Add DeleteTag api # v0.1709.0 diff --git a/src/api/README.md b/src/api/README.md index b1ee2d8c0708532e69741b163e028fa944b889b9..9de10e511e9bbf89cd4d62e8d6758af4e7f4e467 100644 --- a/src/api/README.md +++ b/src/api/README.md @@ -239,6 +239,7 @@ These API endpoints have been implemented. * `GET /projects/:project/repository/tags` `projects/repository/tags/tags.rs` * `POST /projects/:project/repository/tags` `projects/repository/tags/create.rs` * `GET /projects/:project/repository/tags/:tag` `projects/repository/tags/tag.rs` + * `DELETE /projects/:project/repository/tags/:tag` `projects/repository/tags/delete.rs` * `GET /projects/:project/repository/tree` `projects/repository/tree.rs` * `GET /projects/:project/runners` `projects/runners/runners.rs` * `POST /projects/:project/runners` `projects/runners/enable.rs` @@ -487,7 +488,6 @@ instead of having to search the page for missing endpoints. * `GET /projects/:project/repository/merge_base` https://gitlab.kitware.com/help/api/repositories.md#merge-base * `DELETE /projects/:project/repository/merged_branches` https://gitlab.kitware.com/help/api/branches.md#delete-merged-branches Arguably this should be `POST /projects/:project/repository/delete_merged_branches` - * `DELETE /projects/:project/repository/tags/:tag` https://gitlab.kitware.com/help/api/tags.md#delete-a-tag * `GET /projects/:project/repository/tags/:tag/signature` https://gitlab.kitware.com/help/api/tags.md#get-x509-signature-of-a-tag * `POST /projects/:project/restore` https://gitlab.kitware.com/help/api/projects.md#restore-project-marked-for-deletion-premium * `GET /projects/:project/share_locations` https://gitlab.kitware.com/help/api/projects.md#list-a-projects-shareable-groups diff --git a/src/api/projects/repository/tags.rs b/src/api/projects/repository/tags.rs index 2f66cad6979f89497e68e3c16fb54c68e9a3ad6e..2c35e28422c7997efb68ba91d751ecbc74af5f3b 100644 --- a/src/api/projects/repository/tags.rs +++ b/src/api/projects/repository/tags.rs @@ -9,6 +9,7 @@ //! These endpoints are used for interacting with a project's git tags. mod create; +mod delete; mod tag; mod tags; @@ -24,3 +25,7 @@ pub use self::tags::Tags; pub use self::tags::TagsBuilder; pub use self::tags::TagsBuilderError; pub use self::tags::TagsOrderBy; + +pub use self::delete::DeleteTag; +pub use self::delete::DeleteTagBuilder; +pub use self::delete::DeleteTagBuilderError; diff --git a/src/api/projects/repository/tags/delete.rs b/src/api/projects/repository/tags/delete.rs new file mode 100644 index 0000000000000000000000000000000000000000..be67778d25e809911684b90f6c94e65476e589eb --- /dev/null +++ b/src/api/projects/repository/tags/delete.rs @@ -0,0 +1,89 @@ +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +use derive_builder::Builder; + +use crate::api::common::NameOrId; +use crate::api::endpoint_prelude::*; + +/// Delete a tag on a project. +#[derive(Debug, Builder, Clone)] +pub struct DeleteTag<'a> { + /// The project to delete a tag on. + #[builder(setter(into))] + project: NameOrId<'a>, + /// The name of the tag. + #[builder(setter(into))] + tag: Cow<'a, str>, +} + +impl<'a> DeleteTag<'a> { + /// Create a builder for the endpoint. + pub fn builder() -> DeleteTagBuilder<'a> { + DeleteTagBuilder::default() + } +} + +impl Endpoint for DeleteTag<'_> { + fn method(&self) -> Method { + Method::DELETE + } + + fn endpoint(&self) -> Cow<'static, str> { + format!("projects/{}/repository/tags/{}", self.project, self.tag).into() + } +} + +#[cfg(test)] +mod tests { + use http::Method; + + use crate::api::projects::repository::tags::{DeleteTag, DeleteTagBuilderError}; + use crate::api::{self, Query}; + use crate::test::client::{ExpectedUrl, SingleTestClient}; + + #[test] + fn project_is_necessary() { + let err = DeleteTag::builder().tag("mytag").build().unwrap_err(); + crate::test::assert_missing_field!(err, DeleteTagBuilderError, "project"); + } + + #[test] + fn tag_is_necessary() { + let err = DeleteTag::builder() + .project("test/project") + .build() + .unwrap_err(); + crate::test::assert_missing_field!(err, DeleteTagBuilderError, "tag"); + } + + #[test] + fn project_and_tag_are_sufficient() { + DeleteTag::builder() + .project(1) + .tag("mytag") + .build() + .unwrap(); + } + + #[test] + fn endpoint() { + let endpoint = ExpectedUrl::builder() + .method(Method::DELETE) + .endpoint("projects/simple%2Fproject/repository/tags/mytag") + .build() + .unwrap(); + + let client = SingleTestClient::new_raw(endpoint, ""); + + let endpoint = DeleteTag::builder() + .project("simple/project") + .tag("mytag") + .build() + .unwrap(); + api::ignore(endpoint).query(&client).unwrap(); + } +}