| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 | // Copyright 2020 The Gogs Authors. All rights reserved.// Use of this source code is governed by a MIT-style// license that can be found in the LICENSE file.package gitutilimport (	"github.com/pkg/errors")// TagsPage contains a list of tags and pagination information.type TagsPage struct {	// List of tags in the current page.	Tags []string	// Whether the results include the latest tag.	HasLatest bool	// When results do not include the latest tag, an indicator of 'after' to go back.	PreviousAfter string	// Whether there are more tags in the next page.	HasNext bool}func (module) ListTagsAfter(repoPath, after string, limit int) (*TagsPage, error) {	all, err := Module.RepoTags(repoPath)	if err != nil {		return nil, errors.Wrap(err, "get tags")	}	total := len(all)	if limit < 0 {		limit = 0	}	// Returns everything when no filter and no limit	if after == "" && limit == 0 {		return &TagsPage{			Tags:      all,			HasLatest: true,		}, nil	}	// No filter but has a limit, returns first X tags	if after == "" && limit > 0 {		endIdx := limit		if limit > total {			endIdx = total		}		return &TagsPage{			Tags:      all[:endIdx],			HasLatest: true,			HasNext:   limit < total,		}, nil	}	// Loop over all tags see if we can find the filter	previousAfter := ""	found := false	tags := make([]string, 0, len(all))	for i := range all {		if all[i] != after {			continue		}		found = true		if limit > 0 && i-limit >= 0 {			previousAfter = all[i-limit]		}		// In case filter is the oldest one		if i+1 < total {			tags = all[i+1:]		}		break	}	if !found {		tags = all	}	// If all tags after match is equal to the limit, it reaches the oldest tag as well.	if limit == 0 || len(tags) <= limit {		return &TagsPage{			Tags:          tags,			HasLatest:     !found,			PreviousAfter: previousAfter,		}, nil	}	return &TagsPage{		Tags:          tags[:limit],		HasLatest:     !found,		PreviousAfter: previousAfter,		HasNext:       true,	}, nil}
 |