diff --git a/models/repo/fork.go b/models/repo/fork.go index eafbab0fb171c..47aa94ee25317 100644 --- a/models/repo/fork.go +++ b/models/repo/fork.go @@ -5,6 +5,7 @@ package repo import ( "context" + "time" "code.gitea.io/gitea/models/db" user_model "code.gitea.io/gitea/models/user" @@ -54,15 +55,58 @@ func GetUserFork(ctx context.Context, repoID, userID int64) (*Repository, error) return &forkedRepo, nil } +// GetForksOptions represents options for GetForks +type GetForksOptions struct { + ListOptions db.ListOptions + Period string + SortType string +} + // GetForks returns all the forks of the repository -func GetForks(repo *Repository, listOptions db.ListOptions) ([]*Repository, error) { - if listOptions.Page == 0 { - forks := make([]*Repository, 0, repo.NumForks) - return forks, db.GetEngine(db.DefaultContext).Find(&forks, &Repository{ForkID: repo.ID}) +func GetForks(repo *Repository, forkOptions GetForksOptions) ([]*Repository, error) { + var forks []*Repository + var sess db.Engine + + if forkOptions.ListOptions.Page == 0 { + forks = make([]*Repository, 0, repo.NumForks) + sess = db.GetEngine(db.DefaultContext) + } else { + sess = db.GetPaginatedSession(&forkOptions.ListOptions) + forks = make([]*Repository, 0, forkOptions.ListOptions.PageSize) + } + + switch forkOptions.Period { + case "1month": + sess.Where("repository.updated_unix >= ?", time.Now().AddDate(0, -1, 0).Unix()) + case "6month": + sess.Where("repository.updated_unix >= ?", time.Now().AddDate(0, -6, 0).Unix()) + case "1year": + sess.Where("repository.updated_unix >= ?", time.Now().AddDate(-1, 0, 0).Unix()) + case "2year": + sess.Where("repository.updated_unix >= ?", time.Now().AddDate(-2, 0, 0).Unix()) + case "5year": + sess.Where("repository.updated_unix >= ?", time.Now().AddDate(-5, 0, 0).Unix()) + } + + switch forkOptions.SortType { + case "moststars": + sess.Desc("repository.num_stars").Desc("repository.updated_unix") + case "recentupdated": + sess.Desc("repository.updated_unix") + case "leastrecentupdated": + sess.Asc("repository.updated_unix") + case "openissue": + sess.Desc("repository.num_issues").Desc("repository.updated_unix") + case "openpr": + sess.Desc("repository.num_pulls").Desc("repository.updated_unix") + case "newest": + sess.Desc("repository.created_unix") + case "oldest": + sess.Asc("repository.created_unix") + default: + sess.Desc("repository.num_stars").Desc("repository.updated_unix") } - sess := db.GetPaginatedSession(&listOptions) - forks := make([]*Repository, 0, listOptions.PageSize) return forks, sess.Find(&forks, &Repository{ForkID: repo.ID}) } diff --git a/routers/api/v1/repo/fork.go b/routers/api/v1/repo/fork.go index e1e79c0e780ac..fe18b6a204485 100644 --- a/routers/api/v1/repo/fork.go +++ b/routers/api/v1/repo/fork.go @@ -51,7 +51,7 @@ func ListForks(ctx *context.APIContext) { // "200": // "$ref": "#/responses/RepositoryList" - forks, err := repo_model.GetForks(ctx.Repo.Repository, utils.GetListOptions(ctx)) + forks, err := repo_model.GetForks(ctx.Repo.Repository, repo_model.GetForksOptions{ListOptions: utils.GetListOptions(ctx)}) if err != nil { ctx.Error(http.StatusInternalServerError, "GetForks", err) return diff --git a/routers/web/repo/view.go b/routers/web/repo/view.go index 2fd893f91c6dd..15ae27e3092cd 100644 --- a/routers/web/repo/view.go +++ b/routers/web/repo/view.go @@ -1032,10 +1032,45 @@ func Stars(ctx *context.Context) { }, tplWatchers) } +// ForksDropdownHelper is a little helper struct for creating dropdowns +type ForksDropdownHelper struct { + Parameter string // The URL parameter + Text string // The text that is displayed in the UI +} + // Forks render repository's forked users func Forks(ctx *context.Context) { ctx.Data["Title"] = ctx.Tr("repo.forks") + aviablePeriods := []ForksDropdownHelper{ + {Parameter: "all", Text: "All"}, + {Parameter: "1month", Text: "1 month"}, + {Parameter: "6month", Text: "6 months"}, + {Parameter: "1year", Text: "1 year"}, + {Parameter: "2year", Text: "2 years"}, + {Parameter: "5year", Text: "5 years"}, + } + + period := ctx.FormString("period") + if period == "" { + period = "all" + } + + aviableSortTypes := []ForksDropdownHelper{ + {Parameter: "moststars", Text: "Stars"}, + {Parameter: "recentupdated", Text: "Recently updated"}, + {Parameter: "leastrecentupdated", Text: "Least recently updated"}, + {Parameter: "openissue", Text: "Open Issues"}, + {Parameter: "openpr", Text: "Open pull requests"}, + {Parameter: "newest", Text: "Newest"}, + {Parameter: "oldest", Text: "Oldest"}, + } + + sortType := ctx.FormString("sort") + if sortType == "" { + sortType = "moststars" + } + page := ctx.FormInt("page") if page <= 0 { page = 1 @@ -1044,9 +1079,13 @@ func Forks(ctx *context.Context) { pager := context.NewPagination(ctx.Repo.Repository.NumForks, setting.ItemsPerPage, page, 5) ctx.Data["Page"] = pager - forks, err := repo_model.GetForks(ctx.Repo.Repository, db.ListOptions{ - Page: pager.Paginater.Current(), - PageSize: setting.ItemsPerPage, + forks, err := repo_model.GetForks(ctx.Repo.Repository, repo_model.GetForksOptions{ + ListOptions: db.ListOptions{ + Page: pager.Paginater.Current(), + PageSize: setting.ItemsPerPage, + }, + SortType: sortType, + Period: period, }) if err != nil { ctx.ServerError("GetForks", err) @@ -1062,5 +1101,11 @@ func Forks(ctx *context.Context) { ctx.Data["Forks"] = forks + ctx.Data["Period"] = period + ctx.Data["AviablePeriods"] = aviablePeriods + + ctx.Data["SortType"] = sortType + ctx.Data["AviableSortTypes"] = aviableSortTypes + ctx.HTML(http.StatusOK, tplForks) } diff --git a/templates/repo/forks.tmpl b/templates/repo/forks.tmpl index 13810b44da8f9..889991dea4389 100644 --- a/templates/repo/forks.tmpl +++ b/templates/repo/forks.tmpl @@ -5,12 +5,66 @@

{{.locale.Tr "repo.forks"}}

- {{range .Forks}} -
- {{avatar $.Context .Owner}} - {{.Owner.Name}} / {{.Name}} + + + +
+ +
+ {{range .Forks}} +
+
+
+ {{avatar $.Context .Owner}} + +
+ +
+ {{if not $.DisableStars}} + {{svg "octicon-star" 16 "gt-mr-3"}}{{.NumStars}} + {{end}} + + {{svg "octicon-git-branch" 16 "gt-mr-3"}}{{.NumForks}} +
+
+ +
+

Created {{TimeSinceUnix .CreatedUnix $.locale}}

+ ยท +

{{$.locale.Tr "org.repo_updated"}} {{TimeSinceUnix .UpdatedUnix $.locale}}

+
+
+ {{end}} +
{{template "base/paginate" .}}