this repo has no description
1package xrpc
2
3import (
4 "context"
5 "encoding/json"
6 "math"
7 "net/http"
8 "time"
9
10 "tangled.sh/tangled.sh/core/api/tangled"
11 "tangled.sh/tangled.sh/core/knotserver/git"
12 xrpcerr "tangled.sh/tangled.sh/core/xrpc/errors"
13)
14
15func (x *Xrpc) RepoLanguages(w http.ResponseWriter, r *http.Request) {
16 repo := r.URL.Query().Get("repo")
17 repoPath, err := x.parseRepoParam(repo)
18 if err != nil {
19 writeError(w, err.(xrpcerr.XrpcError), http.StatusBadRequest)
20 return
21 }
22
23 ref := r.URL.Query().Get("ref")
24
25 gr, err := git.Open(repoPath, ref)
26 if err != nil {
27 x.Logger.Error("opening repo", "error", err.Error())
28 writeError(w, xrpcerr.NewXrpcError(
29 xrpcerr.WithTag("RefNotFound"),
30 xrpcerr.WithMessage("repository or ref not found"),
31 ), http.StatusNotFound)
32 return
33 }
34
35 ctx, cancel := context.WithTimeout(r.Context(), 1*time.Second)
36 defer cancel()
37
38 sizes, err := gr.AnalyzeLanguages(ctx)
39 if err != nil {
40 x.Logger.Error("failed to analyze languages", "error", err.Error())
41 writeError(w, xrpcerr.NewXrpcError(
42 xrpcerr.WithTag("InvalidRequest"),
43 xrpcerr.WithMessage("failed to analyze repository languages"),
44 ), http.StatusNoContent)
45 return
46 }
47
48 var apiLanguages []*tangled.RepoLanguages_Language
49 var totalSize int64
50
51 for _, size := range sizes {
52 totalSize += size
53 }
54
55 for name, size := range sizes {
56 percentagef64 := float64(size) / float64(totalSize) * 100
57 percentage := math.Round(percentagef64)
58
59 lang := &tangled.RepoLanguages_Language{
60 Name: name,
61 Size: size,
62 Percentage: int64(percentage),
63 }
64
65 apiLanguages = append(apiLanguages, lang)
66 }
67
68 response := tangled.RepoLanguages_Output{
69 Ref: ref,
70 Languages: apiLanguages,
71 }
72
73 if totalSize > 0 {
74 response.TotalSize = &totalSize
75 totalFiles := int64(len(sizes))
76 response.TotalFiles = &totalFiles
77 }
78
79 w.Header().Set("Content-Type", "application/json")
80 if err := json.NewEncoder(w).Encode(response); err != nil {
81 x.Logger.Error("failed to encode response", "error", err)
82 writeError(w, xrpcerr.NewXrpcError(
83 xrpcerr.WithTag("InternalServerError"),
84 xrpcerr.WithMessage("failed to encode response"),
85 ), http.StatusInternalServerError)
86 return
87 }
88}