From d4c789dfc1c341413b77a2f21fe7339982102bed Mon Sep 17 00:00:00 2001 From: wxiaoguang Date: Tue, 29 Mar 2022 11:21:30 +0800 Subject: [PATCH] Refactor repo clone button and repo clone links, fix JS error on empty repo page (#19208) The last PR about clone buttons introduced an JS error when visiting an empty repo page: * https://github.com/go-gitea/gitea/pull/19028 * `Uncaught ReferenceError: isSSH is not defined`, because the variables are scoped and doesn't share between sub templates. This: 1. Simplify `templates/repo/clone_buttons.tmpl` and make code clear 2. Move most JS code into `initRepoCloneLink` 3. Remove unused `CloneLink.Git` 4. Remove `ctx.Data["DisableSSH"] / ctx.Data["ExposeAnonSSH"] / ctx.Data["DisableHTTP"]`, and only set them when is is needed (eg: deploy keys / ssh keys) 5. Introduce `Data["CloneButton*"]` to provide data for clone buttons and links 6. Introduce `Data["RepoCloneLink"]` for the repo clone link (not the wiki) 7. Remove most `ctx.Data["PageIsWiki"]` because it has been set in the `/wiki` middleware 8. Remove incorrect `quickstart` class in `migrating.tmpl` --- models/repo/repo.go | 1 - modules/context/repo.go | 17 +++++-- routers/web/repo/setting.go | 1 + routers/web/repo/wiki.go | 7 --- routers/web/web.go | 1 + templates/base/head.tmpl | 2 +- templates/repo/clone_buttons.tmpl | 54 ++++++++-------------- templates/repo/empty.tmpl | 25 ++++++---- templates/repo/home.tmpl | 2 +- templates/repo/migrate/migrating.tmpl | 2 +- web_src/js/features/repo-common.js | 66 +++++++++++++++++++-------- web_src/js/features/repo-legacy.js | 4 +- 12 files changed, 100 insertions(+), 82 deletions(-) diff --git a/models/repo/repo.go b/models/repo/repo.go index f5b93d6da..8cd055c67 100644 --- a/models/repo/repo.go +++ b/models/repo/repo.go @@ -533,7 +533,6 @@ func (repo *Repository) DescriptionHTML(ctx context.Context) template.HTML { type CloneLink struct { SSH string HTTPS string - Git string } // ComposeHTTPSCloneURL returns HTTPS clone URL based on given owner and repository name. diff --git a/modules/context/repo.go b/modules/context/repo.go index ccdc810fb..b4ffb21cc 100644 --- a/modules/context/repo.go +++ b/modules/context/repo.go @@ -541,15 +541,22 @@ func RepoAssignment(ctx *Context) (cancel context.CancelFunc) { // 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["DisableSSH"] = setting.SSH.Disabled - ctx.Data["ExposeAnonSSH"] = setting.SSH.ExposeAnonymous - ctx.Data["DisableHTTP"] = setting.Repository.DisableHTTPGit + ctx.Data["RepoCloneLink"] = repo.CloneLink() + + cloneButtonShowHTTPS := !setting.Repository.DisableHTTPGit + cloneButtonShowSSH := !setting.SSH.Disabled && (ctx.IsSigned || setting.SSH.ExposeAnonymous) + if !cloneButtonShowHTTPS && !cloneButtonShowSSH { + // We have to show at least one link, so we just show the HTTPS + cloneButtonShowHTTPS = true + } + ctx.Data["CloneButtonShowHTTPS"] = cloneButtonShowHTTPS + ctx.Data["CloneButtonShowSSH"] = cloneButtonShowSSH + ctx.Data["CloneButtonOriginLink"] = ctx.Data["RepoCloneLink"] // it may be rewritten to the WikiCloneLink by the router middleware + ctx.Data["RepoSearchEnabled"] = setting.Indexer.RepoIndexerEnabled if setting.Indexer.RepoIndexerEnabled { ctx.Data["CodeIndexerUnavailable"] = !code_indexer.IsAvailable() } - ctx.Data["CloneLink"] = repo.CloneLink() - ctx.Data["WikiCloneLink"] = repo.WikiCloneLink() if ctx.IsSigned { ctx.Data["IsWatchingRepo"] = repo_model.IsWatching(ctx.Doer.ID, repo.ID) diff --git a/routers/web/repo/setting.go b/routers/web/repo/setting.go index e3a424ea4..75db7ca3e 100644 --- a/routers/web/repo/setting.go +++ b/routers/web/repo/setting.go @@ -1070,6 +1070,7 @@ func DeployKeysPost(ctx *context.Context) { form := web.GetForm(ctx).(*forms.AddKeyForm) ctx.Data["Title"] = ctx.Tr("repo.settings.deploy_keys") ctx.Data["PageIsSettingsKeys"] = true + ctx.Data["DisableSSH"] = setting.SSH.Disabled keys, err := asymkey_model.ListDeployKeys(ctx, &asymkey_model.ListDeployKeysOptions{RepoID: ctx.Repo.Repository.ID}) if err != nil { diff --git a/routers/web/repo/wiki.go b/routers/web/repo/wiki.go index bd148413d..7dcfcd87f 100644 --- a/routers/web/repo/wiki.go +++ b/routers/web/repo/wiki.go @@ -409,7 +409,6 @@ func WikiPost(ctx *context.Context) { // Wiki renders single wiki page func Wiki(ctx *context.Context) { - ctx.Data["PageIsWiki"] = true ctx.Data["CanWriteWiki"] = ctx.Repo.CanWrite(unit.TypeWiki) && !ctx.Repo.Repository.IsArchived switch ctx.FormString("action") { @@ -474,7 +473,6 @@ func Wiki(ctx *context.Context) { // WikiRevision renders file revision list of wiki page func WikiRevision(ctx *context.Context) { - ctx.Data["PageIsWiki"] = true ctx.Data["CanWriteWiki"] = ctx.Repo.CanWrite(unit.TypeWiki) && !ctx.Repo.Repository.IsArchived if !ctx.Repo.Repository.HasWiki() { @@ -519,7 +517,6 @@ func WikiPages(ctx *context.Context) { } ctx.Data["Title"] = ctx.Tr("repo.wiki.pages") - ctx.Data["PageIsWiki"] = true ctx.Data["CanWriteWiki"] = ctx.Repo.CanWrite(unit.TypeWiki) && !ctx.Repo.Repository.IsArchived wikiRepo, commit, err := findWikiRepoCommit(ctx) @@ -624,7 +621,6 @@ func WikiRaw(ctx *context.Context) { // NewWiki render wiki create page func NewWiki(ctx *context.Context) { ctx.Data["Title"] = ctx.Tr("repo.wiki.new_page") - ctx.Data["PageIsWiki"] = true if !ctx.Repo.Repository.HasWiki() { ctx.Data["title"] = "Home" @@ -640,7 +636,6 @@ func NewWiki(ctx *context.Context) { func NewWikiPost(ctx *context.Context) { form := web.GetForm(ctx).(*forms.NewWikiForm) ctx.Data["Title"] = ctx.Tr("repo.wiki.new_page") - ctx.Data["PageIsWiki"] = true if ctx.HasError() { ctx.HTML(http.StatusOK, tplWikiNew) @@ -676,7 +671,6 @@ func NewWikiPost(ctx *context.Context) { // EditWiki render wiki modify page func EditWiki(ctx *context.Context) { - ctx.Data["PageIsWiki"] = true ctx.Data["PageIsWikiEdit"] = true if !ctx.Repo.Repository.HasWiki() { @@ -696,7 +690,6 @@ func EditWiki(ctx *context.Context) { func EditWikiPost(ctx *context.Context) { form := web.GetForm(ctx).(*forms.NewWikiForm) ctx.Data["Title"] = ctx.Tr("repo.wiki.new_page") - ctx.Data["PageIsWiki"] = true if ctx.HasError() { ctx.HTML(http.StatusOK, tplWikiNew) diff --git a/routers/web/web.go b/routers/web/web.go index 14e90348b..485ba1a1a 100644 --- a/routers/web/web.go +++ b/routers/web/web.go @@ -984,6 +984,7 @@ func RegisterRoutes(m *web.Route) { m.Get("/commit/{sha:[a-f0-9]{7,40}}.{ext:patch|diff}", repo.RawDiff) }, repo.MustEnableWiki, func(ctx *context.Context) { ctx.Data["PageIsWiki"] = true + ctx.Data["CloneButtonOriginLink"] = ctx.Repo.Repository.WikiCloneLink() }) m.Group("/wiki", func() { diff --git a/templates/base/head.tmpl b/templates/base/head.tmpl index 68d14af51..2a9c24255 100644 --- a/templates/base/head.tmpl +++ b/templates/base/head.tmpl @@ -12,7 +12,7 @@ {{if .GoGetImport}} - + {{end}} {{if .FeedURL}} diff --git a/templates/repo/clone_buttons.tmpl b/templates/repo/clone_buttons.tmpl index d4b822521..cee7e3196 100644 --- a/templates/repo/clone_buttons.tmpl +++ b/templates/repo/clone_buttons.tmpl @@ -1,42 +1,24 @@ -{{if not $.DisableHTTP}} - {{end}} -{{if and (not $.DisableSSH) (or $.IsSigned $.ExposeAnonSSH)}} - {{end}} -{{if not $.DisableHTTP}} - -{{else if and (not .DisableSSH) (or $.IsSigned $.ExposeAnonSSH)}} - -{{end}} -{{if or (not $.DisableHTTP) (and (not $.DisableSSH) (or $.IsSigned $.ExposeAnonSSH))}} - -{{end}} -{{if not (and $.DisableHTTP $.DisableSSH)}} - - -{{end}} + + + + diff --git a/templates/repo/empty.tmpl b/templates/repo/empty.tmpl index 6da9e28e1..eee607eca 100644 --- a/templates/repo/empty.tmpl +++ b/templates/repo/empty.tmpl @@ -18,7 +18,7 @@

{{.i18n.Tr "repo.quick_guide"}}

-
+

{{.i18n.Tr "repo.clone_this_repo"}} {{.i18n.Tr "repo.clone_helper" "http://git-scm.com/book/en/Git-Basics-Getting-a-Git-Repository" | Str2html}}

@@ -37,7 +37,7 @@ git init {{if ne .Repository.DefaultBranch "master"}}git checkout -b {{.Repository.DefaultBranch}}{{end}} git add README.md git commit -m "first commit" -git remote add origin {{$.CloneLink.HTTPS}} +git remote add origin git push -u origin {{.Repository.DefaultBranch}}
@@ -46,18 +46,23 @@ git push -u origin {{.Repository.DefaultBranch}}

{{.i18n.Tr "repo.push_exist_repo"}}

-
git remote add origin {{$.CloneLink.HTTPS}}
+									
git remote add origin 
 git push -u origin {{.Repository.DefaultBranch}}
- {{end}} {{else}} diff --git a/templates/repo/home.tmpl b/templates/repo/home.tmpl index 30f1471c1..c146f474e 100644 --- a/templates/repo/home.tmpl +++ b/templates/repo/home.tmpl @@ -125,7 +125,7 @@ {{svg "octicon-file-zip" 16 "mr-3"}}{{.i18n.Tr "repo.download_zip"}} {{svg "octicon-file-zip" 16 "mr-3"}}{{.i18n.Tr "repo.download_tar"}} {{svg "octicon-package" 16 "mr-3"}}{{.i18n.Tr "repo.download_bundle"}} - {{svg "gitea-vscode" 16 "mr-3"}}{{.i18n.Tr "repo.clone_in_vsc"}} + {{svg "gitea-vscode" 16 "mr-3"}}{{.i18n.Tr "repo.clone_in_vsc"}}
diff --git a/templates/repo/migrate/migrating.tmpl b/templates/repo/migrate/migrating.tmpl index 6df7f0a65..8858e88da 100644 --- a/templates/repo/migrate/migrating.tmpl +++ b/templates/repo/migrate/migrating.tmpl @@ -1,5 +1,5 @@ {{template "base/head" .}} -
+
{{template "repo/header" .}}
diff --git a/web_src/js/features/repo-common.js b/web_src/js/features/repo-common.js index 9479fa78e..89dae2627 100644 --- a/web_src/js/features/repo-common.js +++ b/web_src/js/features/repo-common.js @@ -43,26 +43,56 @@ export function initRepoArchiveLinks() { }); } -export function initRepoClone() { - // Quick start and repository home - $('#repo-clone-ssh').on('click', function () { - $('.clone-url').text($(this).data('link')); - $('#repo-clone-url').val($(this).data('link')); - $(this).addClass('primary'); - $('#repo-clone-https').removeClass('primary'); - localStorage.setItem('repo-clone-protocol', 'ssh'); - }); - $('#repo-clone-https').on('click', function () { - $('.clone-url').text($(this).data('link')); - $('#repo-clone-url').val($(this).data('link')); - $(this).addClass('primary'); - if ($('#repo-clone-ssh').length > 0) { - $('#repo-clone-ssh').removeClass('primary'); - localStorage.setItem('repo-clone-protocol', 'https'); +export function initRepoCloneLink() { + const defaultGitProtocol = 'https'; // ssh or https + + const $repoCloneSsh = $('#repo-clone-ssh'); + const $repoCloneHttps = $('#repo-clone-https'); + const $inputLink = $('#repo-clone-url'); + + if ((!$repoCloneSsh.length && !$repoCloneHttps.length) || !$inputLink.length) { + return; + } + + const updateUi = () => { + let isSSH = (localStorage.getItem('repo-clone-protocol') || defaultGitProtocol) === 'ssh'; + // there must be at least one clone button (by context/repo.go). if no ssh, then there must be https. + if (isSSH && $repoCloneSsh.length === 0) { + isSSH = false; + } else if (!isSSH && $repoCloneHttps.length === 0) { + isSSH = true; } + const cloneLink = (isSSH ? $repoCloneSsh : $repoCloneHttps).attr('data-link'); + $inputLink.val(cloneLink); + if (isSSH) { + $repoCloneSsh.addClass('primary'); + $repoCloneHttps.removeClass('primary'); + } else { + $repoCloneSsh.removeClass('primary'); + $repoCloneHttps.addClass('primary'); + } + // the empty repo guide + $('.quickstart .empty-repo-guide .clone-url').text(cloneLink); + }; + updateUi(); + + setTimeout(() => { + // restore animation after first init + $repoCloneSsh.removeClass('no-transition'); + $repoCloneHttps.removeClass('no-transition'); + }, 100); + + $repoCloneSsh.on('click', () => { + localStorage.setItem('repo-clone-protocol', 'ssh'); + updateUi(); }); - $('#repo-clone-url').on('click', function () { - $(this).select(); + $repoCloneHttps.on('click', () => { + localStorage.setItem('repo-clone-protocol', 'https'); + updateUi(); + }); + + $inputLink.on('click', () => { + $inputLink.select(); }); } diff --git a/web_src/js/features/repo-legacy.js b/web_src/js/features/repo-legacy.js index d51dfe185..185a0014f 100644 --- a/web_src/js/features/repo-legacy.js +++ b/web_src/js/features/repo-legacy.js @@ -16,7 +16,7 @@ import {svg} from '../svg.js'; import {htmlEscape} from 'escape-goat'; import {initRepoBranchTagDropdown} from '../components/RepoBranchTagDropdown.js'; import { - initRepoClone, + initRepoCloneLink, initRepoCommonBranchOrTagDropdown, initRepoCommonFilterSearchDropdown, initRepoCommonLanguageStats, @@ -498,7 +498,7 @@ export function initRepository() { initRepoCommonFilterSearchDropdown('.choose.branch .dropdown'); } - initRepoClone(); + initRepoCloneLink(); initRepoCommonLanguageStats(); initRepoSettingBranches();