]> source.dussan.org Git - gitea.git/commitdiff
Fix tags sort by creation time (descending) on branch/tag dropdowns (#23491)
authorHester Gong <hestergong@gmail.com>
Thu, 16 Mar 2023 17:01:10 +0000 (01:01 +0800)
committerGitHub <noreply@github.com>
Thu, 16 Mar 2023 17:01:10 +0000 (12:01 -0500)
This PR fixes the tags sort issue mentioned in #23432
The tags on dropdown shoud be sorted in descending order of time but are
not. Because when getting tags, it execeutes `git tag sort
--sort=-taggerdate`. Git supports two types of tags: lightweight and
annotated, and `git tag sort --sort=-taggerdate` dosen't work with
lightweight tags, which will not give correct result. This PR add
`GetTagNamesByRepoID ` to get tags from the database so the tags are
sorted.

Also adapt this change to the droplist when comparing branches.

Dropdown places:

<img width="369" alt="截屏2023-03-15 14 25 39"
src="https://user-images.githubusercontent.com/17645053/225224506-65a72e50-4c11-41d7-8187-a7e9c7dab2cb.png">

<img width="675" alt="截屏2023-03-15 14 25 27"
src="https://user-images.githubusercontent.com/17645053/225224526-65ce8008-340c-43f6-aa65-b6bd9e1a1bf1.png">

models/repo/release.go
modules/context/repo.go
routers/web/repo/compare.go

index abf91bc4bbab078371b04304ac916f2689deffef..f7b24044b9c2cf1a3a32a95b91a6c0d45ec8a927 100644 (file)
@@ -253,6 +253,28 @@ func GetReleasesByRepoID(ctx context.Context, repoID int64, opts FindReleasesOpt
        return rels, sess.Find(&rels)
 }
 
+// GetTagNamesByRepoID returns a list of release tag names of repository.
+func GetTagNamesByRepoID(ctx context.Context, repoID int64) ([]string, error) {
+       listOptions := db.ListOptions{
+               ListAll: true,
+       }
+       opts := FindReleasesOptions{
+               ListOptions:   listOptions,
+               IncludeDrafts: true,
+               IncludeTags:   true,
+               HasSha1:       util.OptionalBoolTrue,
+       }
+
+       tags := make([]string, 0)
+       sess := db.GetEngine(ctx).
+               Table("release").
+               Desc("created_unix", "id").
+               Where(opts.toConds(repoID)).
+               Cols("tag_name")
+
+       return tags, sess.Find(&tags)
+}
+
 // CountReleasesByRepoID returns a number of releases matching FindReleaseOptions and RepoID.
 func CountReleasesByRepoID(repoID int64, opts FindReleasesOptions) (int64, error) {
        return db.GetEngine(db.DefaultContext).Where(opts.toConds(repoID)).Count(new(Release))
index e4ac65e9618c499469282245f15a70896098fbd1..b83caf4e4b5294e753412a91581e75cf3b947156 100644 (file)
@@ -660,20 +660,9 @@ func RepoAssignment(ctx *Context) (cancel context.CancelFunc) {
                return
        }
 
-       tags, err := ctx.Repo.GitRepo.GetTags(0, 0)
+       tags, err := repo_model.GetTagNamesByRepoID(ctx, ctx.Repo.Repository.ID)
        if err != nil {
-               if strings.Contains(err.Error(), "fatal: not a git repository ") {
-                       log.Error("Repository %-v has a broken repository on the file system: %s Error: %v", ctx.Repo.Repository, ctx.Repo.Repository.RepoPath(), err)
-                       ctx.Repo.Repository.Status = repo_model.RepositoryBroken
-                       ctx.Repo.Repository.IsEmpty = true
-                       ctx.Data["BranchName"] = ctx.Repo.Repository.DefaultBranch
-                       // Only allow access to base of repo or settings
-                       if !isHomeOrSettings {
-                               ctx.Redirect(ctx.Repo.RepoLink)
-                       }
-                       return
-               }
-               ctx.ServerError("GetTags", err)
+               ctx.ServerError("GetTagNamesByRepoID", err)
                return
        }
        ctx.Data["Tags"] = tags
index f21611c6348dde1ce6dc95b7f58340f5a2a43c06..d7e7bac7b781527bf429255fa51f11120795e066 100644 (file)
@@ -717,10 +717,9 @@ func CompareDiff(ctx *context.Context) {
                return
        }
 
-       baseGitRepo := ctx.Repo.GitRepo
-       baseTags, err := baseGitRepo.GetTags(0, 0)
+       baseTags, err := repo_model.GetTagNamesByRepoID(ctx, ctx.Repo.Repository.ID)
        if err != nil {
-               ctx.ServerError("GetTags", err)
+               ctx.ServerError("GetTagNamesByRepoID", err)
                return
        }
        ctx.Data["Tags"] = baseTags
@@ -738,9 +737,9 @@ func CompareDiff(ctx *context.Context) {
        }
        ctx.Data["HeadBranches"] = headBranches
 
-       headTags, err := ci.HeadGitRepo.GetTags(0, 0)
+       headTags, err := repo_model.GetTagNamesByRepoID(ctx, ci.HeadRepo.ID)
        if err != nil {
-               ctx.ServerError("GetTags", err)
+               ctx.ServerError("GetTagNamesByRepoID", err)
                return
        }
        ctx.Data["HeadTags"] = headTags