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
))