diff --git a/.drone.yml b/.drone.yml index a4079e8e09684..c72c4226d02ae 100644 --- a/.drone.yml +++ b/.drone.yml @@ -569,6 +569,9 @@ steps: TEST_PGSQL_DBNAME: 'testgitea-e2e' DEBIAN_FRONTEND: noninteractive depends_on: [build-frontend, deps-backend] + volumes: + - name: deps + path: /go --- kind: pipeline diff --git a/Makefile b/Makefile index d1bfb2645f283..ebd108d99cc3b 100644 --- a/Makefile +++ b/Makefile @@ -111,6 +111,8 @@ WEBPACK_DEST_ENTRIES := public/js public/css public/fonts public/img/webpack pub BINDATA_DEST := modules/public/bindata.go modules/options/bindata.go modules/templates/bindata.go BINDATA_HASH := $(addsuffix .hash,$(BINDATA_DEST)) +GENERATED_GO_DEST := modules/charset/invisible_gen.go modules/charset/ambiguous_gen.go + SVG_DEST_DIR := public/img/svg AIR_TMP_DIR := .air @@ -130,9 +132,12 @@ GO_DIRS := cmd tests models modules routers build services tools GO_SOURCES := $(wildcard *.go) GO_SOURCES += $(shell find $(GO_DIRS) -type f -name "*.go" -not -path modules/options/bindata.go -not -path modules/public/bindata.go -not -path modules/templates/bindata.go) +GO_SOURCES += $(GENERATED_GO_DEST) +GO_SOURCES_NO_BINDATA := $(GO_SOURCES) ifeq ($(filter $(TAGS_SPLIT),bindata),bindata) GO_SOURCES += $(BINDATA_DEST) + GENERATED_GO_DEST += $(BINDATA_DEST) endif # Force installation of playwright dependencies by setting this flag @@ -259,7 +264,7 @@ clean: fmt: @MISSPELL_PACKAGE=$(MISSPELL_PACKAGE) GOFUMPT_PACKAGE=$(GOFUMPT_PACKAGE) $(GO) run build/code-batch-process.go gitea-fmt -w '{file-list}' $(eval TEMPLATES := $(shell find templates -type f -name '*.tmpl')) - @# strip whitespace after '{{' and before `}}` unless there is only whitespace before it + @# strip whitespace after '{{' and before `}}` unless there is only whitespace before it @$(SED_INPLACE) -e 's/{{[ ]\{1,\}/{{/g' -e '/^[ ]\{1,\}}}/! s/[ ]\{1,\}}}/}}/g' $(TEMPLATES) .PHONY: vet @@ -278,7 +283,9 @@ TAGS_PREREQ := $(TAGS_EVIDENCE) endif .PHONY: generate-swagger -generate-swagger: +generate-swagger: $(SWAGGER_SPEC) + +$(SWAGGER_SPEC): $(GO_SOURCES_NO_BINDATA) $(GO) run $(SWAGGER_PACKAGE) generate spec -x "$(SWAGGER_EXCLUDE)" -o './$(SWAGGER_SPEC)' $(SED_INPLACE) '$(SWAGGER_SPEC_S_TMPL)' './$(SWAGGER_SPEC)' $(SED_INPLACE) $(SWAGGER_NEWLINE_COMMAND) './$(SWAGGER_SPEC)' @@ -398,7 +405,6 @@ unit-test-coverage: tidy: $(eval MIN_GO_VERSION := $(shell grep -Eo '^go\s+[0-9]+\.[0-9.]+' go.mod | cut -d' ' -f2)) $(GO) mod tidy -compat=$(MIN_GO_VERSION) - @$(MAKE) --no-print-directory assets/go-licenses.json .PHONY: vendor vendor: tidy @@ -702,16 +708,25 @@ install: $(wildcard *.go) build: frontend backend .PHONY: frontend -frontend: $(WEBPACK_DEST) +frontend: generate-frontend $(WEBPACK_DEST) .PHONY: backend -backend: go-check generate $(EXECUTABLE) +backend: go-check generate-backend $(EXECUTABLE) +# We generate the backend before the frontend in case we in future we want to generate things in the frontend from generated files in backend .PHONY: generate -generate: $(TAGS_PREREQ) +generate: generate-backend generate-frontend + +.PHONY: generate-backend +generate-backend: $(TAGS_PREREQ) generate-go + +generate-go: $(TAGS_PREREQ) @echo "Running go generate..." @CC= GOOS= GOARCH= $(GO) generate -tags '$(TAGS)' $(GO_PACKAGES) +.PHONY: generate-frontend +generate-frontend: $(TAGS_PREREQ) go-licenses + $(EXECUTABLE): $(GO_SOURCES) $(TAGS_PREREQ) CGO_CFLAGS="$(CGO_CFLAGS)" $(GO) build $(GOFLAGS) $(EXTRA_GOFLAGS) -tags '$(TAGS)' -ldflags '-s -w $(LDFLAGS)' -o $@ diff --git a/docs/content/doc/developers/api-usage.en-us.md b/docs/content/doc/developers/api-usage.en-us.md index 1ff912353fed2..a7b87f8f084ba 100644 --- a/docs/content/doc/developers/api-usage.en-us.md +++ b/docs/content/doc/developers/api-usage.en-us.md @@ -49,7 +49,7 @@ Note that `/users/:name/tokens` is a special endpoint and requires you to authenticate using `BasicAuth` and a password, as follows: ```sh -$ curl -XPOST -H "Content-Type: application/json" -k -d '{"name":"test"}' -u username:password https://gitea.your.host/api/v1/users//tokens +$ curl -H "Content-Type: application/json" -d '{"name":"test"}' -u username:password https://gitea.your.host/api/v1/users//tokens {"id":1,"name":"test","sha1":"9fcb1158165773dd010fca5f0cf7174316c3e37d","token_last_eight":"16c3e37d"} ``` @@ -58,7 +58,7 @@ plain-text. It will not be displayed when listing tokens with a `GET` request; e.g. ```sh -$ curl --request GET --url https://yourusername:password@gitea.your.host/api/v1/users//tokens +$ curl --url https://yourusername:password@gitea.your.host/api/v1/users//tokens [{"name":"test","sha1":"","token_last_eight:"........":},{"name":"dev","sha1":"","token_last_eight":"........"}] ``` @@ -70,7 +70,7 @@ is where you'd place the code from your authenticator. Here is how the request would look like in curl: ```sh -$ curl -H "X-Gitea-OTP: 123456" --request GET --url https://yourusername:yourpassword@gitea.your.host/api/v1/users/yourusername/tokens +$ curl -H "X-Gitea-OTP: 123456" --url https://yourusername:yourpassword@gitea.your.host/api/v1/users/yourusername/tokens ``` You can also create an API key token via your Gitea installation's web @@ -96,7 +96,7 @@ Authorization: token 65eaa9c8ef52460d22a93307fe0aee76289dc675 In a `curl` command, for instance, this would look like: ```sh -curl -X POST "http://localhost:4000/api/v1/repos/test1/test1/issues" \ +curl "http://localhost:4000/api/v1/repos/test1/test1/issues" \ -H "accept: application/json" \ -H "Authorization: token 65eaa9c8ef52460d22a93307fe0aee76289dc675" \ -H "Content-Type: application/json" -d "{ \"body\": \"testing\", \"title\": \"test 20\"}" -i diff --git a/docs/content/doc/developers/api-usage.zh-cn.md b/docs/content/doc/developers/api-usage.zh-cn.md index 17a1cf1102138..c998361115de9 100644 --- a/docs/content/doc/developers/api-usage.zh-cn.md +++ b/docs/content/doc/developers/api-usage.zh-cn.md @@ -46,7 +46,7 @@ Authorization: token 65eaa9c8ef52460d22a93307fe0aee76289dc675 以 `curl` 命令为例,它会以如下形式携带在请求中: ``` -curl -X POST "http://localhost:4000/api/v1/repos/test1/test1/issues" \ +curl "http://localhost:4000/api/v1/repos/test1/test1/issues" \ -H "accept: application/json" \ -H "Authorization: token 65eaa9c8ef52460d22a93307fe0aee76289dc675" \ -H "Content-Type: application/json" -d "{ \"body\": \"testing\", \"title\": \"test 20\"}" -i @@ -62,7 +62,7 @@ curl -X POST "http://localhost:4000/api/v1/repos/test1/test1/issues" \ ### 使用 Basic authentication 认证: ``` -$ curl --request GET --url https://yourusername:yourpassword@gitea.your.host/api/v1/users/yourusername/tokens +$ curl --url https://yourusername:yourpassword@gitea.your.host/api/v1/users/yourusername/tokens [{"name":"test","sha1":"..."},{"name":"dev","sha1":"..."}] ``` diff --git a/models/user.go b/models/user.go index fceb5aabeca56..68be0d855509b 100644 --- a/models/user.go +++ b/models/user.go @@ -102,9 +102,9 @@ func DeleteUser(ctx context.Context, u *user_model.User, purge bool) (err error) // Delete Comments const batchSize = 50 - for start := 0; ; start += batchSize { + for { comments := make([]*issues_model.Comment, 0, batchSize) - if err = e.Where("type=? AND poster_id=?", issues_model.CommentTypeComment, u.ID).Limit(batchSize, start).Find(&comments); err != nil { + if err = e.Where("type=? AND poster_id=?", issues_model.CommentTypeComment, u.ID).Limit(batchSize, 0).Find(&comments); err != nil { return err } if len(comments) == 0 { @@ -202,7 +202,7 @@ func DeleteUser(ctx context.Context, u *user_model.User, purge bool) (err error) // ***** END: ExternalLoginUser ***** if _, err = e.ID(u.ID).Delete(new(user_model.User)); err != nil { - return fmt.Errorf("Delete: %v", err) + return fmt.Errorf("delete: %v", err) } return nil diff --git a/modules/charset/ambiguous/generate.go b/modules/charset/ambiguous/generate.go index 43cdb217a79ac..7dd2821aae257 100644 --- a/modules/charset/ambiguous/generate.go +++ b/modules/charset/ambiguous/generate.go @@ -110,6 +110,17 @@ func runTemplate(t *template.Template, filename string, data interface{}) error verbosef("Bad source:\n%s", buf.String()) return fmt.Errorf("unable to format source: %w", err) } + + old, err := os.ReadFile(filename) + if err != nil && !os.IsNotExist(err) { + return fmt.Errorf("failed to read old file %s because %w", filename, err) + } else if err == nil { + if bytes.Equal(bs, old) { + // files are the same don't rewrite it. + return nil + } + } + file, err := os.Create(filename) if err != nil { return fmt.Errorf("failed to create file %s because %w", filename, err) diff --git a/modules/charset/invisible/generate.go b/modules/charset/invisible/generate.go index 230ff0b832169..39eddd58dd5a2 100644 --- a/modules/charset/invisible/generate.go +++ b/modules/charset/invisible/generate.go @@ -63,6 +63,17 @@ func runTemplate(t *template.Template, filename string, data interface{}) error verbosef("Bad source:\n%s", buf.String()) return fmt.Errorf("unable to format source: %w", err) } + + old, err := os.ReadFile(filename) + if err != nil && !os.IsNotExist(err) { + return fmt.Errorf("failed to read old file %s because %w", filename, err) + } else if err == nil { + if bytes.Equal(bs, old) { + // files are the same don't rewrite it. + return nil + } + } + file, err := os.Create(filename) if err != nil { return fmt.Errorf("failed to create file %s because %w", filename, err) diff --git a/options/locale/locale_pt-PT.ini b/options/locale/locale_pt-PT.ini index 611ef8b40e841..d0b72fb3ac113 100644 --- a/options/locale/locale_pt-PT.ini +++ b/options/locale/locale_pt-PT.ini @@ -1956,6 +1956,8 @@ settings.event_delete=Eliminar settings.event_delete_desc=Ramo ou etiqueta eliminados. settings.event_fork=Derivar settings.event_fork_desc=Feita a derivação do repositório. +settings.event_wiki=Wiki +settings.event_wiki_desc=Página do wiki criada, renomeada, editada ou eliminada. settings.event_release=Lançamento settings.event_release_desc=Lançamento publicado, modificado ou eliminado num repositório. settings.event_push=Enviar diff --git a/services/migrations/dump.go b/services/migrations/dump.go index 2dc35b9d9fbef..188f2775e07b0 100644 --- a/services/migrations/dump.go +++ b/services/migrations/dump.go @@ -26,7 +26,6 @@ import ( "code.gitea.io/gitea/modules/structs" "github.com/google/uuid" - "gopkg.in/yaml.v2" ) diff --git a/templates/repo/home.tmpl b/templates/repo/home.tmpl index fd1b60bef8284..69af36ac68028 100644 --- a/templates/repo/home.tmpl +++ b/templates/repo/home.tmpl @@ -73,32 +73,33 @@ {{end}} {{svg "octicon-file-moved" 15}} - {{if or .CanAddFile .CanUploadFile}} - - {{end}} - {{else}} + {{if .CanUploadFile}} + + {{.locale.Tr "repo.editor.upload_file"}} + + {{end}} + {{if .CanAddFile}} + + {{.locale.Tr "repo.editor.patch"}} + + {{end}} + {{end}} + + {{svg "octicon-triangle-down" 14 "dropdown icon"}} + + {{end}} + {{if ne $n 0}} {{EllipsisString .Repository.Name 30}}{{range $i, $v := .TreeNames}}/{{if eq $i $l}}{{EllipsisString $v 30}}{{else}}{{$p := index $.Paths $i}}{{EllipsisString $v 30}}{{end}}{{end}} {{end}} diff --git a/templates/repo/sub_menu.tmpl b/templates/repo/sub_menu.tmpl index 7ba234dccfad2..e63cb50df1bb8 100644 --- a/templates/repo/sub_menu.tmpl +++ b/templates/repo/sub_menu.tmpl @@ -39,7 +39,7 @@ {{range .LanguageStats}} -
 
