code.gitea.io/gitea@v1.21.7/routers/api/v1/repo/language.go (about)

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