Mirror of @tangled.org/core. Running on a Raspberry Pi Zero 2 (Please be gentle).

knotserver: add query lexicon for version

Signed-off-by: oppiliappan <me@oppi.li>

oppi.li e262afed 6adfb3a9

verified
+105 -54
api/tangled/knotversion.go

This is a binary file and will not be displayed.

+1 -53
knotserver/router.go
··· 5 5 "fmt" 6 6 "log/slog" 7 7 "net/http" 8 - "runtime/debug" 9 8 10 9 "github.com/go-chi/chi/v5" 11 10 "tangled.sh/tangled.sh/core/idresolver" ··· 81 82 }) 82 83 83 84 // xrpc apis 84 - r.Route("/xrpc", func(r chi.Router) { 85 - r.Get("/_health", h.Version) 86 - r.Mount("/", h.XrpcRouter()) 87 - }) 85 + r.Mount("/xrpc", h.XrpcRouter()) 88 86 89 87 // Socket that streams git oplogs 90 88 r.Get("/events", h.Events) ··· 105 109 ServiceAuth: serviceAuth, 106 110 } 107 111 return xrpc.Router() 108 - } 109 - 110 - // version is set during build time. 111 - var version string 112 - 113 - func (h *Knot) Version(w http.ResponseWriter, r *http.Request) { 114 - if version == "" { 115 - info, ok := debug.ReadBuildInfo() 116 - if !ok { 117 - http.Error(w, "failed to read build info", http.StatusInternalServerError) 118 - return 119 - } 120 - 121 - var modVer string 122 - var sha string 123 - var modified bool 124 - 125 - for _, mod := range info.Deps { 126 - if mod.Path == "tangled.sh/tangled.sh/knotserver" { 127 - modVer = mod.Version 128 - break 129 - } 130 - } 131 - 132 - for _, setting := range info.Settings { 133 - switch setting.Key { 134 - case "vcs.revision": 135 - sha = setting.Value 136 - case "vcs.modified": 137 - modified = setting.Value == "true" 138 - } 139 - } 140 - 141 - if modVer == "" { 142 - modVer = "unknown" 143 - } 144 - 145 - if sha == "" { 146 - version = modVer 147 - } else if modified { 148 - version = fmt.Sprintf("%s (%s with modifications)", modVer, sha) 149 - } else { 150 - version = fmt.Sprintf("%s (%s)", modVer, sha) 151 - } 152 - } 153 - 154 - w.Header().Set("Content-Type", "text/plain; charset=utf-8") 155 - fmt.Fprintf(w, "knotserver/%s", version) 156 112 } 157 113 158 114 func (h *Knot) configureOwner() error {
+70
knotserver/xrpc/version.go
··· 1 + package xrpc 2 + 3 + import ( 4 + "encoding/json" 5 + "fmt" 6 + "net/http" 7 + "runtime/debug" 8 + 9 + "tangled.sh/tangled.sh/core/api/tangled" 10 + xrpcerr "tangled.sh/tangled.sh/core/xrpc/errors" 11 + ) 12 + 13 + // version is set during build time. 14 + var version string 15 + 16 + func (x *Xrpc) Version(w http.ResponseWriter, r *http.Request) { 17 + if version == "" { 18 + info, ok := debug.ReadBuildInfo() 19 + if !ok { 20 + http.Error(w, "failed to read build info", http.StatusInternalServerError) 21 + return 22 + } 23 + 24 + var modVer string 25 + var sha string 26 + var modified bool 27 + 28 + for _, mod := range info.Deps { 29 + if mod.Path == "tangled.sh/tangled.sh/knotserver/xrpc" { 30 + modVer = mod.Version 31 + break 32 + } 33 + } 34 + 35 + for _, setting := range info.Settings { 36 + switch setting.Key { 37 + case "vcs.revision": 38 + sha = setting.Value 39 + case "vcs.modified": 40 + modified = setting.Value == "true" 41 + } 42 + } 43 + 44 + if modVer == "" { 45 + modVer = "unknown" 46 + } 47 + 48 + if sha == "" { 49 + version = modVer 50 + } else if modified { 51 + version = fmt.Sprintf("%s (%s with modifications)", modVer, sha) 52 + } else { 53 + version = fmt.Sprintf("%s (%s)", modVer, sha) 54 + } 55 + } 56 + 57 + response := tangled.KnotVersion_Output{ 58 + Version: version, 59 + } 60 + 61 + w.Header().Set("Content-Type", "application/json") 62 + if err := json.NewEncoder(w).Encode(response); err != nil { 63 + x.Logger.Error("failed to encode response", "error", err) 64 + writeError(w, xrpcerr.NewXrpcError( 65 + xrpcerr.WithTag("InternalServerError"), 66 + xrpcerr.WithMessage("failed to encode response"), 67 + ), http.StatusInternalServerError) 68 + return 69 + } 70 + }
+1
knotserver/xrpc/xrpc.go
··· 69 69 70 70 // knot query endpoints (no auth required) 71 71 r.Get("/"+tangled.KnotListKeysNSID, x.ListKeys) 72 + r.Get("/"+tangled.KnotVersionNSID, x.Version) 72 73 73 74 // service query endpoints (no auth required) 74 75 r.Get("/"+tangled.OwnerNSID, x.Owner)
+25
lexicons/knot/version.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "sh.tangled.knot.version", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "Get the version of a knot", 8 + "output": { 9 + "encoding": "application/json", 10 + "schema": { 11 + "type": "object", 12 + "required": [ 13 + "version" 14 + ], 15 + "properties": { 16 + "version": { 17 + "type": "string" 18 + } 19 + } 20 + } 21 + }, 22 + "errors": [] 23 + } 24 + } 25 + }
+8 -1
nix/pkgs/knot-unwrapped.nix
··· 4 4 sqlite-lib, 5 5 src, 6 6 }: 7 + let 8 + version = "1.8.1-alpha"; 9 + in 7 10 buildGoApplication { 8 11 pname = "knot"; 9 - version = "0.1.0"; 12 + version = "1.8.1"; 10 13 inherit src modules; 11 14 12 15 doCheck = false; 13 16 14 17 subPackages = ["cmd/knot"]; 15 18 tags = ["libsqlite3"]; 19 + 20 + ldflags = [ 21 + "-X tangled.sh/tangled.sh/core/knotserver/xrpc.version=${version}" 22 + ]; 16 23 17 24 env.CGO_CFLAGS = "-I ${sqlite-lib}/include "; 18 25 env.CGO_LDFLAGS = "-L ${sqlite-lib}/lib";