mirror of
https://github.com/gogs/gogs.git
synced 2025-05-13 02:49:48 +00:00
* WIP * Finish `internal/db/git_diff.go` * FInish internal/db/mirror.go * Finish internal/db/pull.go * Finish internal/db/release.go * Finish internal/db/repo.go * Finish internal/db/repo_branch.go * Finish internal/db/repo_editor.go * Finish internal/db/update.go * Save my work * Add license header * Compile! * Merge master * Finish internal/cmd/hook.go * Finish internal/conf/static.go * Finish internal/context/repo.go * Finish internal/db/action.go * Finish internal/db/git_diff.go * Fix submodule URL inferring * Finish internal/db/mirror.go * Updat to beta.4 * css: update fonts * Finish internal/db/pull.go * Finish internal/db/release.go * Finish internal/db/repo_branch.go * Finish internal/db/wiki.go * gitutil: enhance infer submodule UR * Finish internal/route/api/v1/repo/commits.go * mirror: only collect branch commits after sync * mirror: fix tag support * Finish internal/db/repo.go * Finish internal/db/repo_editor.go * Finish internal/db/update.go * Finish internal/gitutil/pull_request.go * Make it compile * Finish internal/route/repo/setting.go * Finish internal/route/repo/branch.go * Finish internal/route/api/v1/repo/file.go * Finish internal/route/repo/download.go * Finish internal/route/repo/editor.go * Use helper * Finish internal/route/repo/issue.go * Finish internal/route/repo/pull.go * Finish internal/route/repo/release.go * Finish internal/route/repo/repo.go * Finish internal/route/repo/wiki.go * Finish internal/route/repo/commit.go * Finish internal/route/repo/view.go * Finish internal/gitutil/tag.go * go.sum
96 lines
2.0 KiB
Go
96 lines
2.0 KiB
Go
// 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 gitutil
|
|
|
|
import (
|
|
"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 (moduler) 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
|
|
}
|