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