[API] enable paggination for ListRepoTags (#10454)
* enable paggination for repoTags * precalculate first, cut slice second * Apply suggestions from code review Co-Authored-By: guillep2k <18600385+guillep2k@users.noreply.github.com> Co-authored-by: guillep2k <18600385+guillep2k@users.noreply.github.com>
This commit is contained in:
		
							parent
							
								
									b098cc24c5
								
							
						
					
					
						commit
						4427a936b4
					
				
					 4 changed files with 38 additions and 3 deletions
				
			
		|  | @ -187,7 +187,7 @@ func (repo *Repository) GetTag(name string) (*Tag, error) { | |||
| } | ||||
| 
 | ||||
| // GetTagInfos returns all tag infos of the repository.
 | ||||
| func (repo *Repository) GetTagInfos() ([]*Tag, error) { | ||||
| func (repo *Repository) GetTagInfos(page, pageSize int) ([]*Tag, error) { | ||||
| 	// TODO this a slow implementation, makes one git command per tag
 | ||||
| 	stdout, err := NewCommand("tag").RunInDir(repo.Path) | ||||
| 	if err != nil { | ||||
|  | @ -195,6 +195,18 @@ func (repo *Repository) GetTagInfos() ([]*Tag, error) { | |||
| 	} | ||||
| 
 | ||||
| 	tagNames := strings.Split(strings.TrimRight(stdout, "\n"), "\n") | ||||
| 
 | ||||
| 	if page != 0 { | ||||
| 		skip := (page - 1) * pageSize | ||||
| 		if skip >= len(tagNames) { | ||||
| 			return nil, nil | ||||
| 		} | ||||
| 		if (len(tagNames) - skip) < pageSize { | ||||
| 			pageSize = len(tagNames) - skip | ||||
| 		} | ||||
| 		tagNames = tagNames[skip : skip+pageSize] | ||||
| 	} | ||||
| 
 | ||||
| 	var tags = make([]*Tag, 0, len(tagNames)) | ||||
| 	for _, tagName := range tagNames { | ||||
| 		tagName = strings.TrimSpace(tagName) | ||||
|  |  | |||
|  | @ -18,7 +18,7 @@ func TestRepository_GetTags(t *testing.T) { | |||
| 	assert.NoError(t, err) | ||||
| 	defer bareRepo1.Close() | ||||
| 
 | ||||
| 	tags, err := bareRepo1.GetTagInfos() | ||||
| 	tags, err := bareRepo1.GetTagInfos(0, 0) | ||||
| 	assert.NoError(t, err) | ||||
| 	assert.Len(t, tags, 1) | ||||
| 	assert.EqualValues(t, "test", tags[0].Name) | ||||
|  |  | |||
|  | @ -10,6 +10,7 @@ import ( | |||
| 	"code.gitea.io/gitea/modules/context" | ||||
| 	"code.gitea.io/gitea/modules/convert" | ||||
| 	api "code.gitea.io/gitea/modules/structs" | ||||
| 	"code.gitea.io/gitea/routers/api/v1/utils" | ||||
| ) | ||||
| 
 | ||||
| // ListTags list all the tags of a repository
 | ||||
|  | @ -30,11 +31,21 @@ func ListTags(ctx *context.APIContext) { | |||
| 	//   description: name of the repo
 | ||||
| 	//   type: string
 | ||||
| 	//   required: true
 | ||||
| 	// - name: page
 | ||||
| 	//   in: query
 | ||||
| 	//   description: page number of results to return (1-based)
 | ||||
| 	//   type: integer
 | ||||
| 	// - name: limit
 | ||||
| 	//   in: query
 | ||||
| 	//   description: page size of results, default maximum page size is 50
 | ||||
| 	//   type: integer
 | ||||
| 	// responses:
 | ||||
| 	//   "200":
 | ||||
| 	//     "$ref": "#/responses/TagList"
 | ||||
| 
 | ||||
| 	tags, err := ctx.Repo.GitRepo.GetTagInfos() | ||||
| 	listOpts := utils.GetListOptions(ctx) | ||||
| 
 | ||||
| 	tags, err := ctx.Repo.GitRepo.GetTagInfos(listOpts.Page, listOpts.PageSize) | ||||
| 	if err != nil { | ||||
| 		ctx.Error(http.StatusInternalServerError, "GetTags", err) | ||||
| 		return | ||||
|  |  | |||
|  | @ -7251,6 +7251,18 @@ | |||
|             "name": "repo", | ||||
|             "in": "path", | ||||
|             "required": true | ||||
|           }, | ||||
|           { | ||||
|             "type": "integer", | ||||
|             "description": "page number of results to return (1-based)", | ||||
|             "name": "page", | ||||
|             "in": "query" | ||||
|           }, | ||||
|           { | ||||
|             "type": "integer", | ||||
|             "description": "page size of results, default maximum page size is 50", | ||||
|             "name": "limit", | ||||
|             "in": "query" | ||||
|           } | ||||
|         ], | ||||
|         "responses": { | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue