Compare commits
25 commits
forgejo
...
forgejo-fe
Author | SHA1 | Date | |
---|---|---|---|
|
f43e9fc4fd | ||
|
7adaafa760 | ||
|
34212791ee | ||
|
e11dcc60f2 | ||
|
c1d14c5fff | ||
|
6623630d10 | ||
|
c240b34f59 | ||
|
7426c1edb4 | ||
|
2edac36701 | ||
|
f0bc5decfb | ||
|
0803eaa2e3 | ||
|
54ece82417 | ||
|
e66b8edbc6 | ||
|
7757a5c34c | ||
|
c41ba7a148 | ||
|
be59270696 | ||
|
d7c09d9cc8 | ||
|
5d02454155 | ||
|
79bbbe2dd2 | ||
|
9247594970 | ||
|
a74d7ce6c5 | ||
|
818c7f4ca9 | ||
|
86bf362a3c | ||
|
b570eca0b9 | ||
|
83646119fb |
32
.forgejo/workflows/compliance.yml
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
name: compliance
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- 'forgejo*'
|
||||||
|
- 'v*/forgejo*'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
lint-backend:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: https://code.forgejo.org/actions/checkout@v3
|
||||||
|
- uses: https://code.forgejo.org/actions/setup-go@v4
|
||||||
|
with:
|
||||||
|
go-version: ">=1.20"
|
||||||
|
check-latest: true
|
||||||
|
- run: make deps-backend deps-tools
|
||||||
|
- run: make lint-backend
|
||||||
|
env:
|
||||||
|
TAGS: bindata sqlite sqlite_unlock_notify
|
||||||
|
checks-backend:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: https://code.forgejo.org/actions/checkout@v3
|
||||||
|
- uses: https://code.forgejo.org/actions/setup-go@v4
|
||||||
|
with:
|
||||||
|
go-version: ">=1.20"
|
||||||
|
check-latest: true
|
||||||
|
- run: make deps-backend deps-tools
|
||||||
|
- run: make --always-make checks-backend # ensure the "go-licenses" make target runs
|
42
.forgejo/workflows/testing-mysql.yml
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
name: testing MySQL
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- 'forgejo*'
|
||||||
|
- 'v*/forgejo*'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
test-mysql:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
container:
|
||||||
|
image: codeberg.org/forgejo/test_env:main
|
||||||
|
services:
|
||||||
|
mysql8:
|
||||||
|
image: mysql:8
|
||||||
|
env:
|
||||||
|
MYSQL_ALLOW_EMPTY_PASSWORD: yes
|
||||||
|
MYSQL_DATABASE: testgitea
|
||||||
|
ports:
|
||||||
|
- "3306:3306"
|
||||||
|
steps:
|
||||||
|
- uses: https://code.forgejo.org/actions/checkout@v3
|
||||||
|
- uses: https://code.forgejo.org/actions/setup-go@v4
|
||||||
|
with:
|
||||||
|
go-version: ">=1.20.0"
|
||||||
|
- run: |
|
||||||
|
git config --add safe.directory '*'
|
||||||
|
chown -R gitea:gitea . /go
|
||||||
|
- run: |
|
||||||
|
su gitea -c 'make deps-backend'
|
||||||
|
- run: |
|
||||||
|
su gitea -c 'make backend'
|
||||||
|
env:
|
||||||
|
TAGS: bindata
|
||||||
|
- run: |
|
||||||
|
su gitea -c 'make test-mysql8-migration test-mysql8'
|
||||||
|
timeout-minutes: 50
|
||||||
|
env:
|
||||||
|
TAGS: bindata
|
||||||
|
USE_REPO_TEST_DIR: 1
|
44
.forgejo/workflows/testing-psql.yml
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
name: testing PostgreSQL
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- 'forgejo*'
|
||||||
|
- 'v*/forgejo*'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
test-pgsql:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
container:
|
||||||
|
image: codeberg.org/forgejo/test_env:main
|
||||||
|
services:
|
||||||
|
pgsql:
|
||||||
|
image: postgres:15
|
||||||
|
env:
|
||||||
|
POSTGRES_DB: test
|
||||||
|
POSTGRES_PASSWORD: postgres
|
||||||
|
ports:
|
||||||
|
- "5432:5432"
|
||||||
|
steps:
|
||||||
|
- uses: https://code.forgejo.org/actions/checkout@v3
|
||||||
|
- uses: https://code.forgejo.org/actions/setup-go@v4
|
||||||
|
with:
|
||||||
|
go-version: ">=1.20.0"
|
||||||
|
- run: |
|
||||||
|
git config --add safe.directory '*'
|
||||||
|
chown -R gitea:gitea . /go
|
||||||
|
- run: |
|
||||||
|
su gitea -c 'make deps-backend'
|
||||||
|
- run: |
|
||||||
|
su gitea -c 'make backend'
|
||||||
|
env:
|
||||||
|
TAGS: bindata
|
||||||
|
- run: |
|
||||||
|
su gitea -c 'make test-pgsql-migration test-pgsql'
|
||||||
|
timeout-minutes: 50
|
||||||
|
env:
|
||||||
|
TAGS: bindata gogit
|
||||||
|
RACE_ENABLED: true
|
||||||
|
TEST_TAGS: gogit
|
||||||
|
USE_REPO_TEST_DIR: 1
|
36
.forgejo/workflows/testing-sqlite.yml
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
name: testing SQLite
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- 'forgejo*'
|
||||||
|
- 'v*/forgejo*'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
test-sqlite:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
container:
|
||||||
|
image: codeberg.org/forgejo/test_env:main
|
||||||
|
steps:
|
||||||
|
- uses: https://code.forgejo.org/actions/checkout@v3
|
||||||
|
- uses: https://code.forgejo.org/actions/setup-go@v4
|
||||||
|
with:
|
||||||
|
go-version: ">=1.20.0"
|
||||||
|
- run: |
|
||||||
|
git config --add safe.directory '*'
|
||||||
|
chown -R gitea:gitea . /go
|
||||||
|
- run: |
|
||||||
|
su gitea -c 'make deps-backend'
|
||||||
|
- run: |
|
||||||
|
su gitea -c 'make backend'
|
||||||
|
env:
|
||||||
|
TAGS: bindata gogit sqlite sqlite_unlock_notify
|
||||||
|
- run: |
|
||||||
|
su gitea -c 'make test-sqlite-migration test-sqlite'
|
||||||
|
timeout-minutes: 50
|
||||||
|
env:
|
||||||
|
TAGS: bindata gogit sqlite sqlite_unlock_notify
|
||||||
|
RACE_ENABLED: true
|
||||||
|
TEST_TAGS: gogit sqlite sqlite_unlock_notify
|
||||||
|
USE_REPO_TEST_DIR: 1
|
34
.forgejo/workflows/testing-unit.yml
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
name: testing unit
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- 'forgejo*'
|
||||||
|
- 'v*/forgejo*'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
test-unit:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
container:
|
||||||
|
image: codeberg.org/forgejo/test_env:main
|
||||||
|
steps:
|
||||||
|
- uses: https://code.forgejo.org/actions/checkout@v3
|
||||||
|
- uses: https://code.forgejo.org/actions/setup-go@v4
|
||||||
|
with:
|
||||||
|
go-version: ">=1.20.0"
|
||||||
|
- run: |
|
||||||
|
git config --add safe.directory '*'
|
||||||
|
chown -R gitea:gitea . /go
|
||||||
|
- run: |
|
||||||
|
su gitea -c 'make deps-backend'
|
||||||
|
- run: |
|
||||||
|
su gitea -c 'make backend'
|
||||||
|
env:
|
||||||
|
TAGS: bindata
|
||||||
|
- run: |
|
||||||
|
su gitea -c 'make unit-test-coverage test-check'
|
||||||
|
timeout-minutes: 50
|
||||||
|
env:
|
||||||
|
RACE_ENABLED: 'true'
|
||||||
|
TAGS: bindata
|
57
.gitea/ISSUE_TEMPLATE/bug-report.md
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
---
|
||||||
|
name: "Bug Report"
|
||||||
|
about: "Found something you weren't expecting? Report it here!"
|
||||||
|
title: "[BUG] "
|
||||||
|
---
|
||||||
|
<!--
|
||||||
|
NOTE: If your issue is a security concern, please email security@forgejo.org (GPG: A4676E79) instead of opening a public issue.
|
||||||
|
|
||||||
|
1. Please speak English, as this is the language all maintainers can
|
||||||
|
speak and write.
|
||||||
|
|
||||||
|
2. Please ask questions or troubleshoot configuration/deploy problems
|
||||||
|
in our Matrix space (https://matrix.to/#/#forgejo:matrix.org).
|
||||||
|
|
||||||
|
3. Please make sure you are using the latest release of Forgejo and
|
||||||
|
take a moment to check that your issue hasn't been reported before.
|
||||||
|
|
||||||
|
4. Please give all relevant information below for bug reports, because
|
||||||
|
incomplete details will be handled as an invalid report.
|
||||||
|
|
||||||
|
5. If you are using a proxy or a CDN (e.g. CloudFlare) in front of
|
||||||
|
Forgejo, please disable the proxy/CDN fully and connect to Forgejo
|
||||||
|
directly to confirm the issue still persists without those services.
|
||||||
|
-->
|
||||||
|
|
||||||
|
- Can you reproduce the problem on [Forgejo Next](https://next.forgejo.org/)?
|
||||||
|
- Forgejo version (or commit ref):
|
||||||
|
- Git version:
|
||||||
|
- Operating system:
|
||||||
|
- Database (use `[x]`):
|
||||||
|
- [ ] PostgreSQL
|
||||||
|
- [ ] MySQL
|
||||||
|
- [ ] MSSQL
|
||||||
|
- [ ] SQLite
|
||||||
|
- How are you running Forgejo?
|
||||||
|
<!--
|
||||||
|
Please include information on whether you built Forgejo yourself, used one of our downloads, or are using some other package.
|
||||||
|
Please also tell us how you are running Forgejo, e.g. if it is being run from docker, a command-line, systemd etc.
|
||||||
|
If you are using a package or systemd tell us what distribution you are using.
|
||||||
|
-->
|
||||||
|
|
||||||
|
## Description
|
||||||
|
<!-- Please describe the issue you are having as clearly and succinctly as possible. -->
|
||||||
|
|
||||||
|
## Reproducing
|
||||||
|
<!-- Please explain how to cause the problem to occur on demand if possible. -->
|
||||||
|
|
||||||
|
## Logs
|
||||||
|
<!--
|
||||||
|
It is really important to provide pertinent logs. We need DEBUG level logs.
|
||||||
|
Please read https://docs.gitea.io/en-us/logging-configuration/#debugging-problems
|
||||||
|
In addition, if your problem relates to git commands set `RUN_MODE=dev` at the top of `app.ini`.
|
||||||
|
Please copy and paste your logs here, with any sensitive information (e.g. API keys) removed/hidden.
|
||||||
|
-->
|
||||||
|
|
||||||
|
## Screenshots
|
||||||
|
<!-- If this issue involves the Web Interface, please provide one or more screenshots -->
|
24
.gitea/ISSUE_TEMPLATE/feature-request.md
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
---
|
||||||
|
name: "Feature Request"
|
||||||
|
about: "Got an idea for a feature that Forgejo doesn't have yet? Submit it here!"
|
||||||
|
title: "[FEAT] "
|
||||||
|
---
|
||||||
|
<!--
|
||||||
|
1. Please speak English, as this is the language all maintainers can
|
||||||
|
speak and write.
|
||||||
|
|
||||||
|
2. Please ask questions or troubleshoot configuration/deploy problems
|
||||||
|
in our Matrix space (https://matrix.to/#/#forgejo:matrix.org).
|
||||||
|
|
||||||
|
3. Please make sure you are using the latest release of Forgejo and
|
||||||
|
take a moment to check that your feature hasn't already been suggested.
|
||||||
|
-->
|
||||||
|
|
||||||
|
## Needs and benefits
|
||||||
|
<!-- Please describe the needs this feature intends to address and the benefits it brings. -->
|
||||||
|
|
||||||
|
## Feature Description
|
||||||
|
<!-- Please describe the feature you would like to see added as clearly and succinctly as possible. -->
|
||||||
|
|
||||||
|
## Screenshots
|
||||||
|
<!-- If you can, provide screenshots of an implementation on another site, e.g. GitHub. -->
|
|
@ -1,42 +0,0 @@
|
||||||
<!-- NOTE: If your issue is a security concern, please send an email to security@gitea.io instead of opening a public issue -->
|
|
||||||
|
|
||||||
<!--
|
|
||||||
1. Please speak English, this is the language all maintainers can speak and write.
|
|
||||||
2. Please ask questions or configuration/deploy problems on our Discord
|
|
||||||
server (https://discord.gg/gitea) or forum (https://discourse.gitea.io).
|
|
||||||
3. Please take a moment to check that your issue doesn't already exist.
|
|
||||||
4. Make sure it's not mentioned in the FAQ (https://docs.gitea.io/en-us/faq)
|
|
||||||
5. Please give all relevant information below for bug reports, because
|
|
||||||
incomplete details will be handled as an invalid report.
|
|
||||||
-->
|
|
||||||
|
|
||||||
- Gitea version (or commit ref):
|
|
||||||
- Git version:
|
|
||||||
- Operating system:
|
|
||||||
<!-- Please include information on whether you built gitea yourself, used one of our downloads or are using some other package -->
|
|
||||||
<!-- Please also tell us how you are running gitea, e.g. if it is being run from docker, a command-line, systemd etc. --->
|
|
||||||
<!-- If you are using a package or systemd tell us what distribution you are using -->
|
|
||||||
- Database (use `[x]`):
|
|
||||||
- [ ] PostgreSQL
|
|
||||||
- [ ] MySQL
|
|
||||||
- [ ] MSSQL
|
|
||||||
- [ ] SQLite
|
|
||||||
- Can you reproduce the bug at https://try.gitea.io:
|
|
||||||
- [ ] Yes (provide example URL)
|
|
||||||
- [ ] No
|
|
||||||
- Log gist:
|
|
||||||
<!-- It really is important to provide pertinent logs -->
|
|
||||||
<!-- Please read https://docs.gitea.io/en-us/logging-configuration/#debugging-problems -->
|
|
||||||
<!-- In addition, if your problem relates to git commands set `RUN_MODE=dev` at the top of app.ini -->
|
|
||||||
|
|
||||||
## Description
|
|
||||||
<!-- If using a proxy or a CDN (e.g. CloudFlare) in front of gitea, please
|
|
||||||
disable the proxy/CDN fully and connect to gitea directly to confirm
|
|
||||||
the issue still persists without those services. -->
|
|
||||||
|
|
||||||
...
|
|
||||||
|
|
||||||
|
|
||||||
## Screenshots
|
|
||||||
|
|
||||||
<!-- **If this issue involves the Web Interface, please include a screenshot** -->
|
|
4
.gitea/pull_request_template.md
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
<!--
|
||||||
|
Before submitting a PR, please read the contributing guidelines:
|
||||||
|
https://codeberg.org/forgejo/forgejo/src/branch/main/CONTRIBUTING.md
|
||||||
|
-->
|
2
.github/FUNDING.yml
vendored
|
@ -1,2 +0,0 @@
|
||||||
open_collective: gitea
|
|
||||||
custom: https://www.bountysource.com/teams/gitea
|
|
94
.github/ISSUE_TEMPLATE/bug-report.yaml
vendored
|
@ -1,94 +0,0 @@
|
||||||
name: Bug Report
|
|
||||||
description: Found something you weren't expecting? Report it here!
|
|
||||||
labels: kind/bug
|
|
||||||
body:
|
|
||||||
- type: markdown
|
|
||||||
attributes:
|
|
||||||
value: |
|
|
||||||
NOTE: If your issue is a security concern, please send an email to security@gitea.io instead of opening a public issue.
|
|
||||||
- type: markdown
|
|
||||||
attributes:
|
|
||||||
value: |
|
|
||||||
1. Please speak English, this is the language all maintainers can speak and write.
|
|
||||||
2. Please ask questions or configuration/deploy problems on our Discord
|
|
||||||
server (https://discord.gg/gitea) or forum (https://discourse.gitea.io).
|
|
||||||
3. Make sure you are using the latest release and
|
|
||||||
take a moment to check that your issue hasn't been reported before.
|
|
||||||
4. Make sure it's not mentioned in the FAQ (https://docs.gitea.io/en-us/faq)
|
|
||||||
5. Please give all relevant information below for bug reports, because
|
|
||||||
incomplete details will be handled as an invalid report.
|
|
||||||
6. In particular it's really important to provide pertinent logs. You must give us DEBUG level logs.
|
|
||||||
Please read https://docs.gitea.io/en-us/logging-configuration/#debugging-problems
|
|
||||||
In addition, if your problem relates to git commands set `RUN_MODE=dev` at the top of app.ini
|
|
||||||
- type: textarea
|
|
||||||
id: description
|
|
||||||
attributes:
|
|
||||||
label: Description
|
|
||||||
description: |
|
|
||||||
Please provide a description of your issue here, with a URL if you were able to reproduce the issue (see below)
|
|
||||||
If you are using a proxy or a CDN (e.g. Cloudflare) in front of Gitea, please disable the proxy/CDN fully and access Gitea directly to confirm the issue still persists without those services.
|
|
||||||
- type: input
|
|
||||||
id: gitea-ver
|
|
||||||
attributes:
|
|
||||||
label: Gitea Version
|
|
||||||
description: Gitea version (or commit reference) of your instance
|
|
||||||
validations:
|
|
||||||
required: true
|
|
||||||
- type: dropdown
|
|
||||||
id: can-reproduce
|
|
||||||
attributes:
|
|
||||||
label: Can you reproduce the bug on the Gitea demo site?
|
|
||||||
description: |
|
|
||||||
If so, please provide a URL in the Description field
|
|
||||||
URL of Gitea demo: https://try.gitea.io
|
|
||||||
options:
|
|
||||||
- "Yes"
|
|
||||||
- "No"
|
|
||||||
validations:
|
|
||||||
required: true
|
|
||||||
- type: markdown
|
|
||||||
attributes:
|
|
||||||
value: |
|
|
||||||
It's really important to provide pertinent logs
|
|
||||||
Please read https://docs.gitea.io/en-us/logging-configuration/#debugging-problems
|
|
||||||
In addition, if your problem relates to git commands set `RUN_MODE=dev` at the top of app.ini
|
|
||||||
- type: input
|
|
||||||
id: logs
|
|
||||||
attributes:
|
|
||||||
label: Log Gist
|
|
||||||
description: Please provide a gist URL of your logs, with any sensitive information (e.g. API keys) removed/hidden
|
|
||||||
- type: textarea
|
|
||||||
id: screenshots
|
|
||||||
attributes:
|
|
||||||
label: Screenshots
|
|
||||||
description: If this issue involves the Web Interface, please provide one or more screenshots
|
|
||||||
- type: input
|
|
||||||
id: git-ver
|
|
||||||
attributes:
|
|
||||||
label: Git Version
|
|
||||||
description: The version of git running on the server
|
|
||||||
- type: input
|
|
||||||
id: os-ver
|
|
||||||
attributes:
|
|
||||||
label: Operating System
|
|
||||||
description: The operating system you are using to run Gitea
|
|
||||||
- type: textarea
|
|
||||||
id: run-info
|
|
||||||
attributes:
|
|
||||||
label: How are you running Gitea?
|
|
||||||
description: |
|
|
||||||
Please include information on whether you built Gitea yourself, used one of our downloads, are using https://try.gitea.io or are using some other package
|
|
||||||
Please also tell us how you are running Gitea, e.g. if it is being run from docker, a command-line, systemd etc.
|
|
||||||
If you are using a package or systemd tell us what distribution you are using
|
|
||||||
validations:
|
|
||||||
required: true
|
|
||||||
- type: dropdown
|
|
||||||
id: database
|
|
||||||
attributes:
|
|
||||||
label: Database
|
|
||||||
description: What database system are you running?
|
|
||||||
options:
|
|
||||||
- PostgreSQL
|
|
||||||
- MySQL
|
|
||||||
- MSSQL
|
|
||||||
- SQLite
|
|
17
.github/ISSUE_TEMPLATE/config.yml
vendored
|
@ -1,17 +0,0 @@
|
||||||
blank_issues_enabled: false
|
|
||||||
contact_links:
|
|
||||||
- name: Security Concern
|
|
||||||
url: https://tinyurl.com/security-gitea
|
|
||||||
about: For security concerns, please send a mail to security@gitea.io instead of opening a public issue.
|
|
||||||
- name: Discord Server
|
|
||||||
url: https://discord.gg/Gitea
|
|
||||||
about: Please ask questions and discuss configuration or deployment problems here.
|
|
||||||
- name: Discourse Forum
|
|
||||||
url: https://discourse.gitea.io
|
|
||||||
about: Questions and configuration or deployment problems can also be discussed on our forum.
|
|
||||||
- name: Frequently Asked Questions
|
|
||||||
url: https://docs.gitea.io/en-us/faq
|
|
||||||
about: Please check if your question isn't mentioned here.
|
|
||||||
- name: Crowdin Translations
|
|
||||||
url: https://crowdin.com/project/gitea
|
|
||||||
about: Translations are managed here.
|
|
24
.github/ISSUE_TEMPLATE/feature-request.yaml
vendored
|
@ -1,24 +0,0 @@
|
||||||
name: Feature Request
|
|
||||||
description: Got an idea for a feature that Gitea doesn't have currently? Submit your idea here!
|
|
||||||
labels: ["kind/feature", "kind/proposal"]
|
|
||||||
body:
|
|
||||||
- type: markdown
|
|
||||||
attributes:
|
|
||||||
value: |
|
|
||||||
1. Please speak English, this is the language all maintainers can speak and write.
|
|
||||||
2. Please ask questions or configuration/deploy problems on our Discord
|
|
||||||
server (https://discord.gg/gitea) or forum (https://discourse.gitea.io).
|
|
||||||
3. Please take a moment to check that your feature hasn't already been suggested.
|
|
||||||
- type: textarea
|
|
||||||
id: description
|
|
||||||
attributes:
|
|
||||||
label: Feature Description
|
|
||||||
placeholder: |
|
|
||||||
I think it would be great if Gitea had...
|
|
||||||
validations:
|
|
||||||
required: true
|
|
||||||
- type: textarea
|
|
||||||
id: screenshots
|
|
||||||
attributes:
|
|
||||||
label: Screenshots
|
|
||||||
description: If you can, provide screenshots of an implementation on another site e.g. GitHub
|
|
66
.github/ISSUE_TEMPLATE/ui.bug-report.yaml
vendored
|
@ -1,66 +0,0 @@
|
||||||
name: Web Interface Bug Report
|
|
||||||
description: Something doesn't look quite as it should? Report it here!
|
|
||||||
labels: ["kind/bug", "kind/ui"]
|
|
||||||
body:
|
|
||||||
- type: markdown
|
|
||||||
attributes:
|
|
||||||
value: |
|
|
||||||
NOTE: If your issue is a security concern, please send an email to security@gitea.io instead of opening a public issue.
|
|
||||||
- type: markdown
|
|
||||||
attributes:
|
|
||||||
value: |
|
|
||||||
1. Please speak English, this is the language all maintainers can speak and write.
|
|
||||||
2. Please ask questions or configuration/deploy problems on our Discord
|
|
||||||
server (https://discord.gg/gitea) or forum (https://discourse.gitea.io).
|
|
||||||
3. Please take a moment to check that your issue doesn't already exist.
|
|
||||||
4. Make sure it's not mentioned in the FAQ (https://docs.gitea.io/en-us/faq)
|
|
||||||
5. Please give all relevant information below for bug reports, because
|
|
||||||
incomplete details will be handled as an invalid report.
|
|
||||||
6. In particular it's really important to provide pertinent logs. If you are certain that this is a javascript
|
|
||||||
error, show us the javascript console. If the error appears to relate to Gitea the server you must also give us
|
|
||||||
DEBUG level logs. (See https://docs.gitea.io/en-us/logging-configuration/#debugging-problems)
|
|
||||||
- type: textarea
|
|
||||||
id: description
|
|
||||||
attributes:
|
|
||||||
label: Description
|
|
||||||
description: |
|
|
||||||
Please provide a description of your issue here, with a URL if you were able to reproduce the issue (see below)
|
|
||||||
If using a proxy or a CDN (e.g. CloudFlare) in front of gitea, please disable the proxy/CDN fully and connect to gitea directly to confirm the issue still persists without those services.
|
|
||||||
- type: textarea
|
|
||||||
id: screenshots
|
|
||||||
attributes:
|
|
||||||
label: Screenshots
|
|
||||||
description: Please provide at least 1 screenshot showing the issue.
|
|
||||||
validations:
|
|
||||||
required: true
|
|
||||||
- type: input
|
|
||||||
id: gitea-ver
|
|
||||||
attributes:
|
|
||||||
label: Gitea Version
|
|
||||||
description: Gitea version (or commit reference) your instance is running
|
|
||||||
validations:
|
|
||||||
required: true
|
|
||||||
- type: dropdown
|
|
||||||
id: can-reproduce
|
|
||||||
attributes:
|
|
||||||
label: Can you reproduce the bug on the Gitea demo site?
|
|
||||||
description: |
|
|
||||||
If so, please provide a URL in the Description field
|
|
||||||
URL of Gitea demo: https://try.gitea.io
|
|
||||||
options:
|
|
||||||
- "Yes"
|
|
||||||
- "No"
|
|
||||||
validations:
|
|
||||||
required: true
|
|
||||||
- type: input
|
|
||||||
id: os-ver
|
|
||||||
attributes:
|
|
||||||
label: Operating System
|
|
||||||
description: The operating system you are using to access Gitea
|
|
||||||
- type: input
|
|
||||||
id: browser-ver
|
|
||||||
attributes:
|
|
||||||
label: Browser Version
|
|
||||||
description: The browser and version that you are using to access Gitea
|
|
||||||
validations:
|
|
||||||
required: true
|
|
9
.github/pull_request_template.md
vendored
|
@ -1,9 +0,0 @@
|
||||||
<!-- start tips -->
|
|
||||||
Please check the following:
|
|
||||||
1. Make sure you are targeting the `main` branch, pull requests on release branches are only allowed for backports.
|
|
||||||
2. Make sure you have read contributing guidelines: https://github.com/go-gitea/gitea/blob/main/CONTRIBUTING.md .
|
|
||||||
3. Describe what your pull request does and which issue you're targeting (if any).
|
|
||||||
4. It is recommended to enable "Allow edits by maintainers", so maintainers can help more easily.
|
|
||||||
5. Your input here will be included in the commit message when this PR has been merged. If you don't want some content to be included, please separate them with a line like `---`.
|
|
||||||
6. Delete all these tips before posting.
|
|
||||||
<!-- end tips -->
|
|
54
.github/stale.yml
vendored
|
@ -1,54 +0,0 @@
|
||||||
# Configuration for probot-stale - https://github.com/probot/stale
|
|
||||||
|
|
||||||
# Number of days of inactivity before an Issue or Pull Request becomes stale
|
|
||||||
daysUntilStale: 60
|
|
||||||
|
|
||||||
# Number of days of inactivity before an Issue or Pull Request with the stale label is closed.
|
|
||||||
# Set to false to disable. If disabled, issues still need to be closed manually, but will remain marked as stale.
|
|
||||||
daysUntilClose: 14
|
|
||||||
|
|
||||||
# Issues or Pull Requests with these labels will never be considered stale. Set to `[]` to disable
|
|
||||||
exemptLabels:
|
|
||||||
- status/blocked
|
|
||||||
- kind/security
|
|
||||||
- lgtm/done
|
|
||||||
- reviewed/confirmed
|
|
||||||
- priority/critical
|
|
||||||
- kind/proposal
|
|
||||||
|
|
||||||
# Set to true to ignore issues in a project (defaults to false)
|
|
||||||
exemptProjects: false
|
|
||||||
|
|
||||||
# Set to true to ignore issues in a milestone (defaults to false)
|
|
||||||
exemptMilestones: false
|
|
||||||
|
|
||||||
# Label to use when marking as stale
|
|
||||||
staleLabel: stale
|
|
||||||
|
|
||||||
# Comment to post when marking as stale. Set to `false` to disable
|
|
||||||
markComment: >
|
|
||||||
This issue has been automatically marked as stale because it has not had recent activity.
|
|
||||||
I am here to help clear issues left open even if solved or waiting for more insight.
|
|
||||||
This issue will be closed if no further activity occurs during the next 2 weeks.
|
|
||||||
If the issue is still valid just add a comment to keep it alive.
|
|
||||||
Thank you for your contributions.
|
|
||||||
|
|
||||||
# Comment to post when closing a stale Issue or Pull Request.
|
|
||||||
closeComment: >
|
|
||||||
This issue has been automatically closed because of inactivity.
|
|
||||||
You can re-open it if needed.
|
|
||||||
|
|
||||||
# Limit the number of actions per hour, from 1-30. Default is 30
|
|
||||||
limitPerRun: 1
|
|
||||||
|
|
||||||
# Optionally, specify configuration settings that are specific to just 'issues' or 'pulls':
|
|
||||||
pulls:
|
|
||||||
daysUntilStale: 60
|
|
||||||
daysUntilClose: 60
|
|
||||||
markComment: >
|
|
||||||
This pull request has been automatically marked as stale because it has not had
|
|
||||||
recent activity. It will be closed if no further activity occurs during the next 2 months. Thank you
|
|
||||||
for your contributions.
|
|
||||||
closeComment: >
|
|
||||||
This pull request has been automatically closed because of inactivity.
|
|
||||||
You can re-open it if needed.
|
|
27
.github/workflows/cron-licenses.yml
vendored
|
@ -1,27 +0,0 @@
|
||||||
name: cron-licenses
|
|
||||||
|
|
||||||
on:
|
|
||||||
schedule:
|
|
||||||
- cron: "7 0 * * 1" # every Monday at 00:07 UTC
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
cron-licenses:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
if: github.repository == 'go-gitea/gitea'
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
- uses: actions/setup-go@v3
|
|
||||||
with:
|
|
||||||
go-version: ">=1.20.1"
|
|
||||||
- run: make generate-license generate-gitignore
|
|
||||||
timeout-minutes: 40
|
|
||||||
- name: push translations to repo
|
|
||||||
uses: appleboy/git-push-action@v0.0.2
|
|
||||||
with:
|
|
||||||
author_email: "teabot@gitea.io"
|
|
||||||
author_name: GiteaBot
|
|
||||||
branch: main
|
|
||||||
commit: true
|
|
||||||
commit_message: "[skip ci] Updated licenses and gitignores"
|
|
||||||
remote: "git@github.com:go-gitea/gitea.git"
|
|
||||||
ssh_key: ${{ secrets.DEPLOY_KEY }}
|
|
22
.github/workflows/cron-lock.yml
vendored
|
@ -1,22 +0,0 @@
|
||||||
name: cron-lock
|
|
||||||
|
|
||||||
on:
|
|
||||||
schedule:
|
|
||||||
- cron: "0 0 * * *" # every day at 00:00 UTC
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
issues: write
|
|
||||||
pull-requests: write
|
|
||||||
|
|
||||||
concurrency:
|
|
||||||
group: lock
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
action:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
if: github.repository == 'go-gitea/gitea'
|
|
||||||
steps:
|
|
||||||
- uses: dessant/lock-threads@v4
|
|
||||||
with:
|
|
||||||
issue-inactive-days: 45
|
|
48
.github/workflows/cron-translations.yml
vendored
|
@ -1,48 +0,0 @@
|
||||||
name: cron-translations
|
|
||||||
|
|
||||||
on:
|
|
||||||
schedule:
|
|
||||||
- cron: "7 0 * * *" # every day at 00:07 UTC
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
crowdin-pull:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
if: github.repository == 'go-gitea/gitea'
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
- name: download from crowdin
|
|
||||||
uses: docker://jonasfranz/crowdin
|
|
||||||
env:
|
|
||||||
CROWDIN_KEY: ${{ secrets.CROWDIN_KEY }}
|
|
||||||
PLUGIN_DOWNLOAD: true
|
|
||||||
PLUGIN_EXPORT_DIR: options/locale/
|
|
||||||
PLUGIN_IGNORE_BRANCH: true
|
|
||||||
PLUGIN_PROJECT_IDENTIFIER: gitea
|
|
||||||
- name: update locales
|
|
||||||
run: ./build/update-locales.sh
|
|
||||||
- name: push translations to repo
|
|
||||||
uses: appleboy/git-push-action@v0.0.2
|
|
||||||
with:
|
|
||||||
author_email: "teabot@gitea.io"
|
|
||||||
author_name: GiteaBot
|
|
||||||
branch: main
|
|
||||||
commit: true
|
|
||||||
commit_message: "[skip ci] Updated translations via Crowdin"
|
|
||||||
remote: "git@github.com:go-gitea/gitea.git"
|
|
||||||
ssh_key: ${{ secrets.DEPLOY_KEY }}
|
|
||||||
crowdin-push:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
if: github.repository == 'go-gitea/gitea'
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
- name: push translations to crowdin
|
|
||||||
uses: docker://jonasfranz/crowdin
|
|
||||||
env:
|
|
||||||
CROWDIN_KEY: ${{ secrets.CROWDIN_KEY }}
|
|
||||||
PLUGIN_UPLOAD: true
|
|
||||||
PLUGIN_EXPORT_DIR: options/locale/
|
|
||||||
PLUGIN_IGNORE_BRANCH: true
|
|
||||||
PLUGIN_PROJECT_IDENTIFIER: gitea
|
|
||||||
PLUGIN_FILES: |
|
|
||||||
locale_en-US.ini: options/locale/locale_en-US.ini
|
|
||||||
PLUGIN_BRANCH: main
|
|
142
.github/workflows/pull-compliance.yml
vendored
|
@ -1,142 +0,0 @@
|
||||||
name: compliance
|
|
||||||
|
|
||||||
on:
|
|
||||||
pull_request:
|
|
||||||
|
|
||||||
concurrency:
|
|
||||||
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
|
|
||||||
cancel-in-progress: true
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
files-changed:
|
|
||||||
uses: ./.github/workflows/files-changed.yml
|
|
||||||
|
|
||||||
lint-backend:
|
|
||||||
if: needs.files-changed.outputs.backend == 'true'
|
|
||||||
needs: files-changed
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
- uses: actions/setup-go@v4
|
|
||||||
with:
|
|
||||||
go-version: ">=1.20"
|
|
||||||
check-latest: true
|
|
||||||
- run: make deps-backend deps-tools
|
|
||||||
- run: make lint-backend
|
|
||||||
env:
|
|
||||||
TAGS: bindata sqlite sqlite_unlock_notify
|
|
||||||
|
|
||||||
lint-go-windows:
|
|
||||||
if: needs.files-changed.outputs.backend == 'true'
|
|
||||||
needs: files-changed
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
- uses: actions/setup-go@v4
|
|
||||||
with:
|
|
||||||
go-version: ">=1.20"
|
|
||||||
check-latest: true
|
|
||||||
- run: make deps-backend deps-tools
|
|
||||||
- run: make lint-go-windows lint-go-vet
|
|
||||||
env:
|
|
||||||
TAGS: bindata sqlite sqlite_unlock_notify
|
|
||||||
GOOS: windows
|
|
||||||
GOARCH: amd64
|
|
||||||
|
|
||||||
lint-go-gogit:
|
|
||||||
if: needs.files-changed.outputs.backend == 'true'
|
|
||||||
needs: files-changed
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
- uses: actions/setup-go@v4
|
|
||||||
with:
|
|
||||||
go-version: ">=1.20"
|
|
||||||
check-latest: true
|
|
||||||
- run: make deps-backend deps-tools
|
|
||||||
- run: make lint-go
|
|
||||||
env:
|
|
||||||
TAGS: bindata gogit sqlite sqlite_unlock_notify
|
|
||||||
|
|
||||||
checks-backend:
|
|
||||||
if: needs.files-changed.outputs.backend == 'true'
|
|
||||||
needs: files-changed
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
- uses: actions/setup-go@v4
|
|
||||||
with:
|
|
||||||
go-version: ">=1.20"
|
|
||||||
check-latest: true
|
|
||||||
- run: make deps-backend deps-tools
|
|
||||||
- run: make --always-make checks-backend # ensure the "go-licenses" make target runs
|
|
||||||
|
|
||||||
frontend:
|
|
||||||
if: needs.files-changed.outputs.frontend == 'true'
|
|
||||||
needs: files-changed
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
- uses: actions/setup-node@v3
|
|
||||||
with:
|
|
||||||
node-version: 20
|
|
||||||
- run: make deps-frontend
|
|
||||||
- run: make lint-frontend
|
|
||||||
- run: make checks-frontend
|
|
||||||
|
|
||||||
backend:
|
|
||||||
if: needs.files-changed.outputs.backend == 'true'
|
|
||||||
needs: files-changed
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
- uses: actions/setup-go@v4
|
|
||||||
with:
|
|
||||||
go-version: ">=1.20"
|
|
||||||
check-latest: true
|
|
||||||
- uses: actions/setup-node@v3
|
|
||||||
with:
|
|
||||||
node-version: 20
|
|
||||||
- run: make deps-backend deps-tools
|
|
||||||
- run: make deps-frontend
|
|
||||||
- run: make frontend
|
|
||||||
- run: go build -o gitea_no_gcc # test if build succeeds without the sqlite tag
|
|
||||||
- name: build-backend-arm64
|
|
||||||
run: make backend # test cross compile
|
|
||||||
env:
|
|
||||||
GOOS: linux
|
|
||||||
GOARCH: arm64
|
|
||||||
TAGS: bindata gogit
|
|
||||||
- name: build-backend-windows
|
|
||||||
run: go build -o gitea_windows
|
|
||||||
env:
|
|
||||||
GOOS: windows
|
|
||||||
GOARCH: amd64
|
|
||||||
TAGS: bindata gogit
|
|
||||||
- name: build-backend-386
|
|
||||||
run: go build -o gitea_linux_386 # test if compatible with 32 bit
|
|
||||||
env:
|
|
||||||
GOOS: linux
|
|
||||||
GOARCH: 386
|
|
||||||
|
|
||||||
docs:
|
|
||||||
if: needs.files-changed.outputs.docs == 'true'
|
|
||||||
needs: files-changed
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
- uses: actions/setup-node@v3
|
|
||||||
with:
|
|
||||||
node-version: 20
|
|
||||||
- run: make deps-frontend
|
|
||||||
- run: make lint-md
|
|
||||||
- run: make docs # test if build could succeed
|
|
||||||
|
|
||||||
actions:
|
|
||||||
if: needs.files-changed.outputs.actions == 'true'
|
|
||||||
needs: files-changed
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
- uses: actions/setup-go@v4
|
|
||||||
- run: make lint-actions
|
|
247
.github/workflows/pull-db-tests.yml
vendored
|
@ -1,247 +0,0 @@
|
||||||
name: db-tests
|
|
||||||
|
|
||||||
on:
|
|
||||||
pull_request:
|
|
||||||
|
|
||||||
concurrency:
|
|
||||||
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
|
|
||||||
cancel-in-progress: true
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
files-changed:
|
|
||||||
uses: ./.github/workflows/files-changed.yml
|
|
||||||
|
|
||||||
test-pgsql:
|
|
||||||
if: needs.files-changed.outputs.backend == 'true' || needs.files-changed.outputs.frontend == 'true'
|
|
||||||
needs: files-changed
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
services:
|
|
||||||
pgsql:
|
|
||||||
image: postgres:15
|
|
||||||
env:
|
|
||||||
POSTGRES_DB: test
|
|
||||||
POSTGRES_PASSWORD: postgres
|
|
||||||
ports:
|
|
||||||
- "5432:5432"
|
|
||||||
ldap:
|
|
||||||
image: gitea/test-openldap:latest
|
|
||||||
ports:
|
|
||||||
- "389:389"
|
|
||||||
- "636:636"
|
|
||||||
minio:
|
|
||||||
# as github actions doesn't support "entrypoint", we need to use a non-official image
|
|
||||||
# that has a custom entrypoint set to "minio server /data"
|
|
||||||
image: bitnami/minio:2021.3.17
|
|
||||||
env:
|
|
||||||
MINIO_ACCESS_KEY: 123456
|
|
||||||
MINIO_SECRET_KEY: 12345678
|
|
||||||
ports:
|
|
||||||
- "9000:9000"
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
- uses: actions/setup-go@v4
|
|
||||||
with:
|
|
||||||
go-version: ">=1.20.0"
|
|
||||||
- name: Add hosts to /etc/hosts
|
|
||||||
run: '[ -e "/.dockerenv" ] || [ -e "/run/.containerenv" ] || echo "127.0.0.1 pgsql ldap minio" | sudo tee -a /etc/hosts'
|
|
||||||
- run: make deps-backend
|
|
||||||
- run: make backend
|
|
||||||
env:
|
|
||||||
TAGS: bindata
|
|
||||||
- run: make test-pgsql-migration test-pgsql
|
|
||||||
timeout-minutes: 50
|
|
||||||
env:
|
|
||||||
TAGS: bindata gogit
|
|
||||||
RACE_ENABLED: true
|
|
||||||
TEST_TAGS: gogit
|
|
||||||
TEST_LDAP: 1
|
|
||||||
USE_REPO_TEST_DIR: 1
|
|
||||||
|
|
||||||
test-sqlite:
|
|
||||||
if: needs.files-changed.outputs.backend == 'true' || needs.files-changed.outputs.frontend == 'true'
|
|
||||||
needs: files-changed
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
- uses: actions/setup-go@v4
|
|
||||||
with:
|
|
||||||
go-version: ">=1.20.0"
|
|
||||||
- run: make deps-backend
|
|
||||||
- run: make backend
|
|
||||||
env:
|
|
||||||
TAGS: bindata gogit sqlite sqlite_unlock_notify
|
|
||||||
- run: make test-sqlite-migration test-sqlite
|
|
||||||
timeout-minutes: 50
|
|
||||||
env:
|
|
||||||
TAGS: bindata gogit sqlite sqlite_unlock_notify
|
|
||||||
RACE_ENABLED: true
|
|
||||||
TEST_TAGS: gogit sqlite sqlite_unlock_notify
|
|
||||||
USE_REPO_TEST_DIR: 1
|
|
||||||
|
|
||||||
test-unit:
|
|
||||||
if: needs.files-changed.outputs.backend == 'true'
|
|
||||||
needs: files-changed
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
services:
|
|
||||||
mysql:
|
|
||||||
image: mysql:5.7
|
|
||||||
env:
|
|
||||||
MYSQL_ALLOW_EMPTY_PASSWORD: yes
|
|
||||||
MYSQL_DATABASE: test
|
|
||||||
ports:
|
|
||||||
- "3306:3306"
|
|
||||||
elasticsearch:
|
|
||||||
image: elasticsearch:7.5.0
|
|
||||||
env:
|
|
||||||
discovery.type: single-node
|
|
||||||
ports:
|
|
||||||
- "9200:9200"
|
|
||||||
smtpimap:
|
|
||||||
image: tabascoterrier/docker-imap-devel:latest
|
|
||||||
ports:
|
|
||||||
- "25:25"
|
|
||||||
- "143:143"
|
|
||||||
- "587:587"
|
|
||||||
- "993:993"
|
|
||||||
redis:
|
|
||||||
image: redis
|
|
||||||
options: >- # wait until redis has started
|
|
||||||
--health-cmd "redis-cli ping"
|
|
||||||
--health-interval 5s
|
|
||||||
--health-timeout 3s
|
|
||||||
--health-retries 10
|
|
||||||
ports:
|
|
||||||
- 6379:6379
|
|
||||||
minio:
|
|
||||||
image: bitnami/minio:2021.3.17
|
|
||||||
env:
|
|
||||||
MINIO_ACCESS_KEY: 123456
|
|
||||||
MINIO_SECRET_KEY: 12345678
|
|
||||||
ports:
|
|
||||||
- "9000:9000"
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
- uses: actions/setup-go@v4
|
|
||||||
with:
|
|
||||||
go-version: ">=1.20.0"
|
|
||||||
- name: Add hosts to /etc/hosts
|
|
||||||
run: '[ -e "/.dockerenv" ] || [ -e "/run/.containerenv" ] || echo "127.0.0.1 mysql elasticsearch smtpimap" | sudo tee -a /etc/hosts'
|
|
||||||
- run: make deps-backend
|
|
||||||
- run: make backend
|
|
||||||
env:
|
|
||||||
TAGS: bindata
|
|
||||||
- name: unit-tests
|
|
||||||
run: make unit-test-coverage test-check
|
|
||||||
env:
|
|
||||||
TAGS: bindata
|
|
||||||
RACE_ENABLED: true
|
|
||||||
GITHUB_READ_TOKEN: ${{ secrets.GITHUB_READ_TOKEN }}
|
|
||||||
- name: unit-tests-gogit
|
|
||||||
run: make unit-test-coverage test-check
|
|
||||||
env:
|
|
||||||
TAGS: bindata gogit
|
|
||||||
RACE_ENABLED: true
|
|
||||||
GITHUB_READ_TOKEN: ${{ secrets.GITHUB_READ_TOKEN }}
|
|
||||||
|
|
||||||
test-mysql5:
|
|
||||||
if: needs.files-changed.outputs.backend == 'true' || needs.files-changed.outputs.frontend == 'true'
|
|
||||||
needs: files-changed
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
services:
|
|
||||||
mysql:
|
|
||||||
image: mysql:5.7
|
|
||||||
env:
|
|
||||||
MYSQL_ALLOW_EMPTY_PASSWORD: yes
|
|
||||||
MYSQL_DATABASE: test
|
|
||||||
ports:
|
|
||||||
- "3306:3306"
|
|
||||||
elasticsearch:
|
|
||||||
image: elasticsearch:7.5.0
|
|
||||||
env:
|
|
||||||
discovery.type: single-node
|
|
||||||
ports:
|
|
||||||
- "9200:9200"
|
|
||||||
smtpimap:
|
|
||||||
image: tabascoterrier/docker-imap-devel:latest
|
|
||||||
ports:
|
|
||||||
- "25:25"
|
|
||||||
- "143:143"
|
|
||||||
- "587:587"
|
|
||||||
- "993:993"
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
- uses: actions/setup-go@v4
|
|
||||||
with:
|
|
||||||
go-version: ">=1.20.0"
|
|
||||||
- name: Add hosts to /etc/hosts
|
|
||||||
run: '[ -e "/.dockerenv" ] || [ -e "/run/.containerenv" ] || echo "127.0.0.1 mysql elasticsearch smtpimap" | sudo tee -a /etc/hosts'
|
|
||||||
- run: make deps-backend
|
|
||||||
- run: make backend
|
|
||||||
env:
|
|
||||||
TAGS: bindata
|
|
||||||
- name: run tests
|
|
||||||
run: make test-mysql-migration integration-test-coverage
|
|
||||||
env:
|
|
||||||
TAGS: bindata
|
|
||||||
RACE_ENABLED: true
|
|
||||||
USE_REPO_TEST_DIR: 1
|
|
||||||
TEST_INDEXER_CODE_ES_URL: "http://elastic:changeme@elasticsearch:9200"
|
|
||||||
|
|
||||||
test-mysql8:
|
|
||||||
if: needs.files-changed.outputs.backend == 'true' || needs.files-changed.outputs.frontend == 'true'
|
|
||||||
needs: files-changed
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
services:
|
|
||||||
mysql8:
|
|
||||||
image: mysql:8
|
|
||||||
env:
|
|
||||||
MYSQL_ALLOW_EMPTY_PASSWORD: yes
|
|
||||||
MYSQL_DATABASE: testgitea
|
|
||||||
ports:
|
|
||||||
- "3306:3306"
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
- uses: actions/setup-go@v4
|
|
||||||
with:
|
|
||||||
go-version: ">=1.20.0"
|
|
||||||
- name: Add hosts to /etc/hosts
|
|
||||||
run: '[ -e "/.dockerenv" ] || [ -e "/run/.containerenv" ] || echo "127.0.0.1 mysql8" | sudo tee -a /etc/hosts'
|
|
||||||
- run: make deps-backend
|
|
||||||
- run: make backend
|
|
||||||
env:
|
|
||||||
TAGS: bindata
|
|
||||||
- run: make test-mysql8-migration test-mysql8
|
|
||||||
timeout-minutes: 50
|
|
||||||
env:
|
|
||||||
TAGS: bindata
|
|
||||||
USE_REPO_TEST_DIR: 1
|
|
||||||
|
|
||||||
test-mssql:
|
|
||||||
if: needs.files-changed.outputs.backend == 'true' || needs.files-changed.outputs.frontend == 'true'
|
|
||||||
needs: files-changed
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
services:
|
|
||||||
mssql:
|
|
||||||
image: mcr.microsoft.com/mssql/server:latest
|
|
||||||
env:
|
|
||||||
ACCEPT_EULA: Y
|
|
||||||
MSSQL_PID: Standard
|
|
||||||
SA_PASSWORD: MwantsaSecurePassword1
|
|
||||||
ports:
|
|
||||||
- "1433:1433"
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
- uses: actions/setup-go@v4
|
|
||||||
with:
|
|
||||||
go-version: ">=1.20.0"
|
|
||||||
- name: Add hosts to /etc/hosts
|
|
||||||
run: '[ -e "/.dockerenv" ] || [ -e "/run/.containerenv" ] || echo "127.0.0.1 mssql" | sudo tee -a /etc/hosts'
|
|
||||||
- run: make deps-backend
|
|
||||||
- run: make backend
|
|
||||||
env:
|
|
||||||
TAGS: bindata
|
|
||||||
- run: make test-mssql-migration test-mssql
|
|
||||||
timeout-minutes: 50
|
|
||||||
env:
|
|
||||||
TAGS: bindata
|
|
||||||
USE_REPO_TEST_DIR: 1
|
|
23
.github/workflows/pull-docker-dryrun.yml
vendored
|
@ -1,23 +0,0 @@
|
||||||
name: docker-dryrun
|
|
||||||
|
|
||||||
on:
|
|
||||||
pull_request:
|
|
||||||
|
|
||||||
concurrency:
|
|
||||||
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
|
|
||||||
cancel-in-progress: true
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
files-changed:
|
|
||||||
uses: ./.github/workflows/files-changed.yml
|
|
||||||
|
|
||||||
docker-dryrun:
|
|
||||||
if: needs.files-changed.outputs.backend == 'true' || needs.files-changed.outputs.frontend == 'true'
|
|
||||||
needs: files-changed
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: docker/setup-buildx-action@v2
|
|
||||||
- uses: docker/build-push-action@v4
|
|
||||||
with:
|
|
||||||
push: false
|
|
||||||
tags: gitea/gitea:linux-amd64
|
|
32
.github/workflows/pull-e2e-tests.yml
vendored
|
@ -1,32 +0,0 @@
|
||||||
name: e2e-tests
|
|
||||||
|
|
||||||
on:
|
|
||||||
pull_request:
|
|
||||||
|
|
||||||
concurrency:
|
|
||||||
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
|
|
||||||
cancel-in-progress: true
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
files-changed:
|
|
||||||
uses: ./.github/workflows/files-changed.yml
|
|
||||||
|
|
||||||
test-e2e:
|
|
||||||
if: needs.files-changed.outputs.backend == 'true' || needs.files-changed.outputs.frontend == 'true'
|
|
||||||
needs: files-changed
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
- uses: actions/setup-go@v4
|
|
||||||
with:
|
|
||||||
go-version: ">=1.20"
|
|
||||||
check-latest: true
|
|
||||||
- uses: actions/setup-node@v3
|
|
||||||
with:
|
|
||||||
node-version: 20
|
|
||||||
- run: make deps-frontend frontend deps-backend
|
|
||||||
- run: npx playwright install --with-deps
|
|
||||||
- run: make test-e2e-sqlite
|
|
||||||
timeout-minutes: 40
|
|
||||||
env:
|
|
||||||
USE_REPO_TEST_DIR: 1
|
|
3
.gitignore
vendored
|
@ -1,3 +1,6 @@
|
||||||
|
# Emacs
|
||||||
|
*~
|
||||||
|
|
||||||
# Compiled Object files, Static and Dynamic libs (Shared Objects)
|
# Compiled Object files, Static and Dynamic libs (Shared Objects)
|
||||||
*.o
|
*.o
|
||||||
*.a
|
*.a
|
||||||
|
|
75
.woodpecker/compliance.yml
Normal file
|
@ -0,0 +1,75 @@
|
||||||
|
platform: linux/amd64
|
||||||
|
|
||||||
|
when:
|
||||||
|
event: [ push, pull_request, manual ]
|
||||||
|
branch:
|
||||||
|
exclude: [ soft-fork/*/*, soft-fork/*/*/* ]
|
||||||
|
|
||||||
|
variables:
|
||||||
|
- &golang_image 'golang:1.20'
|
||||||
|
- &test_image 'codeberg.org/forgejo/test_env:main'
|
||||||
|
- &goproxy_override ''
|
||||||
|
- &goproxy_setup |-
|
||||||
|
if [ -n "$${GOPROXY_OVERRIDE:-}" ]; then
|
||||||
|
export GOPROXY="$${GOPROXY_OVERRIDE}";
|
||||||
|
echo "Using goproxy from goproxy_override \"$${GOPROXY}\"";
|
||||||
|
elif [ -n "$${GOPROXY_DEFAULT:-}" ]; then
|
||||||
|
export GOPROXY="$${GOPROXY_DEFAULT}";
|
||||||
|
echo "Using goproxy from goproxy_default (secret) not displaying";
|
||||||
|
else
|
||||||
|
export GOPROXY="https://proxy.golang.org,direct";
|
||||||
|
echo "No goproxy overrides or defaults given, using \"$${GOPROXY}\"";
|
||||||
|
fi
|
||||||
|
|
||||||
|
workspace:
|
||||||
|
base: /go
|
||||||
|
path: src/codeberg/gitea
|
||||||
|
|
||||||
|
pipeline:
|
||||||
|
deps-backend:
|
||||||
|
image: *golang_image
|
||||||
|
pull: true
|
||||||
|
environment:
|
||||||
|
GOPROXY_OVERRIDE: *goproxy_override
|
||||||
|
secrets:
|
||||||
|
- goproxy_default
|
||||||
|
commands:
|
||||||
|
- *goproxy_setup
|
||||||
|
- make deps-backend
|
||||||
|
|
||||||
|
security-check:
|
||||||
|
image: *golang_image
|
||||||
|
group: checks
|
||||||
|
pull: true
|
||||||
|
environment:
|
||||||
|
GOPROXY_OVERRIDE: *goproxy_override
|
||||||
|
secrets:
|
||||||
|
- goproxy_default
|
||||||
|
commands:
|
||||||
|
- *goproxy_setup
|
||||||
|
- make security-check
|
||||||
|
|
||||||
|
lint-backend:
|
||||||
|
image: *test_image
|
||||||
|
pull: true
|
||||||
|
group: checks
|
||||||
|
environment:
|
||||||
|
GOPROXY_OVERRIDE: *goproxy_override
|
||||||
|
TAGS: 'bindata sqlite sqlite_unlock_notify'
|
||||||
|
GOSUMDB: 'sum.golang.org'
|
||||||
|
secrets:
|
||||||
|
- goproxy_default
|
||||||
|
commands:
|
||||||
|
- *goproxy_setup
|
||||||
|
- make lint-backend
|
||||||
|
|
||||||
|
checks-backend:
|
||||||
|
image: *test_image
|
||||||
|
group: checks
|
||||||
|
environment:
|
||||||
|
GOPROXY_OVERRIDE: *goproxy_override
|
||||||
|
secrets:
|
||||||
|
- goproxy_default
|
||||||
|
commands:
|
||||||
|
- *goproxy_setup
|
||||||
|
- make --always-make checks-backend
|
141
.woodpecker/testing-amd64.yml
Normal file
|
@ -0,0 +1,141 @@
|
||||||
|
platform: linux/amd64
|
||||||
|
|
||||||
|
when:
|
||||||
|
event: [ push, pull_request, manual ]
|
||||||
|
branch:
|
||||||
|
exclude: [ soft-fork/*/*, soft-fork/*/*/* ]
|
||||||
|
|
||||||
|
depends_on:
|
||||||
|
- compliance
|
||||||
|
|
||||||
|
variables:
|
||||||
|
- &golang_image 'golang:1.20'
|
||||||
|
- &test_image 'codeberg.org/forgejo/test_env:main'
|
||||||
|
- &mysql_image 'mysql:8'
|
||||||
|
- &pgsql_image 'postgres:10'
|
||||||
|
- &goproxy_override ''
|
||||||
|
- &goproxy_setup |-
|
||||||
|
if [ -n "$${GOPROXY_OVERRIDE:-}" ]; then
|
||||||
|
export GOPROXY="$${GOPROXY_OVERRIDE}";
|
||||||
|
echo "Using goproxy from goproxy_override \"$${GOPROXY}\"";
|
||||||
|
elif [ -n "$${GOPROXY_DEFAULT:-}" ]; then
|
||||||
|
export GOPROXY="$${GOPROXY_DEFAULT}";
|
||||||
|
echo "Using goproxy from goproxy_default (secret) not displaying";
|
||||||
|
else
|
||||||
|
export GOPROXY="https://proxy.golang.org,direct";
|
||||||
|
echo "No goproxy overrides or defaults given, using \"$${GOPROXY}\"";
|
||||||
|
fi
|
||||||
|
|
||||||
|
services:
|
||||||
|
mysql8:
|
||||||
|
image: *mysql_image
|
||||||
|
pull: true
|
||||||
|
environment:
|
||||||
|
MYSQL_ALLOW_EMPTY_PASSWORD: yes
|
||||||
|
MYSQL_DATABASE: testgitea
|
||||||
|
|
||||||
|
pgsql:
|
||||||
|
image: *pgsql_image
|
||||||
|
pull: true
|
||||||
|
environment:
|
||||||
|
POSTGRES_DB: test
|
||||||
|
POSTGRES_PASSWORD: postgres
|
||||||
|
|
||||||
|
workspace:
|
||||||
|
base: /go
|
||||||
|
path: src/codeberg/gitea
|
||||||
|
|
||||||
|
pipeline:
|
||||||
|
git-safe:
|
||||||
|
image: *golang_image
|
||||||
|
pull: true
|
||||||
|
commands:
|
||||||
|
- git config --add safe.directory '*'
|
||||||
|
|
||||||
|
deps-backend:
|
||||||
|
image: *golang_image
|
||||||
|
pull: true
|
||||||
|
environment:
|
||||||
|
GOPROXY_OVERRIDE: *goproxy_override
|
||||||
|
secrets:
|
||||||
|
- goproxy_default
|
||||||
|
commands:
|
||||||
|
- *goproxy_setup
|
||||||
|
- make deps-backend
|
||||||
|
|
||||||
|
tag-pre-condition:
|
||||||
|
image: *golang_image
|
||||||
|
pull: true
|
||||||
|
commands:
|
||||||
|
- git update-ref refs/heads/tag_test ${CI_COMMIT_SHA}
|
||||||
|
|
||||||
|
prepare-test-env:
|
||||||
|
image: *test_image
|
||||||
|
pull: true
|
||||||
|
commands:
|
||||||
|
- ./build/test-env-prepare.sh
|
||||||
|
|
||||||
|
build:
|
||||||
|
image: *test_image
|
||||||
|
environment:
|
||||||
|
GOSUMDB: sum.golang.org
|
||||||
|
TAGS: bindata sqlite sqlite_unlock_notify
|
||||||
|
GOPROXY_OVERRIDE: *goproxy_override
|
||||||
|
secrets:
|
||||||
|
- goproxy_default
|
||||||
|
commands:
|
||||||
|
- *goproxy_setup
|
||||||
|
- su gitea -c './build/test-env-check.sh'
|
||||||
|
- su gitea -c 'make backend'
|
||||||
|
|
||||||
|
unit-test:
|
||||||
|
image: *test_image
|
||||||
|
environment:
|
||||||
|
TAGS: 'bindata sqlite sqlite_unlock_notify'
|
||||||
|
RACE_ENABLED: 'true'
|
||||||
|
GOPROXY_OVERRIDE: *goproxy_override
|
||||||
|
secrets:
|
||||||
|
- github_read_token
|
||||||
|
- goproxy_default
|
||||||
|
commands:
|
||||||
|
- *goproxy_setup
|
||||||
|
- su gitea -c 'make unit-test-coverage test-check'
|
||||||
|
|
||||||
|
test-mysql8:
|
||||||
|
group: integration
|
||||||
|
image: *test_image
|
||||||
|
commands:
|
||||||
|
- *goproxy_setup
|
||||||
|
- su gitea -c 'timeout -s ABRT 50m make test-mysql8-migration test-mysql8'
|
||||||
|
environment:
|
||||||
|
TAGS: 'bindata'
|
||||||
|
RACE_ENABLED: 'true'
|
||||||
|
USE_REPO_TEST_DIR: '1'
|
||||||
|
GOPROXY_OVERRIDE: *goproxy_override
|
||||||
|
secrets:
|
||||||
|
- goproxy_default
|
||||||
|
|
||||||
|
test-pgsql:
|
||||||
|
group: integration
|
||||||
|
image: *test_image
|
||||||
|
commands:
|
||||||
|
- *goproxy_setup
|
||||||
|
- su gitea -c 'timeout -s ABRT 50m make test-pgsql-migration test-pgsql'
|
||||||
|
environment:
|
||||||
|
TAGS: 'bindata'
|
||||||
|
RACE_ENABLED: 'true'
|
||||||
|
USE_REPO_TEST_DIR: '1'
|
||||||
|
GOPROXY_OVERRIDE: *goproxy_override
|
||||||
|
secrets:
|
||||||
|
- goproxy_default
|
||||||
|
|
||||||
|
test-sqlite:
|
||||||
|
group: integration
|
||||||
|
image: *test_image
|
||||||
|
environment:
|
||||||
|
- USE_REPO_TEST_DIR=1
|
||||||
|
- GOPROXY=off
|
||||||
|
- TAGS=bindata gogit sqlite sqlite_unlock_notify
|
||||||
|
- TEST_TAGS=bindata gogit sqlite sqlite_unlock_notify
|
||||||
|
commands:
|
||||||
|
- su gitea -c 'timeout -s ABRT 120m make test-sqlite-migration test-sqlite'
|
570
CONTRIBUTING.md
|
@ -1,563 +1,23 @@
|
||||||
# Contribution Guidelines
|
# Forgejo Contributor Guide
|
||||||
|
|
||||||
<details><summary>Table of Contents</summary>
|
The Forgejo project is run by a community of people who are expected to follow this guide when cooperating on a simple bug fix as well as when changing the governance. For more information about the project, take a look at [the documentation explaining what Forgejo provides](README.md).
|
||||||
|
|
||||||
- [Contribution Guidelines](#contribution-guidelines)
|
Sensitive security-related issues should be reported to [security@forgejo.org](mailto:security@forgejo.org) using [encryption](https://keyoxide.org/security@forgejo.org).
|
||||||
- [Introduction](#introduction)
|
|
||||||
- [Issues](#issues)
|
|
||||||
- [How to report issues](#how-to-report-issues)
|
|
||||||
- [Types of issues](#types-of-issues)
|
|
||||||
- [Discuss your design before the implementation](#discuss-your-design-before-the-implementation)
|
|
||||||
- [Building Gitea](#building-gitea)
|
|
||||||
- [Dependencies](#dependencies)
|
|
||||||
- [Backend](#backend)
|
|
||||||
- [Frontend](#frontend)
|
|
||||||
- [Design guideline](#design-guideline)
|
|
||||||
- [Styleguide](#styleguide)
|
|
||||||
- [Copyright](#copyright)
|
|
||||||
- [Testing](#testing)
|
|
||||||
- [Translation](#translation)
|
|
||||||
- [Code review](#code-review)
|
|
||||||
- [Pull request format](#pull-request-format)
|
|
||||||
- [PR title and summary](#pr-title-and-summary)
|
|
||||||
- [Milestone](#milestone)
|
|
||||||
- [Labels](#labels)
|
|
||||||
- [Breaking PRs](#breaking-prs)
|
|
||||||
- [What is a breaking PR?](#what-is-a-breaking-pr)
|
|
||||||
- [How to handle breaking PRs?](#how-to-handle-breaking-prs)
|
|
||||||
- [Maintaining open PRs](#maintaining-open-prs)
|
|
||||||
- [Getting PRs merged](#getting-prs-merged)
|
|
||||||
- [Final call](#final-call)
|
|
||||||
- [Commit messages](#commit-messages)
|
|
||||||
- [PR Co-authors](#pr-co-authors)
|
|
||||||
- [PRs targeting `main`](#prs-targeting-main)
|
|
||||||
- [Backport PRs](#backport-prs)
|
|
||||||
- [Documentation](#documentation)
|
|
||||||
- [API v1](#api-v1)
|
|
||||||
- [GitHub API compatability](#github-api-compatability)
|
|
||||||
- [Adding/Maintaining API routes](#addingmaintaining-api-routes)
|
|
||||||
- [When to use what HTTP method](#when-to-use-what-http-method)
|
|
||||||
- [Requirements for API routes](#requirements-for-api-routes)
|
|
||||||
- [Backports and Frontports](#backports-and-frontports)
|
|
||||||
- [What is backported?](#what-is-backported)
|
|
||||||
- [How to backport?](#how-to-backport)
|
|
||||||
- [Format of backport PRs](#format-of-backport-prs)
|
|
||||||
- [Frontports](#frontports)
|
|
||||||
- [Developer Certificate of Origin (DCO)](#developer-certificate-of-origin-dco)
|
|
||||||
- [Release Cycle](#release-cycle)
|
|
||||||
- [Maintainers](#maintainers)
|
|
||||||
- [Technical Oversight Committee (TOC)](#technical-oversight-committee-toc)
|
|
||||||
- [Current TOC members](#current-toc-members)
|
|
||||||
- [Previous TOC/owners members](#previous-tocowners-members)
|
|
||||||
- [Governance Compensation](#governance-compensation)
|
|
||||||
- [TOC \& Working groups](#toc--working-groups)
|
|
||||||
- [Roadmap](#roadmap)
|
|
||||||
- [Versions](#versions)
|
|
||||||
- [Releasing Gitea](#releasing-gitea)
|
|
||||||
|
|
||||||
</details>
|
## For everyone involved
|
||||||
|
|
||||||
## Introduction
|
- [Documentation](https://forgejo.org/docs/next/)
|
||||||
|
- [Code of Conduct](https://forgejo.org/docs/next/developer/COC/)
|
||||||
|
- [Bugs, features, security and others discussions](https://forgejo.org/docs/next/developer/DISCUSSIONS/)
|
||||||
|
- [Governance](https://forgejo.org/docs/next/developer/GOVERNANCE/)
|
||||||
|
- [Sustainability and funding](https://codeberg.org/forgejo/sustainability/src/branch/master/README.md)
|
||||||
|
|
||||||
This document explains how to contribute changes to the Gitea project. \
|
## For contributors
|
||||||
It assumes you have followed the [installation instructions](https://docs.gitea.io/en-us/). \
|
|
||||||
Sensitive security-related issues should be reported to [security@gitea.io](mailto:security@gitea.io).
|
|
||||||
|
|
||||||
For configuring IDEs for Gitea development, see the [contributed IDE configurations](contrib/ide/).
|
- [Developer Certificate of Origin (DCO)](https://forgejo.org/docs/next/developer/DCO/)
|
||||||
|
- [Development workflow](https://forgejo.org/docs/next/developer/WORKFLOW/)
|
||||||
|
|
||||||
## Issues
|
## For maintainers
|
||||||
|
|
||||||
### How to report issues
|
- [Release management](https://forgejo.org/docs/next/developer/RELEASE/)
|
||||||
|
- [Secrets](https://forgejo.org/docs/next/developer/SECRETS/)
|
||||||
Please search the issues on the issue tracker with a variety of related keywords to ensure that your issue has not already been reported.
|
|
||||||
|
|
||||||
If your issue has not been reported yet, [open an issue](https://github.com/go-gitea/gitea/issues/new)
|
|
||||||
and answer the questions so we can understand and reproduce the problematic behavior. \
|
|
||||||
Please write clear and concise instructions so that we can reproduce the behavior — even if it seems obvious. \
|
|
||||||
The more detailed and specific you are, the faster we can fix the issue. \
|
|
||||||
It is really helpful if you can reproduce your problem on a site running on the latest commits, i.e. <https://try.gitea.io>, as perhaps your problem has already been fixed on a current version. \
|
|
||||||
Please follow the guidelines described in [How to Report Bugs Effectively](http://www.chiark.greenend.org.uk/~sgtatham/bugs.html) for your report.
|
|
||||||
|
|
||||||
Please be kind, remember that Gitea comes at no cost to you, and you're getting free help.
|
|
||||||
|
|
||||||
### Types of issues
|
|
||||||
|
|
||||||
Typically, issues fall in one of the following categories:
|
|
||||||
|
|
||||||
- `bug`: Something in the frontend or backend behaves unexpectedly
|
|
||||||
- `security issue`: bug that has serious implications such as leaking another users data. Please do not file such issues on the public tracker and send a mail to security@gitea.io instead
|
|
||||||
- `feature`: Completely new functionality. You should describe this feature in enough detail that anyone who reads the issue can understand how it is supposed to be implemented
|
|
||||||
- `enhancement`: An existing feature should get an upgrade
|
|
||||||
- `refactoring`: Parts of the code base don't conform with other parts and should be changed to improve Gitea's maintainability
|
|
||||||
|
|
||||||
### Discuss your design before the implementation
|
|
||||||
|
|
||||||
We welcome submissions. \
|
|
||||||
If you want to change or add something, please let everyone know what you're working on — [file an issue](https://github.com/go-gitea/gitea/issues/new) or comment on an existing one before starting your work!
|
|
||||||
|
|
||||||
Significant changes such as new features must go through the change proposal process before they can be accepted. \
|
|
||||||
This is mainly to save yourself the trouble of implementing it, only to find out that your proposed implementation has some potential problems. \
|
|
||||||
Furthermore, this process gives everyone a chance to validate the design, helps prevent duplication of effort, and ensures that the idea fits inside
|
|
||||||
the goals for the project and tools.
|
|
||||||
|
|
||||||
Pull requests should not be the place for architecture discussions.
|
|
||||||
|
|
||||||
## Building Gitea
|
|
||||||
|
|
||||||
See the [development setup instructions](https://docs.gitea.com/development/hacking-on-gitea).
|
|
||||||
|
|
||||||
## Dependencies
|
|
||||||
|
|
||||||
### Backend
|
|
||||||
|
|
||||||
Go dependencies are managed using [Go Modules](https://golang.org/cmd/go/#hdr-Module_maintenance). \
|
|
||||||
You can find more details in the [go mod documentation](https://go.dev/ref/mod) and the [Go Modules Wiki](https://github.com/golang/go/wiki/Modules).
|
|
||||||
|
|
||||||
Pull requests should only modify `go.mod` and `go.sum` where it is related to your change, be it a bugfix or a new feature. \
|
|
||||||
Apart from that, these files should only be modified by Pull Requests whose only purpose is to update dependencies.
|
|
||||||
|
|
||||||
The `go.mod`, `go.sum` update needs to be justified as part of the PR description,
|
|
||||||
and must be verified by the reviewers and/or merger to always reference
|
|
||||||
an existing upstream commit.
|
|
||||||
|
|
||||||
### Frontend
|
|
||||||
|
|
||||||
For the frontend, we use [npm](https://www.npmjs.com/).
|
|
||||||
|
|
||||||
The same restrictions apply for frontend dependencies as for backend dependencies, with the exceptions that the files for it are `package.json` and `package-lock.json`, and that new versions must always reference an existing version.
|
|
||||||
|
|
||||||
## Design guideline
|
|
||||||
|
|
||||||
Depending on your change, please read the
|
|
||||||
|
|
||||||
- [backend development guideline](https://docs.gitea.com/contributing/guidelines-backend)
|
|
||||||
- [frontend development guideline](https://docs.gitea.com/contributing/guidelines-frontend)
|
|
||||||
- [refactoring guideline](https://docs.gitea.com/contributing/guidelines-refactoring)
|
|
||||||
|
|
||||||
## Styleguide
|
|
||||||
|
|
||||||
You should always run `make fmt` before committing to conform to Gitea's styleguide.
|
|
||||||
|
|
||||||
## Copyright
|
|
||||||
|
|
||||||
New code files that you contribute should use the standard copyright header:
|
|
||||||
|
|
||||||
```
|
|
||||||
// Copyright <current year> The Gitea Authors. All rights reserved.
|
|
||||||
// SPDX-License-Identifier: MIT
|
|
||||||
```
|
|
||||||
|
|
||||||
Afterwards, copyright should only be modified when the copyright author changes.
|
|
||||||
|
|
||||||
## Testing
|
|
||||||
|
|
||||||
Before submitting a pull request, run all tests to make sure your changes don't cause a regression elsewhere.
|
|
||||||
|
|
||||||
Here's how to run the test suite:
|
|
||||||
|
|
||||||
- code lint
|
|
||||||
|
|
||||||
| | |
|
|
||||||
| :-------------------- | :---------------------------------------------------------------- |
|
|
||||||
|``make lint`` | lint everything (not needed if you only change the front- **or** backend) |
|
|
||||||
|``make lint-frontend`` | lint frontend files |
|
|
||||||
|``make lint-backend`` | lint backend files |
|
|
||||||
|
|
||||||
- run tests (we suggest running them on Linux)
|
|
||||||
|
|
||||||
| Command | Action | |
|
|
||||||
| :------------------------------------- | :----------------------------------------------- | ------------ |
|
|
||||||
|``make test[\#SpecificTestName]`` | run unit test(s) |
|
|
||||||
|``make test-sqlite[\#SpecificTestName]``| run [integration](tests/integration) test(s) for SQLite |[More details](tests/integration/README.md) |
|
|
||||||
|``make test-e2e-sqlite[\#SpecificTestName]``| run [end-to-end](tests/e2e) test(s) for SQLite |[More details](tests/e2e/README.md) |
|
|
||||||
|
|
||||||
## Translation
|
|
||||||
|
|
||||||
All translation work happens on [Crowdin](https://crowdin.com/project/gitea).
|
|
||||||
The only translation that is maintained in this repository is [the English translation](https://github.com/go-gitea/gitea/blob/master/options/locale/locale_en-US.ini).
|
|
||||||
It is synced regularly with Crowdin. \
|
|
||||||
Other locales on main branch **should not** be updated manually as they will be overwritten with each sync. \
|
|
||||||
Once a language has reached a **satisfactory percentage** of translated keys (~25%), it will be synced back into this repo and included in the next released version.
|
|
||||||
|
|
||||||
The tool `go run build/backport-locale.go` can be used to backport locales from the main branch to release branches that were missed.
|
|
||||||
|
|
||||||
## Code review
|
|
||||||
|
|
||||||
### Pull request format
|
|
||||||
|
|
||||||
Please try to make your pull request easy to review for us. \
|
|
||||||
For that, please read the [*Best Practices for Faster Reviews*](https://github.com/kubernetes/community/blob/261cb0fd089b64002c91e8eddceebf032462ccd6/contributors/guide/pull-requests.md#best-practices-for-faster-reviews) guide. \
|
|
||||||
It has lots of useful tips for any project you may want to contribute to. \
|
|
||||||
Some of the key points:
|
|
||||||
|
|
||||||
- Make small pull requests. \
|
|
||||||
The smaller, the faster to review and the more likely it will be merged soon.
|
|
||||||
- Don't make changes unrelated to your PR. \
|
|
||||||
Maybe there are typos on some comments, maybe refactoring would be welcome on a function... \
|
|
||||||
but if that is not related to your PR, please make *another* PR for that.
|
|
||||||
- Split big pull requests into multiple small ones. \
|
|
||||||
An incremental change will be faster to review than a huge PR.
|
|
||||||
- Allow edits by maintainers. This way, the maintainers will take care of merging the PR later on instead of you.
|
|
||||||
|
|
||||||
### PR title and summary
|
|
||||||
|
|
||||||
In the PR title, describe the problem you are fixing, not how you are fixing it. \
|
|
||||||
Use the first comment as a summary of your PR. \
|
|
||||||
In the PR summary, you can describe exactly how you are fixing this problem. \
|
|
||||||
Keep this summary up-to-date as the PR evolves. \
|
|
||||||
If your PR changes the UI, you must add **after** screenshots in the PR summary. \
|
|
||||||
If you are not implementing a new feature, you should also post **before** screenshots for comparison. \
|
|
||||||
If your PR closes some issues, you must note that in a way that both GitHub and Gitea understand, i.e. by appending a paragraph like
|
|
||||||
|
|
||||||
```text
|
|
||||||
Fixes/Closes/Resolves #<ISSUE_NR_X>.
|
|
||||||
Fixes/Closes/Resolves #<ISSUE_NR_Y>.
|
|
||||||
```
|
|
||||||
|
|
||||||
to your summary. \
|
|
||||||
Each issue that will be closed must stand on a separate line.
|
|
||||||
|
|
||||||
### Milestone
|
|
||||||
|
|
||||||
A PR should only be assigned to a milestone if it will likely be merged into the given version. \
|
|
||||||
As a rule of thumb, assume that a PR will stay open for an additional month for every 100 added lines. \
|
|
||||||
PRs without a milestone may not be merged.
|
|
||||||
|
|
||||||
### Labels
|
|
||||||
|
|
||||||
Every PR should be labeled correctly with every label that applies. \
|
|
||||||
This includes especially the distinction between `bug` (fixing existing functionality), `feature` (new functionality), `enhancement` (upgrades for existing functionality), and `refactoring` (improving the internal code structure without changing the output (much)). \
|
|
||||||
Furthermore,
|
|
||||||
|
|
||||||
- the amount of pending required approvals
|
|
||||||
- whether this PR is `blocked`, a `backport` or `breaking`
|
|
||||||
- if it targets the `ui` or `api`
|
|
||||||
- if it increases the application `speed`
|
|
||||||
- reduces `memory usage`
|
|
||||||
|
|
||||||
are oftentimes notable labels.
|
|
||||||
|
|
||||||
### Breaking PRs
|
|
||||||
|
|
||||||
#### What is a breaking PR?
|
|
||||||
|
|
||||||
A PR is breaking if it meets one of the following criteria:
|
|
||||||
|
|
||||||
- It changes API output in an incompatible way for existing users
|
|
||||||
- It removes a setting that an admin could previously set (i.e. via `app.ini`)
|
|
||||||
- An admin must do something manually to restore the old behavior
|
|
||||||
|
|
||||||
In particular, this means that adding new settings is not breaking.\
|
|
||||||
Changing the default value of a setting or replacing the setting with another one is breaking, however.
|
|
||||||
|
|
||||||
#### How to handle breaking PRs?
|
|
||||||
|
|
||||||
If your PR has a breaking change, you must add a `BREAKING` section to your PR summary, e.g.
|
|
||||||
|
|
||||||
```
|
|
||||||
## :warning: BREAKING :warning:
|
|
||||||
```
|
|
||||||
|
|
||||||
To explain how this will affect users and how to mitigate these changes.
|
|
||||||
|
|
||||||
### Maintaining open PRs
|
|
||||||
|
|
||||||
The moment you create a non-draft PR or the moment you convert a draft PR to a non-draft PR is the moment code review starts for it. \
|
|
||||||
Once that happens, do not rebase or squash your branch anymore as it makes it difficult to review the new changes. \
|
|
||||||
Merge the base branch into your branch only when you really need to, i.e. because of conflicting changes in the mean time. \
|
|
||||||
This reduces unnecessary CI runs. \
|
|
||||||
Don't worry about merge commits messing up your commit history as every PR will be squash merged. \
|
|
||||||
This means that all changes are joined into a single new commit whose message is as described below.
|
|
||||||
|
|
||||||
### Getting PRs merged
|
|
||||||
|
|
||||||
Changes to Gitea must be reviewed before they are accepted — no matter who
|
|
||||||
makes the change, even if they are an owner or a maintainer. \
|
|
||||||
The only exception are critical bugs that prevent Gitea from being compiled or started. \
|
|
||||||
Specifically, we require two approvals from maintainers for every PR. \
|
|
||||||
Once this criteria has been met, your PR receives the `lgtm/done` label. \
|
|
||||||
From this point on, your only responsibility is to fix merge conflicts or respond to/implement requests by maintainers. \
|
|
||||||
It is the responsibility of the maintainers from this point to get your PR merged.
|
|
||||||
|
|
||||||
If a PR has the `lgtm/done` label and there are no open discussions or merge conflicts anymore, any maintainer can add the `reviewed/wait-merge` label. \
|
|
||||||
This label means that the PR is part of the merge queue and will be merged as soon as possible. \
|
|
||||||
The merge queue will be cleared in the order of the list below:
|
|
||||||
|
|
||||||
<https://github.com/go-gitea/gitea/pulls?q=is%3Apr+label%3Areviewed%2Fwait-merge+sort%3Acreated-asc+is%3Aopen>
|
|
||||||
|
|
||||||
Gitea uses it's own tool, the <https://github.com/GiteaBot/gitea-backporter> to automate parts of the review process. \
|
|
||||||
This tool does the things listed below automatically:
|
|
||||||
|
|
||||||
- create a backport PR if needed once the initial PR was merged
|
|
||||||
- remove the PR from the merge queue after the PR merged
|
|
||||||
- keep the oldest branch in the merge queue up to date with merges
|
|
||||||
|
|
||||||
### Final call
|
|
||||||
|
|
||||||
If a PR has been ignored for more than 7 days with no comments or reviews, and the author or any maintainer believes it will not survive a long wait (such as a refactoring PR), they can send "final call" to the TOC by mentioning them in a comment.
|
|
||||||
|
|
||||||
After another 7 days, if there is still zero approval, this is considered a polite refusal, and the PR will be closed to avoid wasting further time. Therefore, the "final call" has a cost, and should be used cautiously.
|
|
||||||
|
|
||||||
However, if there are no objections from maintainers, the PR can be merged with only one approval from the TOC (not the author).
|
|
||||||
|
|
||||||
### Commit messages
|
|
||||||
|
|
||||||
Mergers are able and required to rewrite the PR title and summary (the first comment of a PR) so that it can produce an easily understandable commit message if necessary. \
|
|
||||||
The final commit message should no longer contain any uncertainty such as `hopefully, <x> won't happen anymore`. Replace uncertainty with certainty.
|
|
||||||
|
|
||||||
#### PR Co-authors
|
|
||||||
|
|
||||||
A person counts as a PR co-author the moment they (co-)authored a commit that is not simply a `Merge base branch into branch` commit. \
|
|
||||||
Mergers are required to remove such "false-positive" co-authors when writing the commit message. \
|
|
||||||
The true co-authors must remain in the commit message.
|
|
||||||
|
|
||||||
#### PRs targeting `main`
|
|
||||||
|
|
||||||
The commit message of PRs targeting `main` is always
|
|
||||||
|
|
||||||
```bash
|
|
||||||
$PR_TITLE ($PR_INDEX)
|
|
||||||
|
|
||||||
$REWRITTEN_PR_SUMMARY
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Backport PRs
|
|
||||||
|
|
||||||
The commit message of backport PRs is always
|
|
||||||
|
|
||||||
```bash
|
|
||||||
$PR_TITLE ($INITIAL_PR_INDEX) ($BACKPORT_PR_INDEX)
|
|
||||||
|
|
||||||
$REWRITTEN_PR_SUMMARY
|
|
||||||
```
|
|
||||||
|
|
||||||
## Documentation
|
|
||||||
|
|
||||||
If you add a new feature or change an existing aspect of Gitea, the documentation for that feature must be created or updated in the same PR.
|
|
||||||
|
|
||||||
## API v1
|
|
||||||
|
|
||||||
The API is documented by [swagger](http://try.gitea.io/api/swagger) and is based on [the GitHub API](https://docs.github.com/en/rest).
|
|
||||||
|
|
||||||
### GitHub API compatability
|
|
||||||
|
|
||||||
Gitea's API should use the same endpoints and fields as the GitHub API as far as possible, unless there are good reasons to deviate. \
|
|
||||||
If Gitea provides functionality that GitHub does not, a new endpoint can be created. \
|
|
||||||
If information is provided by Gitea that is not provided by the GitHub API, a new field can be used that doesn't collide with any GitHub fields. \
|
|
||||||
Updating an existing API should not remove existing fields unless there is a really good reason to do so. \
|
|
||||||
The same applies to status responses. If you notice a problem, feel free to leave a comment in the code for future refactoring to API v2 (which is currently not planned).
|
|
||||||
|
|
||||||
### Adding/Maintaining API routes
|
|
||||||
|
|
||||||
All expected results (errors, success, fail messages) must be documented ([example](https://github.com/go-gitea/gitea/blob/c620eb5b2d0d874da68ebd734d3864c5224f71f7/routers/api/v1/repo/issue.go#L319-L327)). \
|
|
||||||
All JSON input types must be defined as a struct in [modules/structs/](modules/structs/) ([example](https://github.com/go-gitea/gitea/blob/c620eb5b2d0d874da68ebd734d3864c5224f71f7/modules/structs/issue.go#L76-L91)) \
|
|
||||||
and referenced in [routers/api/v1/swagger/options.go](https://github.com/go-gitea/gitea/blob/c620eb5b2d0d874da68ebd734d3864c5224f71f7/routers/api/v1/swagger/options.go). \
|
|
||||||
They can then be used like [this example](https://github.com/go-gitea/gitea/blob/c620eb5b2d0d874da68ebd734d3864c5224f71f7/routers/api/v1/repo/issue.go#L318). \
|
|
||||||
All JSON responses must be defined as a struct in [modules/structs/](modules/structs/) ([example](https://github.com/go-gitea/gitea/blob/c620eb5b2d0d874da68ebd734d3864c5224f71f7/modules/structs/issue.go#L36-L68)) \
|
|
||||||
and referenced in its category in [routers/api/v1/swagger/](routers/api/v1/swagger/) ([example](https://github.com/go-gitea/gitea/blob/c620eb5b2d0d874da68ebd734d3864c5224f71f7/routers/api/v1/swagger/issue.go#L11-L16)) \
|
|
||||||
They can be used like [this example](https://github.com/go-gitea/gitea/blob/c620eb5b2d0d874da68ebd734d3864c5224f71f7/routers/api/v1/repo/issue.go#L277-L279).
|
|
||||||
|
|
||||||
### When to use what HTTP method
|
|
||||||
|
|
||||||
In general, HTTP methods are chosen as follows:
|
|
||||||
|
|
||||||
- **GET** endpoints return the requested object(s) and status **OK (200)**
|
|
||||||
- **DELETE** endpoints return the status **No Content (204)** and no content either
|
|
||||||
- **POST** endpoints are used to **create** new objects (e.g. a User) and return the status **Created (201)** and the created object
|
|
||||||
- **PUT** endpoints are used to **add/assign** existing Objects (e.g. a user to a team) and return the status **No Content (204)** and no content either
|
|
||||||
- **PATCH** endpoints are used to **edit/change** an existing object and return the changed object and the status **OK (200)**
|
|
||||||
|
|
||||||
### Requirements for API routes
|
|
||||||
|
|
||||||
All parameters of endpoints changing/editing an object must be optional (except the ones to identify the object, which are required).
|
|
||||||
|
|
||||||
Endpoints returning lists must
|
|
||||||
|
|
||||||
- support pagination (`page` & `limit` options in query)
|
|
||||||
- set `X-Total-Count` header via **SetTotalCountHeader** ([example](https://github.com/go-gitea/gitea/blob/7aae98cc5d4113f1e9918b7ee7dd09f67c189e3e/routers/api/v1/repo/issue.go#L444))
|
|
||||||
|
|
||||||
## Backports and Frontports
|
|
||||||
|
|
||||||
### What is backported?
|
|
||||||
|
|
||||||
We backport PRs given the following circumstances:
|
|
||||||
|
|
||||||
1. Feature freeze is active, but `<version>-rc0` has not been released yet. Here, we backport as much as possible. <!-- TODO: Is that our definition with the new backport bot? -->
|
|
||||||
2. `rc0` has been released. Here, we only backport bug- and security-fixes, and small enhancements. Large PRs such as refactors are not backported anymore. <!-- TODO: Is that our definition with the new backport bot? -->
|
|
||||||
3. We never backport new features.
|
|
||||||
4. We never backport breaking changes except when
|
|
||||||
1. The breaking change has no effect on the vast majority of users
|
|
||||||
2. The component triggering the breaking change is marked as experimental
|
|
||||||
|
|
||||||
### How to backport?
|
|
||||||
|
|
||||||
In the past, it was necessary to manually backport your PRs. \
|
|
||||||
Now, that's not a requirement anymore as our [backport bot](https://github.com/GiteaBot) tries to create backports automatically once the PR is merged when the PR
|
|
||||||
|
|
||||||
- does not have the label `backport/manual`
|
|
||||||
- has the label `backport/<version>`
|
|
||||||
|
|
||||||
The `backport/manual` label signifies either that you want to backport the change yourself, or that there were conflicts when backporting, thus you **must** do it yourself.
|
|
||||||
|
|
||||||
### Format of backport PRs
|
|
||||||
|
|
||||||
The title of backport PRs should be
|
|
||||||
|
|
||||||
```
|
|
||||||
<original PR title> (#<original pr number>)
|
|
||||||
```
|
|
||||||
|
|
||||||
The first two lines of the summary of the backporting PR should be
|
|
||||||
|
|
||||||
```
|
|
||||||
Backport #<original pr number>
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
with the rest of the summary and labels matching the original PR.
|
|
||||||
|
|
||||||
### Frontports
|
|
||||||
|
|
||||||
Frontports behave exactly as described above for backports.
|
|
||||||
|
|
||||||
## Developer Certificate of Origin (DCO)
|
|
||||||
|
|
||||||
We consider the act of contributing to the code by submitting a Pull Request as the "Sign off" or agreement to the certifications and terms of the [DCO](DCO) and [MIT license](LICENSE). \
|
|
||||||
No further action is required. \
|
|
||||||
You can also decide to sign off your commits by adding the following line at the end of your commit messages:
|
|
||||||
|
|
||||||
```
|
|
||||||
Signed-off-by: Joe Smith <joe.smith@email.com>
|
|
||||||
```
|
|
||||||
|
|
||||||
If you set the `user.name` and `user.email` Git config options, you can add the line to the end of your commits automatically with `git commit -s`.
|
|
||||||
|
|
||||||
We assume in good faith that the information you provide is legally binding.
|
|
||||||
|
|
||||||
## Release Cycle
|
|
||||||
|
|
||||||
We adopted a release schedule to streamline the process of working on, finishing, and issuing releases. \
|
|
||||||
The overall goal is to make a major release every three or four months, which breaks down into two or three months of general development followed by one month of testing and polishing known as the release freeze. \
|
|
||||||
All the feature pull requests should be
|
|
||||||
merged before feature freeze. And, during the frozen period, a corresponding
|
|
||||||
release branch is open for fixes backported from main branch. Release candidates
|
|
||||||
are made during this period for user testing to
|
|
||||||
obtain a final version that is maintained in this branch.
|
|
||||||
|
|
||||||
During a development cycle, we may also publish any necessary minor releases
|
|
||||||
for the previous version. For example, if the latest, published release is
|
|
||||||
v1.2, then minor changes for the previous release—e.g., v1.1.0 -> v1.1.1—are
|
|
||||||
still possible.
|
|
||||||
|
|
||||||
## Maintainers
|
|
||||||
|
|
||||||
To make sure every PR is checked, we have [maintainers](MAINTAINERS). \
|
|
||||||
Every PR **must** be reviewed by at least two maintainers (or owners) before it can get merged. \
|
|
||||||
For refactoring PRs after a week and documentation only PRs, the approval of only one maintainer is enough. \
|
|
||||||
A maintainer should be a contributor of Gitea and contributed at least
|
|
||||||
4 accepted PRs. A contributor should apply as a maintainer in the
|
|
||||||
[Discord](https://discord.gg/Gitea) `#develop` channel. The team maintainers may invite the contributor. A maintainer
|
|
||||||
should spend some time on code reviews. If a maintainer has no
|
|
||||||
time to do that, they should apply to leave the maintainers team
|
|
||||||
and we will give them the honor of being a member of the [advisors
|
|
||||||
team](https://github.com/orgs/go-gitea/teams/advisors). Of course, if
|
|
||||||
an advisor has time to code review, we will gladly welcome them back
|
|
||||||
to the maintainers team. If a maintainer is inactive for more than 3
|
|
||||||
months and forgets to leave the maintainers team, the owners may move
|
|
||||||
him or her from the maintainers team to the advisors team.
|
|
||||||
For security reasons, Maintainers should use 2FA for their accounts and
|
|
||||||
if possible provide GPG signed commits.
|
|
||||||
https://help.github.com/articles/securing-your-account-with-two-factor-authentication-2fa/
|
|
||||||
https://help.github.com/articles/signing-commits-with-gpg/
|
|
||||||
|
|
||||||
## Technical Oversight Committee (TOC)
|
|
||||||
|
|
||||||
At the start of 2023, the `Owners` team was dissolved. Instead, the governance charter proposed a technical oversight committee (TOC) which expands the ownership team of the Gitea project from three elected positions to six positions. Three positions would be elected as it has been over the past years, and the other three would consist of appointed members from the Gitea company.
|
|
||||||
https://blog.gitea.io/2023/02/gitea-quarterly-report-23q1/
|
|
||||||
|
|
||||||
When the new community members have been elected, the old members will give up ownership to the newly elected members. For security reasons, TOC members or any account with write access (like a bot) must use 2FA.
|
|
||||||
https://help.github.com/articles/securing-your-account-with-two-factor-authentication-2fa/
|
|
||||||
|
|
||||||
### Current TOC members
|
|
||||||
|
|
||||||
- 2023-01-01 ~ 2023-12-31 - https://blog.gitea.io/2023/02/gitea-quarterly-report-23q1/
|
|
||||||
- Company
|
|
||||||
- [Jason Song](https://gitea.com/wolfogre) <i@wolfogre.com>
|
|
||||||
- [Lunny Xiao](https://gitea.com/lunny) <xiaolunwen@gmail.com>
|
|
||||||
- [Matti Ranta](https://gitea.com/techknowlogick) <techknowlogick@gitea.io>
|
|
||||||
- Community
|
|
||||||
- [6543](https://gitea.com/6543) <6543@obermui.de>
|
|
||||||
- [Andrew Thornton](https://gitea.com/zeripath) <art27@cantab.net>
|
|
||||||
- [John Olheiser](https://gitea.com/jolheiser) <john.olheiser@gmail.com>
|
|
||||||
|
|
||||||
### Previous TOC/owners members
|
|
||||||
|
|
||||||
Here's the history of the owners and the time they served:
|
|
||||||
|
|
||||||
- [Lunny Xiao](https://gitea.com/lunny) - 2016, 2017, [2018](https://github.com/go-gitea/gitea/issues/3255), [2019](https://github.com/go-gitea/gitea/issues/5572), [2020](https://github.com/go-gitea/gitea/issues/9230), [2021](https://github.com/go-gitea/gitea/issues/13801), [2022](https://github.com/go-gitea/gitea/issues/17872)
|
|
||||||
- [Kim Carlbäcker](https://github.com/bkcsoft) - 2016, 2017
|
|
||||||
- [Thomas Boerger](https://gitea.com/tboerger) - 2016, 2017
|
|
||||||
- [Lauris Bukšis-Haberkorns](https://gitea.com/lafriks) - [2018](https://github.com/go-gitea/gitea/issues/3255), [2019](https://github.com/go-gitea/gitea/issues/5572), [2020](https://github.com/go-gitea/gitea/issues/9230), [2021](https://github.com/go-gitea/gitea/issues/13801)
|
|
||||||
- [Matti Ranta](https://gitea.com/techknowlogick) - [2019](https://github.com/go-gitea/gitea/issues/5572), [2020](https://github.com/go-gitea/gitea/issues/9230), [2021](https://github.com/go-gitea/gitea/issues/13801), [2022](https://github.com/go-gitea/gitea/issues/17872)
|
|
||||||
- [Andrew Thornton](https://gitea.com/zeripath) - [2020](https://github.com/go-gitea/gitea/issues/9230), [2021](https://github.com/go-gitea/gitea/issues/13801), [2022](https://github.com/go-gitea/gitea/issues/17872)
|
|
||||||
|
|
||||||
## Governance Compensation
|
|
||||||
|
|
||||||
Each member of the community elected TOC will be granted $500 each month as compensation for their work.
|
|
||||||
|
|
||||||
Furthermore, any community release manager for a specific release or LTS will be compensated $500 for the delivery of said release.
|
|
||||||
|
|
||||||
These funds will come from community sources like the OpenCollective rather than directly from the company.
|
|
||||||
Only non-company members are eligible for this compensation, and if a member of the community TOC takes the responsibility of release manager, they would only be compensated for their TOC duties.
|
|
||||||
Gitea Ltd employees are not eligible to receive any funds from the OpenCollective unless it is reimbursement for a purchase made for the Gitea project itself.
|
|
||||||
|
|
||||||
## TOC & Working groups
|
|
||||||
|
|
||||||
With Gitea covering many projects outside of the main repository, several groups will be created to help focus on specific areas instead of requiring maintainers to be a jack-of-all-trades. Maintainers are of course more than welcome to be part of multiple groups should they wish to contribute in multiple places.
|
|
||||||
|
|
||||||
The currently proposed groups are:
|
|
||||||
|
|
||||||
- **Core Group**: maintain the primary Gitea repository
|
|
||||||
- **Integration Group**: maintain the Gitea ecosystem's related tools, including go-sdk/tea/changelog/bots etc.
|
|
||||||
- **Documentation Group**: maintain related documents and repositories
|
|
||||||
- **Translation Group**: coordinate with translators and maintain translations
|
|
||||||
- **Security Group**: managed by TOC directly, members are decided by TOC, maintains security patches/responsible for security items
|
|
||||||
|
|
||||||
## Roadmap
|
|
||||||
|
|
||||||
Each year a roadmap will be discussed with the entire Gitea maintainers team, and feedback will be solicited from various stakeholders.
|
|
||||||
TOC members need to review the roadmap every year and work together on the direction of the project.
|
|
||||||
|
|
||||||
When a vote is required for a proposal or other change, the vote of community elected TOC members count slightly more than the vote of company elected TOC members. With this approach, we both avoid ties and ensure that changes align with the mission statement and community opinion.
|
|
||||||
|
|
||||||
You can visit our roadmap on the wiki.
|
|
||||||
|
|
||||||
## Versions
|
|
||||||
|
|
||||||
Gitea has the `main` branch as a tip branch and has version branches
|
|
||||||
such as `release/v1.19`. `release/v1.19` is a release branch and we will
|
|
||||||
tag `v1.19.0` for binary download. If `v1.19.0` has bugs, we will accept
|
|
||||||
pull requests on the `release/v1.19` branch and publish a `v1.19.1` tag,
|
|
||||||
after bringing the bug fix also to the main branch.
|
|
||||||
|
|
||||||
Since the `main` branch is a tip version, if you wish to use Gitea
|
|
||||||
in production, please download the latest release tag version. All the
|
|
||||||
branches will be protected via GitHub, all the PRs to every branch must
|
|
||||||
be reviewed by two maintainers and must pass the automatic tests.
|
|
||||||
|
|
||||||
## Releasing Gitea
|
|
||||||
|
|
||||||
- Let $vmaj, $vmin and $vpat be Major, Minor and Patch version numbers, $vpat should be rc1, rc2, 0, 1, ...... $vmaj.$vmin will be kept the same as milestones on github or gitea in future.
|
|
||||||
- Before releasing, confirm all the version's milestone issues or PRs has been resolved. Then discuss the release on Discord channel #maintainers and get agreed with almost all the owners and mergers. Or you can declare the version and if nobody against in about serval hours.
|
|
||||||
- If this is a big version first you have to create PR for changelog on branch `main` with PRs with label `changelog` and after it has been merged do following steps:
|
|
||||||
- Create `-dev` tag as `git tag -s -F release.notes v$vmaj.$vmin.0-dev` and push the tag as `git push origin v$vmaj.$vmin.0-dev`.
|
|
||||||
- When CI has finished building tag then you have to create a new branch named `release/v$vmaj.$vmin`
|
|
||||||
- If it is bugfix version create PR for changelog on branch `release/v$vmaj.$vmin` and wait till it is reviewed and merged.
|
|
||||||
- Add a tag as `git tag -s -F release.notes v$vmaj.$vmin.$`, release.notes file could be a temporary file to only include the changelog this version which you added to `CHANGELOG.md`.
|
|
||||||
- And then push the tag as `git push origin v$vmaj.$vmin.$`. Drone CI will automatically create a release and upload all the compiled binary. (But currently it doesn't add the release notes automatically. Maybe we should fix that.)
|
|
||||||
- If needed send a frontport PR for the changelog to branch `main` and update the version in `docs/config.yaml` to refer to the new version.
|
|
||||||
- Send PR to [blog repository](https://gitea.com/gitea/blog) announcing the release.
|
|
||||||
- Verify all release assets were correctly published through CI on dl.gitea.io and GitHub releases. Once ACKed:
|
|
||||||
- bump the version of https://dl.gitea.io/gitea/version.json
|
|
||||||
- merge the blog post PR
|
|
||||||
- announce the release in discord `#announcements`
|
|
||||||
|
|
|
@ -24,7 +24,7 @@ RUN if [ -n "${GITEA_VERSION}" ]; then git checkout "${GITEA_VERSION}"; fi \
|
||||||
RUN go build contrib/environment-to-ini/environment-to-ini.go
|
RUN go build contrib/environment-to-ini/environment-to-ini.go
|
||||||
|
|
||||||
FROM docker.io/library/alpine:3.18
|
FROM docker.io/library/alpine:3.18
|
||||||
LABEL maintainer="maintainers@gitea.io"
|
LABEL maintainer="contact@forgejo.org"
|
||||||
|
|
||||||
EXPOSE 22 3000
|
EXPOSE 22 3000
|
||||||
|
|
||||||
|
|
|
@ -24,7 +24,7 @@ RUN if [ -n "${GITEA_VERSION}" ]; then git checkout "${GITEA_VERSION}"; fi \
|
||||||
RUN go build contrib/environment-to-ini/environment-to-ini.go
|
RUN go build contrib/environment-to-ini/environment-to-ini.go
|
||||||
|
|
||||||
FROM docker.io/library/alpine:3.18
|
FROM docker.io/library/alpine:3.18
|
||||||
LABEL maintainer="maintainers@gitea.io"
|
LABEL maintainer="contact@forgejo.org"
|
||||||
|
|
||||||
EXPOSE 2222 3000
|
EXPOSE 2222 3000
|
||||||
|
|
||||||
|
|
1
LICENSE
|
@ -1,3 +1,4 @@
|
||||||
|
Copyright (c) 2022 The Forgejo Authors
|
||||||
Copyright (c) 2016 The Gitea Authors
|
Copyright (c) 2016 The Gitea Authors
|
||||||
Copyright (c) 2015 The Gogs Authors
|
Copyright (c) 2015 The Gogs Authors
|
||||||
|
|
||||||
|
|
45
Makefile
|
@ -84,7 +84,7 @@ ifneq ($(DRONE_TAG),)
|
||||||
GITEA_VERSION ?= $(VERSION)
|
GITEA_VERSION ?= $(VERSION)
|
||||||
else
|
else
|
||||||
ifneq ($(DRONE_BRANCH),)
|
ifneq ($(DRONE_BRANCH),)
|
||||||
VERSION ?= $(subst release/v,,$(DRONE_BRANCH))
|
VERSION ?= $(shell echo $(DRONE_BRANCH) | sed -e 's|v\([0-9.][0-9.]*\)/.*|\1|')
|
||||||
else
|
else
|
||||||
VERSION ?= main
|
VERSION ?= main
|
||||||
endif
|
endif
|
||||||
|
@ -102,7 +102,10 @@ ifeq ($(VERSION),main)
|
||||||
VERSION := main-nightly
|
VERSION := main-nightly
|
||||||
endif
|
endif
|
||||||
|
|
||||||
LDFLAGS := $(LDFLAGS) -X "main.MakeVersion=$(MAKE_VERSION)" -X "main.Version=$(GITEA_VERSION)" -X "main.Tags=$(TAGS)"
|
# SemVer
|
||||||
|
FORGEJO_VERSION := 3.0.0+0-gitea-1.19.0
|
||||||
|
|
||||||
|
LDFLAGS := $(LDFLAGS) -X "main.MakeVersion=$(MAKE_VERSION)" -X "main.Version=$(GITEA_VERSION)" -X "main.Tags=$(TAGS)" -X "code.gitea.io/gitea/routers/api/forgejo/v1.ForgejoVersion=$(FORGEJO_VERSION)"
|
||||||
|
|
||||||
LINUX_ARCHS ?= linux/amd64,linux/386,linux/arm-5,linux/arm-6,linux/arm64
|
LINUX_ARCHS ?= linux/amd64,linux/386,linux/arm-5,linux/arm-6,linux/arm64
|
||||||
|
|
||||||
|
@ -154,6 +157,8 @@ ifdef DEPS_PLAYWRIGHT
|
||||||
PLAYWRIGHT_FLAGS += --with-deps
|
PLAYWRIGHT_FLAGS += --with-deps
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
FORGEJO_API_SPEC := public/forgejo/api.v1.yml
|
||||||
|
|
||||||
SWAGGER_SPEC := templates/swagger/v1_json.tmpl
|
SWAGGER_SPEC := templates/swagger/v1_json.tmpl
|
||||||
SWAGGER_SPEC_S_TMPL := s|"basePath": *"/api/v1"|"basePath": "{{AppSubUrl \| JSEscape \| Safe}}/api/v1"|g
|
SWAGGER_SPEC_S_TMPL := s|"basePath": *"/api/v1"|"basePath": "{{AppSubUrl \| JSEscape \| Safe}}/api/v1"|g
|
||||||
SWAGGER_SPEC_S_JSON := s|"basePath": *"{{AppSubUrl \| JSEscape \| Safe}}/api/v1"|"basePath": "/api/v1"|g
|
SWAGGER_SPEC_S_JSON := s|"basePath": *"{{AppSubUrl \| JSEscape \| Safe}}/api/v1"|"basePath": "/api/v1"|g
|
||||||
|
@ -229,6 +234,8 @@ help:
|
||||||
@echo " - generate-license update license files"
|
@echo " - generate-license update license files"
|
||||||
@echo " - generate-gitignore update gitignore files"
|
@echo " - generate-gitignore update gitignore files"
|
||||||
@echo " - generate-manpage generate manpage"
|
@echo " - generate-manpage generate manpage"
|
||||||
|
@echo " - generate-forgejo-api generate the forgejo API from spec"
|
||||||
|
@echo " - forgejo-api-validate check if the forgejo API matches the specs"
|
||||||
@echo " - generate-swagger generate the swagger spec from code comments"
|
@echo " - generate-swagger generate the swagger spec from code comments"
|
||||||
@echo " - swagger-validate check if the swagger spec is valid"
|
@echo " - swagger-validate check if the swagger spec is valid"
|
||||||
@echo " - go-licenses regenerate go licenses"
|
@echo " - go-licenses regenerate go licenses"
|
||||||
|
@ -314,6 +321,27 @@ ifneq "$(TAGS)" "$(shell cat $(TAGS_EVIDENCE) 2>/dev/null)"
|
||||||
TAGS_PREREQ := $(TAGS_EVIDENCE)
|
TAGS_PREREQ := $(TAGS_EVIDENCE)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
OAPI_CODEGEN_PACKAGE ?= github.com/deepmap/oapi-codegen/cmd/oapi-codegen@v1.12.4
|
||||||
|
KIN_OPENAPI_CODEGEN_PACKAGE ?= github.com/getkin/kin-openapi/cmd/validate@v0.114.0
|
||||||
|
FORGEJO_API_SERVER = routers/api/forgejo/v1/generated.go
|
||||||
|
|
||||||
|
.PHONY: generate-forgejo-api
|
||||||
|
generate-forgejo-api: $(FORGEJO_API_SPEC)
|
||||||
|
$(GO) run $(OAPI_CODEGEN_PACKAGE) -package v1 -generate chi-server,types $< > $(FORGEJO_API_SERVER)
|
||||||
|
|
||||||
|
.PHONY: forgejo-api-check
|
||||||
|
forgejo-api-check: generate-forgejo-api
|
||||||
|
@diff=$$(git diff $(FORGEJO_API_SERVER) ; \
|
||||||
|
if [ -n "$$diff" ]; then \
|
||||||
|
echo "Please run 'make generate-forgejo-api' and commit the result:"; \
|
||||||
|
echo "$${diff}"; \
|
||||||
|
exit 1; \
|
||||||
|
fi
|
||||||
|
|
||||||
|
.PHONY: forgejo-api-validate
|
||||||
|
forgejo-api-validate:
|
||||||
|
$(GO) run $(KIN_OPENAPI_CODEGEN_PACKAGE) $(FORGEJO_API_SPEC)
|
||||||
|
|
||||||
.PHONY: generate-swagger
|
.PHONY: generate-swagger
|
||||||
generate-swagger: $(SWAGGER_SPEC)
|
generate-swagger: $(SWAGGER_SPEC)
|
||||||
|
|
||||||
|
@ -344,7 +372,7 @@ checks: checks-frontend checks-backend
|
||||||
checks-frontend: lockfile-check svg-check
|
checks-frontend: lockfile-check svg-check
|
||||||
|
|
||||||
.PHONY: checks-backend
|
.PHONY: checks-backend
|
||||||
checks-backend: tidy-check swagger-check fmt-check misspell-check swagger-validate security-check
|
checks-backend: tidy-check swagger-check fmt-check misspell-check forgejo-api-validate swagger-validate security-check
|
||||||
|
|
||||||
.PHONY: lint
|
.PHONY: lint
|
||||||
lint: lint-frontend lint-backend
|
lint: lint-frontend lint-backend
|
||||||
|
@ -406,8 +434,7 @@ lint-go-windows:
|
||||||
.PHONY: lint-go-vet
|
.PHONY: lint-go-vet
|
||||||
lint-go-vet:
|
lint-go-vet:
|
||||||
@echo "Running go vet..."
|
@echo "Running go vet..."
|
||||||
@GOOS= GOARCH= $(GO) build code.gitea.io/gitea-vet
|
@$(GO) vet $(GO_PACKAGES)
|
||||||
@$(GO) vet -vettool=gitea-vet $(GO_PACKAGES)
|
|
||||||
|
|
||||||
.PHONY: lint-editorconfig
|
.PHONY: lint-editorconfig
|
||||||
lint-editorconfig:
|
lint-editorconfig:
|
||||||
|
@ -820,7 +847,7 @@ $(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 $@
|
||||||
|
|
||||||
.PHONY: release
|
.PHONY: release
|
||||||
release: frontend generate release-windows release-linux release-darwin release-freebsd release-copy release-compress vendor release-sources release-docs release-check
|
release: frontend generate release-linux release-copy release-compress vendor release-sources release-check
|
||||||
|
|
||||||
$(DIST_DIRS):
|
$(DIST_DIRS):
|
||||||
mkdir -p $(DIST_DIRS)
|
mkdir -p $(DIST_DIRS)
|
||||||
|
@ -837,7 +864,7 @@ endif
|
||||||
|
|
||||||
.PHONY: release-linux
|
.PHONY: release-linux
|
||||||
release-linux: | $(DIST_DIRS)
|
release-linux: | $(DIST_DIRS)
|
||||||
CGO_CFLAGS="$(CGO_CFLAGS)" $(GO) run $(XGO_PACKAGE) -go $(XGO_VERSION) -dest $(DIST)/binaries -tags 'netgo osusergo $(TAGS)' -ldflags '-linkmode external -extldflags "-static" $(LDFLAGS)' -targets '$(LINUX_ARCHS)' -out gitea-$(VERSION) .
|
CGO_CFLAGS="$(CGO_CFLAGS)" $(GO) run $(XGO_PACKAGE) -go $(XGO_VERSION) -dest $(DIST)/binaries -tags 'netgo osusergo $(TAGS)' -ldflags '-linkmode external -extldflags "-static" $(LDFLAGS)' -targets '$(LINUX_ARCHS)' -out forgejo-$(VERSION) .
|
||||||
ifeq ($(CI),true)
|
ifeq ($(CI),true)
|
||||||
cp /build/* $(DIST)/binaries
|
cp /build/* $(DIST)/binaries
|
||||||
endif
|
endif
|
||||||
|
@ -874,8 +901,8 @@ release-sources: | $(DIST_DIRS)
|
||||||
# bsdtar needs a ^ to prevent matching subdirectories
|
# bsdtar needs a ^ to prevent matching subdirectories
|
||||||
$(eval EXCL := --exclude=$(shell tar --help | grep -q bsdtar && echo "^")./)
|
$(eval EXCL := --exclude=$(shell tar --help | grep -q bsdtar && echo "^")./)
|
||||||
# use transform to a add a release-folder prefix; in bsdtar the transform parameter equivalent is -s
|
# use transform to a add a release-folder prefix; in bsdtar the transform parameter equivalent is -s
|
||||||
$(eval TRANSFORM := $(shell tar --help | grep -q bsdtar && echo "-s '/^./gitea-src-$(VERSION)/'" || echo "--transform 's|^./|gitea-src-$(VERSION)/|'"))
|
$(eval TRANSFORM := $(shell tar --help | grep -q bsdtar && echo "-s '/^./forgejo-src-$(VERSION)/'" || echo "--transform 's|^./|forgejo-src-$(VERSION)/|'"))
|
||||||
tar $(addprefix $(EXCL),$(TAR_EXCLUDES)) $(TRANSFORM) -czf $(DIST)/release/gitea-src-$(VERSION).tar.gz .
|
tar $(addprefix $(EXCL),$(TAR_EXCLUDES)) $(TRANSFORM) -czf $(DIST)/release/forgejo-src-$(VERSION).tar.gz .
|
||||||
rm -f $(STORED_VERSION_FILE)
|
rm -f $(STORED_VERSION_FILE)
|
||||||
|
|
||||||
.PHONY: release-docs
|
.PHONY: release-docs
|
||||||
|
|
204
README.md
|
@ -1,180 +1,46 @@
|
||||||
<p align="center">
|
<div align="center">
|
||||||
<a href="https://gitea.io/">
|
<img src="https://codeberg.org/forgejo/meta/raw/branch/readme/logo/forgejo.svg" alt="" width="192" align="center" />
|
||||||
<img alt="Gitea" src="https://raw.githubusercontent.com/go-gitea/gitea/main/public/img/gitea.svg" width="220"/>
|
<h1 align="center">Welcome to Forgejo</h1>
|
||||||
</a>
|
</div>
|
||||||
</p>
|
|
||||||
<h1 align="center">Gitea - Git with a cup of tea</h1>
|
|
||||||
|
|
||||||
<p align="center">
|
Hi there! Tired of big platforms playing monopoly?
|
||||||
<a href="https://drone.gitea.io/go-gitea/gitea" title="Build Status">
|
Providing Git hosting for your project, friends, company or community?
|
||||||
<img src="https://drone.gitea.io/api/badges/go-gitea/gitea/status.svg?ref=refs/heads/main">
|
**Forgejo** (/for'd͡ʒe.jo/ inspired by forĝejo – the Esperanto word for *forge*) has you covered with its intuitive interface,
|
||||||
</a>
|
light and easy hosting and a lot of builtin functionality.
|
||||||
<a href="https://discord.gg/Gitea" title="Join the Discord chat at https://discord.gg/Gitea">
|
|
||||||
<img src="https://img.shields.io/discord/322538954119184384.svg">
|
|
||||||
</a>
|
|
||||||
<a href="https://app.codecov.io/gh/go-gitea/gitea" title="Codecov">
|
|
||||||
<img src="https://codecov.io/gh/go-gitea/gitea/branch/main/graph/badge.svg">
|
|
||||||
</a>
|
|
||||||
<a href="https://goreportcard.com/report/code.gitea.io/gitea" title="Go Report Card">
|
|
||||||
<img src="https://goreportcard.com/badge/code.gitea.io/gitea">
|
|
||||||
</a>
|
|
||||||
<a href="https://pkg.go.dev/code.gitea.io/gitea" title="GoDoc">
|
|
||||||
<img src="https://pkg.go.dev/badge/code.gitea.io/gitea?status.svg">
|
|
||||||
</a>
|
|
||||||
<a href="https://github.com/go-gitea/gitea/releases/latest" title="GitHub release">
|
|
||||||
<img src="https://img.shields.io/github/release/go-gitea/gitea.svg">
|
|
||||||
</a>
|
|
||||||
<a href="https://www.codetriage.com/go-gitea/gitea" title="Help Contribute to Open Source">
|
|
||||||
<img src="https://www.codetriage.com/go-gitea/gitea/badges/users.svg">
|
|
||||||
</a>
|
|
||||||
<a href="https://opencollective.com/gitea" title="Become a backer/sponsor of gitea">
|
|
||||||
<img src="https://opencollective.com/gitea/tiers/backers/badge.svg?label=backers&color=brightgreen">
|
|
||||||
</a>
|
|
||||||
<a href="https://opensource.org/licenses/MIT" title="License: MIT">
|
|
||||||
<img src="https://img.shields.io/badge/License-MIT-blue.svg">
|
|
||||||
</a>
|
|
||||||
<a href="https://gitpod.io/#https://github.com/go-gitea/gitea">
|
|
||||||
<img
|
|
||||||
src="https://img.shields.io/badge/Contribute%20with-Gitpod-908a85?logo=gitpod"
|
|
||||||
alt="Contribute with Gitpod"
|
|
||||||
/>
|
|
||||||
</a>
|
|
||||||
<a href="https://crowdin.com/project/gitea" title="Crowdin">
|
|
||||||
<img src="https://badges.crowdin.net/gitea/localized.svg">
|
|
||||||
</a>
|
|
||||||
<a href="https://www.tickgit.com/browse?repo=github.com/go-gitea/gitea&branch=main" title="TODOs">
|
|
||||||
<img src="https://badgen.net/https/api.tickgit.com/badgen/github.com/go-gitea/gitea/main">
|
|
||||||
</a>
|
|
||||||
<a href="https://app.bountysource.com/teams/gitea" title="Bountysource">
|
|
||||||
<img src="https://img.shields.io/bountysource/team/gitea/activity">
|
|
||||||
</a>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p align="center">
|
Forgejo was [created in 2022](https://forgejo.org/2022-12-15-hello-forgejo/)
|
||||||
<a href="README_ZH.md">View this document in Chinese</a>
|
because we think that the project should be owned by an independent community.
|
||||||
</p>
|
If you second that, then Forgejo is for you!
|
||||||
|
Our promise: **Independent Free/Libre Software forever!**
|
||||||
|
|
||||||
## Purpose
|
## What does Forgejo offer?
|
||||||
|
|
||||||
The goal of this project is to make the easiest, fastest, and most
|
<!-- If you want to know what Forgejo is like,
|
||||||
painless way of setting up a self-hosted Git service.
|
you can check out public instances,
|
||||||
|
e.g. [Codeberg.org](https://codeberg.org).
|
||||||
|
-->
|
||||||
|
|
||||||
As Gitea is written in Go, it works across **all** the platforms and
|
If you like any of the following, Forgejo is literally meant for you:
|
||||||
architectures that are supported by Go, including Linux, macOS, and
|
|
||||||
Windows on x86, amd64, ARM and PowerPC architectures.
|
|
||||||
You can try it out using [the online demo](https://try.gitea.io/).
|
|
||||||
This project has been
|
|
||||||
[forked](https://blog.gitea.io/2016/12/welcome-to-gitea/) from
|
|
||||||
[Gogs](https://gogs.io) since November of 2016, but a lot has changed.
|
|
||||||
|
|
||||||
## Building
|
- Lightweight: Forgejo can easily be hosted on nearly **every machine**.
|
||||||
|
Running on a Raspberry? Small cloud instance? No problem!
|
||||||
|
- Project management: Besides Git hosting, Forgejo offers issues,
|
||||||
|
pull requests, wikis, kanban boards and much more to **coordinate with your team**.
|
||||||
|
- Publishing: Have something to share? Use **releases** to host your software for download,
|
||||||
|
or use the **package registry** to publish it for docker, npm and many other package managers.
|
||||||
|
- Customizable: Want to change your look? Change some settings?
|
||||||
|
There are many **config switches** to make Forgejo work exactly like you want.
|
||||||
|
- Powerful: Organizations & team permissions, CI integration, Code Search, LDAP, OAuth and much more.
|
||||||
|
If you have **advanced needs**, Forgejo has you covered.
|
||||||
|
- Privacy: From update checker to default settings: Forgejo is built to be **privacy first** for you and your crew.
|
||||||
|
- Federation: (WIP) We are actively working to connect software forges with each other through **ActivityPub**,
|
||||||
|
and create a collaborative network of personal instances.
|
||||||
|
|
||||||
From the root of the source tree, run:
|
## Learn more
|
||||||
|
|
||||||
TAGS="bindata" make build
|
Dive into the [documentation](https://forgejo.org/docs/latest/), subscribe to releases and blog post on [our website](https://forgejo.org), <a href="https://floss.social/@forgejo" rel="me">find us on the Fediverse</a> or hop into [our Matrix room](https://matrix.to/#/#forgejo-chat:matrix.org) if you have any questions or want to get involved.
|
||||||
|
|
||||||
or if SQLite support is required:
|
|
||||||
|
|
||||||
TAGS="bindata sqlite sqlite_unlock_notify" make build
|
## Get involved
|
||||||
|
|
||||||
The `build` target is split into two sub-targets:
|
If you are interested in making Forgejo better, either by reporting a bug or by changing the governance, please [take a look at the contribution guide](CONTRIBUTING.md).
|
||||||
|
|
||||||
- `make backend` which requires [Go Stable](https://go.dev/dl/), required version is defined in [go.mod](/go.mod).
|
|
||||||
- `make frontend` which requires [Node.js LTS](https://nodejs.org/en/download/) or greater and Internet connectivity to download npm dependencies.
|
|
||||||
|
|
||||||
When building from the official source tarballs which include pre-built frontend files, the `frontend` target will not be triggered, making it possible to build without Node.js and Internet connectivity.
|
|
||||||
|
|
||||||
Parallelism (`make -j <num>`) is not supported.
|
|
||||||
|
|
||||||
More info: https://docs.gitea.io/en-us/install-from-source/
|
|
||||||
|
|
||||||
## Using
|
|
||||||
|
|
||||||
./gitea web
|
|
||||||
|
|
||||||
NOTE: If you're interested in using our APIs, we have experimental
|
|
||||||
support with [documentation](https://try.gitea.io/api/swagger).
|
|
||||||
|
|
||||||
## Contributing
|
|
||||||
|
|
||||||
Expected workflow is: Fork -> Patch -> Push -> Pull Request
|
|
||||||
|
|
||||||
NOTES:
|
|
||||||
|
|
||||||
1. **YOU MUST READ THE [CONTRIBUTORS GUIDE](CONTRIBUTING.md) BEFORE STARTING TO WORK ON A PULL REQUEST.**
|
|
||||||
2. If you have found a vulnerability in the project, please write privately to **security@gitea.io**. Thanks!
|
|
||||||
|
|
||||||
## Translating
|
|
||||||
|
|
||||||
Translations are done through Crowdin. If you want to translate to a new language ask one of the managers in the Crowdin project to add a new language there.
|
|
||||||
|
|
||||||
You can also just create an issue for adding a language or ask on discord on the #translation channel. If you need context or find some translation issues, you can leave a comment on the string or ask on Discord. For general translation questions there is a section in the docs. Currently a bit empty but we hope to fill it as questions pop up.
|
|
||||||
|
|
||||||
https://docs.gitea.io/en-us/contributing/translation-guidelines/
|
|
||||||
|
|
||||||
[![Crowdin](https://badges.crowdin.net/gitea/localized.svg)](https://crowdin.com/project/gitea)
|
|
||||||
|
|
||||||
## Further information
|
|
||||||
|
|
||||||
For more information and instructions about how to install Gitea, please look at our [documentation](https://docs.gitea.io/en-us/).
|
|
||||||
If you have questions that are not covered by the documentation, you can get in contact with us on our [Discord server](https://discord.gg/Gitea) or create a post in the [discourse forum](https://discourse.gitea.io/).
|
|
||||||
|
|
||||||
We maintain a list of Gitea-related projects at [gitea/awesome-gitea](https://gitea.com/gitea/awesome-gitea).
|
|
||||||
|
|
||||||
The Hugo-based documentation theme is hosted at [gitea/theme](https://gitea.com/gitea/theme).
|
|
||||||
|
|
||||||
The official Gitea CLI is developed at [gitea/tea](https://gitea.com/gitea/tea).
|
|
||||||
|
|
||||||
## Authors
|
|
||||||
|
|
||||||
- [Maintainers](https://github.com/orgs/go-gitea/people)
|
|
||||||
- [Contributors](https://github.com/go-gitea/gitea/graphs/contributors)
|
|
||||||
- [Translators](options/locale/TRANSLATORS)
|
|
||||||
|
|
||||||
## Backers
|
|
||||||
|
|
||||||
Thank you to all our backers! 🙏 [[Become a backer](https://opencollective.com/gitea#backer)]
|
|
||||||
|
|
||||||
<a href="https://opencollective.com/gitea#backers" target="_blank"><img src="https://opencollective.com/gitea/backers.svg?width=890"></a>
|
|
||||||
|
|
||||||
## Sponsors
|
|
||||||
|
|
||||||
Support this project by becoming a sponsor. Your logo will show up here with a link to your website. [[Become a sponsor](https://opencollective.com/gitea#sponsor)]
|
|
||||||
|
|
||||||
<a href="https://opencollective.com/gitea/sponsor/0/website" target="_blank"><img src="https://opencollective.com/gitea/sponsor/0/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/gitea/sponsor/1/website" target="_blank"><img src="https://opencollective.com/gitea/sponsor/1/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/gitea/sponsor/2/website" target="_blank"><img src="https://opencollective.com/gitea/sponsor/2/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/gitea/sponsor/3/website" target="_blank"><img src="https://opencollective.com/gitea/sponsor/3/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/gitea/sponsor/4/website" target="_blank"><img src="https://opencollective.com/gitea/sponsor/4/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/gitea/sponsor/5/website" target="_blank"><img src="https://opencollective.com/gitea/sponsor/5/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/gitea/sponsor/6/website" target="_blank"><img src="https://opencollective.com/gitea/sponsor/6/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/gitea/sponsor/7/website" target="_blank"><img src="https://opencollective.com/gitea/sponsor/7/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/gitea/sponsor/8/website" target="_blank"><img src="https://opencollective.com/gitea/sponsor/8/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/gitea/sponsor/9/website" target="_blank"><img src="https://opencollective.com/gitea/sponsor/9/avatar.svg"></a>
|
|
||||||
<a href="https://cynkra.com/" target="_blank"><img src="https://images.opencollective.com/cynkra/logo/square/64/192.png"></a>
|
|
||||||
|
|
||||||
## FAQ
|
|
||||||
|
|
||||||
**How do you pronounce Gitea?**
|
|
||||||
|
|
||||||
Gitea is pronounced [/ɡɪ’ti:/](https://youtu.be/EM71-2uDAoY) as in "gi-tea" with a hard g.
|
|
||||||
|
|
||||||
**Why is this not hosted on a Gitea instance?**
|
|
||||||
|
|
||||||
We're [working on it](https://github.com/go-gitea/gitea/issues/1029).
|
|
||||||
|
|
||||||
## License
|
|
||||||
|
|
||||||
This project is licensed under the MIT License.
|
|
||||||
See the [LICENSE](https://github.com/go-gitea/gitea/blob/main/LICENSE) file
|
|
||||||
for the full license text.
|
|
||||||
|
|
||||||
## Screenshots
|
|
||||||
|
|
||||||
Looking for an overview of the interface? Check it out!
|
|
||||||
|
|
||||||
|![Dashboard](https://dl.gitea.io/screenshots/home_timeline.png)|![User Profile](https://dl.gitea.io/screenshots/user_profile.png)|![Global Issues](https://dl.gitea.io/screenshots/global_issues.png)|
|
|
||||||
|:---:|:---:|:---:|
|
|
||||||
|![Branches](https://dl.gitea.io/screenshots/branches.png)|![Web Editor](https://dl.gitea.io/screenshots/web_editor.png)|![Activity](https://dl.gitea.io/screenshots/activity.png)|
|
|
||||||
|![New Migration](https://dl.gitea.io/screenshots/migration.png)|![Migrating](https://dl.gitea.io/screenshots/migration.gif)|![Pull Request View](https://image.ibb.co/e02dSb/6.png)
|
|
||||||
![Pull Request Dark](https://dl.gitea.io/screenshots/pull_requests_dark.png)|![Diff Review Dark](https://dl.gitea.io/screenshots/review_dark.png)|![Diff Dark](https://dl.gitea.io/screenshots/diff_dark.png)|
|
|
||||||
|
|
98
README_ZH.md
|
@ -1,98 +0,0 @@
|
||||||
<p align="center">
|
|
||||||
<a href="https://gitea.io/">
|
|
||||||
<img alt="Gitea" src="https://raw.githubusercontent.com/go-gitea/gitea/main/public/img/gitea.svg" width="220"/>
|
|
||||||
</a>
|
|
||||||
</p>
|
|
||||||
<h1 align="center">Gitea - Git with a cup of tea</h1>
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<a href="https://drone.gitea.io/go-gitea/gitea" title="Build Status">
|
|
||||||
<img src="https://drone.gitea.io/api/badges/go-gitea/gitea/status.svg?ref=refs/heads/main">
|
|
||||||
</a>
|
|
||||||
<a href="https://discord.gg/Gitea" title="Join the Discord chat at https://discord.gg/Gitea">
|
|
||||||
<img src="https://img.shields.io/discord/322538954119184384.svg">
|
|
||||||
</a>
|
|
||||||
<a href="https://app.codecov.io/gh/go-gitea/gitea" title="Codecov">
|
|
||||||
<img src="https://codecov.io/gh/go-gitea/gitea/branch/main/graph/badge.svg">
|
|
||||||
</a>
|
|
||||||
<a href="https://goreportcard.com/report/code.gitea.io/gitea" title="Go Report Card">
|
|
||||||
<img src="https://goreportcard.com/badge/code.gitea.io/gitea">
|
|
||||||
</a>
|
|
||||||
<a href="https://pkg.go.dev/code.gitea.io/gitea" title="GoDoc">
|
|
||||||
<img src="https://pkg.go.dev/badge/code.gitea.io/gitea?status.svg">
|
|
||||||
</a>
|
|
||||||
<a href="https://github.com/go-gitea/gitea/releases/latest" title="GitHub release">
|
|
||||||
<img src="https://img.shields.io/github/release/go-gitea/gitea.svg">
|
|
||||||
</a>
|
|
||||||
<a href="https://www.codetriage.com/go-gitea/gitea" title="Help Contribute to Open Source">
|
|
||||||
<img src="https://www.codetriage.com/go-gitea/gitea/badges/users.svg">
|
|
||||||
</a>
|
|
||||||
<a href="https://opencollective.com/gitea" title="Become a backer/sponsor of gitea">
|
|
||||||
<img src="https://opencollective.com/gitea/tiers/backers/badge.svg?label=backers&color=brightgreen">
|
|
||||||
</a>
|
|
||||||
<a href="https://opensource.org/licenses/MIT" title="License: MIT">
|
|
||||||
<img src="https://img.shields.io/badge/License-MIT-blue.svg">
|
|
||||||
</a>
|
|
||||||
<a href="https://gitpod.io/#https://github.com/go-gitea/gitea">
|
|
||||||
<img
|
|
||||||
src="https://img.shields.io/badge/Contribute%20with-Gitpod-908a85?logo=gitpod"
|
|
||||||
alt="Contribute with Gitpod"
|
|
||||||
/>
|
|
||||||
</a>
|
|
||||||
<a href="https://crowdin.com/project/gitea" title="Crowdin">
|
|
||||||
<img src="https://badges.crowdin.net/gitea/localized.svg">
|
|
||||||
</a>
|
|
||||||
<a href="https://www.tickgit.com/browse?repo=github.com/go-gitea/gitea&branch=main" title="TODOs">
|
|
||||||
<img src="https://badgen.net/https/api.tickgit.com/badgen/github.com/go-gitea/gitea/main">
|
|
||||||
</a>
|
|
||||||
<a href="https://app.bountysource.com/teams/gitea" title="Bountysource">
|
|
||||||
<img src="https://img.shields.io/bountysource/team/gitea/activity">
|
|
||||||
</a>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<a href="README.md">View this document in English</a>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
## 目标
|
|
||||||
|
|
||||||
Gitea 的首要目标是创建一个极易安装,运行非常快速,安装和使用体验良好的自建 Git 服务。我们采用 Go 作为后端语言,这使我们只要生成一个可执行程序即可。并且他还支持跨平台,支持 Linux, macOS 和 Windows 以及各种架构,除了 x86,amd64,还包括 ARM 和 PowerPC。
|
|
||||||
|
|
||||||
如果您想试用一下,请访问 [在线Demo](https://try.gitea.io/)!
|
|
||||||
|
|
||||||
## 提示
|
|
||||||
|
|
||||||
1. **开始贡献代码之前请确保你已经看过了 [贡献者向导(英文)](CONTRIBUTING.md)**.
|
|
||||||
2. 所有的安全问题,请私下发送邮件给 **security@gitea.io**。谢谢!
|
|
||||||
3. 如果你要使用API,请参见 [API 文档](https://godoc.org/code.gitea.io/sdk/gitea).
|
|
||||||
|
|
||||||
## 文档
|
|
||||||
|
|
||||||
关于如何安装请访问我们的 [文档站](https://docs.gitea.io/zh-cn/),如果没有找到对应的文档,你也可以通过 [Discord - 英文](https://discord.gg/gitea) 和 QQ群 328432459 来和我们交流。
|
|
||||||
|
|
||||||
## 贡献流程
|
|
||||||
|
|
||||||
Fork -> Patch -> Push -> Pull Request
|
|
||||||
|
|
||||||
## 翻译
|
|
||||||
|
|
||||||
多语言翻译是基于Crowdin进行的.
|
|
||||||
[![Crowdin](https://badges.crowdin.net/gitea/localized.svg)](https://crowdin.com/project/gitea)
|
|
||||||
|
|
||||||
## 作者
|
|
||||||
|
|
||||||
* [Maintainers](https://github.com/orgs/go-gitea/people)
|
|
||||||
* [Contributors](https://github.com/go-gitea/gitea/graphs/contributors)
|
|
||||||
* [Translators](options/locale/TRANSLATORS)
|
|
||||||
|
|
||||||
## 授权许可
|
|
||||||
|
|
||||||
本项目采用 MIT 开源授权许可证,完整的授权说明已放置在 [LICENSE](https://github.com/go-gitea/gitea/blob/main/LICENSE) 文件中。
|
|
||||||
|
|
||||||
## 截图
|
|
||||||
|
|
||||||
|![Dashboard](https://dl.gitea.io/screenshots/home_timeline.png)|![User Profile](https://dl.gitea.io/screenshots/user_profile.png)|![Global Issues](https://dl.gitea.io/screenshots/global_issues.png)|
|
|
||||||
|:---:|:---:|:---:|
|
|
||||||
|![Branches](https://dl.gitea.io/screenshots/branches.png)|![Web Editor](https://dl.gitea.io/screenshots/web_editor.png)|![Activity](https://dl.gitea.io/screenshots/activity.png)|
|
|
||||||
|![New Migration](https://dl.gitea.io/screenshots/migration.png)|![Migrating](https://dl.gitea.io/screenshots/migration.gif)|![Pull Request View](https://image.ibb.co/e02dSb/6.png)
|
|
||||||
![Pull Request Dark](https://dl.gitea.io/screenshots/pull_requests_dark.png)|![Diff Review Dark](https://dl.gitea.io/screenshots/review_dark.png)|![Diff Dark](https://dl.gitea.io/screenshots/diff_dark.png)|
|
|
808
RELEASE-NOTES.md
Normal file
|
@ -0,0 +1,808 @@
|
||||||
|
# Release Notes
|
||||||
|
|
||||||
|
A Forgejo release is published shortly after a Gitea release is published and they have [matching release numbers](https://codeberg.org/forgejo/forgejo/src/branch/forgejo/CONTRIBUTING/RELEASE.md#release-numbering). Additional Forgejo releases may be published to address urgent security issues or bug fixes. Forgejo release notes include all Gitea release notes.
|
||||||
|
|
||||||
|
The Forgejo admin should carefully read the required manual actions before upgrading. A point release (e.g. v1.19.1 or v1.19.2) does not require manual actions but others might (e.g. v1.18.0, v1.19.0).
|
||||||
|
|
||||||
|
## 1.19.3-0
|
||||||
|
|
||||||
|
The [complete list of commits](https://codeberg.org/forgejo/forgejo/commits/branch/v1.19/forgejo) included in the `Forgejo v1.19.3-0` release can be reviewed from the command line with:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
$ git clone https://codeberg.org/forgejo/forgejo/
|
||||||
|
$ git -C forgejo log --oneline --no-merges v1.19.2-0..v1.19.3-0
|
||||||
|
```
|
||||||
|
|
||||||
|
This stable release contains security fixes.
|
||||||
|
|
||||||
|
* Recommended Action
|
||||||
|
|
||||||
|
We recommend that all Forgejo installations are upgraded to the latest version.
|
||||||
|
|
||||||
|
* [Forgejo Semantic Version](https://forgejo.org/docs/v1.19/user/semver/)
|
||||||
|
|
||||||
|
The semantic version was updated from `4.2.0+0-gitea-1.19.2` to `4.2.1+0-gitea-1.19.3` because of the rebuild with [Go version 1.20.4](https://github.com/golang/go/issues?q=milestone%3AGo1.20.4+label%3ACherryPickApproved).
|
||||||
|
|
||||||
|
* Security fixes
|
||||||
|
|
||||||
|
* Forgejo was recompiled with Go version v1.20.4 published 2 May 2023. It fixes [three vulnerabilities](https://github.com/golang/go/issues?q=milestone%3AGo1.20.4+label%3ACherryPickApproved) ([CVE-2023-29400](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2023-29400), [CVE-2023-24540](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2023-24540), [CVE-2023-24539](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2023-24539)) related to the [html/template](https://pkg.go.dev/html/template) package. The [Forgejo security team](https://forgejo.org/.well-known/security.txt) analyzed the security fixes it contains and concluded that Forgejo is not affected but recommended a rebuild as a precaution.
|
||||||
|
|
||||||
|
* Bug fixes
|
||||||
|
|
||||||
|
The most prominent one is described here, others can be found in the list of commits included in the release as described above.
|
||||||
|
|
||||||
|
* [Allow users that are not signed in to browse the tag list](https://codeberg.org/forgejo/forgejo/commit/e76b3f72b23bf778a562682d829744451b27d615). Requiring users to be signed in to view the tag list was a regression introduced in Forgejo v1.19.2-0.
|
||||||
|
|
||||||
|
## 1.19.2-0
|
||||||
|
|
||||||
|
The [complete list of commits](https://codeberg.org/forgejo/forgejo/commits/branch/v1.19/forgejo) included in the `Forgejo v1.19.2-0` release can be reviewed from the command line with:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
$ git clone https://codeberg.org/forgejo/forgejo/
|
||||||
|
$ git -C forgejo log --oneline --no-merges v1.19.1-0..v1.19.2-0
|
||||||
|
```
|
||||||
|
|
||||||
|
This stable release contains **important security fixes**.
|
||||||
|
|
||||||
|
* Recommended Action
|
||||||
|
|
||||||
|
We **strongly recommend** that all Forgejo installations are upgraded to the latest version as soon as possible.
|
||||||
|
|
||||||
|
* [Forgejo Semantic Version](https://forgejo.org/docs/v1.19/user/semver/)
|
||||||
|
|
||||||
|
The semantic version was updated from `4.1.0+0-gitea-1.19.1` to `4.2.0+0-gitea-1.19.2` because of the changes introduced in the internal CI.
|
||||||
|
|
||||||
|
* Security fixes
|
||||||
|
|
||||||
|
* Token scopes were not enforced in some cases ([patch 1](https://codeberg.org/forgejo/forgejo/commit/7c3ac69c0) and [patch 2](https://codeberg.org/forgejo/forgejo/commit/10d3ed53f1cc6d383b52637bedd7bc3679476eb4)). The [scoped token](https://forgejo.org/docs/v1.19/user/oauth2-provider/#scoped-tokens) were introduced in Forgejo v1.19 allow for the creation of application tokens that only have limited permissions, such as creating packages or accessing repositories. Prior to Forgejo v1.19 tokens could be used to perform any operation the user issuing the token could.
|
||||||
|
* [Permissions to delete secrets was not enforced](https://codeberg.org/forgejo/forgejo/commit/68d80eb56). The experimental internal CI relies on secrets managed via the web interface, for instance to communicate credentials to a job. Secrets are only used in the context of the experimental internal CI.
|
||||||
|
|
||||||
|
* Bug fixes
|
||||||
|
|
||||||
|
The most prominent ones are described here, others can be found in the list of commits included in the release as described above.
|
||||||
|
|
||||||
|
* [Restore public access to some API endpoints](https://codeberg.org/forgejo/forgejo/commit/b00f7c3c545c6a00a747a5aea7596f45c50157ac). When [scoped token](https://forgejo.org/docs/v1.19/user/oauth2-provider/#scoped-tokens) introduced in Forgejo v1.19, some API endpoints that were previously accessible anonymously became restricted: `/orgs`, `/orgs/{org}`, `/orgs/{org}/repos`, `/orgs/{org}/public_members`, `/orgs/{org}/public_members/{username}`, `/orgs/{org}/labels`.
|
||||||
|
* [Fix 2-dot direct compare to use the right base commit](https://codeberg.org/forgejo/forgejo/commit/494e373292962de34b7ea7efd3f4a8d2f27daa26). For 2-dot direct compare, the base commit should be used in the title and templates, as is used elsewhere, not the common ancestor which is used for 3-dot compare.
|
||||||
|
* [Make CORS work](https://codeberg.org/forgejo/forgejo/commit/2e6e5bc9c96ebb760f28c08423bb0c244ca7e01c). No [CORS](https://en.wikipedia.org/wiki/Cross-origin_resource_sharing) headers were set, even if CORS was enabled in the configuration.
|
||||||
|
* [Fix issue attachment removal](https://codeberg.org/forgejo/forgejo/commit/d5f2c9d74d63443cc2abbcabc268cf1121f58e8b). When an attachment was removed from an issue or review comment, all of the image/attachment links were broken.
|
||||||
|
* [Fix wiki write permissions for users who do not have repository write permissions](https://codeberg.org/forgejo/forgejo/commit/8c465206e2fea27076fdb986ea0478729653f0b5). When a team member had write access to the wiki but not to the code repository, some operations (deleting a page for instance) were denied.
|
||||||
|
* [Respect the REGISTER_MANUAL_CONFIRM setting when registering via OAuth](https://codeberg.org/forgejo/forgejo/commit/116b6d5b27c40b248281f5fd543f7aa8df0d59d3). Contrary to the local registration, the OAuth registration flow activated a newly registered user regardless of the value of `REGISTER_MANUAL_CONFIRM`.
|
||||||
|
* [Fix tags list for repos whose release setting is disabled](https://codeberg.org/forgejo/forgejo/commit/eeee32cdc3aab4d2086b24aae670a39501c9ea99). When releases was disabled the "tags" button led to a `Not Found` page, even when tags existed.
|
||||||
|
|
||||||
|
* Container image upgrades
|
||||||
|
|
||||||
|
In the Forgejo container images the Git version was upgraded to [2.38.5](https://github.com/git/git/blob/master/Documentation/RelNotes/2.38.5.txt) as a precaution. The [Forgejo security team](https://forgejo.org/.well-known/security.txt) analyzed the security fixes it contains and concluded that Forgejo is not affected.
|
||||||
|
|
||||||
|
## 1.19.1-0
|
||||||
|
|
||||||
|
The [complete list of commits](https://codeberg.org/forgejo/forgejo/commits/branch/v1.19/forgejo) included in the `Forgejo v1.19.1-0` release can be reviewed from the command line with:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
$ git clone https://codeberg.org/forgejo/forgejo/
|
||||||
|
$ git -C forgejo log --oneline --no-merges v1.19.0-3..v1.19.1-0
|
||||||
|
```
|
||||||
|
|
||||||
|
This stable release includes bug fixes. Functional changes related to the experimental CI have also been backported.
|
||||||
|
|
||||||
|
* Recommended Action
|
||||||
|
|
||||||
|
We recommend that all installations are upgraded to the latest version.
|
||||||
|
|
||||||
|
* [Forgejo Semantic Version](https://forgejo.org/docs/v1.19/user/semver/)
|
||||||
|
|
||||||
|
The semantic version was updated from `4.0.0+0-gitea-1.19.0` to `4.1.0+0-gitea-1.19.1` because of the changes introduced in the internal CI.
|
||||||
|
|
||||||
|
* Bug fixes
|
||||||
|
|
||||||
|
The most prominent ones are described here, others can be found in the list of commits included in the release as described above.
|
||||||
|
|
||||||
|
* [Fix RSS/ATOM/GPG/KEYS path for users (or orgs) with a dot in their name](https://codeberg.org/forgejo/forgejo/commit/085b56302cfd9a949319a3a1e32e008b4a0d0772). It is allowed for a user (or an organization) to have a dot in their name, for instance `user.name`. Because of a [bug in Chi](https://codeberg.org/forgejo/forgejo/issues/652) it was not possible to access `/user.name.png`, `/user.name.gpg`, etc. A workaround was implemented while a [proper fix is being discussed](https://github.com/go-chi/chi/pull/811).
|
||||||
|
* [Creating a tag via the web interface no longer requires a title](https://codeberg.org/forgejo/forgejo/commit/1b8ecd179bdb58427b99c2c2eb9ad5a45abf7055).
|
||||||
|
* [Use fully qualified URLs in Dockerfile](https://codeberg.org/forgejo/forgejo/commit/833a4b177596debc138e5723219fd063d067bd5b). The Dockerfile to create the Forgejo container image now uses the fully qualified image `docker.io/library/golang:1.20-alpine3.17` instead of `golang:1.20-alpine3.17`. This allows for building on platforms that don't have docker hub as the default container registry.
|
||||||
|
* [Redis use Get/Set instead of Rename when Regenerate session id](https://codeberg.org/forgejo/forgejo/commit/3a7cb1a83b4ecd89421b5656b8caeb30c2b13c7c). The old sid and new sid may be in different redis cluster slot.
|
||||||
|
* [Do not escape space between PyPI repository url and package name](https://codeberg.org/forgejo/forgejo/commit/cfde557e231417b7fb3cde3e9bab70d05b7d182f). It also adds a trailing slash to the PyPI repository URL in accordance to [Python PEP-503](https://peps.python.org/pep-0503/).
|
||||||
|
* [Fix failure when using the API and an empty rule_name to protect a branch](https://codeberg.org/forgejo/forgejo/commit/abf0386e2ef6b56c048c04cd3d6913f453c87cb1). The `rule_name` parameter for the [/repos/{owner}/{repo}/branch_protections](https://code.forgejo.org/api/swagger#/repository/repoCreateBranchProtection) API now defaults to the branch name instead of being empty.
|
||||||
|
* [Fix branch protection priority](https://codeberg.org/forgejo/forgejo/commit/580da8f35320dbd15b168bf8ccfaff6187ff87e0). Contrary to [the documentation](https://forgejo.org/docs/v1.19/user/protection/#protected-branches) it was possible for a glob rule to take precedence over a non-glob rule.
|
||||||
|
* [Fix deleting an issue when the git repo does not exist](https://codeberg.org/forgejo/forgejo/commit/1d8ae34e57e46b84a885b4f072d949344c5977c4). If a project had an issue tracker (such as the [Forgejo discussion](https://codeberg.org/forgejo/discussions/issues)) but [no git repository](https://codeberg.org/forgejo/discussions/), trying to delete an issue would fail.
|
||||||
|
* [Fix accidental overwriting of LDAP team memberships](https://codeberg.org/forgejo/forgejo/commit/66aa85429684aca45753ac9578492ed3f7507ea3). If an LDAP user is a member of two groups, the LDAP group sync only matched the last group.
|
||||||
|
|
||||||
|
## 1.19.0-3
|
||||||
|
|
||||||
|
The [complete list of commits](https://codeberg.org/forgejo/forgejo/commits/branch/v1.19/forgejo) included in the `Forgejo v1.19.0-3` release can be reviewed from the command line with:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
$ git clone https://codeberg.org/forgejo/forgejo/
|
||||||
|
$ git -C forgejo log --oneline --no-merges v1.19.0-2..v1.19.0-3
|
||||||
|
```
|
||||||
|
|
||||||
|
This stable release includes security updates and bug fixes.
|
||||||
|
|
||||||
|
* Recommended Action
|
||||||
|
|
||||||
|
We recommend that all installations are upgraded to the latest version.
|
||||||
|
|
||||||
|
* Security
|
||||||
|
|
||||||
|
The [Forgejo security team](https://forgejo.org/.well-known/security.txt) analyzed the vulnerabilities fixed in the latest [Go 1.20.3 packages](https://go.dev/doc/devel/release#go1.20.minor) and [Alpine 3.17.3](https://alpinelinux.org/posts/Alpine-3.17.3-released.html) and concluded that Forgejo is not affected.
|
||||||
|
|
||||||
|
As a precaution the Forgejo v1.19.0-3 binaries were compiled with [Go 1.20.3 packages](https://go.dev/doc/devel/release#go1.20.minor) as published on 4 April 2023 and the container images were built with [Alpine 3.17.3](https://alpinelinux.org/posts/Alpine-3.17.3-released.html) as published on 29 March 2023.
|
||||||
|
|
||||||
|
* [Forgejo Semantic Version](https://forgejo.org/docs/v1.19/user/semver/)
|
||||||
|
|
||||||
|
The semantic version was updated from `3.0.0+0-gitea-1.19.0` to `4.0.0+0-gitea-1.19.0` because of the breaking changes described below.
|
||||||
|
|
||||||
|
* Breaking changes
|
||||||
|
|
||||||
|
They should not have a significant impact because they are related to experimental features (federation and CI).
|
||||||
|
|
||||||
|
* [Use User.ID instead of User.Name in ActivityPub API for Person IRI](https://codeberg.org/forgejo/forgejo/commit/2fcd57d5ae5b5926e5b0b87e46f78ad4ac83cbbd)
|
||||||
|
|
||||||
|
The ActivityPub id is an HTTPS URI that should remain constant, even if
|
||||||
|
the user changes their name.
|
||||||
|
|
||||||
|
* [Actions unit is repo.actions instead of actions.actions](https://codeberg.org/forgejo/forgejo/commit/9596bd3712caec440859fce93d05e19cf95e5330)
|
||||||
|
|
||||||
|
All instances of `actions.actions` in the `DISABLED_REPO_UNITS` or `DEFAULT_REPO_UNITS` configuration variables must be replaced with `repo.actions`.
|
||||||
|
|
||||||
|
* Bug fixes
|
||||||
|
|
||||||
|
They are for the most part about user interface and actions. The most prominent ones are:
|
||||||
|
|
||||||
|
* [Do not filter repositories by default on the explore page](https://codeberg.org/forgejo/forgejo/commit/d15f20b2d2ce613cc8b36536995f29f81797c002). The behavior of the explore page is back to what it was in Forgejo v1.18. Changing it was confusing.
|
||||||
|
* [Skip LFS when disabled in dump and doctor](https://codeberg.org/forgejo/forgejo/commit/b6a2323981a7a89205a382ddf0542e205e292d3d).
|
||||||
|
* [Do not display own email on the profile](https://codeberg.org/forgejo/forgejo/commit/1fed0e1adc8dd2d27d2d7e34dda29c8e79e5e6e8).
|
||||||
|
* [Make minio package support legacy MD5 checksum](https://codeberg.org/forgejo/forgejo/commit/b73d1ac1eb7d5c985749dc721bbea7ebd14f9c83).
|
||||||
|
* [Do not triggers Webhooks and actions on closed PR](https://codeberg.org/forgejo/forgejo/commit/a04535e212b04c0f6643a4f36904a3d1bf30c63f).
|
||||||
|
|
||||||
|
## 1.19.0-2
|
||||||
|
|
||||||
|
The [complete list of commits](https://codeberg.org/forgejo/forgejo/commits/branch/v1.19/forgejo) included in the `Forgejo v1.19.0-2` release can be reviewed from the command line with:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
$ git clone https://codeberg.org/forgejo/forgejo/
|
||||||
|
$ git -C forgejo log --oneline --no-merges origin/v1.18/forgejo..origin/v1.19/forgejo
|
||||||
|
```
|
||||||
|
|
||||||
|
* Breaking changes
|
||||||
|
* [Scoped access tokens](https://codeberg.org/forgejo/forgejo/commit/de484e86bc)
|
||||||
|
|
||||||
|
Forgejo access token, used with the [API](https://forgejo.org/docs/v1.19/admin/api-usage/) can now have a "scope" that limits what it can access. Existing tokens stored in the database and created before Forgejo v1.19 had unlimited access. For backward compatibility, their access will remain the same and they will continue to work as before. However, **newly created token that do not specify a scope will now only have read-only access to public user profile and public repositories**.
|
||||||
|
|
||||||
|
For instance, the `/users/{username}/tokens` API endpoint will require the `scopes: ['all', 'sudo']` parameter and the `forgejo admin user generate-access-token` will require the `--scopes all,sudo` argument obtain tokens with ulimited access as before for admin users.
|
||||||
|
|
||||||
|
[Read more about the scoped tokens](https://forgejo.org/docs/v1.19/user/oauth2-provider/#scoped-tokens).
|
||||||
|
|
||||||
|
* [Disable all units except code and pulls on forks](https://codeberg.org/forgejo/forgejo/commit/2741546be)
|
||||||
|
|
||||||
|
When forking a repository, the fork will now have issues, projects, releases, packages and wiki disabled. These can be enabled in the repository settings afterwards. To change back to the previous default behavior, configure `DEFAULT_FORK_REPO_UNITS` to be the same value as `DEFAULT_REPO_UNITS`.
|
||||||
|
|
||||||
|
* [Filter repositories by default on the explore page](https://codeberg.org/forgejo/forgejo/commit/4d20a4a1b)
|
||||||
|
|
||||||
|
The explore page now always filters out repositories that are considered not relevant because they are either forks or have no topic and not description and no icon. A link is shown to display all repositories, unfiltered.
|
||||||
|
|
||||||
|
<img src="./releases/images/forgejo-v1.19-relevant.png" alt="Explore repositories" width="600" />
|
||||||
|
|
||||||
|
* [Remove deprecated DSA host key from Docker Container](https://codeberg.org/forgejo/forgejo/commit/f17edfaf5a31ea3f4e9152424b75c2c4986acbe3)
|
||||||
|
Since OpenSSH 7.0 and greater similarly disable the ssh-dss (DSA) public key algorithm, and recommend against its use. http://www.openssh.com/legacy.html
|
||||||
|
|
||||||
|
* Additional restrictions on valid user names
|
||||||
|
|
||||||
|
The algorithm for validating user names was modified and some users may have invalid names. The command `forgejo doctor --run check-user-names` will list all of them so they can be renamed.
|
||||||
|
|
||||||
|
If a Forgejo instance has users or organizations named `forgejo-actions` and `gitea-actions`, they will also need to be renamed before the upgrade. They are now reserved names for the experimental internal CI/CD named `Actions`.
|
||||||
|
|
||||||
|
* [Semantic version](https://forgejo.org/docs/latest/user/semver)
|
||||||
|
|
||||||
|
Since v1.18.5, in addition to the Forgejo release number, a [semantic version](https://semver.org/#semantic-versioning-200) number (e.g. `v3.0.0`) can be obtained from the `number` key of a new `/api/forgejo/v1/version` endpoint.
|
||||||
|
|
||||||
|
Now, it reflects the Gitea version that Forgejo depends on, is no longer prefixed with `v` (e.g. `3.0.0+0-gitea-1.19.0`), and can be obtained from the `version` key of the same endpoint.
|
||||||
|
* Features
|
||||||
|
|
||||||
|
* [Documentation](https://forgejo.org/docs/latest/)
|
||||||
|
The first version of the [Forgejo documentation](https://forgejo.org/docs/latest/) is available and covers the administration of Forgejo, from installation to troubleshooting.
|
||||||
|
|
||||||
|
[Read more about semantic versions](https://forgejo.codeberg.page/docs/v1.19/user/semver)
|
||||||
|
|
||||||
|
* [Webhook authorization header](https://codeberg.org/forgejo/forgejo/commit/b6e81357bd6fb80f8ba94c513f89a210beb05313)
|
||||||
|
Forgejo webhooks can be configured to send an [authorization header](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Authorization) to the target.
|
||||||
|
|
||||||
|
[Read more about the webhook authorization header](https://forgejo.codeberg.page/docs/v1.19/user/webhooks/#authorization-header)
|
||||||
|
|
||||||
|
* [Incoming emails](https://codeberg.org/forgejo/forgejo/commit/fc037b4b825f0501a1489e10d7c822435d825cb7)
|
||||||
|
You can now set up Forgejo to receive incoming email. When enabled, it is now possible to reply to an email notification from Forgejo and:
|
||||||
|
* Add a comment to an issue or a pull request
|
||||||
|
* Unsubscribe to the notifications
|
||||||
|
|
||||||
|
[Read more about incoming emails](https://forgejo.org/docs/v1.19/admin/incoming-email/)
|
||||||
|
|
||||||
|
* Packages registries
|
||||||
|
* Support for [Cargo](https://forgejo.org/docs/v1.19/admin/packages/cargo/), [Conda](https://forgejo.org/docs/v1.19/admin/packages/conda/) and [Chef](https://forgejo.org/docs/v1.19/admin/packages/chef/)
|
||||||
|
* [Cleanup rules](https://codeberg.org/forgejo/forgejo/commit/32db62515)
|
||||||
|
* [Quota limits](https://codeberg.org/forgejo/forgejo/commit/20674dd05)
|
||||||
|
|
||||||
|
* [Option to prohibit fork if user reached maximum limit of repositories](https://codeberg.org/forgejo/forgejo/commit/7cc7db73b)
|
||||||
|
It is possible for a user to create as many fork as they want, even when a quota on the number of repositories is imposed. The new `ALLOW_FORK_WITHOUT_MAXIMUM_LIMIT` setting can now be set to `false` so forks are prohibited if that means exceeding the quota.
|
||||||
|
|
||||||
|
[Read more about repository configurations](https://forgejo.org/docs/v1.19/admin/config-cheat-sheet/#repository-repository)
|
||||||
|
|
||||||
|
* [Scoped labels](https://codeberg.org/forgejo/forgejo/commit/6221a6fd5)
|
||||||
|
Labels that contain a forward slash (**/**) separator are displayed with a slightly different color before and after the separator, as a visual aid. The first part of the label defines its "scope".
|
||||||
|
|
||||||
|
[Read more about scoped labels](https://forgejo.org/docs/v1.19/user/labels/).
|
||||||
|
|
||||||
|
* [Support org/user level projects](https://codeberg.org/forgejo/forgejo/commit/6fe3c8b39)
|
||||||
|
It is now possible to create projects (kanban boards) for an organization or a user, in the same way it was possible for an individual repository.
|
||||||
|
|
||||||
|
* [Map OIDC groups to Orgs/Teams](https://codeberg.org/forgejo/forgejo/commit/e8186f1c0)
|
||||||
|
When a user logs in Forgejo using an provider such as [Keycloak](https://www.keycloak.org/), they can now automatically be part of a Forgejo team, depending on the OIDC group they belong to. For instance:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{"Developer": {"MyForgejoOrganization": ["MyForgejoTeam1", "MyForgejoTeam2"]}}
|
||||||
|
```
|
||||||
|
|
||||||
|
Means that the user who is in the OIDC group `Developer` will automatically be a member of the `MyForgejoTeam1` and `MyForgejoTeam2` teams in the `MyForgejoOrganization` organization.
|
||||||
|
This mapping is set when adding a new `Authentication Source` in the `Site Administration` panel.
|
||||||
|
|
||||||
|
<img src="./releases/images/forgejo-v1.19-oidc-part1.png" alt="OIDC Group mapping part1" width="500" />
|
||||||
|
|
||||||
|
...
|
||||||
|
|
||||||
|
<img src="./releases/images/forgejo-v1.19-oidc-part2.png" alt="OIDC Group mapping part2" width="500" />
|
||||||
|
|
||||||
|
[Read more about OIDC groups mapping](https://forgejo.org/docs/v1.19/user/oauth2-provider/#endpoints)
|
||||||
|
|
||||||
|
* [RSS feed for releases and tags](https://codeberg.org/forgejo/forgejo/commit/48d71b7d6)
|
||||||
|
|
||||||
|
A RSS feed is now available for releases at `/{owner}/{repo}/releases.rss` and tags at `/{owner}/{repo}/tags.rss`.
|
||||||
|
|
||||||
|
* [Supports wildcard protected branch](https://codeberg.org/forgejo/forgejo/commit/2782c1439)
|
||||||
|
|
||||||
|
Instead of selecting a branch to be protected, the name of the branch must be specified and can be a pattern such as `precious*`.
|
||||||
|
|
||||||
|
[Read more about branch protection](https://forgejo.org/docs/v1.19/user/protection/#protected-branches).
|
||||||
|
|
||||||
|
* [Garbage collect LFS](https://codeberg.org/forgejo/forgejo/commit/651fe4bb7)
|
||||||
|
Add a doctor command for full garbage collection of LFS: `forgejo doctor --run gc-lfs`.
|
||||||
|
|
||||||
|
* Additions to the API
|
||||||
|
|
||||||
|
* [Management for issue/pull and comment attachments](https://codeberg.org/forgejo/forgejo/commit/3c59d31bc)
|
||||||
|
* [Get latest release](https://codeberg.org/forgejo/forgejo/commit/4d072a4c4)
|
||||||
|
* [System hook](https://codeberg.org/forgejo/forgejo/commit/c0015979a)
|
||||||
|
|
||||||
|
* [Option to disable releases on a repository](https://codeberg.org/forgejo/forgejo/commit/faa96553d)
|
||||||
|
|
||||||
|
It is now possible to disable releases on a repository, in the same way it is possible to disable issues or packages.
|
||||||
|
|
||||||
|
* [Git reflog support](https://codeberg.org/forgejo/forgejo/commit/757b4c17e)
|
||||||
|
The [git reflog](https://git-scm.com/docs/git-reflog) are now active by default on all repositories and
|
||||||
|
kept around for 90 days. It allows the Forgejo admin to recover the previous tip of a branch after an
|
||||||
|
accidental force push.
|
||||||
|
|
||||||
|
[Read more about reflog](https://forgejo.org/docs/v1.19/admin/config-cheat-sheet/#git---reflog-settings-gitreflog)
|
||||||
|
|
||||||
|
* [Actions](https://codeberg.org/forgejo/forgejo/commit/4011821c946e8db032be86266dd9364ccb204118): an experimental CI/CD
|
||||||
|
|
||||||
|
It appears for the first time in this Forgejo release but is not yet fit for production. It is not fully implemented and may be insecure. However, as long as it is not enabled, it presents no risk to existing Forgejo instances.
|
||||||
|
|
||||||
|
If a repository has a file such as `.forgejo/workflows/test.yml`, it will be interpreted, for instance to run tests and verify the code in the repository works as expected (Continuous Integration). It can also be used to create HTML pages for a website and publish them (Continous Deployment). The syntax is similar to GitHub Actions and the jobs can be controled from the Forgejo web interface.
|
||||||
|
|
||||||
|
[Read more about Forgejo Actions](https://forgejo.codeberg.page/2023-02-27-forgejo-actions/)
|
||||||
|
|
||||||
|
<img src="./releases/images/forgejo-v1.19.0-0-rc0.png" alt="Actions" width="600" />
|
||||||
|
|
||||||
|
* User Interface improvements
|
||||||
|
|
||||||
|
* [Review box on small screens](https://codeberg.org/forgejo/forgejo/commit/1fcf96ad0)
|
||||||
|
The rendering of the review box is improved on small screens.
|
||||||
|
|
||||||
|
* [Video element enabled in markdown](https://codeberg.org/forgejo/forgejo/commit/f8a40dafb)
|
||||||
|
The `<video>` HTML tag can now be used in MarkDown, with the `src`, `autoplay`, and `controls` attributes.
|
||||||
|
|
||||||
|
* [Copy citation file content in APA and BibTex format](https://codeberg.org/forgejo/forgejo/commit/9f8e77891)
|
||||||
|
If a [BibTeX](https://fr.wikipedia.org/wiki/BibTeX) file named `CITATION.bib` is at the root of the repository, it can be conveniently copied and converted in APA by following the `Cite this repository` link.
|
||||||
|
|
||||||
|
<img src="./releases/images/forgejo-v1.19-citation-link.png" alt="Citation link" width="500" />
|
||||||
|
|
||||||
|
It will open a dialog box with the available formats and a preview of the content.
|
||||||
|
|
||||||
|
<img src="./releases/images/forgejo-v1.19-citation-dialog.png" alt="Citation dialog" width="500" />
|
||||||
|
|
||||||
|
The CFF format is also supported when a `CITATION.cff` file used instead.
|
||||||
|
|
||||||
|
* [Display asciicast](https://codeberg.org/forgejo/forgejo/commit/d9f748a70)
|
||||||
|
|
||||||
|
Files with the `.cast` extension are displayed in the Forgejo web interface as [asciicast v2](https://github.com/asciinema/asciinema/blob/develop/doc/asciicast-v2.md) using [asciinema-player](https://github.com/asciinema/asciinema-player).
|
||||||
|
|
||||||
|
* [Attention blocks Note and Warning](https://codeberg.org/forgejo/forgejo/commit/cb8328853)
|
||||||
|
|
||||||
|
For each quote block, the first `**Note**` or `**Warning**` gets an icon prepended to it and its text is colored accordingly.
|
||||||
|
|
||||||
|
<img src="./releases/images/forgejo-v1.19-note-warning.png" alt="Attention block" width="400" />
|
||||||
|
|
||||||
|
* [Support for commit cross references](https://codeberg.org/forgejo/forgejo/commit/d0d257b24)
|
||||||
|
|
||||||
|
A commit hash can now be prefixed by the repository to be referenced from a comment in another repository: `owner/repo@commit`.
|
||||||
|
|
||||||
|
* [Preview images for Issue cards in Project Board view](https://codeberg.org/forgejo/forgejo/commit/fb1a2a13f)
|
||||||
|
|
||||||
|
If the card preview in the project is set to **Images and Text**, it displays images found in the corresponding issue. The most recent is displayed first, up to five images.
|
||||||
|
|
||||||
|
[Read more about card preview images](https://forgejo.org/docs/v1.19/user/project/#card-previews-images).
|
||||||
|
|
||||||
|
* [Add "Copy" button to file view of raw text](https://codeberg.org/forgejo/forgejo/commit/e3a7f1579)
|
||||||
|
|
||||||
|
If a raw text file is displayed, a copy button of the text is enabled.
|
||||||
|
|
||||||
|
**Before**
|
||||||
|
|
||||||
|
<img src="./releases/images/forgejo-v1.19-raw-copy-before.png" alt="Raw copy before" width="500" />
|
||||||
|
|
||||||
|
**After**
|
||||||
|
|
||||||
|
<img src="./releases/images/forgejo-v1.19-raw-copy-after.png" alt="Raw copy after" width="500" />
|
||||||
|
|
||||||
|
* [Setting to allow edits on PRs by maintainers](https://codeberg.org/forgejo/forgejo/commit/49919c636)
|
||||||
|
|
||||||
|
Add setting to allow edits by maintainers by default, to avoid having to often ask contributors to enable this.
|
||||||
|
|
||||||
|
* Container images upgraded to Alpine 3.17
|
||||||
|
|
||||||
|
The Forgejo container images are now based on [Alpine 3.17](https://alpinelinux.org/posts/Alpine-3.17.0-released.html) instead of Alpine 3.16. It includes an upgrade from git 2.36.5 to git 2.38.4 and from openssh 9.0p1 to openssh 9.1p1.
|
||||||
|
|
||||||
|
## 1.18.5-0
|
||||||
|
|
||||||
|
This stable release contains an **important security fix** for Forgejo to raise the protection against brute force attack on hashed passwords stored in the database to match industry standards, [as described in detail in a companion blog post](https://forgejo.org/2023-02-23-release-v1/).
|
||||||
|
|
||||||
|
### Recommended Action
|
||||||
|
|
||||||
|
We **strongly recommend** that all Forgejo installations are upgraded to the latest version as soon as possible.
|
||||||
|
|
||||||
|
If `PASSWORD_HASH_ALGO` is explicitly set in `app.ini`, comment it out so that the stronger algorithm is used instead.
|
||||||
|
|
||||||
|
All password hashes stored with another algorithm will be updated to the new algorithm on the next usage of this password (e.g. a user provides the password to the Forgejo server when they login). It does not require manual intervention.
|
||||||
|
|
||||||
|
### Forgejo
|
||||||
|
|
||||||
|
* SECURITY
|
||||||
|
* Upgrade the default password hash algorithm to pbkdf2 with 320,000 iterations (https://codeberg.org/forgejo/forgejo/pulls/407)
|
||||||
|
* BUGFIXES
|
||||||
|
* Return the Forgejo semantic version instead of "development" (https://codeberg.org/forgejo/forgejo/pulls/381)
|
||||||
|
|
||||||
|
### Gitea
|
||||||
|
|
||||||
|
* SECURITY
|
||||||
|
* Provide the ability to set password hash algorithm parameters (https://github.com/go-gitea/gitea/pull/22942) (https://github.com/go-gitea/gitea/pull/22943)
|
||||||
|
* BUGFIXES
|
||||||
|
* Use `--message=%s` for git commit message (https://github.com/go-gitea/gitea/pull/23028) (https://github.com/go-gitea/gitea/pull/23029)
|
||||||
|
* Render access log template as text instead of HTML (https://github.com/go-gitea/gitea/pull/23013) (https://github.com/go-gitea/gitea/pull/23025)
|
||||||
|
* Fix the Manually Merged form (https://github.com/go-gitea/gitea/pull/23015) (https://github.com/go-gitea/gitea/pull/23017)
|
||||||
|
* Use beforeCommit instead of baseCommit (https://github.com/go-gitea/gitea/pull/22949) (https://github.com/go-gitea/gitea/pull/22996)
|
||||||
|
* Display attachments of review comment when comment content is blank (https://github.com/go-gitea/gitea/pull/23035) (https://github.com/go-gitea/gitea/pull/23046)
|
||||||
|
* Return empty url for submodule tree entries (https://github.com/go-gitea/gitea/pull/23043) (https://github.com/go-gitea/gitea/pull/23048)
|
||||||
|
* Notify on container image create (https://github.com/go-gitea/gitea/pull/22806) (https://github.com/go-gitea/gitea/pull/22965)
|
||||||
|
* Some refactor about code comments(https://github.com/go-gitea/gitea/pull/20821) (https://github.com/go-gitea/gitea/pull/22707)
|
||||||
|
|
||||||
|
Note that there is no Forgejo v1.18.4-N because Gitea v1.18.4 was replaced by Gitea v1.18.5 a few days after its release because of a regression. Forgejo was not affected.
|
||||||
|
|
||||||
|
## 1.18.3-2
|
||||||
|
|
||||||
|
This stable release includes a security fix for `git` and bug fixes.
|
||||||
|
|
||||||
|
### Git
|
||||||
|
|
||||||
|
Git [recently announced](https://github.blog/2023-02-14-git-security-vulnerabilities-announced-3/) new versions to address two CVEs ([CVE-2023-22490](https://cve.circl.lu/cve/CVE-2023-22490), [CVE-2023-23946](https://cve.circl.lu/cve/CVE-2023-23946)). On 14 Februrary 2023, Git published the maintenance release v2.39.2, together with releases for older maintenance tracks v2.38.4, v2.37.6, v2.36.5, v2.35.7, v2.34.7, v2.33.7, v2.32.6, v2.31.7, and v2.30.8. All major GNU/Linux distributions also provide updated packages via their security update channels.
|
||||||
|
|
||||||
|
We recommend that all installations running a version affected by the issues described below are upgraded to the latest version as soon as possible.
|
||||||
|
|
||||||
|
* When using a Forgejo binary: upgrade the `git` package to a version greater or equal to v2.39.2, v2.38.4, v2.37.6, v2.36.5, v2.35.7, v2.34.7, v2.33.7, v2.32.6, v2.31.7 or v2.30.8
|
||||||
|
* When using a Forgejo container image: `docker pull codeberg.org/forgejo/forgejo:1.18.3-2`
|
||||||
|
|
||||||
|
### Forgejo
|
||||||
|
|
||||||
|
* BUGFIXES
|
||||||
|
* Use proxy for pull mirror (https://github.com/go-gitea/gitea/pull/22771) (https://github.com/go-gitea/gitea/pull/22772)
|
||||||
|
* Revert "Fixes accessibility of empty repository commit status" (https://github.com/go-gitea/gitea/pull/22632)
|
||||||
|
* A regression introduced in 1.18.3-1 prevented the CI status from displaying for commits with more than one pipeline
|
||||||
|
* FORGEJO RELEASE PROCESS BUGFIXES
|
||||||
|
* The tag SHA in the uploaded repository must match (https://codeberg.org/forgejo/forgejo/pulls/345) [Read more about the consequences of this on the Forgejo blog](https://forgejo.org/2023-02-12-tags/)
|
||||||
|
|
||||||
|
### Gitea
|
||||||
|
|
||||||
|
* BUGFIXES
|
||||||
|
* Load issue before accessing index in merge message (https://github.com/go-gitea/gitea/pull/22822) (https://github.com/go-gitea/gitea/pull/22830)
|
||||||
|
* Fix isAllowed of escapeStreamer (https://github.com/go-gitea/gitea/pull/22814) (https://github.com/go-gitea/gitea/pull/22837)
|
||||||
|
* Escape filename when assemble URL (https://github.com/go-gitea/gitea/pull/22850) (https://github.com/go-gitea/gitea/pull/22871)
|
||||||
|
* Fix PR file tree folders no longer collapsing (https://github.com/go-gitea/gitea/pull/22864) (https://github.com/go-gitea/gitea/pull/22872)
|
||||||
|
* Fix incorrect role labels for migrated issues and comments (https://github.com/go-gitea/gitea/pull/22914) (https://github.com/go-gitea/gitea/pull/22923)
|
||||||
|
* Fix blame view missing lines (https://github.com/go-gitea/gitea/pull/22826) (https://github.com/go-gitea/gitea/pull/22929)
|
||||||
|
* Fix 404 error viewing the LFS file (https://github.com/go-gitea/gitea/pull/22945) (https://github.com/go-gitea/gitea/pull/22948)
|
||||||
|
* FEATURES
|
||||||
|
* Add command to bulk set must-change-password (https://github.com/go-gitea/gitea/pull/22823) (https://github.com/go-gitea/gitea/pull/22928)
|
||||||
|
|
||||||
|
## 1.18.3-1
|
||||||
|
|
||||||
|
This stable release includes bug fixes.
|
||||||
|
|
||||||
|
### Forgejo
|
||||||
|
|
||||||
|
* ACCESSIBILITY
|
||||||
|
* Add ARIA support for Fomantic UI checkboxes (https://github.com/go-gitea/gitea/pull/22599)
|
||||||
|
* Fixes accessibility behavior of Watching, Staring and Fork buttons (https://github.com/go-gitea/gitea/pull/22634)
|
||||||
|
* Add main landmark to templates and adjust titles (https://github.com/go-gitea/gitea/pull/22670)
|
||||||
|
* Improve checkbox accessibility a bit by adding the title attribute (https://github.com/go-gitea/gitea/pull/22593)
|
||||||
|
* Improve accessibility of navigation bar and footer (https://github.com/go-gitea/gitea/pull/22635)
|
||||||
|
* PRIVACY
|
||||||
|
* Use DNS queries to figure out the latest Forgejo version (https://codeberg.org/forgejo/forgejo/pulls/278)
|
||||||
|
* BRANDING
|
||||||
|
* Change the values for the nodeinfo API to correctly identify the software as Forgejo (https://codeberg.org/forgejo/forgejo/pulls/313)
|
||||||
|
* CI
|
||||||
|
* Use tagged test environment for stable branches (https://codeberg.org/forgejo/forgejo/pulls/318)
|
||||||
|
|
||||||
|
### Gitea
|
||||||
|
|
||||||
|
* BUGFIXES
|
||||||
|
* Fix missing message in git hook when pull requests disabled on fork (https://github.com/go-gitea/gitea/pull/22625) (https://github.com/go-gitea/gitea/pull/22658)
|
||||||
|
* add default user visibility to cli command "admin user create" (https://github.com/go-gitea/gitea/pull/22750) (https://github.com/go-gitea/gitea/pull/22760)
|
||||||
|
* Fix color of tertiary button on dark theme (https://github.com/go-gitea/gitea/pull/22739) (https://github.com/go-gitea/gitea/pull/22744)
|
||||||
|
* Fix restore repo bug, clarify the problem of ForeignIndex (https://github.com/go-gitea/gitea/pull/22776) (https://github.com/go-gitea/gitea/pull/22794)
|
||||||
|
* Escape path for the file list (https://github.com/go-gitea/gitea/pull/22741) (https://github.com/go-gitea/gitea/pull/22757)
|
||||||
|
* Fix bugs with WebAuthn preventing sign in and registration. (https://github.com/go-gitea/gitea/pull/22651) (https://github.com/go-gitea/gitea/pull/22721)
|
||||||
|
* PERFORMANCES
|
||||||
|
* Improve checkIfPRContentChanged (https://github.com/go-gitea/gitea/pull/22611) (https://github.com/go-gitea/gitea/pull/22644)
|
||||||
|
|
||||||
|
## 1.18.3-0
|
||||||
|
|
||||||
|
This stable release includes bug fixes.
|
||||||
|
|
||||||
|
### Forgejo
|
||||||
|
|
||||||
|
* BUGFIXES
|
||||||
|
* Fix line spacing for plaintext previews (https://github.com/go-gitea/gitea/pull/22699) (https://github.com/go-gitea/gitea/pull/22701)
|
||||||
|
* Fix README TOC links (https://github.com/go-gitea/gitea/pull/22577) (https://github.com/go-gitea/gitea/pull/22677)
|
||||||
|
* Don't return duplicated users who can create org repo (https://github.com/go-gitea/gitea/pull/22560) (https://github.com/go-gitea/gitea/pull/22562)
|
||||||
|
* Link issue and pull requests status change in UI notifications directly to their event in the timelined view. (https://github.com/go-gitea/gitea/pull/22627) (https://github.com/go-gitea/gitea/pull/22642)
|
||||||
|
|
||||||
|
### Gitea
|
||||||
|
|
||||||
|
* BUGFIXES
|
||||||
|
* Add missing close bracket in imagediff (https://github.com/go-gitea/gitea/pull/22710) (https://github.com/go-gitea/gitea/pull/22712)
|
||||||
|
* Fix wrong hint when deleting a branch successfully from pull request UI (https://github.com/go-gitea/gitea/pull/22673) (https://github.com/go-gitea/gitea/pull/22698)
|
||||||
|
* Fix missing message in git hook when pull requests disabled on fork (https://github.com/go-gitea/gitea/pull/22625) (https://github.com/go-gitea/gitea/pull/22658)
|
||||||
|
|
||||||
|
## 1.18.2-1
|
||||||
|
|
||||||
|
This stable release includes a security fix. It was possible to reveal a user's email address, which is problematic because users can choose to hide their email address from everyone. This was possible because the notification email for a repository transfer request to an organization included every user's email address in the owner team. This has been fixed by sending individual emails instead and the code was refactored to prevent it from happening again.
|
||||||
|
|
||||||
|
We **strongly recommend** that all installations are upgraded to the latest version as soon as possible.
|
||||||
|
|
||||||
|
### Gitea
|
||||||
|
|
||||||
|
* BUGFIXES
|
||||||
|
* When updating by rebase we need to set the environment for head repo (https://github.com/go-gitea/gitea/pull/22535) (https://github.com/go-gitea/gitea/pull/22536)
|
||||||
|
* Mute all links in issue timeline (https://github.com/go-gitea/gitea/pull/22534)
|
||||||
|
* Truncate commit summary on repo files table. (https://github.com/go-gitea/gitea/pull/22551) (https://github.com/go-gitea/gitea/pull/22552)
|
||||||
|
* Prevent multiple `To` recipients (https://github.com/go-gitea/gitea/pull/22566) (https://github.com/go-gitea/gitea/pull/22569)
|
||||||
|
|
||||||
|
## 1.18.2-0
|
||||||
|
|
||||||
|
This stable release includes bug fixes.
|
||||||
|
|
||||||
|
### Gitea
|
||||||
|
|
||||||
|
* BUGFIXES
|
||||||
|
* Fix issue not auto-closing when it includes a reference to a branch (https://github.com/go-gitea/gitea/pull/22514) (https://github.com/go-gitea/gitea/pull/22521)
|
||||||
|
* Fix invalid issue branch reference if not specified in template (https://github.com/go-gitea/gitea/pull/22513) (https://github.com/go-gitea/gitea/pull/22520)
|
||||||
|
* Fix 500 error viewing pull request when fork has pull requests disabled (https://github.com/go-gitea/gitea/pull/22512) (https://github.com/go-gitea/gitea/pull/22515)
|
||||||
|
* Reliable selection of admin user (https://github.com/go-gitea/gitea/pull/22509) (https://github.com/go-gitea/gitea/pull/22511)
|
||||||
|
|
||||||
|
## 1.18.1-0
|
||||||
|
|
||||||
|
This is the first Forgejo stable point release.
|
||||||
|
|
||||||
|
### Forgejo
|
||||||
|
|
||||||
|
### Critical security update for Git
|
||||||
|
|
||||||
|
Git [recently announced](https://github.blog/2023-01-17-git-security-vulnerabilities-announced-2/) new versions to address two CVEs ([CVE-2022-23521](https://cve.circl.lu/cve/CVE-2022-23521), [CVE-2022-41903](https://cve.circl.lu/cve/CVE-2022-41903)). On 17 January 2023, Git published the maintenance release v2.39.1, together with releases for older maintenance tracks v2.38.3, v2.37.5, v2.36.4, v2.35.6, v2.34.6, v2.33.6, v2.32.5, v2.31.6, and v2.30.7. All major GNU/Linux distributions also provide updated packages via their security update channels.
|
||||||
|
|
||||||
|
We **strongly recommend** that all installations running a version affected by the issues described below are upgraded to the latest version as soon as possible.
|
||||||
|
|
||||||
|
* When using a Forgejo binary: upgrade the `git` package to a version greater or equal to v2.39.1, v2.38.3, v2.37.5, v2.36.4, v2.35.6, v2.34.6, v2.33.6, v2.32.5, v2.31.6, or v2.30.7
|
||||||
|
* When using a Forgejo container image: `docker pull codeberg.org/forgejo/forgejo:1.18.1-0`
|
||||||
|
|
||||||
|
Read more in the [Forgejo blog](https://forgejo.org/2023-01-18-release-v1-18-1-0/).
|
||||||
|
|
||||||
|
#### Release process stability
|
||||||
|
|
||||||
|
The [release process](https://codeberg.org/forgejo/forgejo/src/branch/v1.18/forgejo-ci) based on [Woodpecker CI](https://woodpecker-ci.org/) was entirely reworked to be more resilient to transient errors. A new release is first uploaded into the new [Forgejo experimental](https://codeberg.org/forgejo-experimental/) organization for testing purposes.
|
||||||
|
|
||||||
|
Automated end to end testing of releases was implemented with a full development cycle including the creation of a new repository and a run of CI. It relieves the user and developer from the burden of tedious manual testing.
|
||||||
|
|
||||||
|
#### Container environment variables
|
||||||
|
|
||||||
|
When running a container, all environment variables starting with `FORGEJO__` can be used instead of `GITEA__`. For backward compatibility with existing scripts, it is still possible to use `GITEA__` instead of `FORGEJO__`. For instance:
|
||||||
|
|
||||||
|
```
|
||||||
|
docker run --name forgejo -e FORGEJO__security__INSTALL_LOCK=true codeberg.org/forgejo/forgejo:1.18.1-0
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Forgejo hook types
|
||||||
|
|
||||||
|
A new `forgejo` hook type is available and behaves exactly the same as the existing `gitea` hook type. It will be used to implement additional features specific to Forgejo in a way that will be backward compatible with Gitea.
|
||||||
|
|
||||||
|
#### X-Forgejo headers
|
||||||
|
|
||||||
|
Wherever a `X-Gitea` header is received or sent, an identical `X-Forgejo` is added. For instance when a notification mail is sent, the `X-Forgejo-Reason` header is set to explain why. Or when a webhook is sent, the `X-Forgejo-Event` header is set with `push`, `tag`, etc. for Woodpecker CI to decide on an action.
|
||||||
|
|
||||||
|
#### Look and feel fixes
|
||||||
|
|
||||||
|
The Forgejo theme was [modified](https://codeberg.org/forgejo/forgejo/src/branch/v1.18/forgejo-branding) to take into account user feedback.
|
||||||
|
|
||||||
|
### Gitea
|
||||||
|
|
||||||
|
* API
|
||||||
|
* Add `sync_on_commit` option for push mirrors api (https://github.com/go-gitea/gitea/pull/22271) (https://github.com/go-gitea/gitea/pull/22292)
|
||||||
|
* BUGFIXES
|
||||||
|
* Update `github.com/zeripath/zapx/v15` (https://github.com/go-gitea/gitea/pull/22485)
|
||||||
|
* Fix pull request API field `closed_at` always being `null` (https://github.com/go-gitea/gitea/pull/22482) (https://github.com/go-gitea/gitea/pull/22483)
|
||||||
|
* Fix container blob mount (https://github.com/go-gitea/gitea/pull/22226) (https://github.com/go-gitea/gitea/pull/22476)
|
||||||
|
* Fix error when calculating repository size (https://github.com/go-gitea/gitea/pull/22392) (https://github.com/go-gitea/gitea/pull/22474)
|
||||||
|
* Fix Operator does not exist bug on explore page with ONLY_SHOW_RELEVANT_REPOS (https://github.com/go-gitea/gitea/pull/22454) (https://github.com/go-gitea/gitea/pull/22472)
|
||||||
|
* Fix environments for KaTeX and error reporting (https://github.com/go-gitea/gitea/pull/22453) (https://github.com/go-gitea/gitea/pull/22473)
|
||||||
|
* Remove the netgo tag for Windows build (https://github.com/go-gitea/gitea/pull/22467) (https://github.com/go-gitea/gitea/pull/22468)
|
||||||
|
* Fix migration from GitBucket (https://github.com/go-gitea/gitea/pull/22477) (https://github.com/go-gitea/gitea/pull/22465)
|
||||||
|
* Prevent panic on looking at api "git" endpoints for empty repos (https://github.com/go-gitea/gitea/pull/22457) (https://github.com/go-gitea/gitea/pull/22458)
|
||||||
|
* Fix PR status layout on mobile (https://github.com/go-gitea/gitea/pull/21547) (https://github.com/go-gitea/gitea/pull/22441)
|
||||||
|
* Fix wechatwork webhook sends empty content in PR review (https://github.com/go-gitea/gitea/pull/21762) (https://github.com/go-gitea/gitea/pull/22440)
|
||||||
|
* Remove duplicate "Actions" label in mobile view (https://github.com/go-gitea/gitea/pull/21974) (https://github.com/go-gitea/gitea/pull/22439)
|
||||||
|
* Fix leaving organization bug on user settings -> orgs (https://github.com/go-gitea/gitea/pull/21983) (https://github.com/go-gitea/gitea/pull/22438)
|
||||||
|
* Fixed colour transparency regex matching in project board sorting (https://github.com/go-gitea/gitea/pull/22092) (https://github.com/go-gitea/gitea/pull/22437)
|
||||||
|
* Correctly handle select on multiple channels in Queues (https://github.com/go-gitea/gitea/pull/22146) (https://github.com/go-gitea/gitea/pull/22428)
|
||||||
|
* Prepend refs/heads/ to issue template refs (https://github.com/go-gitea/gitea/pull/20461) (https://github.com/go-gitea/gitea/pull/22427)
|
||||||
|
* Restore function to "Show more" buttons (https://github.com/go-gitea/gitea/pull/22399) (https://github.com/go-gitea/gitea/pull/22426)
|
||||||
|
* Continue GCing other repos on error in one repo (https://github.com/go-gitea/gitea/pull/22422) (https://github.com/go-gitea/gitea/pull/22425)
|
||||||
|
* Allow HOST has no port (https://github.com/go-gitea/gitea/pull/22280) (https://github.com/go-gitea/gitea/pull/22409)
|
||||||
|
* Fix omit avatar_url in discord payload when empty (https://github.com/go-gitea/gitea/pull/22393) (https://github.com/go-gitea/gitea/pull/22394)
|
||||||
|
* Don't display stop watch top bar icon when disabled and hidden when click other place (https://github.com/go-gitea/gitea/pull/22374) (https://github.com/go-gitea/gitea/pull/22387)
|
||||||
|
* Don't lookup mail server when using sendmail (https://github.com/go-gitea/gitea/pull/22300) (https://github.com/go-gitea/gitea/pull/22383)
|
||||||
|
* Fix gravatar disable bug (https://github.com/go-gitea/gitea/pull/22337)
|
||||||
|
* Fix update settings table on install (https://github.com/go-gitea/gitea/pull/22326) (https://github.com/go-gitea/gitea/pull/22327)
|
||||||
|
* Fix sitemap (https://github.com/go-gitea/gitea/pull/22272) (https://github.com/go-gitea/gitea/pull/22320)
|
||||||
|
* Fix code search title translation (https://github.com/go-gitea/gitea/pull/22285) (https://github.com/go-gitea/gitea/pull/22316)
|
||||||
|
* Fix due date rendering the wrong date in issue (https://github.com/go-gitea/gitea/pull/22302) (https://github.com/go-gitea/gitea/pull/22306)
|
||||||
|
* Fix get system setting bug when enabled redis cache (https://github.com/go-gitea/gitea/pull/22298)
|
||||||
|
* Fix bug of DisableGravatar default value (https://github.com/go-gitea/gitea/pull/22297)
|
||||||
|
* Fix key signature error page (https://github.com/go-gitea/gitea/pull/22229) (https://github.com/go-gitea/gitea/pull/22230)
|
||||||
|
* TESTING
|
||||||
|
* Remove test session cache to reduce possible concurrent problem (https://github.com/go-gitea/gitea/pull/22199) (https://github.com/go-gitea/gitea/pull/22429)
|
||||||
|
* MISC
|
||||||
|
* Restore previous official review when an official review is deleted (https://github.com/go-gitea/gitea/pull/22449) (https://github.com/go-gitea/gitea/pull/22460)
|
||||||
|
* Log STDERR of external renderer when it fails (https://github.com/go-gitea/gitea/pull/22442) (https://github.com/go-gitea/gitea/pull/22444)
|
||||||
|
|
||||||
|
## 1.18.0-1
|
||||||
|
|
||||||
|
This is the first Forgejo release.
|
||||||
|
|
||||||
|
### Forgejo improvements
|
||||||
|
|
||||||
|
#### Woodpecker CI
|
||||||
|
|
||||||
|
A new [CI configuration](https://codeberg.org/forgejo/forgejo/src/branch/v1.18/forgejo-ci) based on [Woodpecker CI](https://woodpecker-ci.org/) was created. It is used to:
|
||||||
|
|
||||||
|
* run tests on every Forgejo pull request ([compliance](https://codeberg.org/forgejo/forgejo/src/tag/v1.18.0-1/.woodpecker/compliance.yml), [unit tests and integration tests](https://codeberg.org/forgejo/forgejo/src/tag/v1.18.0-1/.woodpecker/testing-amd64.yml))
|
||||||
|
* publish the Forgejo v1.18.0-1 release, [as binary packages](https://codeberg.org/forgejo/forgejo/releases/tag/v1.18.0-1) for amd64, arm64 and armv6 and [container images](https://codeberg.org/forgejo/-/packages/container/forgejo/1.18.0-1) for amd64 and arm64, root and rootless
|
||||||
|
|
||||||
|
#### Look and feel
|
||||||
|
|
||||||
|
The default themes were replaced by Forgejo themes and the landing page was [modified](https://codeberg.org/forgejo/forgejo/src/branch/v1.18/forgejo-branding) to display the Forgejo logo and names but the look and feel remains otherwise identical to Gitea.
|
||||||
|
|
||||||
|
<img src="./releases/images/forgejo-v1.18.0-rc1-2-landing.jpg" alt="Landing page" width="600" />
|
||||||
|
|
||||||
|
#### Privacy
|
||||||
|
|
||||||
|
Gitea instances fetch https://dl.gitea.io/gitea/version.json weekly by default, which raises privacy concerns. In Forgejo [this feature needs to be explicitly activated](https://codeberg.org/forgejo/forgejo/src/branch/v1.18/forgejo-privacy) at installation time or by modifying the configuration file. Forgejo also provides an alternative [RSS feed](https://forgejo.org/releases/) to be informed when a new release is published.
|
||||||
|
|
||||||
|
### Gitea
|
||||||
|
|
||||||
|
* SECURITY
|
||||||
|
* Remove ReverseProxy authentication from the API (https://github.com/go-gitea/gitea/pull/22219) (https://github.com/go-gitea/gitea/pull/22251)
|
||||||
|
* Support Go Vulnerability Management (https://github.com/go-gitea/gitea/pull/21139)
|
||||||
|
* Forbid HTML string tooltips (https://github.com/go-gitea/gitea/pull/20935)
|
||||||
|
* BREAKING
|
||||||
|
* Rework mailer settings (https://github.com/go-gitea/gitea/pull/18982)
|
||||||
|
* Remove U2F support (https://github.com/go-gitea/gitea/pull/20141)
|
||||||
|
* Refactor `i18n` to `locale` (https://github.com/go-gitea/gitea/pull/20153)
|
||||||
|
* Enable contenthash in filename for dynamic assets (https://github.com/go-gitea/gitea/pull/20813)
|
||||||
|
* FEATURES
|
||||||
|
* Add color previews in markdown (https://github.com/go-gitea/gitea/pull/21474)
|
||||||
|
* Allow package version sorting (https://github.com/go-gitea/gitea/pull/21453)
|
||||||
|
* Add support for Chocolatey/NuGet v2 API (https://github.com/go-gitea/gitea/pull/21393)
|
||||||
|
* Add API endpoint to get changed files of a PR (https://github.com/go-gitea/gitea/pull/21177)
|
||||||
|
* Add filetree on left of diff view (https://github.com/go-gitea/gitea/pull/21012)
|
||||||
|
* Support Issue forms and PR forms (https://github.com/go-gitea/gitea/pull/20987)
|
||||||
|
* Add support for Vagrant packages (https://github.com/go-gitea/gitea/pull/20930)
|
||||||
|
* Add support for `npm unpublish` (https://github.com/go-gitea/gitea/pull/20688)
|
||||||
|
* Add badge capabilities to users (https://github.com/go-gitea/gitea/pull/20607)
|
||||||
|
* Add issue filter for Author (https://github.com/go-gitea/gitea/pull/20578)
|
||||||
|
* Add KaTeX rendering to Markdown. (https://github.com/go-gitea/gitea/pull/20571)
|
||||||
|
* Add support for Pub packages (https://github.com/go-gitea/gitea/pull/20560)
|
||||||
|
* Support localized README (https://github.com/go-gitea/gitea/pull/20508)
|
||||||
|
* Add support mCaptcha as captcha provider (https://github.com/go-gitea/gitea/pull/20458)
|
||||||
|
* Add team member invite by email (https://github.com/go-gitea/gitea/pull/20307)
|
||||||
|
* Added email notification option to receive all own messages (https://github.com/go-gitea/gitea/pull/20179)
|
||||||
|
* Switch Unicode Escaping to a VSCode-like system (https://github.com/go-gitea/gitea/pull/19990)
|
||||||
|
* Add user/organization code search (https://github.com/go-gitea/gitea/pull/19977)
|
||||||
|
* Only show relevant repositories on explore page (https://github.com/go-gitea/gitea/pull/19361)
|
||||||
|
* User keypairs and HTTP signatures for ActivityPub federation using go-ap (https://github.com/go-gitea/gitea/pull/19133)
|
||||||
|
* Add sitemap support (https://github.com/go-gitea/gitea/pull/18407)
|
||||||
|
* Allow creation of OAuth2 applications for orgs (https://github.com/go-gitea/gitea/pull/18084)
|
||||||
|
* Add system setting table with cache and also add cache supports for user setting (https://github.com/go-gitea/gitea/pull/18058)
|
||||||
|
* Add pages to view watched repos and subscribed issues/PRs (https://github.com/go-gitea/gitea/pull/17156)
|
||||||
|
* Support Proxy protocol (https://github.com/go-gitea/gitea/pull/12527)
|
||||||
|
* Implement sync push mirror on commit (https://github.com/go-gitea/gitea/pull/19411)
|
||||||
|
* API
|
||||||
|
* Allow empty assignees on pull request edit (https://github.com/go-gitea/gitea/pull/22150) (https://github.com/go-gitea/gitea/pull/22214)
|
||||||
|
* Make external issue tracker regexp configurable via API (https://github.com/go-gitea/gitea/pull/21338)
|
||||||
|
* Add name field for org api (https://github.com/go-gitea/gitea/pull/21270)
|
||||||
|
* Show teams with no members if user is admin (https://github.com/go-gitea/gitea/pull/21204)
|
||||||
|
* Add latest commit's SHA to content response (https://github.com/go-gitea/gitea/pull/20398)
|
||||||
|
* Add allow_rebase_update, default_delete_branch_after_merge to repository api response (https://github.com/go-gitea/gitea/pull/20079)
|
||||||
|
* Add new endpoints for push mirrors management (https://github.com/go-gitea/gitea/pull/19841)
|
||||||
|
* ENHANCEMENTS
|
||||||
|
* Add setting to disable the git apply step in test patch (https://github.com/go-gitea/gitea/pull/22130) (https://github.com/go-gitea/gitea/pull/22170)
|
||||||
|
* Multiple improvements for comment edit diff (https://github.com/go-gitea/gitea/pull/21990) (https://github.com/go-gitea/gitea/pull/22007)
|
||||||
|
* Fix button in branch list, avoid unexpected page jump before restore branch actually done (https://github.com/go-gitea/gitea/pull/21562) (https://github.com/go-gitea/gitea/pull/21928)
|
||||||
|
* Fix flex layout for repo list icons (https://github.com/go-gitea/gitea/pull/21896) (https://github.com/go-gitea/gitea/pull/21920)
|
||||||
|
* Fix vertical align of committer avatar rendered by email address (https://github.com/go-gitea/gitea/pull/21884) (https://github.com/go-gitea/gitea/pull/21918)
|
||||||
|
* Fix setting HTTP headers after write (https://github.com/go-gitea/gitea/pull/21833) (https://github.com/go-gitea/gitea/pull/21877)
|
||||||
|
* Color and Style enhancements (https://github.com/go-gitea/gitea/pull/21784, #21799) (https://github.com/go-gitea/gitea/pull/21868)
|
||||||
|
* Ignore line anchor links with leading zeroes (https://github.com/go-gitea/gitea/pull/21728) (https://github.com/go-gitea/gitea/pull/21776)
|
||||||
|
* Quick fixes monaco-editor error: "vs.editor.nullLanguage" (https://github.com/go-gitea/gitea/pull/21734) (https://github.com/go-gitea/gitea/pull/21738)
|
||||||
|
* Use CSS color-scheme instead of invert (https://github.com/go-gitea/gitea/pull/21616) (https://github.com/go-gitea/gitea/pull/21623)
|
||||||
|
* Respect user's locale when rendering the date range in the repo activity page (https://github.com/go-gitea/gitea/pull/21410)
|
||||||
|
* Change `commits-table` column width (https://github.com/go-gitea/gitea/pull/21564)
|
||||||
|
* Refactor git command arguments and make all arguments to be safe to be used (https://github.com/go-gitea/gitea/pull/21535)
|
||||||
|
* CSS color enhancements (https://github.com/go-gitea/gitea/pull/21534)
|
||||||
|
* Add link to user profile in markdown mention only if user exists (https://github.com/go-gitea/gitea/pull/21533, #21554)
|
||||||
|
* Add option to skip index dirs (https://github.com/go-gitea/gitea/pull/21501)
|
||||||
|
* Diff file tree tweaks (https://github.com/go-gitea/gitea/pull/21446)
|
||||||
|
* Localize all timestamps (https://github.com/go-gitea/gitea/pull/21440)
|
||||||
|
* Add `code` highlighting in issue titles (https://github.com/go-gitea/gitea/pull/21432)
|
||||||
|
* Use Name instead of DisplayName in LFS Lock (https://github.com/go-gitea/gitea/pull/21415)
|
||||||
|
* Consolidate more CSS colors into variables (https://github.com/go-gitea/gitea/pull/21402)
|
||||||
|
* Redirect to new repository owner (https://github.com/go-gitea/gitea/pull/21398)
|
||||||
|
* Use ISO date format instead of hard-coded English date format for date range in repo activity page (https://github.com/go-gitea/gitea/pull/21396)
|
||||||
|
* Use weighted algorithm for string matching when finding files in repo (https://github.com/go-gitea/gitea/pull/21370)
|
||||||
|
* Show private data in feeds (https://github.com/go-gitea/gitea/pull/21369)
|
||||||
|
* Refactor parseTreeEntries, speed up tree list (https://github.com/go-gitea/gitea/pull/21368)
|
||||||
|
* Add GET and DELETE endpoints for Docker blob uploads (https://github.com/go-gitea/gitea/pull/21367)
|
||||||
|
* Add nicer error handling on template compile errors (https://github.com/go-gitea/gitea/pull/21350)
|
||||||
|
* Add `stat` to `ToCommit` function for speed (https://github.com/go-gitea/gitea/pull/21337)
|
||||||
|
* Support instance-wide OAuth2 applications (https://github.com/go-gitea/gitea/pull/21335)
|
||||||
|
* Record OAuth client type at registration (https://github.com/go-gitea/gitea/pull/21316)
|
||||||
|
* Add new CSS variables --color-accent and --color-small-accent (https://github.com/go-gitea/gitea/pull/21305)
|
||||||
|
* Improve error descriptions for unauthorized_client (https://github.com/go-gitea/gitea/pull/21292)
|
||||||
|
* Case-insensitive "find files in repo" (https://github.com/go-gitea/gitea/pull/21269)
|
||||||
|
* Consolidate more CSS rules, fix inline code on arc-green (https://github.com/go-gitea/gitea/pull/21260)
|
||||||
|
* Log real ip of requests from ssh (https://github.com/go-gitea/gitea/pull/21216)
|
||||||
|
* Save files in local storage as group readable (https://github.com/go-gitea/gitea/pull/21198)
|
||||||
|
* Enable fluid page layout on medium size viewports (https://github.com/go-gitea/gitea/pull/21178)
|
||||||
|
* File header tweaks (https://github.com/go-gitea/gitea/pull/21175)
|
||||||
|
* Added missing headers on user packages page (https://github.com/go-gitea/gitea/pull/21172)
|
||||||
|
* Display image digest for container packages (https://github.com/go-gitea/gitea/pull/21170)
|
||||||
|
* Skip dirty check for team forms (https://github.com/go-gitea/gitea/pull/21154)
|
||||||
|
* Keep path when creating a new branch (https://github.com/go-gitea/gitea/pull/21153)
|
||||||
|
* Remove fomantic image module (https://github.com/go-gitea/gitea/pull/21145)
|
||||||
|
* Make labels clickable in the comments section. (https://github.com/go-gitea/gitea/pull/21137)
|
||||||
|
* Sort branches and tags by date descending (https://github.com/go-gitea/gitea/pull/21136)
|
||||||
|
* Better repo API unit checks (https://github.com/go-gitea/gitea/pull/21130)
|
||||||
|
* Improve commit status icons (https://github.com/go-gitea/gitea/pull/21124)
|
||||||
|
* Limit length of repo description and repo url input fields (https://github.com/go-gitea/gitea/pull/21119)
|
||||||
|
* Show .editorconfig errors in frontend (https://github.com/go-gitea/gitea/pull/21088)
|
||||||
|
* Allow poster to choose reviewers (https://github.com/go-gitea/gitea/pull/21084)
|
||||||
|
* Remove black labels and CSS cleanup (https://github.com/go-gitea/gitea/pull/21003)
|
||||||
|
* Make e-mail sanity check more precise (https://github.com/go-gitea/gitea/pull/20991)
|
||||||
|
* Use native inputs in whitespace dropdown (https://github.com/go-gitea/gitea/pull/20980)
|
||||||
|
* Enhance package date display (https://github.com/go-gitea/gitea/pull/20928)
|
||||||
|
* Display total blob size of a package version (https://github.com/go-gitea/gitea/pull/20927)
|
||||||
|
* Show language name on hover (https://github.com/go-gitea/gitea/pull/20923)
|
||||||
|
* Show instructions for all generic package files (https://github.com/go-gitea/gitea/pull/20917)
|
||||||
|
* Refactor AssertExistsAndLoadBean to use generics (https://github.com/go-gitea/gitea/pull/20797)
|
||||||
|
* Move the official website link at the footer of gitea (https://github.com/go-gitea/gitea/pull/20777)
|
||||||
|
* Add support for full name in reverse proxy auth (https://github.com/go-gitea/gitea/pull/20776)
|
||||||
|
* Remove useless JS operation for relative time tooltips (https://github.com/go-gitea/gitea/pull/20756)
|
||||||
|
* Replace some icons with SVG (https://github.com/go-gitea/gitea/pull/20741)
|
||||||
|
* Change commit status icons to SVG (https://github.com/go-gitea/gitea/pull/20736)
|
||||||
|
* Improve single repo action for issue and pull requests (https://github.com/go-gitea/gitea/pull/20730)
|
||||||
|
* Allow multiple files in generic packages (https://github.com/go-gitea/gitea/pull/20661)
|
||||||
|
* Add option to create new issue from /issues page (https://github.com/go-gitea/gitea/pull/20650)
|
||||||
|
* Background color of private list-items updated (https://github.com/go-gitea/gitea/pull/20630)
|
||||||
|
* Added search input field to issue filter (https://github.com/go-gitea/gitea/pull/20623)
|
||||||
|
* Increase default item listing size `ISSUE_PAGING_NUM` to 20 (https://github.com/go-gitea/gitea/pull/20547)
|
||||||
|
* Modify milestone search keywords to be case insensitive again (https://github.com/go-gitea/gitea/pull/20513)
|
||||||
|
* Show hint to link package to repo when viewing empty repo package list (https://github.com/go-gitea/gitea/pull/20504)
|
||||||
|
* Add Tar ZSTD support (https://github.com/go-gitea/gitea/pull/20493)
|
||||||
|
* Make code review checkboxes clickable (https://github.com/go-gitea/gitea/pull/20481)
|
||||||
|
* Add "X-Gitea-Object-Type" header for GET `/raw/` & `/media/` API (https://github.com/go-gitea/gitea/pull/20438)
|
||||||
|
* Display project in issue list (https://github.com/go-gitea/gitea/pull/20434)
|
||||||
|
* Prepend commit message to template content when opening a new PR (https://github.com/go-gitea/gitea/pull/20429)
|
||||||
|
* Replace fomantic popup module with tippy.js (https://github.com/go-gitea/gitea/pull/20428)
|
||||||
|
* Allow to specify colors for text in markup (https://github.com/go-gitea/gitea/pull/20363)
|
||||||
|
* Allow access to the Public Organization Member lists with minimal permissions (https://github.com/go-gitea/gitea/pull/20330)
|
||||||
|
* Use default values when provided values are empty (https://github.com/go-gitea/gitea/pull/20318)
|
||||||
|
* Vertical align navbar avatar at middle (https://github.com/go-gitea/gitea/pull/20302)
|
||||||
|
* Delete cancel button in repo creation page (https://github.com/go-gitea/gitea/pull/21381)
|
||||||
|
* Include login_name in adminCreateUser response (https://github.com/go-gitea/gitea/pull/20283)
|
||||||
|
* fix: icon margin in user/settings/repos (https://github.com/go-gitea/gitea/pull/20281)
|
||||||
|
* Remove blue text on migrate page (https://github.com/go-gitea/gitea/pull/20273)
|
||||||
|
* Modify milestone search keywords to be case insensitive (https://github.com/go-gitea/gitea/pull/20266)
|
||||||
|
* Move some files into models' sub packages (https://github.com/go-gitea/gitea/pull/20262)
|
||||||
|
* Add tooltip to repo icons in explore page (https://github.com/go-gitea/gitea/pull/20241)
|
||||||
|
* Remove deprecated licenses (https://github.com/go-gitea/gitea/pull/20222)
|
||||||
|
* Webhook for Wiki changes (https://github.com/go-gitea/gitea/pull/20219)
|
||||||
|
* Share HTML template renderers and create a watcher framework (https://github.com/go-gitea/gitea/pull/20218)
|
||||||
|
* Allow enable LDAP source and disable user sync via CLI (https://github.com/go-gitea/gitea/pull/20206)
|
||||||
|
* Adds a checkbox to select all issues/PRs (https://github.com/go-gitea/gitea/pull/20177)
|
||||||
|
* Refactor `i18n` to `locale` (https://github.com/go-gitea/gitea/pull/20153)
|
||||||
|
* Disable status checks in template if none found (https://github.com/go-gitea/gitea/pull/20088)
|
||||||
|
* Allow manager logging to set SQL (https://github.com/go-gitea/gitea/pull/20064)
|
||||||
|
* Add order by for assignee no sort issue (https://github.com/go-gitea/gitea/pull/20053)
|
||||||
|
* Take a stab at porting existing components to Vue3 (https://github.com/go-gitea/gitea/pull/20044)
|
||||||
|
* Add doctor command to write commit-graphs (https://github.com/go-gitea/gitea/pull/20007)
|
||||||
|
* Add support for authentication based on reverse proxy email (https://github.com/go-gitea/gitea/pull/19949)
|
||||||
|
* Enable spellcheck for EasyMDE, use contenteditable mode (https://github.com/go-gitea/gitea/pull/19776)
|
||||||
|
* Allow specifying SECRET_KEY_URI, similar to INTERNAL_TOKEN_URI (https://github.com/go-gitea/gitea/pull/19663)
|
||||||
|
* Rework mailer settings (https://github.com/go-gitea/gitea/pull/18982)
|
||||||
|
* Add option to purge users (https://github.com/go-gitea/gitea/pull/18064)
|
||||||
|
* Add author search input (https://github.com/go-gitea/gitea/pull/21246)
|
||||||
|
* Make rss/atom identifier globally unique (https://github.com/go-gitea/gitea/pull/21550)
|
||||||
|
* BUGFIXES
|
||||||
|
* Auth interface return error when verify failure (https://github.com/go-gitea/gitea/pull/22119) (https://github.com/go-gitea/gitea/pull/22259)
|
||||||
|
* Use complete SHA to create and query commit status (https://github.com/go-gitea/gitea/pull/22244) (https://github.com/go-gitea/gitea/pull/22257)
|
||||||
|
* Update bleve and zapx to fix unaligned atomic (https://github.com/go-gitea/gitea/pull/22031) (https://github.com/go-gitea/gitea/pull/22218)
|
||||||
|
* Prevent panic in doctor command when running default checks (https://github.com/go-gitea/gitea/pull/21791) (https://github.com/go-gitea/gitea/pull/21807)
|
||||||
|
* Load GitRepo in API before deleting issue (https://github.com/go-gitea/gitea/pull/21720) (https://github.com/go-gitea/gitea/pull/21796)
|
||||||
|
* Ignore line anchor links with leading zeroes (https://github.com/go-gitea/gitea/pull/21728) (https://github.com/go-gitea/gitea/pull/21776)
|
||||||
|
* Set last login when activating account (https://github.com/go-gitea/gitea/pull/21731) (https://github.com/go-gitea/gitea/pull/21755)
|
||||||
|
* Fix UI language switching bug (https://github.com/go-gitea/gitea/pull/21597) (https://github.com/go-gitea/gitea/pull/21749)
|
||||||
|
* Quick fixes monaco-editor error: "vs.editor.nullLanguage" (https://github.com/go-gitea/gitea/pull/21734) (https://github.com/go-gitea/gitea/pull/21738)
|
||||||
|
* Allow local package identifiers for PyPI packages (https://github.com/go-gitea/gitea/pull/21690) (https://github.com/go-gitea/gitea/pull/21727)
|
||||||
|
* Deal with markdown template without metadata (https://github.com/go-gitea/gitea/pull/21639) (https://github.com/go-gitea/gitea/pull/21654)
|
||||||
|
* Fix opaque background on mermaid diagrams (https://github.com/go-gitea/gitea/pull/21642) (https://github.com/go-gitea/gitea/pull/21652)
|
||||||
|
* Fix repository adoption on Windows (https://github.com/go-gitea/gitea/pull/21646) (https://github.com/go-gitea/gitea/pull/21650)
|
||||||
|
* Sync git hooks when config file path changed (https://github.com/go-gitea/gitea/pull/21619) (https://github.com/go-gitea/gitea/pull/21626)
|
||||||
|
* Fix 500 on PR files API (https://github.com/go-gitea/gitea/pull/21602) (https://github.com/go-gitea/gitea/pull/21607)
|
||||||
|
* Fix `Timestamp.IsZero` (https://github.com/go-gitea/gitea/pull/21593) (https://github.com/go-gitea/gitea/pull/21603)
|
||||||
|
* Fix viewing user subscriptions (https://github.com/go-gitea/gitea/pull/21482)
|
||||||
|
* Fix mermaid-related bugs (https://github.com/go-gitea/gitea/pull/21431)
|
||||||
|
* Fix branch dropdown shifting on page load (https://github.com/go-gitea/gitea/pull/21428)
|
||||||
|
* Fix default theme-auto selector when nologin (https://github.com/go-gitea/gitea/pull/21346)
|
||||||
|
* Fix and improve incorrect error messages (https://github.com/go-gitea/gitea/pull/21342)
|
||||||
|
* Fix formatted link for PR review notifications to matrix (https://github.com/go-gitea/gitea/pull/21319)
|
||||||
|
* Center-aligning content of WebAuthN page (https://github.com/go-gitea/gitea/pull/21127)
|
||||||
|
* Remove follow from commits by file (https://github.com/go-gitea/gitea/pull/20765)
|
||||||
|
* Fix commit status popup (https://github.com/go-gitea/gitea/pull/20737)
|
||||||
|
* Fix init mail render logic (https://github.com/go-gitea/gitea/pull/20704)
|
||||||
|
* Use correct page size for link header pagination (https://github.com/go-gitea/gitea/pull/20546)
|
||||||
|
* Preserve unix socket file (https://github.com/go-gitea/gitea/pull/20499)
|
||||||
|
* Use tippy.js for context popup (https://github.com/go-gitea/gitea/pull/20393)
|
||||||
|
* Add missing parameter for error in log message (https://github.com/go-gitea/gitea/pull/20144)
|
||||||
|
* Do not allow organisation owners add themselves as collaborator (https://github.com/go-gitea/gitea/pull/20043)
|
||||||
|
* Rework file highlight rendering and fix yaml copy-paste (https://github.com/go-gitea/gitea/pull/19967)
|
||||||
|
* Improve code diff highlight, fix incorrect rendered diff result (https://github.com/go-gitea/gitea/pull/19958)
|
||||||
|
* TESTING
|
||||||
|
* Improve OAuth integration tests (https://github.com/go-gitea/gitea/pull/21390)
|
||||||
|
* Add playwright tests (https://github.com/go-gitea/gitea/pull/20123)
|
||||||
|
* BUILD
|
||||||
|
* Switch to building with go1.19 (https://github.com/go-gitea/gitea/pull/20695)
|
||||||
|
* Update JS dependencies, adjust eslint (https://github.com/go-gitea/gitea/pull/20659)
|
||||||
|
* Add more linters to improve code readability (https://github.com/go-gitea/gitea/pull/19989)
|
||||||
|
|
||||||
|
## 1.18.0-0
|
||||||
|
|
||||||
|
This release was replaced by 1.18.0-1 a few hours after being published because the release process [was interrupted](https://codeberg.org/forgejo/forgejo/issues/180).
|
||||||
|
|
||||||
|
## 1.18.0-rc1-2
|
||||||
|
|
||||||
|
This is the first Forgejo release candidate.
|
83
SECURITY.md
|
@ -1,83 +0,0 @@
|
||||||
# Reporting security issues
|
|
||||||
|
|
||||||
The Gitea maintainers take security seriously.
|
|
||||||
|
|
||||||
If you discover a security issue, please bring it to their attention right away!
|
|
||||||
|
|
||||||
## Reporting a Vulnerability
|
|
||||||
|
|
||||||
Please **DO NOT** file a public issue, instead send your report privately to `security@gitea.io`.
|
|
||||||
|
|
||||||
## Protecting Security Information
|
|
||||||
|
|
||||||
Due to the sensitive nature of security information, you can use below GPG public key encrypt your mail body.
|
|
||||||
|
|
||||||
The PGP key is valid until June 24, 2024.
|
|
||||||
|
|
||||||
```
|
|
||||||
Key ID: 6FCD2D5B
|
|
||||||
Key Type: RSA
|
|
||||||
Expires: 6/24/2024
|
|
||||||
Key Size: 4096/4096
|
|
||||||
Fingerprint: 3DE0 3D1E 144A 7F06 9359 99DC AAFD 2381 6FCD 2D5B
|
|
||||||
```
|
|
||||||
|
|
||||||
UserID: Gitea Security <security@gitea.io>
|
|
||||||
|
|
||||||
```
|
|
||||||
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
|
||||||
|
|
||||||
mQINBGK1Z/4BEADFMqXA9DeeChmSxUjF0Be5sq99ZUhgrZjcN/wOzz0wuCJZC0l8
|
|
||||||
4uC+d6mfv7JpJYlzYzOK97/x5UguKHkYNZ6mm1G9KHaXmoIBDLKDzfPdJopVNv2r
|
|
||||||
OajijaE0uMCnMjadlg5pbhMLRQG8a9J32yyaz7ZEAw72Ab31fvvcA53NkuqO4j2w
|
|
||||||
k7dtFQzhbNOYV0VffQT90WDZdalYHB1JHyEQ+70U9OjVD5ggNYSzX98Eu3Hjn7V7
|
|
||||||
kqFrcAxr5TE1elf0IXJcuBJtFzQSTUGlQldKOHtGTGgGjj9r/FFAE5ioBgVD05bV
|
|
||||||
rEEgIMM/GqYaG/nbNpWE6P3mEc2Mnn3pZaRJL0LuF26TLjnqEcMMDp5iIhLdFzXR
|
|
||||||
3tMdtKgQFu+Mtzs3ipwWARYgHyU09RJsI2HeBx7RmZO/Xqrec763Z7zdJ7SpCn0Z
|
|
||||||
q+pHZl24JYR0Kf3T/ZiOC0cGd2QJqpJtg5J6S/OqfX9NH6MsCczO8pUC1N/aHH2X
|
|
||||||
CTme2nF56izORqDWKoiICteL3GpYsCV9nyCidcCmoQsS+DKvE86YhIhVIVWGRY2F
|
|
||||||
lzpAjnN9/KLtQroutrm+Ft0mdjDiJUeFVl1cOHDhoyfCsQh62HumoyZoZvqzQd6e
|
|
||||||
AbN11nq6aViMe2Q3je1AbiBnRnQSHxt1Tc8X4IshO3MQK1Sk7oPI6LA5oQARAQAB
|
|
||||||
tCJHaXRlYSBTZWN1cml0eSA8c2VjdXJpdHlAZ2l0ZWEuaW8+iQJXBBMBCABBFiEE
|
|
||||||
PeA9HhRKfwaTWZncqv0jgW/NLVsFAmK1Z/4CGwMFCQPCZwAFCwkIBwICIgIGFQoJ
|
|
||||||
CAsCBBYCAwECHgcCF4AACgkQqv0jgW/NLVvnyxAAhxyNnWzw/rQO2qhzqicmZM94
|
|
||||||
njSbOg+U2qMBvCdaqCQQeC+uaMmMzkDPanUUmLcyCkWqfCjPNjeSXAkE9npepVJI
|
|
||||||
4HtmgxZQ94OU/h3CLbft+9GVRzUkVI29TSYGdvNtV2/BkNGoFFnKWQr119um0o6A
|
|
||||||
bgha2Uy5uY8o3ZIoiKkiHRaEoWIjjeBxJxYAojsZY4YElUmsQ3ik2joG6rhFesTa
|
|
||||||
ofVt/bL8G2xzpOG26WGIxBbqf2qjV6OtZ0hu/vtTPHeIWMLq0Mz0V3PEDQWfkGPE
|
|
||||||
i2RYxxYDs2xzJhSQWqTNVLSq0m5xTJnbHhQPfdCX4C2jvFKgLdfmytQq49S7jiJb
|
|
||||||
Z03HVOZ/PsyBlQfH9xJi06R5yQCMEA8h8Z5r3/NXW09kQ6OFRe6xshoTcxZGRPTo
|
|
||||||
srhwr3uPbmCRh+YEl7qBLU6+BC5k8IRTZXqhrj/aPJu3MxgbgwV8u3vLoFSXM2lb
|
|
||||||
a61FgeCQ0O7lkgVswwF0RppCaH9Ul3ZDapet/vCRg4NVwm9zOI/8q/Vj0FKA1GDR
|
|
||||||
JhRu8+Ce8zlFL65D34t+PprAzSeTlbv9um3x/ZIjCco7EEKSBylt+AZj/VyA6+e5
|
|
||||||
kjOQwRRc6dFJWBcorsSI2dG+H+QMF7ZabzmeCcz1v9HjLOPzYHoZAHhCmSppWTvX
|
|
||||||
AJy6+lhfW2OUTqQeYSi5Ag0EYrVn/gEQALrFLQjCR3GjuHSindz0rd3Fnx/t7Sen
|
|
||||||
T+p07yCSSoSlmnJHCQmwh4vfg1blyz0zZ4vkIhtpHsEgc+ZAG+WQXSsJ2iRz+eSN
|
|
||||||
GwoOQl4XC3n+QWkc1ws+btr48+6UqXIQU+F8TPQyx/PIgi2nZXJB7f5+mjCqsk46
|
|
||||||
XvH4nTr4kJjuqMSR/++wvre2qNQRa/q/dTsK0OaN/mJsdX6Oi+aGNaQJUhIG7F+E
|
|
||||||
ZDMkn/O6xnwWNzy/+bpg43qH/Gk0eakOmz5NmQLRkV58SZLiJvuCUtkttf6CyhnX
|
|
||||||
03OcWaajv5W8qA39dBYQgDrrPbBWUnwfO3yMveqhwV4JjDoe8sPAyn1NwzakNYqP
|
|
||||||
RzsWyLrLS7R7J9s3FkZXhQw/QQcsaSMcGNQO047dm1P83N8JY5aEpiRo9zSWjoiw
|
|
||||||
qoExANj5lUTZPe8M50lI182FrcjAN7dClO3QI6pg7wy0erMxfFly3j8UQ91ysS9T
|
|
||||||
s+GsP9I3cmWWQcKYxWHtE8xTXnNCVPFZQj2nwhJzae8ypfOtulBRA3dUKWGKuDH/
|
|
||||||
axFENhUsT397aOU3qkP/od4a64JyNIEo4CTTSPVeWd7njsGqli2U3A4xL2CcyYvt
|
|
||||||
D/MWcMBGEoLSNTswwKdom4FaJpn5KThnK/T0bQcmJblJhoCtppXisbexZnCpuS0x
|
|
||||||
Zdlm2T14KJ3LABEBAAGJAjwEGAEIACYWIQQ94D0eFEp/BpNZmdyq/SOBb80tWwUC
|
|
||||||
YrVn/gIbDAUJA8JnAAAKCRCq/SOBb80tWyTBD/9AGpW6QoDF7zYjHAozH9S5RGCA
|
|
||||||
Y7E82dG/0xmFUwPprAG0BKmmgU6TiipyVGmKIXGYYYU92pMnbvXkYQMoa+WJNncN
|
|
||||||
D3fY52UeXeffTf4cFpStlzi9xgYtOLhFamzYu/4xhkjOX+xhOSXscCiFRyT8cF3B
|
|
||||||
O6c5BHU+Zj0/rGPgOyPUbx7l7B9MubB/41nNX35k08e+8T3wtWDb4XF+15HnRfva
|
|
||||||
6fblO8wgU25Orv2Rm1jnKGa9DxJ8nE40IMrqDapENtDuL+zKJsvR0+ptWvEyL56U
|
|
||||||
GtJJG5un6mXiLKuRQT0DEv4MdZRHDgDstDnqcbEiazVEbUuvhZZob6lRY2A19m1+
|
|
||||||
7zfnDxkhqCA1RCnv4fdvcPdCMMFHwLpdhjgW0aI/uwgwrvsEz5+JRlnLvdQHlPAg
|
|
||||||
q7l2fGcBSpz9U0ayyfRPjPntsNCtZl1UDxGLeciPkZhyG84zEWQbk/j52ZpRN+Ik
|
|
||||||
ALpRLa8RBFmFSmXDUmwQrmm1EmARyQXwweKU31hf8ZGbCp2lPuRYm1LuGiirXSVP
|
|
||||||
GysjRAJgW+VRpBKOzFQoUAUbReVWSaCwT8s17THzf71DdDb6CTj31jMLLYWwBpA/
|
|
||||||
i73DgobDZMIGEZZC1EKqza8eh11xfyHFzGec03tbh+lIen+5IiRtWiEWkDS9ll0G
|
|
||||||
zgS/ZdziCvdAutqnGA==
|
|
||||||
=gZWO
|
|
||||||
-----END PGP PUBLIC KEY BLOCK-----
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
Security reports are greatly appreciated and we will publicly thank you for it, although we keep your name confidential if you request it.
|
|
|
@ -476,8 +476,8 @@ INTERNAL_TOKEN=
|
||||||
;;Classes include "lower,upper,digit,spec"
|
;;Classes include "lower,upper,digit,spec"
|
||||||
;PASSWORD_COMPLEXITY = off
|
;PASSWORD_COMPLEXITY = off
|
||||||
;;
|
;;
|
||||||
;; Password Hash algorithm, either "argon2", "pbkdf2", "scrypt" or "bcrypt"
|
;; Password Hash algorithm, either "argon2", "pbkdf2"/"pbkdf2_v2", "pbkdf2_hi", "scrypt" or "bcrypt"
|
||||||
;PASSWORD_HASH_ALGO = pbkdf2
|
;PASSWORD_HASH_ALGO = pbkdf2_hi
|
||||||
;;
|
;;
|
||||||
;; Set false to allow JavaScript to read CSRF cookie
|
;; Set false to allow JavaScript to read CSRF cookie
|
||||||
;CSRF_COOKIE_HTTP_ONLY = true
|
;CSRF_COOKIE_HTTP_ONLY = true
|
||||||
|
|
139
models/forgejo_migrations/migrate.go
Normal file
|
@ -0,0 +1,139 @@
|
||||||
|
// Copyright 2023 The Forgejo Authors. All rights reserved.
|
||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
|
package forgejo_migrations //nolint:revive
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
|
||||||
|
"code.gitea.io/gitea/modules/git"
|
||||||
|
"code.gitea.io/gitea/modules/log"
|
||||||
|
"code.gitea.io/gitea/modules/setting"
|
||||||
|
|
||||||
|
"xorm.io/xorm"
|
||||||
|
"xorm.io/xorm/names"
|
||||||
|
)
|
||||||
|
|
||||||
|
// ForgejoVersion describes the Forgejo version table. Should have only one row with id = 1.
|
||||||
|
type ForgejoVersion struct {
|
||||||
|
ID int64 `xorm:"pk autoincr"`
|
||||||
|
Version int64
|
||||||
|
}
|
||||||
|
|
||||||
|
type Migration struct {
|
||||||
|
description string
|
||||||
|
migrate func(*xorm.Engine) error
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewMigration creates a new migration.
|
||||||
|
func NewMigration(desc string, fn func(*xorm.Engine) error) *Migration {
|
||||||
|
return &Migration{desc, fn}
|
||||||
|
}
|
||||||
|
|
||||||
|
// This is a sequence of additional Forgejo migrations.
|
||||||
|
// Add new migrations to the bottom of the list.
|
||||||
|
var migrations = []*Migration{}
|
||||||
|
|
||||||
|
// GetCurrentDBVersion returns the current Forgejo database version.
|
||||||
|
func GetCurrentDBVersion(x *xorm.Engine) (int64, error) {
|
||||||
|
if err := x.Sync(new(ForgejoVersion)); err != nil {
|
||||||
|
return -1, fmt.Errorf("sync: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
currentVersion := &ForgejoVersion{ID: 1}
|
||||||
|
has, err := x.Get(currentVersion)
|
||||||
|
if err != nil {
|
||||||
|
return -1, fmt.Errorf("get: %w", err)
|
||||||
|
}
|
||||||
|
if !has {
|
||||||
|
return -1, nil
|
||||||
|
}
|
||||||
|
return currentVersion.Version, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// ExpectedVersion returns the expected Forgejo database version.
|
||||||
|
func ExpectedVersion() int64 {
|
||||||
|
return int64(len(migrations))
|
||||||
|
}
|
||||||
|
|
||||||
|
// EnsureUpToDate will check if the Forgejo database is at the correct version.
|
||||||
|
func EnsureUpToDate(x *xorm.Engine) error {
|
||||||
|
currentDB, err := GetCurrentDBVersion(x)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if currentDB < 0 {
|
||||||
|
return fmt.Errorf("database has not been initialized")
|
||||||
|
}
|
||||||
|
|
||||||
|
expected := ExpectedVersion()
|
||||||
|
|
||||||
|
if currentDB != expected {
|
||||||
|
return fmt.Errorf(`current Forgejo database version %d is not equal to the expected version %d. Please run "forgejo [--config /path/to/app.ini] migrate" to update the database version`, currentDB, expected)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Migrate Forgejo database to current version.
|
||||||
|
func Migrate(x *xorm.Engine) error {
|
||||||
|
// Set a new clean the default mapper to GonicMapper as that is the default for .
|
||||||
|
x.SetMapper(names.GonicMapper{})
|
||||||
|
if err := x.Sync(new(ForgejoVersion)); err != nil {
|
||||||
|
return fmt.Errorf("sync: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
currentVersion := &ForgejoVersion{ID: 1}
|
||||||
|
has, err := x.Get(currentVersion)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("get: %w", err)
|
||||||
|
} else if !has {
|
||||||
|
// If the version record does not exist we think
|
||||||
|
// it is a fresh installation and we can skip all migrations.
|
||||||
|
currentVersion.ID = 0
|
||||||
|
currentVersion.Version = ExpectedVersion()
|
||||||
|
|
||||||
|
if _, err = x.InsertOne(currentVersion); err != nil {
|
||||||
|
return fmt.Errorf("insert: %w", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
v := currentVersion.Version
|
||||||
|
|
||||||
|
// Downgrading Forgejo's database version not supported
|
||||||
|
if v > ExpectedVersion() {
|
||||||
|
msg := fmt.Sprintf("Your Forgejo database (migration version: %d) is for a newer version of Forgejo, you cannot use the newer database for this old Forgejo release (%d).", v, ExpectedVersion())
|
||||||
|
msg += "\nForgejo will exit to keep your database safe and unchanged. Please use the correct Forgejo release, do not change the migration version manually (incorrect manual operation may cause data loss)."
|
||||||
|
if !setting.IsProd {
|
||||||
|
msg += fmt.Sprintf("\nIf you are in development and really know what you're doing, you can force changing the migration version by executing: UPDATE forgejo_version SET version=%d WHERE id=1;", ExpectedVersion())
|
||||||
|
}
|
||||||
|
_, _ = fmt.Fprintln(os.Stderr, msg)
|
||||||
|
log.Fatal(msg)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Some migration tasks depend on the git command
|
||||||
|
if git.DefaultContext == nil {
|
||||||
|
if err = git.InitSimple(context.Background()); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Migrate
|
||||||
|
for i, m := range migrations[v:] {
|
||||||
|
log.Info("Migration[%d]: %s", v+int64(i), m.description)
|
||||||
|
// Reset the mapper between each migration - migrations are not supposed to depend on each other
|
||||||
|
x.SetMapper(names.GonicMapper{})
|
||||||
|
if err = m.migrate(x); err != nil {
|
||||||
|
return fmt.Errorf("migration[%d]: %s failed: %w", v+int64(i), m.description, err)
|
||||||
|
}
|
||||||
|
currentVersion.Version = v + int64(i) + 1
|
||||||
|
if _, err = x.ID(1).Update(currentVersion); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
|
@ -9,6 +9,7 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
|
|
||||||
|
"code.gitea.io/gitea/models/forgejo_migrations"
|
||||||
"code.gitea.io/gitea/models/migrations/v1_10"
|
"code.gitea.io/gitea/models/migrations/v1_10"
|
||||||
"code.gitea.io/gitea/models/migrations/v1_11"
|
"code.gitea.io/gitea/models/migrations/v1_11"
|
||||||
"code.gitea.io/gitea/models/migrations/v1_12"
|
"code.gitea.io/gitea/models/migrations/v1_12"
|
||||||
|
@ -607,5 +608,7 @@ Please try upgrading to a lower version first (suggested v1.6.4), then upgrade t
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nil
|
|
||||||
|
// Execute Forgejo specific migrations.
|
||||||
|
return forgejo_migrations.Migrate(x)
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,11 +34,14 @@ func IsWorkflow(path string) bool {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
return strings.HasPrefix(path, ".gitea/workflows") || strings.HasPrefix(path, ".github/workflows")
|
return strings.HasPrefix(path, ".forgejo/workflows") || strings.HasPrefix(path, ".gitea/workflows") || strings.HasPrefix(path, ".github/workflows")
|
||||||
}
|
}
|
||||||
|
|
||||||
func ListWorkflows(commit *git.Commit) (git.Entries, error) {
|
func ListWorkflows(commit *git.Commit) (git.Entries, error) {
|
||||||
tree, err := commit.SubTree(".gitea/workflows")
|
tree, err := commit.SubTree(".forgejo/workflows")
|
||||||
|
if _, ok := err.(git.ErrNotExist); ok {
|
||||||
|
tree, err = commit.SubTree(".gitea/workflows")
|
||||||
|
}
|
||||||
if _, ok := err.(git.ErrNotExist); ok {
|
if _, ok := err.(git.ErrNotExist); ok {
|
||||||
tree, err = commit.SubTree(".github/workflows")
|
tree, err = commit.SubTree(".github/workflows")
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,7 +10,7 @@ package hash
|
||||||
//
|
//
|
||||||
// It will be dealiased as per aliasAlgorithmNames whereas
|
// It will be dealiased as per aliasAlgorithmNames whereas
|
||||||
// defaultEmptyHashAlgorithmSpecification does not undergo dealiasing.
|
// defaultEmptyHashAlgorithmSpecification does not undergo dealiasing.
|
||||||
const DefaultHashAlgorithmName = "pbkdf2"
|
const DefaultHashAlgorithmName = "pbkdf2_hi"
|
||||||
|
|
||||||
var DefaultHashAlgorithm *PasswordHashAlgorithm
|
var DefaultHashAlgorithm *PasswordHashAlgorithm
|
||||||
|
|
||||||
|
|
|
@ -28,11 +28,11 @@ func TestCheckSettingPasswordHashAlgorithm(t *testing.T) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
t.Run("pbkdf2_v2 is the default when default password hash algorithm is empty", func(t *testing.T) {
|
t.Run("pbkdf2_hi is the default when default password hash algorithm is empty", func(t *testing.T) {
|
||||||
emptyConfig, emptyAlgo := SetDefaultPasswordHashAlgorithm("")
|
emptyConfig, emptyAlgo := SetDefaultPasswordHashAlgorithm("")
|
||||||
pbkdf2v2Config, pbkdf2v2Algo := SetDefaultPasswordHashAlgorithm("pbkdf2_v2")
|
pbkdf2hiConfig, pbkdf2hiAlgo := SetDefaultPasswordHashAlgorithm("pbkdf2_hi")
|
||||||
|
|
||||||
assert.Equal(t, pbkdf2v2Config, emptyConfig)
|
assert.Equal(t, pbkdf2hiConfig, emptyConfig)
|
||||||
assert.Equal(t, pbkdf2v2Algo.Specification, emptyAlgo.Specification)
|
assert.Equal(t, pbkdf2hiAlgo.Specification, emptyAlgo.Specification)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
@ -56,8 +56,8 @@ func TestBaseRedis(t *testing.T) {
|
||||||
}()
|
}()
|
||||||
if !waitRedisReady("redis://127.0.0.1:6379/0", 0) {
|
if !waitRedisReady("redis://127.0.0.1:6379/0", 0) {
|
||||||
redisServer = redisServerCmd(t)
|
redisServer = redisServerCmd(t)
|
||||||
if redisServer == nil && os.Getenv("CI") == "" {
|
if true {
|
||||||
t.Skip("redis-server not found")
|
t.Skip("redis-server not found in Forgejo test yet")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
assert.NoError(t, redisServer.Start())
|
assert.NoError(t, redisServer.Start())
|
||||||
|
|
|
@ -4,15 +4,11 @@
|
||||||
package storage
|
package storage
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"os"
|
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestMinioStorageIterator(t *testing.T) {
|
func TestMinioStorageIterator(t *testing.T) {
|
||||||
if os.Getenv("CI") == "" {
|
t.Skip("minio not found in Forgejo test yet")
|
||||||
t.Skip("minioStorage not present outside of CI")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
testStorageIterator(t, string(MinioStorageType), MinioStorageConfig{
|
testStorageIterator(t, string(MinioStorageType), MinioStorageConfig{
|
||||||
Endpoint: "127.0.0.1:9000",
|
Endpoint: "127.0.0.1:9000",
|
||||||
AccessKeyID: "123456",
|
AccessKeyID: "123456",
|
||||||
|
|
|
@ -14,6 +14,10 @@ import (
|
||||||
chi "github.com/go-chi/chi/v5"
|
chi "github.com/go-chi/chi/v5"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type KeyTestMiddlewareHookType string
|
||||||
|
|
||||||
|
var KeyTestMiddlewareHook = KeyTestMiddlewareHookType("testMiddlewareHook")
|
||||||
|
|
||||||
// Bind binding an obj to a handler
|
// Bind binding an obj to a handler
|
||||||
func Bind[T any](_ T) any {
|
func Bind[T any](_ T) any {
|
||||||
return func(ctx *context.Context) {
|
return func(ctx *context.Context) {
|
||||||
|
|
40
public/forgejo/api.v1.yml
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
openapi: 3.0.0
|
||||||
|
info:
|
||||||
|
title: Forgejo API
|
||||||
|
description: |-
|
||||||
|
Forgejo REST API
|
||||||
|
|
||||||
|
contact:
|
||||||
|
email: contact@forgejo.org
|
||||||
|
license:
|
||||||
|
name: MIT
|
||||||
|
url: https://codeberg.org/forgejo/forgejo/src/branch/forgejo/LICENSE
|
||||||
|
version: 1.0.0
|
||||||
|
externalDocs:
|
||||||
|
description: Find out more about Forgejo
|
||||||
|
url: http://forgejo.org
|
||||||
|
servers:
|
||||||
|
- url: /api/forgejo/v1
|
||||||
|
paths:
|
||||||
|
/version:
|
||||||
|
get:
|
||||||
|
summary: API version
|
||||||
|
description: Semantic version of the Forgejo API
|
||||||
|
operationId: getVersion
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: successful operation
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
$ref: '#/components/schemas/Version'
|
||||||
|
components:
|
||||||
|
schemas:
|
||||||
|
Version:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
version:
|
||||||
|
type: string
|
||||||
|
|
3
releases/Dockerfile
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
FROM alpine:3.17
|
||||||
|
|
||||||
|
RUN echo root > state
|
3
releases/Dockerfile-rootless
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
FROM alpine:3.17
|
||||||
|
|
||||||
|
RUN echo rootless > state
|
69
releases/binaries-pull-push-test.sh
Executable file
|
@ -0,0 +1,69 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
set -ex
|
||||||
|
|
||||||
|
test_teardown() {
|
||||||
|
setup_api
|
||||||
|
api DELETE repos/$PUSH_USER/forgejo/releases/tags/$TAG || true
|
||||||
|
api DELETE repos/$PUSH_USER/forgejo/tags/$TAG || true
|
||||||
|
rm -fr dist/release
|
||||||
|
setup_tea
|
||||||
|
$BIN_DIR/tea login delete $RELEASETEAMUSER || true
|
||||||
|
}
|
||||||
|
|
||||||
|
test_setup() {
|
||||||
|
mkdir -p $RELEASE_DIR
|
||||||
|
touch $RELEASE_DIR/file-one.txt
|
||||||
|
touch $RELEASE_DIR/file-two.txt
|
||||||
|
}
|
||||||
|
|
||||||
|
test_ensure_tag() {
|
||||||
|
api DELETE repos/$PUSH_USER/forgejo/tags/$TAG || true
|
||||||
|
#
|
||||||
|
# idempotent
|
||||||
|
#
|
||||||
|
ensure_tag
|
||||||
|
api GET repos/$PUSH_USER/forgejo/tags/$TAG > /tmp/tag1.json
|
||||||
|
ensure_tag
|
||||||
|
api GET repos/$PUSH_USER/forgejo/tags/$TAG > /tmp/tag2.json
|
||||||
|
diff -u /tmp/tag[12].json
|
||||||
|
#
|
||||||
|
# sanity check on the SHA of an existing tag
|
||||||
|
#
|
||||||
|
(
|
||||||
|
CI_COMMIT_SHA=12345
|
||||||
|
! ensure_tag
|
||||||
|
)
|
||||||
|
api DELETE repos/$PUSH_USER/forgejo/tags/$TAG
|
||||||
|
}
|
||||||
|
|
||||||
|
#
|
||||||
|
# Running the test locally instead of within Woodpecker
|
||||||
|
#
|
||||||
|
# 1. Setup: obtain a token at https://codeberg.org/user/settings/applications
|
||||||
|
# 2. Run: RELEASETEAMUSER=<username> RELEASETEAMTOKEn=<apptoken> binaries-pull-push-test.sh test_run
|
||||||
|
# 3. Verify: (optional) manual verification at https://codeberg.org/<username>/forgejo/releases
|
||||||
|
# 4. Cleanup: RELEASETEAMUSER=<username> RELEASETEAMTOKEn=<apptoken> binaries-pull-push-test.sh test_teardown
|
||||||
|
#
|
||||||
|
test_run() {
|
||||||
|
test_teardown
|
||||||
|
to_push=/tmp/binaries-releases-to-push
|
||||||
|
pulled=/tmp/binaries-releases-pulled
|
||||||
|
RELEASE_DIR=$to_push
|
||||||
|
test_setup
|
||||||
|
test_ensure_tag
|
||||||
|
echo "================================ TEST BEGIN"
|
||||||
|
push
|
||||||
|
RELEASE_DIR=$pulled
|
||||||
|
pull
|
||||||
|
diff -r $to_push $pulled
|
||||||
|
echo "================================ TEST END"
|
||||||
|
}
|
||||||
|
|
||||||
|
: ${CI_REPO_OWNER:=dachary}
|
||||||
|
: ${PULL_USER=$CI_REPO_OWNER}
|
||||||
|
: ${PUSH_USER=$CI_REPO_OWNER}
|
||||||
|
: ${CI_COMMIT_TAG:=W17.8.20-1}
|
||||||
|
: ${CI_COMMIT_SHA:=$(git rev-parse HEAD)}
|
||||||
|
|
||||||
|
. $(dirname $0)/binaries-pull-push.sh
|
88
releases/binaries-pull-push.sh
Executable file
|
@ -0,0 +1,88 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
set -ex
|
||||||
|
|
||||||
|
: ${PULL_USER:=forgejo-integration}
|
||||||
|
if test "$CI_REPO" = "forgejo/release" ; then
|
||||||
|
: ${PUSH_USER:=forgejo}
|
||||||
|
else
|
||||||
|
: ${PUSH_USER:=forgejo-experimental}
|
||||||
|
fi
|
||||||
|
: ${TAG:=${CI_COMMIT_TAG}}
|
||||||
|
: ${DOMAIN:=codeberg.org}
|
||||||
|
: ${RELEASE_DIR:=dist/release}
|
||||||
|
: ${BIN_DIR:=/tmp}
|
||||||
|
: ${TEA_VERSION:=0.9.0}
|
||||||
|
|
||||||
|
|
||||||
|
setup_tea() {
|
||||||
|
if ! test -f $BIN_DIR/tea ; then
|
||||||
|
curl -sL https://dl.gitea.io/tea/$TEA_VERSION/tea-$TEA_VERSION-linux-amd64 > $BIN_DIR/tea
|
||||||
|
chmod +x $BIN_DIR/tea
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
ensure_tag() {
|
||||||
|
if api GET repos/$PUSH_USER/forgejo/tags/$TAG > /tmp/tag.json ; then
|
||||||
|
local sha=$(jq --raw-output .commit.sha < /tmp/tag.json)
|
||||||
|
if test "$sha" != "$CI_COMMIT_SHA" ; then
|
||||||
|
cat /tmp/tag.json
|
||||||
|
echo "the tag SHA in the $PUSH_USER repository does not match the tag SHA that triggered the build: $CI_COMMIT_SHA"
|
||||||
|
false
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
api POST repos/$PUSH_USER/forgejo/tags --data-raw '{"tag_name": "'$CI_COMMIT_TAG'", "target": "'$CI_COMMIT_SHA'"}'
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
upload() {
|
||||||
|
ASSETS=$(ls $RELEASE_DIR/* | sed -e 's/^/-a /')
|
||||||
|
echo "${CI_COMMIT_TAG}" | grep -qi '\-rc' && export RELEASETYPE="--prerelease" && echo "Uploading as Pre-Release"
|
||||||
|
echo "${CI_COMMIT_TAG}" | grep -qi '\-test' && export RELEASETYPE="--draft" && echo "Uploading as Draft"
|
||||||
|
test ${RELEASETYPE+false} || echo "Uploading as Stable"
|
||||||
|
ensure_tag
|
||||||
|
anchor=$(echo $CI_COMMIT_TAG | sed -e 's/^v//' -e 's/[^a-zA-Z0-9]/-/g')
|
||||||
|
$BIN_DIR/tea release create $ASSETS --repo $PUSH_USER/forgejo --note "See https://codeberg.org/forgejo/forgejo/src/branch/forgejo/RELEASE-NOTES.md#${anchor}" --tag $CI_COMMIT_TAG --title $CI_COMMIT_TAG ${RELEASETYPE}
|
||||||
|
}
|
||||||
|
|
||||||
|
push() {
|
||||||
|
setup_api
|
||||||
|
setup_tea
|
||||||
|
GITEA_SERVER_TOKEN=$RELEASETEAMTOKEN $BIN_DIR/tea login add --name $RELEASETEAMUSER --url $DOMAIN
|
||||||
|
upload
|
||||||
|
}
|
||||||
|
|
||||||
|
setup_api() {
|
||||||
|
if ! which jq || ! which curl ; then
|
||||||
|
apk --update --no-cache add jq curl
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
api() {
|
||||||
|
method=$1
|
||||||
|
shift
|
||||||
|
path=$1
|
||||||
|
shift
|
||||||
|
|
||||||
|
curl --fail -X $method -sS -H "Content-Type: application/json" -H "Authorization: token $RELEASETEAMTOKEN" "$@" https://$DOMAIN/api/v1/$path
|
||||||
|
}
|
||||||
|
|
||||||
|
pull() {
|
||||||
|
setup_api
|
||||||
|
(
|
||||||
|
mkdir -p $RELEASE_DIR
|
||||||
|
cd $RELEASE_DIR
|
||||||
|
api GET repos/$PULL_USER/forgejo/releases/tags/$TAG > /tmp/assets.json
|
||||||
|
jq --raw-output '.assets[] | "\(.name) \(.browser_download_url)"' < /tmp/assets.json | while read name url ; do
|
||||||
|
wget --quiet -O $name $url
|
||||||
|
done
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
missing() {
|
||||||
|
echo need pull or push argument got nothing
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
${@:-missing}
|
70
releases/container-images-pull-verify-push-test.sh
Executable file
|
@ -0,0 +1,70 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
set -ex
|
||||||
|
|
||||||
|
image_delete() {
|
||||||
|
curl -sS -H @$TOKEN_HEADER -X DELETE https://$DOMAIN/v2/$1/forgejo/manifests/$2
|
||||||
|
}
|
||||||
|
|
||||||
|
#
|
||||||
|
# Create the same set of images that buildx would
|
||||||
|
#
|
||||||
|
test_setup() {
|
||||||
|
dir=$(dirname $0)
|
||||||
|
|
||||||
|
for suffix in '' '-rootless' ; do
|
||||||
|
(
|
||||||
|
cd $dir
|
||||||
|
manifests=""
|
||||||
|
for arch in $ARCHS ; do
|
||||||
|
image=$(arch_image_name $PULL_USER $arch $suffix)
|
||||||
|
docker build -f Dockerfile$suffix --platform linux/$arch -t $image .
|
||||||
|
docker push $image
|
||||||
|
images="$images $image"
|
||||||
|
done
|
||||||
|
manifest=$(image_name $PULL_USER $suffix)
|
||||||
|
docker manifest rm $manifest || true
|
||||||
|
docker manifest create $manifest $images
|
||||||
|
image_put $PULL_USER $(image_tag $suffix) $manifest
|
||||||
|
)
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
test_teardown() {
|
||||||
|
authenticate
|
||||||
|
for suffix in '' '-rootless' ; do
|
||||||
|
image_delete $PULL_USER $(image_tag $suffix)
|
||||||
|
image_delete $PUSH_USER $(image_tag $suffix)
|
||||||
|
image_delete $PUSH_USER $(short_image_tag $suffix)
|
||||||
|
for arch in $ARCHS ; do
|
||||||
|
image_delete $PULL_USER $(arch_image_tag $arch $suffix)
|
||||||
|
image_delete $PUSH_USER $(arch_image_tag $arch $suffix)
|
||||||
|
done
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
#
|
||||||
|
# Running the test locally instead of within Woodpecker
|
||||||
|
#
|
||||||
|
# 1. Setup: obtain a token at https://codeberg.org/user/settings/applications
|
||||||
|
# 2. Run: RELEASETEAMUSER=<username> RELEASETEAMTOKEn=<apptoken> container-images-pull-verify-push-test.sh test_run
|
||||||
|
# 3. Verify: (optional) manual verification at https://codeberg.org/<username>/-/packages/container/forgejo/versions
|
||||||
|
# 4. Cleanup: RELEASETEAMUSER=<username> RELEASETEAMTOKEn=<apptoken> container-images-pull-verify-push-test.sh test_teardown
|
||||||
|
#
|
||||||
|
test_run() {
|
||||||
|
boot
|
||||||
|
test_teardown
|
||||||
|
test_setup
|
||||||
|
VERIFY_STRING=something
|
||||||
|
VERIFY_COMMAND="echo $VERIFY_STRING"
|
||||||
|
echo "================================ TEST BEGIN"
|
||||||
|
main
|
||||||
|
echo "================================ TEST END"
|
||||||
|
}
|
||||||
|
|
||||||
|
: ${CI_REPO_OWNER:=dachary}
|
||||||
|
: ${PULL_USER:=$CI_REPO_OWNER}
|
||||||
|
: ${PUSH_USER:=$CI_REPO_OWNER}
|
||||||
|
: ${CI_COMMIT_TAG:=v17.1.42-2}
|
||||||
|
|
||||||
|
. $(dirname $0)/container-images-pull-verify-push.sh
|
122
releases/container-images-pull-verify-push.sh
Executable file
|
@ -0,0 +1,122 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
set -ex
|
||||||
|
|
||||||
|
: ${DOCKER_HOST:=unix:///var/run/docker.sock}
|
||||||
|
: ${ARCHS:=amd64 arm64}
|
||||||
|
: ${PULL_USER:=forgejo-integration}
|
||||||
|
if test "$CI_REPO" = "forgejo/release" ; then
|
||||||
|
: ${PUSH_USER:=forgejo}
|
||||||
|
else
|
||||||
|
: ${PUSH_USER:=forgejo-experimental}
|
||||||
|
fi
|
||||||
|
: ${INTEGRATION_IMAGE:=codeberg.org/$PULL_USER/forgejo}
|
||||||
|
: ${TAG:=${CI_COMMIT_TAG##v}}
|
||||||
|
: ${SHORT_TAG=${TAG%.*-*}}
|
||||||
|
: ${DOMAIN:=codeberg.org}
|
||||||
|
: ${TOKEN_HEADER:=/tmp/token$$}
|
||||||
|
trap "rm -f ${TOKEN_HEADER}" EXIT
|
||||||
|
|
||||||
|
: ${VERIFY:=true}
|
||||||
|
VERIFY_COMMAND='gitea --version'
|
||||||
|
VERIFY_STRING='built with'
|
||||||
|
|
||||||
|
publish() {
|
||||||
|
for suffix in '' '-rootless' ; do
|
||||||
|
images=""
|
||||||
|
for arch in $ARCHS ; do
|
||||||
|
#
|
||||||
|
# Get the image from the integration user
|
||||||
|
#
|
||||||
|
image=$(image_name $PULL_USER $suffix)
|
||||||
|
docker pull --platform linux/$arch $image
|
||||||
|
#
|
||||||
|
# Verify it is usable
|
||||||
|
#
|
||||||
|
if $VERIFY ; then
|
||||||
|
docker run --platform linux/$arch --rm $image $VERIFY_COMMAND | grep "$VERIFY_STRING"
|
||||||
|
fi
|
||||||
|
#
|
||||||
|
# Push the image with a tag reflecting the architecture to the repo owner
|
||||||
|
#
|
||||||
|
arch_image=$(arch_image_name $PUSH_USER $arch $suffix)
|
||||||
|
docker tag $image $arch_image
|
||||||
|
docker push $arch_image
|
||||||
|
images="$images $arch_image"
|
||||||
|
done
|
||||||
|
|
||||||
|
#
|
||||||
|
# Push a manifest with all the architectures to the repo owner
|
||||||
|
#
|
||||||
|
manifest=$(image_name $PUSH_USER $suffix)
|
||||||
|
docker manifest rm $manifest || true
|
||||||
|
docker manifest create $manifest $images
|
||||||
|
image_put $PUSH_USER $(image_tag $suffix) $manifest
|
||||||
|
image_put $PUSH_USER $(short_image_tag $suffix) $manifest
|
||||||
|
#
|
||||||
|
# Sanity check to ensure the manifest that are published can actualy
|
||||||
|
# be used.
|
||||||
|
#
|
||||||
|
for arch in $ARCHS ; do
|
||||||
|
docker pull --platform linux/$arch $(image_name $PUSH_USER $suffix)
|
||||||
|
docker pull --platform linux/$arch $(short_image_name $PUSH_USER $suffix)
|
||||||
|
done
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
boot() {
|
||||||
|
if docker version ; then
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
apk --update --no-cache add coredns jq curl
|
||||||
|
( echo ".:53 {" ; echo " forward . /etc/resolv.conf"; echo "}" ) > /etc/coredns/Corefile
|
||||||
|
coredns -conf /etc/coredns/Corefile &
|
||||||
|
/usr/local/bin/dockerd --data-root /var/lib/docker --host=$DOCKER_HOST --dns 172.17.0.3 &
|
||||||
|
for i in $(seq 60) ; do
|
||||||
|
docker version && break
|
||||||
|
sleep 1
|
||||||
|
done
|
||||||
|
docker version || exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
authenticate() {
|
||||||
|
echo "$RELEASETEAMTOKEN" | docker login --password-stdin --username "$RELEASETEAMUSER" $DOMAIN
|
||||||
|
curl -u$RELEASETEAMUSER:$RELEASETEAMTOKEN -sS https://$DOMAIN/v2/token | jq --raw-output '"Authorization: token \(.token)"' > $TOKEN_HEADER
|
||||||
|
}
|
||||||
|
|
||||||
|
image_put() {
|
||||||
|
docker manifest inspect $3 > /tmp/manifest.json
|
||||||
|
curl -sS -H @$TOKEN_HEADER -X PUT --data-binary @/tmp/manifest.json https://$DOMAIN/v2/$1/forgejo/manifests/$2
|
||||||
|
}
|
||||||
|
|
||||||
|
main() {
|
||||||
|
boot
|
||||||
|
authenticate
|
||||||
|
publish
|
||||||
|
}
|
||||||
|
|
||||||
|
image_name() {
|
||||||
|
echo $DOMAIN/$1/forgejo:$(image_tag $2)
|
||||||
|
}
|
||||||
|
|
||||||
|
image_tag() {
|
||||||
|
echo $TAG$1
|
||||||
|
}
|
||||||
|
|
||||||
|
short_image_name() {
|
||||||
|
echo $DOMAIN/$1/forgejo:$(short_image_tag $2)
|
||||||
|
}
|
||||||
|
|
||||||
|
short_image_tag() {
|
||||||
|
echo $SHORT_TAG$1
|
||||||
|
}
|
||||||
|
|
||||||
|
arch_image_name() {
|
||||||
|
echo $DOMAIN/$1/forgejo:$(arch_image_tag $2 $3)
|
||||||
|
}
|
||||||
|
|
||||||
|
arch_image_tag() {
|
||||||
|
echo $TAG-$1$2
|
||||||
|
}
|
||||||
|
|
||||||
|
${@:-main}
|
BIN
releases/images/forgejo-v1.18.0-rc1-2-landing.jpg
Normal file
After Width: | Height: | Size: 106 KiB |
BIN
releases/images/forgejo-v1.19-citation-dialog.png
Normal file
After Width: | Height: | Size: 14 KiB |
BIN
releases/images/forgejo-v1.19-citation-link.png
Normal file
After Width: | Height: | Size: 20 KiB |
BIN
releases/images/forgejo-v1.19-note-warning.png
Normal file
After Width: | Height: | Size: 26 KiB |
BIN
releases/images/forgejo-v1.19-oidc-part1.png
Normal file
After Width: | Height: | Size: 30 KiB |
BIN
releases/images/forgejo-v1.19-oidc-part2.png
Normal file
After Width: | Height: | Size: 33 KiB |
BIN
releases/images/forgejo-v1.19-raw-copy-after.png
Normal file
After Width: | Height: | Size: 20 KiB |
BIN
releases/images/forgejo-v1.19-raw-copy-before.png
Normal file
After Width: | Height: | Size: 18 KiB |
BIN
releases/images/forgejo-v1.19-relevant.png
Normal file
After Width: | Height: | Size: 41 KiB |
BIN
releases/images/forgejo-v1.19.0-0-rc0.png
Normal file
After Width: | Height: | Size: 128 KiB |
107
releases/woodpecker-build/binaries.yml
Normal file
|
@ -0,0 +1,107 @@
|
||||||
|
platform: linux/amd64
|
||||||
|
|
||||||
|
when:
|
||||||
|
event: tag
|
||||||
|
tag: v*
|
||||||
|
|
||||||
|
variables:
|
||||||
|
- &node_image 'node:18'
|
||||||
|
- &golang_image 'golang:1.20'
|
||||||
|
- &alpine_image 'alpine:3.17'
|
||||||
|
- &gpg_sign_image 'plugins/gpgsign:1'
|
||||||
|
- &xgo_image 'techknowlogick/xgo:go-1.19.x'
|
||||||
|
- &gpg_sign_image 'plugins/gpgsign:1'
|
||||||
|
- &goproxy_override ''
|
||||||
|
- &goproxy_setup |-
|
||||||
|
if [ -n "$${GOPROXY_OVERRIDE:-}" ]; then
|
||||||
|
export GOPROXY="$${GOPROXY_OVERRIDE}";
|
||||||
|
echo "Using goproxy from goproxy_override \"$${GOPROXY}\"";
|
||||||
|
elif [ -n "$${GOPROXY_DEFAULT:-}" ]; then
|
||||||
|
export GOPROXY="$${GOPROXY_DEFAULT}";
|
||||||
|
echo "Using goproxy from goproxy_default (secret) not displaying";
|
||||||
|
else
|
||||||
|
export GOPROXY="https://proxy.golang.org,direct";
|
||||||
|
echo "No goproxy overrides or defaults given, using \"$${GOPROXY}\"";
|
||||||
|
fi
|
||||||
|
|
||||||
|
workspace:
|
||||||
|
base: /source
|
||||||
|
path: /
|
||||||
|
|
||||||
|
pipeline:
|
||||||
|
fetch-tags:
|
||||||
|
image: *golang_image
|
||||||
|
pull: true
|
||||||
|
group: deps
|
||||||
|
commands:
|
||||||
|
- git config --add safe.directory '*'
|
||||||
|
- git fetch --tags --force
|
||||||
|
|
||||||
|
deps-frontend:
|
||||||
|
image: *node_image
|
||||||
|
pull: true
|
||||||
|
group: deps
|
||||||
|
commands:
|
||||||
|
- make deps-frontend
|
||||||
|
|
||||||
|
deps-backend:
|
||||||
|
image: *golang_image
|
||||||
|
pull: true
|
||||||
|
group: deps
|
||||||
|
environment:
|
||||||
|
GOPROXY_OVERRIDE: *goproxy_override
|
||||||
|
secrets:
|
||||||
|
- goproxy_default
|
||||||
|
commands:
|
||||||
|
- *goproxy_setup
|
||||||
|
- make deps-backend
|
||||||
|
|
||||||
|
static:
|
||||||
|
image: *xgo_image
|
||||||
|
pull: true
|
||||||
|
commands:
|
||||||
|
- *goproxy_setup
|
||||||
|
- curl -sL https://deb.nodesource.com/setup_16.x | bash - && apt-get -qqy install nodejs
|
||||||
|
- export PATH=$PATH:$GOPATH/bin
|
||||||
|
- make CI=true LINUX_ARCHS=linux/amd64,linux/arm64,linux/arm-6 release
|
||||||
|
environment:
|
||||||
|
TAGS: 'bindata sqlite sqlite_unlock_notify'
|
||||||
|
DEBIAN_FRONTEND: 'noninteractive'
|
||||||
|
GOPROXY_OVERRIDE: *goproxy_override
|
||||||
|
secrets:
|
||||||
|
- goproxy_default
|
||||||
|
|
||||||
|
#
|
||||||
|
# See https://codeberg.org/forgejo/forgejo/issues/230 for a discussion on this
|
||||||
|
# compilation stage. The goal is just to verify the build does not break, not that
|
||||||
|
# the binary produced actually works.
|
||||||
|
#
|
||||||
|
freebsd:
|
||||||
|
image: *xgo_image
|
||||||
|
group: build
|
||||||
|
commands:
|
||||||
|
- *goproxy_setup
|
||||||
|
- export PATH=$PATH:$GOPATH/bin
|
||||||
|
- make CI=false release-freebsd
|
||||||
|
environment:
|
||||||
|
TAGS: 'bindata sqlite sqlite_unlock_notify'
|
||||||
|
GOPROXY_OVERRIDE: *goproxy_override
|
||||||
|
secrets:
|
||||||
|
- goproxy_default
|
||||||
|
|
||||||
|
verifyruns:
|
||||||
|
image: *golang_image
|
||||||
|
commands:
|
||||||
|
- ./dist/release/forgejo-*-amd64 --version | grep 'built with'
|
||||||
|
- apt-get update
|
||||||
|
- apt-get install -y qemu-user-static
|
||||||
|
- /usr/bin/qemu-aarch64-static ./dist/release/forgejo-*-arm64 --version | grep 'built with'
|
||||||
|
- /usr/bin/qemu-arm-static ./dist/release/forgejo-*-arm-6 --version | grep 'built with'
|
||||||
|
|
||||||
|
push-integration:
|
||||||
|
image: *alpine_image
|
||||||
|
commands:
|
||||||
|
- PUSH_USER=$CI_REPO_OWNER releases/binaries-pull-push.sh push
|
||||||
|
secrets:
|
||||||
|
- releaseteamtoken
|
||||||
|
- releaseteamuser
|
65
releases/woodpecker-build/container-images.yml
Normal file
|
@ -0,0 +1,65 @@
|
||||||
|
platform: linux/amd64
|
||||||
|
|
||||||
|
when:
|
||||||
|
event: tag
|
||||||
|
tag: v*
|
||||||
|
|
||||||
|
variables:
|
||||||
|
- &golang_image 'golang:1.20'
|
||||||
|
- &dind_image 'docker:20.10-dind'
|
||||||
|
- &buildx_image 'woodpeckerci/plugin-docker-buildx:2.0.0'
|
||||||
|
- &integration_image 'codeberg.org/forgejo-integration/forgejo'
|
||||||
|
- &dockerfile_root 'Dockerfile'
|
||||||
|
# for testing purposes
|
||||||
|
# - &dockerfile_root 'releases/Dockerfile'
|
||||||
|
- &dockerfile_rootless 'Dockerfile.rootless'
|
||||||
|
# for testing purposes
|
||||||
|
# - &dockerfile_rootless 'releases/Dockerfile-rootless'
|
||||||
|
- &verify 'true'
|
||||||
|
# for testing purposes
|
||||||
|
# - &verify 'false'
|
||||||
|
- &archs 'amd64 arm64'
|
||||||
|
|
||||||
|
pipeline:
|
||||||
|
fetch-tags:
|
||||||
|
image: *golang_image
|
||||||
|
pull: true
|
||||||
|
commands:
|
||||||
|
- git config --add safe.directory '*'
|
||||||
|
- git fetch --tags --force
|
||||||
|
|
||||||
|
build-root:
|
||||||
|
image: *buildx_image
|
||||||
|
group: integration
|
||||||
|
pull: true
|
||||||
|
settings:
|
||||||
|
platforms: linux/amd64,linux/arm64
|
||||||
|
dockerfile: *dockerfile_root
|
||||||
|
registry:
|
||||||
|
from_secret: domain
|
||||||
|
tag: ${CI_COMMIT_TAG##v}
|
||||||
|
repo: *integration_image
|
||||||
|
build_args:
|
||||||
|
- GOPROXY=https://proxy.golang.org
|
||||||
|
password:
|
||||||
|
from_secret: releaseteamtoken
|
||||||
|
username:
|
||||||
|
from_secret: releaseteamuser
|
||||||
|
|
||||||
|
build-rootless:
|
||||||
|
image: *buildx_image
|
||||||
|
group: integration
|
||||||
|
pull: true
|
||||||
|
settings:
|
||||||
|
platforms: linux/amd64,linux/arm64
|
||||||
|
dockerfile: *dockerfile_rootless
|
||||||
|
registry:
|
||||||
|
from_secret: domain
|
||||||
|
tag: ${CI_COMMIT_TAG##v}-rootless
|
||||||
|
repo: *integration_image
|
||||||
|
build_args:
|
||||||
|
- GOPROXY=https://proxy.golang.org
|
||||||
|
password:
|
||||||
|
from_secret: releaseteamtoken
|
||||||
|
username:
|
||||||
|
from_secret: releaseteamuser
|
34
releases/woodpecker-build/releases-helper.yml
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
platform: linux/amd64
|
||||||
|
|
||||||
|
when:
|
||||||
|
event: push
|
||||||
|
|
||||||
|
variables:
|
||||||
|
- &dind_image 'docker:20.10-dind'
|
||||||
|
- &alpine_image 'alpine:3.17'
|
||||||
|
|
||||||
|
pipeline:
|
||||||
|
container-images-pull-verify-push:
|
||||||
|
image: *dind_image
|
||||||
|
group: integration
|
||||||
|
commands:
|
||||||
|
# arm64 would require qemu-user-static which is not available on alpline
|
||||||
|
# the test coverage does not change much and running the tests test locally
|
||||||
|
# is possible if there is a doubt
|
||||||
|
- ARCHS=amd64 ./releases/container-images-pull-verify-push-test.sh test_run
|
||||||
|
- ./releases/container-images-pull-verify-push-test.sh test_teardown
|
||||||
|
secrets:
|
||||||
|
- releaseteamuser
|
||||||
|
- releaseteamtoken
|
||||||
|
- domain
|
||||||
|
|
||||||
|
binaries-pull-push:
|
||||||
|
image: *alpine_image
|
||||||
|
group: integration
|
||||||
|
commands:
|
||||||
|
- ./releases/binaries-pull-push-test.sh test_run
|
||||||
|
- ./releases/binaries-pull-push-test.sh test_teardown
|
||||||
|
secrets:
|
||||||
|
- releaseteamuser
|
||||||
|
- releaseteamtoken
|
||||||
|
- domain
|
36
releases/woodpecker-publish/binaries.yml
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
platform: linux/amd64
|
||||||
|
|
||||||
|
when:
|
||||||
|
event: tag
|
||||||
|
|
||||||
|
variables:
|
||||||
|
- &dind_image 'docker:20.10-dind'
|
||||||
|
- &gpg_sign_image 'plugins/gpgsign:1'
|
||||||
|
|
||||||
|
pipeline:
|
||||||
|
|
||||||
|
pull:
|
||||||
|
image: *dind_image
|
||||||
|
commands:
|
||||||
|
- ./releases/binaries-pull-push.sh pull
|
||||||
|
|
||||||
|
gpg-sign:
|
||||||
|
image: *gpg_sign_image
|
||||||
|
pull: true
|
||||||
|
settings:
|
||||||
|
detach_sign: true
|
||||||
|
excludes:
|
||||||
|
- "dist/release/*.sha256"
|
||||||
|
files:
|
||||||
|
- "dist/release/*"
|
||||||
|
key:
|
||||||
|
from_secret: releaseteamgpg
|
||||||
|
|
||||||
|
push:
|
||||||
|
image: *dind_image
|
||||||
|
commands:
|
||||||
|
- ./releases/binaries-pull-push.sh push
|
||||||
|
secrets:
|
||||||
|
- releaseteamtoken
|
||||||
|
- releaseteamuser
|
||||||
|
- domain
|
27
releases/woodpecker-publish/container-images.yml
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
platform: linux/amd64
|
||||||
|
|
||||||
|
when:
|
||||||
|
event: tag
|
||||||
|
|
||||||
|
variables:
|
||||||
|
- &dind_image 'docker:20.10-dind'
|
||||||
|
- &integration_image 'codeberg.org/forgejo-integration/forgejo'
|
||||||
|
- &verify 'true'
|
||||||
|
# for testing purposes
|
||||||
|
# - &verify 'false'
|
||||||
|
- &archs 'amd64 arm64'
|
||||||
|
|
||||||
|
pipeline:
|
||||||
|
|
||||||
|
publish:
|
||||||
|
image: *dind_image
|
||||||
|
environment:
|
||||||
|
INTEGRATION_IMAGE: *integration_image
|
||||||
|
VERIFY: *verify
|
||||||
|
ARCHS: *archs
|
||||||
|
commands:
|
||||||
|
- ./releases/container-images-pull-verify-push.sh
|
||||||
|
secrets:
|
||||||
|
- releaseteamtoken
|
||||||
|
- releaseteamuser
|
||||||
|
- domain
|
18
routers/api/forgejo/v1/api.go
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
// Copyright 2023 The Forgejo Authors. All rights reserved.
|
||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
|
package v1
|
||||||
|
|
||||||
|
import (
|
||||||
|
gocontext "context"
|
||||||
|
|
||||||
|
"code.gitea.io/gitea/modules/web"
|
||||||
|
)
|
||||||
|
|
||||||
|
func Routes(ctx gocontext.Context) *web.Route {
|
||||||
|
m := web.NewRoute()
|
||||||
|
forgejo := NewForgejo()
|
||||||
|
m.Get("", Root)
|
||||||
|
m.Get("/version", forgejo.GetVersion)
|
||||||
|
return m
|
||||||
|
}
|
24
routers/api/forgejo/v1/forgejo.go
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
|
package v1
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net/http"
|
||||||
|
|
||||||
|
"code.gitea.io/gitea/modules/json"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Forgejo struct{}
|
||||||
|
|
||||||
|
var _ ServerInterface = &Forgejo{}
|
||||||
|
|
||||||
|
func NewForgejo() *Forgejo {
|
||||||
|
return &Forgejo{}
|
||||||
|
}
|
||||||
|
|
||||||
|
var ForgejoVersion = "development"
|
||||||
|
|
||||||
|
func (f *Forgejo) GetVersion(w http.ResponseWriter, r *http.Request) {
|
||||||
|
w.WriteHeader(http.StatusOK)
|
||||||
|
_ = json.NewEncoder(w).Encode(Version{&ForgejoVersion})
|
||||||
|
}
|
167
routers/api/forgejo/v1/generated.go
Normal file
|
@ -0,0 +1,167 @@
|
||||||
|
// Package v1 provides primitives to interact with the openapi HTTP API.
|
||||||
|
//
|
||||||
|
// Code generated by github.com/deepmap/oapi-codegen version v1.12.4 DO NOT EDIT.
|
||||||
|
package v1
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"net/http"
|
||||||
|
|
||||||
|
"github.com/go-chi/chi/v5"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Version defines model for Version.
|
||||||
|
type Version struct {
|
||||||
|
Version *string `json:"version,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// ServerInterface represents all server handlers.
|
||||||
|
type ServerInterface interface {
|
||||||
|
// API version
|
||||||
|
// (GET /version)
|
||||||
|
GetVersion(w http.ResponseWriter, r *http.Request)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ServerInterfaceWrapper converts contexts to parameters.
|
||||||
|
type ServerInterfaceWrapper struct {
|
||||||
|
Handler ServerInterface
|
||||||
|
HandlerMiddlewares []MiddlewareFunc
|
||||||
|
ErrorHandlerFunc func(w http.ResponseWriter, r *http.Request, err error)
|
||||||
|
}
|
||||||
|
|
||||||
|
type MiddlewareFunc func(http.Handler) http.Handler
|
||||||
|
|
||||||
|
// GetVersion operation middleware
|
||||||
|
func (siw *ServerInterfaceWrapper) GetVersion(w http.ResponseWriter, r *http.Request) {
|
||||||
|
ctx := r.Context()
|
||||||
|
|
||||||
|
var handler http.Handler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
siw.Handler.GetVersion(w, r)
|
||||||
|
})
|
||||||
|
|
||||||
|
for _, middleware := range siw.HandlerMiddlewares {
|
||||||
|
handler = middleware(handler)
|
||||||
|
}
|
||||||
|
|
||||||
|
handler.ServeHTTP(w, r.WithContext(ctx))
|
||||||
|
}
|
||||||
|
|
||||||
|
type UnescapedCookieParamError struct {
|
||||||
|
ParamName string
|
||||||
|
Err error
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *UnescapedCookieParamError) Error() string {
|
||||||
|
return fmt.Sprintf("error unescaping cookie parameter '%s'", e.ParamName)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *UnescapedCookieParamError) Unwrap() error {
|
||||||
|
return e.Err
|
||||||
|
}
|
||||||
|
|
||||||
|
type UnmarshallingParamError struct {
|
||||||
|
ParamName string
|
||||||
|
Err error
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *UnmarshallingParamError) Error() string {
|
||||||
|
return fmt.Sprintf("Error unmarshalling parameter %s as JSON: %s", e.ParamName, e.Err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *UnmarshallingParamError) Unwrap() error {
|
||||||
|
return e.Err
|
||||||
|
}
|
||||||
|
|
||||||
|
type RequiredParamError struct {
|
||||||
|
ParamName string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *RequiredParamError) Error() string {
|
||||||
|
return fmt.Sprintf("Query argument %s is required, but not found", e.ParamName)
|
||||||
|
}
|
||||||
|
|
||||||
|
type RequiredHeaderError struct {
|
||||||
|
ParamName string
|
||||||
|
Err error
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *RequiredHeaderError) Error() string {
|
||||||
|
return fmt.Sprintf("Header parameter %s is required, but not found", e.ParamName)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *RequiredHeaderError) Unwrap() error {
|
||||||
|
return e.Err
|
||||||
|
}
|
||||||
|
|
||||||
|
type InvalidParamFormatError struct {
|
||||||
|
ParamName string
|
||||||
|
Err error
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *InvalidParamFormatError) Error() string {
|
||||||
|
return fmt.Sprintf("Invalid format for parameter %s: %s", e.ParamName, e.Err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *InvalidParamFormatError) Unwrap() error {
|
||||||
|
return e.Err
|
||||||
|
}
|
||||||
|
|
||||||
|
type TooManyValuesForParamError struct {
|
||||||
|
ParamName string
|
||||||
|
Count int
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *TooManyValuesForParamError) Error() string {
|
||||||
|
return fmt.Sprintf("Expected one value for %s, got %d", e.ParamName, e.Count)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handler creates http.Handler with routing matching OpenAPI spec.
|
||||||
|
func Handler(si ServerInterface) http.Handler {
|
||||||
|
return HandlerWithOptions(si, ChiServerOptions{})
|
||||||
|
}
|
||||||
|
|
||||||
|
type ChiServerOptions struct {
|
||||||
|
BaseURL string
|
||||||
|
BaseRouter chi.Router
|
||||||
|
Middlewares []MiddlewareFunc
|
||||||
|
ErrorHandlerFunc func(w http.ResponseWriter, r *http.Request, err error)
|
||||||
|
}
|
||||||
|
|
||||||
|
// HandlerFromMux creates http.Handler with routing matching OpenAPI spec based on the provided mux.
|
||||||
|
func HandlerFromMux(si ServerInterface, r chi.Router) http.Handler {
|
||||||
|
return HandlerWithOptions(si, ChiServerOptions{
|
||||||
|
BaseRouter: r,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func HandlerFromMuxWithBaseURL(si ServerInterface, r chi.Router, baseURL string) http.Handler {
|
||||||
|
return HandlerWithOptions(si, ChiServerOptions{
|
||||||
|
BaseURL: baseURL,
|
||||||
|
BaseRouter: r,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// HandlerWithOptions creates http.Handler with additional options
|
||||||
|
func HandlerWithOptions(si ServerInterface, options ChiServerOptions) http.Handler {
|
||||||
|
r := options.BaseRouter
|
||||||
|
|
||||||
|
if r == nil {
|
||||||
|
r = chi.NewRouter()
|
||||||
|
}
|
||||||
|
if options.ErrorHandlerFunc == nil {
|
||||||
|
options.ErrorHandlerFunc = func(w http.ResponseWriter, r *http.Request, err error) {
|
||||||
|
http.Error(w, err.Error(), http.StatusBadRequest)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
wrapper := ServerInterfaceWrapper{
|
||||||
|
Handler: si,
|
||||||
|
HandlerMiddlewares: options.Middlewares,
|
||||||
|
ErrorHandlerFunc: options.ErrorHandlerFunc,
|
||||||
|
}
|
||||||
|
|
||||||
|
r.Group(func(r chi.Router) {
|
||||||
|
r.Get(options.BaseURL+"/version", wrapper.GetVersion)
|
||||||
|
})
|
||||||
|
|
||||||
|
return r
|
||||||
|
}
|
14
routers/api/forgejo/v1/root.go
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
// Copyright The Forgejo Authors.
|
||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
|
package v1
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net/http"
|
||||||
|
)
|
||||||
|
|
||||||
|
func Root(w http.ResponseWriter, r *http.Request) {
|
||||||
|
// https://www.rfc-editor.org/rfc/rfc8631
|
||||||
|
w.Header().Set("Link", "</assets/forgejo/api.v1.yml>; rel=\"service-desc\"")
|
||||||
|
w.WriteHeader(http.StatusNoContent)
|
||||||
|
}
|
|
@ -31,6 +31,7 @@ import (
|
||||||
"code.gitea.io/gitea/modules/util"
|
"code.gitea.io/gitea/modules/util"
|
||||||
"code.gitea.io/gitea/modules/web"
|
"code.gitea.io/gitea/modules/web"
|
||||||
actions_router "code.gitea.io/gitea/routers/api/actions"
|
actions_router "code.gitea.io/gitea/routers/api/actions"
|
||||||
|
forgejo "code.gitea.io/gitea/routers/api/forgejo/v1"
|
||||||
packages_router "code.gitea.io/gitea/routers/api/packages"
|
packages_router "code.gitea.io/gitea/routers/api/packages"
|
||||||
apiv1 "code.gitea.io/gitea/routers/api/v1"
|
apiv1 "code.gitea.io/gitea/routers/api/v1"
|
||||||
"code.gitea.io/gitea/routers/common"
|
"code.gitea.io/gitea/routers/common"
|
||||||
|
@ -181,6 +182,7 @@ func NormalRoutes(ctx context.Context) *web.Route {
|
||||||
|
|
||||||
r.Mount("/", web_routers.Routes(ctx))
|
r.Mount("/", web_routers.Routes(ctx))
|
||||||
r.Mount("/api/v1", apiv1.Routes(ctx))
|
r.Mount("/api/v1", apiv1.Routes(ctx))
|
||||||
|
r.Mount("/api/forgejo/v1", forgejo.Routes(ctx))
|
||||||
r.Mount("/api/internal", private.Routes())
|
r.Mount("/api/internal", private.Routes())
|
||||||
|
|
||||||
if setting.Packages.Enabled {
|
if setting.Packages.Enabled {
|
||||||
|
|
19
routers/web/misc/swagger-forgejo.go
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
// Copyright 2017 The Gitea Authors. All rights reserved.
|
||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
|
package misc
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net/http"
|
||||||
|
|
||||||
|
"code.gitea.io/gitea/modules/base"
|
||||||
|
"code.gitea.io/gitea/modules/context"
|
||||||
|
)
|
||||||
|
|
||||||
|
// tplSwagger swagger page template
|
||||||
|
const tplForgejoSwagger base.TplName = "swagger/forgejo-ui"
|
||||||
|
|
||||||
|
func SwaggerForgejo(ctx *context.Context) {
|
||||||
|
ctx.Data["APIVersion"] = "v1"
|
||||||
|
ctx.HTML(http.StatusOK, tplForgejoSwagger)
|
||||||
|
}
|
|
@ -160,12 +160,17 @@ func Routes(ctx gocontext.Context) *web.Route {
|
||||||
if setting.API.EnableSwagger {
|
if setting.API.EnableSwagger {
|
||||||
// Note: The route is here but no in API routes because it renders a web page
|
// Note: The route is here but no in API routes because it renders a web page
|
||||||
routes.Get("/api/swagger", append(mid, misc.Swagger)...) // Render V1 by default
|
routes.Get("/api/swagger", append(mid, misc.Swagger)...) // Render V1 by default
|
||||||
|
routes.Get("/api/forgejo/swagger", append(mid, misc.SwaggerForgejo)...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: These really seem like things that could be folded into Contexter or as helper functions
|
// TODO: These really seem like things that could be folded into Contexter or as helper functions
|
||||||
mid = append(mid, user.GetNotificationCount)
|
mid = append(mid, user.GetNotificationCount)
|
||||||
mid = append(mid, repo.GetActiveStopwatch)
|
mid = append(mid, repo.GetActiveStopwatch)
|
||||||
mid = append(mid, goGet)
|
mid = append(mid, goGet)
|
||||||
|
middlewareHook := ctx.Value(web.KeyTestMiddlewareHook)
|
||||||
|
if middlewareHook != nil {
|
||||||
|
mid = append(mid, middlewareHook)
|
||||||
|
}
|
||||||
|
|
||||||
others := web.NewRoute()
|
others := web.NewRoute()
|
||||||
others.Use(mid...)
|
others.Use(mid...)
|
||||||
|
|
|
@ -148,7 +148,7 @@
|
||||||
</div><!-- end content create new menu -->
|
</div><!-- end content create new menu -->
|
||||||
</div><!-- end dropdown menu create new -->
|
</div><!-- end dropdown menu create new -->
|
||||||
|
|
||||||
<div class="ui dropdown jump item gt-mx-0" data-tooltip-content="{{.locale.Tr "user_profile_and_more"}}">
|
<div class="ui dropdown jump item gt-mx-0 gt-mb-3" data-tooltip-content="{{.locale.Tr "user_profile_and_more"}}">
|
||||||
<span class="text">
|
<span class="text">
|
||||||
{{avatar $.Context .SignedUser 24 "tiny"}}
|
{{avatar $.Context .SignedUser 24 "tiny"}}
|
||||||
<span class="sr-only">{{.locale.Tr "user_profile_and_more"}}</span>
|
<span class="sr-only">{{.locale.Tr "user_profile_and_more"}}</span>
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{{template "base/head" .}}
|
{{template "base/head" .}}
|
||||||
<div role="main" aria-label="{{.Title}}" class="page-content install">
|
<div role="main" aria-label="{{.Title}}" class="page-content install">
|
||||||
<div class="ui middle very relaxed page grid">
|
<div class="ui stackable middle very relaxed page grid">
|
||||||
<div class="sixteen wide center aligned centered column">
|
<div class="sixteen wide center aligned centered column">
|
||||||
<h3 class="ui top attached header">
|
<h3 class="ui top attached header">
|
||||||
{{.locale.Tr "install.title"}}
|
{{.locale.Tr "install.title"}}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{{template "base/head" .}}
|
{{template "base/head" .}}
|
||||||
<div role="main" aria-label="{{.Title}}" class="page-content organization new org">
|
<div role="main" aria-label="{{.Title}}" class="page-content organization new org">
|
||||||
<div class="ui middle very relaxed page grid">
|
<div class="ui stackable middle very relaxed page grid">
|
||||||
<div class="column">
|
<div class="column">
|
||||||
<form class="ui form" action="{{.Link}}" method="post">
|
<form class="ui form" action="{{.Link}}" method="post">
|
||||||
{{.CsrfTokenHtml}}
|
{{.CsrfTokenHtml}}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{{template "base/head" .}}
|
{{template "base/head" .}}
|
||||||
<div role="main" aria-label="{{.Title}}" class="page-content repository new repo">
|
<div role="main" aria-label="{{.Title}}" class="page-content repository new repo">
|
||||||
<div class="ui middle very relaxed page one column grid">
|
<div class="ui stackable middle very relaxed page one column grid">
|
||||||
<div class="column">
|
<div class="column">
|
||||||
<form class="ui form" action="{{.Link}}" method="post">
|
<form class="ui form" action="{{.Link}}" method="post">
|
||||||
{{.CsrfTokenHtml}}
|
{{.CsrfTokenHtml}}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{{template "base/head" .}}
|
{{template "base/head" .}}
|
||||||
<div role="main" aria-label="{{.Title}}" class="page-content repository new migrate">
|
<div role="main" aria-label="{{.Title}}" class="page-content repository new migrate">
|
||||||
<div class="ui middle very relaxed page grid">
|
<div class="ui stackable middle very relaxed page grid">
|
||||||
<div class="column">
|
<div class="column">
|
||||||
<form class="ui form" action="{{.Link}}" method="post">
|
<form class="ui form" action="{{.Link}}" method="post">
|
||||||
{{template "base/disable_form_autofill"}}
|
{{template "base/disable_form_autofill"}}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{{template "base/head" .}}
|
{{template "base/head" .}}
|
||||||
<div role="main" aria-label="{{.Title}}" class="page-content repository new migrate">
|
<div role="main" aria-label="{{.Title}}" class="page-content repository new migrate">
|
||||||
<div class="ui middle very relaxed page grid">
|
<div class="ui stackable middle very relaxed page grid">
|
||||||
<div class="column">
|
<div class="column">
|
||||||
<form class="ui form" action="{{.Link}}" method="post">
|
<form class="ui form" action="{{.Link}}" method="post">
|
||||||
{{template "base/disable_form_autofill"}}
|
{{template "base/disable_form_autofill"}}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{{template "base/head" .}}
|
{{template "base/head" .}}
|
||||||
<div role="main" aria-label="{{.Title}}" class="page-content repository new migrate">
|
<div role="main" aria-label="{{.Title}}" class="page-content repository new migrate">
|
||||||
<div class="ui middle very relaxed page grid">
|
<div class="ui stackable middle very relaxed page grid">
|
||||||
<div class="column">
|
<div class="column">
|
||||||
<form class="ui form" action="{{.Link}}" method="post">
|
<form class="ui form" action="{{.Link}}" method="post">
|
||||||
{{template "base/disable_form_autofill"}}
|
{{template "base/disable_form_autofill"}}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{{template "base/head" .}}
|
{{template "base/head" .}}
|
||||||
<div role="main" aria-label="{{.Title}}" class="page-content repository new migrate">
|
<div role="main" aria-label="{{.Title}}" class="page-content repository new migrate">
|
||||||
<div class="ui middle very relaxed page grid">
|
<div class="ui stackable middle very relaxed page grid">
|
||||||
<div class="column">
|
<div class="column">
|
||||||
<form class="ui form" action="{{.Link}}" method="post">
|
<form class="ui form" action="{{.Link}}" method="post">
|
||||||
{{.CsrfTokenHtml}}
|
{{.CsrfTokenHtml}}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{{template "base/head" .}}
|
{{template "base/head" .}}
|
||||||
<div role="main" aria-label="{{.Title}}" class="page-content repository new migrate">
|
<div role="main" aria-label="{{.Title}}" class="page-content repository new migrate">
|
||||||
<div class="ui middle very relaxed page grid">
|
<div class="ui stackable middle very relaxed page grid">
|
||||||
<div class="column">
|
<div class="column">
|
||||||
<form class="ui form" action="{{.Link}}" method="post">
|
<form class="ui form" action="{{.Link}}" method="post">
|
||||||
{{.CsrfTokenHtml}}
|
{{.CsrfTokenHtml}}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{{template "base/head" .}}
|
{{template "base/head" .}}
|
||||||
<div role="main" aria-label="{{.Title}}" class="page-content repository new migrate">
|
<div role="main" aria-label="{{.Title}}" class="page-content repository new migrate">
|
||||||
<div class="ui middle very relaxed page grid">
|
<div class="ui stackable middle very relaxed page grid">
|
||||||
<div class="column">
|
<div class="column">
|
||||||
<form class="ui form" action="{{.Link}}" method="post">
|
<form class="ui form" action="{{.Link}}" method="post">
|
||||||
{{.CsrfTokenHtml}}
|
{{.CsrfTokenHtml}}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{{template "base/head" .}}
|
{{template "base/head" .}}
|
||||||
<div role="main" aria-label="{{.Title}}" class="page-content repository new migrate">
|
<div role="main" aria-label="{{.Title}}" class="page-content repository new migrate">
|
||||||
<div class="ui middle very relaxed page grid">
|
<div class="ui stackable middle very relaxed page grid">
|
||||||
<div class="column">
|
<div class="column">
|
||||||
<form class="ui form" action="{{.Link}}" method="post">
|
<form class="ui form" action="{{.Link}}" method="post">
|
||||||
{{.CsrfTokenHtml}}
|
{{.CsrfTokenHtml}}
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
{{template "base/head" .}}
|
{{template "base/head" .}}
|
||||||
<div role="main" aria-label="{{.Title}}" class="page-content repository new migrate">
|
<div role="main" aria-label="{{.Title}}" class="page-content repository new migrate">
|
||||||
<div class="ui middle very relaxed page grid">
|
<div class="ui stackable middle very relaxed page grid">
|
||||||
<div class="column">
|
<div class="column">
|
||||||
{{template "repo/migrate/helper" .}}
|
{{template "repo/migrate/helper" .}}
|
||||||
<div class="ui three stackable cards">
|
<div class="ui two-mobile three stackable cards">
|
||||||
{{range .Services}}
|
{{range .Services}}
|
||||||
<a class="ui card gt-df gt-ac" href="{{AppSubUrl}}/repo/migrate?service_type={{.}}&org={{$.Org}}&mirror={{$.Mirror}}">
|
<a class="ui card gt-df gt-ac" href="{{AppSubUrl}}/repo/migrate?service_type={{.}}&org={{$.Org}}&mirror={{$.Mirror}}">
|
||||||
{{if eq .Name "github"}}
|
{{if eq .Name "github"}}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{{template "base/head" .}}
|
{{template "base/head" .}}
|
||||||
<div role="main" aria-label="{{.Title}}" class="page-content repository new migrate">
|
<div role="main" aria-label="{{.Title}}" class="page-content repository new migrate">
|
||||||
<div class="ui middle very relaxed page grid">
|
<div class="ui stackable middle very relaxed page grid">
|
||||||
<div class="column">
|
<div class="column">
|
||||||
<form class="ui form" action="{{.Link}}" method="post">
|
<form class="ui form" action="{{.Link}}" method="post">
|
||||||
{{template "base/disable_form_autofill"}}
|
{{template "base/disable_form_autofill"}}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{{template "base/head" .}}
|
{{template "base/head" .}}
|
||||||
<div role="main" aria-label="{{.Title}}" class="page-content repository new fork">
|
<div role="main" aria-label="{{.Title}}" class="page-content repository new fork">
|
||||||
<div class="ui middle very relaxed page grid">
|
<div class="ui stackable middle very relaxed page grid">
|
||||||
<div class="column">
|
<div class="column">
|
||||||
<form class="ui form" action="{{.Link}}" method="post">
|
<form class="ui form" action="{{.Link}}" method="post">
|
||||||
{{.CsrfTokenHtml}}
|
{{.CsrfTokenHtml}}
|
||||||
|
|
13
templates/swagger/forgejo-ui.tmpl
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>Forgejo API</title>
|
||||||
|
<link href="{{AssetUrlPrefix}}/css/swagger.css?v={{AssetVersion}}" rel="stylesheet">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<a class="swagger-back-link" href="{{AppUrl}}">{{svg "octicon-reply"}}{{.locale.Tr "return_to_gitea"}}</a>
|
||||||
|
<div id="swagger-ui" data-source="{{AssetUrlPrefix}}/forgejo/api.{{.APIVersion}}.yml"></div>
|
||||||
|
<script src="{{AssetUrlPrefix}}/js/forgejoswagger.js?v={{AssetVersion}}"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -1,6 +1,6 @@
|
||||||
{{template "base/head" .}}
|
{{template "base/head" .}}
|
||||||
<div role="main" aria-label="{{.Title}}" class="page-content user activate">
|
<div role="main" aria-label="{{.Title}}" class="page-content user activate">
|
||||||
<div class="ui middle very relaxed page grid">
|
<div class="ui stackable middle very relaxed page grid">
|
||||||
<div class="column">
|
<div class="column">
|
||||||
<form class="ui form ignore-dirty" action="{{AppSubUrl}}/user/activate" method="post">
|
<form class="ui form ignore-dirty" action="{{AppSubUrl}}/user/activate" method="post">
|
||||||
{{.CsrfTokenHtml}}
|
{{.CsrfTokenHtml}}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{{template "base/head" .}}
|
{{template "base/head" .}}
|
||||||
<div role="main" aria-label="{{.Title}}" class="page-content user forgot password">
|
<div role="main" aria-label="{{.Title}}" class="page-content user forgot password">
|
||||||
<div class="ui middle very relaxed page grid">
|
<div class="ui stackable middle very relaxed page grid">
|
||||||
<div class="column">
|
<div class="column">
|
||||||
<form class="ui form ignore-dirty" action="{{.Link}}" method="post">
|
<form class="ui form ignore-dirty" action="{{.Link}}" method="post">
|
||||||
{{.CsrfTokenHtml}}
|
{{.CsrfTokenHtml}}
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="ui middle very relaxed page grid">
|
<div class="ui stackable middle very relaxed page grid">
|
||||||
<div class="column">
|
<div class="column">
|
||||||
<div class="ui tab {{if not .user_exists}}active{{end}}"
|
<div class="ui tab {{if not .user_exists}}active{{end}}"
|
||||||
data-tab="auth-link-signup-tab">
|
data-tab="auth-link-signup-tab">
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{{template "base/head" .}}
|
{{template "base/head" .}}
|
||||||
<div role="main" aria-label="{{.Title}}" class="page-content user activate">
|
<div role="main" aria-label="{{.Title}}" class="page-content user activate">
|
||||||
<div class="ui middle very relaxed page grid">
|
<div class="ui stackable middle very relaxed page grid">
|
||||||
<div class="column">
|
<div class="column">
|
||||||
<form class="ui form">
|
<form class="ui form">
|
||||||
<h2 class="ui top attached header">
|
<h2 class="ui top attached header">
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{{template "base/head" .}}
|
{{template "base/head" .}}
|
||||||
<div role="main" aria-label="{{.Title}}" class="page-content user reset password">
|
<div role="main" aria-label="{{.Title}}" class="page-content user reset password">
|
||||||
<div class="ui middle very relaxed page grid">
|
<div class="ui stackable middle very relaxed page grid">
|
||||||
<div class="column">
|
<div class="column">
|
||||||
<form class="ui form ignore-dirty" action="{{.Link}}" method="post">
|
<form class="ui form ignore-dirty" action="{{.Link}}" method="post">
|
||||||
{{.CsrfTokenHtml}}
|
{{.CsrfTokenHtml}}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
{{template "base/head" .}}
|
{{template "base/head" .}}
|
||||||
<div role="main" aria-label="{{.Title}}" class="page-content user signin{{if .LinkAccountMode}} icon{{end}}">
|
<div role="main" aria-label="{{.Title}}" class="page-content user signin{{if .LinkAccountMode}} icon{{end}}">
|
||||||
{{template "user/auth/signin_navbar" .}}
|
{{template "user/auth/signin_navbar" .}}
|
||||||
<div class="ui middle very relaxed page grid">
|
<div class="ui stackable middle very relaxed page grid">
|
||||||
<div class="ui container column fluid">
|
<div class="ui container column fluid">
|
||||||
{{template "user/auth/signin_inner" .}}
|
{{template "user/auth/signin_inner" .}}
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{{template "base/head" .}}
|
{{template "base/head" .}}
|
||||||
<div role="main" aria-label="{{.Title}}" class="page-content user signin{{if .LinkAccountMode}} icon{{end}}">
|
<div role="main" aria-label="{{.Title}}" class="page-content user signin{{if .LinkAccountMode}} icon{{end}}">
|
||||||
<div class="ui middle very relaxed page grid">
|
<div class="ui stackable middle very relaxed page grid">
|
||||||
{{template "user/auth/signup_inner" .}}
|
{{template "user/auth/signup_inner" .}}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{{template "base/head" .}}
|
{{template "base/head" .}}
|
||||||
<div role="main" aria-label="{{.Title}}" class="page-content user signin">
|
<div role="main" aria-label="{{.Title}}" class="page-content user signin">
|
||||||
<div class="ui middle very relaxed page grid">
|
<div class="ui stackable middle very relaxed page grid">
|
||||||
<div class="column">
|
<div class="column">
|
||||||
<form class="ui form" action="{{.Link}}" method="post">
|
<form class="ui form" action="{{.Link}}" method="post">
|
||||||
{{.CsrfTokenHtml}}
|
{{.CsrfTokenHtml}}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{{template "base/head" .}}
|
{{template "base/head" .}}
|
||||||
<div role="main" aria-label="{{.Title}}" class="page-content user signin">
|
<div role="main" aria-label="{{.Title}}" class="page-content user signin">
|
||||||
<div class="ui middle very relaxed page grid">
|
<div class="ui stackable middle very relaxed page grid">
|
||||||
<div class="column">
|
<div class="column">
|
||||||
<form class="ui form" action="{{.Link}}" method="post">
|
<form class="ui form" action="{{.Link}}" method="post">
|
||||||
{{.CsrfTokenHtml}}
|
{{.CsrfTokenHtml}}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{{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 stackable middle centered very relaxed page grid">
|
||||||
<div class="column center aligned">
|
<div class="column center aligned">
|
||||||
<h3 class="ui top attached header">
|
<h3 class="ui top attached header">
|
||||||
{{.locale.Tr "twofa"}}
|
{{.locale.Tr "twofa"}}
|
||||||
|
|
|
@ -14,7 +14,6 @@ import (
|
||||||
user_model "code.gitea.io/gitea/models/user"
|
user_model "code.gitea.io/gitea/models/user"
|
||||||
"code.gitea.io/gitea/modules/activitypub"
|
"code.gitea.io/gitea/modules/activitypub"
|
||||||
"code.gitea.io/gitea/modules/setting"
|
"code.gitea.io/gitea/modules/setting"
|
||||||
"code.gitea.io/gitea/routers"
|
|
||||||
|
|
||||||
ap "github.com/go-ap/activitypub"
|
ap "github.com/go-ap/activitypub"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
|
@ -22,10 +21,10 @@ import (
|
||||||
|
|
||||||
func TestActivityPubPerson(t *testing.T) {
|
func TestActivityPubPerson(t *testing.T) {
|
||||||
setting.Federation.Enabled = true
|
setting.Federation.Enabled = true
|
||||||
c = routers.NormalRoutes(context.TODO())
|
setNormalRoutes()
|
||||||
defer func() {
|
defer func() {
|
||||||
setting.Federation.Enabled = false
|
setting.Federation.Enabled = false
|
||||||
c = routers.NormalRoutes(context.TODO())
|
setNormalRoutes()
|
||||||
}()
|
}()
|
||||||
|
|
||||||
onGiteaRun(t, func(*testing.T, *url.URL) {
|
onGiteaRun(t, func(*testing.T, *url.URL) {
|
||||||
|
@ -60,10 +59,10 @@ func TestActivityPubPerson(t *testing.T) {
|
||||||
|
|
||||||
func TestActivityPubMissingPerson(t *testing.T) {
|
func TestActivityPubMissingPerson(t *testing.T) {
|
||||||
setting.Federation.Enabled = true
|
setting.Federation.Enabled = true
|
||||||
c = routers.NormalRoutes(context.TODO())
|
setNormalRoutes()
|
||||||
defer func() {
|
defer func() {
|
||||||
setting.Federation.Enabled = false
|
setting.Federation.Enabled = false
|
||||||
c = routers.NormalRoutes(context.TODO())
|
setNormalRoutes()
|
||||||
}()
|
}()
|
||||||
|
|
||||||
onGiteaRun(t, func(*testing.T, *url.URL) {
|
onGiteaRun(t, func(*testing.T, *url.URL) {
|
||||||
|
@ -75,10 +74,10 @@ func TestActivityPubMissingPerson(t *testing.T) {
|
||||||
|
|
||||||
func TestActivityPubPersonInbox(t *testing.T) {
|
func TestActivityPubPersonInbox(t *testing.T) {
|
||||||
setting.Federation.Enabled = true
|
setting.Federation.Enabled = true
|
||||||
c = routers.NormalRoutes(context.TODO())
|
setNormalRoutes()
|
||||||
defer func() {
|
defer func() {
|
||||||
setting.Federation.Enabled = false
|
setting.Federation.Enabled = false
|
||||||
c = routers.NormalRoutes(context.TODO())
|
setNormalRoutes()
|
||||||
}()
|
}()
|
||||||
|
|
||||||
srv := httptest.NewServer(c)
|
srv := httptest.NewServer(c)
|
||||||
|
|
21
tests/integration/api_forgejo_root_test.go
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
// Copyright The Forgejo Authors.
|
||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
|
package integration
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net/http"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"code.gitea.io/gitea/tests"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestAPIForgejoRoot(t *testing.T) {
|
||||||
|
defer tests.PrepareTestEnv(t)()
|
||||||
|
|
||||||
|
req := NewRequest(t, "GET", "/api/forgejo/v1")
|
||||||
|
resp := MakeRequest(t, req, http.StatusNoContent)
|
||||||
|
assert.Contains(t, resp.Header().Get("Link"), "/assets/forgejo/api.v1.yml")
|
||||||
|
}
|