Commit15bdc809Recorded20 Mar 2026Repositorysigil-forgejo

Initial sigil-forgejo library

Changed
 dev-redirects.sgl        |  6 ++++++
 package.sgl              | 27 +++++++++++++++++++++++++++
 src/forgejo/client.sgl   | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/forgejo/issues.sgl   | 49 +++++++++++++++++++++++++++++++++++++++++++++++++
 src/forgejo/orgs.sgl     | 28 ++++++++++++++++++++++++++++
 src/forgejo/pulls.sgl    | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/forgejo/releases.sgl | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/forgejo/repos.sgl    | 49 +++++++++++++++++++++++++++++++++++++++++++++++++
 src/forgejo/topics.sgl   | 44 ++++++++++++++++++++++++++++++++++++++++++++
 9 files changed, 385 insertions(+)
Diff
dev-redirects.sgladded
@@ -0,0 +1,6 @@
+1
;; Development redirects — point dependencies at local Sigil checkout
+2
(redirects
+3
repos: (list
+4
(for-repo
+5
url: "codeberg:sigil/sigil"
+6
use: (from-path dir: "../sigil"))))
package.sgladded
@@ -0,0 +1,27 @@
+1
;;; sigil-forgejo - Forgejo/Codeberg API client library
+2
;;;
+3
;;; Provides typed access to the Forgejo REST API for managing repositories,
+4
;;; organizations, topics, issues, pull requests, releases, and more.
+5
+6
(define sigil-repo "codeberg:sigil/sigil")
+7
+8
(package
+9
name: "sigil-forgejo"
+10
version: "0.1.0"
+11
description: "Forgejo/Codeberg API client library"
+12
url: "https://codeberg.org/sigil/sigil-forgejo"
+13
license: "BSD-3-Clause"
+14
authors: (list "David Wilson <[email protected]>")
+15
+16
dependencies: (list
+17
(from-git url: sigil-repo package: "sigil-stdlib")
+18
(from-git url: sigil-repo package: "sigil-http")
+19
(from-git url: sigil-repo package: "sigil-tls"))
+20
+21
tasks: (list
+22
(task
+23
name: 'build
+24
description: "Compile sigil-forgejo modules"
+25
steps: (list
+26
(compile-sigil-modules sources: "src/**/*.sgl"
+27
output-dir: (config-output-subdir "lib"))))))
src/forgejo/client.sgladded
@@ -0,0 +1,69 @@
+1
;;; (forgejo client) - Shared Forgejo API client utilities.
+2
;;;
+3
;;; Provides authentication headers and URL construction used by all
+4
;;; other forgejo modules.
+5
+6
(define-library (forgejo client)
+7
(import (sigil core)
+8
(sigil dict)
+9
(sigil string)
+10
(sigil json)
+11
(sigil http client))
+12
+13
(export forgejo-auth-headers
+14
forgejo-api-url
+15
forgejo-get/json
+16
forgejo-post/json
+17
forgejo-put/json
+18
forgejo-patch/json
+19
forgejo-delete)
+20
+21
(begin
+22
+23
;;; Build authorization headers for the Forgejo API.
+24
(define (forgejo-auth-headers token)
+25
#{ authorization: (string-append "token " token) })
+26
+27
;;; Build an API URL from a base URL and path segments.
+28
;;;
+29
;;; (forgejo-api-url "https://codeberg.org" "repos" "sigil" "kiln")
+30
;;; => "https://codeberg.org/api/v1/repos/sigil/kiln"
+31
(define (forgejo-api-url base-url . parts)
+32
(apply string-append base-url "/api/v1"
+33
(map (lambda (p) (string-append "/" p)) parts)))
+34
+35
;;; Authenticated JSON GET request.
+36
(define (forgejo-get/json token url)
+37
(http-get/json url headers: (forgejo-auth-headers token)))
+38
+39
;;; Authenticated JSON POST request.
+40
(define (forgejo-post/json token url body)
+41
(http-post/json url body headers: (forgejo-auth-headers token)))
+42
+43
;;; Authenticated JSON PUT request.
+44
(define (forgejo-put/json token url body)
+45
(let ((response (http-put url
+46
(json-encode body)
+47
headers: (dict-merge
+48
(forgejo-auth-headers token)
+49
#{ content-type: "application/json" }))))
+50
(if (http-response? response)
+51
(http-response-json response)
+52
response)))
+53
+54
;;; Authenticated JSON PATCH request.
+55
(define (forgejo-patch/json token url body)
+56
(let ((response (http-patch url
+57
(json-encode body)
+58
headers: (dict-merge
+59
(forgejo-auth-headers token)
+60
#{ content-type: "application/json" }))))
+61
(if (http-response? response)
+62
(http-response-json response)
+63
response)))
+64
+65
;;; Authenticated DELETE request.
+66
(define (forgejo-delete token url)
+67
(http-delete url headers: (forgejo-auth-headers token)))
+68
+69
))
src/forgejo/issues.sgladded
@@ -0,0 +1,49 @@
+1
;;; (forgejo issues) - Forgejo issue API.
+2
;;;
+3
;;; List, create, get, and comment on issues.
+4
+5
(define-library (forgejo issues)
+6
(import (sigil core)
+7
(sigil string)
+8
(forgejo client))
+9
+10
(export forgejo-list-issues
+11
forgejo-get-issue
+12
forgejo-create-issue
+13
forgejo-create-issue-comment
+14
forgejo-list-issue-comments)
+15
+16
(begin
+17
+18
;;; List issues for a repository.
+19
(define (forgejo-list-issues base-url token owner repo)
+20
(forgejo-get/json token
+21
(forgejo-api-url base-url "repos" owner repo "issues")))
+22
+23
;;; Get a single issue by number.
+24
(define (forgejo-get-issue base-url token owner repo number)
+25
(forgejo-get/json token
+26
(forgejo-api-url base-url "repos" owner repo "issues"
+27
(number->string number))))
+28
+29
;;; Create a new issue.
+30
(define (forgejo-create-issue base-url token owner repo title body)
+31
(forgejo-post/json token
+32
(forgejo-api-url base-url "repos" owner repo "issues")
+33
#{ title: title
+34
body: body }))
+35
+36
;;; Add a comment to an issue.
+37
(define (forgejo-create-issue-comment base-url token owner repo number body)
+38
(forgejo-post/json token
+39
(forgejo-api-url base-url "repos" owner repo "issues"
+40
(number->string number) "comments")
+41
#{ body: body }))
+42
+43
;;; List comments on an issue.
+44
(define (forgejo-list-issue-comments base-url token owner repo number)
+45
(forgejo-get/json token
+46
(forgejo-api-url base-url "repos" owner repo "issues"
+47
(number->string number) "comments")))
+48
+49
))
src/forgejo/orgs.sgladded
@@ -0,0 +1,28 @@
+1
;;; (forgejo orgs) - Forgejo organization API.
+2
;;;
+3
;;; List organization repositories and information.
+4
+5
(define-library (forgejo orgs)
+6
(import (sigil core)
+7
(sigil string)
+8
(forgejo client))
+9
+10
(export forgejo-get-org
+11
forgejo-list-org-repos)
+12
+13
(begin
+14
+15
;;; Get organization information.
+16
(define (forgejo-get-org base-url token org)
+17
(forgejo-get/json token
+18
(forgejo-api-url base-url "orgs" org)))
+19
+20
;;; List repositories in an organization.
+21
;;;
+22
;;; Returns an array of repository objects.
+23
(define (forgejo-list-org-repos base-url token org)
+24
(forgejo-get/json token
+25
(string-append (forgejo-api-url base-url "orgs" org "repos")
+26
"?limit=50")))
+27
+28
))
src/forgejo/pulls.sgladded
@@ -0,0 +1,54 @@
+1
;;; (forgejo pulls) - Forgejo pull request API.
+2
;;;
+3
;;; List, get, create, and merge pull requests.
+4
+5
(define-library (forgejo pulls)
+6
(import (sigil core)
+7
(sigil string)
+8
(forgejo client))
+9
+10
(export forgejo-list-pulls
+11
forgejo-get-pull
+12
forgejo-create-pull
+13
forgejo-merge-pull
+14
forgejo-pull-is-fork?)
+15
+16
(begin
+17
+18
;;; List pull requests for a repository.
+19
(define (forgejo-list-pulls base-url token owner repo)
+20
(forgejo-get/json token
+21
(forgejo-api-url base-url "repos" owner repo "pulls")))
+22
+23
;;; Get a single pull request by number.
+24
(define (forgejo-get-pull base-url token owner repo number)
+25
(forgejo-get/json token
+26
(forgejo-api-url base-url "repos" owner repo "pulls"
+27
(number->string number))))
+28
+29
;;; Create a new pull request.
+30
(define (forgejo-create-pull base-url token owner repo title body
+31
head base)
+32
(forgejo-post/json token
+33
(forgejo-api-url base-url "repos" owner repo "pulls")
+34
#{ title: title
+35
body: body
+36
head: head
+37
base: base }))
+38
+39
;;; Merge a pull request.
+40
(define (forgejo-merge-pull base-url token owner repo number)
+41
(forgejo-post/json token
+42
(forgejo-api-url base-url "repos" owner repo "pulls"
+43
(number->string number) "merge")
+44
#{ Do: "merge" }))
+45
+46
;;; Check if a pull request is from a fork.
+47
(define (forgejo-pull-is-fork? pr-data)
+48
(let* ((head (dict-ref pr-data head: #f))
+49
(repo (and head (dict-ref head repo: #f))))
+50
(if repo
+51
(eq? #t (dict-ref repo fork: #f))
+52
#f)))
+53
+54
))
src/forgejo/releases.sgladded
@@ -0,0 +1,59 @@
+1
;;; (forgejo releases) - Forgejo release management API.
+2
;;;
+3
;;; List, create, and manage releases and their assets.
+4
+5
(define-library (forgejo releases)
+6
(import (sigil core)
+7
(sigil dict)
+8
(sigil string)
+9
(sigil json)
+10
(sigil fs)
+11
(sigil http client)
+12
(forgejo client))
+13
+14
(export forgejo-list-releases
+15
forgejo-get-latest-release
+16
forgejo-create-release
+17
forgejo-upload-asset)
+18
+19
(begin
+20
+21
;;; List releases for a repository.
+22
(define (forgejo-list-releases base-url token owner repo)
+23
(forgejo-get/json token
+24
(forgejo-api-url base-url "repos" owner repo "releases")))
+25
+26
;;; Get the latest release for a repository.
+27
(define (forgejo-get-latest-release base-url token owner repo)
+28
(forgejo-get/json token
+29
(string-append (forgejo-api-url base-url "repos" owner repo "releases")
+30
"?limit=1")))
+31
+32
;;; Create a release on a repository.
+33
(define (forgejo-create-release base-url token owner repo tag-name
+34
name body)
+35
(forgejo-post/json token
+36
(forgejo-api-url base-url "repos" owner repo "releases")
+37
#{ tag_name: tag-name
+38
name: name
+39
body: body }))
+40
+41
;;; Upload an asset to a release.
+42
;;;
+43
;;; release-id: the numeric ID of the release
+44
;;; file-path: local path to the file to upload
+45
;;; asset-name: the name the asset should have in the release
+46
(define (forgejo-upload-asset base-url token owner repo
+47
release-id file-path asset-name)
+48
(let* ((url (string-append
+49
(forgejo-api-url base-url "repos" owner repo
+50
"releases" (number->string release-id)
+51
"assets")
+52
"?name=" asset-name))
+53
(data (read-file-bytes file-path)))
+54
(http-post url data
+55
headers: (dict-merge
+56
(forgejo-auth-headers token)
+57
#{ content-type: "application/octet-stream" }))))
+58
+59
))
src/forgejo/repos.sgladded
@@ -0,0 +1,49 @@
+1
;;; (forgejo repos) - Forgejo repository API.
+2
;;;
+3
;;; Get, list, create, and delete repositories.
+4
+5
(define-library (forgejo repos)
+6
(import (sigil core)
+7
(sigil string)
+8
(forgejo client))
+9
+10
(export forgejo-get-repo
+11
forgejo-list-repos
+12
forgejo-create-repo
+13
forgejo-create-org-repo
+14
forgejo-delete-repo)
+15
+16
(begin
+17
+18
;;; Get repository information.
+19
(define (forgejo-get-repo base-url token owner repo)
+20
(forgejo-get/json token
+21
(forgejo-api-url base-url "repos" owner repo)))
+22
+23
;;; List repositories for a user.
+24
(define (forgejo-list-repos base-url token owner)
+25
(forgejo-get/json token
+26
(forgejo-api-url base-url "users" owner "repos")))
+27
+28
;;; Create a new repository for the authenticated user.
+29
(define (forgejo-create-repo base-url token name description)
+30
(forgejo-post/json token
+31
(forgejo-api-url base-url "user" "repos")
+32
#{ name: name
+33
description: description
+34
auto_init: #t }))
+35
+36
;;; Create a new repository under an organization.
+37
(define (forgejo-create-org-repo base-url token org name description)
+38
(forgejo-post/json token
+39
(forgejo-api-url base-url "orgs" org "repos")
+40
#{ name: name
+41
description: description
+42
auto_init: #t }))
+43
+44
;;; Delete a repository.
+45
(define (forgejo-delete-repo base-url token owner repo)
+46
(forgejo-delete token
+47
(forgejo-api-url base-url "repos" owner repo)))
+48
+49
))
src/forgejo/topics.sgladded
@@ -0,0 +1,44 @@
+1
;;; (forgejo topics) - Forgejo repository topic management.
+2
;;;
+3
;;; List, add, and replace topics on repositories.
+4
+5
(define-library (forgejo topics)
+6
(import (sigil core)
+7
(sigil string)
+8
(sigil array)
+9
(forgejo client))
+10
+11
(export forgejo-list-topics
+12
forgejo-replace-topics
+13
forgejo-add-topic
+14
forgejo-delete-topic)
+15
+16
(begin
+17
+18
;;; List topics on a repository.
+19
;;;
+20
;;; Returns the topic list response.
+21
(define (forgejo-list-topics base-url token owner repo)
+22
(forgejo-get/json token
+23
(forgejo-api-url base-url "repos" owner repo "topics")))
+24
+25
;;; Replace all topics on a repository.
+26
;;;
+27
;;; topics: a list of topic name strings
+28
(define (forgejo-replace-topics base-url token owner repo topics)
+29
(forgejo-put/json token
+30
(forgejo-api-url base-url "repos" owner repo "topics")
+31
#{ topics: (list->array topics) }))
+32
+33
;;; Add a single topic to a repository.
+34
(define (forgejo-add-topic base-url token owner repo topic)
+35
(forgejo-put/json token
+36
(forgejo-api-url base-url "repos" owner repo "topics" topic)
+37
#{}))
+38
+39
;;; Remove a single topic from a repository.
+40
(define (forgejo-delete-topic base-url token owner repo topic)
+41
(forgejo-delete token
+42
(forgejo-api-url base-url "repos" owner repo "topics" topic)))
+43
+44
))