Monorepo for Tangled
tangled.org
1package xrpc
2
3import (
4 "fmt"
5 "net/http"
6 "runtime/debug"
7
8 "tangled.org/core/api/tangled"
9 "tangled.org/core/consts"
10)
11
12// version is set during build time.
13var version string
14
15var knotCapabilities = []string{string(consts.CapKnotACL)}
16
17func (x *Xrpc) Version(w http.ResponseWriter, r *http.Request) {
18 if version == "" {
19 info, ok := debug.ReadBuildInfo()
20 if !ok {
21 http.Error(w, "failed to read build info", http.StatusInternalServerError)
22 return
23 }
24
25 modVer := info.Main.Version
26 if modVer == "" || modVer == "(devel)" {
27 modVer = "(devel)"
28 }
29
30 var sha string
31 var modified bool
32 for _, setting := range info.Settings {
33 switch setting.Key {
34 case "vcs.revision":
35 sha = setting.Value
36 case "vcs.modified":
37 modified = setting.Value == "true"
38 }
39 }
40
41 if sha == "" {
42 version = modVer
43 } else if modified {
44 version = fmt.Sprintf("%s (%s with modifications)", modVer, sha)
45 } else {
46 version = fmt.Sprintf("%s (%s)", modVer, sha)
47 }
48 }
49
50 response := tangled.KnotVersion_Output{
51 Version: version,
52 Capabilities: knotCapabilities,
53 }
54
55 x.writeJson(w, response)
56}