all repos — min @ 6ede9f1cf313d3b304ac10c7ce2e33fc0ba53450

A small but practical concatenative programming language.

tasks/github.min

 1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
 100
 101
 102
 103
 104
 105
 106
 107
 108
 109
 110
 111
 112
 113
 114
 115
 116
 117
 118
 119
 120
 121
 122
 123
 124
 125
 126
 127
 128
 129
 130
 131
 132
 133
 134
 135
 136
 137
 138
 139
 140
 141
 142
 143
 144
 145
 146
 147
 148
 149
 150
 151
 152
 153
 154
 155
 156
 157
 158
 159
 160
 161
#!/usr/bin/env min

"_helpers" require :helpers 'helpers import

"next-release.md" fs.read xml.escape escape :release-body
"tasks/data/draft-release.json" fs.read :draft-release-template 

config "version" dict.get :min-version
env "github-token" dict.get :token
draft-release-template ("version" min-version "body" release-body) =% :draft-release-body

{}  
  "application/vnd.github.v3+json" "Accept" dict.set
  "token $#" (token) =% "Authorization" dict.set  
:headers

(
  symbol handle-errors
  (dict :response ==>)
  (
    response to-json "response.json" fs.write
    response "status" dict.get :status
    (status 300 >) (
      response "body" dict.get from-json :body
      body "message" dict.get :message
      status string @status
      "Error $#: $#" (status message) =% io.error status integer exit
    ) when
  )
) ::
;; Handles HTTP errors.

(
  symbol gh-req
  (dict :data ==> dict|quot :result)
  (
    data "endpoint" dict.get :endpoint
    "api" :subdomain
    (data 'subdomain dict.has?) (data "subdomain" dict.get @subdomain) when
    "https://$#.github.com/repos/h3rald/min$#" (subdomain endpoint) =% :url
    {}
      url "url" dict.set
      data "method" dict.get "method" dict.set
      (data 'headers dict.has?) 
        (data "headers" dict.get "headers" dict.set) 
        (headers "headers" dict.set) 
      if
      (data 'body dict.has?) (data "body" dict.get "body" dict.set) when
    :req
    ;req to-json puts!
    req http.request :response
    response "status" dict.get :status
    response "body" dict.get :body
    response handle-errors 
    (body length 0 >) (body from-json) ({}) if
    @result
  )
) ::
;; Execute a request using the Github API.

(
  symbol get-assets
  (dict :data ==> quot :result)
  (
    data "id" dict.get :id
    {}
      "/releases/$#/assets" (id) =% "endpoint" dict.set
      "GET" "method" dict.set
    gh-req @result
  )
) ::
;; Retrieve the assets from an existing Github release.

(
  symbol delete-assets
  (dict :config ==>)
  (
    config get-assets :assets
    config "id" dict.get :id
    assets ("id" dict.get) map :assets-ids
    assets-ids (
      :asset
      {}
        "/releases/assets/$#" (asset) =% "endpoint" dict.set
        "DELETE" "method" dict.set
      gh-req stack.pop
    ) foreach
  )
) ::
;; Delete all assets from an existing Github release.

#|| Tasks ||#

(
  symbol draft
  (==>)
  (
    {}
    "/releases" "endpoint" dict.set
    "POST" "method" dict.set
    draft-release-body "body" dict.set
    gh-req "id" dict.get string :id
    ;; Save Release ID to min.yml
    config id "id" dict.set to-yaml "min.yml" fs.write
    "Draft release v$# ($#) created successfully" (min-version id) =% io.notice!
  )
) ::
;; Creates a new draft release on Github.

(
  symbol update
  (==>)
  (
    config "id" dict.get :id
  {}
    "/releases/$#" (id) =% "endpoint" dict.set
    "PATCH" "method" dict.set
    draft-release-body "body" dict.set
  gh-req "id" dict.get string :id
  "Draft release v$# ($#) updated successfully" (min-version id) =% io.notice!
  )
) ::
;; Updates the text of the current draft Github release.

(
  symbol assets
  (==>)
  (
    config get-assets =assets 
    assets size :total
    "are" :verb
    (total 1 ==) ("is" @verb) when
    "There $# $# assets in release v$#" (verb total min-version) =% io.notice!
    assets ("name" dict.get () stack.cons "- $#" stack.swap % io.notice!) foreach 
  )
) ::
;; Retrieve a list of all the assets of the current draft Github release.

(
  symbol upload
  (==>)
  (
    config "id" dict.get :id
    config delete-assets
    sys.pwd sys.ls ("\\.zip$" match?) filter 
    (
      fs.filename :file
      "Uploading: $#" (file) =% io.notice!
      file fs.read :body
      headers "application/zip" "Content-Type" dict.set :asset-headers
      {}
        "/releases/$#/assets?name=$#" (id file) =% "endpoint" dict.set
        asset-headers "headers" dict.set
        "uploads" "subdomain" dict.set
        "POST" "method" dict.set
        body "body" dict.set
      gh-req stack.pop
    ) foreach 
  )
) ::
;; Uploads all assets to the current draft Github release, deleting any existing asset.