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}