Merge remote-tracking branch 'upstream/main'
This commit is contained in:
commit
42b1bac7a6
59 changed files with 2425 additions and 2138 deletions
36
.drone.yml
36
.drone.yml
|
@ -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
|
||||||
|
|
|
@ -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]
|
||||||
|
|
27
Makefile
27
Makefile
|
@ -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
82
build/generate-go-licenses.go
Normal file
82
build/generate-go-licenses.go
Normal 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)
|
||||||
|
}
|
||||||
|
}
|
|
@ -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);
|
|
|
@ -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");
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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`
|
||||||
|
|
|
@ -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 | - |
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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 != "" {
|
||||||
|
|
|
@ -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=Επιλογή Αποθετηρίου
|
||||||
|
|
|
@ -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=プッシュ
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
2844
package-lock.json
generated
File diff suppressed because it is too large
Load diff
20
package.json
20
package.json
|
@ -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",
|
||||||
|
|
1
public/img/svg/octicon-accessibility-inset.svg
Normal file
1
public/img/svg/octicon-accessibility-inset.svg
Normal 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 |
1
public/img/svg/octicon-shield-slash.svg
Normal file
1
public/img/svg/octicon-shield-slash.svg
Normal 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 |
|
@ -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]*))?$`)
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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]
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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"}}'>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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}}
|
||||||
|
|
|
@ -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.
|
||||||
*/}}
|
*/}}
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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.
|
||||||
*/}}
|
*/}}
|
||||||
|
|
|
@ -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}}
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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}}
|
||||||
|
|
|
@ -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}}
|
||||||
|
|
|
@ -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}}
|
||||||
|
|
|
@ -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}}
|
||||||
|
|
|
@ -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}}
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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'),
|
||||||
],
|
],
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
342
web_src/fomantic/build/semantic.css
generated
342
web_src/fomantic/build/semantic.css
generated
|
@ -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
|
||||||
*******************************/
|
*******************************/
|
||||||
|
|
|
@ -35,7 +35,6 @@
|
||||||
"grid",
|
"grid",
|
||||||
"header",
|
"header",
|
||||||
"icon",
|
"icon",
|
||||||
"image",
|
|
||||||
"input",
|
"input",
|
||||||
"item",
|
"item",
|
||||||
"label",
|
"label",
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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}),
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -75,7 +75,7 @@
|
||||||
padding-top: 25px;
|
padding-top: 25px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.ui.avatar.image {
|
img.ui.avatar {
|
||||||
width: 40px;
|
width: 40px;
|
||||||
height: 40px;
|
height: 40px;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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));
|
||||||
|
|
Loading…
Add table
Reference in a new issue