+30
api/tangled/knotversion.go
+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
+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
+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
+1
knotserver/xrpc/xrpc.go
+25
lexicons/knot/version.json
+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
+8
-1
nix/pkgs/knot-unwrapped.nix
···
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";