Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactor repo clone button and repo clone links, fix JS error on empty repo page #19208

Merged
merged 7 commits into from
Mar 29, 2022
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion models/repo/repo.go
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
17 changes: 12 additions & 5 deletions modules/context/repo.go
Original file line number Diff line number Diff line change
Expand Up @@ -540,15 +540,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 {
// at least we had to show one link, so we just show the HTTPS
wxiaoguang marked this conversation as resolved.
Show resolved Hide resolved
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)
Expand Down
1 change: 1 addition & 0 deletions routers/web/repo/setting.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
7 changes: 0 additions & 7 deletions routers/web/repo/wiki.go
Original file line number Diff line number Diff line change
Expand Up @@ -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") {
Expand Down Expand Up @@ -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() {
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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"
Expand All @@ -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)
Expand Down Expand Up @@ -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() {
Expand All @@ -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)
Expand Down
1 change: 1 addition & 0 deletions routers/web/web.go
Original file line number Diff line number Diff line change
Expand Up @@ -947,6 +947,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
6543 marked this conversation as resolved.
Show resolved Hide resolved
ctx.Data["CloneButtonOriginLink"] = ctx.Repo.Repository.WikiCloneLink()
})

m.Group("/wiki", func() {
Expand Down
2 changes: 1 addition & 1 deletion templates/base/head.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
<meta name="keywords" content="{{MetaKeywords}}">
<meta name="referrer" content="no-referrer" />
{{if .GoGetImport}}
<meta name="go-import" content="{{.GoGetImport}} git {{.CloneLink.HTTPS}}">
<meta name="go-import" content="{{.GoGetImport}} git {{.RepoCloneLink.HTTPS}}">
<meta name="go-source" content="{{.GoGetImport}} _ {{.GoDocDirectory}} {{.GoDocFile}}">
{{end}}
{{if .FeedURL}}
Expand Down
54 changes: 18 additions & 36 deletions templates/repo/clone_buttons.tmpl
Original file line number Diff line number Diff line change
@@ -1,42 +1,24 @@
{{if not $.DisableHTTP}}
<button class="ui basic clone button no-transition" id="repo-clone-https" data-link="{{if $.PageIsWiki}}{{$.WikiCloneLink.HTTPS}}{{else}}{{$.CloneLink.HTTPS}}{{end}}">
<!-- at least there will be one button (by context/repo.go) -->
wxiaoguang marked this conversation as resolved.
Show resolved Hide resolved
{{if $.CloneButtonShowHTTPS}}
<button class="ui basic clone button no-transition" id="repo-clone-https" data-link="{{$.CloneButtonOriginLink.HTTPS}}">
{{if UseHTTPS}}HTTPS{{else}}HTTP{{end}}
</button>
{{end}}
{{if and (not $.DisableSSH) (or $.IsSigned $.ExposeAnonSSH)}}
<button class="ui basic clone button no-transition" id="repo-clone-ssh" data-link="{{if $.PageIsWiki}}{{$.WikiCloneLink.SSH}}{{else}}{{$.CloneLink.SSH}}{{end}}">
{{if $.CloneButtonShowSSH}}
<button class="ui basic clone button no-transition" id="repo-clone-ssh" data-link="{{$.CloneButtonOriginLink.SSH}}">
SSH
</button>
{{end}}
{{if not $.DisableHTTP}}
<input id="repo-clone-url" value="{{if $.PageIsWiki}}{{$.WikiCloneLink.HTTPS}}{{else}}{{$.CloneLink.HTTPS}}{{end}}" readonly>
{{else if and (not .DisableSSH) (or $.IsSigned $.ExposeAnonSSH)}}
<input id="repo-clone-url" value="{{if $.PageIsWiki}}{{$.WikiCloneLink.SSH}}{{else}}{{$.CloneLink.SSH}}{{end}}" readonly>
{{end}}
{{if or (not $.DisableHTTP) (and (not $.DisableSSH) (or $.IsSigned $.ExposeAnonSSH))}}
<button class="ui basic icon button tooltip" id="clipboard-btn" data-content="{{.i18n.Tr "copy_url"}}" data-clipboard-target="#repo-clone-url">
{{svg "octicon-paste"}}
</button>
{{end}}
{{if not (and $.DisableHTTP $.DisableSSH)}}
<script>
<!-- /* eslint-disable */ -->
window.config.pageData['repoCloneButtons']= {httpsDisabled: {{$.DisableHTTP}}};
</script>
<script>
(() => {
const tmplData = window.config.pageData.repoCloneButtons;
const isSSH = tmplData.httpsDisabled || localStorage.getItem('repo-clone-protocol') === 'ssh';
const sshButton = document.getElementById('repo-clone-ssh');
const httpsButton = document.getElementById('repo-clone-https');
const input = document.getElementById('repo-clone-url');
if (input) input.value = (isSSH ? sshButton : httpsButton).getAttribute('data-link');
if (sshButton) sshButton.classList[isSSH ? 'add' : 'remove']('primary');
if (httpsButton) httpsButton.classList[isSSH ? 'remove' : 'add']('primary');
setTimeout(() => {
if (sshButton) sshButton.classList.remove('no-transition');
if (httpsButton) httpsButton.classList.remove('no-transition');
}, 100);
})();
</script>
{{end}}
<!-- the value will be update by initRepoCloneLink, the code below is used to avoid UI flicking -->
wxiaoguang marked this conversation as resolved.
Show resolved Hide resolved
<input id="repo-clone-url" value="" readonly>
<script>
(() => {
const proto = localStorage.getItem('repo-clone-protocol') || 'https';
const btn = document.getElementById(`repo-clone-${proto}`);
// it's ok if we didn't find the btn here, initRepoCloneLink will take all the work
wxiaoguang marked this conversation as resolved.
Show resolved Hide resolved
document.getElementById('repo-clone-url').value = btn ? btn.getAttribute('data-link') : '';
})();
</script>
<button class="ui basic icon button tooltip" id="clipboard-btn" data-content="{{.i18n.Tr "copy_url"}}" data-clipboard-target="#repo-clone-url">
{{svg "octicon-paste"}}
</button>
25 changes: 15 additions & 10 deletions templates/repo/empty.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
<h4 class="ui top attached header">
{{.i18n.Tr "repo.quick_guide"}}
</h4>
<div class="ui attached guide table segment">
<div class="ui attached guide table segment empty-repo-guide">
<div class="item">
<h3>{{.i18n.Tr "repo.clone_this_repo"}} <small>{{.i18n.Tr "repo.clone_helper" "http://git-scm.com/book/en/Git-Basics-Getting-a-Git-Repository" | Str2html}}</small></h3>
<div class="ui action small input">
Expand All @@ -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 <span class="clone-url">{{$.CloneLink.HTTPS}}</span>
git remote add origin <span class="clone-url"></span>
git push -u origin {{.Repository.DefaultBranch}}</code></pre>
</div>
</div>
Expand All @@ -46,18 +46,23 @@ git push -u origin {{.Repository.DefaultBranch}}</code></pre>
<div class="item">
<h3>{{.i18n.Tr "repo.push_exist_repo"}}</h3>
<div class="markup">
<pre><code>git remote add origin <span class="clone-url">{{$.CloneLink.HTTPS}}</span>
<pre><code>git remote add origin <span class="clone-url"></span>
git push -u origin {{.Repository.DefaultBranch}}</code></pre>
</div>
</div>
<script defer>
/* eslint-disable no-undef */
const cloneUrls = document.getElementsByClassName('clone-url');
if (cloneUrls) {
for (let i = 0; i < cloneUrls.length; i++) {
cloneUrls[i].textContent = (isSSH ? sshButton : httpsButton).getAttribute('data-link');
<!-- the clone-url content will be update by initRepoCloneLink, the code below is used to avoid UI flicking -->
wxiaoguang marked this conversation as resolved.
Show resolved Hide resolved
<script>
(() => {
const proto = localStorage.getItem('repo-clone-protocol') || 'https';
const btn = document.getElementById(`repo-clone-${proto}`);
const cloneUrls = document.getElementsByClassName('clone-url');
// it's ok if we didn't find the btn here, initRepoCloneLink will take all the work
if (btn) {
for (let i = 0; i < cloneUrls.length; i++) {
cloneUrls[i].textContent = btn.getAttribute('data-link');
}
}
}
})();
</script>
{{end}}
{{else}}
Expand Down
2 changes: 1 addition & 1 deletion templates/repo/home.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@
<a class="item archive-link" href="{{$.RepoLink}}/archive/{{PathEscapeSegments $.BranchName}}.zip" rel="nofollow">{{svg "octicon-file-zip" 16 "mr-3"}}{{.i18n.Tr "repo.download_zip"}}</a>
<a class="item archive-link" href="{{$.RepoLink}}/archive/{{PathEscapeSegments $.BranchName}}.tar.gz" rel="nofollow">{{svg "octicon-file-zip" 16 "mr-3"}}{{.i18n.Tr "repo.download_tar"}}</a>
<a class="item archive-link" href="{{$.RepoLink}}/archive/{{PathEscapeSegments $.BranchName}}.bundle" rel="nofollow">{{svg "octicon-package" 16 "mr-3"}}{{.i18n.Tr "repo.download_bundle"}}</a>
<a class="item" href="vscode://vscode.git/clone?url={{if $.PageIsWiki}}{{$.WikiCloneLink.HTTPS}}{{else}}{{$.CloneLink.HTTPS}}{{end}}">{{svg "gitea-vscode" 16 "mr-3"}}{{.i18n.Tr "repo.clone_in_vsc"}}</a>
<a class="item" href="vscode://vscode.git/clone?url={{$.RepoCloneLink.HTTPS}}">{{svg "gitea-vscode" 16 "mr-3"}}{{.i18n.Tr "repo.clone_in_vsc"}}</a>
</div>
</button>
</div>
Expand Down
2 changes: 1 addition & 1 deletion templates/repo/migrate/migrating.tmpl
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{{template "base/head" .}}
<div class="page-content repository quickstart">
<div class="page-content repository">
{{template "repo/header" .}}
<div class="ui container">
<div class="ui grid">
Expand Down
64 changes: 47 additions & 17 deletions web_src/js/features/repo-common.js
Original file line number Diff line number Diff line change
Expand Up @@ -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');
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-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');
}
$repoCloneHttps.on('click', () => {
localStorage.setItem('repo-clone-protocol', 'https');
updateUi();
});
$('#repo-clone-url').on('click', function () {
$(this).select();

$inputLink.on('click', () => {
$inputLink.select();
});
}

Expand Down
4 changes: 2 additions & 2 deletions web_src/js/features/repo-legacy.js
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -498,7 +498,7 @@ export function initRepository() {
initRepoCommonFilterSearchDropdown('.choose.branch .dropdown');
}

initRepoClone();
initRepoCloneLink();
initRepoCommonLanguageStats();
initRepoSettingBranches();

Expand Down