From 254998a56180556f507e2ca7b2a93d126c8f8f28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20Court=C3=A8s?= Date: Tue, 27 May 2025 11:44:19 +0200 Subject: [PATCH] forgejo: Support deletion of branches when a pull request is closed. --- guix-data-service/forgejo.scm | 22 +++++++++++++++++++- guix-data-service/web/forgejo/controller.scm | 2 +- tests/forgejo.scm | 8 ++++++- 3 files changed, 29 insertions(+), 3 deletions(-) diff --git a/guix-data-service/forgejo.scm b/guix-data-service/forgejo.scm index 5649a6b..f149529 100644 --- a/guix-data-service/forgejo.scm +++ b/guix-data-service/forgejo.scm @@ -43,7 +43,8 @@ forgejo-pull-request-draft? forgejo-pull-request-body - enqueue-job-for-pull-request)) + enqueue-job-for-pull-request + mark-pull-request-branch-for-deletion)) ;; The JSON data structures below were copied from Cuirass. @@ -125,3 +126,22 @@ (enqueue-load-new-guix-revision-job conn repository-id commit label)))) + +(define (mark-pull-request-branch-for-deletion conn pull-request) + "Mark the branch associated with @var{pull-request}, a pull request being +closed, for deletion." + (let* ((url (forgejo-pull-request-url pull-request)) + (repository-id (git-repository-url->git-repository-id + conn url #:create-if-missing? #f))) + (when repository-id + (let* ((date (time-utc->date (current-time time-utc))) + (reference (forgejo-pull-request-head pull-request)) + (branch (forgejo-repository-reference-ref reference)) + (branch-id (git-branch-for-repository-and-name + conn repository-id branch))) + (when branch-id + ;; Insert a commit entry with the empty string: this is interpreted + ;; as BRANCH-ID being a candidate for deletion. + (format #t "marking pull request branch ~s of ~s for deletion~%" + branch url) + (insert-git-commit-entry conn branch-id "" date)))))) diff --git a/guix-data-service/web/forgejo/controller.scm b/guix-data-service/web/forgejo/controller.scm index b77efd1..28df2f6 100644 --- a/guix-data-service/web/forgejo/controller.scm +++ b/guix-data-service/web/forgejo/controller.scm @@ -74,7 +74,7 @@ ('synchronized ;pull request is updated (enqueue-job-for-pull-request conn pull-request)) ('closed ;closed or merged - #f) + (mark-pull-request-branch-for-deletion conn pull-request)) (_ ;other action (render-json '((error . "unknown action")) #:code 404))))))) diff --git a/tests/forgejo.scm b/tests/forgejo.scm index 5c41aad..3716c48 100644 --- a/tests/forgejo.scm +++ b/tests/forgejo.scm @@ -127,7 +127,13 @@ (enqueue-job-for-pull-request conn pull))) (test-assert "git-commit-exists?, new commit" - (git-commit-exists? conn pull-request-new-commit))) + (git-commit-exists? conn pull-request-new-commit)) + + (test-assert "mark-pull-request-branch-for-deletion" + (let* ((event (json->forgejo-pull-request-event + pull-request-event-json)) + (pull (forgejo-pull-request-event-pull-request event))) + (mark-pull-request-branch-for-deletion conn pull)))) #:always-rollback? #t)))