AtlatestRepositorysigil-forgejo

sigil-forgejo / tree / src / forgejoreleases.sgl

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))
14 (export forgejo-list-releases
15 forgejo-get-latest-release
16 forgejo-create-release
17 forgejo-upload-asset)
19 (begin
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")))
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")))
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 }))
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" }))))
59 ))