Monorepo for Tangled tangled.org

knotserver: add query lexicon for version

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

oppi.li e262afed 6adfb3a9

verified
Changed files
+135 -54
api
tangled
knotserver
lexicons
nix
+30
api/tangled/knotversion.go
···
··· 1 + // Code generated by cmd/lexgen (see Makefile's lexgen); DO NOT EDIT. 2 + 3 + package tangled 4 + 5 + // schema: sh.tangled.knot.version 6 + 7 + import ( 8 + "context" 9 + 10 + "github.com/bluesky-social/indigo/lex/util" 11 + ) 12 + 13 + const ( 14 + KnotVersionNSID = "sh.tangled.knot.version" 15 + ) 16 + 17 + // KnotVersion_Output is the output of a sh.tangled.knot.version call. 18 + type KnotVersion_Output struct { 19 + Version string `json:"version" cborgen:"version"` 20 + } 21 + 22 + // KnotVersion calls the XRPC method "sh.tangled.knot.version". 23 + func KnotVersion(ctx context.Context, c util.LexClient) (*KnotVersion_Output, error) { 24 + var out KnotVersion_Output 25 + if err := c.LexDo(ctx, util.Query, "", "sh.tangled.knot.version", nil, nil, &out); err != nil { 26 + return nil, err 27 + } 28 + 29 + return &out, nil 30 + }
+1 -53
knotserver/router.go
··· 5 "fmt" 6 "log/slog" 7 "net/http" 8 - "runtime/debug" 9 10 "github.com/go-chi/chi/v5" 11 "tangled.sh/tangled.sh/core/idresolver" ··· 82 }) 83 84 // xrpc apis 85 - r.Route("/xrpc", func(r chi.Router) { 86 - r.Get("/_health", h.Version) 87 - r.Mount("/", h.XrpcRouter()) 88 - }) 89 90 // Socket that streams git oplogs 91 r.Get("/events", h.Events) ··· 109 ServiceAuth: serviceAuth, 110 } 111 return xrpc.Router() 112 - } 113 - 114 - // version is set during build time. 115 - var version string 116 - 117 - func (h *Knot) Version(w http.ResponseWriter, r *http.Request) { 118 - if version == "" { 119 - info, ok := debug.ReadBuildInfo() 120 - if !ok { 121 - http.Error(w, "failed to read build info", http.StatusInternalServerError) 122 - return 123 - } 124 - 125 - var modVer string 126 - var sha string 127 - var modified bool 128 - 129 - for _, mod := range info.Deps { 130 - if mod.Path == "tangled.sh/tangled.sh/knotserver" { 131 - modVer = mod.Version 132 - break 133 - } 134 - } 135 - 136 - for _, setting := range info.Settings { 137 - switch setting.Key { 138 - case "vcs.revision": 139 - sha = setting.Value 140 - case "vcs.modified": 141 - modified = setting.Value == "true" 142 - } 143 - } 144 - 145 - if modVer == "" { 146 - modVer = "unknown" 147 - } 148 - 149 - if sha == "" { 150 - version = modVer 151 - } else if modified { 152 - version = fmt.Sprintf("%s (%s with modifications)", modVer, sha) 153 - } else { 154 - version = fmt.Sprintf("%s (%s)", modVer, sha) 155 - } 156 - } 157 - 158 - w.Header().Set("Content-Type", "text/plain; charset=utf-8") 159 - fmt.Fprintf(w, "knotserver/%s", version) 160 } 161 162 func (h *Knot) configureOwner() error {
··· 5 "fmt" 6 "log/slog" 7 "net/http" 8 9 "github.com/go-chi/chi/v5" 10 "tangled.sh/tangled.sh/core/idresolver" ··· 81 }) 82 83 // xrpc apis 84 + r.Mount("/xrpc", h.XrpcRouter()) 85 86 // Socket that streams git oplogs 87 r.Get("/events", h.Events) ··· 105 ServiceAuth: serviceAuth, 106 } 107 return xrpc.Router() 108 } 109 110 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 70 // knot query endpoints (no auth required) 71 r.Get("/"+tangled.KnotListKeysNSID, x.ListKeys) 72 73 // service query endpoints (no auth required) 74 r.Get("/"+tangled.OwnerNSID, x.Owner)
··· 69 70 // knot query endpoints (no auth required) 71 r.Get("/"+tangled.KnotListKeysNSID, x.ListKeys) 72 + r.Get("/"+tangled.KnotVersionNSID, x.Version) 73 74 // service query endpoints (no auth required) 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 sqlite-lib, 5 src, 6 }: 7 buildGoApplication { 8 pname = "knot"; 9 - version = "0.1.0"; 10 inherit src modules; 11 12 doCheck = false; 13 14 subPackages = ["cmd/knot"]; 15 tags = ["libsqlite3"]; 16 17 env.CGO_CFLAGS = "-I ${sqlite-lib}/include "; 18 env.CGO_LDFLAGS = "-L ${sqlite-lib}/lib";
··· 4 sqlite-lib, 5 src, 6 }: 7 + let 8 + version = "1.8.1-alpha"; 9 + in 10 buildGoApplication { 11 pname = "knot"; 12 + version = "1.8.1"; 13 inherit src modules; 14 15 doCheck = false; 16 17 subPackages = ["cmd/knot"]; 18 tags = ["libsqlite3"]; 19 + 20 + ldflags = [ 21 + "-X tangled.sh/tangled.sh/core/knotserver/xrpc.version=${version}" 22 + ]; 23 24 env.CGO_CFLAGS = "-I ${sqlite-lib}/include "; 25 env.CGO_LDFLAGS = "-L ${sqlite-lib}/lib";