forked from NYANDEV/forgejo
Compare commits
11 commits
forgejo
...
forgejo-a1
Author | SHA1 | Date | |
---|---|---|---|
|
b4e8b8ac81 | ||
|
7c98a4c54e | ||
|
2c23d1c53c | ||
|
9dd224f00c | ||
|
a47b474586 | ||
|
88b113d081 | ||
|
eb85782115 | ||
|
dd1971d4e6 | ||
|
d6f6ca7d3e | ||
|
6d910daafb | ||
|
dff32676e3 |
59 changed files with 2183 additions and 1182 deletions
53
.gitea/ISSUE_TEMPLATE/bug-report.md
Normal file
53
.gitea/ISSUE_TEMPLATE/bug-report.md
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
---
|
||||||
|
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.
|
||||||
|
-->
|
||||||
|
|
||||||
|
- 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. -->
|
||||||
|
|
||||||
|
## 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
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
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
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
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
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
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
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
|
|
23
.github/lock.yml
vendored
23
.github/lock.yml
vendored
|
@ -1,23 +0,0 @@
|
||||||
# Configuration for Lock Threads - https://github.com/dessant/lock-threads-app
|
|
||||||
|
|
||||||
# Number of days of inactivity before a closed issue or pull request is locked
|
|
||||||
daysUntilLock: 60
|
|
||||||
|
|
||||||
# Skip issues and pull requests created before a given timestamp. Timestamp must
|
|
||||||
# follow ISO 8601 (`YYYY-MM-DD`). `false` is disabled
|
|
||||||
skipCreatedBefore: false
|
|
||||||
|
|
||||||
# Issues and pull requests with these labels will be ignored.
|
|
||||||
exemptLabels: []
|
|
||||||
|
|
||||||
# Label to add before locking, such as `outdated`. `false` is disabled
|
|
||||||
lockLabel: false
|
|
||||||
|
|
||||||
# Comment to post before locking.
|
|
||||||
lockComment: >
|
|
||||||
This thread has been automatically locked since there has not been
|
|
||||||
any recent activity after it was closed. Please open a new issue for
|
|
||||||
related bugs and link to relevant comments in this thread.
|
|
||||||
|
|
||||||
# Assign `resolved` as the reason for locking. Set to `false` to disable
|
|
||||||
setLockReason: true
|
|
9
.github/pull_request_template.md
vendored
9
.github/pull_request_template.md
vendored
|
@ -1,9 +0,0 @@
|
||||||
<!--
|
|
||||||
|
|
||||||
Please check the following:
|
|
||||||
|
|
||||||
1. Make sure you are targeting the `main` branch, pull requests on release branches are only allowed for bug fixes.
|
|
||||||
2. 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)
|
|
||||||
|
|
||||||
-->
|
|
54
.github/stale.yml
vendored
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.
|
|
3
.gitignore
vendored
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
|
||||||
|
|
77
.woodpecker/compliance.yml
Normal file
77
.woodpecker/compliance.yml
Normal file
|
@ -0,0 +1,77 @@
|
||||||
|
platform: linux/amd64
|
||||||
|
|
||||||
|
when:
|
||||||
|
event: [ push, pull_request, manual ]
|
||||||
|
branch:
|
||||||
|
exclude: [ soft-fork/*/*, soft-fork/*/*/* ]
|
||||||
|
path:
|
||||||
|
exclude: [ '*.md', 'CONTRIBUTING/**' ]
|
||||||
|
|
||||||
|
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
|
144
.woodpecker/testing-amd64.yml
Normal file
144
.woodpecker/testing-amd64.yml
Normal file
|
@ -0,0 +1,144 @@
|
||||||
|
platform: linux/amd64
|
||||||
|
|
||||||
|
when:
|
||||||
|
event: [ push, pull_request, manual ]
|
||||||
|
branch:
|
||||||
|
exclude: [ soft-fork/*/*, soft-fork/*/*/* ]
|
||||||
|
path:
|
||||||
|
exclude: [ '*.md', 'CONTRIBUTING/**' ]
|
||||||
|
|
||||||
|
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:
|
||||||
|
fetch-tags:
|
||||||
|
image: *golang_image
|
||||||
|
pull: true
|
||||||
|
commands:
|
||||||
|
- git config --add safe.directory '*'
|
||||||
|
- git fetch --tags --force
|
||||||
|
|
||||||
|
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'
|
440
CONTRIBUTING.md
440
CONTRIBUTING.md
|
@ -1,435 +1,23 @@
|
||||||
# Contribution Guidelines
|
# Forgejo Contributor Guide
|
||||||
|
|
||||||
## Table of Contents
|
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).
|
||||||
- [Table of Contents](#table-of-contents)
|
|
||||||
- [Introduction](#introduction)
|
|
||||||
- [Bug reports](#bug-reports)
|
|
||||||
- [Discuss your design](#discuss-your-design)
|
|
||||||
- [Testing redux](#testing-redux)
|
|
||||||
- [Vendoring](#vendoring)
|
|
||||||
- [Translation](#translation)
|
|
||||||
- [Building Gitea](#building-gitea)
|
|
||||||
- [Code review](#code-review)
|
|
||||||
- [Styleguide](#styleguide)
|
|
||||||
- [Design guideline](#design-guideline)
|
|
||||||
- [API v1](#api-v1)
|
|
||||||
- [Developer Certificate of Origin (DCO)](#developer-certificate-of-origin-dco)
|
|
||||||
- [Release Cycle](#release-cycle)
|
|
||||||
- [Maintainers](#maintainers)
|
|
||||||
- [Owners](#owners)
|
|
||||||
- [Versions](#versions)
|
|
||||||
- [Releasing Gitea](#releasing-gitea)
|
|
||||||
- [Copyright](#copyright)
|
|
||||||
|
|
||||||
## Introduction
|
## For everyone involved
|
||||||
|
|
||||||
This document explains how to contribute changes to the Gitea project.
|
- [Code of Conduct](CONTRIBUTING/COC.md)
|
||||||
It assumes you have followed the
|
- [Bugs, features, security and others discussions](CONTRIBUTING/DISCUSSIONS.md)
|
||||||
[installation instructions](https://docs.gitea.io/en-us/).
|
- [Governance](CONTRIBUTING/GOVERNANCE.md)
|
||||||
Sensitive security-related issues should be reported to
|
- [Sustainability and funding](https://codeberg.org/forgejo/sustainability/src/branch/master/README.md)
|
||||||
[security@gitea.io](mailto:security@gitea.io).
|
|
||||||
|
|
||||||
For configuring IDE or code editor to develop Gitea see [IDE and code editor configuration](contrib/ide/)
|
## For contributors
|
||||||
|
|
||||||
## Bug reports
|
- [Developer Certificate of Origin (DCO)](CONTRIBUTING/DCO.md)
|
||||||
|
- [Development workflow](CONTRIBUTING/WORKFLOW.md)
|
||||||
|
|
||||||
Please search the issues on the issue tracker with a variety of keywords
|
## For maintainers
|
||||||
to ensure your bug is not already reported.
|
|
||||||
|
|
||||||
If unique, [open an issue](https://github.com/go-gitea/gitea/issues/new)
|
- [Release management](CONTRIBUTING/RELEASE.md)
|
||||||
and answer the questions so we can understand and reproduce the
|
- [Secrets](CONTRIBUTING/SECRETS.md)
|
||||||
problematic behavior.
|
|
||||||
|
|
||||||
To show us that the issue you are having is in Gitea itself, please
|
|
||||||
write clear, concise instructions so we can reproduce the behavior—
|
|
||||||
even if it seems obvious. The more detailed and specific you are,
|
|
||||||
the faster we can fix the issue. Check out [How to Report Bugs
|
|
||||||
Effectively](http://www.chiark.greenend.org.uk/~sgtatham/bugs.html).
|
|
||||||
|
|
||||||
Please be kind, remember that Gitea comes at no cost to you, and you're
|
|
||||||
getting free help.
|
|
||||||
|
|
||||||
## Discuss your design
|
|
||||||
|
|
||||||
The project welcomes 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)!
|
|
||||||
Significant changes must go through the change proposal process
|
|
||||||
before they can be accepted. To create a proposal, file an issue with
|
|
||||||
your proposed changes documented, and make sure to note in the title
|
|
||||||
of the issue that it is a proposal.
|
|
||||||
|
|
||||||
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. It also checks that the design is
|
|
||||||
sound before code is written; the code review tool is not the place for
|
|
||||||
high-level discussions.
|
|
||||||
|
|
||||||
## Testing redux
|
|
||||||
|
|
||||||
Before submitting a pull request, run all the tests for the whole tree
|
|
||||||
to make sure your changes don't cause regression elsewhere.
|
|
||||||
|
|
||||||
Here's how to run the test suite:
|
|
||||||
|
|
||||||
- code lint
|
|
||||||
|
|
||||||
| | |
|
|
||||||
| :-------------------- | :---------------------------------------------------------------- |
|
|
||||||
|``make lint`` | lint everything (not suggest if you only change one type code) |
|
|
||||||
|``make lint-frontend`` | lint frontend files |
|
|
||||||
|``make lint-backend`` | lint backend files |
|
|
||||||
|
|
||||||
- run test code (Suggest run in Linux)
|
|
||||||
|
|
||||||
| | |
|
|
||||||
| :------------------------------------- | :----------------------------------------------- |
|
|
||||||
|``make test[\#TestSpecificName]`` | run unit test |
|
|
||||||
|``make test-sqlite[\#TestSpecificName]``| run [integration](tests/integration) test for SQLite |
|
|
||||||
|[More details about integration tests](tests/integration/README.md) |
|
|
||||||
|``make test-e2e-sqlite[\#TestSpecificFileName]``| run [end-to-end](tests/e2e) test for SQLite |
|
|
||||||
|[More details about e2e tests](tests/e2e/README.md) |
|
|
||||||
|
|
||||||
## Vendoring
|
|
||||||
|
|
||||||
We manage dependencies via [Go Modules](https://golang.org/cmd/go/#hdr-Module_maintenance), more details: [go mod](https://go.dev/ref/mod).
|
|
||||||
|
|
||||||
Pull requests should only include `go.mod`, `go.sum` updates if they are part of
|
|
||||||
the same change, be it a bugfix or a feature addition.
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
You can find more information on how to get started with it on the [Modules Wiki](https://github.com/golang/go/wiki/Modules).
|
|
||||||
|
|
||||||
## Translation
|
|
||||||
|
|
||||||
We do all translation work inside [Crowdin](https://crowdin.com/project/gitea).
|
|
||||||
The only translation that is maintained in this Git repository is
|
|
||||||
[`en_US.ini`](https://github.com/go-gitea/gitea/blob/master/options/locale/locale_en-US.ini)
|
|
||||||
and is synced regularly to Crowdin. Once a translation has reached
|
|
||||||
A SATISFACTORY PERCENTAGE it will be synced back into this repo and
|
|
||||||
included in the next released version.
|
|
||||||
|
|
||||||
## Building Gitea
|
|
||||||
|
|
||||||
See the [hacking instructions](https://docs.gitea.io/en-us/hacking-on-gitea/).
|
|
||||||
|
|
||||||
## Code review
|
|
||||||
|
|
||||||
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. We use GitHub's
|
|
||||||
pull request workflow to do that. And, we also use [LGTM](http://lgtm.co)
|
|
||||||
to ensure every PR is reviewed by at least 2 maintainers.
|
|
||||||
|
|
||||||
Please try to make your pull request easy to review for us. And, please read
|
|
||||||
the *[How to get faster PR 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.
|
|
||||||
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.
|
|
||||||
- Use the first comment as a summary explainer of your PR and you should keep this up-to-date as the PR evolves.
|
|
||||||
|
|
||||||
If your PR could cause a breaking change you must add a BREAKING section to this comment e.g.:
|
|
||||||
|
|
||||||
```
|
|
||||||
## :warning: BREAKING :warning:
|
|
||||||
```
|
|
||||||
|
|
||||||
To explain how this could affect users and how to mitigate these changes.
|
|
||||||
|
|
||||||
Once code review starts on your PR, do not rebase nor squash your branch as it makes it
|
|
||||||
difficult to review the new changes. Only if there is a need, sync your branch by merging
|
|
||||||
the base branch into yours. Don't worry about merge commits messing up your tree as
|
|
||||||
the final merge process squashes all commits into one, with the visible commit message (first
|
|
||||||
line) being the PR title + PR index and description being the PR's first comment.
|
|
||||||
|
|
||||||
Once your PR gets the `lgtm/done` label, don't worry about keeping it up-to-date or breaking
|
|
||||||
builds (unless there's a merge conflict or a request is made by a maintainer to make
|
|
||||||
modifications). It is the maintainer team's responsibility from this point to get it merged.
|
|
||||||
|
|
||||||
## Styleguide
|
|
||||||
|
|
||||||
For imports you should use the following format (*without* the comments)
|
|
||||||
|
|
||||||
```go
|
|
||||||
import (
|
|
||||||
// stdlib
|
|
||||||
"fmt"
|
|
||||||
"math"
|
|
||||||
|
|
||||||
// local packages
|
|
||||||
"code.gitea.io/gitea/models"
|
|
||||||
"code.gitea.io/sdk/gitea"
|
|
||||||
|
|
||||||
// external packages
|
|
||||||
"github.com/foo/bar"
|
|
||||||
"gopkg.io/baz.v1"
|
|
||||||
)
|
|
||||||
```
|
|
||||||
|
|
||||||
## Design guideline
|
|
||||||
|
|
||||||
To maintain understandable code and avoid circular dependencies it is important to have a good structure of the code. The Gitea code is divided into the following parts:
|
|
||||||
|
|
||||||
- **models:** Contains the data structures used by xorm to construct database tables. It also contains supporting functions to query and update the database. Dependencies to other code in Gitea should be avoided although some modules might be needed (for example for logging).
|
|
||||||
- **models/fixtures:** Sample model data used in integration tests.
|
|
||||||
- **models/migrations:** Handling of database migrations between versions. PRs that changes a database structure shall also have a migration step.
|
|
||||||
- **modules:** Different modules to handle specific functionality in Gitea. Shall only depend on other modules but not other packages (models, services).
|
|
||||||
- **public:** Frontend files (javascript, images, css, etc.)
|
|
||||||
- **routers:** Handling of server requests. As it uses other Gitea packages to serve the request, other packages (models, modules or services) shall not depend on routers.
|
|
||||||
- **services:** Support functions for common routing operations. Uses models and modules to handle the request.
|
|
||||||
- **templates:** Golang templates for generating the html output.
|
|
||||||
- **tests/e2e:** End to end tests
|
|
||||||
- **tests/integration:** Integration tests
|
|
||||||
- **tests/gitea-repositories-meta:** Sample repos used in integration tests. Adding a new repo requires editing `models/fixtures/repositories.yml` and `models/fixtures/repo_unit.yml` to match.
|
|
||||||
- **tests/gitea-lfs-meta:** Sample LFS objects used in integration tests. Adding a new object requires editing `models/fixtures/lfs_meta_object.yml` to match.
|
|
||||||
- **vendor:** External code that Gitea depends on.
|
|
||||||
|
|
||||||
## Documentation
|
|
||||||
|
|
||||||
If you add a new feature or change an existing aspect of Gitea, the documentation for that feature must be created or updated.
|
|
||||||
|
|
||||||
## API v1
|
|
||||||
|
|
||||||
The API is documented by [swagger](http://try.gitea.io/api/swagger) and is based on [GitHub API v3](https://developer.github.com/v3/).
|
|
||||||
|
|
||||||
Thus, Gitea´s API should use the same endpoints and fields as GitHub´s 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 APIv2 (which is currently not planned).
|
|
||||||
|
|
||||||
All expected results (errors, success, fail messages) should 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 the following:
|
|
||||||
([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 the following:
|
|
||||||
([example](https://github.com/go-gitea/gitea/blob/c620eb5b2d0d874da68ebd734d3864c5224f71f7/routers/api/v1/repo/issue.go#L277-L279))
|
|
||||||
|
|
||||||
In general, HTTP methods are chosen as follows:
|
|
||||||
|
|
||||||
- **GET** endpoints return requested object and status **OK (200)**
|
|
||||||
- **DELETE** endpoints return status **No Content (204)**
|
|
||||||
- **POST** endpoints return status **Created (201)**, used to **create** new objects (e.g. a User)
|
|
||||||
- **PUT** endpoints return status **No Content (204)**, used to **add/assign** existing Objects (e.g. User) to something (e.g. Org-Team)
|
|
||||||
- **PATCH** endpoints return changed object and status **OK (200)**, used to **edit/change** an existing object
|
|
||||||
|
|
||||||
An endpoint which changes/edits an object expects all fields to be optional (except ones to identify the object, which are required).
|
|
||||||
|
|
||||||
### Endpoints returning lists should
|
|
||||||
|
|
||||||
- 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
|
|
||||||
|
|
||||||
Occasionally backports of PRs are required.
|
|
||||||
|
|
||||||
The backported PR title should be:
|
|
||||||
|
|
||||||
```
|
|
||||||
Title of backported PR (#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 matching the original PR. Similarly for frontports
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
A command to help create backports can be found in `contrib/backport` and can be installed (from inside the gitea repo root directory) using:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
go install contrib/backport/backport.go
|
|
||||||
```
|
|
||||||
|
|
||||||
## 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.
|
|
||||||
Additionally you could add a line at the end of your commit message.
|
|
||||||
|
|
||||||
```
|
|
||||||
Signed-off-by: Joe Smith <joe.smith@email.com>
|
|
||||||
```
|
|
||||||
|
|
||||||
If you set your `user.name` and `user.email` Git configs, you can add the
|
|
||||||
line to the end of your commit 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
|
|
||||||
minor 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. A release is
|
|
||||||
maintained by issuing patch releases to only correct critical problems
|
|
||||||
such as crashes or security issues.
|
|
||||||
|
|
||||||
Major release cycles are seasonal. They always begin on the 25th and end on
|
|
||||||
the 24th (i.e., the 25th of December to March 24th).
|
|
||||||
|
|
||||||
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 [team
|
|
||||||
maintainers](MAINTAINERS). Every PR **MUST** be reviewed by at least
|
|
||||||
two maintainers (or owners) before it can get merged. A maintainer
|
|
||||||
should be a contributor of Gitea (or Gogs) and contributed at least
|
|
||||||
4 accepted PRs. A contributor should apply as a maintainer in the
|
|
||||||
[Discord](https://discord.gg/NsatcWJ) #develop channel. The owners
|
|
||||||
or 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/
|
|
||||||
|
|
||||||
## Owners
|
|
||||||
|
|
||||||
Since Gitea is a pure community organization without any company support,
|
|
||||||
to keep the development healthy we will elect three owners every year. All
|
|
||||||
contributors may vote to elect up to three candidates, one of which will
|
|
||||||
be the main owner, and the other two the assistant owners. When the new
|
|
||||||
owners have been elected, the old owners will give up ownership to the
|
|
||||||
newly elected owners. If an owner is unable to do so, the other owners
|
|
||||||
will assist in ceding ownership to the newly elected owners.
|
|
||||||
For security reasons, Owners 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/
|
|
||||||
|
|
||||||
After the election, the new owners should proactively agree
|
|
||||||
with our [CONTRIBUTING](CONTRIBUTING.md) requirements in the
|
|
||||||
[Discord](https://discord.gg/NsatcWJ) #general channel. Below are the
|
|
||||||
words to speak:
|
|
||||||
|
|
||||||
```
|
|
||||||
I'm honored to having been elected an owner of Gitea, I agree with
|
|
||||||
[CONTRIBUTING](CONTRIBUTING.md). I will spend part of my time on Gitea
|
|
||||||
and lead the development of Gitea.
|
|
||||||
```
|
|
||||||
|
|
||||||
To honor the past owners, here's the history of the owners and the time
|
|
||||||
they served:
|
|
||||||
|
|
||||||
- 2022-01-01 ~ 2022-12-31 - https://github.com/go-gitea/gitea/issues/17872
|
|
||||||
- [Lunny Xiao](https://gitea.com/lunny) <xiaolunwen@gmail.com>
|
|
||||||
- [Matti Ranta](https://gitea.com/techknowlogick) <techknowlogick@gitea.io>
|
|
||||||
- [Andrew Thornton](https://gitea.com/zeripath) <art27@cantab.net>
|
|
||||||
|
|
||||||
- 2021-01-01 ~ 2021-12-31 - https://github.com/go-gitea/gitea/issues/13801
|
|
||||||
- [Lunny Xiao](https://gitea.com/lunny) <xiaolunwen@gmail.com>
|
|
||||||
- [Lauris Bukšis-Haberkorns](https://gitea.com/lafriks) <lauris@nix.lv>
|
|
||||||
- [Matti Ranta](https://gitea.com/techknowlogick) <techknowlogick@gitea.io>
|
|
||||||
|
|
||||||
- 2020-01-01 ~ 2020-12-31 - https://github.com/go-gitea/gitea/issues/9230
|
|
||||||
- [Lunny Xiao](https://gitea.com/lunny) <xiaolunwen@gmail.com>
|
|
||||||
- [Lauris Bukšis-Haberkorns](https://gitea.com/lafriks) <lauris@nix.lv>
|
|
||||||
- [Matti Ranta](https://gitea.com/techknowlogick) <techknowlogick@gitea.io>
|
|
||||||
|
|
||||||
- 2019-01-01 ~ 2019-12-31 - https://github.com/go-gitea/gitea/issues/5572
|
|
||||||
- [Lunny Xiao](https://github.com/lunny) <xiaolunwen@gmail.com>
|
|
||||||
- [Lauris Bukšis-Haberkorns](https://github.com/lafriks) <lauris@nix.lv>
|
|
||||||
- [Matti Ranta](https://github.com/techknowlogick) <techknowlogick@gitea.io>
|
|
||||||
|
|
||||||
- 2018-01-01 ~ 2018-12-31 - https://github.com/go-gitea/gitea/issues/3255
|
|
||||||
- [Lunny Xiao](https://github.com/lunny) <xiaolunwen@gmail.com>
|
|
||||||
- [Lauris Bukšis-Haberkorns](https://github.com/lafriks) <lauris@nix.lv>
|
|
||||||
- [Kim Carlbäcker](https://github.com/bkcsoft) <kim.carlbacker@gmail.com>
|
|
||||||
|
|
||||||
- 2016-11-04 ~ 2017-12-31
|
|
||||||
- [Lunny Xiao](https://github.com/lunny) <xiaolunwen@gmail.com>
|
|
||||||
- [Thomas Boerger](https://github.com/tboerger) <thomas@webhippie.de>
|
|
||||||
- [Kim Carlbäcker](https://github.com/bkcsoft) <kim.carlbacker@gmail.com>
|
|
||||||
|
|
||||||
## Versions
|
|
||||||
|
|
||||||
Gitea has the `main` branch as a tip branch and has version branches
|
|
||||||
such as `release/v0.9`. `release/v0.9` is a release branch and we will
|
|
||||||
tag `v0.9.0` for binary download. If `v0.9.0` has bugs, we will accept
|
|
||||||
pull requests on the `release/v0.9` branch and publish a `v0.9.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`
|
|
||||||
|
|
||||||
## Copyright
|
|
||||||
|
|
||||||
Code that you contribute should use the standard copyright header:
|
|
||||||
|
|
||||||
```
|
|
||||||
// Copyright <year> The Gitea Authors. All rights reserved.
|
|
||||||
// SPDX-License-Identifier: MIT
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
Files in the repository contain copyright from the year they are added
|
|
||||||
to the year they are last changed. If the copyright author is changed,
|
|
||||||
just paste the header below the old one.
|
|
||||||
|
|
31
CONTRIBUTING/COC.md
Normal file
31
CONTRIBUTING/COC.md
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
# Code of Conduct, Well Being and Moderation teams
|
||||||
|
|
||||||
|
Forgejo strives to be an inclusive project where everyone can participate in a safe environment. The **Well Being** team is doing its best to defuse tensions before they escalate and is available to answer all requests sent its way. When diplomacy fails, the **Moderation** team will be forced to act to put a stop to actions that are contrary to the [Code of Conduct](https://codeberg.org/forgejo/code-of-conduct).
|
||||||
|
|
||||||
|
## Well Being and Moderation teams
|
||||||
|
|
||||||
|
Temporary Well Being and Moderation teams [were appointed 10 November 2022](https://codeberg.org/forgejo/meta/issues/13).
|
||||||
|
|
||||||
|
The moderation team will rely on this [Code of Conduct](https://codeberg.org/forgejo/code-of-conduct) when diplomacy fails.
|
||||||
|
|
||||||
|
### Well Being
|
||||||
|
|
||||||
|
Their goal is to defuse tensions.
|
||||||
|
|
||||||
|
It has no power whatsover. The members are approved by the organization and trusted to:
|
||||||
|
|
||||||
|
- Read all communications to detect tensions between people before they escalate.
|
||||||
|
- Do their best to defuse tensions.
|
||||||
|
|
||||||
|
* https://codeberg.org/Gusted
|
||||||
|
* https://codeberg.org/dachary
|
||||||
|
|
||||||
|
### Moderation
|
||||||
|
|
||||||
|
Their goal is to enforce the [Code of Conduct](https://codeberg.org/forgejo/code-of-conduct) when diplomacy fails.
|
||||||
|
|
||||||
|
It has the power to exclude people from a space.
|
||||||
|
|
||||||
|
Their decisions must be logical, fact based and transparent to the Forgejo community who trust them with this responsibility.
|
||||||
|
|
||||||
|
* https://codeberg.org/circlebuilder
|
29
CONTRIBUTING/DCO.md
Normal file
29
CONTRIBUTING/DCO.md
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
# Developer Certificate of Origin (DCO)
|
||||||
|
|
||||||
|
Contributions to Forgejo, in all the repositories in the [Forgejo organization](https://codeberg.org/forgejo) are accepted provided the author agrees to the following Developer Certificate of Origin (DCO).
|
||||||
|
|
||||||
|
```
|
||||||
|
By making a contribution to Forgejo, I certify that:
|
||||||
|
|
||||||
|
(a) The contribution was created in whole or in part by me and I
|
||||||
|
have the right to submit it under the Free Software license
|
||||||
|
indicated in the file; or
|
||||||
|
|
||||||
|
(b) The contribution is based upon previous work that, to the best
|
||||||
|
of my knowledge, is covered under an appropriate Free Software
|
||||||
|
license and I have the right under that license to submit that
|
||||||
|
work with modifications, whether created in whole or in part
|
||||||
|
by me, under the same Free Software license (unless I am
|
||||||
|
permitted to submit under a different license), as indicated
|
||||||
|
in the file; or
|
||||||
|
|
||||||
|
(c) The contribution was provided directly to me by some other
|
||||||
|
person who certified (a), (b) or (c) and I have not modified
|
||||||
|
it.
|
||||||
|
|
||||||
|
(d) I understand and agree that this project and the contribution
|
||||||
|
are public and that a record of the contribution (including all
|
||||||
|
personal information I submit with it, including my sign-off) is
|
||||||
|
maintained indefinitely and may be redistributed consistent with
|
||||||
|
this project or the Free Software license(s) involved.
|
||||||
|
```
|
18
CONTRIBUTING/DISCUSSIONS.md
Normal file
18
CONTRIBUTING/DISCUSSIONS.md
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
# Bugs, features and discussions
|
||||||
|
|
||||||
|
The [Forgejo issue tracker](https://codeberg.org/forgejo/forgejo/issues) is where **bugs** should be reported and **features** requested.
|
||||||
|
|
||||||
|
Dedicated repositories in the [Forgejo organization](https://codeberg.org/forgejo) cover areas such as:
|
||||||
|
- the [website](https://codeberg.org/forgejo/website)
|
||||||
|
- the [Code of Conduct](https://codeberg.org/forgejo/code-of-conduct)
|
||||||
|
- the [sustainability and funding](https://codeberg.org/forgejo/sustainability).
|
||||||
|
|
||||||
|
Other discussions regarding all **non technical aspects** of Forgejo, such as the governance, happen in the [meta issue tracker](https://codeberg.org/forgejo/meta/issues) and in the [matrix chatroom](https://matrix.to/#/#forgejo-chat:matrix.org).
|
||||||
|
|
||||||
|
# Security
|
||||||
|
|
||||||
|
The [security team](https://codeberg.org/forgejo/meta/src/branch/readme/TEAMS.md#security) takes care of security vulnerabilities. It handles sensitive security-related issues reported to [security@forgejo.org](mailto:security@forgejo.org) using [encryption](https://keyoxide.org/security@forgejo.org).
|
||||||
|
|
||||||
|
The security team also keeps the content of the [security.txt](https://codeberg.org/forgejo/website/src/branch/main/public/.well-known/security.txt) file up to date.
|
||||||
|
|
||||||
|
The private GPG key for `security@forgejo.org` is shared among all members of the security team and not stored online.
|
19
CONTRIBUTING/GOVERNANCE.md
Normal file
19
CONTRIBUTING/GOVERNANCE.md
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
# Governance
|
||||||
|
|
||||||
|
## Codeberg e.V. custodian of the domains
|
||||||
|
|
||||||
|
The Forgejo [domains](https://codeberg.org/forgejo/meta/issues/41) are owned by the democratic non-profit dedicated to Free Software [Codeberg e.V.](https://codeberg.org/Codeberg/org/src/branch/main/en/bylaws.md). Forgejo is therefore ultimately under the control of Codeberg e.V. and its governance. However, although Codeberg e.V. is committed to use and host Forgejo, it is expected that Forgejo defines its own governance, in a way that is compatible with the Codeberg e.V. governance.
|
||||||
|
|
||||||
|
## Forgejo Governance
|
||||||
|
|
||||||
|
See our [decision-making system](https://codeberg.org/forgejo/meta/src/branch/readme/DECISION-MAKING.md) (contains team agreements and guidelines).
|
||||||
|
|
||||||
|
Forgejo was bootstraped in November 2022 and is in the process of [defining its governance](https://codeberg.org/forgejo/meta/issues/19). The [first meeting happened November 24th](https://codeberg.org/forgejo/meta/issues/19#issuecomment-694460) and everyone is welcome to participate.
|
||||||
|
|
||||||
|
## Interim Forgejo Governance
|
||||||
|
|
||||||
|
While the governance is being defined, there was a need to establish an interim Forgejo governance for safeguarding credentials, enforcing the Code of Conduct and ensuring security vulnerabilities are handled responsibly for the Forgejo releases.
|
||||||
|
|
||||||
|
All people with a role in the interim Forgejo governance pledge to resign as soon as the Forgejo governance is in place.
|
||||||
|
|
||||||
|
The people and teams that are part of the interim governance are [listed publicly](https://codeberg.org/forgejo/meta/src/branch/readme/TEAMS.md).
|
150
CONTRIBUTING/RELEASE.md
Normal file
150
CONTRIBUTING/RELEASE.md
Normal file
|
@ -0,0 +1,150 @@
|
||||||
|
# Release management
|
||||||
|
|
||||||
|
## Release numbering
|
||||||
|
|
||||||
|
The Forgejo release numbers are composed of the Gitea release number followed by a dash and a serial number. For instance:
|
||||||
|
|
||||||
|
* Gitea **v1.18.0** will be Forgejo **v1.18.0-0**, **v1.18.0-1**, etc
|
||||||
|
|
||||||
|
The Gitea release candidates are suffixed with **-rcN** which is handled as a special case for packaging: although **X.Y.Z** is lexicographically lower than **X.Y.Z-rc1** is is considered greater. The Forgejo serial number must therefore be inserted before the **-rcN** suffix to preserve the expected version ordering.
|
||||||
|
|
||||||
|
* Gitea **v1.18.0-rc0** will be Forgejo **v1.18.0-0-rc0**, **v1.18.0-1-rc0**
|
||||||
|
* Gitea **v1.18.0-rc1** will be Forgejo **v1.18.0-2-rc1**, **v1.18.0-3-rc1**, **v1.18.0-4-rc1**
|
||||||
|
* Gitea **v1.18.0** will be Forgejo **v1.18.0-5**, **v1.18.0-6**, **v1.18.0-7**
|
||||||
|
* etc.
|
||||||
|
|
||||||
|
Because Forgejo is a soft fork of Gitea, it must retain the same release numbering scheme to be compatible with libraries and tools that depend on it. For instance, the tea CLI or the Gitea SDK will behave differently depending on the server version they connect to. If Forgejo had a different numbering scheme, it would no longer be compatible with the Gitea ecosystem.
|
||||||
|
|
||||||
|
From a [Semantic Versioning](https://semver.org/) standpoint, all Forgejo releases are [pre-releases](https://semver.org/#spec-item-9) because they are suffixed with a dash. They are syntactically correct but do not comply with the Semantic Versioning recommendations. Gitea is not compliant either and as long as Forgejo is a soft fork, it inherits this problem.
|
||||||
|
|
||||||
|
## Release process
|
||||||
|
|
||||||
|
When publishing the vX.Y.Z-N release, the following steps must be followed:
|
||||||
|
|
||||||
|
### Create a milestone and a check list
|
||||||
|
|
||||||
|
* Create a `Forgejo vX.X.Z-N` milestone set to the date of the release
|
||||||
|
* Create an issue named `[RELEASE] Forgejo vX.Y.Z-N` with a description that includes a list of what needs to be done for the release with links to follow the progress
|
||||||
|
* Set the milestone of this issue to `Forgejo vX.X.Z-N`
|
||||||
|
* Close the milestone when the release is complete
|
||||||
|
|
||||||
|
### Cherry pick the latest commits from Gitea
|
||||||
|
|
||||||
|
The vX.Y/forgejo branch is populated as part of the [rebase on top of Gitea](WORKFLOW.md). The release happens in between rebase and it is worth checking if the matching Gitea branch, release/vX.Y contains commits that should be included in the release.
|
||||||
|
|
||||||
|
* `cherry-pick -x` the commits
|
||||||
|
* push the vX.Y/forgejo branch including the commits
|
||||||
|
* verify that the tests pass
|
||||||
|
|
||||||
|
### Release Notes
|
||||||
|
|
||||||
|
* Add an entry in RELEASE-NOTES.md
|
||||||
|
* Copy/paste the matching entry from CHANGELOG.md
|
||||||
|
* Update the PR references prefixing them with https://github.com/go-gitea/gitea/pull/
|
||||||
|
|
||||||
|
### Testing
|
||||||
|
|
||||||
|
When Forgejo is released, artefacts (packages, binaries, etc.) are first published by the CI/CD pipelines in the https://codeberg.org/forgejo-experimental organization, to be downloaded and verified to work.
|
||||||
|
|
||||||
|
* Push the vX.Y.Z-N tag to https://codeberg.org/forgejo-integration (if it fails for whatever reason, the tag and the release can be removed manually)
|
||||||
|
* Binaries are built and uploaded to https://codeberg.org/forgejo/forgejo-integration/releases
|
||||||
|
* Container images are built and uploaded to https://codeberg.org/forgejo-integration/-/packages/container/forgejo/versions
|
||||||
|
* Push the vX.Y.Z-N tag to https://codeberg.org/forgejo/experimental
|
||||||
|
* Binaries are downloaded from https://codeberg.org/forgejo-integration, signed and copied to https://codeberg.org/forgejo-experimental
|
||||||
|
* Container images are copied from https://codeberg.org/forgejo-integration to https://codeberg.org/forgejo-experimental
|
||||||
|
* Fetch the Forgejo release as part of the [forgejo-ci](https://codeberg.org/Codeberg-Infrastructure/scripted-configuration/src/branch/main/hosts/forgejo-ci) test suite. Push the change to a branch of a repository enabled in https://ci.dachary.org/ ([read more...](https://codeberg.org/forgejo/forgejo/issues/208)). It will deploy the release and run high level integration tests.
|
||||||
|
* Reach out to packagers and users to manually verify the release works as expected
|
||||||
|
|
||||||
|
### Publication
|
||||||
|
|
||||||
|
* Push the vX.Y.Z-N tag to https://codeberg.org/forgejo/release
|
||||||
|
* Binaries are downloaded from https://codeberg.org/forgejo-integration, signed and copied to https://codeberg.org/forgejo
|
||||||
|
* Container images are copied from https://codeberg.org/forgejo-integration to https://codeberg.org/forgejo
|
||||||
|
|
||||||
|
### Website update
|
||||||
|
|
||||||
|
* Restart the last CI build at https://codeberg.org/forgejo/website/src/branch/main/
|
||||||
|
* Verify https://forgejo.org/download/ points to the expected release
|
||||||
|
* Manually try the instructions to work
|
||||||
|
|
||||||
|
### DNS update
|
||||||
|
|
||||||
|
* Update the `release.forgejo.org` TXT record that starts with `forgejo_versions=` to be `forgejo_versions=vX.Y.Z-N`
|
||||||
|
|
||||||
|
### Standard toot
|
||||||
|
|
||||||
|
The following toot can be re-used to announce a minor release at `https://floss.social/@forgejo`. For more significant releases it is best to consider a dedicated and non-standard toot.
|
||||||
|
|
||||||
|
```
|
||||||
|
#Forgejo vX.Y.Z-N was just released! This is a minor patch. Check out the release notes and download it at https://forgejo.org/releases/. If you experience any issues with this release, please report to https://codeberg.org/forgejo/forgejo/issues.
|
||||||
|
```
|
||||||
|
|
||||||
|
## Release signing keys management
|
||||||
|
|
||||||
|
A GPG master key with no expiration date is created and shared with members of the Owners team via encrypted email. A subkey with a one year expiration date is created and stored in the secrets repository, to be used by the CI pipeline. The public master key is stored in the secrets repository and published where relevant.
|
||||||
|
|
||||||
|
### Master key creation
|
||||||
|
|
||||||
|
* gpg --expert --full-generate-key
|
||||||
|
* key type: ECC and ECC option with Curve 25519 as curve
|
||||||
|
* no expiration
|
||||||
|
* id: Forgejo Releases <contact@forgejo.org>
|
||||||
|
* gpg --export-secret-keys --armor EB114F5E6C0DC2BCDD183550A4B61A2DC5923710 and send via encrypted email to Owners
|
||||||
|
* gpg --export --armor EB114F5E6C0DC2BCDD183550A4B61A2DC5923710 > release-team-gpg.pub
|
||||||
|
* commit to the secret repository
|
||||||
|
|
||||||
|
### Subkey creation and renewal
|
||||||
|
|
||||||
|
* gpg --expert --edit-key EB114F5E6C0DC2BCDD183550A4B61A2DC5923710
|
||||||
|
* addkey
|
||||||
|
* key type: ECC (signature only)
|
||||||
|
* key validity: one year
|
||||||
|
* create [an issue](https://codeberg.org/forgejo/forgejo/issues) to schedule the renewal
|
||||||
|
|
||||||
|
#### 2023
|
||||||
|
|
||||||
|
* gpg --export --armor F7CBF02094E7665E17ED6C44E381BF3E50D53707 > 2023-release-team-gpg.pub
|
||||||
|
* gpg --export-secret-keys --armor F7CBF02094E7665E17ED6C44E381BF3E50D53707 > 2023-release-team-gpg
|
||||||
|
* commit to the secrets repository
|
||||||
|
* renewal issue https://codeberg.org/forgejo/forgejo/issues/58
|
||||||
|
|
||||||
|
### CI configuration
|
||||||
|
|
||||||
|
In the Woodpecker CI configuration the following secrets must be set:
|
||||||
|
|
||||||
|
* `releaseteamgpg` is the secret GPG key used to sign the releases
|
||||||
|
* `releaseteamuser` is the user name to authenticate with the Forgejo API and publish the releases
|
||||||
|
* `releaseteamtoken` is the token to authenticate `releaseteamuser` with the Forgejo API and publish the releases
|
||||||
|
* `domain` is `codeberg.org`
|
||||||
|
|
||||||
|
## Users, organizations and repositories
|
||||||
|
|
||||||
|
### Shared user: release-team
|
||||||
|
|
||||||
|
The [release-team](https://codeberg.org/release-team) user publishes and signs all releases. The associated email is mailto:release@forgejo.org.
|
||||||
|
|
||||||
|
The public GPG key used to sign the releases is [EB114F5E6C0DC2BCDD183550A4B61A2DC5923710](https://codeberg.org/release-team.gpg) `Forgejo Releases <release@forgejo.org>`
|
||||||
|
|
||||||
|
### Shared user: forgejo-ci
|
||||||
|
|
||||||
|
The [forgejo-ci](https://codeberg.org/forgejo-ci) user is dedicated to https://forgejo-ci.codeberg.org/ and provides it with OAuth2 credentials it uses to run.
|
||||||
|
|
||||||
|
### Shared user: forgejo-experimental-ci
|
||||||
|
|
||||||
|
The [forgejo-experimental-ci](https://codeberg.org/forgejo-experimental-ci) user is dedicated to provide the application tokens used by Woodpecker CI repositories to build releases and publish them to https://codeberg.org/forgejo-experimental. It does not (and must not) have permission to publish releases at https://codeberg.org/forgejo.
|
||||||
|
|
||||||
|
### Integration and experimental organization
|
||||||
|
|
||||||
|
The https://codeberg.org/forgejo-integration organization is dedicated to integration testing. Its purpose is to ensure all artefacts can effectively be published and retrieved by the CI/CD pipelines.
|
||||||
|
|
||||||
|
The https://codeberg.org/forgejo-experimental organization is dedicated to publishing experimental Forgejo releases. They are copied from the https://codeberg.org/forgejo-integration organization.
|
||||||
|
|
||||||
|
The `forgejo-experimental-ci` user as well as all Forgejo contributors working on the CI/CD pipeline should be owners of both organizations.
|
||||||
|
|
||||||
|
The https://codeberg.org/forgejo-integration/forgejo repository is coupled with a Woodpecker CI repository configured with the credentials provided by the https://codeberg.org/forgejo-experimental-ci user. It runs the pipelines found in `releases/woodpecker-build/*.yml` which builds and publishes an unsigned release in https://codeberg.org/forgejo-integration.
|
||||||
|
|
||||||
|
### Experimental and release repositories
|
||||||
|
|
||||||
|
The https://codeberg.org/forgejo/experimental private repository is coupled with a Woodpecker CI repository configured with the credentials provided by the https://codeberg.org/forgejo-experimental-ci user. It runs the pipelines found in `releases/woodpecker-publish/*.yml` which signs and copies a release from https://codeberg.org/forgejo-integration into https://codeberg.org/forgejo-experimental.
|
||||||
|
|
||||||
|
The https://codeberg.org/forgejo/release private repository is coupled with a Woodpecker CI repository configured with the credentials provided by the https://codeberg.org/release-team user. It runs the pipelines found in `releases/woodpecker-publish/*.yml` which signs and copies a release from https://codeberg.org/forgejo-integration into https://codeberg.org/forgejo.
|
56
CONTRIBUTING/SECRETS.md
Normal file
56
CONTRIBUTING/SECRETS.md
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
# Secrets
|
||||||
|
|
||||||
|
All Forgejo credentials are shared among the [secret keepers](https://codeberg.org/forgejo/meta/src/branch/readme/TEAMS.md#secrets-keeper) teams in a private repository with encrypted content.
|
||||||
|
|
||||||
|
## Get started
|
||||||
|
|
||||||
|
1. Make sure you have a GPG Key, or [create one](https://github.com/NicoHood/gpgit#12-key-generation)
|
||||||
|
2. Send someone else your public key and ask this person to add yourself as a recipient
|
||||||
|
```
|
||||||
|
# Commands for the other person
|
||||||
|
$ gpg --import public_key.asc
|
||||||
|
# The following command will open a prompt, with the available public keys.
|
||||||
|
# Choose the one you just added and all secrets will be re-encrypted with this new key.
|
||||||
|
$ gopass recipients add
|
||||||
|
```
|
||||||
|
3. [Install gopass](https://www.gopass.pw/#install)
|
||||||
|
> :warning: When installing on Ubuntu or Debian you can either download the deb package, install manually or build from source or use our APT repository ([github comment](https://github.com/gopasspw/gopass/issues/1849#issuecomment-802789285) with more information).
|
||||||
|
4. Clone this repo using `gopass` (the name and email are for `git config`)
|
||||||
|
```
|
||||||
|
$ gopass clone git@codeberg.org:forgejo/gopass.git
|
||||||
|
```
|
||||||
|
5. Check the consistency of the gopass storage
|
||||||
|
```
|
||||||
|
$ gopass fsck
|
||||||
|
```
|
||||||
|
|
||||||
|
## Get a secret
|
||||||
|
|
||||||
|
Show the whole secret file:
|
||||||
|
```
|
||||||
|
$ gopass show ovh.com/manager
|
||||||
|
```
|
||||||
|
|
||||||
|
Copy the password in the clipboard:
|
||||||
|
```
|
||||||
|
$ gopass show -c ovh.com/manager
|
||||||
|
```
|
||||||
|
|
||||||
|
Copy the `user` part of the secret in the clipboard:
|
||||||
|
```
|
||||||
|
$ gopass show -c ovh.com/manager user
|
||||||
|
```
|
||||||
|
|
||||||
|
## Insert or edit a secret
|
||||||
|
```
|
||||||
|
$ gopass edit ovh.com/manager
|
||||||
|
```
|
||||||
|
In the editor, insert the password on the first line.
|
||||||
|
You may then add lines with a `key: value` syntax (`user: username` for instance).
|
||||||
|
|
||||||
|
## Debugging and manual git operations
|
||||||
|
|
||||||
|
The following command will show the location and status of the git repo (all git commands are available).
|
||||||
|
```
|
||||||
|
$ gopass git status
|
||||||
|
```
|
124
CONTRIBUTING/WORKFLOW.md
Normal file
124
CONTRIBUTING/WORKFLOW.md
Normal file
|
@ -0,0 +1,124 @@
|
||||||
|
# Development workflow
|
||||||
|
|
||||||
|
Forgejo is a soft fork, i.e. a set of commits applied to the Gitea development branch and the stable branches. On a regular basis those commits are rebased and modified if necessary to keep working. All Forgejo commits are merged into a branch from which binary releases and packages are created and distributed. The development workflow is a set of conventions Forgejo developers are expected to follow to work together.
|
||||||
|
|
||||||
|
Discussions on how the workflow should evolve happen [in the isssue tracker](https://codeberg.org/forgejo/forgejo/issues?type=all&state=open&labels=&milestone=0&assignee=0&q=%5BWORKFLOW%5D).
|
||||||
|
|
||||||
|
## Naming conventions
|
||||||
|
|
||||||
|
### Development
|
||||||
|
|
||||||
|
* Gitea: main
|
||||||
|
* Forgejo: forgejo
|
||||||
|
* Feature branches: forgejo-feature-name
|
||||||
|
|
||||||
|
### Stable
|
||||||
|
|
||||||
|
* Gitea: release/vX.Y
|
||||||
|
* Forgejo: vX.Y/forgejo
|
||||||
|
* Feature branches: vX.Y/forgejo-feature-name
|
||||||
|
|
||||||
|
### Soft fork history
|
||||||
|
|
||||||
|
Before rebasing on top of Gitea, all branches are copied to `soft-fork/YYYY-MM-DD/<branch>` for safekeeping. Older `soft-fork/*/<branch>` branches are converted into references under the same name. Similar to how pull requests store their head, they do not clutter the list of branches but can be retrieved if needed with `git fetch +refs/soft-fork/*:refs/soft-fork/*`. Tooling to automate this archival process [is available](https://codeberg.org/forgejo-contrib/soft-fork-tools/src/branch/master/README.md#archive-branches).
|
||||||
|
|
||||||
|
### Tags
|
||||||
|
|
||||||
|
Because the branches are rebased on top of Gitea, only the latest tag will be found in a given branch. For instance `v1.18.0-1` won't be found in the `v1.18/forgejo` branch after it is rebased.
|
||||||
|
|
||||||
|
## Rebasing
|
||||||
|
|
||||||
|
### *Feature branch*
|
||||||
|
|
||||||
|
The *Gitea* branches are mirrored with the Gitea development and stable branches.
|
||||||
|
|
||||||
|
On a regular basis, each *Feature branch* is rebased against the base *Gitea* branch.
|
||||||
|
|
||||||
|
### forgejo branch
|
||||||
|
|
||||||
|
The latest *Gitea* branch resets the *forgejo* branch and all *Feature branches* are merged into it.
|
||||||
|
|
||||||
|
If tests pass after pushing *forgejo* to the https://codeberg.org/forgejo-integration/forgejo repository, it can be pushed to the https://codeberg.org/forgejo/forgejo repository.
|
||||||
|
|
||||||
|
If tests do not pass, an issue is filed to the *Feature branch* that fails the test. Once the issue is resolved, another round of rebasing starts.
|
||||||
|
|
||||||
|
### Cherry picking and rebasing
|
||||||
|
|
||||||
|
Because Forgejo is a soft fork of Gitea, the commits in feature branches need to be cherry-picked on top of their base branch. They cannot be rebased using `git rebase`, because their base branch has been rebased.
|
||||||
|
|
||||||
|
Here is how the commits in the `forgejo-f3` branch can be cherry-picked on top of the latest `forgejo-development` branch:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ git fetch --all
|
||||||
|
$ git remote get-url forgejo
|
||||||
|
git@codeberg.org:forgejo/forgejo.git
|
||||||
|
$ git checkout -b forgejo/forgejo-f3
|
||||||
|
$ git reset --hard forgejo/forgejo-development
|
||||||
|
$ git cherry-pick $(git rev-list --reverse forgejo/soft-fork/2022-12-10/forgejo-development..forgejo/soft-fork/2022-12-10/forgejo-f3)
|
||||||
|
$ git push --force forgejo-f3 forgejo/forgejo-f3
|
||||||
|
```
|
||||||
|
|
||||||
|
## Feature branches
|
||||||
|
|
||||||
|
All *Feature branches* are based on the {vX.Y/,}forgejo-development branch which provides development tools and documentation.
|
||||||
|
|
||||||
|
The `forgejo-development` branch is based on the {vX.Y/,}forgejo-ci branch which provides the Woodpecker CI configuration.
|
||||||
|
|
||||||
|
The purpose of each *Feature branch* is documented below:
|
||||||
|
|
||||||
|
### General purpose
|
||||||
|
|
||||||
|
* [forgejo-ci](https://codeberg.org/forgejo/forgejo/src/branch/forgejo-ci) based on [main](https://codeberg.org/forgejo/forgejo/src/branch/main)
|
||||||
|
Woodpecker CI configuration, including the release process.
|
||||||
|
* Backports: [v1.18/forgejo-ci](https://codeberg.org/forgejo/forgejo/src/branch/v1.18/forgejo-ci)
|
||||||
|
|
||||||
|
* [forgejo-development](https://codeberg.org/forgejo/forgejo/src/branch/forgejo-development) based on [forgejo-ci](https://codeberg.org/forgejo/forgejo/src/branch/forgejo-ci)
|
||||||
|
Forgejo development tools and documentation.
|
||||||
|
* Backports: [v1.18/forgejo-development](https://codeberg.org/forgejo/forgejo/src/branch/v1.18/forgejo-development)
|
||||||
|
|
||||||
|
### Dependency
|
||||||
|
|
||||||
|
* [forgejo-dependency](https://codeberg.org/forgejo/forgejo/src/branch/forgejo-dependency) based on [forgejo-development](https://codeberg.org/forgejo/forgejo/src/branch/forgejo-development)
|
||||||
|
Each commit is prefixed with the name of dependency in uppercase, for instance **[GOTH]** or **[GITEA]**. They are standalone and implement either a bug fix or a feature that is in the process of being contributed to the dependency. It is better to contribute directly to the dependency instead of adding a commit to this branch but it is sometimes not possible, for instance when someone does not have a GitHub account. The author of the commit is responsible for rebasing and resolve conflicts. The ultimate goal of this branch is to be empty and it is expected that a continuous effort is made to reduce its content so that the technical debt it represents does not burden Forgejo long term.
|
||||||
|
* Backports: [v1.18/forgejo-dependency](https://codeberg.org/forgejo/forgejo/src/branch/v1.18/forgejo-dependency)
|
||||||
|
|
||||||
|
### [Privacy](https://codeberg.org/forgejo/forgejo/issues?labels=83271)
|
||||||
|
|
||||||
|
* [forgejo-privacy](https://codeberg.org/forgejo/forgejo/src/branch/forgejo-privacy) based on [forgejo-development](https://codeberg.org/forgejo/forgejo/src/branch/forgejo-development)
|
||||||
|
Customize Forgejo to have more privacy.
|
||||||
|
* Backports: [v1.18/forgejo-privacy](https://codeberg.org/forgejo/forgejo/src/branch/v1.18/forgejo-privacy)
|
||||||
|
|
||||||
|
### Branding
|
||||||
|
* [forgejo-branding](https://codeberg.org/forgejo/forgejo/src/branch/forgejo-branding) based on [forgejo-development](https://codeberg.org/forgejo/forgejo/src/branch/forgejo-development)
|
||||||
|
Replacing upstream branding with Forgejo branding
|
||||||
|
|
||||||
|
### [Internationalization](https://codeberg.org/forgejo/forgejo/issues?labels=82637)
|
||||||
|
* [forgejo-i18n](https://codeberg.org/forgejo/forgejo/src/branch/forgejo-i18n) based on [forgejo-development](https://codeberg.org/forgejo/forgejo/src/branch/forgejo-development)
|
||||||
|
Internationalization support for Forgejo with a workflow based on Weblate.
|
||||||
|
|
||||||
|
### [Accessibility](https://codeberg.org/forgejo/forgejo/issues?labels=81214)
|
||||||
|
* Backports only: [v1.18/forgejo-a11y](https://codeberg.org/forgejo/forgejo/src/branch/v1.18/forgejo-a11y) based on [v1.18/forgejo-development](https://codeberg.org/forgejo/forgejo/src/branch/v1.18/forgejo-development)
|
||||||
|
Backport future upstream a11y improvements to the current release of Forgejo
|
||||||
|
|
||||||
|
### [Federation](https://codeberg.org/forgejo/forgejo/issues?labels=79349)
|
||||||
|
|
||||||
|
* [forgejo-federation](https://codeberg.org/forgejo/forgejo/src/branch/forgejo-federation) based on [forgejo-development](https://codeberg.org/forgejo/forgejo/src/branch/forgejo-development)
|
||||||
|
Federation support for Forgejo
|
||||||
|
|
||||||
|
* [forgejo-f3](https://codeberg.org/forgejo/forgejo/src/branch/forgejo-f3) based on [forgejo-development](https://codeberg.org/forgejo/forgejo/src/branch/forgejo-development)
|
||||||
|
[F3](https://lab.forgefriends.org/friendlyforgeformat/gof3) support for Forgejo
|
||||||
|
|
||||||
|
## Pull requests and feature branches
|
||||||
|
|
||||||
|
Most people who are used to contributing will be familiar with the workflow of sending a pull request against the default branch. When that happens the reviewer should change the base branch to the appropriate *Feature branch* instead. If the pull request does not fit in any *Feature branch*, the reviewer needs to make decision to either:
|
||||||
|
|
||||||
|
* Decline the pull request because it is best contributed to Gitea
|
||||||
|
* Create a new *Feature branch*
|
||||||
|
|
||||||
|
Returning contributors can figure out which *Feature branch* to base their pull request on using the list of *Feature branches*.
|
||||||
|
|
||||||
|
## Granularity
|
||||||
|
|
||||||
|
*Feature branches* can contain a number of commits grouped together, for instance for branding the documentation, the landing page and the footer. It makes it convenient for people working on that topic to get the big picture without browsing multiple branches. Creating a new *Feature branch* for each individual commit, while possible, is likely to be difficult to work with.
|
||||||
|
|
||||||
|
Observing the granularity of the existing *Feature branches* is the best way to figure out what works and what does not. It requires adjustments from time to time depending on the number of contributors and the complexity of the Forgejo codebase that sits on top of Gitea.
|
|
@ -1,5 +1,5 @@
|
||||||
#Build stage
|
#Build stage
|
||||||
FROM golang:1.20-alpine3.17 AS build-env
|
FROM --platform=$BUILDPLATFORM golang:1.20-alpine3.17 AS build-env
|
||||||
|
|
||||||
ARG GOPROXY
|
ARG GOPROXY
|
||||||
ENV GOPROXY ${GOPROXY:-direct}
|
ENV GOPROXY ${GOPROXY:-direct}
|
||||||
|
@ -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 alpine:3.17
|
FROM alpine:3.17
|
||||||
LABEL maintainer="maintainers@gitea.io"
|
LABEL maintainer="contact@forgejo.org"
|
||||||
|
|
||||||
EXPOSE 22 3000
|
EXPOSE 22 3000
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
#Build stage
|
#Build stage
|
||||||
FROM golang:1.20-alpine3.17 AS build-env
|
FROM --platform=$BUILDPLATFORM golang:1.20-alpine3.17 AS build-env
|
||||||
|
|
||||||
ARG GOPROXY
|
ARG GOPROXY
|
||||||
ENV GOPROXY ${GOPROXY:-direct}
|
ENV GOPROXY ${GOPROXY:-direct}
|
||||||
|
@ -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 alpine:3.17
|
FROM alpine:3.17
|
||||||
LABEL maintainer="maintainers@gitea.io"
|
LABEL maintainer="contact@forgejo.org"
|
||||||
|
|
||||||
EXPOSE 2222 3000
|
EXPOSE 2222 3000
|
||||||
|
|
||||||
|
|
1
LICENSE
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
|
||||||
|
|
||||||
|
|
44
Makefile
44
Makefile
|
@ -26,6 +26,8 @@ COMMA := ,
|
||||||
XGO_VERSION := go-1.20.x
|
XGO_VERSION := go-1.20.x
|
||||||
|
|
||||||
AIR_PACKAGE ?= github.com/cosmtrek/air@v1.40.4
|
AIR_PACKAGE ?= github.com/cosmtrek/air@v1.40.4
|
||||||
|
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
|
||||||
EDITORCONFIG_CHECKER_PACKAGE ?= github.com/editorconfig-checker/editorconfig-checker/cmd/editorconfig-checker@2.6.0
|
EDITORCONFIG_CHECKER_PACKAGE ?= github.com/editorconfig-checker/editorconfig-checker/cmd/editorconfig-checker@2.6.0
|
||||||
ERRCHECK_PACKAGE ?= github.com/kisielk/errcheck@v1.6.2
|
ERRCHECK_PACKAGE ?= github.com/kisielk/errcheck@v1.6.2
|
||||||
GOFUMPT_PACKAGE ?= mvdan.cc/gofumpt@v0.4.0
|
GOFUMPT_PACKAGE ?= mvdan.cc/gofumpt@v0.4.0
|
||||||
|
@ -83,7 +85,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
|
||||||
|
@ -96,7 +98,9 @@ else
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
LDFLAGS := $(LDFLAGS) -X "main.MakeVersion=$(MAKE_VERSION)" -X "main.Version=$(GITEA_VERSION)" -X "main.Tags=$(TAGS)"
|
FORGEJO_VERSION := v2.0.0 # SemVer
|
||||||
|
|
||||||
|
LDFLAGS := $(LDFLAGS) -X "main.MakeVersion=$(MAKE_VERSION)" -X "main.Version=$(GITEA_VERSION)" -X "main.Tags=$(TAGS)" -X "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
|
||||||
|
|
||||||
|
@ -148,6 +152,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
|
||||||
|
@ -208,6 +214,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 " - golangci-lint run golangci-lint linter"
|
@echo " - golangci-lint run golangci-lint linter"
|
||||||
|
@ -286,8 +294,7 @@ misspell-check:
|
||||||
.PHONY: vet
|
.PHONY: vet
|
||||||
vet:
|
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: $(TAGS_EVIDENCE)
|
.PHONY: $(TAGS_EVIDENCE)
|
||||||
$(TAGS_EVIDENCE):
|
$(TAGS_EVIDENCE):
|
||||||
|
@ -298,6 +305,25 @@ ifneq "$(TAGS)" "$(shell cat $(TAGS_EVIDENCE) 2>/dev/null)"
|
||||||
TAGS_PREREQ := $(TAGS_EVIDENCE)
|
TAGS_PREREQ := $(TAGS_EVIDENCE)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
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)
|
||||||
|
|
||||||
|
@ -333,7 +359,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
|
||||||
|
@ -751,7 +777,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)
|
||||||
|
@ -768,7 +794,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
|
||||||
|
@ -805,8 +831,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
|
||||||
|
|
205
README.md
205
README.md
|
@ -1,180 +1,47 @@
|
||||||
<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.
|
||||||
|
Interested? [Read more](https://codeberg.org/forgejo/forgejo/src/branch/forgejo/CONTRIBUTING/WORKFLOW.md#federation-https-codeberg-org-forgejo-forgejo-issues-labels-79349)
|
||||||
|
|
||||||
From the root of the source tree, run:
|
## Learn more
|
||||||
|
|
||||||
TAGS="bindata" make build
|
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/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
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)|
|
|
392
RELEASE-NOTES.md
Normal file
392
RELEASE-NOTES.md
Normal file
|
@ -0,0 +1,392 @@
|
||||||
|
# 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.18.1 or v1.18.2) does not require manual actions but others might (e.g. v1.18.0, v1.19.0).
|
||||||
|
|
||||||
|
## 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
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.
|
|
7
go.mod
7
go.mod
|
@ -107,7 +107,7 @@ require (
|
||||||
golang.org/x/oauth2 v0.3.0
|
golang.org/x/oauth2 v0.3.0
|
||||||
golang.org/x/sys v0.3.0
|
golang.org/x/sys v0.3.0
|
||||||
golang.org/x/text v0.5.0
|
golang.org/x/text v0.5.0
|
||||||
golang.org/x/tools v0.1.12
|
golang.org/x/tools v0.3.0
|
||||||
google.golang.org/grpc v1.47.0
|
google.golang.org/grpc v1.47.0
|
||||||
google.golang.org/protobuf v1.28.1
|
google.golang.org/protobuf v1.28.1
|
||||||
gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df
|
gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df
|
||||||
|
@ -184,6 +184,7 @@ require (
|
||||||
github.com/go-openapi/strfmt v0.21.3 // indirect
|
github.com/go-openapi/strfmt v0.21.3 // indirect
|
||||||
github.com/go-openapi/swag v0.22.3 // indirect
|
github.com/go-openapi/swag v0.22.3 // indirect
|
||||||
github.com/go-openapi/validate v0.22.0 // indirect
|
github.com/go-openapi/validate v0.22.0 // indirect
|
||||||
|
github.com/go-test/deep v1.0.8 // indirect
|
||||||
github.com/go-webauthn/revoke v0.1.6 // indirect
|
github.com/go-webauthn/revoke v0.1.6 // indirect
|
||||||
github.com/goccy/go-json v0.10.0 // indirect
|
github.com/goccy/go-json v0.10.0 // indirect
|
||||||
github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 // indirect
|
github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 // indirect
|
||||||
|
@ -232,7 +233,7 @@ require (
|
||||||
github.com/oklog/ulid v1.3.1 // indirect
|
github.com/oklog/ulid v1.3.1 // indirect
|
||||||
github.com/olekukonko/tablewriter v0.0.5 // indirect
|
github.com/olekukonko/tablewriter v0.0.5 // indirect
|
||||||
github.com/pelletier/go-toml v1.9.5 // indirect
|
github.com/pelletier/go-toml v1.9.5 // indirect
|
||||||
github.com/pelletier/go-toml/v2 v2.0.1 // indirect
|
github.com/pelletier/go-toml/v2 v2.0.5 // indirect
|
||||||
github.com/pierrec/lz4/v4 v4.1.17 // indirect
|
github.com/pierrec/lz4/v4 v4.1.17 // indirect
|
||||||
github.com/pjbgf/sha1cd v0.2.3 // indirect
|
github.com/pjbgf/sha1cd v0.2.3 // indirect
|
||||||
github.com/pmezard/go-difflib v1.0.0 // indirect
|
github.com/pmezard/go-difflib v1.0.0 // indirect
|
||||||
|
@ -271,7 +272,7 @@ require (
|
||||||
go.uber.org/multierr v1.9.0 // indirect
|
go.uber.org/multierr v1.9.0 // indirect
|
||||||
go.uber.org/zap v1.24.0 // indirect
|
go.uber.org/zap v1.24.0 // indirect
|
||||||
golang.org/x/mod v0.7.0 // indirect
|
golang.org/x/mod v0.7.0 // indirect
|
||||||
golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde // indirect
|
golang.org/x/sync v0.1.0 // indirect
|
||||||
golang.org/x/time v0.3.0 // indirect
|
golang.org/x/time v0.3.0 // indirect
|
||||||
google.golang.org/appengine v1.6.7 // indirect
|
google.golang.org/appengine v1.6.7 // indirect
|
||||||
google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90 // indirect
|
google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90 // indirect
|
||||||
|
|
14
go.sum
14
go.sum
|
@ -476,8 +476,9 @@ github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP
|
||||||
github.com/go-swagger/go-swagger v0.30.3 h1:HuzvdMRed/9Q8vmzVcfNBQByZVtT79DNZxZ18OprdoI=
|
github.com/go-swagger/go-swagger v0.30.3 h1:HuzvdMRed/9Q8vmzVcfNBQByZVtT79DNZxZ18OprdoI=
|
||||||
github.com/go-swagger/go-swagger v0.30.3/go.mod h1:neDPes8r8PCz2JPvHRDj8BTULLh4VJUt7n6MpQqxhHM=
|
github.com/go-swagger/go-swagger v0.30.3/go.mod h1:neDPes8r8PCz2JPvHRDj8BTULLh4VJUt7n6MpQqxhHM=
|
||||||
github.com/go-swagger/scan-repo-boundary v0.0.0-20180623220736-973b3573c013 h1:l9rI6sNaZgNC0LnF3MiE+qTmyBA/tZAg1rtyrGbUMK0=
|
github.com/go-swagger/scan-repo-boundary v0.0.0-20180623220736-973b3573c013 h1:l9rI6sNaZgNC0LnF3MiE+qTmyBA/tZAg1rtyrGbUMK0=
|
||||||
github.com/go-test/deep v1.0.7 h1:/VSMRlnY/JSyqxQUzQLKVMAskpY/NZKFA5j2P+0pP2M=
|
|
||||||
github.com/go-test/deep v1.0.7/go.mod h1:QV8Hv/iy04NyLBxAdO9njL0iVPN1S4d/A3NVv1V36o8=
|
github.com/go-test/deep v1.0.7/go.mod h1:QV8Hv/iy04NyLBxAdO9njL0iVPN1S4d/A3NVv1V36o8=
|
||||||
|
github.com/go-test/deep v1.0.8 h1:TDsG77qcSprGbC6vTN8OuXp5g+J+b5Pcguhf7Zt61VM=
|
||||||
|
github.com/go-test/deep v1.0.8/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE=
|
||||||
github.com/go-testfixtures/testfixtures/v3 v3.8.1 h1:uonwvepqRvSgddcrReZQhojTlWlmOlHkYAb9ZaOMWgU=
|
github.com/go-testfixtures/testfixtures/v3 v3.8.1 h1:uonwvepqRvSgddcrReZQhojTlWlmOlHkYAb9ZaOMWgU=
|
||||||
github.com/go-testfixtures/testfixtures/v3 v3.8.1/go.mod h1:Kdu7YeMC0KRXVHdaQ91Vmx3pcjoTF63h4f1qTJDdXLA=
|
github.com/go-testfixtures/testfixtures/v3 v3.8.1/go.mod h1:Kdu7YeMC0KRXVHdaQ91Vmx3pcjoTF63h4f1qTJDdXLA=
|
||||||
github.com/go-webauthn/revoke v0.1.6 h1:3tv+itza9WpX5tryRQx4GwxCCBrCIiJ8GIkOhxiAmmU=
|
github.com/go-webauthn/revoke v0.1.6 h1:3tv+itza9WpX5tryRQx4GwxCCBrCIiJ8GIkOhxiAmmU=
|
||||||
|
@ -1030,8 +1031,8 @@ github.com/pelletier/go-toml v1.7.0/go.mod h1:vwGMzjaWMwyfHwgIBhI2YUM4fB6nL6lVAv
|
||||||
github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc=
|
github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc=
|
||||||
github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8=
|
github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8=
|
||||||
github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
|
github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
|
||||||
github.com/pelletier/go-toml/v2 v2.0.1 h1:8e3L2cCQzLFi2CR4g7vGFuFxX7Jl1kKX8gW+iV0GUKU=
|
github.com/pelletier/go-toml/v2 v2.0.5 h1:ipoSadvV8oGUjnUbMub59IDPPwfxF694nG/jwbMiyQg=
|
||||||
github.com/pelletier/go-toml/v2 v2.0.1/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo=
|
github.com/pelletier/go-toml/v2 v2.0.5/go.mod h1:OMHamSCAODeSsVrwwvcJOaoN0LIUIaFVNZzmWyNfXas=
|
||||||
github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac=
|
github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac=
|
||||||
github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU=
|
github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU=
|
||||||
github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc=
|
github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc=
|
||||||
|
@ -1501,8 +1502,8 @@ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJ
|
||||||
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde h1:ejfdSekXMDxDLbRrJMwUk6KnSLZ2McaUCVcIKM+N6jc=
|
golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o=
|
||||||
golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
|
@ -1704,8 +1705,9 @@ golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
||||||
golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
||||||
golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
||||||
golang.org/x/tools v0.1.6-0.20210726203631-07bc1bf47fb2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
golang.org/x/tools v0.1.6-0.20210726203631-07bc1bf47fb2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
||||||
golang.org/x/tools v0.1.12 h1:VveCTK38A2rkS8ZqFY25HIDFscX5X9OoEhJd3quQmXU=
|
|
||||||
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
|
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
|
||||||
|
golang.org/x/tools v0.3.0 h1:SrNbZl6ECOS1qFzgTdQfWXZM9XBkiA6tkFrH9YSTPHM=
|
||||||
|
golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k=
|
||||||
golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
|
|
|
@ -1,53 +0,0 @@
|
||||||
// Copyright 2020 The Gitea Authors. All rights reserved.
|
|
||||||
// SPDX-License-Identifier: MIT
|
|
||||||
|
|
||||||
package stats
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"path/filepath"
|
|
||||||
"testing"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"code.gitea.io/gitea/models/db"
|
|
||||||
repo_model "code.gitea.io/gitea/models/repo"
|
|
||||||
"code.gitea.io/gitea/models/unittest"
|
|
||||||
"code.gitea.io/gitea/modules/queue"
|
|
||||||
"code.gitea.io/gitea/modules/setting"
|
|
||||||
|
|
||||||
_ "code.gitea.io/gitea/models"
|
|
||||||
|
|
||||||
"github.com/stretchr/testify/assert"
|
|
||||||
"gopkg.in/ini.v1"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestMain(m *testing.M) {
|
|
||||||
unittest.MainTest(m, &unittest.TestOptions{
|
|
||||||
GiteaRootPath: filepath.Join("..", "..", ".."),
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestRepoStatsIndex(t *testing.T) {
|
|
||||||
assert.NoError(t, unittest.PrepareTestDatabase())
|
|
||||||
setting.Cfg = ini.Empty()
|
|
||||||
|
|
||||||
setting.NewQueueService()
|
|
||||||
|
|
||||||
err := Init()
|
|
||||||
assert.NoError(t, err)
|
|
||||||
|
|
||||||
repo, err := repo_model.GetRepositoryByID(db.DefaultContext, 1)
|
|
||||||
assert.NoError(t, err)
|
|
||||||
|
|
||||||
err = UpdateRepoIndexer(repo)
|
|
||||||
assert.NoError(t, err)
|
|
||||||
|
|
||||||
queue.GetManager().FlushAll(context.Background(), 5*time.Second)
|
|
||||||
|
|
||||||
status, err := repo_model.GetIndexerStatus(db.DefaultContext, repo, repo_model.RepoIndexerTypeStats)
|
|
||||||
assert.NoError(t, err)
|
|
||||||
assert.Equal(t, "65f1bf27bc3bf70f64657658635e66094edbcb4d", status.CommitSha)
|
|
||||||
langs, err := repo_model.GetTopLanguageStats(repo, 5)
|
|
||||||
assert.NoError(t, err)
|
|
||||||
assert.Empty(t, langs)
|
|
||||||
}
|
|
40
public/forgejo/api.v1.yml
Normal file
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:
|
||||||
|
number:
|
||||||
|
type: string
|
||||||
|
|
3
releases/Dockerfile
Normal file
3
releases/Dockerfile
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
FROM alpine:3.17
|
||||||
|
|
||||||
|
RUN echo root > state
|
3
releases/Dockerfile-rootless
Normal file
3
releases/Dockerfile-rootless
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
FROM alpine:3.17
|
||||||
|
|
||||||
|
RUN echo rootless > state
|
47
releases/binaries-pull-push-test.sh
Executable file
47
releases/binaries-pull-push-test.sh
Executable file
|
@ -0,0 +1,47 @@
|
||||||
|
#!/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
|
||||||
|
}
|
||||||
|
|
||||||
|
#
|
||||||
|
# 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
|
||||||
|
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:=v17.8.20-1}
|
||||||
|
|
||||||
|
. $(dirname $0)/binaries-pull-push.sh
|
74
releases/binaries-pull-push.sh
Executable file
74
releases/binaries-pull-push.sh
Executable file
|
@ -0,0 +1,74 @@
|
||||||
|
#!/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
|
||||||
|
}
|
||||||
|
|
||||||
|
upload() {
|
||||||
|
ASSETS=$(ls $RELEASE_DIR/* | sed -e 's/^/-a /')
|
||||||
|
echo "${CI_COMMIT_TAG##v}" | grep -qi '\-rc' && export RELEASETYPE="--prerelease" && echo "Uploading as Pre-Release"
|
||||||
|
echo "${CI_COMMIT_TAG##v}" | grep -qi '\-test' && export RELEASETYPE="--draft" && echo "Uploading as Draft"
|
||||||
|
test ${RELEASETYPE+false} || echo "Uploading as Stable"
|
||||||
|
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() {
|
||||||
|
if ! which curl ; then
|
||||||
|
apk --update --no-cache add curl
|
||||||
|
fi
|
||||||
|
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
|
||||||
|
path=$2
|
||||||
|
|
||||||
|
curl --fail -X $method -sS -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
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
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
BIN
releases/images/forgejo-v1.18.0-rc1-2-landing.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 106 KiB |
106
releases/woodpecker-build/binaries.yml
Normal file
106
releases/woodpecker-build/binaries.yml
Normal file
|
@ -0,0 +1,106 @@
|
||||||
|
platform: linux/amd64
|
||||||
|
|
||||||
|
when:
|
||||||
|
event: tag
|
||||||
|
tag: v*
|
||||||
|
|
||||||
|
variables:
|
||||||
|
- &node_image 'node:18'
|
||||||
|
- &golang_image 'golang:1.20'
|
||||||
|
- &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: *golang_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
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
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
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
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
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
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
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 {
|
||||||
|
Number *string `json:"number,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
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"
|
||||||
|
@ -190,6 +191,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
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)
|
||||||
|
}
|
|
@ -211,6 +211,7 @@ func Routes(ctx gocontext.Context) *web.Route {
|
||||||
if setting.API.EnableSwagger {
|
if setting.API.EnableSwagger {
|
||||||
// Note: The route moved from apiroutes because it's in fact want to render a web page
|
// Note: The route moved from apiroutes because it's in fact want to render a web page
|
||||||
routes.Get("/api/swagger", append(common, misc.Swagger)...) // Render V1 by default
|
routes.Get("/api/swagger", append(common, misc.Swagger)...) // Render V1 by default
|
||||||
|
routes.Get("/api/forgejo/swagger", append(common, 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
|
||||||
|
|
13
templates/swagger/forgejo-ui.tmpl
Normal file
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>
|
21
tests/integration/api_forgejo_root_test.go
Normal file
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")
|
||||||
|
}
|
25
tests/integration/api_forgejo_version_test.go
Normal file
25
tests/integration/api_forgejo_version_test.go
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
// Copyright The Forgejo Authors.
|
||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
|
package integration
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net/http"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"code.gitea.io/gitea/routers/api/forgejo/v1"
|
||||||
|
"code.gitea.io/gitea/tests"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestAPIForgejoVersion(t *testing.T) {
|
||||||
|
defer tests.PrepareTestEnv(t)()
|
||||||
|
|
||||||
|
req := NewRequest(t, "GET", "/api/forgejo/v1/version")
|
||||||
|
resp := MakeRequest(t, req, http.StatusOK)
|
||||||
|
|
||||||
|
var version v1.Version
|
||||||
|
DecodeJSON(t, resp, &version)
|
||||||
|
assert.Equal(t, "development", *version.Number)
|
||||||
|
}
|
22
web_src/js/standalone/forgejo-swagger.js
Normal file
22
web_src/js/standalone/forgejo-swagger.js
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
import SwaggerUI from 'swagger-ui-dist/swagger-ui-es-bundle.js';
|
||||||
|
import 'swagger-ui-dist/swagger-ui.css';
|
||||||
|
|
||||||
|
window.addEventListener('load', async () => {
|
||||||
|
const url = document.getElementById('swagger-ui').getAttribute('data-source');
|
||||||
|
|
||||||
|
const ui = SwaggerUI({
|
||||||
|
url: url,
|
||||||
|
dom_id: '#swagger-ui',
|
||||||
|
deepLinking: true,
|
||||||
|
docExpansion: 'none',
|
||||||
|
defaultModelRendering: 'model', // don't show examples by default, because they may be incomplete
|
||||||
|
presets: [
|
||||||
|
SwaggerUI.presets.apis
|
||||||
|
],
|
||||||
|
plugins: [
|
||||||
|
SwaggerUI.plugins.DownloadUrl
|
||||||
|
]
|
||||||
|
});
|
||||||
|
|
||||||
|
window.ui = ui;
|
||||||
|
});
|
|
@ -59,6 +59,10 @@ export default {
|
||||||
fileURLToPath(new URL('web_src/fomantic/build/semantic.css', import.meta.url)),
|
fileURLToPath(new URL('web_src/fomantic/build/semantic.css', import.meta.url)),
|
||||||
fileURLToPath(new URL('web_src/less/index.less', import.meta.url)),
|
fileURLToPath(new URL('web_src/less/index.less', import.meta.url)),
|
||||||
],
|
],
|
||||||
|
forgejoswagger: [ // Forgejo swagger is OpenAPI 3.0.0 and has specific parameters
|
||||||
|
fileURLToPath(new URL('web_src/js/standalone/forgejo-swagger.js', import.meta.url)),
|
||||||
|
fileURLToPath(new URL('web_src/less/standalone/swagger.less', import.meta.url)),
|
||||||
|
],
|
||||||
swagger: [
|
swagger: [
|
||||||
fileURLToPath(new URL('web_src/js/standalone/swagger.js', import.meta.url)),
|
fileURLToPath(new URL('web_src/js/standalone/swagger.js', import.meta.url)),
|
||||||
fileURLToPath(new URL('web_src/less/standalone/swagger.less', import.meta.url)),
|
fileURLToPath(new URL('web_src/less/standalone/swagger.less', import.meta.url)),
|
||||||
|
|
Loading…
Reference in a new issue