aboutsummaryrefslogtreecommitdiff
path: root/internal/gitutil/tag.go
diff options
context:
space:
mode:
authorᴜɴᴋɴᴡᴏɴ <u@gogs.io>2020-03-08 19:09:31 +0800
committerGitHub <noreply@github.com>2020-03-08 19:09:31 +0800
commit6437d0180b97a26319b50c2e22927dac7c94fcdd (patch)
tree3d0d097e7f498e4b970065096e7500876d365a8b /internal/gitutil/tag.go
parentc65b5b9f84dee21dc362311b299694e8e00f6ac6 (diff)
git: migrate to github.com/gogs/git-module@v1.0.0 (#5958)
* 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
Diffstat (limited to 'internal/gitutil/tag.go')
-rw-r--r--internal/gitutil/tag.go95
1 files changed, 95 insertions, 0 deletions
diff --git a/internal/gitutil/tag.go b/internal/gitutil/tag.go
new file mode 100644
index 00000000..86efd6cd
--- /dev/null
+++ b/internal/gitutil/tag.go
@@ -0,0 +1,95 @@
+// 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
+}