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">
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))
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
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
}
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