From 3b641dee0f02ab0dc61115cd7e990523d05867a3 Mon Sep 17 00:00:00 2001 From: qwerty287 <ndev@web.de> 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 efd78c6042d69..9e5faab2da535 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 8972cd28bc763..5a0e0d6f80bef 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 d5af933f4041a..29b38ee887f4f 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 <a target="_blank" rel="noopener noreferrer" href="%s">Help</a>. 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 49a651e6c5a86..cf0020576418f 100644 --- a/templates/repo/header.tmpl +++ b/templates/repo/header.tmpl @@ -85,10 +85,33 @@ </form> {{end}} {{if and (not .IsEmpty) ($.Permission.CanRead $.UnitTypeCode)}} - <div class="ui labeled button{{if not $.CanSignedUserFork}} poping up disabled{{end}}"{{if and (not $.CanSignedUserFork) $.IsSigned}} data-content="{{$.i18n.Tr "repo.fork_from_self"}}" {{else if not $.IsSigned}} data-content="{{$.i18n.Tr "repo.fork_guest_user"}}"{{end}} data-position="top center" data-variation="tiny" tabindex="0"> - <a class="ui compact small basic button"{{if $.CanSignedUserFork}} href="{{AppSubUrl}}/repo/fork/{{.ID}}"{{end}}> + <div class="ui labeled button{{if or (not $.IsSigned)}} poping up disabled{{end}}" {{if not $.IsSigned}} data-content="{{$.i18n.Tr "repo.fork_guest_user"}}"{{end}} data-position="top center" data-variation="tiny" tabindex="0"> + {{$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}} + <a class="ui compact{{if $showModal}} show-modal{{end}} small basic button"{{if $showModal}} data-modal="#fork-repo-modal"{{end}}{{if $redirectToForkedRepo}} href="{{AppSubUrl}}/{{(index $.UserAndOrgForks 0).FullName}}"{{else if $redirectToForkPage}} href="{{AppSubUrl}}/repo/fork/{{.ID}}"{{end}}> {{svg "octicon-repo-forked"}}{{$.i18n.Tr "repo.fork"}} </a> + <div class="ui small modal" id="fork-repo-modal"> + <div class="header"> + {{$.i18n.Tr "repo.already_forked" .FullName}} + </div> + <div class="content"> + {{range $.UserAndOrgForks}} + <div class="text left"> + <a href="{{.Link}}"> + {{svg "octicon-repo-forked"}}{{.FullName}} + </a> + </div> + {{end}} + {{if $.CanSignedUserFork}} + <br><br> + <a class="ui compact small button right actions" style="margin-bottom: 20px;" href="{{AppSubUrl}}/repo/fork/{{.ID}}"> + {{$.i18n.Tr "repo.fork_to_different_account"}} + </a> + {{end}} + </div> + </div> <a class="ui basic label" href="{{.Link}}/forks"> {{CountFmt .NumForks}} </a> diff --git a/web_src/less/_repository.less b/web_src/less/_repository.less index 1e572ffa7ed7d..d14286f7fb75e 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 <ndev@web.de> 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 9e5faab2da535..894d7c5d59fff 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 5a0e0d6f80bef..a27b416456cb5 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 cf0020576418f..ceced1bf6b501 100644 --- a/templates/repo/header.tmpl +++ b/templates/repo/header.tmpl @@ -86,10 +86,17 @@ {{end}} {{if and (not .IsEmpty) ($.Permission.CanRead $.UnitTypeCode)}} <div class="ui labeled button{{if or (not $.IsSigned)}} poping up disabled{{end}}" {{if not $.IsSigned}} data-content="{{$.i18n.Tr "repo.fork_guest_user"}}"{{end}} data-position="top center" data-variation="tiny" tabindex="0"> - {{$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}} - <a class="ui compact{{if $showModal}} show-modal{{end}} small basic button"{{if $showModal}} data-modal="#fork-repo-modal"{{end}}{{if $redirectToForkedRepo}} href="{{AppSubUrl}}/{{(index $.UserAndOrgForks 0).FullName}}"{{else if $redirectToForkPage}} href="{{AppSubUrl}}/repo/fork/{{.ID}}"{{end}}> + <a class="ui compact{{if $.ShowForkModal}} show-modal{{end}} small basic button" + {{if $.ShowForkModal}} + data-modal="#fork-repo-modal" + {{end}} + {{if $.RedirectToForkedRepo}} + href="{{AppSubUrl}}/{{(index $.UserAndOrgForks 0).FullName}}" + {{else if $redirectToForkPage}} + href="{{AppSubUrl}}/repo/fork/{{.ID}}" + {{end}} + > {{svg "octicon-repo-forked"}}{{$.i18n.Tr "repo.fork"}} </a> <div class="ui small modal" id="fork-repo-modal"> From 97fb7bd923ba8d46113d461461c70ecaf6a7cead Mon Sep 17 00:00:00 2001 From: qwerty287 <ndev@web.de> Date: Mon, 11 Oct 2021 10:55:41 +0200 Subject: [PATCH 03/16] Remove old lines --- templates/repo/header.tmpl | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/templates/repo/header.tmpl b/templates/repo/header.tmpl index ceced1bf6b501..71ac1d2b714f7 100644 --- a/templates/repo/header.tmpl +++ b/templates/repo/header.tmpl @@ -86,14 +86,13 @@ {{end}} {{if and (not .IsEmpty) ($.Permission.CanRead $.UnitTypeCode)}} <div class="ui labeled button{{if or (not $.IsSigned)}} poping up disabled{{end}}" {{if not $.IsSigned}} data-content="{{$.i18n.Tr "repo.fork_guest_user"}}"{{end}} data-position="top center" data-variation="tiny" tabindex="0"> - {{$redirectToForkPage := and (eq (len $.UserAndOrgForks) 0) $.CanSignedUserFork}} <a class="ui compact{{if $.ShowForkModal}} show-modal{{end}} small basic button" {{if $.ShowForkModal}} data-modal="#fork-repo-modal" {{end}} {{if $.RedirectToForkedRepo}} href="{{AppSubUrl}}/{{(index $.UserAndOrgForks 0).FullName}}" - {{else if $redirectToForkPage}} + {{else if $.RedirectToForkPage}} href="{{AppSubUrl}}/repo/fork/{{.ID}}" {{end}} > From c822b222b35e7af610139e4252081d2caca9d3c6 Mon Sep 17 00:00:00 2001 From: qwerty287 <ndev@web.de> Date: Mon, 11 Oct 2021 14:59:31 +0200 Subject: [PATCH 04/16] Apply suggestions --- modules/context/repo.go | 5 +++-- templates/repo/header.tmpl | 15 +++++++++------ 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/modules/context/repo.go b/modules/context/repo.go index a27b416456cb5..80198aa866b06 100644 --- a/modules/context/repo.go +++ b/modules/context/repo.go @@ -503,9 +503,10 @@ func RepoAssignment(ctx *Context) (cancel context.CancelFunc) { } ctx.Data["UserAndOrgForks"] = userAndOrgForks + // canSignedUserFork is true if the current user doesn't have a fork of this repo yet or + // if he owns an org that doesn't have a fork of this repo yet + // If multiple forks are available or if the user can fork to another account, but there is already a fork: open selection dialog 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 71ac1d2b714f7..78f79d2d55dca 100644 --- a/templates/repo/header.tmpl +++ b/templates/repo/header.tmpl @@ -87,13 +87,16 @@ {{if and (not .IsEmpty) ($.Permission.CanRead $.UnitTypeCode)}} <div class="ui labeled button{{if or (not $.IsSigned)}} poping up disabled{{end}}" {{if not $.IsSigned}} data-content="{{$.i18n.Tr "repo.fork_guest_user"}}"{{end}} data-position="top center" data-variation="tiny" tabindex="0"> <a class="ui compact{{if $.ShowForkModal}} show-modal{{end}} small basic button" - {{if $.ShowForkModal}} - data-modal="#fork-repo-modal" - {{end}} - {{if $.RedirectToForkedRepo}} - href="{{AppSubUrl}}/{{(index $.UserAndOrgForks 0).FullName}}" - {{else if $.RedirectToForkPage}} + {{if not $.CanSignedUserFork}} + {{if gt (len $.UserAndOrgForks) 1}} + data-modal="#fork-repo-modal" + {{else}} + href="{{AppSubUrl}}/{{(index $.UserAndOrgForks 0).FullName}}" + {{end}} + {{else if eq (len $.UserAndOrgForks) 0}} href="{{AppSubUrl}}/repo/fork/{{.ID}}" + {{else}} + data-modal="#fork-repo-modal" {{end}} > {{svg "octicon-repo-forked"}}{{$.i18n.Tr "repo.fork"}} From 5bb9f9f197aa56a935f32bc26d35b1379b8d7021 Mon Sep 17 00:00:00 2001 From: qwerty287 <ndev@web.de> Date: Mon, 11 Oct 2021 19:27:07 +0200 Subject: [PATCH 05/16] Fix test --- templates/repo/header.tmpl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/repo/header.tmpl b/templates/repo/header.tmpl index 78f79d2d55dca..31206bfa46850 100644 --- a/templates/repo/header.tmpl +++ b/templates/repo/header.tmpl @@ -90,7 +90,7 @@ {{if not $.CanSignedUserFork}} {{if gt (len $.UserAndOrgForks) 1}} data-modal="#fork-repo-modal" - {{else}} + {{else if eq (len $.UserAndOrgForks) 1}} href="{{AppSubUrl}}/{{(index $.UserAndOrgForks 0).FullName}}" {{end}} {{else if eq (len $.UserAndOrgForks) 0}} From 265d9cf52fb3373a56fd34b355d34f2e036f51db Mon Sep 17 00:00:00 2001 From: qwerty287 <ndev@web.de> Date: Mon, 11 Oct 2021 19:44:45 +0200 Subject: [PATCH 06/16] Remove unnecessary or --- templates/repo/header.tmpl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/repo/header.tmpl b/templates/repo/header.tmpl index 31206bfa46850..01607f591c8d1 100644 --- a/templates/repo/header.tmpl +++ b/templates/repo/header.tmpl @@ -85,7 +85,7 @@ </form> {{end}} {{if and (not .IsEmpty) ($.Permission.CanRead $.UnitTypeCode)}} - <div class="ui labeled button{{if or (not $.IsSigned)}} poping up disabled{{end}}" {{if not $.IsSigned}} data-content="{{$.i18n.Tr "repo.fork_guest_user"}}"{{end}} data-position="top center" data-variation="tiny" tabindex="0"> + <div class="ui labeled button{{if not $.IsSigned}} poping up disabled{{end}}" {{if not $.IsSigned}} data-content="{{$.i18n.Tr "repo.fork_guest_user"}}"{{end}} data-position="top center" data-variation="tiny" tabindex="0"> <a class="ui compact{{if $.ShowForkModal}} show-modal{{end}} small basic button" {{if not $.CanSignedUserFork}} {{if gt (len $.UserAndOrgForks) 1}} From 01a6e67fc44779b327b97fd66988a8096f1741f0 Mon Sep 17 00:00:00 2001 From: qwerty287 <80460567+qwerty287@users.noreply.github.com> Date: Sat, 16 Oct 2021 17:07:08 +0200 Subject: [PATCH 07/16] Update templates/repo/header.tmpl Co-authored-by: silverwind <me@silverwind.io> --- templates/repo/header.tmpl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/repo/header.tmpl b/templates/repo/header.tmpl index 01607f591c8d1..d6642e7fbbc9c 100644 --- a/templates/repo/header.tmpl +++ b/templates/repo/header.tmpl @@ -115,7 +115,7 @@ {{end}} {{if $.CanSignedUserFork}} <br><br> - <a class="ui compact small button right actions" style="margin-bottom: 20px;" href="{{AppSubUrl}}/repo/fork/{{.ID}}"> + <a class="ui compact small button right actions mb-4" href="{{AppSubUrl}}/repo/fork/{{.ID}}"> {{$.i18n.Tr "repo.fork_to_different_account"}} </a> {{end}} From ad23347b1a1ab127f56096ef4efbce36d68da79a Mon Sep 17 00:00:00 2001 From: qwerty287 <ndev@web.de> Date: Sat, 16 Oct 2021 17:37:28 +0200 Subject: [PATCH 08/16] Add comment --- templates/repo/header.tmpl | 2 ++ 1 file changed, 2 insertions(+) diff --git a/templates/repo/header.tmpl b/templates/repo/header.tmpl index 01607f591c8d1..1a5a174587a64 100644 --- a/templates/repo/header.tmpl +++ b/templates/repo/header.tmpl @@ -92,6 +92,8 @@ data-modal="#fork-repo-modal" {{else if eq (len $.UserAndOrgForks) 1}} href="{{AppSubUrl}}/{{(index $.UserAndOrgForks 0).FullName}}" + {{/*else is not required here, because the button shouldn't link to any site if you + can't create a fork, but also doesn't have a fork (which is an impossible scenario)*/}} {{end}} {{else if eq (len $.UserAndOrgForks) 0}} href="{{AppSubUrl}}/repo/fork/{{.ID}}" From 85149a9bcf8008855a2b38bb441ea708c3b267db Mon Sep 17 00:00:00 2001 From: qwerty287 <ndev@web.de> Date: Tue, 23 Nov 2021 17:57:51 +0100 Subject: [PATCH 09/16] Fix situation if you can't fork but don't have forks --- templates/repo/header.tmpl | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/templates/repo/header.tmpl b/templates/repo/header.tmpl index faf8942f180c5..76eaac725fdc6 100644 --- a/templates/repo/header.tmpl +++ b/templates/repo/header.tmpl @@ -85,15 +85,23 @@ </form> {{end}} {{if and (not .IsEmpty) ($.Permission.CanRead $.UnitTypeCode)}} - <div class="ui labeled button{{if not $.IsSigned}} tooltip disabled{{end}}" {{if not $.IsSigned}} data-content="{{$.i18n.Tr "repo.fork_guest_user"}}"{{end}} data-position="top center" data-variation="tiny" tabindex="0"> + <div class="ui labeled button + {{if or (not $.IsSigned) (and (not $.CanSignedUserFork) (eq (len $.UserAndOrgForks) 0))}} + tooltip disabled + {{end}}" + {{if not $.IsSigned}} + data-content="{{$.i18n.Tr "repo.fork_guest_user"}}" + {{else if and (not $.CanSignedUserFork) (eq (len $.UserAndOrgForks) 0)}} + data-content="{{$.i18n.Tr "repo.fork_from_self"}}" + {{end}} + data-position="top center" data-variation="tiny" tabindex="0"> <a class="ui compact{{if $.ShowForkModal}} show-modal{{end}} small basic button" {{if not $.CanSignedUserFork}} {{if gt (len $.UserAndOrgForks) 1}} data-modal="#fork-repo-modal" {{else if eq (len $.UserAndOrgForks) 1}} href="{{AppSubUrl}}/{{(index $.UserAndOrgForks 0).FullName}}" - {{/*else is not required here, because the button shouldn't link to any site if you - can't create a fork, but also doesn't have a fork (which is an impossible scenario)*/}} + {{/*else is not required here, because the button shouldn't link to any site if you can't create a fork*/}} {{end}} {{else if eq (len $.UserAndOrgForks) 0}} href="{{AppSubUrl}}/repo/fork/{{.ID}}" From f9f224dd973f645c512ded9114b28f86997a0c04 Mon Sep 17 00:00:00 2001 From: qwerty287 <ndev@web.de> Date: Tue, 23 Nov 2021 18:28:58 +0100 Subject: [PATCH 10/16] Fix lint --- templates/repo/header.tmpl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/repo/header.tmpl b/templates/repo/header.tmpl index 76eaac725fdc6..49b20c022f95f 100644 --- a/templates/repo/header.tmpl +++ b/templates/repo/header.tmpl @@ -88,7 +88,7 @@ <div class="ui labeled button {{if or (not $.IsSigned) (and (not $.CanSignedUserFork) (eq (len $.UserAndOrgForks) 0))}} tooltip disabled - {{end}}" + {{end}}" {{if not $.IsSigned}} data-content="{{$.i18n.Tr "repo.fork_guest_user"}}" {{else if and (not $.CanSignedUserFork) (eq (len $.UserAndOrgForks) 0)}} From 75ce8acba735dc9e1e3e24fb2a62e537abd0a60d Mon Sep 17 00:00:00 2001 From: qwerty287 <ndev@web.de> Date: Thu, 25 Nov 2021 18:23:12 +0100 Subject: [PATCH 11/16] Apply changes from #17783 --- models/repo.go | 8 ++++---- modules/context/repo.go | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/models/repo.go b/models/repo.go index 81cbd31e36085..9e61d041d9786 100644 --- a/models/repo.go +++ b/models/repo.go @@ -778,8 +778,8 @@ func CanUserForkRepo(user *user_model.User, repo *Repository) (bool, error) { return false, nil } -// GetForksByUserAndOwnedOrgs return forked repos of the user and owned orgs -func (repo *Repository) GetForksByUserAndOwnedOrgs(user *User) ([]*Repository, error) { +// GetForksByUserAndOrgs return forked repos of the user and owned orgs +func (repo *Repository) GetForksByUserAndOrgs(user *user_model.User) ([]*Repository, error) { var repoList []*Repository if user == nil { return repoList, nil @@ -792,11 +792,11 @@ func (repo *Repository) GetForksByUserAndOwnedOrgs(user *User) ([]*Repository, e if forkedRepo != nil { repoList = append(repoList, forkedRepo) } - ownedOrgs, err := GetOwnedOrgsByUserID(user.ID) + canCreateRepos, err := GetOrgsCanCreateRepoByUserID(user.ID) if err != nil { return repoList, err } - for _, org := range ownedOrgs { + for _, org := range canCreateRepos { forkedRepo, err := repo.GetUserFork(org.ID) if err != nil { return repoList, err diff --git a/modules/context/repo.go b/modules/context/repo.go index ee747ba232e4b..350eaff02010e 100644 --- a/modules/context/repo.go +++ b/modules/context/repo.go @@ -499,9 +499,9 @@ func RepoAssignment(ctx *Context) (cancel context.CancelFunc) { } ctx.Data["CanSignedUserFork"] = canSignedUserFork - userAndOrgForks, err := ctx.Repo.Repository.GetForksByUserAndOwnedOrgs(ctx.User) + userAndOrgForks, err := ctx.Repo.Repository.GetForksByUserAndOrgs(ctx.User) if err != nil { - ctx.ServerError("GetForksByUserAndOwnedOrgs", err) + ctx.ServerError("GetForksByUserAndOrgs", err) return } ctx.Data["UserAndOrgForks"] = userAndOrgForks From 862d39accef00d835d63d2374580ca5666b780cc Mon Sep 17 00:00:00 2001 From: qwerty287 <ndev@web.de> Date: Thu, 25 Nov 2021 18:24:57 +0100 Subject: [PATCH 12/16] fmt --- models/repo.go | 2 +- services/auth/signin.go | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/models/repo.go b/models/repo.go index 9e61d041d9786..72ef304fae72c 100644 --- a/models/repo.go +++ b/models/repo.go @@ -792,7 +792,7 @@ func (repo *Repository) GetForksByUserAndOrgs(user *user_model.User) ([]*Reposit if forkedRepo != nil { repoList = append(repoList, forkedRepo) } - canCreateRepos, err := GetOrgsCanCreateRepoByUserID(user.ID) + canCreateRepos, err := GetOrgsCanCreateRepoByUserID(user.ID) if err != nil { return repoList, err } diff --git a/services/auth/signin.go b/services/auth/signin.go index 5f75000d9836a..367c4ce50b71e 100644 --- a/services/auth/signin.go +++ b/services/auth/signin.go @@ -11,12 +11,12 @@ import ( "code.gitea.io/gitea/models/login" user_model "code.gitea.io/gitea/models/user" "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/services/auth/source/oauth2" + "code.gitea.io/gitea/services/auth/source/smtp" _ "code.gitea.io/gitea/services/auth/source/db" // register the sources (and below) _ "code.gitea.io/gitea/services/auth/source/ldap" // register the ldap source - "code.gitea.io/gitea/services/auth/source/oauth2" _ "code.gitea.io/gitea/services/auth/source/pam" // register the pam source - "code.gitea.io/gitea/services/auth/source/smtp" _ "code.gitea.io/gitea/services/auth/source/sspi" // register the sspi source ) From 73cc7e80d9ae4e1890cdeb4e1e68da9567b6d0ff Mon Sep 17 00:00:00 2001 From: qwerty287 <ndev@web.de> Date: Thu, 25 Nov 2021 18:25:41 +0100 Subject: [PATCH 13/16] fmt --- services/auth/signin.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/auth/signin.go b/services/auth/signin.go index 367c4ce50b71e..80be419962a5c 100644 --- a/services/auth/signin.go +++ b/services/auth/signin.go @@ -16,7 +16,7 @@ import ( _ "code.gitea.io/gitea/services/auth/source/db" // register the sources (and below) _ "code.gitea.io/gitea/services/auth/source/ldap" // register the ldap source - _ "code.gitea.io/gitea/services/auth/source/pam" // register the pam source + _ "code.gitea.io/gitea/services/auth/source/pam" // register the pam source _ "code.gitea.io/gitea/services/auth/source/sspi" // register the sspi source ) From f87c0dc4e40e8061f43a3d2a652b151fabe75f0c Mon Sep 17 00:00:00 2001 From: qwerty287 <ndev@web.de> Date: Sat, 27 Nov 2021 15:02:51 +0100 Subject: [PATCH 14/16] Apply tweaks Co-authored by: silverwind <me@silverwind.io> --- options/locale/locale_en-US.ini | 2 +- templates/repo/header.tmpl | 25 ++++++++++++++----------- web_src/less/helpers.less | 1 + 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini index cc4802648e093..fb7038cfd4cb3 100644 --- a/options/locale/locale_en-US.ini +++ b/options/locale/locale_en-US.ini @@ -776,7 +776,7 @@ visibility_fork_helper = (Changing this will affect all forks.) clone_helper = Need help cloning? Visit <a target="_blank" rel="noopener noreferrer" href="%s">Help</a>. fork_repo = Fork Repository fork_from = Fork From -already_forked = You've already forked %s. +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 diff --git a/templates/repo/header.tmpl b/templates/repo/header.tmpl index 49b20c022f95f..014623dc9ae24 100644 --- a/templates/repo/header.tmpl +++ b/templates/repo/header.tmpl @@ -112,20 +112,23 @@ {{svg "octicon-repo-forked"}}{{$.i18n.Tr "repo.fork"}} </a> <div class="ui small modal" id="fork-repo-modal"> + {{svg "octicon-x" 16 "close inside"}} <div class="header"> - {{$.i18n.Tr "repo.already_forked" .FullName}} + {{$.i18n.Tr "repo.already_forked" .Name}} </div> - <div class="content"> - {{range $.UserAndOrgForks}} - <div class="text left"> - <a href="{{.Link}}"> - {{svg "octicon-repo-forked"}}{{.FullName}} - </a> - </div> - {{end}} + <div class="content tl"> + <div class="ui list"> + {{range $.UserAndOrgForks}} + <div class="ui item py-3"> + <a href="{{.Link}}"> + {{svg "octicon-repo-forked" 16 "mr-3"}}{{.FullName}} + </a> + </div> + {{end}} + </div> {{if $.CanSignedUserFork}} - <br><br> - <a class="ui compact small button right actions mb-4" href="{{AppSubUrl}}/repo/fork/{{.ID}}"> + <div class="ui divider"></div> + <a href="{{AppSubUrl}}/repo/fork/{{.ID}}"> {{$.i18n.Tr "repo.fork_to_different_account"}} </a> {{end}} diff --git a/web_src/less/helpers.less b/web_src/less/helpers.less index 5e067a1a3211f..222e54c663745 100644 --- a/web_src/less/helpers.less +++ b/web_src/less/helpers.less @@ -3,6 +3,7 @@ .dif { display: inline-flex !important; } .dib { display: inline-block !important; } .ac { align-items: center !important; } +.tl { text-align: left !important; } .tc { text-align: center !important; } .jc { justify-content: center !important; } .js { justify-content: flex-start !important; } From 5b41a0a3507aa3d2de81e7f20ca2f2bf6bcc82c6 Mon Sep 17 00:00:00 2001 From: qwerty287 <ndev@web.de> Date: Sat, 11 Dec 2021 18:25:50 +0100 Subject: [PATCH 15/16] Rm dupl css --- web_src/less/helpers.less | 1 - 1 file changed, 1 deletion(-) diff --git a/web_src/less/helpers.less b/web_src/less/helpers.less index edc028795987f..a4e8243cc7808 100644 --- a/web_src/less/helpers.less +++ b/web_src/less/helpers.less @@ -4,7 +4,6 @@ .dib { display: inline-block !important; } .pr { position: relative !important; } .ac { align-items: center !important; } -.tl { text-align: left !important; } .tc { text-align: center !important; } .tl { text-align: left !important; } .jc { justify-content: center !important; } From 71dfc979f459eb73ffeed81417e172369933d97c Mon Sep 17 00:00:00 2001 From: qwerty287 <ndev@web.de> Date: Sun, 12 Dec 2021 18:02:31 +0100 Subject: [PATCH 16/16] Fix build --- models/repo.go | 10 +++++----- modules/context/repo.go | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/models/repo.go b/models/repo.go index 083951b3e55bf..897ceeede9793 100644 --- a/models/repo.go +++ b/models/repo.go @@ -295,13 +295,13 @@ func CanUserForkRepo(user *user_model.User, repo *repo_model.Repository) (bool, } // GetForksByUserAndOrgs return forked repos of the user and owned orgs -func (repo *Repository) GetForksByUserAndOrgs(user *user_model.User) ([]*Repository, error) { - var repoList []*Repository +func GetForksByUserAndOrgs(user *user_model.User, repo *repo_model.Repository) ([]*repo_model.Repository, error) { + var repoList []*repo_model.Repository if user == nil { return repoList, nil } - var forkedRepo *Repository - forkedRepo, err := repo.GetUserFork(user.ID) + var forkedRepo *repo_model.Repository + forkedRepo, err := repo_model.GetUserFork(repo.ID, user.ID) if err != nil { return repoList, err } @@ -313,7 +313,7 @@ func (repo *Repository) GetForksByUserAndOrgs(user *user_model.User) ([]*Reposit return repoList, err } for _, org := range canCreateRepos { - forkedRepo, err := repo.GetUserFork(org.ID) + forkedRepo, err := repo_model.GetUserFork(repo.ID, org.ID) if err != nil { return repoList, err } diff --git a/modules/context/repo.go b/modules/context/repo.go index 5d3399351f928..010d3b7f81814 100644 --- a/modules/context/repo.go +++ b/modules/context/repo.go @@ -506,7 +506,7 @@ func RepoAssignment(ctx *Context) (cancel context.CancelFunc) { } ctx.Data["CanSignedUserFork"] = canSignedUserFork - userAndOrgForks, err := ctx.Repo.Repository.GetForksByUserAndOrgs(ctx.User) + userAndOrgForks, err := models.GetForksByUserAndOrgs(ctx.User, ctx.Repo.Repository) if err != nil { ctx.ServerError("GetForksByUserAndOrgs", err) return