+
 
{{end}}
{{end}} diff --git a/tests/integration/compare_test.go b/tests/integration/compare_test.go index 7642109dd9573..134ae520a8762 100644 --- a/tests/integration/compare_test.go +++ b/tests/integration/compare_test.go @@ -10,6 +10,7 @@ import ( "testing" "code.gitea.io/gitea/tests" + "github.com/stretchr/testify/assert" ) diff --git a/tests/integration/cors_test.go b/tests/integration/cors_test.go index f5318016276f3..c702c62e48df6 100644 --- a/tests/integration/cors_test.go +++ b/tests/integration/cors_test.go @@ -9,6 +9,7 @@ import ( "testing" "code.gitea.io/gitea/tests" + "github.com/stretchr/testify/assert" ) diff --git a/tests/integration/nonascii_branches_test.go b/tests/integration/nonascii_branches_test.go index ae69506f1b563..638b9a61643e9 100644 --- a/tests/integration/nonascii_branches_test.go +++ b/tests/integration/nonascii_branches_test.go @@ -11,6 +11,7 @@ import ( "testing" "code.gitea.io/gitea/tests" + "github.com/stretchr/testify/assert" ) diff --git a/tests/integration/pull_compare_test.go b/tests/integration/pull_compare_test.go index 7934b6e77c05a..60e69e97eb3f2 100644 --- a/tests/integration/pull_compare_test.go +++ b/tests/integration/pull_compare_test.go @@ -9,6 +9,7 @@ import ( "testing" "code.gitea.io/gitea/tests" + "github.com/stretchr/testify/assert" ) diff --git a/tests/integration/pull_create_test.go b/tests/integration/pull_create_test.go index 24c73ab4e9c9b..b5cb7877bc9d8 100644 --- a/tests/integration/pull_create_test.go +++ b/tests/integration/pull_create_test.go @@ -13,6 +13,7 @@ import ( "testing" "code.gitea.io/gitea/tests" + "github.com/stretchr/testify/assert" ) diff --git a/tests/integration/repo_commits_search_test.go b/tests/integration/repo_commits_search_test.go index 75e692f0abdc3..83f30758a419b 100644 --- a/tests/integration/repo_commits_search_test.go +++ b/tests/integration/repo_commits_search_test.go @@ -11,6 +11,7 @@ import ( "testing" "code.gitea.io/gitea/tests" + "github.com/stretchr/testify/assert" ) diff --git a/tests/integration/view_test.go b/tests/integration/view_test.go index 63544dbe35195..f55afb038c980 100644 --- a/tests/integration/view_test.go +++ b/tests/integration/view_test.go @@ -9,6 +9,7 @@ import ( "testing" "code.gitea.io/gitea/tests" + "github.com/stretchr/testify/assert" )