diff --git a/.eslintrc b/.eslintrc.yaml similarity index 100% rename from .eslintrc rename to .eslintrc.yaml diff --git a/.gitattributes b/.gitattributes index 12c45dbc6..bb2783b0a 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,7 +1,5 @@ * text=auto eol=lf *.tmpl linguist-language=Handlebars -/.eslintrc linguist-language=YAML -/.stylelintrc linguist-language=YAML /public/vendor/** -text -eol linguist-vendored /vendor/** -text -eol linguist-vendored /web_src/fomantic/build/** linguist-generated diff --git a/.golangci.yml b/.golangci.yml index 4ad9c9d4c..11c58454a 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -19,6 +19,11 @@ linters: - revive - gofumpt - depguard + - nakedret + - unconvert + - wastedassign + - nolintlint + - stylecheck enable-all: false disable-all: true fast: false @@ -32,6 +37,10 @@ run: - web_src linters-settings: + stylecheck: + checks: ["all", "-ST1005", "-ST1003"] + nakedret: + max-func-lines: 0 gocritic: disabled-checks: - ifElseChain diff --git a/.stylelintrc b/.stylelintrc.yaml similarity index 100% rename from .stylelintrc rename to .stylelintrc.yaml diff --git a/CHANGELOG.md b/CHANGELOG.md index 0ca8bef00..406433e95 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,25 @@ This changelog goes through all the changes that have been made in each release without substantial changes to our git log; to see the highlights of what has been added to each release, please refer to the [blog](https://blog.gitea.io). +## [1.16.9](https://github.com/go-gitea/gitea/releases/tag/v1.16.9) - 2022-06-21 + +* BUGFIXES + * Release page show all tags in compare dropdown (#20070) (#20071) + * Fix permission check for delete tag (#19985) (#20001) + * Only log non ErrNotExist errors in git.GetNote (#19884) (#19905) + * Use exact search instead of fuzzy search for branch filter dropdown (#19885) (#19893) + * Set Setpgid on child git processes (#19865) (#19881) + * Import git from alpine 3.16 repository as 2.30.4 is needed for `safe.directory = '*'` to work but alpine 3.13 has 2.30.3 (#19876) + * Ensure responses are context.ResponseWriters (#19843) (#19859) + * Fix incorrect usage of `Count` function (#19850) + * Fix raw endpoint PDF file headers (#19825) (#19826) + * Make WIP prefixes case insensitive, e.g. allow `Draft` as a WIP prefix (#19780) (#19811) + * Don't return 500 on NotificationUnreadCount (#19802) + * Prevent NPE when cache service is disabled (#19703) (#19783) + * Detect truncated utf-8 characters at the end of content as still representing utf-8 (#19773) (#19774) + * Fix doctor pq: syntax error at or near "." quote user table name (#19765) (#19770) + * Fix bug with assigneees (#19757) + ## [1.16.8](https://github.com/go-gitea/gitea/releases/tag/v1.16.8) - 2022-05-16 * ENHANCEMENTS diff --git a/SECURITY.md b/SECURITY.md index 9846a94f7..7b43b32de 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -3,8 +3,76 @@ The Gitea maintainers take security seriously. If you discover a security issue, please bring it to their attention right away! -### Reporting a Vulnerability +## 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 + +``` +-----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. diff --git a/cmd/hook.go b/cmd/hook.go index 73386038b..ab6d48b54 100644 --- a/cmd/hook.go +++ b/cmd/hook.go @@ -792,7 +792,7 @@ func writeDataPktLine(out io.Writer, data []byte) error { if err != nil { return fail("Internal Server Error", "Pkt-Line response failed: %v", err) } - if 4 != lr { + if lr != 4 { return fail("Internal Server Error", "Pkt-Line response failed: %v", err) } diff --git a/cmd/manager_logging.go b/cmd/manager_logging.go index 0043ea1e5..761edf654 100644 --- a/cmd/manager_logging.go +++ b/cmd/manager_logging.go @@ -174,6 +174,18 @@ var ( Action: runAddSMTPLogger, }, }, + }, { + Name: "log-sql", + Usage: "Set LogSQL", + Flags: []cli.Flag{ + cli.BoolFlag{ + Name: "debug", + }, cli.BoolFlag{ + Name: "off", + Usage: "Switch off SQL logging", + }, + }, + Action: runSetLogSQL, }, }, } @@ -381,3 +393,18 @@ func runReleaseReopenLogging(c *cli.Context) error { fmt.Fprintln(os.Stdout, msg) return nil } + +func runSetLogSQL(c *cli.Context) error { + ctx, cancel := installSignals() + defer cancel() + setup("manager", c.Bool("debug")) + + statusCode, msg := private.SetLogSQL(ctx, !c.Bool("off")) + switch statusCode { + case http.StatusInternalServerError: + return fail("InternalServerError", msg) + } + + fmt.Fprintln(os.Stdout, msg) + return nil +} diff --git a/custom/conf/app.example.ini b/custom/conf/app.example.ini index c4b8913e4..5016f29cf 100644 --- a/custom/conf/app.example.ini +++ b/custom/conf/app.example.ini @@ -1097,6 +1097,9 @@ PATH = ;; Number of items that are displayed in home feed ;FEED_PAGING_NUM = 20 ;; +;; Number of items that are displayed in a single subsitemap +;SITEMAP_PAGING_NUM = 20 +;; ;; Number of maximum commits displayed in commit graph. ;GRAPH_MAX_COMMIT_NUM = 100 ;; @@ -2249,27 +2252,27 @@ PATH = ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; Enable/Disable federation capabilities -; ENABLED = true +;ENABLED = false ;; ;; Enable/Disable user statistics for nodeinfo if federation is enabled -; SHARE_USER_STATISTICS = true +;SHARE_USER_STATISTICS = true ;; ;; Maximum federation request and response size (MB) -; MAX_SIZE = 4 +;MAX_SIZE = 4 ;; ;; WARNING: Changing the settings below can break federation. ;; ;; HTTP signature algorithms -; ALGORITHMS = rsa-sha256, rsa-sha512, ed25519 +;ALGORITHMS = rsa-sha256, rsa-sha512, ed25519 ;; ;; HTTP signature digest algorithm -; DIGEST_ALGORITHM = SHA-256 +;DIGEST_ALGORITHM = SHA-256 ;; ;; GET headers for federation requests -; GET_HEADERS = (request-target), Date +;GET_HEADERS = (request-target), Date ;; ;; POST headers for federation requests -; POST_HEADERS = (request-target), Date, Digest +;POST_HEADERS = (request-target), Date, Digest ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/docs/config.yaml b/docs/config.yaml index 5a773662c..2d15e774e 100644 --- a/docs/config.yaml +++ b/docs/config.yaml @@ -18,7 +18,7 @@ params: description: Git with a cup of tea author: The Gitea Authors website: https://docs.gitea.io - version: 1.16.8 + version: 1.16.9 minGoVersion: 1.18 goVersion: 1.18 minNodeVersion: 14 diff --git a/docs/content/doc/advanced/config-cheat-sheet.en-us.md b/docs/content/doc/advanced/config-cheat-sheet.en-us.md index b50e630a8..df659b654 100644 --- a/docs/content/doc/advanced/config-cheat-sheet.en-us.md +++ b/docs/content/doc/advanced/config-cheat-sheet.en-us.md @@ -174,6 +174,7 @@ The following configuration set `Content-Type: application/vnd.android.package-a - `MEMBERS_PAGING_NUM`: **20**: Number of members that are shown in organization members. - `FEED_MAX_COMMIT_NUM`: **5**: Number of maximum commits shown in one activity feed. - `FEED_PAGING_NUM`: **20**: Number of items that are displayed in home feed. +- `SITEMAP_PAGING_NUM`: **20**: Number of items that are displayed in a single subsitemap. - `GRAPH_MAX_COMMIT_NUM`: **100**: Number of maximum commits shown in the commit graph. - `CODE_COMMENT_LINES`: **4**: Number of line of codes shown for a code comment. - `DEFAULT_THEME`: **auto**: \[auto, gitea, arc-green\]: Set the default theme for the Gitea install. @@ -1088,7 +1089,7 @@ Task queue configuration has been moved to `queue.task`. However, the below conf ## Federation (`federation`) -- `ENABLED`: **true**: Enable/Disable federation capabilities +- `ENABLED`: **false**: Enable/Disable federation capabilities - `SHARE_USER_STATISTICS`: **true**: Enable/Disable user statistics for nodeinfo if federation is enabled - `MAX_SIZE`: **4**: Maximum federation request and response size (MB) diff --git a/docs/content/doc/developers/oauth2-provider.md b/docs/content/doc/developers/oauth2-provider.md index efe78eed9..ce6e9aad8 100644 --- a/docs/content/doc/developers/oauth2-provider.md +++ b/docs/content/doc/developers/oauth2-provider.md @@ -41,13 +41,13 @@ To use the Authorization Code Grant as a third party application it is required ## Scopes -Currently Gitea does not support scopes (see [#4300](https://github.com/go-gitea/gitea/issues/4300)) and all third party applications will be granted access to all resources of the user and his/her organizations. +Currently Gitea does not support scopes (see [#4300](https://github.com/go-gitea/gitea/issues/4300)) and all third party applications will be granted access to all resources of the user and their organizations. ## Example **Note:** This example does not use PKCE. -1. Redirect to user to the authorization endpoint in order to get his/her consent for accessing the resources: +1. Redirect to user to the authorization endpoint in order to get their consent for accessing the resources: ```curl https://[YOUR-GITEA-URL]/login/oauth/authorize?client_id=CLIENT_ID&redirect_uri=REDIRECT_URI& response_type=code&state=STATE diff --git a/docs/content/doc/developers/oauth2-provider.zh-tw.md b/docs/content/doc/developers/oauth2-provider.zh-tw.md index a2013feac..179c6342c 100644 --- a/docs/content/doc/developers/oauth2-provider.zh-tw.md +++ b/docs/content/doc/developers/oauth2-provider.zh-tw.md @@ -46,7 +46,7 @@ Gitea 支援作為 OAuth2 提供者,能讓第三方程式能在使用者同意 **備註:** 此範例未使用 PKCE。 1. 重新導向使用者到 authorization endpoint 以獲得他同意授權存取資源: - + ```curl https://[YOUR-GITEA-URL]/login/oauth/authorize?client_id=CLIENT_ID&redirect_uri=REDIRECT_URI& response_type=code&state=STATE diff --git a/docs/content/doc/help/seek-help.en-us.md b/docs/content/doc/help/seek-help.en-us.md index 8ffa80f15..3ee160f43 100644 --- a/docs/content/doc/help/seek-help.en-us.md +++ b/docs/content/doc/help/seek-help.en-us.md @@ -20,10 +20,26 @@ menu: **NOTE:** When asking for support, it may be a good idea to have the following available so that the person helping has all the info they need: -1. Your `app.ini` (with any sensitive data scrubbed as necessary) -2. The `gitea.log` (and any other appropriate log files for the situation) - * e.g. If the error is related to the database, the `xorm.log` might be helpful -3. Any error messages you are seeing +1. Your `app.ini` (with any sensitive data scrubbed as necessary). +2. The Gitea logs, and any other appropriate log files for the situation. + * The logs are likely to be outputted to console. If you need to collect logs from files, + you could copy the following config into your `app.ini` (remove all other `[log]` sections), + then you can find the `*.log` files in Gitea's log directory (default: `%(GITEA_WORK_DIR)/log`). + ```ini + ; To show all SQL logs, you can also set LOG_SQL=true in the [database] section + [log] + LEVEL=debug + MODE=console,file + ROUTER=console,file + XORM=console,file + ENABLE_XORM_LOG=true + FILE_NAME=gitea.log + [log.file.router] + FILE_NAME=router.log + [log.file.xorm] + FILE_NAME=xorm.log + ``` +3. Any error messages you are seeing. 4. When possible, try to replicate the issue on [try.gitea.io](https://try.gitea.io) and include steps so that others can reproduce the issue. * This will greatly improve the chance that the root of the issue can be quickly discovered and resolved. 5. If you meet slow/hanging/deadlock problems, please report the stack trace when the problem occurs: diff --git a/docs/content/doc/usage/issue-pull-request-templates.en-us.md b/docs/content/doc/usage/issue-pull-request-templates.en-us.md index 185b895d1..38cbfbf8a 100644 --- a/docs/content/doc/usage/issue-pull-request-templates.en-us.md +++ b/docs/content/doc/usage/issue-pull-request-templates.en-us.md @@ -85,7 +85,7 @@ Possible directory names for issue templates: - `.gitlab/ISSUE_TEMPLATE` - `.gitlab/issue_template` -Inside the directory can be multiple issue templates with the form +Inside the directory can be multiple markdown (`.md`) issue templates of the form ```md --- diff --git a/docs/content/doc/usage/permissions.en-us.md b/docs/content/doc/usage/permissions.en-us.md index 1eea78b55..0c3dc9e09 100644 --- a/docs/content/doc/usage/permissions.en-us.md +++ b/docs/content/doc/usage/permissions.en-us.md @@ -67,7 +67,7 @@ Different from individual repositories, the owner of organization repositories a A team in an organization has unit permissions settings. It can have members and repositories scope. A team could access all the repositories in this organization or special repositories changed by the owner team. A team could also be allowed to create new repositories. -The owner team will be created when the organization created and the creator will become the first member of the owner team. -Notice Gitea will not allow a people is a member of organization but not in any team. The owner team could not be deleted and only -members of owner team could create a new team. Admin team could be created to manage some of repositories, members of admin team -could do anything with these repositories. Generate team could be created by the owner team to do the permissions allowed operations. +The owner team will be created when the organization is created, and the creator will become the first member of the owner team. +Every member of an organization must be in at least one team. The owner team cannot be deleted and only +members of the owner team can create a new team. An admin team can be created to manage some of the repositories, whose members can do anything with these repositories. +The Generate team can be created by the owner team to do the operations allowed by their permissions. diff --git a/docs/content/doc/usage/reverse-proxies.en-us.md b/docs/content/doc/usage/reverse-proxies.en-us.md index 008704cdc..9e903f425 100644 --- a/docs/content/doc/usage/reverse-proxies.en-us.md +++ b/docs/content/doc/usage/reverse-proxies.en-us.md @@ -88,8 +88,8 @@ server { listen 80; server_name git.example.com; - location /_/static/assets { - alias /path/to/gitea/public; + location /_/static/assets/ { + alias /path/to/gitea/public/; } location / { @@ -120,8 +120,8 @@ server { listen 80; server_name cdn.example.com; - location /gitea { - alias /path/to/gitea/public; + location /gitea/ { + alias /path/to/gitea/public/; } location / { @@ -362,4 +362,4 @@ gitea: - "traefik.http.services.gitea-websecure.loadbalancer.server.port=3000" ``` -This config assumes that you are handling HTTPS on the traefik side and using HTTP between Gitea and traefik. \ No newline at end of file +This config assumes that you are handling HTTPS on the traefik side and using HTTP between Gitea and traefik. diff --git a/integrations/api_activitypub_person_test.go b/integrations/api_activitypub_person_test.go index 4898d5e01..e19da4086 100644 --- a/integrations/api_activitypub_person_test.go +++ b/integrations/api_activitypub_person_test.go @@ -15,18 +15,21 @@ import ( user_model "code.gitea.io/gitea/models/user" "code.gitea.io/gitea/modules/activitypub" "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/routers" ap "github.com/go-ap/activitypub" "github.com/stretchr/testify/assert" ) func TestActivityPubPerson(t *testing.T) { - onGiteaRun(t, func(*testing.T, *url.URL) { - setting.Federation.Enabled = true - defer func() { - setting.Federation.Enabled = false - }() + setting.Federation.Enabled = true + c = routers.NormalRoutes() + defer func() { + setting.Federation.Enabled = false + c = routers.NormalRoutes() + }() + onGiteaRun(t, func(*testing.T, *url.URL) { username := "user2" req := NewRequestf(t, "GET", fmt.Sprintf("/api/v1/activitypub/user/%s", username)) resp := MakeRequest(t, req, http.StatusOK) @@ -56,12 +59,14 @@ func TestActivityPubPerson(t *testing.T) { } func TestActivityPubMissingPerson(t *testing.T) { - onGiteaRun(t, func(*testing.T, *url.URL) { - setting.Federation.Enabled = true - defer func() { - setting.Federation.Enabled = false - }() + setting.Federation.Enabled = true + c = routers.NormalRoutes() + defer func() { + setting.Federation.Enabled = false + c = routers.NormalRoutes() + }() + onGiteaRun(t, func(*testing.T, *url.URL) { req := NewRequestf(t, "GET", "/api/v1/activitypub/user/nonexistentuser") resp := MakeRequest(t, req, http.StatusNotFound) assert.Contains(t, resp.Body.String(), "user redirect does not exist") @@ -69,15 +74,20 @@ func TestActivityPubMissingPerson(t *testing.T) { } func TestActivityPubPersonInbox(t *testing.T) { + setting.Federation.Enabled = true + c = routers.NormalRoutes() + defer func() { + setting.Federation.Enabled = false + c = routers.NormalRoutes() + }() + srv := httptest.NewServer(c) defer srv.Close() onGiteaRun(t, func(*testing.T, *url.URL) { appURL := setting.AppURL - setting.Federation.Enabled = true setting.AppURL = srv.URL defer func() { - setting.Federation.Enabled = false setting.Database.LogSQL = false setting.AppURL = appURL }() diff --git a/integrations/api_issue_stopwatch_test.go b/integrations/api_issue_stopwatch_test.go index 0d0644718..b4e5f9054 100644 --- a/integrations/api_issue_stopwatch_test.go +++ b/integrations/api_issue_stopwatch_test.go @@ -38,7 +38,7 @@ func TestAPIListStopWatches(t *testing.T) { assert.EqualValues(t, issue.Title, apiWatches[0].IssueTitle) assert.EqualValues(t, repo.Name, apiWatches[0].RepoName) assert.EqualValues(t, repo.OwnerName, apiWatches[0].RepoOwnerName) - assert.Greater(t, int64(apiWatches[0].Seconds), int64(0)) + assert.Greater(t, apiWatches[0].Seconds, int64(0)) } } diff --git a/integrations/api_nodeinfo_test.go b/integrations/api_nodeinfo_test.go index c2fcd2fea..cf9ff4da1 100644 --- a/integrations/api_nodeinfo_test.go +++ b/integrations/api_nodeinfo_test.go @@ -11,17 +11,20 @@ import ( "code.gitea.io/gitea/modules/setting" api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/routers" "github.com/stretchr/testify/assert" ) func TestNodeinfo(t *testing.T) { - onGiteaRun(t, func(*testing.T, *url.URL) { - setting.Federation.Enabled = true - defer func() { - setting.Federation.Enabled = false - }() + setting.Federation.Enabled = true + c = routers.NormalRoutes() + defer func() { + setting.Federation.Enabled = false + c = routers.NormalRoutes() + }() + onGiteaRun(t, func(*testing.T, *url.URL) { req := NewRequestf(t, "GET", "/api/v1/nodeinfo") resp := MakeRequest(t, req, http.StatusOK) var nodeinfo api.NodeInfo diff --git a/integrations/api_packages_container_test.go b/integrations/api_packages_container_test.go index 2b5be9dd4..1ed80dfd0 100644 --- a/integrations/api_packages_container_test.go +++ b/integrations/api_packages_container_test.go @@ -88,7 +88,7 @@ func TestPackageContainer(t *testing.T) { req = NewRequest(t, "GET", fmt.Sprintf("%sv2", setting.AppURL)) addTokenAuthHeader(req, anonymousToken) - resp = MakeRequest(t, req, http.StatusOK) + MakeRequest(t, req, http.StatusOK) }) t.Run("User", func(t *testing.T) { @@ -112,7 +112,7 @@ func TestPackageContainer(t *testing.T) { req = NewRequest(t, "GET", fmt.Sprintf("%sv2", setting.AppURL)) addTokenAuthHeader(req, userToken) - resp = MakeRequest(t, req, http.StatusOK) + MakeRequest(t, req, http.StatusOK) }) }) diff --git a/integrations/editor_test.go b/integrations/editor_test.go index 3ed0e510c..c6c5ab2f6 100644 --- a/integrations/editor_test.go +++ b/integrations/editor_test.go @@ -82,7 +82,7 @@ func TestCreateFileOnProtectedBranch(t *testing.T) { "_csrf": csrf, "protected": "off", }) - resp = session.MakeRequest(t, req, http.StatusSeeOther) + session.MakeRequest(t, req, http.StatusSeeOther) // Check if master branch has been locked successfully flashCookie = session.GetCookie("macaron_flash") assert.NotNil(t, flashCookie) @@ -109,7 +109,7 @@ func testEditFile(t *testing.T, session *TestSession, user, repo, branch, filePa "commit_choice": "direct", }, ) - resp = session.MakeRequest(t, req, http.StatusSeeOther) + session.MakeRequest(t, req, http.StatusSeeOther) // Verify the change req = NewRequest(t, "GET", path.Join(user, repo, "raw/branch", branch, filePath)) @@ -139,7 +139,7 @@ func testEditFileToNewBranch(t *testing.T, session *TestSession, user, repo, bra "new_branch_name": targetBranch, }, ) - resp = session.MakeRequest(t, req, http.StatusSeeOther) + session.MakeRequest(t, req, http.StatusSeeOther) // Verify the change req = NewRequest(t, "GET", path.Join(user, repo, "raw/branch", targetBranch, filePath)) diff --git a/integrations/git_test.go b/integrations/git_test.go index a3ba7b7aa..d6bd67382 100644 --- a/integrations/git_test.go +++ b/integrations/git_test.go @@ -150,7 +150,7 @@ func standardCommitAndPushTest(t *testing.T, dstPath string) (little, big string defer PrintCurrentTest(t)() little, big = commitAndPushTest(t, dstPath, "data-file-") }) - return + return little, big } func lfsCommitAndPushTest(t *testing.T, dstPath string) (littleLFS, bigLFS string) { @@ -191,7 +191,7 @@ func lfsCommitAndPushTest(t *testing.T, dstPath string) (littleLFS, bigLFS strin lockTest(t, dstPath) }) }) - return + return littleLFS, bigLFS } func commitAndPushTest(t *testing.T, dstPath, prefix string) (little, big string) { @@ -210,7 +210,7 @@ func commitAndPushTest(t *testing.T, dstPath, prefix string) (little, big string big = doCommitAndPush(t, bigSize, dstPath, prefix) }) }) - return + return little, big } func rawTest(t *testing.T, ctx *APITestContext, little, big, littleLFS, bigLFS string) { diff --git a/integrations/integration_test.go b/integrations/integration_test.go index b0004927f..8a43de7c4 100644 --- a/integrations/integration_test.go +++ b/integrations/integration_test.go @@ -438,7 +438,7 @@ func getTokenForLoggedInUser(t testing.TB, session *TestSession) string { "_csrf": doc.GetCSRF(), "name": fmt.Sprintf("api-testing-token-%d", tokenCounter), }) - resp = session.MakeRequest(t, req, http.StatusSeeOther) + session.MakeRequest(t, req, http.StatusSeeOther) req = NewRequest(t, "GET", "/user/settings/applications") resp = session.MakeRequest(t, req, http.StatusOK) htmlDoc := NewHTMLParser(t, resp.Body) diff --git a/integrations/mssql.ini.tmpl b/integrations/mssql.ini.tmpl index da15e9ef6..d4d151701 100644 --- a/integrations/mssql.ini.tmpl +++ b/integrations/mssql.ini.tmpl @@ -10,11 +10,13 @@ PASSWD = {{TEST_MSSQL_PASSWORD}} SSL_MODE = disable [indexer] -ISSUE_INDEXER_PATH = integrations/gitea-integration-mssql/indexers/issues.bleve -ISSUE_INDEXER_QUEUE_DIR = integrations/gitea-integration-mssql/indexers/issues.queue REPO_INDEXER_ENABLED = true REPO_INDEXER_PATH = integrations/gitea-integration-mssql/indexers/repos.bleve +[queue.issue_indexer] +PATH = integrations/gitea-integration-mssql/indexers/issues.bleve +DATADIR = integrations/gitea-integration-mssql/indexers/issues.queue + [queue] TYPE = immediate diff --git a/integrations/mysql.ini.tmpl b/integrations/mysql.ini.tmpl index 4df493364..8f610326e 100644 --- a/integrations/mysql.ini.tmpl +++ b/integrations/mysql.ini.tmpl @@ -10,12 +10,14 @@ PASSWD = {{TEST_MYSQL_PASSWORD}} SSL_MODE = disable [indexer] -ISSUE_INDEXER_TYPE = elasticsearch -ISSUE_INDEXER_CONN_STR = http://elastic:changeme@elasticsearch:9200 -ISSUE_INDEXER_QUEUE_DIR = integrations/gitea-integration-mysql/indexers/issues.queue REPO_INDEXER_ENABLED = true REPO_INDEXER_PATH = integrations/gitea-integration-mysql/indexers/repos.bleve +[queue.issue_indexer] +TYPE = elasticsearch +CONN_STR = http://elastic:changeme@elasticsearch:9200 +DATADIR = integrations/gitea-integration-mysql/indexers/issues.queue + [queue] TYPE = immediate diff --git a/integrations/mysql8.ini.tmpl b/integrations/mysql8.ini.tmpl index 4b63dd51a..513305823 100644 --- a/integrations/mysql8.ini.tmpl +++ b/integrations/mysql8.ini.tmpl @@ -10,11 +10,13 @@ PASSWD = {{TEST_MYSQL8_PASSWORD}} SSL_MODE = disable [indexer] -ISSUE_INDEXER_PATH = integrations/gitea-integration-mysql8/indexers/issues.bleve -ISSUE_INDEXER_QUEUE_DIR = integrations/gitea-integration-mysql8/indexers/issues.queue REPO_INDEXER_ENABLED = true REPO_INDEXER_PATH = integrations/gitea-integration-mysql8/indexers/repos.bleve +[queue.issue_indexer] +PATH = integrations/gitea-integration-mysql8/indexers/issues.bleve +DATADIR = integrations/gitea-integration-mysql8/indexers/issues.queue + [queue] TYPE = immediate diff --git a/integrations/nonascii_branches_test.go b/integrations/nonascii_branches_test.go index 5ab7b8526..038ada8ca 100644 --- a/integrations/nonascii_branches_test.go +++ b/integrations/nonascii_branches_test.go @@ -26,7 +26,7 @@ func testSrcRouteRedirect(t *testing.T, session *TestSession, user, repo, route, // Perform redirect req = NewRequest(t, "GET", location) - resp = session.MakeRequest(t, req, expectedStatus) + session.MakeRequest(t, req, expectedStatus) } func setDefaultBranch(t *testing.T, session *TestSession, user, repo, branch string) { diff --git a/integrations/oauth_test.go b/integrations/oauth_test.go index 678dfbae2..c16bb4e24 100644 --- a/integrations/oauth_test.go +++ b/integrations/oauth_test.go @@ -197,7 +197,7 @@ func TestAccessTokenExchangeWithBasicAuth(t *testing.T) { "code_verifier": "N1Zo9-8Rfwhkt68r1r29ty8YwIraXR8eh_1Qwxg7yQXsonBt", // test PKCE additionally }) req.Header.Add("Authorization", "Basic ZGE3ZGEzYmEtOWExMy00MTY3LTg1NmYtMzg5OWRlMGIwMTM4OmJsYWJsYQ==") - resp = MakeRequest(t, req, http.StatusBadRequest) + MakeRequest(t, req, http.StatusBadRequest) // missing header req = NewRequestWithValues(t, "POST", "/login/oauth/access_token", map[string]string{ @@ -206,7 +206,7 @@ func TestAccessTokenExchangeWithBasicAuth(t *testing.T) { "code": "authcode", "code_verifier": "N1Zo9-8Rfwhkt68r1r29ty8YwIraXR8eh_1Qwxg7yQXsonBt", // test PKCE additionally }) - resp = MakeRequest(t, req, http.StatusBadRequest) + MakeRequest(t, req, http.StatusBadRequest) } func TestRefreshTokenInvalidation(t *testing.T) { diff --git a/integrations/pgsql.ini.tmpl b/integrations/pgsql.ini.tmpl index 5b54a02c9..15cd6a057 100644 --- a/integrations/pgsql.ini.tmpl +++ b/integrations/pgsql.ini.tmpl @@ -11,11 +11,13 @@ SCHEMA = {{TEST_PGSQL_SCHEMA}} SSL_MODE = disable [indexer] -ISSUE_INDEXER_PATH = integrations/gitea-integration-pgsql/indexers/issues.bleve -ISSUE_INDEXER_QUEUE_DIR = integrations/gitea-integration-pgsql/indexers/issues.queue REPO_INDEXER_ENABLED = true REPO_INDEXER_PATH = integrations/gitea-integration-pgsql/indexers/repos.bleve +[queue.issue_indexer] +PATH = integrations/gitea-integration-pgsql/indexers/issues.bleve +DATADIR = integrations/gitea-integration-pgsql/indexers/issues.queue + [queue] TYPE = immediate diff --git a/integrations/repo_fork_test.go b/integrations/repo_fork_test.go index d701850f1..5f28e66ac 100644 --- a/integrations/repo_fork_test.go +++ b/integrations/repo_fork_test.go @@ -45,7 +45,7 @@ func testRepoFork(t *testing.T, session *TestSession, ownerName, repoName, forkO "uid": fmt.Sprintf("%d", forkOwner.ID), "repo_name": forkRepoName, }) - resp = session.MakeRequest(t, req, http.StatusSeeOther) + session.MakeRequest(t, req, http.StatusSeeOther) // Step4: check the existence of the forked repo req = NewRequestf(t, "GET", "/%s/%s", forkOwnerName, forkRepoName) diff --git a/integrations/repo_generate_test.go b/integrations/repo_generate_test.go index 4fbbb56c5..0123932a7 100644 --- a/integrations/repo_generate_test.go +++ b/integrations/repo_generate_test.go @@ -46,7 +46,7 @@ func testRepoGenerate(t *testing.T, session *TestSession, templateOwnerName, tem "repo_name": generateRepoName, "git_content": "true", }) - resp = session.MakeRequest(t, req, http.StatusSeeOther) + session.MakeRequest(t, req, http.StatusSeeOther) // Step4: check the existence of the generated repo req = NewRequestf(t, "GET", "/%s/%s", generateOwnerName, generateRepoName) diff --git a/integrations/sqlite.ini.tmpl b/integrations/sqlite.ini.tmpl index 2da7fd65d..fa57e1aa9 100644 --- a/integrations/sqlite.ini.tmpl +++ b/integrations/sqlite.ini.tmpl @@ -6,11 +6,13 @@ DB_TYPE = sqlite3 PATH = integrations/gitea-integration-sqlite/gitea.db [indexer] -ISSUE_INDEXER_PATH = integrations/gitea-integration-sqlite/indexers/issues.bleve -ISSUE_INDEXER_QUEUE_DIR = integrations/gitea-integration-sqlite/indexers/issues.queue REPO_INDEXER_ENABLED = true REPO_INDEXER_PATH = integrations/gitea-integration-sqlite/indexers/repos.bleve +[queue.issue_indexer] +PATH = integrations/gitea-integration-sqlite/indexers/issues.bleve +DATADIR = integrations/gitea-integration-sqlite/indexers/issues.queue + [queue] TYPE = immediate diff --git a/integrations/user_test.go b/integrations/user_test.go index 6a3d30472..41127a4e4 100644 --- a/integrations/user_test.go +++ b/integrations/user_test.go @@ -245,6 +245,6 @@ func TestListStopWatches(t *testing.T) { assert.EqualValues(t, issue.Title, apiWatches[0].IssueTitle) assert.EqualValues(t, repo.Name, apiWatches[0].RepoName) assert.EqualValues(t, repo.OwnerName, apiWatches[0].RepoOwnerName) - assert.Greater(t, int64(apiWatches[0].Seconds), int64(0)) + assert.Greater(t, apiWatches[0].Seconds, int64(0)) } } diff --git a/models/action.go b/models/action.go index 78cc93e1a..791759f7e 100644 --- a/models/action.go +++ b/models/action.go @@ -459,7 +459,7 @@ func DeleteOldActions(olderThan time.Duration) (err error) { } _, err = db.GetEngine(db.DefaultContext).Where("created_unix < ?", time.Now().Add(-olderThan).Unix()).Delete(&Action{}) - return + return err } func notifyWatchers(ctx context.Context, actions ...*Action) error { diff --git a/models/admin/notice.go b/models/admin/notice.go index 77277e4b2..4d385cf95 100644 --- a/models/admin/notice.go +++ b/models/admin/notice.go @@ -142,5 +142,5 @@ func DeleteOldSystemNotices(olderThan time.Duration) (err error) { } _, err = db.GetEngine(db.DefaultContext).Where("created_unix < ?", time.Now().Add(-olderThan).Unix()).Delete(&Notice{}) - return + return err } diff --git a/models/asymkey/gpg_key_commit_verification.go b/models/asymkey/gpg_key_commit_verification.go index 2f6686309..d5b06f83f 100644 --- a/models/asymkey/gpg_key_commit_verification.go +++ b/models/asymkey/gpg_key_commit_verification.go @@ -520,5 +520,5 @@ func CalculateTrustStatus(verification *CommitVerification, repoTrustModel repo_ } } - return + return err } diff --git a/models/asymkey/ssh_key_test.go b/models/asymkey/ssh_key_test.go index 71c8860f1..adffedd0b 100644 --- a/models/asymkey/ssh_key_test.go +++ b/models/asymkey/ssh_key_test.go @@ -317,7 +317,7 @@ func TestFromOpenSSH(t *testing.T) { td := t.TempDir() data := []byte("hello, ssh world") - dataPath := write(t, []byte(data), td, "data") + dataPath := write(t, data, td, "data") privPath := write(t, []byte(tt.priv), td, "id") write(t, []byte(tt.pub), td, "id.pub") @@ -372,14 +372,14 @@ func TestToOpenSSH(t *testing.T) { td := t.TempDir() data := []byte("hello, ssh world") - write(t, []byte(data), td, "data") + write(t, data, td, "data") armored, err := sshsig.Sign([]byte(tt.priv), bytes.NewReader(data), "file") if err != nil { t.Fatal(err) } - sigPath := write(t, []byte(armored), td, "oursig") + sigPath := write(t, armored, td, "oursig") // Create an allowed_signers file with two keys to check against. allowedSigner := "test@rekor.dev " + tt.pub + "\n" diff --git a/models/auth/oauth2.go b/models/auth/oauth2.go index c5c6e9112..5a58ec62b 100644 --- a/models/auth/oauth2.go +++ b/models/auth/oauth2.go @@ -123,7 +123,7 @@ func GetOAuth2ApplicationByClientID(ctx context.Context, clientID string) (app * if !has { return nil, ErrOAuthClientIDInvalid{ClientID: clientID} } - return + return app, err } // GetOAuth2ApplicationByID returns the oauth2 application with the given id. Returns an error if not found. @@ -143,7 +143,7 @@ func GetOAuth2ApplicationByID(ctx context.Context, id int64) (app *OAuth2Applica func GetOAuth2ApplicationsByUserID(ctx context.Context, userID int64) (apps []*OAuth2Application, err error) { apps = make([]*OAuth2Application, 0) err = db.GetEngine(ctx).Where("uid = ?", userID).Find(&apps) - return + return apps, err } // CreateOAuth2ApplicationOptions holds options to create an oauth2 application @@ -300,7 +300,7 @@ func (code *OAuth2AuthorizationCode) GenerateRedirectURI(state string) (redirect } q.Set("code", code.Code) redirect.RawQuery = q.Encode() - return + return redirect, err } // Invalidate deletes the auth code from the database to invalidate this code @@ -430,7 +430,7 @@ func GetOAuth2GrantByID(ctx context.Context, id int64) (grant *OAuth2Grant, err } else if !has { return nil, nil } - return + return grant, err } // GetOAuth2GrantsByUserID lists all grants of a certain user diff --git a/models/db/context.go b/models/db/context.go index c41d76180..783033c0e 100644 --- a/models/db/context.go +++ b/models/db/context.go @@ -23,23 +23,30 @@ type contextKey struct { name string } -// EnginedContextKey is a context key. It is used with context.Value() to get the current Engined for the context -var EnginedContextKey = &contextKey{"engined"} +// enginedContextKey is a context key. It is used with context.Value() to get the current Engined for the context +var enginedContextKey = &contextKey{"engined"} +var _ Engined = &Context{} // Context represents a db context type Context struct { context.Context - e Engine + e Engine + transaction bool } -// WithEngine returns a Context from a context.Context and Engine -func WithEngine(ctx context.Context, e Engine) *Context { +func newContext(ctx context.Context, e Engine, transaction bool) *Context { return &Context{ - Context: ctx, - e: e.Context(ctx), + Context: ctx, + e: e, + transaction: transaction, } } +// InTransaction if context is in a transaction +func (ctx *Context) InTransaction() bool { + return ctx.transaction +} + // Engine returns db engine func (ctx *Context) Engine() Engine { return ctx.e @@ -47,7 +54,7 @@ func (ctx *Context) Engine() Engine { // Value shadows Value for context.Context but allows us to get ourselves and an Engined object func (ctx *Context) Value(key interface{}) interface{} { - if key == EnginedContextKey { + if key == enginedContextKey { return ctx } return ctx.Context.Value(key) @@ -55,7 +62,7 @@ func (ctx *Context) Value(key interface{}) interface{} { // WithContext returns this engine tied to this context func (ctx *Context) WithContext(other context.Context) *Context { - return WithEngine(other, ctx.e) + return newContext(ctx, ctx.e.Context(other), ctx.transaction) } // Engined structs provide an Engine @@ -68,7 +75,7 @@ func GetEngine(ctx context.Context) Engine { if engined, ok := ctx.(Engined); ok { return engined.Engine() } - enginedInterface := ctx.Value(EnginedContextKey) + enginedInterface := ctx.Value(enginedContextKey) if enginedInterface != nil { return enginedInterface.(Engined).Engine() } @@ -89,18 +96,7 @@ func TxContext() (*Context, Committer, error) { return nil, nil, err } - return &Context{ - Context: DefaultContext, - e: sess, - }, sess, nil -} - -// WithContext represents executing database operations -func WithContext(f func(ctx *Context) error) error { - return f(&Context{ - Context: DefaultContext, - e: x, - }) + return newContext(DefaultContext, sess, true), sess, nil } // WithTx represents executing database operations on a transaction @@ -118,10 +114,7 @@ func WithTx(f func(ctx context.Context) error, stdCtx ...context.Context) error return err } - if err := f(&Context{ - Context: parentCtx, - e: sess, - }); err != nil { + if err := f(newContext(parentCtx, sess, true)); err != nil { return err } diff --git a/models/db/engine.go b/models/db/engine.go index 8a3b4b206..2c329300e 100755 --- a/models/db/engine.go +++ b/models/db/engine.go @@ -285,5 +285,14 @@ func DeleteAllRecords(tableName string) error { // GetMaxID will return max id of the table func GetMaxID(beanOrTableName interface{}) (maxID int64, err error) { _, err = x.Select("MAX(id)").Table(beanOrTableName).Get(&maxID) - return + return maxID, err +} + +func SetLogSQL(ctx context.Context, on bool) { + e := GetEngine(ctx) + if x, ok := e.(*xorm.Engine); ok { + x.ShowSQL(on) + } else if sess, ok := e.(*xorm.Session); ok { + sess.Engine().ShowSQL(on) + } } diff --git a/models/db/index.go b/models/db/index.go index 9b164db1f..673c382b2 100644 --- a/models/db/index.go +++ b/models/db/index.go @@ -44,7 +44,7 @@ func UpsertResourceIndex(ctx context.Context, tableName string, groupID int64) ( default: return fmt.Errorf("database type not supported") } - return + return err } var ( diff --git a/models/db/list_options.go b/models/db/list_options.go index d1d52b666..54f6d945c 100644 --- a/models/db/list_options.go +++ b/models/db/list_options.go @@ -58,7 +58,7 @@ func (opts *ListOptions) GetSkipTake() (skip, take int) { func (opts *ListOptions) GetStartEnd() (start, end int) { start, take := opts.GetSkipTake() end = start + take - return + return start, end } // SetDefaultValues sets default values diff --git a/models/db/log.go b/models/db/log.go index f9febf440..4c497fdfd 100644 --- a/models/db/log.go +++ b/models/db/log.go @@ -6,6 +6,7 @@ package db import ( "fmt" + "sync/atomic" "code.gitea.io/gitea/modules/log" @@ -14,15 +15,19 @@ import ( // XORMLogBridge a logger bridge from Logger to xorm type XORMLogBridge struct { - showSQL bool - logger log.Logger + showSQLint *int32 + logger log.Logger } // NewXORMLogger inits a log bridge for xorm func NewXORMLogger(showSQL bool) xormlog.Logger { + showSQLint := int32(0) + if showSQL { + showSQLint = 1 + } return &XORMLogBridge{ - showSQL: showSQL, - logger: log.GetLogger("xorm"), + showSQLint: &showSQLint, + logger: log.GetLogger("xorm"), } } @@ -94,14 +99,16 @@ func (l *XORMLogBridge) SetLevel(lvl xormlog.LogLevel) { // ShowSQL set if record SQL func (l *XORMLogBridge) ShowSQL(show ...bool) { - if len(show) > 0 { - l.showSQL = show[0] - } else { - l.showSQL = true + showSQL := int32(1) + if len(show) > 0 && !show[0] { + showSQL = 0 } + atomic.StoreInt32(l.showSQLint, showSQL) } // IsShowSQL if record SQL func (l *XORMLogBridge) IsShowSQL() bool { - return l.showSQL + showSQL := atomic.LoadInt32(l.showSQLint) + + return showSQL == 1 } diff --git a/models/db/sql_postgres_with_schema.go b/models/db/sql_postgres_with_schema.go index d6b626292..4bbd12bde 100644 --- a/models/db/sql_postgres_with_schema.go +++ b/models/db/sql_postgres_with_schema.go @@ -44,7 +44,7 @@ func (d *postgresSchemaDriver) Open(name string) (driver.Conn, error) { _, err := execer.Exec(`SELECT set_config( 'search_path', $1 || ',' || current_setting('search_path'), - false)`, []driver.Value{schemaValue}) //nolint + false)`, []driver.Value{schemaValue}) if err != nil { _ = conn.Close() return nil, err diff --git a/models/git/branches.go b/models/git/branches.go index 0a44c0a68..7f05a5667 100644 --- a/models/git/branches.go +++ b/models/git/branches.go @@ -363,7 +363,7 @@ func updateApprovalWhitelist(ctx context.Context, repo *repo_model.Repository, c whitelist = append(whitelist, userID) } - return + return whitelist, err } // updateUserWhitelist checks whether the user whitelist changed and returns a whitelist with @@ -392,7 +392,7 @@ func updateUserWhitelist(ctx context.Context, repo *repo_model.Repository, curre whitelist = append(whitelist, userID) } - return + return whitelist, err } // updateTeamWhitelist checks whether the team whitelist changed and returns a whitelist with @@ -415,7 +415,7 @@ func updateTeamWhitelist(ctx context.Context, repo *repo_model.Repository, curre } } - return + return whitelist, err } // DeleteProtectedBranch removes ProtectedBranch relation between the user and repository. @@ -539,7 +539,7 @@ func FindRenamedBranch(repoID int64, from string) (branch *RenamedBranch, exist } exist, err = db.GetEngine(db.DefaultContext).Get(branch) - return + return branch, exist, err } // RenameBranch rename a branch diff --git a/models/git/commit_status.go b/models/git/commit_status.go index 54a7b4319..9e2422186 100644 --- a/models/git/commit_status.go +++ b/models/git/commit_status.go @@ -74,7 +74,7 @@ func upsertCommitStatusIndex(ctx context.Context, repoID int64, sha string) (err default: return fmt.Errorf("database type not supported") } - return + return err } // GetNextCommitStatusIndex retried 3 times to generate a resource index diff --git a/models/issues/assignees.go b/models/issues/assignees.go index 5921112fe..7f589f5d7 100644 --- a/models/issues/assignees.go +++ b/models/issues/assignees.go @@ -42,7 +42,7 @@ func (issue *Issue) LoadAssignees(ctx context.Context) (err error) { if len(issue.Assignees) > 0 { issue.Assignee = issue.Assignees[0] } - return + return err } // GetAssigneeIDsByIssue returns the IDs of users assigned to an issue @@ -167,5 +167,5 @@ func MakeIDsFromAPIAssigneesToAdd(oneAssignee string, multipleAssignees []string // Get the IDs of all assignees assigneeIDs, err = user_model.GetUserIDsByNames(requestAssignees, false) - return + return assigneeIDs, err } diff --git a/models/issues/comment.go b/models/issues/comment.go index a4e69e711..a71afda9e 100644 --- a/models/issues/comment.go +++ b/models/issues/comment.go @@ -315,7 +315,7 @@ func (c *Comment) LoadIssueCtx(ctx context.Context) (err error) { return nil } c.Issue, err = GetIssueByID(ctx, c.IssueID) - return + return err } // BeforeInsert will be invoked by XORM before inserting a record @@ -627,7 +627,7 @@ func (c *Comment) LoadResolveDoer() (err error) { err = nil } } - return + return err } // IsResolved check if an code comment is resolved @@ -955,7 +955,7 @@ func createIssueDependencyComment(ctx context.Context, doer *user_model.User, is DependentIssueID: issue.ID, } _, err = CreateCommentCtx(ctx, opts) - return + return err } // CreateCommentOptions defines options for creating comment @@ -1350,7 +1350,7 @@ func CreatePushPullComment(ctx context.Context, pusher *user_model.User, pr *Pul comment, err = CreateComment(ops) - return + return comment, err } // CreateAutoMergeComment is a internal function, only use it for CommentTypePRScheduledToAutoMerge and CommentTypePRUnScheduledToAutoMerge CommentTypes @@ -1372,7 +1372,7 @@ func CreateAutoMergeComment(ctx context.Context, typ CommentType, pr *PullReques Repo: pr.BaseRepo, Issue: pr.Issue, }) - return + return comment, err } // getCommitsFromRepo get commit IDs from repo in between oldCommitID and newCommitID @@ -1434,7 +1434,7 @@ func getCommitIDsFromRepo(ctx context.Context, repo *repo_model.Repository, oldC } } - return + return commitIDs, isForcePush, err } type commitBranchCheckItem struct { diff --git a/models/issues/issue.go b/models/issues/issue.go index 76a0ea7d0..064f0d22a 100644 --- a/models/issues/issue.go +++ b/models/issues/issue.go @@ -223,7 +223,7 @@ func (issue *Issue) GetPullRequest() (pr *PullRequest, err error) { return nil, err } pr.Issue = issue - return + return pr, err } // LoadLabels loads labels @@ -255,7 +255,7 @@ func (issue *Issue) loadPoster(ctx context.Context) (err error) { return } } - return + return err } func (issue *Issue) loadPullRequest(ctx context.Context) (err error) { @@ -311,7 +311,7 @@ func (issue *Issue) loadReactions(ctx context.Context) (err error) { return err } // Load reaction user data - if _, err := ReactionList(reactions).LoadUsers(ctx, issue.Repo); err != nil { + if _, err := reactions.LoadUsers(ctx, issue.Repo); err != nil { return err } @@ -2110,7 +2110,7 @@ func updateIssueClosedNum(ctx context.Context, issue *Issue) (err error) { } else { err = repo_model.StatsCorrectNumClosed(ctx, issue.RepoID, false, "num_closed_issues") } - return + return err } // FindAndUpdateIssueMentions finds users mentioned in the given content string, and saves them in the database. @@ -2123,7 +2123,7 @@ func FindAndUpdateIssueMentions(ctx context.Context, issue *Issue, doer *user_mo if err = UpdateIssueMentions(ctx, issue.ID, mentions); err != nil { return nil, fmt.Errorf("UpdateIssueMentions [%d]: %v", issue.ID, err) } - return + return mentions, err } // ResolveIssueMentionsByVisibility returns the users mentioned in an issue, removing those that @@ -2257,7 +2257,7 @@ func ResolveIssueMentionsByVisibility(ctx context.Context, issue *Issue, doer *u users = append(users, user) } - return + return users, err } // UpdateIssuesMigrationsByType updates all migrated repositories' issues from gitServiceType to replace originalAuthorID to posterID @@ -2380,7 +2380,7 @@ func DeleteIssuesByRepoID(ctx context.Context, repoID int64) (attachmentPaths [] return } - return + return attachmentPaths, err } // RemapExternalUser ExternalUserRemappable interface diff --git a/models/issues/issue_project.go b/models/issues/issue_project.go index 5e0a337f7..b83665c2b 100644 --- a/models/issues/issue_project.go +++ b/models/issues/issue_project.go @@ -14,32 +14,32 @@ import ( ) // LoadProject load the project the issue was assigned to -func (i *Issue) LoadProject() (err error) { - return i.loadProject(db.DefaultContext) +func (issue *Issue) LoadProject() (err error) { + return issue.loadProject(db.DefaultContext) } -func (i *Issue) loadProject(ctx context.Context) (err error) { - if i.Project == nil { +func (issue *Issue) loadProject(ctx context.Context) (err error) { + if issue.Project == nil { var p project_model.Project if _, err = db.GetEngine(ctx).Table("project"). Join("INNER", "project_issue", "project.id=project_issue.project_id"). - Where("project_issue.issue_id = ?", i.ID). + Where("project_issue.issue_id = ?", issue.ID). Get(&p); err != nil { return err } - i.Project = &p + issue.Project = &p } - return + return err } // ProjectID return project id if issue was assigned to one -func (i *Issue) ProjectID() int64 { - return i.projectID(db.DefaultContext) +func (issue *Issue) ProjectID() int64 { + return issue.projectID(db.DefaultContext) } -func (i *Issue) projectID(ctx context.Context) int64 { +func (issue *Issue) projectID(ctx context.Context) int64 { var ip project_model.ProjectIssue - has, err := db.GetEngine(ctx).Where("issue_id=?", i.ID).Get(&ip) + has, err := db.GetEngine(ctx).Where("issue_id=?", issue.ID).Get(&ip) if err != nil || !has { return 0 } @@ -47,13 +47,13 @@ func (i *Issue) projectID(ctx context.Context) int64 { } // ProjectBoardID return project board id if issue was assigned to one -func (i *Issue) ProjectBoardID() int64 { - return i.projectBoardID(db.DefaultContext) +func (issue *Issue) ProjectBoardID() int64 { + return issue.projectBoardID(db.DefaultContext) } -func (i *Issue) projectBoardID(ctx context.Context) int64 { +func (issue *Issue) projectBoardID(ctx context.Context) int64 { var ip project_model.ProjectIssue - has, err := db.GetEngine(ctx).Where("issue_id=?", i.ID).Get(&ip) + has, err := db.GetEngine(ctx).Where("issue_id=?", issue.ID).Get(&ip) if err != nil || !has { return 0 } diff --git a/models/issues/issue_watch.go b/models/issues/issue_watch.go index bf907aa8f..cb9d7e712 100644 --- a/models/issues/issue_watch.go +++ b/models/issues/issue_watch.go @@ -65,7 +65,7 @@ func GetIssueWatch(ctx context.Context, userID, issueID int64) (iw *IssueWatch, Where("user_id = ?", userID). And("issue_id = ?", issueID). Get(iw) - return + return iw, exists, err } // CheckIssueWatch check if an user is watching an issue diff --git a/models/issues/issue_xref.go b/models/issues/issue_xref.go index f4380a02e..6de91058e 100644 --- a/models/issues/issue_xref.go +++ b/models/issues/issue_xref.go @@ -231,46 +231,46 @@ func (issue *Issue) verifyReferencedIssue(stdCtx context.Context, ctx *crossRefe } // AddCrossReferences add cross references -func (comment *Comment) AddCrossReferences(stdCtx context.Context, doer *user_model.User, removeOld bool) error { - if comment.Type != CommentTypeCode && comment.Type != CommentTypeComment { +func (c *Comment) AddCrossReferences(stdCtx context.Context, doer *user_model.User, removeOld bool) error { + if c.Type != CommentTypeCode && c.Type != CommentTypeComment { return nil } - if err := comment.LoadIssueCtx(stdCtx); err != nil { + if err := c.LoadIssueCtx(stdCtx); err != nil { return err } ctx := &crossReferencesContext{ Type: CommentTypeCommentRef, Doer: doer, - OrigIssue: comment.Issue, - OrigComment: comment, + OrigIssue: c.Issue, + OrigComment: c, RemoveOld: removeOld, } - return comment.Issue.createCrossReferences(stdCtx, ctx, "", comment.Content) + return c.Issue.createCrossReferences(stdCtx, ctx, "", c.Content) } -func (comment *Comment) neuterCrossReferences(ctx context.Context) error { - return neuterCrossReferences(ctx, comment.IssueID, comment.ID) +func (c *Comment) neuterCrossReferences(ctx context.Context) error { + return neuterCrossReferences(ctx, c.IssueID, c.ID) } // LoadRefComment loads comment that created this reference from database -func (comment *Comment) LoadRefComment() (err error) { - if comment.RefComment != nil { +func (c *Comment) LoadRefComment() (err error) { + if c.RefComment != nil { return nil } - comment.RefComment, err = GetCommentByID(db.DefaultContext, comment.RefCommentID) - return + c.RefComment, err = GetCommentByID(db.DefaultContext, c.RefCommentID) + return err } // LoadRefIssue loads comment that created this reference from database -func (comment *Comment) LoadRefIssue() (err error) { - if comment.RefIssue != nil { +func (c *Comment) LoadRefIssue() (err error) { + if c.RefIssue != nil { return nil } - comment.RefIssue, err = GetIssueByID(db.DefaultContext, comment.RefIssueID) + c.RefIssue, err = GetIssueByID(db.DefaultContext, c.RefIssueID) if err == nil { - err = comment.RefIssue.LoadRepo(db.DefaultContext) + err = c.RefIssue.LoadRepo(db.DefaultContext) } - return + return err } // CommentTypeIsRef returns true if CommentType is a reference from another issue @@ -279,44 +279,44 @@ func CommentTypeIsRef(t CommentType) bool { } // RefCommentHTMLURL returns the HTML URL for the comment that created this reference -func (comment *Comment) RefCommentHTMLURL() string { +func (c *Comment) RefCommentHTMLURL() string { // Edge case for when the reference is inside the title or the description of the referring issue - if comment.RefCommentID == 0 { - return comment.RefIssueHTMLURL() + if c.RefCommentID == 0 { + return c.RefIssueHTMLURL() } - if err := comment.LoadRefComment(); err != nil { // Silently dropping errors :unamused: - log.Error("LoadRefComment(%d): %v", comment.RefCommentID, err) + if err := c.LoadRefComment(); err != nil { // Silently dropping errors :unamused: + log.Error("LoadRefComment(%d): %v", c.RefCommentID, err) return "" } - return comment.RefComment.HTMLURL() + return c.RefComment.HTMLURL() } // RefIssueHTMLURL returns the HTML URL of the issue where this reference was created -func (comment *Comment) RefIssueHTMLURL() string { - if err := comment.LoadRefIssue(); err != nil { // Silently dropping errors :unamused: - log.Error("LoadRefIssue(%d): %v", comment.RefCommentID, err) +func (c *Comment) RefIssueHTMLURL() string { + if err := c.LoadRefIssue(); err != nil { // Silently dropping errors :unamused: + log.Error("LoadRefIssue(%d): %v", c.RefCommentID, err) return "" } - return comment.RefIssue.HTMLURL() + return c.RefIssue.HTMLURL() } // RefIssueTitle returns the title of the issue where this reference was created -func (comment *Comment) RefIssueTitle() string { - if err := comment.LoadRefIssue(); err != nil { // Silently dropping errors :unamused: - log.Error("LoadRefIssue(%d): %v", comment.RefCommentID, err) +func (c *Comment) RefIssueTitle() string { + if err := c.LoadRefIssue(); err != nil { // Silently dropping errors :unamused: + log.Error("LoadRefIssue(%d): %v", c.RefCommentID, err) return "" } - return comment.RefIssue.Title + return c.RefIssue.Title } // RefIssueIdent returns the user friendly identity (e.g. "#1234") of the issue where this reference was created -func (comment *Comment) RefIssueIdent() string { - if err := comment.LoadRefIssue(); err != nil { // Silently dropping errors :unamused: - log.Error("LoadRefIssue(%d): %v", comment.RefCommentID, err) +func (c *Comment) RefIssueIdent() string { + if err := c.LoadRefIssue(); err != nil { // Silently dropping errors :unamused: + log.Error("LoadRefIssue(%d): %v", c.RefCommentID, err) return "" } // FIXME: check this name for cross-repository references (#7901 if it gets merged) - return fmt.Sprintf("#%d", comment.RefIssue.Index) + return fmt.Sprintf("#%d", c.RefIssue.Index) } // __________ .__ .__ __________ __ diff --git a/models/issues/pull.go b/models/issues/pull.go index f2ca19b03..52b959688 100644 --- a/models/issues/pull.go +++ b/models/issues/pull.go @@ -323,7 +323,7 @@ func (pr *PullRequest) LoadProtectedBranchCtx(ctx context.Context) (err error) { } pr.ProtectedBranch, err = git_model.GetProtectedBranchBy(ctx, pr.BaseRepo.ID, pr.BaseBranch) } - return + return err } // ReviewCount represents a count of Reviews diff --git a/models/issues/review.go b/models/issues/review.go index ee65bec3f..1cb99dc33 100644 --- a/models/issues/review.go +++ b/models/issues/review.go @@ -134,7 +134,7 @@ func (r *Review) LoadCodeComments(ctx context.Context) (err error) { return } r.CodeComments, err = fetchCodeCommentsByReview(ctx, r.Issue, nil, r) - return + return err } func (r *Review) loadIssue(ctx context.Context) (err error) { @@ -142,7 +142,7 @@ func (r *Review) loadIssue(ctx context.Context) (err error) { return } r.Issue, err = GetIssueByID(ctx, r.IssueID) - return + return err } func (r *Review) loadReviewer(ctx context.Context) (err error) { @@ -150,7 +150,7 @@ func (r *Review) loadReviewer(ctx context.Context) (err error) { return } r.Reviewer, err = user_model.GetUserByIDCtx(ctx, r.ReviewerID) - return + return err } func (r *Review) loadReviewerTeam(ctx context.Context) (err error) { @@ -159,7 +159,7 @@ func (r *Review) loadReviewerTeam(ctx context.Context) (err error) { } r.ReviewerTeam, err = organization.GetTeamByID(ctx, r.ReviewerTeamID) - return + return err } // LoadReviewer loads reviewer @@ -186,7 +186,7 @@ func (r *Review) LoadAttributes(ctx context.Context) (err error) { if err = r.loadReviewerTeam(ctx); err != nil { return } - return + return err } // GetReviewByID returns the review by the given ID @@ -537,7 +537,7 @@ func GetReviewByIssueIDAndUserID(ctx context.Context, issueID, userID int64) (*R func GetTeamReviewerByIssueIDAndTeamID(ctx context.Context, issueID, teamID int64) (review *Review, err error) { review = new(Review) - has := false + var has bool if has, err = db.GetEngine(ctx).SQL("SELECT * FROM review WHERE id IN (SELECT max(id) as id FROM review WHERE issue_id = ? AND reviewer_team_id = ?)", issueID, teamID). Get(review); err != nil { @@ -548,21 +548,21 @@ func GetTeamReviewerByIssueIDAndTeamID(ctx context.Context, issueID, teamID int6 return nil, ErrReviewNotExist{0} } - return + return review, err } // MarkReviewsAsStale marks existing reviews as stale func MarkReviewsAsStale(issueID int64) (err error) { _, err = db.GetEngine(db.DefaultContext).Exec("UPDATE `review` SET stale=? WHERE issue_id=?", true, issueID) - return + return err } // MarkReviewsAsNotStale marks existing reviews as not stale for a giving commit SHA func MarkReviewsAsNotStale(issueID int64, commitID string) (err error) { _, err = db.GetEngine(db.DefaultContext).Exec("UPDATE `review` SET stale=? WHERE issue_id=? AND commit_id=?", false, issueID, commitID) - return + return err } // DismissReview change the dismiss status of a review @@ -579,7 +579,7 @@ func DismissReview(review *Review, isDismiss bool) (err error) { _, err = db.GetEngine(db.DefaultContext).ID(review.ID).Cols("dismissed").Update(review) - return + return err } // InsertReviews inserts review and review comments diff --git a/models/issues/stopwatch.go b/models/issues/stopwatch.go index e7ac1314e..0a7ad41f9 100644 --- a/models/issues/stopwatch.go +++ b/models/issues/stopwatch.go @@ -63,7 +63,7 @@ func getStopwatch(ctx context.Context, userID, issueID int64) (sw *Stopwatch, ex Where("user_id = ?", userID). And("issue_id = ?", issueID). Get(sw) - return + return sw, exists, err } // UserIDCount is a simple coalition of UserID and Count @@ -130,7 +130,7 @@ func HasUserStopwatch(ctx context.Context, userID int64) (exists bool, sw *Stopw exists, err = db.GetEngine(ctx). Where("user_id = ?", userID). Get(sw) - return + return exists, sw, err } // FinishIssueStopwatchIfPossible if stopwatch exist then finish it otherwise ignore diff --git a/models/issues/tracked_time.go b/models/issues/tracked_time.go index 54179bd3a..9f8767362 100644 --- a/models/issues/tracked_time.go +++ b/models/issues/tracked_time.go @@ -63,7 +63,7 @@ func (t *TrackedTime) loadAttributes(ctx context.Context) (err error) { return } } - return + return err } // LoadAttributes load Issue, User @@ -73,7 +73,7 @@ func (tl TrackedTimeList) LoadAttributes() (err error) { return err } } - return + return err } // FindTrackedTimesOptions represent the filters for tracked times. If an ID is 0 it will be ignored. @@ -130,7 +130,7 @@ func (opts *FindTrackedTimesOptions) toSession(e db.Engine) db.Engine { // GetTrackedTimes returns all tracked times that fit to the given options. func GetTrackedTimes(ctx context.Context, options *FindTrackedTimesOptions) (trackedTimes TrackedTimeList, err error) { err = options.toSession(db.GetEngine(ctx)).Find(&trackedTimes) - return + return trackedTimes, err } // CountTrackedTimes returns count of tracked times that fit to the given options. @@ -291,7 +291,7 @@ func deleteTimes(ctx context.Context, opts FindTrackedTimesOptions) (removedTime } _, err = opts.toSession(db.GetEngine(ctx)).Table("tracked_time").Cols("deleted").Update(&TrackedTime{Deleted: true}) - return + return removedTime, err } func deleteTime(ctx context.Context, t *TrackedTime) error { diff --git a/models/migrations/migrations.go b/models/migrations/migrations.go index c843e33eb..edd4beb45 100644 --- a/models/migrations/migrations.go +++ b/models/migrations/migrations.go @@ -389,6 +389,8 @@ var migrations = []Migration{ NewMigration("allow to view files in PRs", addReviewViewedFiles), // v216 -> v217 NewMigration("Improve Action table indices", improveActionTableIndices), + // v217 -> v218 + NewMigration("Alter hook_task table TEXT fields to LONGTEXT", alterHookTaskTextFieldsToLongText), } // GetCurrentDBVersion returns the current db version diff --git a/models/migrations/v143.go b/models/migrations/v143.go index 93237ebfc..17f3af449 100644 --- a/models/migrations/v143.go +++ b/models/migrations/v143.go @@ -48,5 +48,5 @@ func recalculateStars(x *xorm.Engine) (err error) { log.Debug("recalculate Stars number for all user finished") - return + return err } diff --git a/models/migrations/v154.go b/models/migrations/v154.go index 11407c30e..bb17fb472 100644 --- a/models/migrations/v154.go +++ b/models/migrations/v154.go @@ -30,7 +30,7 @@ func addTimeStamps(x *xorm.Engine) error { return err } - // Follow represents relations of user and his/her followers. + // Follow represents relations of user and their followers. type Follow struct { CreatedUnix timeutil.TimeStamp `xorm:"INDEX created"` } diff --git a/models/migrations/v180.go b/models/migrations/v180.go index 492c91f1b..4468a7107 100644 --- a/models/migrations/v180.go +++ b/models/migrations/v180.go @@ -66,7 +66,7 @@ func deleteMigrationCredentials(x *xorm.Engine) (err error) { return } } - return + return err } func removeCredentials(payload string) (string, error) { diff --git a/models/migrations/v189.go b/models/migrations/v189.go index f136a89b4..823e27e2e 100644 --- a/models/migrations/v189.go +++ b/models/migrations/v189.go @@ -81,7 +81,7 @@ func unwrapLDAPSourceCfg(x *xorm.Engine) error { } err := jsonUnmarshalHandleDoubleEncode([]byte(source.Cfg), &wrapped) if err != nil { - return fmt.Errorf("failed to unmarshal %s: %w", string(source.Cfg), err) + return fmt.Errorf("failed to unmarshal %s: %w", source.Cfg, err) } if wrapped.Source != nil && len(wrapped.Source) > 0 { bs, err := json.Marshal(wrapped.Source) diff --git a/models/migrations/v216.go b/models/migrations/v216.go index b011c11d9..67c360016 100644 --- a/models/migrations/v216.go +++ b/models/migrations/v216.go @@ -42,26 +42,5 @@ func (a *improveActionTableIndicesAction) TableIndices() []*schemas.Index { } func improveActionTableIndices(x *xorm.Engine) error { - { - type Action struct { - ID int64 `xorm:"pk autoincr"` - UserID int64 `xorm:"INDEX"` // Receiver user id. - OpType int - ActUserID int64 `xorm:"INDEX"` // Action user id. - RepoID int64 `xorm:"INDEX"` - CommentID int64 `xorm:"INDEX"` - IsDeleted bool `xorm:"INDEX NOT NULL DEFAULT false"` - RefName string - IsPrivate bool `xorm:"INDEX NOT NULL DEFAULT false"` - Content string `xorm:"TEXT"` - CreatedUnix timeutil.TimeStamp `xorm:"INDEX created"` - } - if err := x.Sync2(&Action{}); err != nil { - return err - } - if err := x.DropIndexes(&Action{}); err != nil { - return err - } - } return x.Sync2(&improveActionTableIndicesAction{}) } diff --git a/models/migrations/v217.go b/models/migrations/v217.go new file mode 100644 index 000000000..280dba17a --- /dev/null +++ b/models/migrations/v217.go @@ -0,0 +1,26 @@ +// Copyright 2022 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package migrations + +import ( + "code.gitea.io/gitea/modules/setting" + + "xorm.io/xorm" +) + +func alterHookTaskTextFieldsToLongText(x *xorm.Engine) error { + sess := x.NewSession() + defer sess.Close() + if err := sess.Begin(); err != nil { + return err + } + + if setting.Database.UseMySQL { + if _, err := sess.Exec("ALTER TABLE `hook_task` CHANGE `payload_content` `payload_content` LONGTEXT, CHANGE `request_content` `request_content` LONGTEXT, change `response_content` `response_content` LONGTEXT"); err != nil { + return err + } + } + return sess.Commit() +} diff --git a/models/notification.go b/models/notification.go index 3f0e374b8..fdc4ffad1 100644 --- a/models/notification.go +++ b/models/notification.go @@ -131,7 +131,7 @@ func (opts *FindNotificationOptions) ToSession(ctx context.Context) *xorm.Sessio // GetNotifications returns all notifications that fit to the given options. func GetNotifications(ctx context.Context, options *FindNotificationOptions) (nl NotificationList, err error) { err = options.ToSession(ctx).OrderBy("notification.updated_unix DESC").Find(&nl) - return + return nl, err } // CountNotifications count all notifications that fit to the given options and ignore pagination. @@ -291,7 +291,7 @@ func getNotificationsByIssueID(ctx context.Context, issueID int64) (notification err = db.GetEngine(ctx). Where("issue_id = ?", issueID). Find(¬ifications) - return + return notifications, err } func notificationExists(notifications []*Notification, issueID, userID int64) bool { @@ -370,7 +370,7 @@ func NotificationsForUser(ctx context.Context, user *user_model.User, statuses [ } err = sess.Find(¬ifications) - return + return notifications, err } // CountUnread count unread notifications for a user @@ -401,7 +401,7 @@ func (n *Notification) loadAttributes(ctx context.Context) (err error) { if err = n.loadComment(ctx); err != nil { return } - return + return err } func (n *Notification) loadRepo(ctx context.Context) (err error) { @@ -730,7 +730,7 @@ func GetNotificationCount(ctx context.Context, user *user_model.User, status Not Where("user_id = ?", user.ID). And("status = ?", status). Count(&Notification{}) - return + return count, err } // UserIDCount is a simple coalition of UserID and Count diff --git a/models/org.go b/models/org.go index 849c9b985..efcb7183e 100644 --- a/models/org.go +++ b/models/org.go @@ -149,7 +149,7 @@ func removeOrgUser(ctx context.Context, orgID, userID int64) error { } } - // Delete member in his/her teams. + // Delete member in their teams. teams, err := organization.GetUserOrgTeams(ctx, org.ID, userID) if err != nil { return err diff --git a/models/organization/org.go b/models/organization/org.go index 0d4a5e337..044ea0656 100644 --- a/models/organization/org.go +++ b/models/organization/org.go @@ -680,7 +680,7 @@ type accessibleReposEnv struct { user *user_model.User team *Team teamIDs []int64 - e db.Engine + ctx context.Context keyword string orderBy db.SearchOrderBy } @@ -706,7 +706,7 @@ func AccessibleReposEnv(ctx context.Context, org *Organization, userID int64) (A org: org, user: user, teamIDs: teamIDs, - e: db.GetEngine(ctx), + ctx: ctx, orderBy: db.SearchOrderByRecentUpdated, }, nil } @@ -717,7 +717,7 @@ func (org *Organization) AccessibleTeamReposEnv(team *Team) AccessibleReposEnvir return &accessibleReposEnv{ org: org, team: team, - e: db.GetEngine(db.DefaultContext), + ctx: db.DefaultContext, orderBy: db.SearchOrderByRecentUpdated, } } @@ -744,7 +744,7 @@ func (env *accessibleReposEnv) cond() builder.Cond { } func (env *accessibleReposEnv) CountRepos() (int64, error) { - repoCount, err := env.e. + repoCount, err := db.GetEngine(env.ctx). Join("INNER", "team_repo", "`team_repo`.repo_id=`repository`.id"). Where(env.cond()). Distinct("`repository`.id"). @@ -761,7 +761,7 @@ func (env *accessibleReposEnv) RepoIDs(page, pageSize int) ([]int64, error) { } repoIDs := make([]int64, 0, pageSize) - return repoIDs, env.e. + return repoIDs, db.GetEngine(env.ctx). Table("repository"). Join("INNER", "team_repo", "`team_repo`.repo_id=`repository`.id"). Where(env.cond()). @@ -783,7 +783,7 @@ func (env *accessibleReposEnv) Repos(page, pageSize int) ([]*repo_model.Reposito return repos, nil } - return repos, env.e. + return repos, db.GetEngine(env.ctx). In("`repository`.id", repoIDs). OrderBy(string(env.orderBy)). Find(&repos) @@ -791,7 +791,7 @@ func (env *accessibleReposEnv) Repos(page, pageSize int) ([]*repo_model.Reposito func (env *accessibleReposEnv) MirrorRepoIDs() ([]int64, error) { repoIDs := make([]int64, 0, 10) - return repoIDs, env.e. + return repoIDs, db.GetEngine(env.ctx). Table("repository"). Join("INNER", "team_repo", "`team_repo`.repo_id=`repository`.id AND `repository`.is_mirror=?", true). Where(env.cond()). @@ -812,7 +812,7 @@ func (env *accessibleReposEnv) MirrorRepos() ([]*repo_model.Repository, error) { return repos, nil } - return repos, env.e. + return repos, db.GetEngine(env.ctx). In("`repository`.id", repoIDs). Find(&repos) } diff --git a/models/organization/team.go b/models/organization/team.go index b32ffa6ca..0b53c84d6 100644 --- a/models/organization/team.go +++ b/models/organization/team.go @@ -185,7 +185,7 @@ func (t *Team) GetUnitNames() (res []string) { for _, u := range t.Units { res = append(res, unit.Units[u.Type].NameKey) } - return + return res } // GetUnitsMap returns the team units permissions @@ -226,7 +226,7 @@ func (t *Team) GetRepositoriesCtx(ctx context.Context) (err error) { t.Repos, err = GetTeamRepositories(ctx, &SearchTeamRepoOptions{ TeamID: t.ID, }) - return + return err } // GetMembersCtx returns paginated members in team of organization. diff --git a/models/packages/package_version.go b/models/packages/package_version.go index 78e76c505..583f832e5 100644 --- a/models/packages/package_version.go +++ b/models/packages/package_version.go @@ -235,7 +235,7 @@ func (opts *PackageSearchOptions) toConds() builder.Cond { } if !opts.HasFiles.IsNone() { - var filesCond builder.Cond = builder.Exists(builder.Select("package_file.id").From("package_file").Where(builder.Expr("package_file.version_id = package_version.id"))) + filesCond := builder.Exists(builder.Select("package_file.id").From("package_file").Where(builder.Expr("package_file.version_id = package_version.id"))) if opts.HasFiles.IsFalse() { filesCond = builder.Not{filesCond} diff --git a/models/perm/access/repo_permission.go b/models/perm/access/repo_permission.go index 6bc1c8270..99919c70b 100644 --- a/models/perm/access/repo_permission.go +++ b/models/perm/access/repo_permission.go @@ -273,7 +273,7 @@ func GetUserRepoPermission(ctx context.Context, repo *repo_model.Repository, use } } - return + return perm, err } // IsUserRealRepoAdmin check if this user is real repo admin diff --git a/models/project/issue.go b/models/project/issue.go index 6e6a8c574..59af7063a 100644 --- a/models/project/issue.go +++ b/models/project/issue.go @@ -103,7 +103,7 @@ func MoveIssuesOnProjectBoard(board *Board, sortedIssueIDs map[int64]int64) erro }) } -func (pb *Board) removeIssues(ctx context.Context) error { - _, err := db.GetEngine(ctx).Exec("UPDATE `project_issue` SET project_board_id = 0 WHERE project_board_id = ? ", pb.ID) +func (b *Board) removeIssues(ctx context.Context) error { + _, err := db.GetEngine(ctx).Exec("UPDATE `project_issue` SET project_board_id = 0 WHERE project_board_id = ? ", b.ID) return err } diff --git a/models/release.go b/models/release.go index 94e803c71..b169920f2 100644 --- a/models/release.go +++ b/models/release.go @@ -132,7 +132,7 @@ func AddReleaseAttachments(ctx context.Context, releaseID int64, attachmentUUIDs } } - return + return err } // GetRelease returns release by given ID. @@ -305,7 +305,7 @@ func GetReleaseAttachments(ctx context.Context, rels ...*Release) (err error) { sortedRels.Rel[currentIndex].Attachments = append(sortedRels.Rel[currentIndex].Attachments, attachment) } - return + return err } type releaseSorter struct { diff --git a/models/repo.go b/models/repo.go index e9d83f5f3..ca83b03e4 100644 --- a/models/repo.go +++ b/models/repo.go @@ -756,7 +756,7 @@ func DoctorUserStarNum() (err error) { log.Debug("recalculate Stars number for all user finished") - return + return err } // DeleteDeployKey delete deploy keys diff --git a/models/repo/archiver.go b/models/repo/archiver.go index dc64cce49..fd07d8554 100644 --- a/models/repo/archiver.go +++ b/models/repo/archiver.go @@ -112,5 +112,5 @@ func FindRepoArchives(opts FindRepoArchiversOption) ([]*RepoArchiver, error) { func SetArchiveRepoState(repo *Repository, isArchived bool) (err error) { repo.IsArchived = isArchived _, err = db.GetEngine(db.DefaultContext).Where("id = ?", repo.ID).Cols("is_archived").NoAutoTime().Update(repo) - return + return err } diff --git a/models/repo/repo.go b/models/repo/repo.go index f6097d2d6..bb2a7468f 100644 --- a/models/repo/repo.go +++ b/models/repo/repo.go @@ -280,7 +280,7 @@ func (repo *Repository) CommitLink(commitID string) (result string) { } else { result = repo.HTMLURL() + "/commit/" + url.PathEscape(commitID) } - return + return result } // APIURL returns the repository API URL @@ -319,13 +319,7 @@ func (repo *Repository) LoadUnits(ctx context.Context) (err error) { // UnitEnabled if this repository has the given unit enabled func (repo *Repository) UnitEnabled(tp unit.Type) (result bool) { - if err := db.WithContext(func(ctx *db.Context) error { - result = repo.UnitEnabledCtx(ctx, tp) - return nil - }); err != nil { - log.Error("repo.UnitEnabled: %v", err) - } - return + return repo.UnitEnabledCtx(db.DefaultContext, tp) } // UnitEnabled if this repository has the given unit enabled @@ -546,7 +540,7 @@ func (repo *Repository) DescriptionHTML(ctx context.Context) template.HTML { log.Error("Failed to render description for %s (ID: %d): %v", repo.Name, repo.ID, err) return template.HTML(markup.Sanitize(repo.Description)) } - return template.HTML(markup.Sanitize(string(desc))) + return template.HTML(markup.Sanitize(desc)) } // CloneLink represents different types of clone URLs of repository. diff --git a/models/statistic.go b/models/statistic.go index 55ace626c..ec094b5f5 100644 --- a/models/statistic.go +++ b/models/statistic.go @@ -111,5 +111,5 @@ func GetStatistic() (stats Statistic) { stats.Counter.Attachment, _ = e.Count(new(repo_model.Attachment)) stats.Counter.Project, _ = e.Count(new(project_model.Project)) stats.Counter.ProjectBoard, _ = e.Count(new(project_model.Board)) - return + return stats } diff --git a/models/task.go b/models/task.go index cabb96c60..67f04d956 100644 --- a/models/task.go +++ b/models/task.go @@ -156,14 +156,14 @@ type ErrTaskDoesNotExist struct { Type structs.TaskType } -// IsErrTaskDoesNotExist checks if an error is a ErrTaskIsNotExist. +// IsErrTaskDoesNotExist checks if an error is a ErrTaskDoesNotExist. func IsErrTaskDoesNotExist(err error) bool { _, ok := err.(ErrTaskDoesNotExist) return ok } func (err ErrTaskDoesNotExist) Error() string { - return fmt.Sprintf("task is not exist [id: %d, repo_id: %d, type: %d]", + return fmt.Sprintf("task does not exist [id: %d, repo_id: %d, type: %d]", err.ID, err.RepoID, err.Type) } diff --git a/models/unit/unit.go b/models/unit/unit.go index e94775413..b83bd6183 100644 --- a/models/unit/unit.go +++ b/models/unit/unit.go @@ -318,7 +318,7 @@ func FindUnitTypes(nameKeys ...string) (res []Type) { res = append(res, TypeInvalid) } } - return + return res } // TypeFromKey give the unit key name and return unit diff --git a/models/user/follow.go b/models/user/follow.go index 6b02486c4..5f24f706d 100644 --- a/models/user/follow.go +++ b/models/user/follow.go @@ -9,7 +9,7 @@ import ( "code.gitea.io/gitea/modules/timeutil" ) -// Follow represents relations of user and his/her followers. +// Follow represents relations of user and their followers. type Follow struct { ID int64 `xorm:"pk autoincr"` UserID int64 `xorm:"UNIQUE(follow)"` diff --git a/models/user/search.go b/models/user/search.go index a81cee1c2..1b65dcb12 100644 --- a/models/user/search.go +++ b/models/user/search.go @@ -59,7 +59,7 @@ func (opts *SearchUserOptions) toSearchQueryBase() *xorm.Session { } if opts.Actor != nil { - var exprCond builder.Cond = builder.Expr("org_user.org_id = `user`.id") + exprCond := builder.Expr("org_user.org_id = `user`.id") // If Admin - they see all users! if !opts.Actor.IsAdmin { diff --git a/models/user/user.go b/models/user/user.go index f7d457b91..9460bd38f 100644 --- a/models/user/user.go +++ b/models/user/user.go @@ -86,7 +86,7 @@ type User struct { PasswdHashAlgo string `xorm:"NOT NULL DEFAULT 'argon2'"` // MustChangePassword is an attribute that determines if a user - // is to change his/her password after registration. + // is to change their password after registration. MustChangePassword bool `xorm:"NOT NULL DEFAULT false"` LoginType auth.Type @@ -537,7 +537,7 @@ func GetUserSalt() (string, error) { return hex.EncodeToString(rBytes), nil } -// NewGhostUser creates and returns a fake user for someone has deleted his/her account. +// NewGhostUser creates and returns a fake user for someone has deleted their account. func NewGhostUser() *User { return &User{ ID: -1, diff --git a/models/webhook/hooktask.go b/models/webhook/hooktask.go index c71b18f66..4415518cf 100644 --- a/models/webhook/hooktask.go +++ b/models/webhook/hooktask.go @@ -105,7 +105,7 @@ type HookTask struct { HookID int64 UUID string api.Payloader `xorm:"-"` - PayloadContent string `xorm:"TEXT"` + PayloadContent string `xorm:"LONGTEXT"` EventType HookEventType IsDelivered bool Delivered int64 @@ -113,9 +113,9 @@ type HookTask struct { // History info. IsSucceed bool - RequestContent string `xorm:"TEXT"` + RequestContent string `xorm:"LONGTEXT"` RequestInfo *HookRequest `xorm:"-"` - ResponseContent string `xorm:"TEXT"` + ResponseContent string `xorm:"LONGTEXT"` ResponseInfo *HookResponse `xorm:"-"` } @@ -286,7 +286,7 @@ func deleteDeliveredHookTasksByWebhook(hookID int64, numberDeliveriesToKeep int) Cols("hook_task.delivered"). Join("INNER", "webhook", "hook_task.hook_id = webhook.id"). OrderBy("hook_task.delivered desc"). - Limit(1, int(numberDeliveriesToKeep)). + Limit(1, numberDeliveriesToKeep). Find(&deliveryDates) if err != nil { return err diff --git a/modules/activitypub/client.go b/modules/activitypub/client.go index 738b1e473..9bcef69de 100644 --- a/modules/activitypub/client.go +++ b/modules/activitypub/client.go @@ -92,7 +92,7 @@ func NewClient(user *user_model.User, pubID string) (c *Client, err error) { priv: privParsed, pubID: pubID, } - return + return c, err } // NewRequest function @@ -110,7 +110,7 @@ func (c *Client) NewRequest(b []byte, to string) (req *http.Request, err error) return } err = signer.SignRequest(c.priv, c.pubID, req, b) - return + return req, err } // Post function @@ -120,5 +120,5 @@ func (c *Client) Post(b []byte, to string) (resp *http.Response, err error) { return } resp, err = c.client.Do(req) - return + return resp, err } diff --git a/modules/activitypub/send.go b/modules/activitypub/send.go index 96b64d205..ead664fd1 100644 --- a/modules/activitypub/send.go +++ b/modules/activitypub/send.go @@ -34,7 +34,7 @@ func Fetch(iri *url.URL) (b []byte, err error) { return } b, err = io.ReadAll(io.LimitReader(resp.Body, setting.Federation.MaxSize)) - return + return b, err } func Send(user *user_model.User, activity *ap.Activity) { diff --git a/modules/activitypub/user_settings.go b/modules/activitypub/user_settings.go index 2144e7b47..fc9775b0f 100644 --- a/modules/activitypub/user_settings.go +++ b/modules/activitypub/user_settings.go @@ -35,11 +35,11 @@ func GetKeyPair(user *user_model.User) (pub, priv string, err error) { // GetPublicKey function returns a user's public key func GetPublicKey(user *user_model.User) (pub string, err error) { pub, _, err = GetKeyPair(user) - return + return pub, err } // GetPrivateKey function returns a user's private key func GetPrivateKey(user *user_model.User) (priv string, err error) { _, priv, err = GetKeyPair(user) - return + return priv, err } diff --git a/modules/base/natural_sort.go b/modules/base/natural_sort.go index 60db363df..46cdd5293 100644 --- a/modules/base/natural_sort.go +++ b/modules/base/natural_sort.go @@ -55,7 +55,7 @@ func isDecimal(r rune) bool { } func compareByNumbers(str1 string, pos1 int, str2 string, pos2 int) (i1, i2 int, less, equal bool) { - var d1, d2 bool = true, true + d1, d2 := true, true var dec1, dec2 string for d1 || d2 { if d1 { diff --git a/modules/charset/charset_test.go b/modules/charset/charset_test.go index cfd5fb569..6dd13c039 100644 --- a/modules/charset/charset_test.go +++ b/modules/charset/charset_test.go @@ -296,11 +296,11 @@ func TestDetectEncoding(t *testing.T) { } func stringMustStartWith(t *testing.T, expected, value string) { - assert.Equal(t, expected, string(value[:len(expected)])) + assert.Equal(t, expected, value[:len(expected)]) } func stringMustEndWith(t *testing.T, expected, value string) { - assert.Equal(t, expected, string(value[len(value)-len(expected):])) + assert.Equal(t, expected, value[len(value)-len(expected):]) } func bytesMustStartWith(t *testing.T, expected, value []byte) { diff --git a/modules/charset/escape.go b/modules/charset/escape.go index 20a4bb2a1..9c1baafba 100644 --- a/modules/charset/escape.go +++ b/modules/charset/escape.go @@ -222,15 +222,15 @@ readingloop: return } escaped.HasError = true - return + return escaped, err } func writeBroken(output io.Writer, bs []byte) (err error) { _, err = fmt.Fprintf(output, `<%X>`, bs) - return + return err } func writeEscaped(output io.Writer, r rune) (err error) { _, err = fmt.Fprintf(output, `%c`, r, r) - return + return err } diff --git a/modules/context/api.go b/modules/context/api.go index 33534dbf6..558a9f51e 100644 --- a/modules/context/api.go +++ b/modules/context/api.go @@ -340,7 +340,7 @@ func ReferencesGitRepo(allowEmpty ...bool) func(ctx *APIContext) (cancel context } } - return + return cancel } } diff --git a/modules/context/auth.go b/modules/context/auth.go index 09c229545..e6d882eb5 100644 --- a/modules/context/auth.go +++ b/modules/context/auth.go @@ -7,6 +7,7 @@ package context import ( "net/http" + "strings" "code.gitea.io/gitea/models/auth" "code.gitea.io/gitea/modules/log" @@ -41,6 +42,10 @@ func Toggle(options *ToggleOptions) func(ctx *Context) { if ctx.Doer.MustChangePassword { if ctx.Req.URL.Path != "/user/settings/change_password" { + if strings.HasPrefix(ctx.Req.UserAgent(), "git") { + ctx.Error(http.StatusUnauthorized, ctx.Tr("auth.must_change_password")) + return + } ctx.Data["Title"] = ctx.Tr("auth.must_change_password") ctx.Data["ChangePasscodeLink"] = setting.AppSubURL + "/user/change_password" if ctx.Req.URL.Path != "/user/events" { diff --git a/modules/context/private.go b/modules/context/private.go index fdc775122..9e7977b5d 100644 --- a/modules/context/private.go +++ b/modules/context/private.go @@ -82,5 +82,5 @@ func PrivateContexter() func(http.Handler) http.Handler { func OverrideContext(ctx *PrivateContext) (cancel context.CancelFunc) { // We now need to override the request context as the base for our work because even if the request is cancelled we have to continue this work ctx.Override, _, cancel = process.GetManager().AddTypedContext(graceful.GetManager().HammerContext(), fmt.Sprintf("PrivateContext: %s", ctx.Req.RequestURI), process.RequestProcessType, true) - return + return cancel } diff --git a/modules/context/repo.go b/modules/context/repo.go index 217cbd3df..183637391 100644 --- a/modules/context/repo.go +++ b/modules/context/repo.go @@ -734,7 +734,7 @@ func RepoAssignment(ctx *Context) (cancel context.CancelFunc) { ctx.Data["GoDocDirectory"] = prefix + "{/dir}" ctx.Data["GoDocFile"] = prefix + "{/dir}/{file}#L{line}" } - return + return cancel } // RepoRefType type of repo reference @@ -1001,7 +1001,7 @@ func RepoRefByType(refType RepoRefType, ignoreNotExistErr ...bool) func(*Context return } ctx.Data["CommitsCount"] = ctx.Repo.CommitsCount - return + return cancel } } diff --git a/modules/context/utils.go b/modules/context/utils.go index aea51cc5d..a72c8b47e 100644 --- a/modules/context/utils.go +++ b/modules/context/utils.go @@ -52,5 +52,5 @@ func parseTime(value string) (int64, error) { func prepareQueryArg(ctx *Context, name string) (value string, err error) { value, err = url.PathUnescape(ctx.FormString(name)) value = strings.TrimSpace(value) - return + return value, err } diff --git a/modules/convert/convert.go b/modules/convert/convert.go index c8cb23261..c62b4303e 100644 --- a/modules/convert/convert.go +++ b/modules/convert/convert.go @@ -257,7 +257,7 @@ func ToHook(repoLink string, w *webhook.Webhook) *api.Hook { return &api.Hook{ ID: w.ID, - Type: string(w.Type), + Type: w.Type, URL: fmt.Sprintf("%s/settings/hooks/%d", repoLink, w.ID), Active: w.IsActive, Config: config, diff --git a/modules/convert/issue.go b/modules/convert/issue.go index 35eff0522..5364367a8 100644 --- a/modules/convert/issue.go +++ b/modules/convert/issue.go @@ -123,7 +123,7 @@ func ToTrackedTime(t *issues_model.TrackedTime) (apiT *api.TrackedTime) { if t.User != nil { apiT.UserName = t.User.Name } - return + return apiT } // ToStopWatches convert Stopwatch list to api.StopWatches diff --git a/modules/doctor/fix16961.go b/modules/doctor/fix16961.go index 92c441850..307cfcd9f 100644 --- a/modules/doctor/fix16961.go +++ b/modules/doctor/fix16961.go @@ -216,7 +216,7 @@ func fixBrokenRepoUnit16961(repoUnit *repo_model.RepoUnit, bs []byte) (fixed boo return false, nil } - switch unit.Type(repoUnit.Type) { + switch repoUnit.Type { case unit.TypeCode, unit.TypeReleases, unit.TypeWiki, unit.TypeProjects: cfg := &repo_model.UnitConfig{} repoUnit.Config = cfg diff --git a/modules/doctor/mergebase.go b/modules/doctor/mergebase.go index 46369290a..2da91cdcc 100644 --- a/modules/doctor/mergebase.go +++ b/modules/doctor/mergebase.go @@ -30,6 +30,9 @@ func iteratePRs(ctx context.Context, repo *repo_model.Repository, each func(*rep } func checkPRMergeBase(ctx context.Context, logger log.Logger, autofix bool) error { + if err := git.InitOnceWithSync(ctx); err != nil { + return err + } numRepos := 0 numPRs := 0 numPRsUpdated := 0 diff --git a/modules/doctor/misc.go b/modules/doctor/misc.go index 9bee78303..24175fcaf 100644 --- a/modules/doctor/misc.go +++ b/modules/doctor/misc.go @@ -189,6 +189,75 @@ func checkDaemonExport(ctx context.Context, logger log.Logger, autofix bool) err return nil } +func checkCommitGraph(ctx context.Context, logger log.Logger, autofix bool) error { + if err := git.InitOnceWithSync(ctx); err != nil { + return err + } + + numRepos := 0 + numNeedUpdate := 0 + numWritten := 0 + if err := iterateRepositories(ctx, func(repo *repo_model.Repository) error { + numRepos++ + + commitGraphExists := func() (bool, error) { + // Check commit-graph exists + commitGraphFile := path.Join(repo.RepoPath(), `objects/info/commit-graph`) + isExist, err := util.IsExist(commitGraphFile) + if err != nil { + logger.Error("Unable to check if %s exists. Error: %v", commitGraphFile, err) + return false, err + } + + if !isExist { + commitGraphsDir := path.Join(repo.RepoPath(), `objects/info/commit-graphs`) + isExist, err = util.IsExist(commitGraphsDir) + if err != nil { + logger.Error("Unable to check if %s exists. Error: %v", commitGraphsDir, err) + return false, err + } + } + return isExist, nil + } + + isExist, err := commitGraphExists() + if err != nil { + return err + } + if !isExist { + numNeedUpdate++ + if autofix { + if err := git.WriteCommitGraph(ctx, repo.RepoPath()); err != nil { + logger.Error("Unable to write commit-graph in %s. Error: %v", repo.FullName(), err) + return err + } + isExist, err := commitGraphExists() + if err != nil { + return err + } + if isExist { + numWritten++ + logger.Info("Commit-graph written: %s", repo.FullName()) + } else { + logger.Warn("No commit-graph written: %s", repo.FullName()) + } + } + } + return nil + }); err != nil { + logger.Critical("Unable to checkCommitGraph: %v", err) + return err + } + + if autofix { + logger.Info("Wrote commit-graph files for %d of %d repositories.", numWritten, numRepos) + } else { + logger.Info("Checked %d repositories, %d without commit-graphs.", numRepos, numNeedUpdate) + } + + return nil +} + func init() { Register(&Check{ Title: "Check if SCRIPT_TYPE is available", @@ -225,4 +294,11 @@ func init() { Run: checkDaemonExport, Priority: 8, }) + Register(&Check{ + Title: "Check commit-graphs", + Name: "check-commit-graphs", + IsDefault: false, + Run: checkCommitGraph, + Priority: 9, + }) } diff --git a/modules/eventsource/event.go b/modules/eventsource/event.go index 9fe20715e..281a1bb13 100644 --- a/modules/eventsource/event.go +++ b/modules/eventsource/event.go @@ -18,7 +18,7 @@ func wrapNewlines(w io.Writer, prefix, value []byte) (sum int64, err error) { if len(value) == 0 { return } - n := 0 + var n int last := 0 for j := bytes.IndexByte(value, '\n'); j > -1; j = bytes.IndexByte(value[last:], '\n') { n, err = w.Write(prefix) @@ -45,7 +45,7 @@ func wrapNewlines(w io.Writer, prefix, value []byte) (sum int64, err error) { } n, err = w.Write([]byte("\n")) sum += int64(n) - return + return sum, err } // Event is an eventsource event, not all fields need to be set @@ -64,7 +64,7 @@ type Event struct { // The return value n is the number of bytes written. Any error encountered during the write is also returned. func (e *Event) WriteTo(w io.Writer) (int64, error) { sum := int64(0) - nint := 0 + var nint int n, err := wrapNewlines(w, []byte("event: "), []byte(e.Name)) sum += n if err != nil { diff --git a/modules/git/batch_reader.go b/modules/git/batch_reader.go index 902fa8971..feb0dd31b 100644 --- a/modules/git/batch_reader.go +++ b/modules/git/batch_reader.go @@ -176,12 +176,12 @@ func ReadBatchLine(rd *bufio.Reader) (sha []byte, typ string, size int64, err er typ = typ[:idx] size, err = strconv.ParseInt(sizeStr, 10, 64) - return + return sha, typ, size, err } // ReadTagObjectID reads a tag object ID hash from a cat-file --batch stream, throwing away the rest of the stream. func ReadTagObjectID(rd *bufio.Reader, size int64) (string, error) { - id := "" + var id string var n int64 headerLoop: for { @@ -216,7 +216,7 @@ headerLoop: // ReadTreeID reads a tree ID from a cat-file --batch stream, throwing away the rest of the stream. func ReadTreeID(rd *bufio.Reader, size int64) (string, error) { - id := "" + var id string var n int64 headerLoop: for { @@ -328,7 +328,7 @@ func ParseTreeLine(rd *bufio.Reader, modeBuf, fnameBuf, shaBuf []byte) (mode, fn // Deal with the 20-byte SHA idx = 0 for idx < 20 { - read := 0 + var read int read, err = rd.Read(shaBuf[idx:20]) n += read if err != nil { @@ -337,7 +337,7 @@ func ParseTreeLine(rd *bufio.Reader, modeBuf, fnameBuf, shaBuf []byte) (mode, fn idx += read } sha = shaBuf - return + return mode, fname, sha, n, err } var callerPrefix string diff --git a/modules/git/blob_nogogit.go b/modules/git/blob_nogogit.go index 211c18855..89bb98162 100644 --- a/modules/git/blob_nogogit.go +++ b/modules/git/blob_nogogit.go @@ -99,7 +99,7 @@ func (b *blobReader) Read(p []byte) (n int, err error) { } n, err = b.rd.Read(p) b.n -= int64(n) - return + return n, err } // Close implements io.Closer diff --git a/modules/git/commit.go b/modules/git/commit.go index 82b5e0b25..82712dd1e 100644 --- a/modules/git/commit.go +++ b/modules/git/commit.go @@ -418,7 +418,7 @@ func (c *Commit) LoadBranchName() (err error) { } c.Branch, err = c.GetBranchName() - return + return err } // GetTagName gets the current tag name for given commit diff --git a/modules/git/commit_info_nogogit.go b/modules/git/commit_info_nogogit.go index f430c672f..ceab11adb 100644 --- a/modules/git/commit_info_nogogit.go +++ b/modules/git/commit_info_nogogit.go @@ -157,7 +157,7 @@ func GetLastCommitForPaths(ctx context.Context, cache *LastCommitCache, commit * if typ != "commit" { return nil, fmt.Errorf("unexpected type: %s for commit id: %s", typ, commitID) } - c, err = CommitFromReader(commit.repo, MustIDFromString(string(commitID)), io.LimitReader(batchReader, int64(size))) + c, err = CommitFromReader(commit.repo, MustIDFromString(commitID), io.LimitReader(batchReader, size)) if err != nil { return nil, err } diff --git a/modules/git/diff.go b/modules/git/diff.go index c9d68bb13..f75ebd4fd 100644 --- a/modules/git/diff.go +++ b/modules/git/diff.go @@ -115,7 +115,7 @@ func ParseDiffHunkString(diffhunk string) (leftLine, leftHunk, rightLine, righHu rightLine = leftLine righHunk = leftHunk } - return + return leftLine, leftHunk, rightLine, righHunk } // Example: @@ -1,8 +1,9 @@ => [..., 1, 8, 1, 9] diff --git a/modules/git/pipeline/lfs_nogogit.go b/modules/git/pipeline/lfs_nogogit.go index a2b5dd0c9..061da8ca5 100644 --- a/modules/git/pipeline/lfs_nogogit.go +++ b/modules/git/pipeline/lfs_nogogit.go @@ -116,7 +116,7 @@ func FindLFSFile(repo *git.Repository, hash git.SHA1) ([]*LFSResult, error) { continue case "commit": // Read in the commit to get its tree and in case this is one of the last used commits - curCommit, err = git.CommitFromReader(repo, git.MustIDFromString(string(commitID)), io.LimitReader(batchReader, int64(size))) + curCommit, err = git.CommitFromReader(repo, git.MustIDFromString(string(commitID)), io.LimitReader(batchReader, size)) if err != nil { return nil, err } diff --git a/modules/git/repo_attribute.go b/modules/git/repo_attribute.go index 596a91e80..1305e6f22 100644 --- a/modules/git/repo_attribute.go +++ b/modules/git/repo_attribute.go @@ -334,7 +334,7 @@ func (wr *lineSeparatedAttributeWriter) Write(p []byte) (n int, err error) { wr.tmp = []byte(remaining[3:]) break } - return l, fmt.Errorf("unexpected tail %s", string(remaining)) + return l, fmt.Errorf("unexpected tail %s", remaining) } _, _ = sb.WriteRune(rn) remaining = tail diff --git a/modules/git/repo_base_nogogit.go b/modules/git/repo_base_nogogit.go index df24d952a..63c278c26 100644 --- a/modules/git/repo_base_nogogit.go +++ b/modules/git/repo_base_nogogit.go @@ -101,5 +101,5 @@ func (repo *Repository) Close() (err error) { repo.checkReader = nil repo.checkWriter = nil } - return + return err } diff --git a/modules/git/repo_branch_nogogit.go b/modules/git/repo_branch_nogogit.go index bc5899108..2983a35ca 100644 --- a/modules/git/repo_branch_nogogit.go +++ b/modules/git/repo_branch_nogogit.go @@ -95,7 +95,7 @@ func callShowRef(ctx context.Context, repoPath, prefix, arg string, skip, limit return nil }) - return + return branchNames, countAll, err } func walkShowRef(ctx context.Context, repoPath, arg string, skip, limit int, walkfn func(sha1, refname string) error) (countAll int, err error) { diff --git a/modules/git/repo_compare.go b/modules/git/repo_compare.go index 3c7af7300..577c9f475 100644 --- a/modules/git/repo_compare.go +++ b/modules/git/repo_compare.go @@ -132,7 +132,7 @@ type lineCountWriter struct { func (l *lineCountWriter) Write(p []byte) (n int, err error) { n = len(p) l.numLines += bytes.Count(p, []byte{'\000'}) - return + return n, err } // GetDiffNumChangedFiles counts the number of changed files @@ -177,7 +177,7 @@ func (repo *Repository) GetDiffShortStat(base, head string) (numFiles, totalAddi if err != nil && strings.Contains(err.Error(), "no merge base") { return GetDiffShortStat(repo.Ctx, repo.Path, base, head) } - return + return numFiles, totalAdditions, totalDeletions, err } // GetDiffShortStat counts number of changed files, number of additions and deletions @@ -231,7 +231,7 @@ func parseDiffStat(stdout string) (numFiles, totalAdditions, totalDeletions int, return 0, 0, 0, fmt.Errorf("unable to parse shortstat: %s. Error parsing NumDeletions %v", stdout, err) } } - return + return numFiles, totalAdditions, totalDeletions, err } // GetDiffOrPatch generates either diff or formatted patch data between given revisions diff --git a/modules/git/repo_compare_test.go b/modules/git/repo_compare_test.go index e163a3090..245920c2b 100644 --- a/modules/git/repo_compare_test.go +++ b/modules/git/repo_compare_test.go @@ -117,8 +117,8 @@ func TestReadWritePullHead(t *testing.T) { return } - assert.Len(t, string(headContents), 40) - assert.True(t, string(headContents) == newCommit) + assert.Len(t, headContents, 40) + assert.True(t, headContents == newCommit) // Remove file after the test err = repo.RemoveReference(PullPrefix + "1/head") diff --git a/modules/git/repo_index.go b/modules/git/repo_index.go index ae68dcaa8..50d82c77d 100644 --- a/modules/git/repo_index.go +++ b/modules/git/repo_index.go @@ -64,7 +64,7 @@ func (repo *Repository) ReadTreeToTemporaryIndex(treeish string) (filename, tmpD defer cancel() return "", "", func() {}, err } - return + return filename, tmpDir, cancel, err } // EmptyIndex empties the index diff --git a/modules/git/repo_tag_nogogit.go b/modules/git/repo_tag_nogogit.go index 8d44db0a2..9a574666f 100644 --- a/modules/git/repo_tag_nogogit.go +++ b/modules/git/repo_tag_nogogit.go @@ -27,7 +27,7 @@ func (repo *Repository) IsTagExist(name string) bool { // returning at most limit tags, or all if limit is 0. func (repo *Repository) GetTags(skip, limit int) (tags []string, err error) { tags, _, err = callShowRef(repo.Ctx, repo.Path, TagPrefix, "--tags", skip, limit) - return + return tags, err } // GetTagType gets the type of the tag, either commit (simple) or tag (annotated) diff --git a/modules/git/sha1_nogogit.go b/modules/git/sha1_nogogit.go index 1835c68f5..a2620cba6 100644 --- a/modules/git/sha1_nogogit.go +++ b/modules/git/sha1_nogogit.go @@ -58,5 +58,5 @@ func NewHasher(t ObjectType, size int64) Hasher { // Sum generates a SHA1 for the provided hash func (h Hasher) Sum() (sha1 SHA1) { copy(sha1[:], h.Hash.Sum(nil)) - return + return sha1 } diff --git a/modules/git/signature_nogogit.go b/modules/git/signature_nogogit.go index 81da739a5..2fc8dde04 100644 --- a/modules/git/signature_nogogit.go +++ b/modules/git/signature_nogogit.go @@ -91,5 +91,5 @@ func newSignatureFromCommitline(line []byte) (sig *Signature, err error) { return } } - return + return sig, err } diff --git a/modules/git/utils.go b/modules/git/utils.go index 53c124ac8..d6bf9f441 100644 --- a/modules/git/utils.go +++ b/modules/git/utils.go @@ -163,7 +163,7 @@ func (l *LimitedReaderCloser) Read(p []byte) (n int, err error) { } n, err = l.R.Read(p) l.N -= int64(n) - return + return n, err } // Close implements io.Closer diff --git a/modules/gitgraph/graph_test.go b/modules/gitgraph/graph_test.go index ea6553529..2cfbe4b2f 100644 --- a/modules/gitgraph/graph_test.go +++ b/modules/gitgraph/graph_test.go @@ -53,7 +53,7 @@ func BenchmarkParseGlyphs(b *testing.B) { parser := &Parser{} parser.Reset() tgBytes := []byte(testglyphs) - tg := tgBytes + var tg []byte for i := 0; i < b.N; i++ { parser.Reset() tg = tgBytes diff --git a/modules/graceful/context.go b/modules/graceful/context.go index 9d955329a..b9d975a1d 100644 --- a/modules/graceful/context.go +++ b/modules/graceful/context.go @@ -26,7 +26,7 @@ func NewChannelContext(done <-chan struct{}, err error) *ChannelContext { // Deadline returns the time when work done on behalf of this context // should be canceled. There is no Deadline for a ChannelContext func (ctx *ChannelContext) Deadline() (deadline time.Time, ok bool) { - return + return deadline, ok } // Done returns the channel provided at the creation of this context. diff --git a/modules/highlight/highlight.go b/modules/highlight/highlight.go index a72f26d5f..acd3bebb9 100644 --- a/modules/highlight/highlight.go +++ b/modules/highlight/highlight.go @@ -114,7 +114,7 @@ func CodeFromLexer(lexer chroma.Lexer, code string) string { htmlbuf := bytes.Buffer{} htmlw := bufio.NewWriter(&htmlbuf) - iterator, err := lexer.Tokenise(nil, string(code)) + iterator, err := lexer.Tokenise(nil, code) if err != nil { log.Error("Can't tokenize code: %v", err) return code @@ -197,7 +197,7 @@ func File(numLines int, fileName, language string, code []byte) []string { m := make([]string, 0, numLines) for _, v := range strings.SplitN(htmlbuf.String(), "\n", numLines) { - content := string(v) + content := v // need to keep lines that are only \n so copy/paste works properly in browser if content == "" { content = "\n" @@ -220,8 +220,8 @@ func File(numLines int, fileName, language string, code []byte) []string { // return unhiglighted map func plainText(code string, numLines int) []string { m := make([]string, 0, numLines) - for _, v := range strings.SplitN(string(code), "\n", numLines) { - content := string(v) + for _, v := range strings.SplitN(code, "\n", numLines) { + content := v // need to keep lines that are only \n so copy/paste works properly in browser if content == "" { content = "\n" diff --git a/modules/indexer/code/bleve.go b/modules/indexer/code/bleve.go index 1abb3c021..0b31f7119 100644 --- a/modules/indexer/code/bleve.go +++ b/modules/indexer/code/bleve.go @@ -392,7 +392,7 @@ func (b *BleveIndexer) Search(ctx context.Context, repoIDs []int64, language, ke searchResults := make([]*SearchResult, len(result.Hits)) for i, hit := range result.Hits { - var startIndex, endIndex int = -1, -1 + startIndex, endIndex := -1, -1 for _, locations := range hit.Locations["Content"] { location := locations[0] locationStart := int(location.Start) diff --git a/modules/indexer/code/elastic_search.go b/modules/indexer/code/elastic_search.go index 7263f2765..a669c66bb 100644 --- a/modules/indexer/code/elastic_search.go +++ b/modules/indexer/code/elastic_search.go @@ -348,7 +348,7 @@ func convertResult(searchResult *elastic.SearchResult, kw string, pageSize int) // FIXME: There is no way to get the position the keyword on the content currently on the same request. // So we get it from content, this may made the query slower. See // https://discuss.elastic.co/t/fetching-position-of-keyword-in-matched-document/94291 - var startIndex, endIndex int = -1, -1 + var startIndex, endIndex int c, ok := hit.Highlight["content"] if ok && len(c) > 0 { // FIXME: Since the highlighting content will include and for the keywords, diff --git a/modules/markup/common/footnote.go b/modules/markup/common/footnote.go index 821b3e638..d07f5e609 100644 --- a/modules/markup/common/footnote.go +++ b/modules/markup/common/footnote.go @@ -203,9 +203,8 @@ func (b *footnoteBlockParser) Open(parent ast.Node, reader text.Reader, pc parse return nil, parser.NoChildren } open := pos + 1 - closes := 0 closure := util.FindClosure(line[pos+1:], '[', ']', false, false) //nolint - closes = pos + 1 + closure + closes := pos + 1 + closure next := closes + 1 if closure > -1 { if next >= len(line) || line[next] != ':' { diff --git a/modules/markup/markdown/markdown.go b/modules/markup/markdown/markdown.go index 37e11e606..4ce85dfc3 100644 --- a/modules/markup/markdown/markdown.go +++ b/modules/markup/markdown/markdown.go @@ -156,7 +156,7 @@ func actualRender(ctx *markup.RenderContext, input io.Reader, output io.Writer) log.Warn("Unable to render markdown due to panic in goldmark: %v", err) if log.IsDebug() { - log.Debug("Panic in markdown: %v\n%s", err, string(log.Stack(2))) + log.Debug("Panic in markdown: %v\n%s", err, log.Stack(2)) } }() @@ -185,7 +185,7 @@ func render(ctx *markup.RenderContext, input io.Reader, output io.Writer) error log.Warn("Unable to render markdown due to panic in goldmark - will return raw bytes") if log.IsDebug() { - log.Debug("Panic in markdown: %v\n%s", err, string(log.Stack(2))) + log.Debug("Panic in markdown: %v\n%s", err, log.Stack(2)) } _, err = io.Copy(output, input) if err != nil { diff --git a/modules/markup/orgmode/orgmode.go b/modules/markup/orgmode/orgmode.go index 8c9f3b3da..a78531720 100644 --- a/modules/markup/orgmode/orgmode.go +++ b/modules/markup/orgmode/orgmode.go @@ -75,7 +75,7 @@ func Render(ctx *markup.RenderContext, input io.Reader, output io.Writer) error if lexer == nil { // include language-x class as part of commonmark spec - if _, err := w.WriteString(``); err != nil { + if _, err := w.WriteString(``); err != nil { return "" } if _, err := w.WriteString(html.EscapeString(source)); err != nil { @@ -83,7 +83,7 @@ func Render(ctx *markup.RenderContext, input io.Reader, output io.Writer) error } } else { // include language-x class as part of commonmark spec - if _, err := w.WriteString(``); err != nil { + if _, err := w.WriteString(``); err != nil { return "" } lexer = chroma.Coalesce(lexer) diff --git a/modules/markup/sanitizer_test.go b/modules/markup/sanitizer_test.go index a0753c4a5..7dfca7a46 100644 --- a/modules/markup/sanitizer_test.go +++ b/modules/markup/sanitizer_test.go @@ -55,7 +55,7 @@ func Test_Sanitizer(t *testing.T) { func TestSanitizeNonEscape(t *testing.T) { descStr := "<script>alert(document.domain)</script>" - output := template.HTML(Sanitize(string(descStr))) + output := template.HTML(Sanitize(descStr)) if strings.Contains(string(output), "