From 3b641dee0f02ab0dc61115cd7e990523d05867a3 Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Mon, 11 Oct 2021 09:19:47 +0200 Subject: [PATCH 01/16] Improbe behaviour of fork button --- models/repo.go | 29 +++++++++++++++++++++++++++++ modules/context/repo.go | 5 +++++ options/locale/locale_en-US.ini | 2 ++ templates/repo/header.tmpl | 27 +++++++++++++++++++++++++-- web_src/less/_repository.less | 3 ++- 5 files changed, 63 insertions(+), 3 deletions(-) diff --git a/models/repo.go b/models/repo.go index efd78c6042d6..9e5faab2da53 100644 --- a/models/repo.go +++ b/models/repo.go @@ -773,6 +773,35 @@ func (repo *Repository) CanUserFork(user *User) (bool, error) { return false, nil } +// GetForksByUserAndOwnedOrgs return forked repos of the user and owned orgs +func (repo *Repository) GetForksByUserAndOwnedOrgs(user *User) ([]*Repository, error) { + repoList := make([]*Repository, 0) + if user == nil { + return repoList, nil + } + var forkedRepo *Repository + forkedRepo, err := repo.GetUserFork(user.ID) + if err != nil { + return repoList, err + } + if forkedRepo != nil { + repoList = append(repoList, forkedRepo) + } + if err := user.GetOwnedOrganizations(); err != nil { + return repoList, err + } + for _, org := range user.OwnedOrgs { + forkedRepo, err := repo.GetUserFork(org.ID) + if err != nil { + return repoList, err + } + if forkedRepo != nil { + repoList = append(repoList, forkedRepo) + } + } + return repoList, nil +} + // CanUserDelete returns true if user could delete the repository func (repo *Repository) CanUserDelete(user *User) (bool, error) { if user.IsAdmin || user.ID == repo.OwnerID { diff --git a/modules/context/repo.go b/modules/context/repo.go index 8972cd28bc76..5a0e0d6f80be 100644 --- a/modules/context/repo.go +++ b/modules/context/repo.go @@ -494,6 +494,11 @@ func RepoAssignment(ctx *Context) (cancel context.CancelFunc) { return } + if ctx.Data["UserAndOrgForks"], err = ctx.Repo.Repository.GetForksByUserAndOwnedOrgs(ctx.User); err != nil { + ctx.ServerError("GetForksByUserAndOwnedOrgs", err) + return + } + ctx.Data["DisableSSH"] = setting.SSH.Disabled ctx.Data["ExposeAnonSSH"] = setting.SSH.ExposeAnonymous ctx.Data["DisableHTTP"] = setting.Repository.DisableHTTPGit diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini index d5af933f4041..29b38ee887f4 100644 --- a/options/locale/locale_en-US.ini +++ b/options/locale/locale_en-US.ini @@ -767,6 +767,8 @@ visibility_fork_helper = (Changing this will affect all forks.) clone_helper = Need help cloning? Visit Help. fork_repo = Fork Repository fork_from = Fork From +already_forked = You've already forked %s. +fork_to_different_account = Fork to a different account fork_visibility_helper = The visibility of a forked repository cannot be changed. use_template = Use this template clone_in_vsc = Clone in VS Code diff --git a/templates/repo/header.tmpl b/templates/repo/header.tmpl index 49a651e6c5a8..cf0020576418 100644 --- a/templates/repo/header.tmpl +++ b/templates/repo/header.tmpl @@ -85,10 +85,33 @@ {{end}} {{if and (not .IsEmpty) ($.Permission.CanRead $.UnitTypeCode)}} -
- +
+ {{$showModal := or (gt (len $.UserAndOrgForks) 1) (and $.CanSignedUserFork (gt (len $.UserAndOrgForks) 0))}} + {{$redirectToForkedRepo := and (eq (len $.UserAndOrgForks) 1) (not $.CanSignedUserFork)}} + {{$redirectToForkPage := and (eq (len $.UserAndOrgForks) 0) $.CanSignedUserFork}} + {{svg "octicon-repo-forked"}}{{$.i18n.Tr "repo.fork"}} + {{CountFmt .NumForks}} diff --git a/web_src/less/_repository.less b/web_src/less/_repository.less index 1e572ffa7ed7..d14286f7fb75 100644 --- a/web_src/less/_repository.less +++ b/web_src/less/_repository.less @@ -2729,7 +2729,8 @@ #delete-repo-modal, #delete-wiki-modal, #convert-fork-repo-modal, -#convert-mirror-repo-modal { +#convert-mirror-repo-modal, +#fork-repo-modal { .ui.message { width: 100% !important; } From 4a1facf1f720ce3278e8312c9a64276acf71a63b Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Mon, 11 Oct 2021 10:51:12 +0200 Subject: [PATCH 02/16] Apply suggestions from code review --- models/repo.go | 2 +- modules/context/repo.go | 12 ++++++++++-- templates/repo/header.tmpl | 13 ++++++++++--- 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/models/repo.go b/models/repo.go index 9e5faab2da53..894d7c5d59ff 100644 --- a/models/repo.go +++ b/models/repo.go @@ -775,7 +775,7 @@ func (repo *Repository) CanUserFork(user *User) (bool, error) { // GetForksByUserAndOwnedOrgs return forked repos of the user and owned orgs func (repo *Repository) GetForksByUserAndOwnedOrgs(user *User) ([]*Repository, error) { - repoList := make([]*Repository, 0) + var repoList []*Repository if user == nil { return repoList, nil } diff --git a/modules/context/repo.go b/modules/context/repo.go index 5a0e0d6f80be..a27b416456cb 100644 --- a/modules/context/repo.go +++ b/modules/context/repo.go @@ -489,15 +489,23 @@ func RepoAssignment(ctx *Context) (cancel context.CancelFunc) { ctx.Data["CanWriteIssues"] = ctx.Repo.CanWrite(models.UnitTypeIssues) ctx.Data["CanWritePulls"] = ctx.Repo.CanWrite(models.UnitTypePullRequests) - if ctx.Data["CanSignedUserFork"], err = ctx.Repo.Repository.CanUserFork(ctx.User); err != nil { + canSignedUserFork, err := ctx.Repo.Repository.CanUserFork(ctx.User) + if err != nil { ctx.ServerError("CanUserFork", err) return } + ctx.Data["CanSignedUserFork"] = canSignedUserFork - if ctx.Data["UserAndOrgForks"], err = ctx.Repo.Repository.GetForksByUserAndOwnedOrgs(ctx.User); err != nil { + userAndOrgForks, err := ctx.Repo.Repository.GetForksByUserAndOwnedOrgs(ctx.User) + if err != nil { ctx.ServerError("GetForksByUserAndOwnedOrgs", err) return } + ctx.Data["UserAndOrgForks"] = userAndOrgForks + + ctx.Data["ShowForkModal"] = len(userAndOrgForks) > 1 || (canSignedUserFork && len(userAndOrgForks) > 0) + ctx.Data["RedirectToForkedRepo"] = len(userAndOrgForks) == 1 && !canSignedUserFork + ctx.Data["RedirectToForkPage"] = len(userAndOrgForks) == 0 && canSignedUserFork ctx.Data["DisableSSH"] = setting.SSH.Disabled ctx.Data["ExposeAnonSSH"] = setting.SSH.ExposeAnonymous diff --git a/templates/repo/header.tmpl b/templates/repo/header.tmpl index cf0020576418..ceced1bf6b50 100644 --- a/templates/repo/header.tmpl +++ b/templates/repo/header.tmpl @@ -86,10 +86,17 @@ {{end}} {{if and (not .IsEmpty) ($.Permission.CanRead $.UnitTypeCode)}}
- {{$showModal := or (gt (len $.UserAndOrgForks) 1) (and $.CanSignedUserFork (gt (len $.UserAndOrgForks) 0))}} - {{$redirectToForkedRepo := and (eq (len $.UserAndOrgForks) 1) (not $.CanSignedUserFork)}} {{$redirectToForkPage := and (eq (len $.UserAndOrgForks) 0) $.CanSignedUserFork}} - + {{svg "octicon-repo-forked"}}{{$.i18n.Tr "repo.fork"}}