mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 08:30:25 +08:00 
			
		
		
		
	Fix tags sort by creation time (descending) on branch/tag dropdowns (#23491)
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">
This commit is contained in:
		@@ -253,6 +253,28 @@ func GetReleasesByRepoID(ctx context.Context, repoID int64, opts FindReleasesOpt
 | 
				
			|||||||
	return rels, sess.Find(&rels)
 | 
						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.
 | 
					// CountReleasesByRepoID returns a number of releases matching FindReleaseOptions and RepoID.
 | 
				
			||||||
func CountReleasesByRepoID(repoID int64, opts FindReleasesOptions) (int64, error) {
 | 
					func CountReleasesByRepoID(repoID int64, opts FindReleasesOptions) (int64, error) {
 | 
				
			||||||
	return db.GetEngine(db.DefaultContext).Where(opts.toConds(repoID)).Count(new(Release))
 | 
						return db.GetEngine(db.DefaultContext).Where(opts.toConds(repoID)).Count(new(Release))
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -660,20 +660,9 @@ func RepoAssignment(ctx *Context) (cancel context.CancelFunc) {
 | 
				
			|||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	tags, err := ctx.Repo.GitRepo.GetTags(0, 0)
 | 
						tags, err := repo_model.GetTagNamesByRepoID(ctx, ctx.Repo.Repository.ID)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		if strings.Contains(err.Error(), "fatal: not a git repository ") {
 | 
							ctx.ServerError("GetTagNamesByRepoID", err)
 | 
				
			||||||
			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)
 | 
					 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	ctx.Data["Tags"] = tags
 | 
						ctx.Data["Tags"] = tags
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -717,10 +717,9 @@ func CompareDiff(ctx *context.Context) {
 | 
				
			|||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	baseGitRepo := ctx.Repo.GitRepo
 | 
						baseTags, err := repo_model.GetTagNamesByRepoID(ctx, ctx.Repo.Repository.ID)
 | 
				
			||||||
	baseTags, err := baseGitRepo.GetTags(0, 0)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		ctx.ServerError("GetTags", err)
 | 
							ctx.ServerError("GetTagNamesByRepoID", err)
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	ctx.Data["Tags"] = baseTags
 | 
						ctx.Data["Tags"] = baseTags
 | 
				
			||||||
@@ -738,9 +737,9 @@ func CompareDiff(ctx *context.Context) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	ctx.Data["HeadBranches"] = headBranches
 | 
						ctx.Data["HeadBranches"] = headBranches
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	headTags, err := ci.HeadGitRepo.GetTags(0, 0)
 | 
						headTags, err := repo_model.GetTagNamesByRepoID(ctx, ci.HeadRepo.ID)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		ctx.ServerError("GetTags", err)
 | 
							ctx.ServerError("GetTagNamesByRepoID", err)
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	ctx.Data["HeadTags"] = headTags
 | 
						ctx.Data["HeadTags"] = headTags
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user