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.RefNotFoundError, http.StatusNotFound)
29 return
30 }
31
32 ctx, cancel := context.WithTimeout(r.Context(), 1*time.Second)
33 defer cancel()
34
35 sizes, err := gr.AnalyzeLanguages(ctx)
36 if err != nil {
37 x.Logger.Error("failed to analyze languages", "error", err.Error())
38 writeError(w, xrpcerr.NewXrpcError(
39 xrpcerr.WithTag("InvalidRequest"),
40 xrpcerr.WithMessage("failed to analyze repository languages"),
41 ), http.StatusNoContent)
42 return
43 }
44
45 var apiLanguages []*tangled.RepoLanguages_Language
46 var totalSize int64
47
48 for _, size := range sizes {
49 totalSize += size
50 }
51
52 for name, size := range sizes {
53 percentagef64 := float64(size) / float64(totalSize) * 100
54 percentage := math.Round(percentagef64)
55
56 lang := &tangled.RepoLanguages_Language{
57 Name: name,
58 Size: size,
59 Percentage: int64(percentage),
60 }
61
62 apiLanguages = append(apiLanguages, lang)
63 }
64
65 response := tangled.RepoLanguages_Output{
66 Ref: ref,
67 Languages: apiLanguages,
68 }
69
70 if totalSize > 0 {
71 response.TotalSize = &totalSize
72 totalFiles := int64(len(sizes))
73 response.TotalFiles = &totalFiles
74 }
75
76 w.Header().Set("Content-Type", "application/json")
77 if err := json.NewEncoder(w).Encode(response); err != nil {
78 x.Logger.Error("failed to encode response", "error", err)
79 writeError(w, xrpcerr.NewXrpcError(
80 xrpcerr.WithTag("InternalServerError"),
81 xrpcerr.WithMessage("failed to encode response"),
82 ), http.StatusInternalServerError)
83 return
84 }
85}