Merge remote-tracking branch 'upstream/main'

This commit is contained in:
Anthony Wang 2022-09-12 15:19:35 -05:00
commit 42b1bac7a6
Signed by: a
GPG key ID: 42A5B952E6DD8D38
59 changed files with 2425 additions and 2138 deletions

View file

@ -39,6 +39,16 @@ steps:
- make lint-frontend - make lint-frontend
depends_on: [deps-frontend] depends_on: [deps-frontend]
- name: security-check
image: golang:1.19
pull: always
commands:
- make security-check
depends_on: [deps-backend]
volumes:
- name: deps
path: /go
- name: lint-backend - name: lint-backend
image: gitea/test_env:linux-amd64 # https://gitea.com/gitea/test-env image: gitea/test_env:linux-amd64 # https://gitea.com/gitea/test-env
pull: always pull: always
@ -90,10 +100,7 @@ steps:
- name: checks-backend - name: checks-backend
image: golang:1.19 image: golang:1.19
commands: commands:
- curl -sL https://deb.nodesource.com/setup_18.x | bash - && apt-get -qqy install nodejs
- make checks-backend - make checks-backend
environment:
DEBIAN_FRONTEND: noninteractive
depends_on: [deps-backend] depends_on: [deps-backend]
volumes: volumes:
- name: deps - name: deps
@ -105,11 +112,16 @@ steps:
- make test-frontend - make test-frontend
depends_on: [lint-frontend] depends_on: [lint-frontend]
- name: generate-frontend
image: golang:1.19
commands:
- make generate-frontend
- name: build-frontend - name: build-frontend
image: node:18 image: node:18
commands: commands:
- make frontend - make frontend
depends_on: [test-frontend] depends_on: [deps-frontend, generate-frontend]
- name: build-backend-no-gcc - name: build-backend-no-gcc
image: golang:1.18 # this step is kept as the lowest version of golang that we support image: golang:1.18 # this step is kept as the lowest version of golang that we support
@ -532,16 +544,21 @@ services:
steps: steps:
- name: deps-frontend - name: deps-frontend
image: node:16 image: node:18
pull: always pull: always
commands: commands:
- make deps-frontend - make deps-frontend
- name: generate-frontend
image: golang:1.18
commands:
- make generate-frontend
- name: build-frontend - name: build-frontend
image: node:16 image: node:18
commands: commands:
- make frontend - make frontend
depends_on: [deps-frontend] depends_on: [deps-frontend, generate-frontend]
- name: deps-backend - name: deps-backend
image: golang:1.18 image: golang:1.18
@ -554,7 +571,7 @@ steps:
# TODO: We should probably build all dependencies into a test image # TODO: We should probably build all dependencies into a test image
- name: test-e2e - name: test-e2e
image: mcr.microsoft.com/playwright:v1.23.1-focal image: mcr.microsoft.com/playwright:v1.24.0-focal
commands: commands:
- curl -sLO https://go.dev/dl/go1.18.linux-amd64.tar.gz && tar -C /usr/local -xzf go1.18.linux-amd64.tar.gz - curl -sLO https://go.dev/dl/go1.18.linux-amd64.tar.gz && tar -C /usr/local -xzf go1.18.linux-amd64.tar.gz
- groupadd --gid 1001 gitea && useradd -m --gid 1001 --uid 1001 gitea - groupadd --gid 1001 gitea && useradd -m --gid 1001 --uid 1001 gitea
@ -569,6 +586,9 @@ steps:
TEST_PGSQL_DBNAME: 'testgitea-e2e' TEST_PGSQL_DBNAME: 'testgitea-e2e'
DEBIAN_FRONTEND: noninteractive DEBIAN_FRONTEND: noninteractive
depends_on: [build-frontend, deps-backend] depends_on: [build-frontend, deps-backend]
volumes:
- name: deps
path: /go
--- ---
kind: pipeline kind: pipeline

View file

@ -46,7 +46,7 @@ rules:
accessor-pairs: [2] accessor-pairs: [2]
array-bracket-newline: [0] array-bracket-newline: [0]
array-bracket-spacing: [2, never] array-bracket-spacing: [2, never]
array-callback-return: [0] array-callback-return: [2, {checkForEach: true}]
array-element-newline: [0] array-element-newline: [0]
arrow-body-style: [0] arrow-body-style: [0]
arrow-parens: [2, always] arrow-parens: [2, always]

View file

@ -35,6 +35,7 @@ MISSPELL_PACKAGE ?= github.com/client9/misspell/cmd/misspell@v0.3.4
SWAGGER_PACKAGE ?= github.com/go-swagger/go-swagger/cmd/swagger@v0.30.0 SWAGGER_PACKAGE ?= github.com/go-swagger/go-swagger/cmd/swagger@v0.30.0
XGO_PACKAGE ?= src.techknowlogick.com/xgo@latest XGO_PACKAGE ?= src.techknowlogick.com/xgo@latest
GO_LICENSES_PACKAGE ?= github.com/google/go-licenses@v1.3.0 GO_LICENSES_PACKAGE ?= github.com/google/go-licenses@v1.3.0
GOVULNCHECK_PACKAGE ?= golang.org/x/vuln/cmd/govulncheck@latest
DOCKER_IMAGE ?= gitea/gitea DOCKER_IMAGE ?= gitea/gitea
DOCKER_TAG ?= latest DOCKER_TAG ?= latest
@ -210,7 +211,7 @@ help:
@echo " - golangci-lint run golangci-lint linter" @echo " - golangci-lint run golangci-lint linter"
@echo " - go-licenses regenerate go licenses" @echo " - go-licenses regenerate go licenses"
@echo " - vet examines Go source code and reports suspicious constructs" @echo " - vet examines Go source code and reports suspicious constructs"
@echo " - tidy run go mod tidy and regenerate go licenses" @echo " - tidy run go mod tidy"
@echo " - test[\#TestSpecificName] run unit test" @echo " - test[\#TestSpecificName] run unit test"
@echo " - test-sqlite[\#TestSpecificName] run integration test for sqlite" @echo " - test-sqlite[\#TestSpecificName] run integration test for sqlite"
@echo " - pr#<index> build and start gitea from a PR with integration test data loaded" @echo " - pr#<index> build and start gitea from a PR with integration test data loaded"
@ -406,9 +407,9 @@ tidy:
$(eval MIN_GO_VERSION := $(shell grep -Eo '^go\s+[0-9]+\.[0-9.]+' go.mod | cut -d' ' -f2)) $(eval MIN_GO_VERSION := $(shell grep -Eo '^go\s+[0-9]+\.[0-9.]+' go.mod | cut -d' ' -f2))
$(GO) mod tidy -compat=$(MIN_GO_VERSION) $(GO) mod tidy -compat=$(MIN_GO_VERSION)
.PHONY: vendor vendor: go.mod go.sum
vendor: tidy
$(GO) mod vendor $(GO) mod vendor
@touch vendor
.PHONY: tidy-check .PHONY: tidy-check
tidy-check: tidy tidy-check: tidy
@ -420,12 +421,12 @@ tidy-check: tidy
fi fi
.PHONY: go-licenses .PHONY: go-licenses
go-licenses: assets/go-licenses.json go-licenses: $(GO_LICENSE_FILE)
assets/go-licenses.json: go.mod go.sum build/generate-go-licenses.js $(GO_LICENSE_FILE): go.mod go.sum
-$(GO) run $(GO_LICENSES_PACKAGE) save . --force --save_path="$(GO_LICENSE_TMP_DIR)" 2>/dev/null -$(GO) run $(GO_LICENSES_PACKAGE) save . --force --save_path=$(GO_LICENSE_TMP_DIR) 2>/dev/null
node build/generate-go-licenses.js "$(GO_LICENSE_TMP_DIR)" "$(GO_LICENSE_FILE)" $(GO) run build/generate-go-licenses.go $(GO_LICENSE_TMP_DIR) $(GO_LICENSE_FILE)
@rm -rf "$(GO_LICENSE_TMP_DIR)" @rm -rf $(GO_LICENSE_TMP_DIR)
generate-ini-sqlite: generate-ini-sqlite:
sed -e 's|{{REPO_TEST_DIR}}|${REPO_TEST_DIR}|g' \ sed -e 's|{{REPO_TEST_DIR}}|${REPO_TEST_DIR}|g' \
@ -717,15 +718,20 @@ backend: go-check generate-backend $(EXECUTABLE)
.PHONY: generate .PHONY: generate
generate: generate-backend generate-frontend generate: generate-backend generate-frontend
.PHONY: generate-frontend
generate-frontend: $(GO_LICENSE_FILE)
.PHONY: generate-backend .PHONY: generate-backend
generate-backend: $(TAGS_PREREQ) generate-go generate-backend: $(TAGS_PREREQ) generate-go
.PHONY: generate-go
generate-go: $(TAGS_PREREQ) generate-go: $(TAGS_PREREQ)
@echo "Running go generate..." @echo "Running go generate..."
@CC= GOOS= GOARCH= $(GO) generate -tags '$(TAGS)' $(GO_PACKAGES) @CC= GOOS= GOARCH= $(GO) generate -tags '$(TAGS)' $(GO_PACKAGES)
.PHONY: generate-frontend .PHONY: security-check
generate-frontend: $(TAGS_PREREQ) go-licenses security-check:
govulncheck -v ./...
$(EXECUTABLE): $(GO_SOURCES) $(TAGS_PREREQ) $(EXECUTABLE): $(GO_SOURCES) $(TAGS_PREREQ)
CGO_CFLAGS="$(CGO_CFLAGS)" $(GO) build $(GOFLAGS) $(EXTRA_GOFLAGS) -tags '$(TAGS)' -ldflags '-s -w $(LDFLAGS)' -o $@ CGO_CFLAGS="$(CGO_CFLAGS)" $(GO) build $(GOFLAGS) $(EXTRA_GOFLAGS) -tags '$(TAGS)' -ldflags '-s -w $(LDFLAGS)' -o $@
@ -812,6 +818,7 @@ deps-backend:
$(GO) install $(SWAGGER_PACKAGE) $(GO) install $(SWAGGER_PACKAGE)
$(GO) install $(XGO_PACKAGE) $(GO) install $(XGO_PACKAGE)
$(GO) install $(GO_LICENSES_PACKAGE) $(GO) install $(GO_LICENSES_PACKAGE)
$(GO) install $(GOVULNCHECK_PACKAGE)
node_modules: package-lock.json node_modules: package-lock.json
npm install --no-save npm install --no-save

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,82 @@
// Copyright 2022 The Gitea Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
//go:build ignore
package main
import (
"encoding/json"
"io/fs"
"os"
"path/filepath"
"regexp"
"sort"
"strings"
)
// regexp is based on go-license, excluding README and NOTICE
// https://github.com/google/go-licenses/blob/master/licenses/find.go
var licenseRe = regexp.MustCompile(`^(?i)((UN)?LICEN(S|C)E|COPYING).*$`)
type LicenseEntry struct {
Name string `json:"name"`
Path string `json:"path"`
LicenseText string `json:"licenseText"`
}
func main() {
base, out := os.Args[1], os.Args[2]
paths := []string{}
err := filepath.WalkDir(base, func(path string, entry fs.DirEntry, err error) error {
if err != nil {
return err
}
if entry.IsDir() || !licenseRe.MatchString(entry.Name()) {
return nil
}
paths = append(paths, path)
return nil
})
if err != nil {
panic(err)
}
sort.Strings(paths)
entries := []LicenseEntry{}
for _, path := range paths {
licenseText, err := os.ReadFile(path)
if err != nil {
panic(err)
}
path := strings.Replace(path, base+string(os.PathSeparator), "", 1)
name := filepath.Dir(path)
// There might be a bug somewhere in go-licenses that sometimes interprets the
// root package as "." and sometimes as "code.gitea.io/gitea". Workaround by
// removing both of them for the sake of stable output.
if name == "." || name == "code.gitea.io/gitea" {
continue
}
entries = append(entries, LicenseEntry{
Name: name,
Path: path,
LicenseText: string(licenseText),
})
}
jsonBytes, err := json.MarshalIndent(entries, "", " ")
if err != nil {
panic(err)
}
err = os.WriteFile(out, jsonBytes, 0o644)
if err != nil {
panic(err)
}
}

View file

@ -1,30 +0,0 @@
#!/usr/bin/env node
import fastGlob from 'fast-glob';
import {fileURLToPath} from 'url';
import {readFileSync, writeFileSync} from 'fs';
import wrapAnsi from 'wrap-ansi';
import {join, dirname} from 'path';
const base = process.argv[2];
const out = process.argv[3];
function exit(err) {
if (err) console.error(err);
process.exit(err ? 1 : 0);
}
async function main() {
const data = fastGlob.sync('**/*', {
cwd: fileURLToPath(new URL(`../${base}`, import.meta.url)),
}).filter((path) => {
return /\/((UN)?LICEN(S|C)E|COPYING|NOTICE)/i.test(path);
}).sort().map((path) => {
return {
name: dirname(path),
body: wrapAnsi(readFileSync(join(base, path), 'utf8') || '', 80)
};
});
writeFileSync(out, JSON.stringify(data, null, 2));
}
main().then(exit).catch(exit);

View file

