Skip to content

Commit aee715b

Browse files
committed
Add language statistics API
1 parent 3af51f1 commit aee715b

File tree

4 files changed

+138
-0
lines changed

4 files changed

+138
-0
lines changed

routers/api/v1/api.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -850,6 +850,7 @@ func RegisterRoutes(m *macaron.Macaron) {
850850
Delete(reqToken(), repo.DeleteTopic)
851851
}, reqAdmin())
852852
}, reqAnyRepoReader())
853+
m.Get("/languages", reqRepoReader(models.UnitTypeCode), repo.GetLanguages)
853854
}, repoAssignment())
854855
})
855856

routers/api/v1/repo/language.go

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
// Copyright 2020 The Gitea Authors. All rights reserved.
2+
// Use of this source code is governed by a MIT-style
3+
// license that can be found in the LICENSE file.
4+
5+
package repo
6+
7+
import (
8+
"bytes"
9+
"net/http"
10+
"strconv"
11+
12+
"code.gitea.io/gitea/models"
13+
"code.gitea.io/gitea/modules/context"
14+
"code.gitea.io/gitea/modules/log"
15+
)
16+
17+
type languageResponse []*models.LanguageStat
18+
19+
func (l languageResponse) MarshalJSON() ([]byte, error) {
20+
var buf bytes.Buffer
21+
if _, err := buf.WriteString("{"); err != nil {
22+
return nil, err
23+
}
24+
for i, lang := range l {
25+
if i > 0 {
26+
if _, err := buf.WriteString(","); err != nil {
27+
return nil, err
28+
}
29+
}
30+
if _, err := buf.WriteString(strconv.Quote(lang.Language)); err != nil {
31+
return nil, err
32+
}
33+
if _, err := buf.WriteString(":"); err != nil {
34+
return nil, err
35+
}
36+
if _, err := buf.WriteString(strconv.FormatInt(lang.Size, 10)); err != nil {
37+
return nil, err
38+
}
39+
}
40+
if _, err := buf.WriteString("}"); err != nil {
41+
return nil, err
42+
}
43+
44+
return buf.Bytes(), nil
45+
}
46+
47+
// GetLanguages returns languages and number of bytes of code written
48+
func GetLanguages(ctx *context.APIContext) {
49+
// swagger:operation GET /repos/{owner}/{repo}/languages repository repoGetLanguages
50+
// ---
51+
// summary: Get languages and number of bytes of code written
52+
// produces:
53+
// - application/json
54+
// parameters:
55+
// - name: owner
56+
// in: path
57+
// description: owner of the repo
58+
// type: string
59+
// required: true
60+
// - name: repo
61+
// in: path
62+
// description: name of the repo
63+
// type: string
64+
// required: true
65+
// responses:
66+
// "404":
67+
// "$ref": "#/responses/notFound"
68+
// "200":
69+
// "$ref": "#/responses/LanguageStatistics"
70+
71+
langs, err := ctx.Repo.Repository.GetLanguageStats()
72+
if err != nil {
73+
log.Error("GetLanguageStats failed: %v", err)
74+
ctx.InternalServerError(err)
75+
return
76+
}
77+
78+
resp := make(languageResponse, len(langs))
79+
for i, v := range langs {
80+
resp[i] = v
81+
}
82+
83+
ctx.JSON(http.StatusOK, resp)
84+
}

routers/api/v1/swagger/repo.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -302,3 +302,10 @@ type swaggerTopicNames struct {
302302
// in: body
303303
Body api.TopicName `json:"body"`
304304
}
305+
306+
// LanguageStatistics
307+
// swagger:response LanguageStatistics
308+
type swaggerLanguageStatistics struct {
309+
// in: body
310+
Body map[string]int64 `json:"body"`
311+
}

templates/swagger/v1_json.tmpl

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6049,6 +6049,42 @@
60496049
}
60506050
}
60516051
},
6052+
"/repos/{owner}/{repo}/languages": {
6053+
"get": {
6054+
"produces": [
6055+
"application/json"
6056+
],
6057+
"tags": [
6058+
"repository"
6059+
],
6060+
"summary": "Get languages and number of bytes of code written",
6061+
"operationId": "repoGetLanguages",
6062+
"parameters": [
6063+
{
6064+
"type": "string",
6065+
"description": "owner of the repo",
6066+
"name": "owner",
6067+
"in": "path",
6068+
"required": true
6069+
},
6070+
{
6071+
"type": "string",
6072+
"description": "name of the repo",
6073+
"name": "repo",
6074+
"in": "path",
6075+
"required": true
6076+
}
6077+
],
6078+
"responses": {
6079+
"200": {
6080+
"$ref": "#/responses/LanguageStatistics"
6081+
},
6082+
"404": {
6083+
"$ref": "#/responses/notFound"
6084+
}
6085+
}
6086+
}
6087+
},
60526088
"/repos/{owner}/{repo}/milestones": {
60536089
"get": {
60546090
"produces": [
@@ -14808,6 +14844,16 @@
1480814844
}
1480914845
}
1481014846
},
14847+
"LanguageStatistics": {
14848+
"description": "LanguageStatistics",
14849+
"schema": {
14850+
"type": "object",
14851+
"additionalProperties": {
14852+
"type": "integer",
14853+
"format": "int64"
14854+
}
14855+
}
14856+
},
1481114857
"MarkdownRender": {
1481214858
"description": "MarkdownRender is a rendered markdown document",
1481314859
"schema": {

0 commit comments

Comments
 (0)