@ -121,7 +121,7 @@ Apart from `extra_links.tmpl` and `extra_tabs.tmpl`, there are other useful temp
- `body_inner_pre.tmpl`, before the top navigation bar, but already inside the main container `<div class="full height">`. - `body_inner_pre.tmpl`, before the top navigation bar, but already inside the main container `<div class="full height">`.
- `body_inner_post.tmpl`, before the end of the main container. - `body_inner_post.tmpl`, before the end of the main container.
- `body_outer_post.tmpl`, before the bottom `<footer>` element. - `body_outer_post.tmpl`, before the bottom `<footer>` element.
- `footer.tmpl`, right before the end of the `<body>` tag, a good place for additional Javascript. - `footer.tmpl`, right before the end of the `<body>` tag, a good place for additional JavaScript.
#### Example: PlantUML #### Example: PlantUML
@ -129,7 +129,7 @@ You can add [PlantUML](https://plantuml.com/) support to Gitea's markdown by usi
The data is encoded and sent to the PlantUML server which generates the picture. There is an online The data is encoded and sent to the PlantUML server which generates the picture. There is an online
demo server at http://www.plantuml.com/plantuml, but if you (or your users) have sensitive data you demo server at http://www.plantuml.com/plantuml, but if you (or your users) have sensitive data you
can set up your own [PlantUML server](https://plantuml.com/server) instead. To set up PlantUML rendering, can set up your own [PlantUML server](https://plantuml.com/server) instead. To set up PlantUML rendering,
copy javascript files from https://gitea.com/davidsvantesson/plantuml-code-highlight and put them in your copy JavaScript files from https://gitea.com/davidsvantesson/plantuml-code-highlight and put them in your
`$GITEA_CUSTOM/public` folder. Then add the following to `custom/footer.tmpl`: `$GITEA_CUSTOM/public` folder. Then add the following to `custom/footer.tmpl`:
```html ```html
@ -137,9 +137,9 @@ copy javascript files from https://gitea.com/davidsvantesson/plantuml-code-highl
$(async () => { $(async () => {
if (!$('.language-plantuml').length) return; if (!$('.language-plantuml').length) return;
await Promise.all([ await Promise.all([
$.getScript('https://your-server.com/deflate.js'), $.getScript('https://your-gitea-server.com/assets/deflate.js'),
$.getScript('https://your-server.com/encode.js'), $.getScript('https://your-gitea-server.com/assets/encode.js'),
$.getScript('https://your-server.com/plantuml_codeblock_parse.js'), $.getScript('https://your-gitea-server.com/assets/plantuml_codeblock_parse.js'),
]); ]);
// Replace call with address to your plantuml server // Replace call with address to your plantuml server
parsePlantumlCodeBlocks("https://www.plantuml.com/plantuml"); parsePlantumlCodeBlocks("https://www.plantuml.com/plantuml");

View file

@ -15,12 +15,14 @@ menu:
# Logging Configuration # Logging Configuration
The logging framework has been revamped in Gitea 1.9.0.
**Table of Contents** **Table of Contents**
{{< toc >}} {{< toc >}}
## Collecting Logs for Help
To collect logs for help and issue report, see [Support Options]({{< relref "doc/help/seek-help.en-us.md" >}}).
## Log Groups ## Log Groups
The fundamental thing to be aware of in Gitea is that there are several The fundamental thing to be aware of in Gitea is that there are several

View file

@ -392,7 +392,9 @@ Gitea requires the system or browser to have one of the supported Emoji fonts in
Stdout on systemd goes to the journal by default. Try using `journalctl`, `journalctl -u gitea`, or `journalctl <path-to-gitea-binary>`. Stdout on systemd goes to the journal by default. Try using `journalctl`, `journalctl -u gitea`, or `journalctl <path-to-gitea-binary>`.
Similarly stdout on docker can be viewed using `docker logs <container>` Similarly, stdout on docker can be viewed using `docker logs <container>`.
To collect logs for help and issue report, see [Support Options]({{< relref "doc/help/seek-help.en-us.md" >}}).
## Initial logging ## Initial logging
@ -413,7 +415,7 @@ unchanged in the database schema. This may lead to warning such as:
2020/08/02 11:32:29 ...rm/session_schema.go:360:Sync2() [W] Table user Column keep_activity_private db default is , struct default is 0 2020/08/02 11:32:29 ...rm/session_schema.go:360:Sync2() [W] Table user Column keep_activity_private db default is , struct default is 0
``` ```
These can safely be ignored but you may able to stop these warnings by getting Gitea to recreate these tables using: These can safely be ignored, but you are able to stop these warnings by getting Gitea to recreate these tables using:
``` ```
gitea doctor recreate-table user gitea doctor recreate-table user

View file

@ -22,12 +22,14 @@ menu:
1. Your `app.ini` (with any sensitive data scrubbed as necessary). 1. Your `app.ini` (with any sensitive data scrubbed as necessary).
2. The Gitea logs, and any other appropriate log files for the situation. 2. The Gitea logs, and any other appropriate log files for the situation.
- The logs are likely to be outputted to console. If you need to collect logs from files, - When using systemd, use `journalctl --lines 1000 --unit gitea` to collect logs.
- When using docker, use `docker logs --tail 1000 <gitea-container>` to collect logs.
- By default, the logs are outputted to console. If you need to collect logs from files,
you could copy the following config into your `app.ini` (remove all other `[log]` sections), you could copy the following config into your `app.ini` (remove all other `[log]` sections),
then you can find the `*.log` files in Gitea's log directory (default: `%(GITEA_WORK_DIR)/log`). then you can find the `*.log` files in Gitea's log directory (default: `%(GITEA_WORK_DIR)/log`).
```ini ```ini
; To show all SQL logs, you can also set LOG_SQL=true in the [database] section ; To show all SQL logs, you can also set LOG_SQL=true in the [database] section
[log] [log]
LEVEL=debug LEVEL=debug
MODE=console,file MODE=console,file

View file

@ -49,9 +49,9 @@ Open "Windows Services", search for the service named "gitea", right-click it an
"Run". If everything is OK, Gitea will be reachable on `http://localhost:3000` (or the port "Run". If everything is OK, Gitea will be reachable on `http://localhost:3000` (or the port
that was configured). that was configured).
## Adding startup dependancies ## Adding startup dependencies
To add a startup dependancy to the Gitea Windows service (eg Mysql, Mariadb), as an Administrator, then run the following command: To add a startup dependency to the Gitea Windows service (eg Mysql, Mariadb), as an Administrator, then run the following command:
``` ```
sc.exe config gitea depend= mariadb sc.exe config gitea depend= mariadb

View file

@ -42,7 +42,7 @@ Possible file names for issue templates:
- `.gitea/ISSUE_TEMPLATE.yml` - `.gitea/ISSUE_TEMPLATE.yml`
- `.gitea/issue_template.md` - `.gitea/issue_template.md`
- `.gitea/issue_template.yaml` - `.gitea/issue_template.yaml`
- `.gitea/issue_template.md` - `.gitea/issue_template.yml`
- `.github/ISSUE_TEMPLATE.md` - `.github/ISSUE_TEMPLATE.md`
- `.github/ISSUE_TEMPLATE.yaml` - `.github/ISSUE_TEMPLATE.yaml`
- `.github/ISSUE_TEMPLATE.yml` - `.github/ISSUE_TEMPLATE.yml`

View file

@ -1,36 +1,296 @@
--- ---
date: "2018-05-10T16:00:00+02:00" date: "2022-09-07T16:00:00+08:00"
title: "使用:Issue 和 Pull Request 模板" title: "使用:从模板创建工单与合并请求"
slug: "issue-pull-request-templates" slug: "issue-pull-request-templates"
weight: 15 weight: 15
toc: false toc: true
draft: false draft: false
menu: menu:
sidebar: sidebar:
parent: "usage" parent: "usage"
name: "Issue 和 Pull Request 模板" name: "从模板创建工单与合并请求"
weight: 15 weight: 15
identifier: "issue-pull-request-templates" identifier: "issue-pull-request-templates"
--- ---
# 使用 Issue 和 Pull Request 模板 # 从模板创建工单与合并请求
对于一些项目,在创建 issue 或 pull request 时有一个标准的询问列表需要提交者填写。Gitea 支持添加此类模板至 repository 的主分支,以便提交者在创建 issue 或 pull request 时可以自动生成一个需要完成的表单,这么做可以减少一些前期关于 issue 抑或 pull request 细节上的沟通成本 开发者可以利用问题模板创建工单与合并请求,其目的在于规范参与者的语言表达
以下罗列了一些可供参考的 issue 模板: **目录**
* ISSUE_TEMPLATE.md {{< toc >}}
* issue_template.md
* .gitea/ISSUE_TEMPLATE.md
* .gitea/issue_template.md
* .github/ISSUE_TEMPLATE.md
* .github/issue_template.md
以下罗列了一些可供参考的 PR 模板: ## 模板介绍
* PULL_REQUEST_TEMPLATE.md Gitea 支持两种格式的模板Markdown 和 YAML。
* pull_request_template.md
* .gitea/PULL_REQUEST_TEMPLATE.md ### Markdown 模板
* .gitea/pull_request_template.md
* .github/PULL_REQUEST_TEMPLATE.md 在 Gitea 中存在两种用途的 Markdown 模板:
* .github/pull_request_template.md
- `ISSUE_TEMPLATE/bug-report.md` 用于规范工单的 Markdown 文本描述
- `PULL_REQUEST_TEMPLATE.md` 用于规范合并请求的 Markdown 文本描述
对于以上 Markdown 模板,我们推荐您将它们放置到项目目录 `.gitea` 进行收纳。
### YAML 模板
用 YAML 语法编写的模板相比 Markdown 可以实现更丰富的功能,利用表单实现诸如:问卷调查、字符校验。在 Gitea 中的 YAML 同样支持两种用途:
- `ISSUE_TEMPLATE/bug-report.yaml` 用于创建问卷调查形式的工单
- `PULL_REQUEST_TEMPLATE.yaml` 用于创建表单形式的合并请求
对于以上 YAML 模板,我们同样推荐您将它们放置到项目目录 `.gitea` 进行收纳。
##### 表单支持通过 URL 查询参数传值
当新建工单页面 URL 以 `?title=Issue+Title&body=Issue+Text` 为查询参数表单将使用其中的参数key-value填充表单内容。
### Gitea 支持的模板文件路径
工单模板文件名:
- `ISSUE_TEMPLATE.md`
- `ISSUE_TEMPLATE.yaml`
- `ISSUE_TEMPLATE.yml`
- `issue_template.md`
- `issue_template.yaml`
- `issue_template.yml`
- `.gitea/ISSUE_TEMPLATE.md`
- `.gitea/ISSUE_TEMPLATE.yaml`
- `.gitea/ISSUE_TEMPLATE.yml`
- `.gitea/issue_template.md`
- `.gitea/issue_template.yaml`
- `.gitea/issue_template.yml`
- `.github/ISSUE_TEMPLATE.md`
- `.github/ISSUE_TEMPLATE.yaml`
- `.github/ISSUE_TEMPLATE.yml`
- `.github/issue_template.md`
- `.github/issue_template.yaml`
- `.github/issue_template.yml`
合并请求模板:
- `PULL_REQUEST_TEMPLATE.md`
- `PULL_REQUEST_TEMPLATE.yaml`
- `PULL_REQUEST_TEMPLATE.yml`
- `pull_request_template.md`
- `pull_request_template.yaml`
- `pull_request_template.yml`
- `.gitea/PULL_REQUEST_TEMPLATE.md`
- `.gitea/PULL_REQUEST_TEMPLATE.yaml`
- `.gitea/PULL_REQUEST_TEMPLATE.yml`
- `.gitea/pull_request_template.md`
- `.gitea/pull_request_template.yaml`
- `.gitea/pull_request_template.yml`
- `.github/PULL_REQUEST_TEMPLATE.md`
- `.github/PULL_REQUEST_TEMPLATE.yaml`
- `.github/PULL_REQUEST_TEMPLATE.yml`
- `.github/pull_request_template.md`
- `.github/pull_request_template.yaml`
- `.github/pull_request_template.yml`
#### 工单模板目录
由于工单存在多种类型Gitea 支持将工单模板统一收纳到 `ISSUE_TEMPLATE` 目录。以下是 Gitea 支持的工单模板目录:
- `ISSUE_TEMPLATE`
- `issue_template`
- `.gitea/ISSUE_TEMPLATE`
- `.gitea/issue_template`
- `.github/ISSUE_TEMPLATE`
- `.github/issue_template`
- `.gitlab/ISSUE_TEMPLATE`
- `.gitlab/issue_template`
目录支持混合存放 Markdown (`.md`) 或 YAML (`.yaml`/`.yml`) 格式的工单模板。另外,合并请求模板不支持目录存放。
## Markdown 模板语法
```md
---
name: "Template Name"
about: "This template is for testing!"
title: "[TEST] "
ref: "main"
labels:
- bug
- "help needed"
---
This is the template!
```
上面的示例表示用户从列表中选择一个工单模板时,列表会展示模板名称 `Template Name` 和模板描述 `This template is for testing!`。 同时,标题会预先填充为 `[TEST]`,而正文将预先填充 `This is the template!`。 最后Issue 还会被分配两个标签,`bug` 和 `help needed`,并且将问题指向 `main` 分支。
## YAML 模板语法
YAML 模板格式如下,相比 Markdown 模板提供了更多实用性的功能。
```yaml
name: 表单名称
about: 表单描述
title: 默认标题
body: 主体内容
type: 定义表单元素类型
id: 定义表单标号
attributes: 扩展的属性
validations: 内容校验
```
下例 YAML 配置文件完整定义了一个用于提交 bug 的问卷调查。
```yaml
name: Bug Report
about: File a bug report
title: "[Bug]: "
body:
- type: markdown
attributes:
value: |
Thanks for taking the time to fill out this bug report!
- type: input
id: contact
attributes:
label: Contact Details
description: How can we get in touch with you if we need more info?
placeholder: ex. email@example.com
validations:
required: false
- type: textarea
id: what-happened
attributes:
label: What happened?
description: Also tell us, what did you expect to happen?
placeholder: Tell us what you see!
value: "A bug happened!"
validations:
required: true
- type: dropdown
id: version
attributes:
label: Version
description: What version of our software are you running?
options:
- 1.0.2 (Default)
- 1.0.3 (Edge)
validations:
required: true
- type: dropdown
id: browsers
attributes:
label: What browsers are you seeing the problem on?
multiple: true
options:
- Firefox
- Chrome
- Safari
- Microsoft Edge
- type: textarea
id: logs
attributes:
label: Relevant log output
description: Please copy and paste any relevant log output. This will be automatically formatted into code, so no need for backticks.
render: shell
- type: checkboxes
id: terms
attributes:
label: Code of Conduct
description: By submitting this issue, you agree to follow our [Code of Conduct](https://example.com)
options:
- label: I agree to follow this project's Code of Conduct
required: true
```
### Markdown 段落
您可以在 YAML 模板中使用 `markdown` 元素为开发者提供额外的上下文支撑,这部分内容会作为创建工单的提示但不会作为工单内容提交。
`attributes` 子项提供了以下扩展能力:
| 键 | 描述 | 必选 | 类型 | 默认值 | 有效值 |
| ------- | ------------------------------ | ---- | ------ | ------ | ------ |
| `value` | 渲染的文本。支持 Markdown 格式 | 必选 | 字符串 | - | - |
### Textarea 多行文本输入框
您可以使用 `textarea` 元素在表单中添加多行文本输入框。 除了输入文本,开发者还可以在 `textarea` 区域附加文件。
`attributes` 子项提供了以下扩展能力:
| 键 | 描述 | 必选 | 类型 | 默认值 | 有效值 |
| ------------- | ----------------------------------------------------------------------------------------------------- | ---- | ------ | -------- | ------------------ |
| `label` | 预期用户输入的简短描述,也以表单形式显示。 | 必选 | 字符串 | - | - |
| `description` | 提供上下文或指导的文本区域的描述,以表单形式显示。 | 可选 | 字符串 | 空字符串 | - |
| `placeholder` | 半透明的占位符,在文本区域空白时呈现 | 可选 | 字符串 | 空字符串 | - |
| `value` | 在文本区域中预填充的文本。 | 可选 | 字符串 | - | - |
| `render` | 如果提供了值,提交的文本将格式化为代码块。 提供此键时,文本区域将不会扩展到文件附件或 Markdown 编辑。 | 可选 | 字符串 | - | Gitea 支持的语言。 |
`validations` 子项提供以下文本校验参数:
| 键 | 描述 | 必选 | 类型 | 默认值 | 有效值 |
| ---------- | ---------------------------- | ---- | ------ | ------ | ------ |
| `required` | 防止在元素完成之前提交表单。 | 可选 | 布尔型 | false | - |
### Input 单行输入框
您可以使用 `input` 元素添加单行文本字段到表单。
`attributes` 子项提供了以下扩展能力:
| 键 | 描述 | 必选 | 类型 | 默认值 | 有效值 |
| ------------- | ---------------------------------------------- | ---- | ------ | -------- | ------ |
| `label` | 预期用户输入的简短描述,也以表单形式显示。 | 必选 | 字符串 | - | - |
| `description` | 提供上下文或指导的字段的描述,以表单形式显示。 | 可选 | 字符串 | 空字符串 | - |
| `placeholder` | 半透明的占位符,在字段空白时呈现。 | 可选 | 字符串 | 空字符串 | - |
| `value` | 字段中预填的文本。 | 可选 | 字符串 | - | - |
`validations` 子项提供以下文本校验参数:
| 键 | 描述 | 必选 | 类型 | 默认值 | 有效值 |
| ----------- | -------------------------------- | ---- | ------ | ------ | -------------------------------------------------------------- |
| `required` | 防止在未填内容时提交表单。 | 可选 | 布尔型 | false | - |
| `is_number` | 防止在未填数字时提交表单。 | 可选 | 布尔型 | false | - |
| `regex` | 直到满足了与正则表达式匹配的值。 | 可选 | 字符串 | - | [正则表达式](https://en.wikipedia.org/wiki/Regular_expression) |
### Dropdown 下拉菜单
您可以使用 `dropdown` 元素在表单中添加下拉菜单。
`attributes` 子项提供了以下扩展能力:
| 键 | 描述 | 必选 | 类型 | 默认值 | 有效值 |
| ------------- | --------------------------------------------------------- | ---- | ---------- | -------- | ------ |
| `label` | 预期用户输入的简短描述,以表单形式显示。 | 必选 | 字符串 | - | - |
| `description` | 提供上下文或指导的下拉列表的描述,以表单形式显示。 | 可选 | 字符串 | 空字符串 | - |
| `multiple` | 确定用户是否可以选择多个选项。 | 可选 | 布尔型 | false | - |
| `options` | 用户可以选择的选项列表。 不能为空,所有选择必须是不同的。 | 必选 | 字符串数组 | - | - |
`validations` 子项提供以下文本校验参数:
| 键 | 描述 | 必选 | 类型 | 默认值 | 有效值 |
| ---------- | ---------------------------- | ---- | ------ | ------ | ------ |
| `required` | 防止在元素完成之前提交表单。 | 可选 | 布尔型 | false | - |
### Checkboxes 复选框
您可以使用 `checkboxes` 元素添加一组复选框到表单。
`attributes` 子项提供了以下扩展能力:
| 键 | 描述 | 必选 | 类型 | 默认值 | 有效值 |
| ------------- | ----------------------------------------------------- | ---- | ------ | -------- | ------ |
| `label` | 预期用户输入的简短描述,以表单形式显示。 | 必选 | 字符串 | - | - |
| `description` | 复选框集的描述,以表单形式显示。 支持 Markdown 格式。 | 可选 | 字符串 | 空字符串 | - |
| `options` | 用户可以选择的复选框列表。 有关语法,请参阅下文。 | 必选 | 数组 | - | - |
对于 `options`,您可以设置以下参数:
| 键 | 描述 | 必选 | 类型 | 默认值 | 有效值 |
| ---------- | --------------------------------------------------------------------------------- | ---- | ------ | ------ | ------ |
| `label` | 选项的标识符,显示在表单中。 支持 Markdown 用于粗体或斜体文本格式化和超文本链接。 | 必选 | 字符串 | - | - |
| `required` | 防止在元素完成之前提交表单。 | 可选 | 布尔型 | false | - |

View file

@ -28,7 +28,7 @@ type ActivityAuthorData struct {
Commits int64 `json:"commits"` Commits int64 `json:"commits"`
} }
// ActivityStats represets issue and pull request information. // ActivityStats represents issue and pull request information.
type ActivityStats struct { type ActivityStats struct {
OpenedPRs issues_model.PullRequestList OpenedPRs issues_model.PullRequestList
OpenedPRAuthorCount int64 OpenedPRAuthorCount int64

View file

@ -49,7 +49,7 @@ func TestHasOwnerPackages(t *testing.T) {
assert.NotNil(t, pv) assert.NotNil(t, pv)
assert.NoError(t, err) assert.NoError(t, err)
// A package with an internal package version gets automaticaly cleaned up and should return false // A package with an internal package version gets automatically cleaned up and should return false
has, err = packages_model.HasOwnerPackages(db.DefaultContext, owner.ID) has, err = packages_model.HasOwnerPackages(db.DefaultContext, owner.ID)
assert.False(t, has) assert.False(t, has)
assert.NoError(t, err) assert.NoError(t, err)

View file

@ -27,7 +27,7 @@ import (
"xorm.io/builder" "xorm.io/builder"
) )
// ErrUserDoesNotHaveAccessToRepo represets an error where the user doesn't has access to a given repo. // ErrUserDoesNotHaveAccessToRepo represents an error where the user doesn't has access to a given repo.
type ErrUserDoesNotHaveAccessToRepo struct { type ErrUserDoesNotHaveAccessToRepo struct {
UserID int64 UserID int64
RepoName string RepoName string

View file

@ -26,7 +26,7 @@ type Metadata struct {
RepositoryURL string `json:"repository_url,omitempty"` RepositoryURL string `json:"repository_url,omitempty"`
} }
// ParseMetadataFromBox parses the metdata of a box file // ParseMetadataFromBox parses the metadata of a box file
func ParseMetadataFromBox(r io.Reader) (*Metadata, error) { func ParseMetadataFromBox(r io.Reader) (*Metadata, error) {
gzr, err := gzip.NewReader(r) gzr, err := gzip.NewReader(r)
if err != nil { if err != nil {

View file

@ -376,15 +376,15 @@ func NewFuncMap() []template.FuncMap {
// the table is NOT sorted with this header // the table is NOT sorted with this header
return "" return ""
}, },
"RenderLabels": func(labels []*issues_model.Label) template.HTML { "RenderLabels": func(labels []*issues_model.Label, repoLink string) template.HTML {
html := `<span class="labels-list">` html := `<span class="labels-list">`
for _, label := range labels { for _, label := range labels {
// Protect against nil value in labels - shouldn't happen but would cause a panic if so // Protect against nil value in labels - shouldn't happen but would cause a panic if so
if label == nil { if label == nil {
continue continue
} }
html += fmt.Sprintf("<div class='ui label' style='color: %s; background-color: %s'>%s</div> ", html += fmt.Sprintf("<a href='%s/issues?labels=%d' class='ui label' style='color: %s !important; background-color: %s !important'>%s</a> ",
label.ForegroundColor(), label.Color, RenderEmoji(label.Name)) repoLink, label.ID, label.ForegroundColor(), label.Color, RenderEmoji(label.Name))
} }
html += "</span>" html += "</span>"
return template.HTML(html) return template.HTML(html)
@ -631,7 +631,7 @@ func SVG(icon string, others ...interface{}) template.HTML {
// Avatar renders user avatars. args: user, size (int), class (string) // Avatar renders user avatars. args: user, size (int), class (string)
func Avatar(item interface{}, others ...interface{}) template.HTML { func Avatar(item interface{}, others ...interface{}) template.HTML {
size, class := parseOthers(avatars.DefaultAvatarPixelSize, "ui avatar image vm", others...) size, class := parseOthers(avatars.DefaultAvatarPixelSize, "ui avatar vm", others...)
switch t := item.(type) { switch t := item.(type) {
case *user_model.User: case *user_model.User:
@ -662,7 +662,7 @@ func AvatarByAction(action *activities_model.Action, others ...interface{}) temp
// RepoAvatar renders repo avatars. args: repo, size(int), class (string) // RepoAvatar renders repo avatars. args: repo, size(int), class (string)
func RepoAvatar(repo *repo_model.Repository, others ...interface{}) template.HTML { func RepoAvatar(repo *repo_model.Repository, others ...interface{}) template.HTML {
size, class := parseOthers(avatars.DefaultAvatarPixelSize, "ui avatar image", others...) size, class := parseOthers(avatars.DefaultAvatarPixelSize, "ui avatar", others...)
src := repo.RelAvatarLink() src := repo.RelAvatarLink()
if src != "" { if src != "" {
@ -673,7 +673,7 @@ func RepoAvatar(repo *repo_model.Repository, others ...interface{}) template.HTM
// AvatarByEmail renders avatars by email address. args: email, name, size (int), class (string) // AvatarByEmail renders avatars by email address. args: email, name, size (int), class (string)
func AvatarByEmail(email, name string, others ...interface{}) template.HTML { func AvatarByEmail(email, name string, others ...interface{}) template.HTML {
size, class := parseOthers(avatars.DefaultAvatarPixelSize, "ui avatar image", others...) size, class := parseOthers(avatars.DefaultAvatarPixelSize, "ui avatar", others...)
src := avatars.GenerateEmailAvatarFastLink(email, size*setting.Avatar.RenderedSizeFactor) src := avatars.GenerateEmailAvatarFastLink(email, size*setting.Avatar.RenderedSizeFactor)
if src != "" { if src != "" {

View file

@ -178,6 +178,8 @@ log_root_path_helper=Τα αρχεία καταγραφής θα γράφοντ
optional_title=Προαιρετικές Ρυθμίσεις optional_title=Προαιρετικές Ρυθμίσεις
email_title=Ρυθμίσεις Email email_title=Ρυθμίσεις Email
smtp_addr=Διακομιστής SMTP
smtp_port=Θύρα SMTP
smtp_from=Αποστολή Email Ως smtp_from=Αποστολή Email Ως
smtp_from_helper=Η διεύθυνση email που θα χρησιμοποιεί το Gitea. Εισάγετε μια απλή διεύθυνση ηλεκτρονικού ταχυδρομείου ή χρησιμοποιήστε τη μορφή "Όνομα" <email@example.com>. smtp_from_helper=Η διεύθυνση email που θα χρησιμοποιεί το Gitea. Εισάγετε μια απλή διεύθυνση ηλεκτρονικού ταχυδρομείου ή χρησιμοποιήστε τη μορφή "Όνομα" <email@example.com>.
mailer_user=Όνομα Χρήστη SMTP mailer_user=Όνομα Χρήστη SMTP
@ -275,6 +277,8 @@ org_no_results=Δεν βρέθηκαν οργανισμοί που να ταιρ
code_no_results=Δεν βρέθηκε πηγαίος κώδικας που να ταιριάζει με τον όρο αναζήτησης. code_no_results=Δεν βρέθηκε πηγαίος κώδικας που να ταιριάζει με τον όρο αναζήτησης.
code_search_results=Αποτελέσματα αναζήτησης για '%s' code_search_results=Αποτελέσματα αναζήτησης για '%s'
code_last_indexed_at=Τελευταίο δημιουργία ευρετηρίου στις %s code_last_indexed_at=Τελευταίο δημιουργία ευρετηρίου στις %s
relevant_repositories_tooltip=Τα αποθετήρια που είναι forks ή που δεν έχουν θέμα, εικονίδιο και περιγραφή είναι κρυμμένα.
relevant_repositories=Εμφανίζονται μόνο τα σχετικά αποθετήρια, <a href="%s">εμφάνιση χωρίς φίλτρο</a>.
[auth] [auth]
@ -798,6 +802,7 @@ email_notifications.enable=Ενεργοποίηση Ειδοποιήσεων Μ
email_notifications.onmention=Email Μόνο κατά την Αναφορά email_notifications.onmention=Email Μόνο κατά την Αναφορά
email_notifications.disable=Απενεργοποίηση Ειδοποιήσεων μέσω Email email_notifications.disable=Απενεργοποίηση Ειδοποιήσεων μέσω Email
email_notifications.submit=Ορισμός Προτιμότερου Email email_notifications.submit=Ορισμός Προτιμότερου Email
email_notifications.andyourown=Και Τις Δικές Σας Ειδοποιήσεις
visibility=Ορατότητα χρήστη visibility=Ορατότητα χρήστη
visibility.public=Δημόσια visibility.public=Δημόσια
@ -1033,6 +1038,13 @@ file_view_rendered=Προβολή Απόδοσης
file_view_raw=Προβολή Ακατέργαστου file_view_raw=Προβολή Ακατέργαστου
file_permalink=Permalink file_permalink=Permalink
file_too_large=Το αρχείο είναι πολύ μεγάλο για να εμφανιστεί. file_too_large=Το αρχείο είναι πολύ μεγάλο για να εμφανιστεί.
invisible_runes_header=`Αυτό το αρχείο περιέχει αόρατους χαρακτήρες Unicode!`
invisible_runes_description=`Αυτό το αρχείο περιέχει αόρατους χαρακτήρες Unicode που μπορεί να επεξεργάζονται διαφορετικά από ό, τι εμφανίζονται παρακάτω. Αν η περίπτωση χρήσης σας είναι σκόπιμη και νόμιμη, μπορείτε να αγνοήσετε με ασφάλεια αυτή την προειδοποίηση. Χρησιμοποιήστε το κουμπί Escape για να αποκαλύψετε κρυμμένους χαρακτήρες.`
ambiguous_runes_header=`Αυτό το αρχείο περιέχει ασαφείς χαρακτήρες Unicode!`
ambiguous_runes_description=`Αυτό το αρχείο περιέχει ασαφείς χαρακτήρες Unicode που μπορεί να συγχέονται με άλλους στην τοπική σας γλώσσα. Αν η περίπτωση χρήσης σας είναι σκόπιμη και νόμιμη, μπορείτε να αγνοήσετε με ασφάλεια αυτή την προειδοποίηση. Χρησιμοποιήστε το κουμπί Escape για να επισημάνετε αυτούς τους χαρακτήρες.`
invisible_runes_line=`Αυτή η γραμμή έχει αόρατους χαρακτήρες unicode `
ambiguous_runes_line=`Αυτή η γραμμή έχει ασαφείς χαρακτήρες unicode `
ambiguous_character=`ο %[1]c [U+%04[1]X] μπορεί να μπερδευτεί με τον %[2]c [U+%04[2]X]`
escape_control_characters=Escape escape_control_characters=Escape
unescape_control_characters=Unescape unescape_control_characters=Unescape
@ -1053,6 +1065,7 @@ normal_view=Κανονική Προβολή
line=γραμμή line=γραμμή
lines=γραμμές lines=γραμμές
editor.add_file=Προσθήκη Αρχείου
editor.new_file=Νέο Αρχείο editor.new_file=Νέο Αρχείο
editor.upload_file=Ανέβασμα Αρχείου editor.upload_file=Ανέβασμα Αρχείου
editor.edit_file=Επεξεργασία Αρχείου editor.edit_file=Επεξεργασία Αρχείου
@ -1218,6 +1231,8 @@ issues.new.add_reviewer_title=Αίτηση επανεξέτασης
issues.choose.get_started=Ας Αρχίσουμε issues.choose.get_started=Ας Αρχίσουμε
issues.choose.blank=Προεπιλογή issues.choose.blank=Προεπιλογή
issues.choose.blank_about=Δημιουργήστε ένα ζήτημα από το προεπιλεγμένο πρότυπο. issues.choose.blank_about=Δημιουργήστε ένα ζήτημα από το προεπιλεγμένο πρότυπο.
issues.choose.ignore_invalid_templates=Μη έγκυρα πρότυπα έχουν αγνοηθεί
issues.choose.invalid_templates=%v βρέθηκε μη έγκυρο πρότυπο(α)
issues.no_ref=Δεν Έχει Οριστεί Κλάδος/Ετικέτα issues.no_ref=Δεν Έχει Οριστεί Κλάδος/Ετικέτα
issues.create=Δημιουργία Ζητήματος issues.create=Δημιουργία Ζητήματος
issues.new_label=Νέο Σήμα issues.new_label=Νέο Σήμα
@ -1258,6 +1273,8 @@ issues.filter_milestone=Ορόσημο
issues.filter_milestone_no_select=Όλα τα ορόσημα issues.filter_milestone_no_select=Όλα τα ορόσημα
issues.filter_assignee=Αποδέκτης issues.filter_assignee=Αποδέκτης
issues.filter_assginee_no_select=Όλοι οι αποδέκτες issues.filter_assginee_no_select=Όλοι οι αποδέκτες
issues.filter_poster=Συγγραφέας
issues.filter_poster_no_select=Όλοι οι συγγραφείς
issues.filter_type=Τύπος issues.filter_type=Τύπος
issues.filter_type.all_issues=Όλα τα ζητήματα issues.filter_type.all_issues=Όλα τα ζητήματα
issues.filter_type.assigned_to_you=Ανατέθηκαν σε εσάς issues.filter_type.assigned_to_you=Ανατέθηκαν σε εσάς
@ -1939,6 +1956,8 @@ settings.event_delete=Διαγραφή
settings.event_delete_desc=Ο κλάδος ή η ετικέτα διαγράφηκε. settings.event_delete_desc=Ο κλάδος ή η ετικέτα διαγράφηκε.
settings.event_fork=Fork settings.event_fork=Fork
settings.event_fork_desc=Το αποθετήριο έγινε fork. settings.event_fork_desc=Το αποθετήριο έγινε fork.
settings.event_wiki=Wiki
settings.event_wiki_desc=Η σελίδα Wiki δημιουργήθηκε, μετονομάστηκε, επεξεργάστηκε ή διαγράφηκε.
settings.event_release=Έκδοση settings.event_release=Έκδοση
settings.event_release_desc=Η έκδοση δημοσιεύτηκε, ενημερώθηκε ή διαγράφηκε από ένα αποθετήριο. settings.event_release_desc=Η έκδοση δημοσιεύτηκε, ενημερώθηκε ή διαγράφηκε από ένα αποθετήριο.
settings.event_push=Push settings.event_push=Push
@ -2786,13 +2805,19 @@ config.queue_length=Μέγεθος Ουράς
config.deliver_timeout=Χρονικό Όριο Παράδοσης config.deliver_timeout=Χρονικό Όριο Παράδοσης
config.skip_tls_verify=Παράλειψη Επαλήθευσης TLS config.skip_tls_verify=Παράλειψη Επαλήθευσης TLS
config.mailer_config=Ρυθμίσεις Αλληλογραφίας
config.mailer_enabled=Ενεργοποιημένο config.mailer_enabled=Ενεργοποιημένο
config.mailer_enable_helo=Ενεργοποίηση HELO
config.mailer_name=Όνομα config.mailer_name=Όνομα
config.mailer_protocol=Πρωτόκολλο
config.mailer_smtp_addr=Διευθ SMTP
config.mailer_smtp_port=Θύρα SMTP
config.mailer_user=Χρήστης config.mailer_user=Χρήστης
config.mailer_use_sendmail=Χρήση Sendmail config.mailer_use_sendmail=Χρήση Sendmail
config.mailer_sendmail_path=Διαδρομή Sendmail config.mailer_sendmail_path=Διαδρομή Sendmail
config.mailer_sendmail_args=Επιπλέον παράμετροι για το Sendmail config.mailer_sendmail_args=Επιπλέον παράμετροι για το Sendmail
config.mailer_sendmail_timeout=Χρονικό Όριο Sendmail config.mailer_sendmail_timeout=Χρονικό Όριο Sendmail
config.mailer_use_dummy=Ψεύτικο
config.test_email_placeholder=Email (π.χ. test@example.com) config.test_email_placeholder=Email (π.χ. test@example.com)
config.send_test_mail=Αποστολή Δοκιμαστικού Email config.send_test_mail=Αποστολή Δοκιμαστικού Email
config.test_mail_failed=Αποτυχία αποστολής δοκιμαστικού email στο'%s': %v config.test_mail_failed=Αποτυχία αποστολής δοκιμαστικού email στο'%s': %v
@ -2877,6 +2902,7 @@ monitor.queue.nopool.title=Χωρίς Δεξαμενή Εργατών
monitor.queue.nopool.desc=Αυτή η ουρά συμπεριλαμβάνει άλλες ουρές και δεν έχει η ίδια δεξαμενή εργατών. monitor.queue.nopool.desc=Αυτή η ουρά συμπεριλαμβάνει άλλες ουρές και δεν έχει η ίδια δεξαμενή εργατών.
monitor.queue.wrapped.desc=Μια ουρά συμπερίληψης, περιλαμβάνει μια ουρά αργής εκκίνησης, κρατώντας προσωρινά τις αιτήσεις πού βρίσκονται στην ουρά, μέσα σε ένα κανάλι. Δεν διαθέτει μια δεξαμενή εργατών. monitor.queue.wrapped.desc=Μια ουρά συμπερίληψης, περιλαμβάνει μια ουρά αργής εκκίνησης, κρατώντας προσωρινά τις αιτήσεις πού βρίσκονται στην ουρά, μέσα σε ένα κανάλι. Δεν διαθέτει μια δεξαμενή εργατών.
monitor.queue.persistable-channel.desc=Ένα ανθεκτικό-κανάλι περιλαμβάνει δύο ουρές, μια ουρά καναλιών που έχει τη δική του δεξαμενή εργατών και μια ουρά επιπέδου για κρατημένα αιτήματα από προηγούμενες απενεργοποιήσεις. Δεν έχει το ίδιο δεξαμενή εργατών. monitor.queue.persistable-channel.desc=Ένα ανθεκτικό-κανάλι περιλαμβάνει δύο ουρές, μια ουρά καναλιών που έχει τη δική του δεξαμενή εργατών και μια ουρά επιπέδου για κρατημένα αιτήματα από προηγούμενες απενεργοποιήσεις. Δεν έχει το ίδιο δεξαμενή εργατών.
monitor.queue.flush=Εκκαθάριση εργάτη
monitor.queue.pool.timeout=Λήξη ορίου χρόνου monitor.queue.pool.timeout=Λήξη ορίου χρόνου
monitor.queue.pool.addworkers.title=Προσθήκη Εργατών monitor.queue.pool.addworkers.title=Προσθήκη Εργατών
monitor.queue.pool.addworkers.submit=Προσθήκη Εργατών monitor.queue.pool.addworkers.submit=Προσθήκη Εργατών
@ -3029,6 +3055,7 @@ title=Πακέτα
desc=Διαχείριση πακέτων μητρώου. desc=Διαχείριση πακέτων μητρώου.
empty=Δεν υπάρχουν πακέτα ακόμα. empty=Δεν υπάρχουν πακέτα ακόμα.
empty.documentation=Για περισσότερες πληροφορίες σχετικά με το μητρώο πακέτων, ανατρέξτε <a target="_blank" rel="noopener noreferrer" href="https://docs.gitea.io/en-us/packages/overview">στην τεκμηρίωση</a>. empty.documentation=Για περισσότερες πληροφορίες σχετικά με το μητρώο πακέτων, ανατρέξτε <a target="_blank" rel="noopener noreferrer" href="https://docs.gitea.io/en-us/packages/overview">στην τεκμηρίωση</a>.
empty.repo=Μήπως ανεβάσατε ένα πακέτο, αλλά δεν εμφανίζεται εδώ; Πηγαίνετε στις <a href="%[1]s">ρυθμίσεις πακέτων</a> και συνδέστε το σε αυτό το αποθετήριο.
filter.type=Τύπος filter.type=Τύπος
filter.type.all=Όλα filter.type.all=Όλα
filter.no_result=Το φίλτρο δεν παρήγαγε αποτελέσματα. filter.no_result=Το φίλτρο δεν παρήγαγε αποτελέσματα.
@ -3094,6 +3121,10 @@ npm.dependencies.development=Εξαρτήσεις Ανάπτυξης
npm.dependencies.peer=Εξαρτήσεις Ομότιμου npm.dependencies.peer=Εξαρτήσεις Ομότιμου
npm.dependencies.optional=Προαιρετικές Εξαρτήσεις npm.dependencies.optional=Προαιρετικές Εξαρτήσεις
npm.details.tag=Σήμανση npm.details.tag=Σήμανση
pub.install=Για να εγκαταστήσετε το πακέτο μέσω του Dart, εκτελέστε την ακόλουθη εντολή:
pub.documentation=Για περισσότερες πληροφορίες σχετικά με το μητρώο Pub, ανατρέξτε <a target="_blank" rel="noopener noreferrer" href="https://docs.gitea.io/en-us/packages/pub/">στην τεκμηρίωση</a>.
pub.details.repository_site=Ιστοσελίδα Αποθετηρίου
pub.details.documentation_site=Ιστοσελίδα Τεκμηρίωσης
pypi.requires=Απαιτεί Python pypi.requires=Απαιτεί Python
pypi.install=Για να εγκαταστήσετε το πακέτο χρησιμοποιώντας το pip, εκτελέστε την ακόλουθη εντολή: pypi.install=Για να εγκαταστήσετε το πακέτο χρησιμοποιώντας το pip, εκτελέστε την ακόλουθη εντολή:
pypi.documentation=Για περισσότερες πληροφορίες σχετικά με το μητρώο PyPI, ανατρέξτε <a target="_blank" rel="noopener noreferrer" href="https://docs.gitea.io/en-us/packages/pypi/">στην τεκμηρίωση</a>. pypi.documentation=Για περισσότερες πληροφορίες σχετικά με το μητρώο PyPI, ανατρέξτε <a target="_blank" rel="noopener noreferrer" href="https://docs.gitea.io/en-us/packages/pypi/">στην τεκμηρίωση</a>.
@ -3104,6 +3135,8 @@ rubygems.dependencies.development=Εξαρτήσεις Ανάπτυξης
rubygems.required.ruby=Απαιτεί την έκδοση Ruby rubygems.required.ruby=Απαιτεί την έκδοση Ruby
rubygems.required.rubygems=Απαιτεί έκδοση RubyGem rubygems.required.rubygems=Απαιτεί έκδοση RubyGem
rubygems.documentation=Για περισσότερες πληροφορίες σχετικά με το μητρώο RubyGems, ανατρέξτε <a target="_blank" rel="noopener noreferrer" href="https://docs.gitea.io/en-us/packages/rubygems/">στην τεκμηρίωση</a>. rubygems.documentation=Για περισσότερες πληροφορίες σχετικά με το μητρώο RubyGems, ανατρέξτε <a target="_blank" rel="noopener noreferrer" href="https://docs.gitea.io/en-us/packages/rubygems/">στην τεκμηρίωση</a>.
vagrant.install=Για προσθήκη ενός κυτίου Vagrant, εκτελέστε την ακόλουθη εντολή:
vagrant.documentation=Για περισσότερες πληροφορίες σχετικά με το μητρώο του Vagrant, ανατρέξτε <a target="_blank" rel="noopener noreferrer" href="https://docs.gitea.io/en-us/packages/vagrant/">στην τεκμηρίωση</a>.
settings.link=Σύνδεση αυτού του πακέτου με ένα αποθετήριο settings.link=Σύνδεση αυτού του πακέτου με ένα αποθετήριο
settings.link.description=Εάν συνδέσετε ένα πακέτο με ένα αποθετήριο, το πακέτο περιλαμβάνεται στη λίστα πακέτων του αποθετηρίου. settings.link.description=Εάν συνδέσετε ένα πακέτο με ένα αποθετήριο, το πακέτο περιλαμβάνεται στη λίστα πακέτων του αποθετηρίου.
settings.link.select=Επιλογή Αποθετηρίου settings.link.select=Επιλογή Αποθετηρίου

View file

@ -1231,6 +1231,8 @@ issues.new.add_reviewer_title=レビュー依頼
issues.choose.get_started=始める issues.choose.get_started=始める
issues.choose.blank=デフォルト issues.choose.blank=デフォルト
issues.choose.blank_about=デフォルトのテンプレートからイシューを作成。 issues.choose.blank_about=デフォルトのテンプレートからイシューを作成。
issues.choose.ignore_invalid_templates=無効なテンプレートが無視されました
issues.choose.invalid_templates=無効なテンプレートが%v 件見つかりました
issues.no_ref=ブランチ/タグ指定なし issues.no_ref=ブランチ/タグ指定なし
issues.create=イシューを作成 issues.create=イシューを作成
issues.new_label=新しいラベル issues.new_label=新しいラベル
@ -1954,6 +1956,8 @@ settings.event_delete=削除
settings.event_delete_desc=ブランチやタグが削除されたとき。 settings.event_delete_desc=ブランチやタグが削除されたとき。
settings.event_fork=フォーク settings.event_fork=フォーク
settings.event_fork_desc=リポジトリがフォークされたとき。 settings.event_fork_desc=リポジトリがフォークされたとき。
settings.event_wiki=Wiki
settings.event_wiki_desc=Wikiページが作成・名前変更・編集・削除されたとき。
settings.event_release=リリース settings.event_release=リリース
settings.event_release_desc=リポジトリでリリースが作成・更新・削除されたとき。 settings.event_release_desc=リポジトリでリリースが作成・更新・削除されたとき。
settings.event_push=プッシュ settings.event_push=プッシュ

View file

@ -1956,6 +1956,8 @@ settings.event_delete=Eliminar
settings.event_delete_desc=Ramo ou etiqueta eliminados. settings.event_delete_desc=Ramo ou etiqueta eliminados.
settings.event_fork=Derivar settings.event_fork=Derivar
settings.event_fork_desc=Feita a derivação do repositório. settings.event_fork_desc=Feita a derivação do repositório.
settings.event_wiki=Wiki
settings.event_wiki_desc=Página do wiki criada, renomeada, editada ou eliminada.
settings.event_release=Lançamento settings.event_release=Lançamento
settings.event_release_desc=Lançamento publicado, modificado ou eliminado num repositório. settings.event_release_desc=Lançamento publicado, modificado ou eliminado num repositório.
settings.event_push=Enviar settings.event_push=Enviar

View file

@ -1231,6 +1231,8 @@ issues.new.add_reviewer_title=İnceleme iste
issues.choose.get_started=Başla issues.choose.get_started=Başla
issues.choose.blank=Varsayılan issues.choose.blank=Varsayılan
issues.choose.blank_about=Varsayılan şablondan bir konu oluşturun. issues.choose.blank_about=Varsayılan şablondan bir konu oluşturun.
issues.choose.ignore_invalid_templates=Geçersiz şablonlar göz ardı edildi
issues.choose.invalid_templates=%v geçersiz şablon bulundu
issues.no_ref=Bölüm/Etiket Belirtilmedi issues.no_ref=Bölüm/Etiket Belirtilmedi
issues.create=Konu Oluştur issues.create=Konu Oluştur
issues.new_label=Yeni Etiket issues.new_label=Yeni Etiket
@ -1954,6 +1956,8 @@ settings.event_delete=Sil
settings.event_delete_desc=Dal veya etiket silindi. settings.event_delete_desc=Dal veya etiket silindi.
settings.event_fork=Çatalla settings.event_fork=Çatalla
settings.event_fork_desc=Depo çatallandı. settings.event_fork_desc=Depo çatallandı.
settings.event_wiki=Viki
settings.event_wiki_desc=Viki sayfası oluşturuldu, adı değiştirildi, düzenlendi veya silindi.
settings.event_release=Sürüm settings.event_release=Sürüm
settings.event_release_desc=Sürüm yayınlandığında, güncellendiğinde veya silindiğinde. settings.event_release_desc=Sürüm yayınlandığında, güncellendiğinde veya silindiğinde.
settings.event_push=Çek settings.event_push=Çek

View file

@ -866,7 +866,7 @@ mirror_prune_desc=删除过时的远程跟踪引用
mirror_interval=镜像间隔 (有效的时间单位是 'h', 'm', 's')。0 禁用自动定期同步 (最短间隔: %s) mirror_interval=镜像间隔 (有效的时间单位是 'h', 'm', 's')。0 禁用自动定期同步 (最短间隔: %s)
mirror_interval_invalid=镜像间隔无效。 mirror_interval_invalid=镜像间隔无效。
mirror_sync_on_commit=推送提交时同步 mirror_sync_on_commit=推送提交时同步
mirror_address=URL克隆 mirror_address= URL 克隆
mirror_address_desc=在授权框中输入必要的凭据。 mirror_address_desc=在授权框中输入必要的凭据。
mirror_address_url_invalid=URL无效。请检查您所输入的URL是否正确。 mirror_address_url_invalid=URL无效。请检查您所输入的URL是否正确。
mirror_address_protocol_invalid=提供的 url 无效。只能从 http(s):// 或 git:// 位置进行镜像。 mirror_address_protocol_invalid=提供的 url 无效。只能从 http(s):// 或 git:// 位置进行镜像。

2844
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -9,16 +9,16 @@
"dependencies": { "dependencies": {
"@claviska/jquery-minicolors": "2.3.6", "@claviska/jquery-minicolors": "2.3.6",
"@mcaptcha/vanilla-glue": "0.1.0-alpha-2", "@mcaptcha/vanilla-glue": "0.1.0-alpha-2",
"@primer/octicons": "17.4.1", "@primer/octicons": "17.5.0",
"add-asset-webpack-plugin": "2.0.1", "add-asset-webpack-plugin": "2.0.1",
"css-loader": "6.7.1", "css-loader": "6.7.1",
"dropzone": "6.0.0-beta.2", "dropzone": "6.0.0-beta.2",
"easymde": "2.17.0", "easymde": "2.17.0",
"esbuild-loader": "2.19.0", "esbuild-loader": "2.20.0",
"escape-goat": "4.0.0", "escape-goat": "4.0.0",
"fast-glob": "3.2.11", "fast-glob": "3.2.12",
"font-awesome": "4.7.0", "font-awesome": "4.7.0",
"jquery": "3.6.0", "jquery": "3.6.1",
"jquery.are-you-sure": "1.9.0", "jquery.are-you-sure": "1.9.0",
"less": "4.1.3", "less": "4.1.3",
"less-loader": "11.0.0", "less-loader": "11.0.0",
@ -46,23 +46,23 @@
"wrap-ansi": "8.0.1" "wrap-ansi": "8.0.1"
}, },
"devDependencies": { "devDependencies": {
"@playwright/test": "1.25.1", "@playwright/test": "1.25.2",
"@stoplight/spectral-cli": "6.5.1", "@stoplight/spectral-cli": "6.5.1",
"eslint": "8.22.0", "eslint": "8.23.0",
"eslint-plugin-import": "2.26.0", "eslint-plugin-import": "2.26.0",
"eslint-plugin-jquery": "1.5.1", "eslint-plugin-jquery": "1.5.1",
"eslint-plugin-sonarjs": "0.15.0", "eslint-plugin-sonarjs": "0.15.0",
"eslint-plugin-unicorn": "43.0.2", "eslint-plugin-unicorn": "43.0.2",
"eslint-plugin-vue": "9.4.0", "eslint-plugin-vue": "9.4.0",
"jest": "28.1.3", "jest": "29.0.3",
"jest-environment-jsdom": "28.1.3", "jest-environment-jsdom": "29.0.3",
"jest-extended": "3.0.2", "jest-extended": "3.1.0",
"markdownlint-cli": "0.32.2", "markdownlint-cli": "0.32.2",
"postcss-less": "6.0.0", "postcss-less": "6.0.0",
"stylelint": "14.11.0", "stylelint": "14.11.0",
"stylelint-config-standard": "28.0.0", "stylelint-config-standard": "28.0.0",
"svgo": "2.8.0", "svgo": "2.8.0",
"updates": "13.1.4" "updates": "13.1.5"
}, },
"browserslist": [ "browserslist": [
"defaults", "defaults",

View file

@ -0,0 +1 @@
<svg viewBox="0 0 16 16" class="svg octicon-accessibility-inset" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M8 0a8 8 0 1 0 0 16A8 8 0 0 0 8 0zm2 4a2 2 0 0 1-1.05 1.76c.115.069.222.15.32.24h2.98a.75.75 0 0 1 0 1.5H9.888l.608 5.67a.75.75 0 1 1-1.492.16L8.754 11H7.246l-.25 2.33a.75.75 0 1 1-1.49-.16l.607-5.67H3.75a.75.75 0 0 1 0-1.5h2.98a1.87 1.87 0 0 1 .32-.24A2 2 0 1 1 10 4z"/></svg>

After

Width:  |  Height:  |  Size: 413 B

View file

@ -0,0 +1 @@
<svg viewBox="0 0 16 16" class="svg octicon-shield-slash" width="16" height="16" aria-hidden="true"><path d="M8.533.133a1.75 1.75 0 0 0-1.066 0l-2.091.67a.75.75 0 0 0 .457 1.428l2.09-.67a.25.25 0 0 1 .153 0l5.25 1.68a.25.25 0 0 1 .174.239V7c0 .233-.008.464-.025.694a.75.75 0 1 0 1.495.112c.02-.27.03-.538.03-.806V3.48a1.75 1.75 0 0 0-1.217-1.667L8.533.133z"/><path fill-rule="evenodd" d="m1 2.857-.69-.5a.75.75 0 1 1 .88-1.214l14.5 10.5a.75.75 0 1 1-.88 1.214l-1.282-.928c-.995 1.397-2.553 2.624-4.864 3.608-.425.181-.905.18-1.329 0-2.447-1.042-4.049-2.356-5.032-3.855C1.32 10.182 1 8.566 1 7V2.857zm1.5 1.086V7c0 1.358.275 2.666 1.057 3.86.784 1.194 2.121 2.34 4.366 3.297.05.02.106.02.153 0 2.127-.905 3.439-1.982 4.237-3.108L2.5 3.943z"/></svg>

After

Width:  |  Height:  |  Size: 747 B

View file

@ -23,7 +23,7 @@ import (
// https://www.python.org/dev/peps/pep-0503/#normalized-names // https://www.python.org/dev/peps/pep-0503/#normalized-names
var normalizer = strings.NewReplacer(".", "-", "_", "-") var normalizer = strings.NewReplacer(".", "-", "_", "-")
var nameMatcher = regexp.MustCompile(`\A[a-z0-9\.\-_]+\z`) var nameMatcher = regexp.MustCompile(`\A[a-zA-Z0-9\.\-_]+\z`)
// https://www.python.org/dev/peps/pep-0440/#appendix-b-parsing-version-strings-with-regular-expressions // https://www.python.org/dev/peps/pep-0440/#appendix-b-parsing-version-strings-with-regular-expressions
var versionMatcher = regexp.MustCompile(`^([1-9][0-9]*!)?(0|[1-9][0-9]*)(\.(0|[1-9][0-9]*))*((a|b|rc)(0|[1-9][0-9]*))?(\.post(0|[1-9][0-9]*))?(\.dev(0|[1-9][0-9]*))?$`) var versionMatcher = regexp.MustCompile(`^([1-9][0-9]*!)?(0|[1-9][0-9]*)(\.(0|[1-9][0-9]*))*((a|b|rc)(0|[1-9][0-9]*))?(\.post(0|[1-9][0-9]*))?(\.dev(0|[1-9][0-9]*))?$`)

View file

@ -83,7 +83,7 @@ func Commits(ctx *context.Context) {
ctx.Data["CommitCount"] = commitsCount ctx.Data["CommitCount"] = commitsCount
ctx.Data["RefName"] = ctx.Repo.RefName ctx.Data["RefName"] = ctx.Repo.RefName
pager := context.NewPagination(int(commitsCount), setting.Git.CommitsRangeSize, page, 5) pager := context.NewPagination(int(commitsCount), pageSize, page, 5)
pager.SetDefaultParams(ctx) pager.SetDefaultParams(ctx)
ctx.Data["Page"] = pager ctx.Data["Page"] = pager

View file

@ -81,7 +81,7 @@ var IssueTemplateCandidates = []string{
".gitea/ISSUE_TEMPLATE.yml", ".gitea/ISSUE_TEMPLATE.yml",
".gitea/issue_template.md", ".gitea/issue_template.md",
".gitea/issue_template.yaml", ".gitea/issue_template.yaml",
".gitea/issue_template.md", ".gitea/issue_template.yml",
".github/ISSUE_TEMPLATE.md", ".github/ISSUE_TEMPLATE.md",
".github/ISSUE_TEMPLATE.yaml", ".github/ISSUE_TEMPLATE.yaml",
".github/ISSUE_TEMPLATE.yml", ".github/ISSUE_TEMPLATE.yml",
@ -1336,11 +1336,16 @@ func ViewIssue(ctx *context.Context) {
if issue.IsPull { if issue.IsPull {
canChooseReviewer := ctx.Repo.CanWrite(unit.TypePullRequests) canChooseReviewer := ctx.Repo.CanWrite(unit.TypePullRequests)
if !canChooseReviewer && ctx.Doer != nil && ctx.IsSigned { if ctx.Doer != nil && ctx.IsSigned {
canChooseReviewer, err = issues_model.IsOfficialReviewer(ctx, issue, ctx.Doer) if !canChooseReviewer {
if err != nil { canChooseReviewer = ctx.Doer.ID == issue.PosterID
ctx.ServerError("IsOfficialReviewer", err) }
return if !canChooseReviewer {
canChooseReviewer, err = issues_model.IsOfficialReviewer(ctx, issue, ctx.Doer)
if err != nil {
ctx.ServerError("IsOfficialReviewer", err)
return
}
} }
} }

View file

@ -136,7 +136,7 @@ func renderDirectory(ctx *context.Context, treeLink string) {
} }
// localizedExtensions prepends the provided language code with and without a // localizedExtensions prepends the provided language code with and without a
// regional identifier to the provided extenstion. // regional identifier to the provided extension.
// Note: the language code will always be lower-cased, if a region is present it must be separated with a `-` // Note: the language code will always be lower-cased, if a region is present it must be separated with a `-`
// Note: ext should be prefixed with a `.` // Note: ext should be prefixed with a `.`
func localizedExtensions(ext, languageCode string) (localizedExts []string) { func localizedExtensions(ext, languageCode string) (localizedExts []string) {
@ -374,6 +374,11 @@ func renderFile(ctx *context.Context, entry *git.TreeEntry, treeLink, rawLink st
ctx.Data["FileName"] = blob.Name() ctx.Data["FileName"] = blob.Name()
ctx.Data["RawFileLink"] = rawLink + "/" + util.PathEscapeSegments(ctx.Repo.TreePath) ctx.Data["RawFileLink"] = rawLink + "/" + util.PathEscapeSegments(ctx.Repo.TreePath)
if ctx.Repo.TreePath == ".editorconfig" {
_, editorconfigErr := ctx.Repo.GetEditorconfig()
ctx.Data["FileError"] = editorconfigErr
}
buf := make([]byte, 1024) buf := make([]byte, 1024)
n, _ := util.ReadAtMost(dataRc, buf) n, _ := util.ReadAtMost(dataRc, buf)
buf = buf[:n] buf = buf[:n]

View file

@ -131,7 +131,10 @@ func IsValidReviewRequest(ctx context.Context, reviewer, doer *user_model.User,
return nil return nil
} }
pemResult = permDoer.CanAccessAny(perm.AccessModeWrite, unit.TypePullRequests) pemResult = doer.ID == issue.PosterID
if !pemResult {
pemResult = permDoer.CanAccessAny(perm.AccessModeWrite, unit.TypePullRequests)
}
if !pemResult { if !pemResult {
pemResult, err = issues_model.IsOfficialReviewer(ctx, issue, doer) pemResult, err = issues_model.IsOfficialReviewer(ctx, issue, doer)
if err != nil { if err != nil {
@ -201,7 +204,7 @@ func IsValidTeamReviewRequest(ctx context.Context, reviewer *organization.Team,
} }
doerCanWrite := permission.CanAccessAny(perm.AccessModeWrite, unit.TypePullRequests) doerCanWrite := permission.CanAccessAny(perm.AccessModeWrite, unit.TypePullRequests)
if !doerCanWrite { if !doerCanWrite && doer.ID != issue.PosterID {
official, err := issues_model.IsOfficialReviewer(ctx, issue, doer) official, err := issues_model.IsOfficialReviewer(ctx, issue, doer)
if err != nil { if err != nil {
log.Error("Unable to Check if IsOfficialReviewer for %-v in %-v#%d", doer, issue.Repo, issue.Index) log.Error("Unable to Check if IsOfficialReviewer for %-v in %-v#%d", doer, issue.Repo, issue.Index)

View file

@ -5,7 +5,7 @@
{{end}} {{end}}
<div class="item brand" style="justify-content: space-between;"> <div class="item brand" style="justify-content: space-between;">
<a href="{{AppSubUrl}}/" aria-label="{{if .IsSigned}}{{.locale.Tr "dashboard"}}{{else}}{{.locale.Tr "home"}}{{end}}"> <a href="{{AppSubUrl}}/" aria-label="{{if .IsSigned}}{{.locale.Tr "dashboard"}}{{else}}{{.locale.Tr "home"}}{{end}}">
<img class="ui mini image" width="30" height="30" src="{{AssetUrlPrefix}}/img/logo.svg" alt="{{.locale.Tr "logo"}}" aria-hidden="true"> <img width="30" height="30" src="{{AssetUrlPrefix}}/img/logo.svg" alt="{{.locale.Tr "logo"}}" aria-hidden="true">
</a> </a>
{{if .IsSigned}} {{if .IsSigned}}
<a href="{{AppSubUrl}}/notifications" class="tooltip mobile-only" data-content='{{.locale.Tr "notifications"}}'> <a href="{{AppSubUrl}}/notifications" class="tooltip mobile-only" data-content='{{.locale.Tr "notifications"}}'>

View file

@ -1,6 +1,8 @@
<script> <script>
// synchronously set clone button states and urls here to avoid flickering // synchronously set clone button states and urls here to avoid flickering
// on page load. initRepoCloneLink calls this when proto changes. // on page load. initRepoCloneLink calls this when proto changes.
// this applies the protocol-dependant clone url to all elements with the
// `js-clone-url` and `js-clone-url-vsc` classes.
// TODO: This localStorage setting should be moved to backend user config // TODO: This localStorage setting should be moved to backend user config
// so it's available during rendering, then this inline script can be removed. // so it's available during rendering, then this inline script can be removed.
(window.updateCloneStates = function() { (window.updateCloneStates = function() {
@ -19,5 +21,8 @@
for (const el of document.getElementsByClassName('js-clone-url')) { for (const el of document.getElementsByClassName('js-clone-url')) {
el[el.nodeName === 'INPUT' ? 'value' : 'textContent'] = link; el[el.nodeName === 'INPUT' ? 'value' : 'textContent'] = link;
} }
for (const el of document.getElementsByClassName('js-clone-url-vsc')) {
el['href'] = 'vscode://vscode.git/clone?url=' + encodeURIComponent(link);
}
})(); })();
</script> </script>

View file

@ -1,4 +1,4 @@
<a class="ui link commit-statuses-trigger vm">{{template "repo/commit_status" .Status}}</a> <a class="ui link commit-statuses-trigger vm"{{if eq (len .Statuses) 1}}{{$status := index .Statuses 0}}{{if $status.TargetURL}} href="{{$status.TargetURL}}"{{end}}{{end}}>{{template "repo/commit_status" .Status}}</a>
<div class="ui commit-statuses-popup commit-statuses tippy-target"> <div class="ui commit-statuses-popup commit-statuses tippy-target">
<div class="ui relaxed list divided"> <div class="ui relaxed list divided">
{{range .Statuses}} {{range .Statuses}}

View file

@ -13,7 +13,7 @@
</h2> </h2>
{{if .Flash.WarningMsg}} {{if .Flash.WarningMsg}}
{{/* {{/*
There's alreay a importing of alert.tmpl in new_form.tmpl, There's already an importing of alert.tmpl in new_form.tmpl,
but only the negative message will be displayed within forms for some reasons, see semantic.css:10659. but only the negative message will be displayed within forms for some reasons, see semantic.css:10659.
To avoid repeated negative messages, the importing here if for .Flash.WarningMsg only. To avoid repeated negative messages, the importing here if for .Flash.WarningMsg only.
*/}} */}}

View file

@ -73,32 +73,33 @@
</a> </a>
{{end}} {{end}}
<a href="{{.Repository.Link}}/find/{{.BranchNameSubURL}}" class="ui compact basic button tooltip" data-content="{{.locale.Tr "repo.find_file.go_to_file"}}">{{svg "octicon-file-moved" 15}}</a> <a href="{{.Repository.Link}}/find/{{.BranchNameSubURL}}" class="ui compact basic button tooltip" data-content="{{.locale.Tr "repo.find_file.go_to_file"}}">{{svg "octicon-file-moved" 15}}</a>
{{if or .CanAddFile .CanUploadFile}} {{end}}
<button class="ui basic small compact dropdown jump icon button mr-2"> {{if or .CanAddFile .CanUploadFile}}
<span class="text">{{.locale.Tr "repo.editor.add_file"}}</span> <button class="ui basic small compact dropdown jump icon button mr-2">
<div class="menu"> <span class="text">{{.locale.Tr "repo.editor.add_file"}}</span>
{{if .Repository.CanEnableEditor}} <div class="menu">
{{if .CanAddFile}} {{if .Repository.CanEnableEditor}}
<a class="item" href="{{.RepoLink}}/_new/{{.BranchName | PathEscapeSegments}}/{{.TreePath | PathEscapeSegments}}"> {{if .CanAddFile}}
{{.locale.Tr "repo.editor.new_file"}} <a class="item" href="{{.RepoLink}}/_new/{{.BranchName | PathEscapeSegments}}/{{.TreePath | PathEscapeSegments}}">
</a> {{.locale.Tr "repo.editor.new_file"}}
{{end}} </a>
{{if .CanUploadFile}}
<a class="item" href="{{.RepoLink}}/_upload/{{.BranchName | PathEscapeSegments}}/{{.TreePath | PathEscapeSegments}}">
{{.locale.Tr "repo.editor.upload_file"}}
</a>
{{end}}
{{if .CanAddFile}}
<a class="item" href="{{.RepoLink}}/_diffpatch/{{.BranchName | PathEscapeSegments}}/{{.TreePath | PathEscapeSegments}}">
{{.locale.Tr "repo.editor.patch"}}
</a>
{{end}}
{{end}} {{end}}
</div> {{if .CanUploadFile}}
{{svg "octicon-triangle-down" 14 "dropdown icon"}} <a class="item" href="{{.RepoLink}}/_upload/{{.BranchName | PathEscapeSegments}}/{{.TreePath | PathEscapeSegments}}">
</button> {{.locale.Tr "repo.editor.upload_file"}}
{{end}} </a>
{{else}} {{end}}
{{if .CanAddFile}}
<a class="item" href="{{.RepoLink}}/_diffpatch/{{.BranchName | PathEscapeSegments}}/{{.TreePath | PathEscapeSegments}}">
{{.locale.Tr "repo.editor.patch"}}
</a>
{{end}}
{{end}}
</div>
{{svg "octicon-triangle-down" 14 "dropdown icon"}}
</button>
{{end}}
{{if ne $n 0}}
<span class="ui breadcrumb repo-path"><a class="section" href="{{.RepoLink}}/src/{{.BranchNameSubURL}}" title="{{.Repository.Name}}">{{EllipsisString .Repository.Name 30}}</a>{{range $i, $v := .TreeNames}}<span class="divider">/</span>{{if eq $i $l}}<span class="active section" title="{{$v}}">{{EllipsisString $v 30}}</span>{{else}}{{$p := index $.Paths $i}}<span class="section"><a href="{{$.BranchLink}}/{{PathEscapeSegments $p}}" title="{{$v}}">{{EllipsisString $v 30}}</a></span>{{end}}{{end}}</span> <span class="ui breadcrumb repo-path"><a class="section" href="{{.RepoLink}}/src/{{.BranchNameSubURL}}" title="{{.Repository.Name}}">{{EllipsisString .Repository.Name 30}}</a>{{range $i, $v := .TreeNames}}<span class="divider">/</span>{{if eq $i $l}}<span class="active section" title="{{$v}}">{{EllipsisString $v 30}}</span>{{else}}{{$p := index $.Paths $i}}<span class="section"><a href="{{$.BranchLink}}/{{PathEscapeSegments $p}}" title="{{$v}}">{{EllipsisString $v 30}}</a></span>{{end}}{{end}}</span>
{{end}} {{end}}
</div> </div>
@ -125,7 +126,7 @@
<a class="item archive-link" href="{{$.RepoLink}}/archive/{{PathEscapeSegments $.RefName}}.tar.gz" rel="nofollow">{{svg "octicon-file-zip" 16 "mr-3"}}{{.locale.Tr "repo.download_tar"}}</a> <a class="item archive-link" href="{{$.RepoLink}}/archive/{{PathEscapeSegments $.RefName}}.tar.gz" rel="nofollow">{{svg "octicon-file-zip" 16 "mr-3"}}{{.locale.Tr "repo.download_tar"}}</a>
<a class="item archive-link" href="{{$.RepoLink}}/archive/{{PathEscapeSegments $.RefName}}.bundle" rel="nofollow">{{svg "octicon-package" 16 "mr-3"}}{{.locale.Tr "repo.download_bundle"}}</a> <a class="item archive-link" href="{{$.RepoLink}}/archive/{{PathEscapeSegments $.RefName}}.bundle" rel="nofollow">{{svg "octicon-package" 16 "mr-3"}}{{.locale.Tr "repo.download_bundle"}}</a>
{{end}} {{end}}
<a class="item" href="vscode://vscode.git/clone?url={{$.RepoCloneLink.HTTPS}}">{{svg "gitea-vscode" 16 "mr-3"}}{{.locale.Tr "repo.clone_in_vsc"}}</a> <a class="item js-clone-url-vsc" href="vscode://vscode.git/clone?url={{.CloneButtonOriginLink.HTTPS}}">{{svg "gitea-vscode" 16 "mr-3"}}{{.locale.Tr "repo.clone_in_vsc"}}</a>
</div> </div>
</button> </button>
</div> </div>

View file

@ -8,7 +8,7 @@
<div class="ui divider"></div> <div class="ui divider"></div>
{{if .Flash.WarningMsg}} {{if .Flash.WarningMsg}}
{{/* {{/*
There's alreay a importing of alert.tmpl in new_form.tmpl, There's already an importing of alert.tmpl in new_form.tmpl,
but only the negative message will be displayed within forms for some reasons, see semantic.css:10659. but only the negative message will be displayed within forms for some reasons, see semantic.css:10659.
To avoid repeated negative messages, the importing here if for .Flash.WarningMsg only. To avoid repeated negative messages, the importing here if for .Flash.WarningMsg only.
*/}} */}}

View file

@ -11,9 +11,9 @@
{{if not (containGeneric $.Content .UUID)}} {{if not (containGeneric $.Content .UUID)}}
{{$hasThumbnails = true}} {{$hasThumbnails = true}}
{{end}} {{end}}
<span class="ui image">{{svg "octicon-file"}}</span> {{svg "octicon-file"}}
{{else}} {{else}}
<span class="ui image">{{svg "octicon-desktop-download"}}</span> {{svg "octicon-desktop-download"}}
{{end}} {{end}}
<span><strong>{{.Name}}</strong></span> <span><strong>{{.Name}}</strong></span>
</a> </a>
@ -26,12 +26,12 @@
{{if $hasThumbnails}} {{if $hasThumbnails}}
<div class="ui clearing divider"></div> <div class="ui clearing divider"></div>
<div class="ui small images thumbnails"> <div class="ui small thumbnails">
{{- range .Attachments -}} {{- range .Attachments -}}
{{if FilenameIsImage .Name}} {{if FilenameIsImage .Name}}
{{if not (containGeneric $.Content .UUID)}} {{if not (containGeneric $.Content .UUID)}}
<a target="_blank" rel="noopener noreferrer" href="{{.DownloadURL}}"> <a target="_blank" rel="noopener noreferrer" href="{{.DownloadURL}}">
<img class="ui image" src="{{.DownloadURL}}" title='{{$.ctx.locale.Tr "repo.issues.attachment.open_tab" .Name}}'> <img src="{{.DownloadURL}}" title='{{$.ctx.locale.Tr "repo.issues.attachment.open_tab" .Name}}'>
</a> </a>
{{end}} {{end}}
{{end}} {{end}}

View file

@ -182,11 +182,11 @@
<span class="text grey"> <span class="text grey">
{{template "shared/user/authorlink" .Poster}} {{template "shared/user/authorlink" .Poster}}
{{if and .AddedLabels (not .RemovedLabels)}} {{if and .AddedLabels (not .RemovedLabels)}}
{{$.locale.TrN (len .AddedLabels) "repo.issues.add_label" "repo.issues.add_labels" (RenderLabels .AddedLabels) $createdStr | Safe}} {{$.locale.TrN (len .AddedLabels) "repo.issues.add_label" "repo.issues.add_labels" (RenderLabels .AddedLabels $.RepoLink) $createdStr | Safe}}
{{else if and (not .AddedLabels) .RemovedLabels}} {{else if and (not .AddedLabels) .RemovedLabels}}
{{$.locale.TrN (len .RemovedLabels) "repo.issues.remove_label" "repo.issues.remove_labels" (RenderLabels .RemovedLabels) $createdStr | Safe}} {{$.locale.TrN (len .RemovedLabels) "repo.issues.remove_label" "repo.issues.remove_labels" (RenderLabels .RemovedLabels $.RepoLink) $createdStr | Safe}}
{{else}} {{else}}
{{$.locale.Tr "repo.issues.add_remove_labels" (RenderLabels .AddedLabels) (RenderLabels .RemovedLabels) $createdStr | Safe}} {{$.locale.Tr "repo.issues.add_remove_labels" (RenderLabels .AddedLabels $.RepoLink) (RenderLabels .RemovedLabels $.RepoLink) $createdStr | Safe}}
{{end}} {{end}}
</span> </span>
</div> </div>

View file

@ -168,7 +168,7 @@
</span> </span>
</span> </span>
<a target="_blank" rel="noopener noreferrer" href="{{.DownloadURL}}"> <a target="_blank" rel="noopener noreferrer" href="{{.DownloadURL}}">
<strong><span class="ui image" title='{{.Name}}'>{{svg "octicon-package" 16 "mr-2"}}</span>{{.Name}}</strong> <strong>{{svg "octicon-package" 16 "mr-2"}}{{.Name}}</strong>
</a> </a>
</li> </li>
{{end}} {{end}}

View file

@ -94,14 +94,14 @@
{{$userIDs := .AllowlistUserIDs}} {{$userIDs := .AllowlistUserIDs}}
{{range $.Users}} {{range $.Users}}
{{if contain $userIDs .ID}} {{if contain $userIDs .ID}}
<a class="ui basic image label" href="{{.HomeLink}}">{{avatar . 26}} {{.GetDisplayName}}</a> <a class="ui basic label" href="{{.HomeLink}}">{{avatar . 26}} {{.GetDisplayName}}</a>
{{end}} {{end}}
{{end}} {{end}}
{{if $.Owner.IsOrganization}} {{if $.Owner.IsOrganization}}
{{$teamIDs := .AllowlistTeamIDs}} {{$teamIDs := .AllowlistTeamIDs}}
{{range $.Teams}} {{range $.Teams}}
{{if contain $teamIDs .ID}} {{if contain $teamIDs .ID}}
<a class="ui basic image label" href="{{$.Owner.OrganisationLink}}/teams/{{PathEscape .LowerName}}">{{.Name}}</a> <a class="ui basic label" href="{{$.Owner.OrganisationLink}}/teams/{{PathEscape .LowerName}}">{{.Name}}</a>
{{end}} {{end}}
{{end}} {{end}}
{{end}} {{end}}

View file

@ -1,4 +1,11 @@
<div class="{{TabSizeClass .Editorconfig .FileName}} non-diff-file-content"> <div class="{{TabSizeClass .Editorconfig .FileName}} non-diff-file-content">
{{- if .FileError}}
<div class="ui warning message">
<div class="text left">
<div>{{.FileError}}</div>
</div>
</div>
{{end}}
<h4 class="file-header ui top attached header df ac sb"> <h4 class="file-header ui top attached header df ac sb">
<div class="file-header-left df ac pr-4"> <div class="file-header-left df ac pr-4">
{{if .ReadmeInList}} {{if .ReadmeInList}}

View file

@ -2,7 +2,7 @@
<div class="page-content ui container center full-screen-width {{if .IsRepo}}repository{{end}}"> <div class="page-content ui container center full-screen-width {{if .IsRepo}}repository{{end}}">
{{if .IsRepo}}{{template "repo/header" .}}{{end}} {{if .IsRepo}}{{template "repo/header" .}}{{end}}
<div class="ui container center"> <div class="ui container center">
<p style="margin-top: 100px"><img class="ui centered image" src="{{AssetUrlPrefix}}/img/404.png" alt="404"/></p> <p style="margin-top: 100px"><img src="{{AssetUrlPrefix}}/img/404.png" alt="404"/></p>
<div class="ui divider"></div> <div class="ui divider"></div>
<br> <br>
<p>{{.locale.Tr "error404" | Safe}} <p>{{.locale.Tr "error404" | Safe}}

View file

@ -1,6 +1,6 @@
{{template "base/head" .}} {{template "base/head" .}}
<div class="page-content ui container full-screen-width center"> <div class="page-content ui container full-screen-width center">
<p style="margin-top: 100px"><img class="ui centered image" src="{{AssetUrlPrefix}}/img/500.png" alt="500"/></p> <p style="margin-top: 100px"><img src="{{AssetUrlPrefix}}/img/500.png" alt="500"/></p>
<div class="ui divider"></div> <div class="ui divider"></div>
<br> <br>
{{if .ErrorMsg}} {{if .ErrorMsg}}

View file

@ -1,7 +1,7 @@
{{template "base/head" .}} {{template "base/head" .}}
<div class="user signin webauthn-prompt"> <div class="user signin webauthn-prompt">
<div class="ui middle centered very relaxed page grid"> <div class="ui middle centered very relaxed page grid">
<div class="column"> <div class="column center aligned">
<h3 class="ui top attached header"> <h3 class="ui top attached header">
{{.locale.Tr "twofa"}} {{.locale.Tr "twofa"}}
</h3> </h3>

View file

@ -23,7 +23,7 @@ test('Test Register Form', async ({page}, workerInfo) => {
await page.click('form button.ui.green.button:visible'); await page.click('form button.ui.green.button:visible');
// Make sure we routed to the home page. Else login failed. // Make sure we routed to the home page. Else login failed.
await expect(page.url()).toBe(`${workerInfo.project.use.baseURL}/`); await expect(page.url()).toBe(`${workerInfo.project.use.baseURL}/`);
await expect(page.locator('.dashboard-navbar span>img.ui.avatar.image')).toBeVisible(); await expect(page.locator('.dashboard-navbar span>img.ui.avatar')).toBeVisible();
await expect(page.locator('.ui.positive.message.flash-success')).toHaveText('Account was successfully created.'); await expect(page.locator('.ui.positive.message.flash-success')).toHaveText('Account was successfully created.');
save_visual(page); save_visual(page);

View file

@ -52,8 +52,8 @@ export async function save_visual(page) {
fullPage: true, fullPage: true,
timeout: 20000, timeout: 20000,
mask: [ mask: [
page.locator('.dashboard-navbar span>img.ui.avatar.image'), page.locator('.dashboard-navbar span>img.ui.avatar'),
page.locator('.ui.dropdown.jump.item.tooltip span>img.ui.avatar.image'), page.locator('.ui.dropdown.jump.item.tooltip span>img.ui.avatar'),
], ],
}); });
} }

View file

@ -107,7 +107,7 @@ func doAPICreateCommitStatus(ctx APITestContext, commitID string, status api.Com
func TestPullCreate_EmptyChangesWithDifferentCommits(t *testing.T) { func TestPullCreate_EmptyChangesWithDifferentCommits(t *testing.T) {
// Merge must continue if commits SHA are different, even if content is same // Merge must continue if commits SHA are different, even if content is same
// Reason: gitflow and merging master back into develop, where is high possiblity, there are no changes // Reason: gitflow and merging master back into develop, where is high possibility, there are no changes
// but just commit saying "Merge branch". And this meta commit can be also tagged, // but just commit saying "Merge branch". And this meta commit can be also tagged,
// so we need to have this meta commit also in develop branch. // so we need to have this meta commit also in develop branch.
onGiteaRun(t, func(t *testing.T, u *url.URL) { onGiteaRun(t, func(t *testing.T, u *url.URL) {

View file

@ -24344,348 +24344,6 @@ i.icon.youtube.play:before {
font-family: 'brand-icons'; font-family: 'brand-icons';
} }
/*******************************
Site Overrides
*******************************/
/*!
* # Fomantic-UI - Image
* http://github.com/fomantic/Fomantic-UI/
*
*
* Released under the MIT license
* http://opensource.org/licenses/MIT
*
*/
/*******************************
Image
*******************************/
.ui.image {
position: relative;
display: inline-block;
vertical-align: middle;
max-width: 100%;
background-color: transparent;
}
img.ui.image {
display: block;
}
.ui.image svg,
.ui.image img {
display: block;
max-width: 100%;
height: auto;
}
/*******************************
States
*******************************/
.ui.hidden.images,
.ui.ui.hidden.image {
display: none;
}
.ui.hidden.transition.images,
.ui.hidden.transition.image {
display: block;
visibility: hidden;
}
.ui.images > .hidden.transition {
display: inline-block;
visibility: hidden;
}
.ui.disabled.images,
.ui.disabled.image {
cursor: default;
opacity: var(--opacity-disabled);
}
/*******************************
Variations
*******************************/
/*--------------
Inline
---------------*/
.ui.inline.image,
.ui.inline.image svg,
.ui.inline.image img {
display: inline-block;
}
/*------------------
Vertical Aligned
-------------------*/
.ui.top.aligned.image,
.ui.top.aligned.image svg,
.ui.top.aligned.image img {
display: inline-block;
vertical-align: top;
}
.ui.middle.aligned.image,
.ui.middle.aligned.image svg,
.ui.middle.aligned.image img {
display: inline-block;
vertical-align: middle;
}
.ui.bottom.aligned.image,
.ui.bottom.aligned.image svg,
.ui.bottom.aligned.image img {
display: inline-block;
vertical-align: bottom;
}
.ui.top.aligned.images .image,
.ui.images .ui.top.aligned.image {
align-self: flex-start;
}
.ui.middle.aligned.images .image,
.ui.images .ui.middle.aligned.image {
align-self: center;
}
.ui.bottom.aligned.images .image,
.ui.images .ui.bottom.aligned.image {
align-self: flex-end;
}
/*--------------
Rounded
---------------*/
.ui.rounded.images .image,
.ui.rounded.image,
.ui.rounded.images .image > *,
.ui.rounded.image > * {
border-radius: 0.3125em;
}
/*--------------
Bordered
---------------*/
.ui.bordered.images .image,
.ui.bordered.images img,
.ui.bordered.images svg,
.ui.bordered.image img,
.ui.bordered.image svg,
img.ui.bordered.image {
border: 1px solid rgba(0, 0, 0, 0.1);
}
/*--------------
Circular
---------------*/
.ui.circular.images,
.ui.circular.image {
overflow: hidden;
}
.ui.circular.images .image,
.ui.circular.image,
.ui.circular.images .image > *,
.ui.circular.image > * {
border-radius: 500rem;
}
/*--------------
Fluid
---------------*/
.ui.fluid.images,
.ui.fluid.image,
.ui.fluid.images img,
.ui.fluid.images svg,
.ui.fluid.image svg,
.ui.fluid.image img {
display: block;
width: 100%;
height: auto;
}
/*--------------
Avatar
---------------*/
.ui.avatar.images .image,
.ui.avatar.images img,
.ui.avatar.images svg,
.ui.avatar.image img,
.ui.avatar.image svg,
.ui.avatar.image {
margin-right: 0.25em;
display: inline-block;
width: 2em;
height: 2em;
border-radius: 500rem;
}
/*-------------------
Spaced
--------------------*/
.ui.spaced.image {
display: inline-block !important;
margin-left: 0.5em;
margin-right: 0.5em;
}
.ui[class*="left spaced"].image {
margin-left: 0.5em;
margin-right: 0;
}
.ui[class*="right spaced"].image {
margin-left: 0;
margin-right: 0.5em;
}
/*-------------------
Floated
--------------------*/
.ui.floated.image,
.ui.floated.images {
float: left;
margin-right: 1em;
margin-bottom: 1em;
}
.ui.right.floated.images,
.ui.right.floated.image {
float: right;
margin-right: 0;
margin-bottom: 1em;
margin-left: 1em;
}
.ui.floated.images:last-child,
.ui.floated.image:last-child {
margin-bottom: 0;
}
.ui.centered.image {
display: block;
margin-left: auto;
margin-right: auto;
}
.ui.centered.images {
display: flex;
flex-direction: row;
flex-wrap: wrap;
align-items: stretch;
justify-content: center;
}
/*--------------
Sizes
---------------*/
.ui.medium.images .image,
.ui.medium.images img,
.ui.medium.images svg,
.ui.medium.image {
width: 300px;
height: auto;
font-size: 1rem;
}
.ui.mini.images .image,
.ui.mini.images img,
.ui.mini.images svg,
.ui.mini.image {
width: 35px;
height: auto;
font-size: 0.78571429rem;
}
.ui.tiny.images .image,
.ui.tiny.images img,
.ui.tiny.images svg,
.ui.tiny.image {
width: 80px;
height: auto;
font-size: 0.85714286rem;
}
.ui.small.images .image,
.ui.small.images img,
.ui.small.images svg,
.ui.small.image {
width: 150px;
height: auto;
font-size: 0.92857143rem;
}
.ui.large.images .image,
.ui.large.images img,
.ui.large.images svg,
.ui.large.image {
width: 450px;
height: auto;
font-size: 1.14285714rem;
}
.ui.big.images .image,
.ui.big.images img,
.ui.big.images svg,
.ui.big.image {
width: 600px;
height: auto;
font-size: 1.28571429rem;
}
.ui.huge.images .image,
.ui.huge.images img,
.ui.huge.images svg,
.ui.huge.image {
width: 800px;
height: auto;
font-size: 1.42857143rem;
}
.ui.massive.images .image,
.ui.massive.images img,
.ui.massive.images svg,
.ui.massive.image {
width: 960px;
height: auto;
font-size: 1.71428571rem;
}
/*******************************
Groups
*******************************/
.ui.images {
font-size: 0;
margin: 0 -0.25rem 0;
}
.ui.images .image,
.ui.images > img,
.ui.images > svg {
display: inline-block;
margin: 0 0.25rem 0.5rem;
}
/*******************************
Theme Overrides
*******************************/
/******************************* /*******************************
Site Overrides Site Overrides
*******************************/ *******************************/

View file

@ -35,7 +35,6 @@
"grid", "grid",
"header", "header",
"icon", "icon",
"image",
"input", "input",
"item", "item",
"label", "label",

View file

@ -61,7 +61,6 @@ export function initCommitStatuses() {
const top = $('.repository.file.list').length > 0 || $('.repository.diff').length > 0; const top = $('.repository.file.list').length > 0 || $('.repository.diff').length > 0;
createTippy(this, { createTippy(this, {
trigger: 'click',
content: this.nextElementSibling, content: this.nextElementSibling,
placement: top ? 'top-start' : 'bottom-start', placement: top ? 'top-start' : 'bottom-start',
interactive: true, interactive: true,

View file

@ -6,6 +6,8 @@ export function createTippy(target, opts = {}) {
placement: target.getAttribute('data-placement') || 'top-start', placement: target.getAttribute('data-placement') || 'top-start',
animation: false, animation: false,
allowHTML: false, allowHTML: false,
interactiveBorder: 30,
ignoreAttributes: true,
maxWidth: 500, // increase over default 350px maxWidth: 500, // increase over default 350px
arrow: `<svg width="16" height="7"><path d="m0 7 8-7 8 7Z" class="tippy-svg-arrow-outer"/><path d="m0 8 8-7 8 7Z" class="tippy-svg-arrow-inner"/></svg>`, arrow: `<svg width="16" height="7"><path d="m0 7 8-7 8 7Z" class="tippy-svg-arrow-outer"/><path d="m0 8 8-7 8 7Z" class="tippy-svg-arrow-inner"/></svg>`,
...(opts?.role && {theme: opts.role}), ...(opts?.role && {theme: opts.role}),

View file

@ -692,12 +692,9 @@ a.ui.card:hover,
border-color: var(--color-secondary); border-color: var(--color-secondary);
} }
.ui.avatar.images .image, .ui.avatar img,
.ui.avatar.images img, .ui.avatar svg,
.ui.avatar.images svg, .ui.avatar.img,
.ui.avatar.image img,
.ui.avatar.image svg,
.ui.avatar.image,
.ui.cards > .card img.avatar, .ui.cards > .card img.avatar,
.ui.cards > .card .avatar img, .ui.cards > .card .avatar img,
.ui.card img.avatar, .ui.card img.avatar,
@ -758,10 +755,6 @@ a.ui.card:hover,
padding-left: 0; padding-left: 0;
} }
.brand .ui.mini.image {
width: 30px;
}
.top.menu a.item:hover, .top.menu a.item:hover,
.top.menu .dropdown.item:hover, .top.menu .dropdown.item:hover,
.top.menu .dropdown.item.active { .top.menu .dropdown.item.active {
@ -1686,7 +1679,7 @@ a.ui.label:hover {
} }
} }
.ui.avatar.image { .ui.avatar {
height: 18px; height: 18px;
width: 18px; width: 18px;
display: block; display: block;

View file

@ -75,7 +75,7 @@
padding-top: 25px; padding-top: 25px;
} }
.ui.avatar.image { img.ui.avatar {
width: 40px; width: 40px;
height: 40px; height: 40px;
} }

View file

@ -846,8 +846,8 @@
display: none; display: none;
} }
.avatar.image, img.avatar,
.avatar.image img { .avatar img {
width: 20px; width: 20px;
height: 20px; height: 20px;
margin: 0 .25rem; margin: 0 .25rem;
@ -908,8 +908,8 @@
line-height: 34px; /* this must be same as .badge height, to avoid overflow */ line-height: 34px; /* this must be same as .badge height, to avoid overflow */
clear: both; // reset the "float right shabox", in the future, use flexbox instead clear: both; // reset the "float right shabox", in the future, use flexbox instead
> .avatar.image, > img.avatar,
> .avatar.image img { > .avatar img {
position: relative; position: relative;
top: -2px; top: -2px;
} }
@ -1125,7 +1125,7 @@
margin-left: 36px; margin-left: 36px;
} }
.avatar.image { img.avatar {
width: 28px; width: 28px;
height: 28px; height: 28px;
} }
@ -2497,7 +2497,7 @@
#search-user-box { #search-user-box {
.results { .results {
.result { .result {
.image { img {
float: left; float: left;
margin-right: 8px; margin-right: 8px;
width: 2em; width: 2em;
@ -2827,6 +2827,11 @@ tbody.commit-list {
vertical-align: middle; vertical-align: middle;
} }
// in the commit list, messages can wrap so we can use inline
.commit-list .message-wrapper {
display: inline;
}
@media @mediaSm { @media @mediaSm {
tr.commit-list { tr.commit-list {
width: 100%; width: 100%;
@ -3300,7 +3305,7 @@ td.blob-excerpt {
display: flex; display: flex;
margin-bottom: auto; margin-bottom: auto;
img.avatar.image { img.avatar {
height: 24px; height: 24px;
width: 24px; width: 24px;
} }

View file

@ -90,10 +90,10 @@
float: none; float: none;
margin: 0 .5rem 0 0; margin: 0 .5rem 0 0;
flex-shrink: 0; flex-shrink: 0;
}
&.image { img.avatar {
margin: 0 !important; margin: 0 !important;
}
} }
.comment-content { .comment-content {

View file

@ -134,7 +134,7 @@
padding-bottom: 1px; padding-bottom: 1px;
} }
.author .ui.avatar.image { .author img.ui.avatar {
width: auto; width: auto;
height: 18px; height: 18px;
max-width: none; max-width: none;

View file

@ -14,6 +14,8 @@ import {readFileSync} from 'fs';
const {VueLoaderPlugin} = VueLoader; const {VueLoaderPlugin} = VueLoader;
const {ESBuildMinifyPlugin} = EsBuildLoader; const {ESBuildMinifyPlugin} = EsBuildLoader;
const {SourceMapDevToolPlugin} = webpack; const {SourceMapDevToolPlugin} = webpack;
const formatLicenseText = (licenseText) => wrapAnsi(licenseText || '', 80).trim();
const glob = (pattern) => fastGlob.sync(pattern, { const glob = (pattern) => fastGlob.sync(pattern, {
cwd: dirname(fileURLToPath(new URL(import.meta.url))), cwd: dirname(fileURLToPath(new URL(import.meta.url))),
absolute: true, absolute: true,
@ -206,10 +208,12 @@ export default {
outputFilename: 'js/licenses.txt', outputFilename: 'js/licenses.txt',
outputWriter: ({dependencies}) => { outputWriter: ({dependencies}) => {
const line = '-'.repeat(80); const line = '-'.repeat(80);
const goModules = JSON.parse(readFileSync('assets/go-licenses.json', 'utf8')); const goJson = readFileSync('assets/go-licenses.json', 'utf8');
const goModules = JSON.parse(goJson).map(({name, licenseText}) => {
return {name, body: formatLicenseText(licenseText)};
});
const jsModules = dependencies.map(({name, version, licenseName, licenseText}) => { const jsModules = dependencies.map(({name, version, licenseName, licenseText}) => {
const body = wrapAnsi(licenseText || '', 80); return {name, version, licenseName, body: formatLicenseText(licenseText)};
return {name, version, licenseName, body};
}); });
const modules = [...goModules, ...jsModules].sort((a, b) => a.name.localeCompare(b.name)); const modules = [...goModules, ...jsModules].sort((a, b) => a.name.localeCompare(b.name));