[CHORE] Remove Microsoft SQL Server Support
- Per https://codeberg.org/forgejo/discussions/issues/122
This commit is contained in:
		
					parent
					
						
							
								af47c583b4
							
						
					
				
			
			
				commit
				
					
						2d9afd0c21
					
				
			
		
					 70 changed files with 70 additions and 789 deletions
				
			
		| 
						 | 
				
			
			@ -87,4 +87,3 @@ body:
 | 
			
		|||
    - SQLite
 | 
			
		||||
    - PostgreSQL
 | 
			
		||||
    - MySQL
 | 
			
		||||
    - MSSQL
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										61
									
								
								Makefile
									
										
									
									
									
								
							
							
						
						
									
										61
									
								
								Makefile
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -196,10 +196,6 @@ TEST_PGSQL_DBNAME ?= testgitea
 | 
			
		|||
TEST_PGSQL_USERNAME ?= postgres
 | 
			
		||||
TEST_PGSQL_PASSWORD ?= postgres
 | 
			
		||||
TEST_PGSQL_SCHEMA ?= gtestschema
 | 
			
		||||
TEST_MSSQL_HOST ?= mssql:1433
 | 
			
		||||
TEST_MSSQL_DBNAME ?= gitea
 | 
			
		||||
TEST_MSSQL_USERNAME ?= sa
 | 
			
		||||
TEST_MSSQL_PASSWORD ?= MwantsaSecurePassword1
 | 
			
		||||
 | 
			
		||||
.PHONY: all
 | 
			
		||||
all: build
 | 
			
		||||
| 
						 | 
				
			
			@ -309,7 +305,7 @@ clean:
 | 
			
		|||
		e2e*.test \
 | 
			
		||||
		tests/integration/gitea-integration-* \
 | 
			
		||||
		tests/integration/indexers-* \
 | 
			
		||||
		tests/mysql.ini tests/pgsql.ini tests/mssql.ini man/ \
 | 
			
		||||
		tests/mysql.ini tests/pgsql.ini man/ \
 | 
			
		||||
		tests/e2e/gitea-e2e-*/ \
 | 
			
		||||
		tests/e2e/indexers-*/ \
 | 
			
		||||
		tests/e2e/reports/ tests/e2e/test-artifacts/ tests/e2e/test-snapshots/
 | 
			
		||||
| 
						 | 
				
			
			@ -612,27 +608,6 @@ test-pgsql\#%: integrations.pgsql.test generate-ini-pgsql
 | 
			
		|||
.PHONY: test-pgsql-migration
 | 
			
		||||
test-pgsql-migration: migrations.pgsql.test migrations.individual.pgsql.test
 | 
			
		||||
 | 
			
		||||
generate-ini-mssql:
 | 
			
		||||
	sed -e 's|{{TEST_MSSQL_HOST}}|${TEST_MSSQL_HOST}|g' \
 | 
			
		||||
		-e 's|{{TEST_MSSQL_DBNAME}}|${TEST_MSSQL_DBNAME}|g' \
 | 
			
		||||
		-e 's|{{TEST_MSSQL_USERNAME}}|${TEST_MSSQL_USERNAME}|g' \
 | 
			
		||||
		-e 's|{{TEST_MSSQL_PASSWORD}}|${TEST_MSSQL_PASSWORD}|g' \
 | 
			
		||||
		-e 's|{{REPO_TEST_DIR}}|${REPO_TEST_DIR}|g' \
 | 
			
		||||
		-e 's|{{TEST_LOGGER}}|$(or $(TEST_LOGGER),test$(COMMA)file)|g' \
 | 
			
		||||
		-e 's|{{TEST_TYPE}}|$(or $(TEST_TYPE),integration)|g' \
 | 
			
		||||
			tests/mssql.ini.tmpl > tests/mssql.ini
 | 
			
		||||
 | 
			
		||||
.PHONY: test-mssql
 | 
			
		||||
test-mssql: integrations.mssql.test generate-ini-mssql
 | 
			
		||||
	GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/mssql.ini ./integrations.mssql.test
 | 
			
		||||
 | 
			
		||||
.PHONY: test-mssql\#%
 | 
			
		||||
test-mssql\#%: integrations.mssql.test generate-ini-mssql
 | 
			
		||||
	GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/mssql.ini ./integrations.mssql.test -test.run $(subst .,/,$*)
 | 
			
		||||
 | 
			
		||||
.PHONY: test-mssql-migration
 | 
			
		||||
test-mssql-migration: migrations.mssql.test migrations.individual.mssql.test
 | 
			
		||||
 | 
			
		||||
.PHONY: playwright
 | 
			
		||||
playwright: deps-frontend
 | 
			
		||||
	npx playwright install $(PLAYWRIGHT_FLAGS)
 | 
			
		||||
| 
						 | 
				
			
			@ -669,14 +644,6 @@ test-e2e-pgsql: playwright e2e.pgsql.test generate-ini-pgsql
 | 
			
		|||
test-e2e-pgsql\#%: playwright e2e.pgsql.test generate-ini-pgsql
 | 
			
		||||
	GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/pgsql.ini ./e2e.pgsql.test -test.run TestE2e/$*
 | 
			
		||||
 | 
			
		||||
.PHONY: test-e2e-mssql
 | 
			
		||||
test-e2e-mssql: playwright e2e.mssql.test generate-ini-mssql
 | 
			
		||||
	GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/mssql.ini ./e2e.mssql.test -test.run TestE2e
 | 
			
		||||
 | 
			
		||||
.PHONY: test-e2e-mssql\#%
 | 
			
		||||
test-e2e-mssql\#%: playwright e2e.mssql.test generate-ini-mssql
 | 
			
		||||
	GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/mssql.ini ./e2e.mssql.test -test.run TestE2e/$*
 | 
			
		||||
 | 
			
		||||
.PHONY: test-e2e-debugserver
 | 
			
		||||
test-e2e-debugserver: e2e.sqlite.test generate-ini-sqlite
 | 
			
		||||
	sed -i s/3003/3000/g tests/sqlite.ini
 | 
			
		||||
| 
						 | 
				
			
			@ -690,10 +657,6 @@ bench-sqlite: integrations.sqlite.test generate-ini-sqlite
 | 
			
		|||
bench-mysql: integrations.mysql.test generate-ini-mysql
 | 
			
		||||
	GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/mysql.ini ./integrations.mysql.test -test.cpuprofile=cpu.out -test.run DontRunTests -test.bench .
 | 
			
		||||
 | 
			
		||||
.PHONY: bench-mssql
 | 
			
		||||
bench-mssql: integrations.mssql.test generate-ini-mssql
 | 
			
		||||
	GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/mssql.ini ./integrations.mssql.test -test.cpuprofile=cpu.out -test.run DontRunTests -test.bench .
 | 
			
		||||
 | 
			
		||||
.PHONY: bench-pgsql
 | 
			
		||||
bench-pgsql: integrations.pgsql.test generate-ini-pgsql
 | 
			
		||||
	GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/pgsql.ini ./integrations.pgsql.test -test.cpuprofile=cpu.out -test.run DontRunTests -test.bench .
 | 
			
		||||
| 
						 | 
				
			
			@ -712,9 +675,6 @@ integrations.mysql.test: git-check $(GO_SOURCES)
 | 
			
		|||
integrations.pgsql.test: git-check $(GO_SOURCES)
 | 
			
		||||
	$(GO) test $(GOTESTFLAGS) -c code.gitea.io/gitea/tests/integration -o integrations.pgsql.test
 | 
			
		||||
 | 
			
		||||
integrations.mssql.test: git-check $(GO_SOURCES)
 | 
			
		||||
	$(GO) test $(GOTESTFLAGS) -c code.gitea.io/gitea/tests/integration -o integrations.mssql.test
 | 
			
		||||
 | 
			
		||||
integrations.sqlite.test: git-check $(GO_SOURCES)
 | 
			
		||||
	$(GO) test $(GOTESTFLAGS) -c code.gitea.io/gitea/tests/integration -o integrations.sqlite.test -tags '$(TEST_TAGS)'
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -734,11 +694,6 @@ migrations.pgsql.test: $(GO_SOURCES) generate-ini-pgsql
 | 
			
		|||
	$(GO) test $(GOTESTFLAGS) -c code.gitea.io/gitea/tests/integration/migration-test -o migrations.pgsql.test
 | 
			
		||||
	GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/pgsql.ini ./migrations.pgsql.test
 | 
			
		||||
 | 
			
		||||
.PHONY: migrations.mssql.test
 | 
			
		||||
migrations.mssql.test: $(GO_SOURCES) generate-ini-mssql
 | 
			
		||||
	$(GO) test $(GOTESTFLAGS) -c code.gitea.io/gitea/tests/integration/migration-test -o migrations.mssql.test
 | 
			
		||||
	GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/mssql.ini ./migrations.mssql.test
 | 
			
		||||
 | 
			
		||||
.PHONY: migrations.sqlite.test
 | 
			
		||||
migrations.sqlite.test: $(GO_SOURCES) generate-ini-sqlite
 | 
			
		||||
	$(GO) test $(GOTESTFLAGS) -c code.gitea.io/gitea/tests/integration/migration-test -o migrations.sqlite.test -tags '$(TEST_TAGS)'
 | 
			
		||||
| 
						 | 
				
			
			@ -764,17 +719,6 @@ migrations.individual.pgsql.test: $(GO_SOURCES)
 | 
			
		|||
migrations.individual.pgsql.test\#%: $(GO_SOURCES) generate-ini-pgsql
 | 
			
		||||
	GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/pgsql.ini $(GO) test $(GOTESTFLAGS) -tags '$(TEST_TAGS)' code.gitea.io/gitea/models/migrations/$*
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
.PHONY: migrations.individual.mssql.test
 | 
			
		||||
migrations.individual.mssql.test: $(GO_SOURCES) generate-ini-mssql
 | 
			
		||||
	for pkg in $(MIGRATION_PACKAGES); do \
 | 
			
		||||
		GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/mssql.ini $(GO) test $(GOTESTFLAGS) -tags '$(TEST_TAGS)' -test.failfast $$pkg || exit 1; \
 | 
			
		||||
	done
 | 
			
		||||
 | 
			
		||||
.PHONY: migrations.individual.mssql.test\#%
 | 
			
		||||
migrations.individual.mssql.test\#%: $(GO_SOURCES) generate-ini-mssql
 | 
			
		||||
	GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/mssql.ini $(GO) test $(GOTESTFLAGS) -tags '$(TEST_TAGS)' code.gitea.io/gitea/models/migrations/$*
 | 
			
		||||
 | 
			
		||||
.PHONY: migrations.individual.sqlite.test
 | 
			
		||||
migrations.individual.sqlite.test: $(GO_SOURCES) generate-ini-sqlite
 | 
			
		||||
	for pkg in $(MIGRATION_PACKAGES); do \
 | 
			
		||||
| 
						 | 
				
			
			@ -791,9 +735,6 @@ e2e.mysql.test: $(GO_SOURCES)
 | 
			
		|||
e2e.pgsql.test: $(GO_SOURCES)
 | 
			
		||||
	$(GO) test $(GOTESTFLAGS) -c code.gitea.io/gitea/tests/e2e -o e2e.pgsql.test
 | 
			
		||||
 | 
			
		||||
e2e.mssql.test: $(GO_SOURCES)
 | 
			
		||||
	$(GO) test $(GOTESTFLAGS) -c code.gitea.io/gitea/tests/e2e -o e2e.mssql.test
 | 
			
		||||
 | 
			
		||||
e2e.sqlite.test: $(GO_SOURCES)
 | 
			
		||||
	$(GO) test $(GOTESTFLAGS) -c code.gitea.io/gitea/tests/e2e -o e2e.sqlite.test -tags '$(TEST_TAGS)'
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										15
									
								
								assets/go-licenses.json
									
										
									
										generated
									
									
									
								
							
							
						
						
									
										15
									
								
								assets/go-licenses.json
									
										
									
										generated
									
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							| 
						 | 
				
			
			@ -17,7 +17,7 @@ import (
 | 
			
		|||
var cmdDoctorConvert = &cli.Command{
 | 
			
		||||
	Name:        "convert",
 | 
			
		||||
	Usage:       "Convert the database",
 | 
			
		||||
	Description: "A command to convert an existing MySQL database from utf8 to utf8mb4 or MSSQL database from varchar to nvarchar",
 | 
			
		||||
	Description: "A command to convert an existing MySQL database from utf8 to utf8mb4",
 | 
			
		||||
	Action:      runDoctorConvert,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -35,21 +35,14 @@ func runDoctorConvert(ctx *cli.Context) error {
 | 
			
		|||
	log.Info("Log path: %s", setting.Log.RootPath)
 | 
			
		||||
	log.Info("Configuration file: %s", setting.CustomConf)
 | 
			
		||||
 | 
			
		||||
	switch {
 | 
			
		||||
	case setting.Database.Type.IsMySQL():
 | 
			
		||||
	if setting.Database.Type.IsMySQL() {
 | 
			
		||||
		if err := db.ConvertDatabaseTable(); err != nil {
 | 
			
		||||
			log.Fatal("Failed to convert database & table: %v", err)
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
		fmt.Println("Converted successfully, please confirm your database's character set is now utf8mb4")
 | 
			
		||||
	case setting.Database.Type.IsMSSQL():
 | 
			
		||||
		if err := db.ConvertVarcharToNVarchar(); err != nil {
 | 
			
		||||
			log.Fatal("Failed to convert database from varchar to nvarchar: %v", err)
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
		fmt.Println("Converted successfully, please confirm your database's all columns character is NVARCHAR now")
 | 
			
		||||
	default:
 | 
			
		||||
		fmt.Println("This command can only be used with a MySQL or MSSQL database")
 | 
			
		||||
	} else {
 | 
			
		||||
		fmt.Println("This command can only be used with a MySQL database")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -128,7 +128,7 @@ It can be used for backup and capture Forgejo server image to send to maintainer
 | 
			
		|||
		&cli.StringFlag{
 | 
			
		||||
			Name:    "database",
 | 
			
		||||
			Aliases: []string{"d"},
 | 
			
		||||
			Usage:   "Specify the database SQL syntax: sqlite3, mysql, mssql, postgres",
 | 
			
		||||
			Usage:   "Specify the database SQL syntax: sqlite3, mysql, postgres",
 | 
			
		||||
		},
 | 
			
		||||
		&cli.BoolFlag{
 | 
			
		||||
			Name:    "skip-repository",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										3
									
								
								go.mod
									
										
									
									
									
								
							
							
						
						
									
										3
									
								
								go.mod
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -22,7 +22,6 @@ require (
 | 
			
		|||
	github.com/buildkite/terminal-to-html/v3 v3.10.1
 | 
			
		||||
	github.com/caddyserver/certmagic v0.20.0
 | 
			
		||||
	github.com/chi-middleware/proxy v1.1.1
 | 
			
		||||
	github.com/denisenkom/go-mssqldb v0.12.3
 | 
			
		||||
	github.com/dimiro1/reply v0.0.0-20200315094148-d0136a4c9e21
 | 
			
		||||
	github.com/djherbis/buffer v1.2.0
 | 
			
		||||
	github.com/djherbis/nio/v3 v3.0.1
 | 
			
		||||
| 
						 | 
				
			
			@ -193,8 +192,6 @@ require (
 | 
			
		|||
	github.com/go-webauthn/x v0.1.6 // indirect
 | 
			
		||||
	github.com/goccy/go-json v0.10.2 // indirect
 | 
			
		||||
	github.com/golang-jwt/jwt/v4 v4.5.0 // indirect
 | 
			
		||||
	github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 // indirect
 | 
			
		||||
	github.com/golang-sql/sqlexp v0.1.0 // indirect
 | 
			
		||||
	github.com/golang/geo v0.0.0-20230421003525-6adc56603217 // indirect
 | 
			
		||||
	github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
 | 
			
		||||
	github.com/golang/protobuf v1.5.3 // indirect
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										10
									
								
								go.sum
									
										
									
									
									
								
							
							
						
						
									
										10
									
								
								go.sum
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -70,9 +70,6 @@ github.com/42wim/sshsig v0.0.0-20211121163825-841cf5bbc121 h1:r3qt8PCHnfjOv9PN3H
 | 
			
		|||
github.com/42wim/sshsig v0.0.0-20211121163825-841cf5bbc121/go.mod h1:Ock8XgA7pvULhIaHGAk/cDnRfNrF9Jey81nPcc403iU=
 | 
			
		||||
github.com/6543/go-version v1.3.1 h1:HvOp+Telns7HWJ2Xo/05YXQSB2bE0WmVgbHqwMPZT4U=
 | 
			
		||||
github.com/6543/go-version v1.3.1/go.mod h1:oqFAHCwtLVUTLdhQmVZWYvaHXTdsbB4SY85at64SQEo=
 | 
			
		||||
github.com/Azure/azure-sdk-for-go/sdk/azcore v0.19.0/go.mod h1:h6H6c8enJmmocHUbLiiGY6sx7f9i+X3m1CHdd5c6Rdw=
 | 
			
		||||
github.com/Azure/azure-sdk-for-go/sdk/azidentity v0.11.0/go.mod h1:HcM1YX14R7CJcghJGOYCgdezslRSVzqwLf/q+4Y2r/0=
 | 
			
		||||
github.com/Azure/azure-sdk-for-go/sdk/internal v0.7.0/go.mod h1:yqy467j36fJxcRV2TzfVZ1pCb5vxm4BtZPUdYWe/Xo8=
 | 
			
		||||
github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358 h1:mFRzDkZVAjdal+s7s0MwaRv9igoPqLRdzOLzw/8Xvq8=
 | 
			
		||||
github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358/go.mod h1:chxPXzSsl7ZWRAuOIE23GDNzjWuZquvFlgA8xmpunjU=
 | 
			
		||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
 | 
			
		||||
| 
						 | 
				
			
			@ -236,7 +233,6 @@ github.com/dlclark/regexp2 v1.4.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55k
 | 
			
		|||
github.com/dlclark/regexp2 v1.7.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=
 | 
			
		||||
github.com/dlclark/regexp2 v1.11.0 h1:G/nrcoOa7ZXlpoa/91N3X7mM3r8eIlMBBJZvsz/mxKI=
 | 
			
		||||
github.com/dlclark/regexp2 v1.11.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=
 | 
			
		||||
github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ=
 | 
			
		||||
github.com/dsnet/compress v0.0.2-0.20210315054119-f66993602bf5 h1:iFaUwBSo5Svw6L7HYpRu/0lE3e0BaElwnNO1qkNQxBY=
 | 
			
		||||
github.com/dsnet/compress v0.0.2-0.20210315054119-f66993602bf5/go.mod h1:qssHWj60/X5sZFNxpG4HBPDHVqxNm4DfnCKgrbZOT+s=
 | 
			
		||||
github.com/dsnet/golib v0.0.0-20171103203638-1ea166775780/go.mod h1:Lj+Z9rebOhdfkVLjJ8T6VcRQv3SXugXy999NBtR9aFY=
 | 
			
		||||
| 
						 | 
				
			
			@ -376,7 +372,6 @@ github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOW
 | 
			
		|||
github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
 | 
			
		||||
github.com/golang-jwt/jwt/v5 v5.2.0 h1:d/ix8ftRUorsN+5eMIlF4T6J8CAt9rch3My2winC1Jw=
 | 
			
		||||
github.com/golang-jwt/jwt/v5 v5.2.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk=
 | 
			
		||||
github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0=
 | 
			
		||||
github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 h1:au07oEsX2xN0ktxqI+Sida1w446QrXBRJ0nee3SNZlA=
 | 
			
		||||
github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0=
 | 
			
		||||
github.com/golang-sql/sqlexp v0.1.0 h1:ZCD6MBpcuOVfGVqsEmY5/4FtYiKz6tSyUv9LPEDei6A=
 | 
			
		||||
| 
						 | 
				
			
			@ -640,7 +635,6 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w
 | 
			
		|||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
 | 
			
		||||
github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
 | 
			
		||||
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
 | 
			
		||||
github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8=
 | 
			
		||||
github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc=
 | 
			
		||||
github.com/mrjones/oauth v0.0.0-20180629183705-f4e24b6d100c/go.mod h1:skjdDftzkFALcuGzYSklqYd8gvat6F1gZJ4YPVbkZpM=
 | 
			
		||||
github.com/mrjones/oauth v0.0.0-20190623134757-126b35219450 h1:j2kD3MT1z4PXCiUllUJF9mWUESr9TWKS7iEKsQ/IipM=
 | 
			
		||||
| 
						 | 
				
			
			@ -691,7 +685,6 @@ github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ
 | 
			
		|||
github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
 | 
			
		||||
github.com/pjbgf/sha1cd v0.3.0 h1:4D5XXmUUBUl/xQ6IjCkEAbqXskkq/4O7LmGn0AqMDs4=
 | 
			
		||||
github.com/pjbgf/sha1cd v0.3.0/go.mod h1:nZ1rrWOcGJ5uZgEEVL1VUM9iRQiZvWdbZjkKyFzPPsI=
 | 
			
		||||
github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4/go.mod h1:4OwLy04Bl9Ef3GJJCoec+30X3LQs/0/m4HFRt/2LUSA=
 | 
			
		||||
github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
 | 
			
		||||
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
 | 
			
		||||
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 | 
			
		||||
| 
						 | 
				
			
			@ -887,7 +880,6 @@ golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8U
 | 
			
		|||
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
 | 
			
		||||
| 
						 | 
				
			
			@ -969,7 +961,6 @@ golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81R
 | 
			
		|||
golang.org/x/net v0.0.0-20200927032502-5d4f70055728/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
 | 
			
		||||
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
 | 
			
		||||
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
 | 
			
		||||
golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 | 
			
		||||
golang.org/x/net v0.0.0-20210916014120-12bc252f5db8/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 | 
			
		||||
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 | 
			
		||||
golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
 | 
			
		||||
| 
						 | 
				
			
			@ -1264,7 +1255,6 @@ gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 | 
			
		|||
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
 | 
			
		||||
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
 | 
			
		||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 | 
			
		||||
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 | 
			
		||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
 | 
			
		||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 | 
			
		||||
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -39,12 +39,8 @@ func getUserHeatmapData(ctx context.Context, user *user_model.User, team *organi
 | 
			
		|||
	// Group by 15 minute intervals which will allow the client to accurately shift the timestamp to their timezone.
 | 
			
		||||
	// The interval is based on the fact that there are timezones such as UTC +5:30 and UTC +12:45.
 | 
			
		||||
	groupBy := "created_unix / 900 * 900"
 | 
			
		||||
	groupByName := "timestamp" // We need this extra case because mssql doesn't allow grouping by alias
 | 
			
		||||
	switch {
 | 
			
		||||
	case setting.Database.Type.IsMySQL():
 | 
			
		||||
	if setting.Database.Type.IsMySQL() {
 | 
			
		||||
		groupBy = "created_unix DIV 900 * 900"
 | 
			
		||||
	case setting.Database.Type.IsMSSQL():
 | 
			
		||||
		groupByName = groupBy
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	cond, err := activityQueryCondition(ctx, GetFeedsOptions{
 | 
			
		||||
| 
						 | 
				
			
			@ -67,7 +63,7 @@ func getUserHeatmapData(ctx context.Context, user *user_model.User, team *organi
 | 
			
		|||
		Table("action").
 | 
			
		||||
		Where(cond).
 | 
			
		||||
		And("created_unix > ?", timeutil.TimeStampNow()-31536000).
 | 
			
		||||
		GroupBy(groupByName).
 | 
			
		||||
		GroupBy("timestamp").
 | 
			
		||||
		OrderBy("timestamp").
 | 
			
		||||
		Find(&hdata)
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -41,20 +41,6 @@ func findAvailableCollationsMySQL(x *xorm.Engine) (ret container.Set[string], er
 | 
			
		|||
	return ret, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func findAvailableCollationsMSSQL(x *xorm.Engine) (ret container.Set[string], err error) {
 | 
			
		||||
	var res []struct {
 | 
			
		||||
		Name string
 | 
			
		||||
	}
 | 
			
		||||
	if err = x.SQL("SELECT * FROM sys.fn_helpcollations() WHERE name LIKE '%[_]CS[_]AS%'").Find(&res); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	ret = make(container.Set[string], len(res))
 | 
			
		||||
	for _, r := range res {
 | 
			
		||||
		ret.Add(r.Name)
 | 
			
		||||
	}
 | 
			
		||||
	return ret, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func CheckCollations(x *xorm.Engine) (*CheckCollationsResult, error) {
 | 
			
		||||
	dbTables, err := x.DBMetas()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
| 
						 | 
				
			
			@ -84,18 +70,6 @@ func CheckCollations(x *xorm.Engine) (*CheckCollationsResult, error) {
 | 
			
		|||
			// At the moment, it's safe to ignore the database difference, just trim the prefix and compare. It could be fixed easily if there is any problem in the future.
 | 
			
		||||
			return a == b || strings.TrimPrefix(a, "utf8mb4_") == strings.TrimPrefix(b, "utf8mb4_")
 | 
			
		||||
		}
 | 
			
		||||
	} else if x.Dialect().URI().DBType == schemas.MSSQL {
 | 
			
		||||
		if _, err = x.SQL("SELECT DATABASEPROPERTYEX(DB_NAME(), 'Collation')").Get(&res.DatabaseCollation); err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
		res.IsCollationCaseSensitive = func(s string) bool {
 | 
			
		||||
			return strings.HasSuffix(s, "_CS_AS")
 | 
			
		||||
		}
 | 
			
		||||
		candidateCollations = []string{"Latin1_General_CS_AS"}
 | 
			
		||||
		res.AvailableCollation, err = findAvailableCollationsMSSQL(x)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
		return nil, nil
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -146,10 +120,6 @@ func alterDatabaseCollation(x *xorm.Engine, collation string) error {
 | 
			
		|||
	if x.Dialect().URI().DBType == schemas.MYSQL {
 | 
			
		||||
		_, err := x.Exec("ALTER DATABASE CHARACTER SET utf8mb4 COLLATE " + collation)
 | 
			
		||||
		return err
 | 
			
		||||
	} else if x.Dialect().URI().DBType == schemas.MSSQL {
 | 
			
		||||
		// TODO: MSSQL has many limitations on changing database collation, it could fail in many cases.
 | 
			
		||||
		_, err := x.Exec("ALTER DATABASE CURRENT COLLATE " + collation)
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	return errors.New("unsupported database type")
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -165,12 +135,11 @@ func preprocessDatabaseCollation(x *xorm.Engine) {
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	// try to alter database collation to expected if the database is empty, it might fail in some cases (and it isn't necessary to succeed)
 | 
			
		||||
	// at the moment, there is no "altering" solution for MSSQL, site admin should manually change the database collation
 | 
			
		||||
	// at the moment.
 | 
			
		||||
	if !r.CollationEquals(r.DatabaseCollation, r.ExpectedCollation) && r.ExistingTableNumber == 0 {
 | 
			
		||||
		if err = alterDatabaseCollation(x, r.ExpectedCollation); err != nil {
 | 
			
		||||
			log.Error("Failed to change database collation to %q: %v", r.ExpectedCollation, err)
 | 
			
		||||
		} else {
 | 
			
		||||
			_, _ = x.Exec("SELECT 1") // after "altering", MSSQL's session becomes invalid, so make a simple query to "refresh" the session
 | 
			
		||||
			if r, err = CheckCollations(x); err != nil {
 | 
			
		||||
				log.Error("Failed to check database collation again after altering: %v", err) // impossible case
 | 
			
		||||
				return
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -47,8 +47,6 @@ func BuilderDialect() string {
 | 
			
		|||
		return builder.SQLITE
 | 
			
		||||
	case setting.Database.Type.IsPostgreSQL():
 | 
			
		||||
		return builder.POSTGRES
 | 
			
		||||
	case setting.Database.Type.IsMSSQL():
 | 
			
		||||
		return builder.MSSQL
 | 
			
		||||
	default:
 | 
			
		||||
		return ""
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -47,33 +47,6 @@ func ConvertDatabaseTable() error {
 | 
			
		|||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ConvertVarcharToNVarchar converts database and tables from varchar to nvarchar if it's mssql
 | 
			
		||||
func ConvertVarcharToNVarchar() error {
 | 
			
		||||
	if x.Dialect().URI().DBType != schemas.MSSQL {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	sess := x.NewSession()
 | 
			
		||||
	defer sess.Close()
 | 
			
		||||
	res, err := sess.QuerySliceString(`SELECT 'ALTER TABLE ' + OBJECT_NAME(SC.object_id) + ' MODIFY SC.name NVARCHAR(' + CONVERT(VARCHAR(5),SC.max_length) + ')'
 | 
			
		||||
FROM SYS.columns SC
 | 
			
		||||
JOIN SYS.types ST
 | 
			
		||||
ON SC.system_type_id = ST.system_type_id
 | 
			
		||||
AND SC.user_type_id = ST.user_type_id
 | 
			
		||||
WHERE ST.name ='varchar'`)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	for _, row := range res {
 | 
			
		||||
		if len(row) == 1 {
 | 
			
		||||
			if _, err = sess.Exec(row[0]); err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Cell2Int64 converts a xorm.Cell type to int64,
 | 
			
		||||
// and handles possible irregular cases.
 | 
			
		||||
func Cell2Int64(val xorm.Cell) int64 {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -22,9 +22,8 @@ import (
 | 
			
		|||
	"xorm.io/xorm/names"
 | 
			
		||||
	"xorm.io/xorm/schemas"
 | 
			
		||||
 | 
			
		||||
	_ "github.com/denisenkom/go-mssqldb" // Needed for the MSSQL driver
 | 
			
		||||
	_ "github.com/go-sql-driver/mysql"   // Needed for the MySQL driver
 | 
			
		||||
	_ "github.com/lib/pq"                // Needed for the Postgresql driver
 | 
			
		||||
	_ "github.com/go-sql-driver/mysql" // Needed for the MySQL driver
 | 
			
		||||
	_ "github.com/lib/pq"              // Needed for the Postgresql driver
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
| 
						 | 
				
			
			@ -114,10 +113,8 @@ func newXORMEngine() (*xorm.Engine, error) {
 | 
			
		|||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	if setting.Database.Type == "mysql" {
 | 
			
		||||
	if setting.Database.Type.IsMySQL() {
 | 
			
		||||
		engine.Dialect().SetParams(map[string]string{"rowFormat": "DYNAMIC"})
 | 
			
		||||
	} else if setting.Database.Type == "mssql" {
 | 
			
		||||
		engine.Dialect().SetParams(map[string]string{"DEFAULT_VARCHAR": "nvarchar"})
 | 
			
		||||
	}
 | 
			
		||||
	engine.SetSchema(setting.Database.Schema)
 | 
			
		||||
	return engine, nil
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -89,33 +89,6 @@ func mysqlGetNextResourceIndex(ctx context.Context, tableName string, groupID in
 | 
			
		|||
	return idx, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func mssqlGetNextResourceIndex(ctx context.Context, tableName string, groupID int64) (int64, error) {
 | 
			
		||||
	if _, err := GetEngine(ctx).Exec(fmt.Sprintf(`
 | 
			
		||||
MERGE INTO %s WITH (HOLDLOCK) AS target
 | 
			
		||||
USING (SELECT %d AS group_id) AS source
 | 
			
		||||
(group_id)
 | 
			
		||||
ON target.group_id = source.group_id
 | 
			
		||||
WHEN MATCHED
 | 
			
		||||
	THEN UPDATE
 | 
			
		||||
			SET max_index = max_index + 1
 | 
			
		||||
WHEN NOT MATCHED
 | 
			
		||||
	THEN INSERT (group_id, max_index)
 | 
			
		||||
			VALUES (%d, 1);
 | 
			
		||||
`, tableName, groupID, groupID)); err != nil {
 | 
			
		||||
		return 0, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var idx int64
 | 
			
		||||
	_, err := GetEngine(ctx).SQL(fmt.Sprintf("SELECT max_index FROM %s WHERE group_id = ?", tableName), groupID).Get(&idx)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return 0, err
 | 
			
		||||
	}
 | 
			
		||||
	if idx == 0 {
 | 
			
		||||
		return 0, errors.New("cannot get the correct index")
 | 
			
		||||
	}
 | 
			
		||||
	return idx, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetNextResourceIndex generates a resource index, it must run in the same transaction where the resource is created
 | 
			
		||||
func GetNextResourceIndex(ctx context.Context, tableName string, groupID int64) (int64, error) {
 | 
			
		||||
	switch {
 | 
			
		||||
| 
						 | 
				
			
			@ -123,8 +96,6 @@ func GetNextResourceIndex(ctx context.Context, tableName string, groupID int64)
 | 
			
		|||
		return postgresGetNextResourceIndex(ctx, tableName, groupID)
 | 
			
		||||
	case setting.Database.Type.IsMySQL():
 | 
			
		||||
		return mysqlGetNextResourceIndex(ctx, tableName, groupID)
 | 
			
		||||
	case setting.Database.Type.IsMSSQL():
 | 
			
		||||
		return mssqlGetNextResourceIndex(ctx, tableName, groupID)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	e := GetEngine(ctx)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -103,7 +103,7 @@ func (err ErrBranchesEqual) Unwrap() error {
 | 
			
		|||
type Branch struct {
 | 
			
		||||
	ID            int64
 | 
			
		||||
	RepoID        int64  `xorm:"UNIQUE(s)"`
 | 
			
		||||
	Name          string `xorm:"UNIQUE(s) NOT NULL"` // git's ref-name is case-sensitive internally, however, in some databases (mssql, mysql, by default), it's case-insensitive at the moment
 | 
			
		||||
	Name          string `xorm:"UNIQUE(s) NOT NULL"` // git's ref-name is case-sensitive internally, however, in some databases (mysql, by default), it's case-insensitive at the moment
 | 
			
		||||
	CommitID      string
 | 
			
		||||
	CommitMessage string `xorm:"TEXT"` // it only stores the message summary (the first line)
 | 
			
		||||
	PusherID      int64
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -84,34 +84,6 @@ func mysqlGetCommitStatusIndex(ctx context.Context, repoID int64, sha string) (i
 | 
			
		|||
	return idx, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func mssqlGetCommitStatusIndex(ctx context.Context, repoID int64, sha string) (int64, error) {
 | 
			
		||||
	if _, err := db.GetEngine(ctx).Exec(`
 | 
			
		||||
MERGE INTO commit_status_index WITH (HOLDLOCK) AS target
 | 
			
		||||
USING (SELECT ? AS repo_id, ? AS sha) AS source
 | 
			
		||||
(repo_id, sha)
 | 
			
		||||
ON target.repo_id = source.repo_id AND target.sha = source.sha
 | 
			
		||||
WHEN MATCHED
 | 
			
		||||
	THEN UPDATE
 | 
			
		||||
			SET max_index = max_index + 1
 | 
			
		||||
WHEN NOT MATCHED
 | 
			
		||||
	THEN INSERT (repo_id, sha, max_index)
 | 
			
		||||
			VALUES (?, ?, 1);
 | 
			
		||||
`, repoID, sha, repoID, sha); err != nil {
 | 
			
		||||
		return 0, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var idx int64
 | 
			
		||||
	_, err := db.GetEngine(ctx).SQL("SELECT max_index FROM `commit_status_index` WHERE repo_id = ? AND sha = ?",
 | 
			
		||||
		repoID, sha).Get(&idx)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return 0, err
 | 
			
		||||
	}
 | 
			
		||||
	if idx == 0 {
 | 
			
		||||
		return 0, errors.New("cannot get the correct index")
 | 
			
		||||
	}
 | 
			
		||||
	return idx, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetNextCommitStatusIndex retried 3 times to generate a resource index
 | 
			
		||||
func GetNextCommitStatusIndex(ctx context.Context, repoID int64, sha string) (int64, error) {
 | 
			
		||||
	_, err := git.NewIDFromString(sha)
 | 
			
		||||
| 
						 | 
				
			
			@ -124,8 +96,6 @@ func GetNextCommitStatusIndex(ctx context.Context, repoID int64, sha string) (in
 | 
			
		|||
		return postgresGetCommitStatusIndex(ctx, repoID, sha)
 | 
			
		||||
	case setting.Database.Type.IsMySQL():
 | 
			
		||||
		return mysqlGetCommitStatusIndex(ctx, repoID, sha)
 | 
			
		||||
	case setting.Database.Type.IsMSSQL():
 | 
			
		||||
		return mssqlGetCommitStatusIndex(ctx, repoID, sha)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	e := db.GetEngine(ctx)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -89,13 +89,6 @@ func RecreateTable(sess *xorm.Session, bean any) error {
 | 
			
		|||
		hasID = hasID || (column.IsPrimaryKey && column.IsAutoIncrement)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if hasID && setting.Database.Type.IsMSSQL() {
 | 
			
		||||
		if _, err := sess.Exec(fmt.Sprintf("SET IDENTITY_INSERT `%s` ON", tempTableName)); err != nil {
 | 
			
		||||
			log.Error("Unable to set identity insert for table %s. Error: %v", tempTableName, err)
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	sqlStringBuilder := &strings.Builder{}
 | 
			
		||||
	_, _ = sqlStringBuilder.WriteString("INSERT INTO `")
 | 
			
		||||
	_, _ = sqlStringBuilder.WriteString(tempTableName)
 | 
			
		||||
| 
						 | 
				
			
			@ -143,13 +136,6 @@ func RecreateTable(sess *xorm.Session, bean any) error {
 | 
			
		|||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if hasID && setting.Database.Type.IsMSSQL() {
 | 
			
		||||
		if _, err := sess.Exec(fmt.Sprintf("SET IDENTITY_INSERT `%s` OFF", tempTableName)); err != nil {
 | 
			
		||||
			log.Error("Unable to switch off identity insert for table %s. Error: %v", tempTableName, err)
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	switch {
 | 
			
		||||
	case setting.Database.Type.IsSQLite3():
 | 
			
		||||
		// SQLite will drop all the constraints on the old table
 | 
			
		||||
| 
						 | 
				
			
			@ -296,19 +282,6 @@ func RecreateTable(sess *xorm.Session, bean any) error {
 | 
			
		|||
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	case setting.Database.Type.IsMSSQL():
 | 
			
		||||
		// MSSQL will drop all the constraints on the old table
 | 
			
		||||
		if _, err := sess.Exec(fmt.Sprintf("DROP TABLE `%s`", tableName)); err != nil {
 | 
			
		||||
			log.Error("Unable to drop old table %s. Error: %v", tableName, err)
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// MSSQL sp_rename will move all the constraints from the temporary table to the new table
 | 
			
		||||
		if _, err := sess.Exec(fmt.Sprintf("sp_rename `%s`,`%s`", tempTableName, tableName)); err != nil {
 | 
			
		||||
			log.Error("Unable to rename %s to %s. Error: %v", tempTableName, tableName, err)
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	default:
 | 
			
		||||
		log.Fatal("Unrecognized DB")
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -444,40 +417,6 @@ func DropTableColumns(sess *xorm.Session, tableName string, columnNames ...strin
 | 
			
		|||
		if _, err := sess.Exec(fmt.Sprintf("ALTER TABLE `%s` %s", tableName, cols)); err != nil {
 | 
			
		||||
			return fmt.Errorf("Drop table `%s` columns %v: %v", tableName, columnNames, err)
 | 
			
		||||
		}
 | 
			
		||||
	case setting.Database.Type.IsMSSQL():
 | 
			
		||||
		cols := ""
 | 
			
		||||
		for _, col := range columnNames {
 | 
			
		||||
			if cols != "" {
 | 
			
		||||
				cols += ", "
 | 
			
		||||
			}
 | 
			
		||||
			cols += "`" + strings.ToLower(col) + "`"
 | 
			
		||||
		}
 | 
			
		||||
		sql := fmt.Sprintf("SELECT Name FROM sys.default_constraints WHERE parent_object_id = OBJECT_ID('%[1]s') AND parent_column_id IN (SELECT column_id FROM sys.columns WHERE LOWER(name) IN (%[2]s) AND object_id = OBJECT_ID('%[1]s'))",
 | 
			
		||||
			tableName, strings.ReplaceAll(cols, "`", "'"))
 | 
			
		||||
		constraints := make([]string, 0)
 | 
			
		||||
		if err := sess.SQL(sql).Find(&constraints); err != nil {
 | 
			
		||||
			return fmt.Errorf("Find constraints: %v", err)
 | 
			
		||||
		}
 | 
			
		||||
		for _, constraint := range constraints {
 | 
			
		||||
			if _, err := sess.Exec(fmt.Sprintf("ALTER TABLE `%s` DROP CONSTRAINT `%s`", tableName, constraint)); err != nil {
 | 
			
		||||
				return fmt.Errorf("Drop table `%s` default constraint `%s`: %v", tableName, constraint, err)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		sql = fmt.Sprintf("SELECT DISTINCT Name FROM sys.indexes INNER JOIN sys.index_columns ON indexes.index_id = index_columns.index_id AND indexes.object_id = index_columns.object_id WHERE indexes.object_id = OBJECT_ID('%[1]s') AND index_columns.column_id IN (SELECT column_id FROM sys.columns WHERE LOWER(name) IN (%[2]s) AND object_id = OBJECT_ID('%[1]s'))",
 | 
			
		||||
			tableName, strings.ReplaceAll(cols, "`", "'"))
 | 
			
		||||
		constraints = make([]string, 0)
 | 
			
		||||
		if err := sess.SQL(sql).Find(&constraints); err != nil {
 | 
			
		||||
			return fmt.Errorf("Find constraints: %v", err)
 | 
			
		||||
		}
 | 
			
		||||
		for _, constraint := range constraints {
 | 
			
		||||
			if _, err := sess.Exec(fmt.Sprintf("DROP INDEX `%[2]s` ON `%[1]s`", tableName, constraint)); err != nil {
 | 
			
		||||
				return fmt.Errorf("Drop index `%[2]s` on `%[1]s`: %v", tableName, constraint, err)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if _, err := sess.Exec(fmt.Sprintf("ALTER TABLE `%s` DROP COLUMN %s", tableName, cols)); err != nil {
 | 
			
		||||
			return fmt.Errorf("Drop table `%s` columns %v: %v", tableName, columnNames, err)
 | 
			
		||||
		}
 | 
			
		||||
	default:
 | 
			
		||||
		log.Fatal("Unrecognized DB")
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -489,21 +428,6 @@ func DropTableColumns(sess *xorm.Session, tableName string, columnNames ...strin
 | 
			
		|||
func ModifyColumn(x *xorm.Engine, tableName string, col *schemas.Column) error {
 | 
			
		||||
	var indexes map[string]*schemas.Index
 | 
			
		||||
	var err error
 | 
			
		||||
	// MSSQL have to remove index at first, otherwise alter column will fail
 | 
			
		||||
	// ref. https://sqlzealots.com/2018/05/09/error-message-the-index-is-dependent-on-column-alter-table-alter-column-failed-because-one-or-more-objects-access-this-column/
 | 
			
		||||
	if x.Dialect().URI().DBType == schemas.MSSQL {
 | 
			
		||||
		indexes, err = x.Dialect().GetIndexes(x.DB(), context.Background(), tableName)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		for _, index := range indexes {
 | 
			
		||||
			_, err = x.Exec(x.Dialect().DropIndexSQL(tableName, index))
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	defer func() {
 | 
			
		||||
		for _, index := range indexes {
 | 
			
		||||
| 
						 | 
				
			
			@ -612,21 +536,6 @@ func deleteDB() error {
 | 
			
		|||
			}
 | 
			
		||||
			return nil
 | 
			
		||||
		}
 | 
			
		||||
	case setting.Database.Type.IsMSSQL():
 | 
			
		||||
		host, port := setting.ParseMSSQLHostPort(setting.Database.Host)
 | 
			
		||||
		db, err := sql.Open("mssql", fmt.Sprintf("server=%s; port=%s; database=%s; user id=%s; password=%s;",
 | 
			
		||||
			host, port, "master", setting.Database.User, setting.Database.Passwd))
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
		defer db.Close()
 | 
			
		||||
 | 
			
		||||
		if _, err = db.Exec(fmt.Sprintf("DROP DATABASE IF EXISTS [%s]", setting.Database.Name)); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
		if _, err = db.Exec(fmt.Sprintf("CREATE DATABASE [%s]", setting.Database.Name)); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -16,9 +16,6 @@ func ChangeReviewContentToText(x *xorm.Engine) error {
 | 
			
		|||
	case schemas.ORACLE:
 | 
			
		||||
		_, err := x.Exec("ALTER TABLE review MODIFY content TEXT")
 | 
			
		||||
		return err
 | 
			
		||||
	case schemas.MSSQL:
 | 
			
		||||
		_, err := x.Exec("ALTER TABLE review ALTER COLUMN content TEXT")
 | 
			
		||||
		return err
 | 
			
		||||
	case schemas.POSTGRES:
 | 
			
		||||
		_, err := x.Exec("ALTER TABLE review ALTER COLUMN content TYPE TEXT")
 | 
			
		||||
		return err
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -12,12 +12,9 @@ import (
 | 
			
		|||
func PrependRefsHeadsToIssueRefs(x *xorm.Engine) error {
 | 
			
		||||
	var query string
 | 
			
		||||
 | 
			
		||||
	switch {
 | 
			
		||||
	case setting.Database.Type.IsMSSQL():
 | 
			
		||||
		query = "UPDATE `issue` SET `ref` = 'refs/heads/' + `ref` WHERE `ref` IS NOT NULL AND `ref` <> '' AND `ref` NOT LIKE 'refs/%'"
 | 
			
		||||
	case setting.Database.Type.IsMySQL():
 | 
			
		||||
	if setting.Database.Type.IsMySQL() {
 | 
			
		||||
		query = "UPDATE `issue` SET `ref` = CONCAT('refs/heads/', `ref`) WHERE `ref` IS NOT NULL AND `ref` <> '' AND `ref` NOT LIKE 'refs/%';"
 | 
			
		||||
	default:
 | 
			
		||||
	} else {
 | 
			
		||||
		query = "UPDATE `issue` SET `ref` = 'refs/heads/' || `ref` WHERE `ref` IS NOT NULL AND `ref` <> '' AND `ref` NOT LIKE 'refs/%'"
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -45,32 +45,6 @@ func IncreaseLanguageField(x *xorm.Engine) error {
 | 
			
		|||
		if _, err := sess.Exec(fmt.Sprintf("ALTER TABLE language_stat MODIFY COLUMN language %s", sqlType)); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
	case setting.Database.Type.IsMSSQL():
 | 
			
		||||
		// Yet again MSSQL just has to be awkward.
 | 
			
		||||
		// Here we have to drop the constraints first and then rebuild them
 | 
			
		||||
		constraints := make([]string, 0)
 | 
			
		||||
		if err := sess.SQL(`SELECT i.name AS Name
 | 
			
		||||
			FROM sys.indexes i INNER JOIN sys.index_columns ic
 | 
			
		||||
      			ON i.index_id = ic.index_id AND i.object_id = ic.object_id
 | 
			
		||||
   			INNER JOIN sys.tables AS t
 | 
			
		||||
      			ON t.object_id = i.object_id
 | 
			
		||||
			INNER JOIN sys.columns c
 | 
			
		||||
				ON t.object_id = c.object_id AND ic.column_id = c.column_id
 | 
			
		||||
			WHERE t.name = 'language_stat' AND c.name = 'language'`).Find(&constraints); err != nil {
 | 
			
		||||
			return fmt.Errorf("Find constraints: %w", err)
 | 
			
		||||
		}
 | 
			
		||||
		for _, constraint := range constraints {
 | 
			
		||||
			if _, err := sess.Exec(fmt.Sprintf("DROP INDEX [%s] ON `language_stat`", constraint)); err != nil {
 | 
			
		||||
				return fmt.Errorf("Drop table `language_stat` constraint `%s`: %w", constraint, err)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		if _, err := sess.Exec(fmt.Sprintf("ALTER TABLE language_stat ALTER COLUMN language %s", sqlType)); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
		// Finally restore the constraint
 | 
			
		||||
		if err := sess.CreateUniques(new(LanguageStat)); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
	case setting.Database.Type.IsPostgreSQL():
 | 
			
		||||
		if _, err := sess.Exec(fmt.Sprintf("ALTER TABLE language_stat ALTER COLUMN language TYPE %s", sqlType)); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -23,36 +23,6 @@ func SetDefaultPasswordToArgon2(x *xorm.Engine) error {
 | 
			
		|||
	case setting.Database.Type.IsPostgreSQL():
 | 
			
		||||
		_, err := x.Exec("ALTER TABLE `user` ALTER COLUMN passwd_hash_algo SET DEFAULT 'argon2';")
 | 
			
		||||
		return err
 | 
			
		||||
	case setting.Database.Type.IsMSSQL():
 | 
			
		||||
		// need to find the constraint and drop it, then recreate it.
 | 
			
		||||
		sess := x.NewSession()
 | 
			
		||||
		defer sess.Close()
 | 
			
		||||
		if err := sess.Begin(); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
		res, err := sess.QueryString("SELECT [name] FROM sys.default_constraints WHERE parent_object_id=OBJECT_ID(?) AND COL_NAME(parent_object_id, parent_column_id)=?;", "user", "passwd_hash_algo")
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
		if len(res) > 0 {
 | 
			
		||||
			constraintName := res[0]["name"]
 | 
			
		||||
			log.Error("Results of select constraint: %s", constraintName)
 | 
			
		||||
			_, err := sess.Exec("ALTER TABLE [user] DROP CONSTRAINT " + constraintName)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
			_, err = sess.Exec("ALTER TABLE [user] ADD CONSTRAINT " + constraintName + " DEFAULT 'argon2' FOR passwd_hash_algo")
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
		} else {
 | 
			
		||||
			_, err := sess.Exec("ALTER TABLE [user] ADD DEFAULT('argon2') FOR passwd_hash_algo")
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		return sess.Commit()
 | 
			
		||||
 | 
			
		||||
	case setting.Database.Type.IsSQLite3():
 | 
			
		||||
		// drop through
 | 
			
		||||
	default:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -62,13 +62,6 @@ func UpdateCodeCommentReplies(x *xorm.Engine) error {
 | 
			
		|||
			return err
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if setting.Database.Type.IsMSSQL() {
 | 
			
		||||
			if _, err := sess.Exec(sqlSelect + " INTO #temp_comments" + sqlTail); err != nil {
 | 
			
		||||
				log.Error("unable to create temporary table")
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		comments := make([]*Comment, 0, batchSize)
 | 
			
		||||
 | 
			
		||||
		switch {
 | 
			
		||||
| 
						 | 
				
			
			@ -78,9 +71,6 @@ func UpdateCodeCommentReplies(x *xorm.Engine) error {
 | 
			
		|||
			fallthrough
 | 
			
		||||
		case setting.Database.Type.IsSQLite3():
 | 
			
		||||
			sqlCmd = sqlSelect + sqlTail + " LIMIT " + strconv.Itoa(batchSize) + " OFFSET " + strconv.Itoa(start)
 | 
			
		||||
		case setting.Database.Type.IsMSSQL():
 | 
			
		||||
			sqlCmd = "SELECT TOP " + strconv.Itoa(batchSize) + " * FROM #temp_comments WHERE " +
 | 
			
		||||
				"(id NOT IN ( SELECT TOP " + strconv.Itoa(start) + " id FROM #temp_comments ORDER BY id )) ORDER BY id"
 | 
			
		||||
		default:
 | 
			
		||||
			return fmt.Errorf("Unsupported database type")
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -32,13 +32,7 @@ func ConvertHookTaskTypeToVarcharAndTrim(x *xorm.Engine) error {
 | 
			
		|||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var hookTaskTrimSQL string
 | 
			
		||||
	if dbType == schemas.MSSQL {
 | 
			
		||||
		hookTaskTrimSQL = "UPDATE hook_task SET typ = RTRIM(LTRIM(typ))"
 | 
			
		||||
	} else {
 | 
			
		||||
		hookTaskTrimSQL = "UPDATE hook_task SET typ = TRIM(typ)"
 | 
			
		||||
	}
 | 
			
		||||
	if _, err := x.Exec(hookTaskTrimSQL); err != nil {
 | 
			
		||||
	if _, err := x.Exec("UPDATE hook_task SET typ = TRIM(typ)"); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -58,12 +52,6 @@ func ConvertHookTaskTypeToVarcharAndTrim(x *xorm.Engine) error {
 | 
			
		|||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var webhookTrimSQL string
 | 
			
		||||
	if dbType == schemas.MSSQL {
 | 
			
		||||
		webhookTrimSQL = "UPDATE webhook SET type = RTRIM(LTRIM(type))"
 | 
			
		||||
	} else {
 | 
			
		||||
		webhookTrimSQL = "UPDATE webhook SET type = TRIM(type)"
 | 
			
		||||
	}
 | 
			
		||||
	_, err := x.Exec(webhookTrimSQL)
 | 
			
		||||
	_, err := x.Exec("UPDATE webhook SET type = TRIM(type)")
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -53,16 +53,11 @@ func RenameTaskErrorsToMessage(x *xorm.Engine) error {
 | 
			
		|||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	switch {
 | 
			
		||||
	case setting.Database.Type.IsMySQL():
 | 
			
		||||
	if setting.Database.Type.IsMySQL() {
 | 
			
		||||
		if _, err := sess.Exec("ALTER TABLE `task` CHANGE errors message text"); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
	case setting.Database.Type.IsMSSQL():
 | 
			
		||||
		if _, err := sess.Exec("sp_rename 'task.errors', 'message', 'COLUMN'"); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
	default:
 | 
			
		||||
	} else {
 | 
			
		||||
		if _, err := sess.Exec("ALTER TABLE `task` RENAME COLUMN errors TO message"); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -8,7 +8,6 @@ import (
 | 
			
		|||
	"fmt"
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
	"code.gitea.io/gitea/models/migrations/base"
 | 
			
		||||
	"code.gitea.io/gitea/modules/timeutil"
 | 
			
		||||
 | 
			
		||||
	"github.com/tstranex/u2f"
 | 
			
		||||
| 
						 | 
				
			
			@ -48,26 +47,6 @@ func RemigrateU2FCredentials(x *xorm.Engine) error {
 | 
			
		|||
		if err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
	case schemas.MSSQL:
 | 
			
		||||
		// This column has an index on it. I could write all of the code to attempt to change the index OR
 | 
			
		||||
		// I could just use recreate table.
 | 
			
		||||
		sess := x.NewSession()
 | 
			
		||||
		if err := sess.Begin(); err != nil {
 | 
			
		||||
			_ = sess.Close()
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if err := base.RecreateTable(sess, new(webauthnCredential)); err != nil {
 | 
			
		||||
			_ = sess.Close()
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
		if err := sess.Commit(); err != nil {
 | 
			
		||||
			_ = sess.Close()
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
		if err := sess.Close(); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
	case schemas.POSTGRES:
 | 
			
		||||
		_, err := x.Exec("ALTER TABLE webauthn_credential ALTER COLUMN credential_id TYPE VARCHAR(410)")
 | 
			
		||||
		if err != nil {
 | 
			
		||||
| 
						 | 
				
			
			@ -111,11 +90,6 @@ func RemigrateU2FCredentials(x *xorm.Engine) error {
 | 
			
		|||
			if err := sess.Begin(); err != nil {
 | 
			
		||||
				return fmt.Errorf("unable to allow start session. Error: %w", err)
 | 
			
		||||
			}
 | 
			
		||||
			if x.Dialect().URI().DBType == schemas.MSSQL {
 | 
			
		||||
				if _, err := sess.Exec("SET IDENTITY_INSERT `webauthn_credential` ON"); err != nil {
 | 
			
		||||
					return fmt.Errorf("unable to allow identity insert on webauthn_credential. Error: %w", err)
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			for _, reg := range regs {
 | 
			
		||||
				parsed := new(u2f.Registration)
 | 
			
		||||
				err = parsed.UnmarshalBinary(reg.Raw)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -12,14 +12,10 @@ import (
 | 
			
		|||
)
 | 
			
		||||
 | 
			
		||||
func AddContainerRepositoryProperty(x *xorm.Engine) (err error) {
 | 
			
		||||
	switch x.Dialect().URI().DBType {
 | 
			
		||||
	case schemas.SQLITE:
 | 
			
		||||
	if x.Dialect().URI().DBType == schemas.SQLITE {
 | 
			
		||||
		_, err = x.Exec("INSERT INTO package_property (ref_type, ref_id, name, value) SELECT ?, p.id, ?, u.lower_name || '/' || p.lower_name FROM package p JOIN `user` u ON p.owner_id = u.id WHERE p.type = ?",
 | 
			
		||||
			packages_model.PropertyTypePackage, container_module.PropertyRepository, packages_model.TypeContainer)
 | 
			
		||||
	case schemas.MSSQL:
 | 
			
		||||
		_, err = x.Exec("INSERT INTO package_property (ref_type, ref_id, name, value) SELECT ?, p.id, ?, u.lower_name + '/' + p.lower_name FROM package p JOIN `user` u ON p.owner_id = u.id WHERE p.type = ?",
 | 
			
		||||
			packages_model.PropertyTypePackage, container_module.PropertyRepository, packages_model.TypeContainer)
 | 
			
		||||
	default:
 | 
			
		||||
	} else {
 | 
			
		||||
		_, err = x.Exec("INSERT INTO package_property (ref_type, ref_id, name, value) SELECT ?, p.id, ?, CONCAT(u.lower_name, '/', p.lower_name) FROM package p JOIN `user` u ON p.owner_id = u.id WHERE p.type = ?",
 | 
			
		||||
			packages_model.PropertyTypePackage, container_module.PropertyRepository, packages_model.TypeContainer)
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -64,16 +64,11 @@ func RenameCredentialIDBytes(x *xorm.Engine) error {
 | 
			
		|||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		switch {
 | 
			
		||||
		case setting.Database.Type.IsMySQL():
 | 
			
		||||
		if setting.Database.Type.IsMySQL() {
 | 
			
		||||
			if _, err := sess.Exec("ALTER TABLE `webauthn_credential` CHANGE credential_id_bytes credential_id VARBINARY(1024)"); err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
		case setting.Database.Type.IsMSSQL():
 | 
			
		||||
			if _, err := sess.Exec("sp_rename 'webauthn_credential.credential_id_bytes', 'credential_id', 'COLUMN'"); err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
		default:
 | 
			
		||||
		} else {
 | 
			
		||||
			if _, err := sess.Exec("ALTER TABLE `webauthn_credential` RENAME COLUMN credential_id_bytes TO credential_id"); err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -50,8 +50,7 @@ func RenameWebhookOrgToOwner(x *xorm.Engine) error {
 | 
			
		|||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	switch {
 | 
			
		||||
	case setting.Database.Type.IsMySQL():
 | 
			
		||||
	if setting.Database.Type.IsMySQL() {
 | 
			
		||||
		inferredTable, err := x.TableInfo(new(Webhook))
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
| 
						 | 
				
			
			@ -60,11 +59,7 @@ func RenameWebhookOrgToOwner(x *xorm.Engine) error {
 | 
			
		|||
		if _, err := sess.Exec(fmt.Sprintf("ALTER TABLE `webhook` CHANGE org_id owner_id %s", sqlType)); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
	case setting.Database.Type.IsMSSQL():
 | 
			
		||||
		if _, err := sess.Exec("sp_rename 'webhook.org_id', 'owner_id', 'COLUMN'"); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
	default:
 | 
			
		||||
	} else {
 | 
			
		||||
		if _, err := sess.Exec("ALTER TABLE `webhook` RENAME COLUMN org_id TO owner_id"); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4,10 +4,7 @@
 | 
			
		|||
package v1_22 //nolint
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
 | 
			
		||||
	"xorm.io/xorm"
 | 
			
		||||
	"xorm.io/xorm/schemas"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func AddCombinedIndexToIssueUser(x *xorm.Engine) error {
 | 
			
		||||
| 
						 | 
				
			
			@ -23,18 +20,12 @@ func AddCombinedIndexToIssueUser(x *xorm.Engine) error {
 | 
			
		|||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	for _, issueUser := range duplicatedIssueUsers {
 | 
			
		||||
		if x.Dialect().URI().DBType == schemas.MSSQL {
 | 
			
		||||
			if _, err := x.Exec(fmt.Sprintf("delete from issue_user where id in (SELECT top %d id FROM issue_user WHERE issue_id = ? and uid = ?)", issueUser.Cnt-1), issueUser.IssueID, issueUser.UID); err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
		} else {
 | 
			
		||||
			var ids []int64
 | 
			
		||||
			if err := x.SQL("SELECT id FROM issue_user WHERE issue_id = ? and uid = ? limit ?", issueUser.IssueID, issueUser.UID, issueUser.Cnt-1).Find(&ids); err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
			if _, err := x.Table("issue_user").In("id", ids).Delete(); err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
		var ids []int64
 | 
			
		||||
		if err := x.SQL("SELECT id FROM issue_user WHERE issue_id = ? and uid = ? limit ?", issueUser.IssueID, issueUser.UID, issueUser.Cnt-1).Find(&ids); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
		if _, err := x.Table("issue_user").In("id", ids).Delete(); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,7 +3,6 @@
 | 
			
		|||
package v1_22 //nolint
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"errors"
 | 
			
		||||
	"fmt"
 | 
			
		||||
 | 
			
		||||
	"code.gitea.io/gitea/modules/log"
 | 
			
		||||
| 
						 | 
				
			
			@ -33,27 +32,10 @@ func expandHashReferencesToSha256(x *xorm.Engine) error {
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	if !setting.Database.Type.IsSQLite3() {
 | 
			
		||||
		if setting.Database.Type.IsMSSQL() {
 | 
			
		||||
			// drop indexes that need to be re-created afterwards
 | 
			
		||||
			droppedIndexes := []string{
 | 
			
		||||
				"DROP INDEX IF EXISTS [IDX_commit_status_context_hash] ON [commit_status]",
 | 
			
		||||
				"DROP INDEX IF EXISTS [UQE_review_state_pull_commit_user] ON [review_state]",
 | 
			
		||||
				"DROP INDEX IF EXISTS [UQE_repo_archiver_s] ON [repo_archiver]",
 | 
			
		||||
			}
 | 
			
		||||
			for _, s := range droppedIndexes {
 | 
			
		||||
				_, err := db.Exec(s)
 | 
			
		||||
				if err != nil {
 | 
			
		||||
					return errors.New(s + " " + err.Error())
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		for _, alts := range alteredTables {
 | 
			
		||||
			var err error
 | 
			
		||||
			if setting.Database.Type.IsMySQL() {
 | 
			
		||||
				_, err = db.Exec(fmt.Sprintf("ALTER TABLE `%s` MODIFY COLUMN `%s` VARCHAR(64)", alts[0], alts[1]))
 | 
			
		||||
			} else if setting.Database.Type.IsMSSQL() {
 | 
			
		||||
				_, err = db.Exec(fmt.Sprintf("ALTER TABLE [%s] ALTER COLUMN [%s] VARCHAR(64)", alts[0], alts[1]))
 | 
			
		||||
			} else {
 | 
			
		||||
				_, err = db.Exec(fmt.Sprintf("ALTER TABLE `%s` ALTER COLUMN `%s` TYPE VARCHAR(64)", alts[0], alts[1]))
 | 
			
		||||
			}
 | 
			
		||||
| 
						 | 
				
			
			@ -61,20 +43,6 @@ func expandHashReferencesToSha256(x *xorm.Engine) error {
 | 
			
		|||
				return fmt.Errorf("alter column '%s' of table '%s' failed: %w", alts[1], alts[0], err)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if setting.Database.Type.IsMSSQL() {
 | 
			
		||||
			recreateIndexes := []string{
 | 
			
		||||
				"CREATE INDEX IDX_commit_status_context_hash ON commit_status(context_hash)",
 | 
			
		||||
				"CREATE UNIQUE INDEX UQE_review_state_pull_commit_user ON review_state(user_id, pull_id, commit_sha)",
 | 
			
		||||
				"CREATE UNIQUE INDEX UQE_repo_archiver_s ON repo_archiver(repo_id, type, commit_id)",
 | 
			
		||||
			}
 | 
			
		||||
			for _, s := range recreateIndexes {
 | 
			
		||||
				_, err := db.Exec(s)
 | 
			
		||||
				if err != nil {
 | 
			
		||||
					return errors.New(s + " " + err.Error())
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	log.Debug("Updated database tables to hold SHA256 git hash references")
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -18,8 +18,6 @@ func ChangeU2FCounterType(x *xorm.Engine) error {
 | 
			
		|||
		_, err = x.Exec("ALTER TABLE `u2f_registration` MODIFY `counter` BIGINT")
 | 
			
		||||
	case schemas.POSTGRES:
 | 
			
		||||
		_, err = x.Exec("ALTER TABLE `u2f_registration` ALTER COLUMN `counter` SET DATA TYPE bigint")
 | 
			
		||||
	case schemas.MSSQL:
 | 
			
		||||
		_, err = x.Exec("ALTER TABLE `u2f_registration` ALTER COLUMN `counter` BIGINT")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if err != nil {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -60,8 +60,6 @@ func InitFixtures(opts FixturesOptions, engine ...*xorm.Engine) (err error) {
 | 
			
		|||
		dialect = "postgres"
 | 
			
		||||
	case schemas.MYSQL:
 | 
			
		||||
		dialect = "mysql"
 | 
			
		||||
	case schemas.MSSQL:
 | 
			
		||||
		dialect = "mssql"
 | 
			
		||||
	case schemas.SQLITE:
 | 
			
		||||
		dialect = "sqlite3"
 | 
			
		||||
	default:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -16,9 +16,9 @@ import (
 | 
			
		|||
 | 
			
		||||
var (
 | 
			
		||||
	// SupportedDatabaseTypes includes all XORM supported databases type, sqlite3 maybe added by `database_sqlite3.go`
 | 
			
		||||
	SupportedDatabaseTypes = []string{"mysql", "postgres", "mssql"}
 | 
			
		||||
	SupportedDatabaseTypes = []string{"mysql", "postgres"}
 | 
			
		||||
	// DatabaseTypeNames contains the friendly names for all database types
 | 
			
		||||
	DatabaseTypeNames = map[string]string{"mysql": "MySQL", "postgres": "PostgreSQL", "mssql": "MSSQL", "sqlite3": "SQLite3"}
 | 
			
		||||
	DatabaseTypeNames = map[string]string{"mysql": "MySQL", "postgres": "PostgreSQL", "sqlite3": "SQLite3"}
 | 
			
		||||
 | 
			
		||||
	// EnableSQLite3 use SQLite3, set by build flag
 | 
			
		||||
	EnableSQLite3 bool
 | 
			
		||||
| 
						 | 
				
			
			@ -120,9 +120,6 @@ func DBConnStr() (string, error) {
 | 
			
		|||
			Database.User, Database.Passwd, connType, Database.Host, Database.Name, paramSep, tls)
 | 
			
		||||
	case "postgres":
 | 
			
		||||
		connStr = getPostgreSQLConnectionString(Database.Host, Database.User, Database.Passwd, Database.Name, Database.SSLMode)
 | 
			
		||||
	case "mssql":
 | 
			
		||||
		host, port := ParseMSSQLHostPort(Database.Host)
 | 
			
		||||
		connStr = fmt.Sprintf("server=%s; port=%s; database=%s; user id=%s; password=%s;", host, port, Database.Name, Database.User, Database.Passwd)
 | 
			
		||||
	case "sqlite3":
 | 
			
		||||
		if !EnableSQLite3 {
 | 
			
		||||
			return "", errors.New("this Gitea binary was not built with SQLite3 support")
 | 
			
		||||
| 
						 | 
				
			
			@ -188,28 +185,6 @@ func getPostgreSQLConnectionString(dbHost, dbUser, dbPasswd, dbName, dbsslMode s
 | 
			
		|||
	return connURL.String()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ParseMSSQLHostPort splits the host into host and port
 | 
			
		||||
func ParseMSSQLHostPort(info string) (string, string) {
 | 
			
		||||
	// the default port "0" might be related to MSSQL's dynamic port, maybe it should be double-confirmed in the future
 | 
			
		||||
	host, port := "127.0.0.1", "0"
 | 
			
		||||
	if strings.Contains(info, ":") {
 | 
			
		||||
		host = strings.Split(info, ":")[0]
 | 
			
		||||
		port = strings.Split(info, ":")[1]
 | 
			
		||||
	} else if strings.Contains(info, ",") {
 | 
			
		||||
		host = strings.Split(info, ",")[0]
 | 
			
		||||
		port = strings.TrimSpace(strings.Split(info, ",")[1])
 | 
			
		||||
	} else if len(info) > 0 {
 | 
			
		||||
		host = info
 | 
			
		||||
	}
 | 
			
		||||
	if host == "" {
 | 
			
		||||
		host = "127.0.0.1"
 | 
			
		||||
	}
 | 
			
		||||
	if port == "" {
 | 
			
		||||
		port = "0"
 | 
			
		||||
	}
 | 
			
		||||
	return host, port
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type DatabaseType string
 | 
			
		||||
 | 
			
		||||
func (t DatabaseType) String() string {
 | 
			
		||||
| 
						 | 
				
			
			@ -224,10 +199,6 @@ func (t DatabaseType) IsMySQL() bool {
 | 
			
		|||
	return t == "mysql"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (t DatabaseType) IsMSSQL() bool {
 | 
			
		||||
	return t == "mssql"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (t DatabaseType) IsPostgreSQL() bool {
 | 
			
		||||
	return t == "postgres"
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -137,7 +137,7 @@ reinstall_confirm_message = إعادة التثبيت باستخدام قاعد
 | 
			
		|||
db_schema = مخطط
 | 
			
		||||
reinstall_error = أنت تحاول التثبيت في قاعدة بيانات فورجيو موجودة
 | 
			
		||||
sqlite_helper = مسار المِلَفّ لقاعدة بيانات SQLite3.<br>أدخل المسار المطلق إذا شغلت فورجيو كخدمة.
 | 
			
		||||
require_db_desc = فورجيو يحتاج MySQL أو PostgreSQL أو MSSQL أو SQLite3 أو TiDB.
 | 
			
		||||
require_db_desc = فورجيو يحتاج MySQL أو PostgreSQL أو SQLite3 أو TiDB.
 | 
			
		||||
password = كلمة المرور
 | 
			
		||||
host = المضيف
 | 
			
		||||
docker_helper = إذا كنت تستخدم فورجيو داخل دوكر، يرجي قراءة <a target="_blank" rel="noopener noreferrer" href="%s">المستندات</a> قبل تغيير أي إعدادات.
 | 
			
		||||
| 
						 | 
				
			
			@ -1547,7 +1547,6 @@ dashboard.sync_tag.started = بدأ تزامن الوسوم
 | 
			
		|||
dashboard.sync_repo_tags = زامن الوسوم من بيانات جِت إلى قاعدة البيانات
 | 
			
		||||
self_check = فحص ذاتي
 | 
			
		||||
self_check.database_collation_case_insensitive = تستخدم قاعدة البيانات تجميع %s ، وهو تجميع غير حساس. على الرغم من أن فورجيو يمكن أن يعمل معها قد تكون هناك حالات نادرة لا تعمل كما هو متوقع.
 | 
			
		||||
self_check.database_fix_mssql = بالنسبة لمستخدمي الـإم إس سيكول، يمكنك إصلاح المشكلة بتعديل السيكول يدوياً فقط في الوقت الراهن.
 | 
			
		||||
monitor.process.cancel_desc = قد يسبب إلغاء العملية فقدانًا للبيانات
 | 
			
		||||
monitor.queue.type = النوع
 | 
			
		||||
monitor.process.cancel_notices = أتريد إلغاء: <strong>%s</strong>؟
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1217,7 +1217,7 @@ admin_name = Потреб. име за администратор
 | 
			
		|||
confirm_password = Потвърдете паролата
 | 
			
		||||
title = Първоначална конфигурация
 | 
			
		||||
domain = Домейн на сървъра
 | 
			
		||||
require_db_desc = Forgejo изисква MySQL, PostgreSQL, MSSQL, SQLite3 или TiDB (MySQL протокол).
 | 
			
		||||
require_db_desc = Forgejo изисква MySQL, PostgreSQL, SQLite3 или TiDB (MySQL протокол).
 | 
			
		||||
general_title = Общи настройки
 | 
			
		||||
email_title = Настройки на ел. поща
 | 
			
		||||
db_schema = Схема
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -219,7 +219,7 @@ license_desc=Vše je na <a target="_blank" rel="noopener noreferrer" href="https
 | 
			
		|||
install=Instalace
 | 
			
		||||
title=Počáteční konfigurace
 | 
			
		||||
docker_helper=Pokud spouštíte Forgejo v Dockeru, přečtěte si <a target="_blank" rel="noopener noreferrer" href="%s">dokumentaci</a>, než budete měnit jakákoliv nastavení.
 | 
			
		||||
require_db_desc=Forgejo vyžaduje MySQL, PostgreSQL, MSSQL, SQLite3 nebo TiDB (protokol MySQL).
 | 
			
		||||
require_db_desc=Forgejo vyžaduje MySQL, PostgreSQL, SQLite3 nebo TiDB (protokol MySQL).
 | 
			
		||||
db_title=Nastavení databáze
 | 
			
		||||
db_type=Typ databáze
 | 
			
		||||
host=Hostitel
 | 
			
		||||
| 
						 | 
				
			
			@ -3396,7 +3396,6 @@ self_check = Vlastní kontrola
 | 
			
		|||
dashboard.sync_tag.started = Synchronizace značek spuštěna
 | 
			
		||||
dashboard.rebuild_issue_indexer = Přestavit indexer vydání
 | 
			
		||||
self_check.database_collation_case_insensitive = Databáze používá collation %s. Jedná se o intenzivní collation. Ačkoli s ní Forgejo nejspíše bude pracovat, mohou nastat určité vzácné případy, kdy nebude pracovat tak, jak má.
 | 
			
		||||
self_check.database_fix_mssql = Uživatelé MSSQL mohou tento problém vyřešit pouze ručními SQL příkazy „ALTER ... COLLATE ...“.
 | 
			
		||||
auths.oauth2_map_group_to_team = Zmapovat zabrané skupiny u týmů organizací (volitelné - vyžaduje název claimu výše)
 | 
			
		||||
monitor.queue.settings.desc = Pooly dynamicky rostou podle blokování fronty jejich workerů.
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -3405,7 +3404,6 @@ self_check.database_collation_mismatch=Očekávejte, že databáze použije coll
 | 
			
		|||
self_check.database_collation_case_insensitive=Databáze používá collation %s, což je collation nerozlišující velká a malá písmena. Ačkoli s ní Gitea může pracovat, mohou se vyskytnout vzácné případy, kdy nebude fungovat podle očekávání.
 | 
			
		||||
self_check.database_inconsistent_collation_columns=Databáze používá collation %s, ale tyto sloupce používají chybné collation. To může způsobit neočekávané problémy.
 | 
			
		||||
self_check.database_fix_mysql=Pro uživatele MySQL/MariaDB můžete použít příkaz "gitea doctor convert", který opraví problémy s collation, nebo můžete také problém vyřešit příkazem "ALTER ... COLLATE ..." SQL ručně.
 | 
			
		||||
self_check.database_fix_mssql=Uživatelé MSSQL mohou problém vyřešit pouze pomocí příkazu "ALTER ... COLLATE ..." SQL ručně.
 | 
			
		||||
auths.tips.gmail_settings = Nastavení služby Gmail:
 | 
			
		||||
config_summary = Souhrn
 | 
			
		||||
config.open_with_editor_app_help = Editory v nabídce „Otevřít pomocí“ v nabídce klonování. Ponechte prázdné pro použití výchozího editoru (zobrazíte jej rozšířením).
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -217,7 +217,7 @@ license_desc=Hole dir <a target="_blank" rel="noopener noreferrer" href="https:/
 | 
			
		|||
install=Installation
 | 
			
		||||
title=Erstkonfiguration
 | 
			
		||||
docker_helper=Wenn du Forgejo in einem Docker-Container nutzt, lies bitte die <a target="_blank" rel="noopener noreferrer" href="%s">Dokumentation</a>, bevor du irgendwelche Einstellungen veränderst.
 | 
			
		||||
require_db_desc=Forgejo benötigt MySQL, PostgreSQL, MSSQL, SQLite3 oder TiDB (MySQL-Protokoll).
 | 
			
		||||
require_db_desc=Forgejo benötigt MySQL, PostgreSQL, SQLite3 oder TiDB (MySQL-Protokoll).
 | 
			
		||||
db_title=Datenbankeinstellungen
 | 
			
		||||
db_type=Datenbanktyp
 | 
			
		||||
host=Host
 | 
			
		||||
| 
						 | 
				
			
			@ -3368,7 +3368,6 @@ self_check = Selbstprüfung
 | 
			
		|||
dashboard.sync_repo_tags = Tags aus Git-Daten zu Datenbank synchronisieren
 | 
			
		||||
emails.change_email_text = Bist du dir sicher, dass du diese E-Mail-Addresse aktualisieren möchtest?
 | 
			
		||||
packages.cleanup.success = Abgelaufene Daten erfolgreich gesäubert
 | 
			
		||||
self_check.database_fix_mssql = Für MSSQL-Benutzer: Du kannst das Problem im Moment nur mit „ALTER … COLLATE …“-SQLs beheben.
 | 
			
		||||
self_check.no_problem_found = Noch kein Problem gefunden.
 | 
			
		||||
self_check.database_inconsistent_collation_columns = Datenbank benutzt Collation %s, aber diese Spalten benutzen Collations, die nicht zusammenpassen. Das könnte ein paar unerwartete Probleme verursachen.
 | 
			
		||||
self_check.database_collation_mismatch = Erwarte von Datenbank, folgende Collation zu verwenden: %s
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -211,7 +211,7 @@ license_desc=Κατέβασε το <a target="_blank" rel="noopener noreferrer"
 | 
			
		|||
install=Εγκατάσταση
 | 
			
		||||
title=Αρχικές ρυθμίσεις
 | 
			
		||||
docker_helper=Αν εκτελέσετε το Forgejo μέσα στο Docker, παρακαλώ διαβάστε το <a target="_blank" rel="noopener noreferrer" href="%s">εγχειρίδιο</a> πριν αλλάξετε τις ρυθμίσεις.
 | 
			
		||||
require_db_desc=Το Forgejo απαιτεί MySQL, PostgreSQL, MSSQL, SQLite3 ή TiDB (με πρωτόκολλο MySQL).
 | 
			
		||||
require_db_desc=Το Forgejo απαιτεί MySQL, PostgreSQL, SQLite3 ή TiDB (με πρωτόκολλο MySQL).
 | 
			
		||||
db_title=Ρυθμίσεις βάσης δεδομένων
 | 
			
		||||
db_type=Είδος βάσης δεδομένων
 | 
			
		||||
host=Διακομιστής
 | 
			
		||||
| 
						 | 
				
			
			@ -3322,7 +3322,6 @@ notices.desc=Περιγραφή
 | 
			
		|||
notices.op=Λειτ.
 | 
			
		||||
notices.delete_success=Οι ειδοποιήσεις του συστήματος έχουν διαγραφεί.
 | 
			
		||||
self_check.no_problem_found = Μέχρι τώρα, δεν έχει βρεθεί κάποιο πρόβλημα.
 | 
			
		||||
self_check.database_fix_mssql = Προς το παρόν, οι χρήστες του MSSQL μπορούν να διορθώσουν το πρόβλημα αυτό χειροκίνητα χρησιμοποιώντας τις εντολές SQL «ALTER ... COLLATE ...».
 | 
			
		||||
self_check = Αυτοέλεγχος
 | 
			
		||||
dashboard.sync_repo_tags = Συγχρονισμός tag από δεδομένα git στην βάση δεδομένων
 | 
			
		||||
dashboard.sync_tag.started = Ο συγχρονισμός tag έχει ξεκινήσει
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -239,7 +239,7 @@ license_desc = Go get <a target="_blank" rel="noopener noreferrer" href="https:/
 | 
			
		|||
install = Installation
 | 
			
		||||
title = Initial configuration
 | 
			
		||||
docker_helper = If you run Forgejo inside Docker, please read the <a target="_blank" rel="noopener noreferrer" href="%s">documentation</a> before changing any settings.
 | 
			
		||||
require_db_desc = Forgejo requires MySQL, PostgreSQL, MSSQL, SQLite3 or TiDB (MySQL protocol).
 | 
			
		||||
require_db_desc = Forgejo requires MySQL, PostgreSQL, SQLite3 or TiDB (MySQL protocol).
 | 
			
		||||
db_title = Database settings
 | 
			
		||||
db_type = Database type
 | 
			
		||||
host = Host
 | 
			
		||||
| 
						 | 
				
			
			@ -3378,7 +3378,6 @@ self_check.database_collation_mismatch = Expect database to use collation: %s
 | 
			
		|||
self_check.database_collation_case_insensitive = Database is using a collation %s, which is an insensitive collation. Although Forgejo could work with it, there might be some rare cases which don't work as expected.
 | 
			
		||||
self_check.database_inconsistent_collation_columns = Database is using collation %s, but these columns are using mismatched collations. It might cause some unexpected problems.
 | 
			
		||||
self_check.database_fix_mysql = For MySQL/MariaDB users, you could use the "gitea doctor convert" command to fix the collation problems, or you could also fix the problem by "ALTER ... COLLATE ..." SQLs manually.
 | 
			
		||||
self_check.database_fix_mssql = For MSSQL users, you could only fix the problem by "ALTER ... COLLATE ..." SQLs manually at the moment.
 | 
			
		||||
 | 
			
		||||
[action]
 | 
			
		||||
create_repo = created repository <a href="%s">%s</a>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -226,7 +226,7 @@ disable_gravatar = Malŝalti profilbildojn per Gravatar
 | 
			
		|||
repo_path_helper = Foraj Git-deponejoj konserviĝos al tiu ĉi dosierujo.
 | 
			
		||||
sqlite_helper = Dosiervojo por la datumbazo SQLite3.<br>Enigu absolutan vojon se vi rulas Forgejon kiel servo.
 | 
			
		||||
enable_captcha = Ŝalti dumregistriĝan teston de homeco
 | 
			
		||||
require_db_desc = Forgejo bezonas kiel datumbazo MySQL, PostgreSQL, MSSQL, SQLite3, aŭ TiDB (MySQL komunikformo).
 | 
			
		||||
require_db_desc = Forgejo bezonas kiel datumbazo MySQL, PostgreSQL, SQLite3, aŭ TiDB (MySQL komunikformo).
 | 
			
		||||
smtp_from = Sendu retleterojn kiel
 | 
			
		||||
general_title = Ĝeneralaj agordoj
 | 
			
		||||
password = Pasvorto
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -210,7 +210,7 @@ license_desc=¡Está todo en < <a target="_blank" rel="noopener noreferrer" href
 | 
			
		|||
install=Instalación
 | 
			
		||||
title=Configuración inicial
 | 
			
		||||
docker_helper=Si está ejecutando Forgejo dentro de un contenedor Docker, por favor lea la <a target="_blank" rel="noopener noreferrer" href="%s">documentación</a> antes de realizar cambios en la configuración.
 | 
			
		||||
require_db_desc=Forgejo requiere una base de datos MySQL, PostgreSQL, MSSQL, SQLite3 o TiDB (usar el protocolo MySQL).
 | 
			
		||||
require_db_desc=Forgejo requiere una base de datos MySQL, PostgreSQL, SQLite3 o TiDB (usar el protocolo MySQL).
 | 
			
		||||
db_title=Configuración de base de datos
 | 
			
		||||
db_type=Tipo de base de datos
 | 
			
		||||
host=Servidor
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -144,7 +144,7 @@ license_desc=Mene osoitteeseen <a target="_blank" rel="noopener noreferrer" href
 | 
			
		|||
install=Asennus
 | 
			
		||||
title=Alkuperäiset asetukset
 | 
			
		||||
docker_helper=Jos ajat Forgejoa Dockerin sisällä, lue <a target="_blank" rel="noopener noreferrer" href="%s">ohjeet</a> ennen minkään asetuksen muuttamista.
 | 
			
		||||
require_db_desc=Forgejo tarvitsee toimiakseen MySQL, PostgreSQL, MSSQL, SQLite3 tai TiDB (MySQL protokolla) tietokannan.
 | 
			
		||||
require_db_desc=Forgejo tarvitsee toimiakseen MySQL, PostgreSQL, SQLite3 tai TiDB (MySQL protokolla) tietokannan.
 | 
			
		||||
db_title=Tietokanta asetukset
 | 
			
		||||
db_type=Tietokanta tyyppi
 | 
			
		||||
host=Isäntä
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -211,7 +211,7 @@ reinstall_error = Sinusubukan mong mag-install sa umiiral na Forgejo database
 | 
			
		|||
install = Pag-install
 | 
			
		||||
title = Paunang pagsasaayos
 | 
			
		||||
docker_helper = Kapag tinatakbo mo ang Forgejo sa loob ng Docker, mangyaring basahin ang <a target="_blank" rel="noopener noreferrer" href="%s">dokumentasyon</a> bago baguhin ang anumang mga setting.
 | 
			
		||||
require_db_desc = Kinakailangan ng Forgejo ang MySQL, PostgreSQL, MSSQL, SQLite3 o TiDB (MySQL protocol).
 | 
			
		||||
require_db_desc = Kinakailangan ng Forgejo ang MySQL, PostgreSQL, SQLite3 o TiDB (MySQL protocol).
 | 
			
		||||
db_title = Mga setting ng database
 | 
			
		||||
db_type = Uri ng database
 | 
			
		||||
host = Host
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -218,7 +218,7 @@ license_desc=Toutes les sources sont sur <a target="_blank" rel="noopener norefe
 | 
			
		|||
install=Installation
 | 
			
		||||
title=Configuration initiale
 | 
			
		||||
docker_helper=Si vous exécutez Forgejo dans Docker, veuillez lire la <a target="_blank" rel="noopener noreferrer" href="%s">documentation</a> avant de modifier les paramètres.
 | 
			
		||||
require_db_desc=Forgejo nécessite MySQL, PostgreSQL, MSSQL, SQLite3 ou TiDB (avec le protocole MySQL).
 | 
			
		||||
require_db_desc=Forgejo nécessite MySQL, PostgreSQL, SQLite3 ou TiDB (avec le protocole MySQL).
 | 
			
		||||
db_title=Paramètres de la base de données
 | 
			
		||||
db_type=Type de base de données
 | 
			
		||||
host=Hôte
 | 
			
		||||
| 
						 | 
				
			
			@ -3388,14 +3388,12 @@ self_check.database_collation_mismatch = La base de donnée devrait utiliser la
 | 
			
		|||
self_check.database_collation_case_insensitive = La base de donnée utilise la collation %s qui  n'est pas sensible à la casse. Bien que Forgejo puisse fonctionner de cette façon, il est possible que certains cas limite d'utilisation de la casse ne fonctionne pas comme attendu.
 | 
			
		||||
self_check.database_inconsistent_collation_columns = La base de donnée utilise la collation %s, mais ces colonnes utilisent des collations incohérentes. Cela peut causer des problèmes inattendus.
 | 
			
		||||
self_check.database_fix_mysql = Les utilisateurs de MySQL/MariaDB peuvent utiliser la commande "forgejo doctor convert" pour corriger les problèmes de collation, ou bien manuellement avec la commande SQL "ALTER ... COLLATE ...".
 | 
			
		||||
self_check.database_fix_mssql = Les utilisateurs de MSSQL sont pour l'instant contraint d'utiliser la commande SQL "ALTER ... COLLATE ..." pour corriger ce problème.
 | 
			
		||||
 | 
			
		||||
self_check.no_problem_found=Aucun problème trouvé pour l’instant.
 | 
			
		||||
self_check.database_collation_mismatch=Exige que la base de données utilise la collation %s.
 | 
			
		||||
self_check.database_collation_case_insensitive=La base de données utilise la collation %s, insensible à la casse. Bien que Gitea soit compatible, il peut y avoir quelques rares cas qui ne fonctionnent pas comme prévu.
 | 
			
		||||
self_check.database_inconsistent_collation_columns=La base de données utilise la collation %s, mais ces colonnes utilisent des collations différentes. Cela peut causer des problèmes imprévus.
 | 
			
		||||
self_check.database_fix_mysql=Pour les utilisateurs de MySQL ou MariaDB, vous pouvez utiliser la commande « gitea doctor convert » dans un terminal ou exécuter une requête du type « ALTER … COLLATE ... » pour résoudre les problèmes de collation.
 | 
			
		||||
self_check.database_fix_mssql=Pour les utilisateurs de MSSQL, vous ne pouvez résoudre le problème qu’en exécutant une requête SQL du type « ALTER … COLLATE … ».
 | 
			
		||||
 | 
			
		||||
[action]
 | 
			
		||||
create_repo=a créé le dépôt <a href="%s">%s</a>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -141,7 +141,7 @@ license_desc=Sæktu <a target="_blank" rel="noopener noreferrer" href="https://f
 | 
			
		|||
install=Uppsetning
 | 
			
		||||
title=Upphafleg Uppsetning
 | 
			
		||||
docker_helper=Ef þú keyrir Forgejo inni í Docker þá viltu vinsamlegast lesa <a target="_blank" rel="noopener noreferrer" href="%s">leiðbeiningaritið</a> áður en þú breytir stillingum.
 | 
			
		||||
require_db_desc=Forgejo krefst MySQL, PostgreSQL, MSSQL, SQLite3 eða TiDB (MySQL samskiptareglur).
 | 
			
		||||
require_db_desc=Forgejo krefst MySQL, PostgreSQL, SQLite3 eða TiDB (MySQL samskiptareglur).
 | 
			
		||||
db_title=Gagnagrunnsstillingar
 | 
			
		||||
db_type=Tegund Gagnagrunns
 | 
			
		||||
host=Hýsill
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -215,7 +215,7 @@ install_desc = Semplicemente <a target="_blank" rel="noopener noreferrer" href="
 | 
			
		|||
install=Installazione
 | 
			
		||||
title=Configurazione iniziale
 | 
			
		||||
docker_helper=Se stai usando Forgejo con Docker, leggi <a target="_blank" rel="noopener noreferrer" href="%s">la documentazione</a> prima di cambiare qualsiasi impostazione.
 | 
			
		||||
require_db_desc=Forgejo requires MySQL, PostgreSQL, MSSQL, SQLite3 or TiDB (MySQL protocol).
 | 
			
		||||
require_db_desc=Forgejo requires MySQL, PostgreSQL, SQLite3 or TiDB (MySQL protocol).
 | 
			
		||||
db_title=Impostazioni database
 | 
			
		||||
db_type=Tipo di database
 | 
			
		||||
host=Host
 | 
			
		||||
| 
						 | 
				
			
			@ -3351,7 +3351,6 @@ monitor.queue.settings.remove_all_items_done = Tutti gli elementi in coda sono s
 | 
			
		|||
self_check.database_collation_mismatch = Pretendi che la base di dati usi la collazione: %s
 | 
			
		||||
self_check.database_fix_mysql = Per utenti MySQL/MariaDB, potresti usare il comando "gitea doctor convert" per risolvere problemi di collazione, o potresti risolvere il problema manualmente tramite SQL con "ALTER ... COLLATE ...".
 | 
			
		||||
self_check.database_collation_case_insensitive = La base di dati sta usando la collazione %s, che è una collazione insensibile. Nonostante Forgejo potrebbe lavorarci, ci potrebbero essere rari casi che non vanno come previsto.
 | 
			
		||||
self_check.database_fix_mssql = Gli utenti MSSQL possono provare a risolvere il problema tramite SQL con "ALTER ... COLLATE ..." manualmente, per il momento.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
[action]
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -214,7 +214,7 @@ license_desc=Go get <a target="_blank" rel="noopener noreferrer" href="https://f
 | 
			
		|||
install=インストール
 | 
			
		||||
title=初期設定
 | 
			
		||||
docker_helper=ForgejoをDocker内で実行する場合は、設定を変更する前に<a target="_blank" rel="noopener noreferrer" href="%s">ドキュメント</a>を読んでください。
 | 
			
		||||
require_db_desc=Forgejoには、MySQL、PostgreSQL、MSSQL、SQLite3、またはTiDB(MySQL プロトコル) が必要です。
 | 
			
		||||
require_db_desc=Forgejoには、MySQL、PostgreSQL、SQLite3、またはTiDB(MySQL プロトコル) が必要です。
 | 
			
		||||
db_title=データベース設定
 | 
			
		||||
db_type=データベースのタイプ
 | 
			
		||||
host=ホスト
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -197,7 +197,7 @@ license_desc=Iegūsti <a target="_blank" rel="noopener noreferrer" href="https:/
 | 
			
		|||
install=Instalācija
 | 
			
		||||
title=Sākotnējā konfigurācija
 | 
			
		||||
docker_helper=Ja Forgejo ir uzstādīts Docker konteinerī, izlasiet <a target="_blank" rel="noopener noreferrer" href="%s">vadlīninas</a> pirms maināt iestatījumus.
 | 
			
		||||
require_db_desc=Forgejo nepieciešams MySQL, PostgreSQL, MSSQL, SQLite3 vai TiDB (izmantojot MySQL protokolu).
 | 
			
		||||
require_db_desc=Forgejo nepieciešams MySQL, PostgreSQL, SQLite3 vai TiDB (izmantojot MySQL protokolu).
 | 
			
		||||
db_title=Datu bāzes iestatījumi
 | 
			
		||||
db_type=Datu bāzes veids
 | 
			
		||||
host=Resursdators
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -217,7 +217,7 @@ install_desc = Draai gewoon <a target="_blank" rel="noopener noreferrer" href="h
 | 
			
		|||
install=Installatie
 | 
			
		||||
title=Initiële configuratie
 | 
			
		||||
docker_helper=Als je gitea draait in Docker, Lees eerst de <a target="_blank" rel="noopener noreferrer" href="%s">documentatie</a> voordat je een instelling aanpast.
 | 
			
		||||
require_db_desc=Forgejo vereist MySQL, PostgreSQL, MSSQL, SQLite3 of TiDB (MySQL protocol).
 | 
			
		||||
require_db_desc=Forgejo vereist MySQL, PostgreSQL, SQLite3 of TiDB (MySQL protocol).
 | 
			
		||||
db_title=Database-instellingen
 | 
			
		||||
db_type=Database-type
 | 
			
		||||
host=Server
 | 
			
		||||
| 
						 | 
				
			
			@ -3323,7 +3323,6 @@ dashboard.sync_repo_branches = Synchroniseren gemiste branches van git data naar
 | 
			
		|||
monitor.processes_count = %d Processen
 | 
			
		||||
monitor.process.children = Kinderen
 | 
			
		||||
self_check.database_inconsistent_collation_columns = Database gebruikt collatie %s, maar deze kolommen gebruiken onjuiste collaties. Dit kan onverwachte problemen veroorzaken.
 | 
			
		||||
self_check.database_fix_mssql = Voor MSSQL gebruikers kan je het probleem alleen oplossen door "ALTER ... COLLATE ..." SQL's handmatig op te lossen.
 | 
			
		||||
monitor.stacktrace = Stacktrace
 | 
			
		||||
monitor.download_diagnosis_report = Diagnoserapport downloaden
 | 
			
		||||
self_check.database_collation_case_insensitive = Database gebruikt collatie %s, wat een ongevoelige collatie is. Hoewel Forgejo ermee kan werken, kunnen er enkele zeldzame gevallen zijn die niet werken zoals verwacht.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -160,7 +160,7 @@ license_desc=Pobierz na <a target="_blank" rel="noopener noreferrer" href="https
 | 
			
		|||
install=Instalacja
 | 
			
		||||
title=Wstępna konfiguracja
 | 
			
		||||
docker_helper=Jeśli używasz Forgejo za pomocą Docker'a, przeczytaj <a target="_blank" rel="noopener noreferrer" href="%s">dokumentację</a> przed wprowadzeniem jakichkolwiek zmian.
 | 
			
		||||
require_db_desc=Forgejo wymaga MySQL, PostgreSQL, MSSQL, SQLite3 lub TiDB (protokół MySQL).
 | 
			
		||||
require_db_desc=Forgejo wymaga MySQL, PostgreSQL, SQLite3 lub TiDB (protokół MySQL).
 | 
			
		||||
db_title=Ustawienia bazy danych
 | 
			
		||||
db_type=Typ bazy danych
 | 
			
		||||
host=Serwer
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -205,7 +205,7 @@ install_desc = Apenas <a target="_blank" rel="noopener noreferrer" href="https:/
 | 
			
		|||
install=Instalação
 | 
			
		||||
title=Configuração inicial
 | 
			
		||||
docker_helper=Se você está rodando o Forgejo dentro do Docker, por favor leia a <a target="_blank" rel="noopener noreferrer" href="%s">documentação</a> cuidadosamente antes de alterar qualquer coisa nesta página.
 | 
			
		||||
require_db_desc=Forgejo requer MySQL, PostgreSQL, MSSQL, SQLite3 ou TiDB (protocolo MySQL).
 | 
			
		||||
require_db_desc=Forgejo requer MySQL, PostgreSQL, SQLite3 ou TiDB (protocolo MySQL).
 | 
			
		||||
db_title=Configurações de banco de dados
 | 
			
		||||
db_type=Tipo de banco de dados
 | 
			
		||||
host=Servidor
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -198,7 +198,7 @@ license_desc=Vá buscá-lo em <a target="_blank" rel="noopener noreferrer" href=
 | 
			
		|||
install=Instalação
 | 
			
		||||
title=Configuração inicial
 | 
			
		||||
docker_helper=Se correr o Forgejo dentro do Docker, leia a <a target="_blank" rel="noopener noreferrer" href="%s">documentação</a> antes de alterar quaisquer configurações.
 | 
			
		||||
require_db_desc=Forgejo requer MySQL, PostgreSQL, MSSQL, SQLite3 ou TiDB (protocolo MySQL).
 | 
			
		||||
require_db_desc=Forgejo requer MySQL, PostgreSQL, SQLite3 ou TiDB (protocolo MySQL).
 | 
			
		||||
db_title=Configurações da base de dados
 | 
			
		||||
db_type=Tipo de base de dados
 | 
			
		||||
host=Servidor
 | 
			
		||||
| 
						 | 
				
			
			@ -3256,7 +3256,6 @@ self_check.database_collation_mismatch=Supor que a base de dados usa a colação
 | 
			
		|||
self_check.database_collation_case_insensitive=A base de dados está a usar a colação %s, que é insensível à diferença entre maiúsculas e minúsculas. Embora o Gitea possa trabalhar com ela, pode haver alguns casos raros que não funcionem como esperado.
 | 
			
		||||
self_check.database_inconsistent_collation_columns=A base de dados está a usar a colação %s, mas estas colunas estão a usar colações diferentes. Isso poderá causar alguns problemas inesperados.
 | 
			
		||||
self_check.database_fix_mysql=Para utilizadores do MySQL/MariaDB, pode usar o comando "gitea doctor convert" para resolver os problemas de colação. Também pode resolver o problema com comandos SQL "ALTER ... COLLATE ..." aplicados manualmente.
 | 
			
		||||
self_check.database_fix_mssql=Para utilizadores do MSSQL só pode resolver o problema aplicando comandos SQL "ALTER ... COLLATE ..." manualmente, por enquanto.
 | 
			
		||||
 | 
			
		||||
[action]
 | 
			
		||||
create_repo=criou o repositório <a href="%s">%s</a>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -217,7 +217,7 @@ license_desc=Всё это на <a target="_blank" rel="noopener noreferrer" hre
 | 
			
		|||
install=Установка
 | 
			
		||||
title=Начальная конфигурация
 | 
			
		||||
docker_helper=Если вы запускаете Forgejo под Docker, пожалуйста, ознакомьтесь с <a target="_blank" rel="noopener noreferrer" href="%s">документацией</a>, прежде чем изменять любые настройки.
 | 
			
		||||
require_db_desc=Forgejo требует MySQL, PostgreSQL, MSSQL, SQLite3 или TiDB (по протоколу MySQL).
 | 
			
		||||
require_db_desc=Forgejo требует MySQL, PostgreSQL, SQLite3 или TiDB (по протоколу MySQL).
 | 
			
		||||
db_title=Настройки базы данных
 | 
			
		||||
db_type=Тип базы данных
 | 
			
		||||
host=Хост
 | 
			
		||||
| 
						 | 
				
			
			@ -3349,7 +3349,6 @@ notices.delete_success=Уведомления системы были удале
 | 
			
		|||
self_check.no_problem_found = Пока проблем не обнаружено.
 | 
			
		||||
auths.tip.gitea = Зарегистрируйте новое приложение OAuth2. Доступна инструкция: https://forgejo.org/docs/latest/user/oauth2-provider
 | 
			
		||||
auths.tips.oauth2.general.tip = При регистрации нового приложения OAuth2 ссылка обратного перенаправления должна быть:
 | 
			
		||||
self_check.database_fix_mssql = В настоящий момент пользователи MSSQL могут исправить проблемы с сопоставлением только ручным прописыванием "ALTER ... COLLATE ..." в SQL.
 | 
			
		||||
self_check.database_fix_mysql = Пользователи MySQL и MariaDB могут исправить проблемы с сопоставлением командой "gitea doctor convert". Также можно вручную вписать "ALTER ... COLLATE ..." в SQL.
 | 
			
		||||
dashboard.cleanup_actions = Очистить устаревшие журналы и артефакты Действий
 | 
			
		||||
dashboard.sync_repo_branches = Синхронизировать ветки из Git в базу данных
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -196,7 +196,7 @@ license_desc=Získajte <a target="_blank" rel="noopener noreferrer" href="https:
 | 
			
		|||
install=Inštalácia
 | 
			
		||||
title=Východzia konfigurácia
 | 
			
		||||
docker_helper=Ak spúšťate Forgejo v Docker kontajneri, prečítajte si <a target="_blank" rel="noopener noreferrer" href="%s">dokumentáciu</a> pred zmenou akýchkoľvek nastavení.
 | 
			
		||||
require_db_desc=Forgejo vyžaduje MySQL, PostgreSQL, MSSQL, SQLite3 alebo TiDB (MySQL protokol).
 | 
			
		||||
require_db_desc=Forgejo vyžaduje MySQL, PostgreSQL, SQLite3 alebo TiDB (MySQL protokol).
 | 
			
		||||
db_title=Nastavenie databázy
 | 
			
		||||
db_type=Typ databázy
 | 
			
		||||
host=Host
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -133,7 +133,7 @@ pull_requests = Zahteve za umik
 | 
			
		|||
 | 
			
		||||
[install]
 | 
			
		||||
reinstall_confirm_check_3 = Potrjujete, da ste popolnoma prepričani, da se ta program Forgejo izvaja s pravilno lokacijo app.ini, in da ste prepričani, da ga morate znova namestiti. Potrjujete, da se zavedate zgoraj navedenih tveganj.
 | 
			
		||||
require_db_desc = Forgejo zahteva MySQL, PostgreSQL, MSSQL, SQLite3 ali TiDB (protokol MySQL).
 | 
			
		||||
require_db_desc = Forgejo zahteva MySQL, PostgreSQL, SQLite3 ali TiDB (protokol MySQL).
 | 
			
		||||
password_algorithm_helper = Nastavite algoritem za stiskanje gesla. Algoritmi imajo različne zahteve in moč. Algoritem argon2 je precej varen, vendar porabi veliko pomnilnika in je lahko neprimeren za majhne sisteme.
 | 
			
		||||
reinstall_confirm_message = Ponovna namestitev z obstoječo zbirko podatkov Forgejo lahko povzroči več težav. V večini primerov morate za zagon programa Forgejo uporabiti obstoječi "app.ini". Če veste, kaj počnete, potrdite naslednje:
 | 
			
		||||
err_admin_name_is_reserved = Administrator Uporabniško ime je neveljavno, uporabniško ime je rezervirano
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -197,7 +197,7 @@ license_desc=Gidin ve <a target="_blank" rel="noopener noreferrer" href="https:/
 | 
			
		|||
install=Kurulum
 | 
			
		||||
title=Başlangıç Yapılandırması
 | 
			
		||||
docker_helper=Eğer Forgejo'yı Docker içerisinde çalıştırıyorsanız, lütfen herhangi bir değişiklik yapmadan önce <a target="_blank" rel="noopener noreferrer" href="%s">belgeleri</a> okuyun.
 | 
			
		||||
require_db_desc=Forgejo MySQL, PostgreSQL, MSSQL, SQLite3 veya TiDB (MySQL protokolü) gerektirir.
 | 
			
		||||
require_db_desc=Forgejo MySQL, PostgreSQL, SQLite3 veya TiDB (MySQL protokolü) gerektirir.
 | 
			
		||||
db_title=Veritabanı Ayarları
 | 
			
		||||
db_type=Veritabanı Türü
 | 
			
		||||
host=Sunucu
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -215,7 +215,7 @@ license_desc=所有的代码都开源在 <a target="_blank" rel="noopener norefe
 | 
			
		|||
install=安装页面
 | 
			
		||||
title=初始配置
 | 
			
		||||
docker_helper=如果您正在使用 Docker 容器运行 Forgejo,请务必先仔细阅读 <a target="_blank" rel="noopener noreferrer" href="%s">官方文档</a> 后再对本页面进行填写。
 | 
			
		||||
require_db_desc=Forgejo 需要使用 MySQL、PostgreSQL、MSSQL、SQLite3 或 TiDB (MySQL协议) 等数据库
 | 
			
		||||
require_db_desc=Forgejo 需要使用 MySQL、PostgreSQL、SQLite3 或 TiDB (MySQL协议) 等数据库
 | 
			
		||||
db_title=数据库设置
 | 
			
		||||
db_type=数据库类型
 | 
			
		||||
host=数据库主机
 | 
			
		||||
| 
						 | 
				
			
			@ -3377,14 +3377,12 @@ self_check.database_collation_mismatch = 期望数据库使用排序规则:%s
 | 
			
		|||
self_check.database_collation_case_insensitive = 数据库正在使用 %s 排序规则,这是一种不敏感的排序规则。 尽管 Forgejo 可以使用它,但在极少数情况下可能无法按照预期工作。
 | 
			
		||||
self_check.database_inconsistent_collation_columns = 数据库正在使用 %s 排序规则,但与这些列使用的排序规则不匹配。 这可能会导致一些意想不到的问题。
 | 
			
		||||
self_check.database_fix_mysql = 对于 MySQL/MariaDB 用户,您可以使用 "gitea doctor convert" 命令来修复排序规则问题,也可以通过SQL命令 "ALTER ... COLLATE ..." 来手动修复问题。
 | 
			
		||||
self_check.database_fix_mssql = 对于 MSSQL 用户,目前您只能通过SQL命令 "ALTER ... COLLATE ..." 来手动修复问题。
 | 
			
		||||
 | 
			
		||||
self_check.no_problem_found=尚未发现问题。
 | 
			
		||||
self_check.database_collation_mismatch=期望数据库使用的校验方式:%s
 | 
			
		||||
self_check.database_collation_case_insensitive=数据库正在使用一个校验 %s, 这是一个不敏感的校验. 虽然Gitea可以与它合作,但可能有一些罕见的情况不如预期的那样起作用。
 | 
			
		||||
self_check.database_inconsistent_collation_columns=数据库正在使用%s的排序规则,但是这些列使用了不匹配的排序规则。这可能会造成一些意外问题。
 | 
			
		||||
self_check.database_fix_mysql=对于MySQL/MariaDB用户,您可以使用“gitea doctor convert”命令来解决校验问题。 或者您也可以通过 "ALTER ... COLLATE ..." 这样的SQL 来手动解决这个问题。
 | 
			
		||||
self_check.database_fix_mssql=对于MSSQL用户,您现在只能通过"ALTER ... COLLATE ..."SQLs手动解决这个问题。
 | 
			
		||||
auths.tips.gmail_settings = Gmail 设置:
 | 
			
		||||
auths.tip.gitlab_new = 在 https://gitlab.com/-/profile/applications 上注册新应用
 | 
			
		||||
config_settings = 设置
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -211,7 +211,7 @@ license_desc=取得 <a target="_blank" rel="noopener noreferrer" href="https://f
 | 
			
		|||
install=安裝頁面
 | 
			
		||||
title=初始組態
 | 
			
		||||
docker_helper=如果您在 Docker 中執行 Forgejo,請先閱讀<a target="_blank" rel="noopener noreferrer" href="%s">安裝指南</a>再來調整設定。
 | 
			
		||||
require_db_desc=Forgejo 需要 MySQL、PostgreSQL、SQLite3、MSSQL、TiDB (MySQL 協定) 等其中一項。
 | 
			
		||||
require_db_desc=Forgejo 需要 MySQL、PostgreSQL、SQLite3、TiDB (MySQL 協定) 等其中一項。
 | 
			
		||||
db_title=資料庫設定
 | 
			
		||||
db_type=資料庫類型
 | 
			
		||||
host=主機
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -654,7 +654,7 @@ func registerRoutes(m *web.Route) {
 | 
			
		|||
		m.Get("/system_status", admin.SystemStatus)
 | 
			
		||||
		m.Post("", web.Bind(forms.AdminDashboardForm{}), admin.DashboardPost)
 | 
			
		||||
 | 
			
		||||
		if setting.Database.Type.IsMySQL() || setting.Database.Type.IsMSSQL() {
 | 
			
		||||
		if setting.Database.Type.IsMySQL() {
 | 
			
		||||
			m.Get("/self_check", admin.SelfCheck)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4,7 +4,7 @@
 | 
			
		|||
		<a class="{{if .PageIsAdminDashboard}}active {{end}}item" href="{{AppSubUrl}}/admin">
 | 
			
		||||
			{{ctx.Locale.Tr "admin.dashboard"}}
 | 
			
		||||
		</a>
 | 
			
		||||
		{{if or .DatabaseType.IsMySQL .DatabaseType.IsMSSQL}}
 | 
			
		||||
		{{if .DatabaseType.IsMySQL}}
 | 
			
		||||
		<a class="{{if .PageIsAdminSelfCheck}}active {{end}}item" href="{{AppSubUrl}}/admin/self_check">
 | 
			
		||||
			{{ctx.Locale.Tr "admin.self_check"}}
 | 
			
		||||
		</a>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -8,8 +8,6 @@
 | 
			
		|||
		{{if .DatabaseCheckHasProblems}}
 | 
			
		||||
			{{if .DatabaseType.IsMySQL}}
 | 
			
		||||
				<div class="tw-p-2">{{ctx.Locale.Tr "admin.self_check.database_fix_mysql"}}</div>
 | 
			
		||||
			{{else if .DatabaseType.IsMSSQL}}
 | 
			
		||||
				<div class="tw-p-2">{{ctx.Locale.Tr "admin.self_check.database_fix_mssql"}}</div>
 | 
			
		||||
			{{end}}
 | 
			
		||||
			{{if .DatabaseCheckCollationMismatch}}
 | 
			
		||||
				<div class="ui red message">{{ctx.Locale.Tr "admin.self_check.database_collation_mismatch" .DatabaseCheckResult.ExpectedCollation}}</div>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -7,7 +7,6 @@ They can be run with make commands for the appropriate backends, namely:
 | 
			
		|||
make test-sqlite
 | 
			
		||||
make test-pgsql
 | 
			
		||||
make test-mysql
 | 
			
		||||
make test-mssql
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Make sure to perform a clean front-end build before running tests:
 | 
			
		||||
| 
						 | 
				
			
			@ -53,16 +52,6 @@ Start tests based on the database container
 | 
			
		|||
TEST_PGSQL_HOST=localhost:5432 TEST_PGSQL_DBNAME=test TEST_PGSQL_USERNAME=postgres TEST_PGSQL_PASSWORD=postgres make test-e2e-pgsql
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## Run mssql e2e tests
 | 
			
		||||
Setup a mssql database inside docker
 | 
			
		||||
```
 | 
			
		||||
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_PID=Standard" -e "SA_PASSWORD=MwantsaSecurePassword1" -p 1433:1433 --rm --name mssql microsoft/mssql-server-linux:latest #(just ctrl-c to stop db and clean the container)
 | 
			
		||||
```
 | 
			
		||||
Start tests based on the database container
 | 
			
		||||
```
 | 
			
		||||
TEST_MSSQL_HOST=localhost:1433 TEST_MSSQL_DBNAME=gitea_test TEST_MSSQL_USERNAME=sa TEST_MSSQL_PASSWORD=MwantsaSecurePassword1 make test-e2e-mssql
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## Running individual tests
 | 
			
		||||
 | 
			
		||||
Example command to run `example.test.e2e.js` test file:
 | 
			
		||||
| 
						 | 
				
			
			@ -75,10 +64,10 @@ For SQLite:
 | 
			
		|||
make test-e2e-sqlite#example
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
For other databases(replace `mssql` to `mysql` or `pgsql`):
 | 
			
		||||
For PostgreSQL databases(replace `mysql` to `pgsql`):
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
TEST_MSSQL_HOST=localhost:1433 TEST_MSSQL_DBNAME=test TEST_MSSQL_USERNAME=sa TEST_MSSQL_PASSWORD=MwantsaSecurePassword1 make test-e2e-mssql#example
 | 
			
		||||
TEST_MYSQL_HOST=localhost:1433 TEST_MYSQL_DBNAME=test TEST_MYSQL_USERNAME=sa TEST_MYSQL_PASSWORD=MwantsaSecurePassword1 make test-e2e-mysql#example
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## Visual testing
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -6,7 +6,6 @@ appropriate backends, namely:
 | 
			
		|||
make test-sqlite
 | 
			
		||||
make test-pgsql
 | 
			
		||||
make test-mysql
 | 
			
		||||
make test-mssql
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Make sure to perform a clean build before running tests:
 | 
			
		||||
| 
						 | 
				
			
			@ -63,16 +62,6 @@ Start tests based on the database container
 | 
			
		|||
TEST_PGSQL_HOST=localhost:5432 TEST_PGSQL_DBNAME=test TEST_PGSQL_USERNAME=postgres TEST_PGSQL_PASSWORD=postgres make test-pgsql
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## Run mssql integration tests
 | 
			
		||||
Setup a mssql database inside docker
 | 
			
		||||
```
 | 
			
		||||
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_PID=Standard" -e "SA_PASSWORD=MwantsaSecurePassword1" -p 1433:1433 --rm --name mssql microsoft/mssql-server-linux:latest #(just ctrl-c to stop db and clean the container)
 | 
			
		||||
```
 | 
			
		||||
Start tests based on the database container
 | 
			
		||||
```
 | 
			
		||||
TEST_MSSQL_HOST=localhost:1433 TEST_MSSQL_DBNAME=gitea_test TEST_MSSQL_USERNAME=sa TEST_MSSQL_PASSWORD=MwantsaSecurePassword1 make test-mssql
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## Running individual tests
 | 
			
		||||
 | 
			
		||||
Example command to run GPG test:
 | 
			
		||||
| 
						 | 
				
			
			@ -83,10 +72,10 @@ For SQLite:
 | 
			
		|||
make test-sqlite#GPG
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
For other databases(replace `mssql` to `mysql`, or `pgsql`):
 | 
			
		||||
For other databases (replace `mysql` to `pgsql`):
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
TEST_MSSQL_HOST=localhost:1433 TEST_MSSQL_DBNAME=test TEST_MSSQL_USERNAME=sa TEST_MSSQL_PASSWORD=MwantsaSecurePassword1 make test-mssql#GPG
 | 
			
		||||
TEST_MYSQL_HOST=localhost:1433 TEST_MYSQL_DBNAME=test TEST_MYSQL_USERNAME=sa TEST_MYSQL_PASSWORD=MwantsaSecurePassword1 make test-mysql#GPG
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## Setting timeouts for declaring long-tests and long-flushes
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -59,16 +59,6 @@ docker run -e "POSTGRES_DB=test" -p 5432:5432 --rm --name pgsql postgres:14 #(ju
 | 
			
		|||
TEST_PGSQL_HOST=localhost:5432 TEST_PGSQL_DBNAME=test TEST_PGSQL_USERNAME=postgres TEST_PGSQL_PASSWORD=postgres make test-pgsql
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## Run mssql integration tests
 | 
			
		||||
同上,首先在 docker 容器里部署一个 mssql 数据库
 | 
			
		||||
```
 | 
			
		||||
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_PID=Standard" -e "SA_PASSWORD=MwantsaSecurePassword1" -p 1433:1433 --rm --name mssql microsoft/mssql-server-linux:latest #(just ctrl-c to stop db and clean the container) 
 | 
			
		||||
```
 | 
			
		||||
之后便可以基于这个数据库进行集成测试
 | 
			
		||||
```
 | 
			
		||||
TEST_MSSQL_HOST=localhost:1433 TEST_MSSQL_DBNAME=gitea_test TEST_MSSQL_USERNAME=sa TEST_MSSQL_PASSWORD=MwantsaSecurePassword1 make test-mssql
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## 如何进行自定义的集成测试
 | 
			
		||||
 | 
			
		||||
下面的示例展示了怎样在集成测试中只进行 GPG 测试:
 | 
			
		||||
| 
						 | 
				
			
			@ -79,9 +69,9 @@ sqlite 数据库:
 | 
			
		|||
make test-sqlite#GPG
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
其它数据库(把 MSSQL 替换为 MYSQL, PGSQL):
 | 
			
		||||
其它数据库 (用 PGSQL 取代 MYSQL):
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
TEST_MSSQL_HOST=localhost:1433 TEST_MSSQL_DBNAME=test TEST_MSSQL_USERNAME=sa TEST_MSSQL_PASSWORD=MwantsaSecurePassword1 make test-mssql#GPG
 | 
			
		||||
TEST_MYSQL_HOST=localhost:1433 TEST_MYSQL_DBNAME=test TEST_MYSQL_USERNAME=sa TEST_MYSQL_PASSWORD=MwantsaSecurePassword1 make test-mysql#GPG
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -39,7 +39,7 @@ func TestDatabaseCollationSelfCheckUI(t *testing.T) {
 | 
			
		|||
		htmlDoc.AssertElement(t, "a.item[href*='/admin/self_check']", exists)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if setting.Database.Type.IsMySQL() || setting.Database.Type.IsMSSQL() {
 | 
			
		||||
	if setting.Database.Type.IsMySQL() {
 | 
			
		||||
		assertSelfCheckExists(true)
 | 
			
		||||
	} else {
 | 
			
		||||
		assertSelfCheckExists(false)
 | 
			
		||||
| 
						 | 
				
			
			@ -61,10 +61,9 @@ func TestDatabaseCollation(t *testing.T) {
 | 
			
		|||
	assert.EqualValues(t, 2, cnt)
 | 
			
		||||
	_, _ = x.Exec("DROP TABLE IF EXISTS test_collation_tbl")
 | 
			
		||||
 | 
			
		||||
	// by default, SQLite3 and PostgreSQL are using case-sensitive collations, but MySQL and MSSQL are not
 | 
			
		||||
	// the following tests are only for MySQL and MSSQL
 | 
			
		||||
	if !setting.Database.Type.IsMySQL() && !setting.Database.Type.IsMSSQL() {
 | 
			
		||||
		t.Skip("only MySQL and MSSQL requires the case-sensitive collation check at the moment")
 | 
			
		||||
	// by default, SQLite3 and PostgreSQL are using case-sensitive collations, but MySQL is not.
 | 
			
		||||
	if !setting.Database.Type.IsMySQL() {
 | 
			
		||||
		t.Skip("only MySQL requires the case-sensitive collation check at the moment")
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -86,20 +85,11 @@ func TestDatabaseCollation(t *testing.T) {
 | 
			
		|||
			assert.True(t, r.CollationEquals("abc", "abc"))
 | 
			
		||||
			assert.True(t, r.CollationEquals("abc", "utf8mb4_abc"))
 | 
			
		||||
			assert.False(t, r.CollationEquals("utf8mb4_general_ci", "utf8mb4_unicode_ci"))
 | 
			
		||||
		} else if setting.Database.Type.IsMSSQL() {
 | 
			
		||||
			assert.True(t, r.IsCollationCaseSensitive("Latin1_General_CS_AS"))
 | 
			
		||||
			assert.False(t, r.IsCollationCaseSensitive("Latin1_General_CI_AS"))
 | 
			
		||||
			assert.True(t, r.CollationEquals("abc", "abc"))
 | 
			
		||||
			assert.False(t, r.CollationEquals("Latin1_General_CS_AS", "SQL_Latin1_General_CP1_CS_AS"))
 | 
			
		||||
		} else {
 | 
			
		||||
			assert.Fail(t, "unexpected database type")
 | 
			
		||||
		}
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	if setting.Database.Type.IsMSSQL() {
 | 
			
		||||
		return // skip table converting tests because MSSQL doesn't have a simple solution at the moment
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	t.Run("Convert tables to utf8mb4_bin", func(t *testing.T) {
 | 
			
		||||
		defer tests.PrintCurrentTest(t)()
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							| 
						 | 
				
			
			@ -14,7 +14,6 @@ import (
 | 
			
		|||
	"path/filepath"
 | 
			
		||||
	"regexp"
 | 
			
		||||
	"sort"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"testing"
 | 
			
		||||
 | 
			
		||||
	"code.gitea.io/gitea/models/db"
 | 
			
		||||
| 
						 | 
				
			
			@ -258,31 +257,6 @@ func restoreOldDB(t *testing.T, version string) bool {
 | 
			
		|||
		_, err = db.Exec(data)
 | 
			
		||||
		assert.NoError(t, err)
 | 
			
		||||
		db.Close()
 | 
			
		||||
 | 
			
		||||
	case setting.Database.Type.IsMSSQL():
 | 
			
		||||
		host, port := setting.ParseMSSQLHostPort(setting.Database.Host)
 | 
			
		||||
		db, err := sql.Open("mssql", fmt.Sprintf("server=%s; port=%s; database=%s; user id=%s; password=%s;",
 | 
			
		||||
			host, port, "master", setting.Database.User, setting.Database.Passwd))
 | 
			
		||||
		assert.NoError(t, err)
 | 
			
		||||
		defer db.Close()
 | 
			
		||||
 | 
			
		||||
		_, err = db.Exec("DROP DATABASE IF EXISTS [gitea]")
 | 
			
		||||
		assert.NoError(t, err)
 | 
			
		||||
 | 
			
		||||
		statements := strings.Split(data, "\nGO\n")
 | 
			
		||||
		for _, statement := range statements {
 | 
			
		||||
			if len(statement) > 5 && statement[:5] == "USE [" {
 | 
			
		||||
				dbname := statement[5 : len(statement)-1]
 | 
			
		||||
				db.Close()
 | 
			
		||||
				db, err = sql.Open("mssql", fmt.Sprintf("server=%s; port=%s; database=%s; user id=%s; password=%s;",
 | 
			
		||||
					host, port, dbname, setting.Database.User, setting.Database.Passwd))
 | 
			
		||||
				assert.NoError(t, err)
 | 
			
		||||
				defer db.Close()
 | 
			
		||||
			}
 | 
			
		||||
			_, err = db.Exec(statement)
 | 
			
		||||
			assert.NoError(t, err, "Failure whilst running: %s\nError: %v", statement, err)
 | 
			
		||||
		}
 | 
			
		||||
		db.Close()
 | 
			
		||||
	}
 | 
			
		||||
	return true
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,107 +0,0 @@
 | 
			
		|||
APP_NAME = Gitea: Git with a cup of tea
 | 
			
		||||
RUN_MODE = prod
 | 
			
		||||
 | 
			
		||||
[database]
 | 
			
		||||
DB_TYPE  = mssql
 | 
			
		||||
HOST     = {{TEST_MSSQL_HOST}}
 | 
			
		||||
NAME     = {{TEST_MSSQL_DBNAME}}
 | 
			
		||||
USER     = {{TEST_MSSQL_USERNAME}}
 | 
			
		||||
PASSWD   = {{TEST_MSSQL_PASSWORD}}
 | 
			
		||||
SSL_MODE = disable
 | 
			
		||||
 | 
			
		||||
[indexer]
 | 
			
		||||
REPO_INDEXER_ENABLED = true
 | 
			
		||||
REPO_INDEXER_PATH = tests/{{TEST_TYPE}}/gitea-{{TEST_TYPE}}-mssql/indexers/repos.bleve
 | 
			
		||||
 | 
			
		||||
[queue.issue_indexer]
 | 
			
		||||
TYPE = level
 | 
			
		||||
DATADIR = tests/{{TEST_TYPE}}/gitea-{{TEST_TYPE}}-mssql/indexers/issues.queue
 | 
			
		||||
 | 
			
		||||
[queue]
 | 
			
		||||
TYPE = immediate
 | 
			
		||||
 | 
			
		||||
[repository]
 | 
			
		||||
ROOT = {{REPO_TEST_DIR}}tests/{{TEST_TYPE}}/gitea-{{TEST_TYPE}}-mssql/gitea-repositories
 | 
			
		||||
 | 
			
		||||
[repository.local]
 | 
			
		||||
LOCAL_COPY_PATH = tests/{{TEST_TYPE}}/gitea-{{TEST_TYPE}}-mssql/tmp/local-repo
 | 
			
		||||
 | 
			
		||||
[repository.upload]
 | 
			
		||||
TEMP_PATH = tests/{{TEST_TYPE}}/gitea-{{TEST_TYPE}}-mssql/tmp/uploads
 | 
			
		||||
 | 
			
		||||
[repository.signing]
 | 
			
		||||
SIGNING_KEY = none
 | 
			
		||||
 | 
			
		||||
[server]
 | 
			
		||||
SSH_DOMAIN       = localhost
 | 
			
		||||
HTTP_PORT        = 3003
 | 
			
		||||
ROOT_URL         = http://localhost:3003/
 | 
			
		||||
DISABLE_SSH      = false
 | 
			
		||||
SSH_LISTEN_HOST  = localhost
 | 
			
		||||
SSH_PORT         = 2201
 | 
			
		||||
START_SSH_SERVER = true
 | 
			
		||||
LFS_START_SERVER = true
 | 
			
		||||
OFFLINE_MODE     = false
 | 
			
		||||
LFS_JWT_SECRET   = Tv_MjmZuHqpIY6GFl12ebgkRAMt4RlWt0v4EHKSXO0w
 | 
			
		||||
APP_DATA_PATH    = tests/{{TEST_TYPE}}/gitea-{{TEST_TYPE}}-mssql/data
 | 
			
		||||
BUILTIN_SSH_SERVER_USER = git
 | 
			
		||||
SSH_TRUSTED_USER_CA_KEYS = ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCb4DC1dMFnJ6pXWo7GMxTchtzmJHYzfN6sZ9FAPFR4ijMLfGki+olvOMO5Fql1/yGnGfbELQa1S6y4shSvj/5K+zUFScmEXYf3Gcr87RqilLkyk16RS+cHNB1u87xTHbETaa3nyCJeGQRpd4IQ4NKob745mwDZ7jQBH8AZEng50Oh8y8fi8skBBBzaYp1ilgvzG740L7uex6fHV62myq0SXeCa+oJUjq326FU8y+Vsa32H8A3e7tOgXZPdt2TVNltx2S9H2WO8RMi7LfaSwARNfy1zu+bfR50r6ef8Yx5YKCMz4wWb1SHU1GS800mjOjlInLQORYRNMlSwR1+vLlVDciOqFapDSbj+YOVOawR0R1aqlSKpZkt33DuOBPx9qe6CVnIi7Z+Px/KqM+OLCzlLY/RS+LbxQpDWcfTVRiP+S5qRTcE3M3UioN/e0BE/1+MpX90IGpvVkA63ILYbKEa4bM3ASL7ChTCr6xN5XT+GpVJveFKK1cfNx9ExHI4rzYE=
 | 
			
		||||
 | 
			
		||||
[attachment]
 | 
			
		||||
PATH = tests/{{TEST_TYPE}}/gitea-{{TEST_TYPE}}-mssql/data/attachments
 | 
			
		||||
 | 
			
		||||
[mailer]
 | 
			
		||||
ENABLED = true
 | 
			
		||||
PROTOCOL = dummy
 | 
			
		||||
FROM = mssql-{{TEST_TYPE}}-test@gitea.io
 | 
			
		||||
 | 
			
		||||
[service]
 | 
			
		||||
REGISTER_EMAIL_CONFIRM            = false
 | 
			
		||||
REGISTER_MANUAL_CONFIRM           = false
 | 
			
		||||
DISABLE_REGISTRATION              = false
 | 
			
		||||
ENABLE_CAPTCHA                    = false
 | 
			
		||||
REQUIRE_SIGNIN_VIEW               = false
 | 
			
		||||
DEFAULT_KEEP_EMAIL_PRIVATE        = false
 | 
			
		||||
DEFAULT_ALLOW_CREATE_ORGANIZATION = true
 | 
			
		||||
NO_REPLY_ADDRESS                  = noreply.example.org
 | 
			
		||||
ENABLE_NOTIFY_MAIL                = true
 | 
			
		||||
 | 
			
		||||
[picture]
 | 
			
		||||
DISABLE_GRAVATAR              = false
 | 
			
		||||
ENABLE_FEDERATED_AVATAR       = false
 | 
			
		||||
AVATAR_UPLOAD_PATH            = tests/{{TEST_TYPE}}/gitea-{{TEST_TYPE}}-mssql/data/avatars
 | 
			
		||||
REPOSITORY_AVATAR_UPLOAD_PATH = tests/{{TEST_TYPE}}/gitea-{{TEST_TYPE}}-mssql/data/repo-avatars
 | 
			
		||||
 | 
			
		||||
[session]
 | 
			
		||||
PROVIDER        = file
 | 
			
		||||
PROVIDER_CONFIG = tests/{{TEST_TYPE}}/gitea-{{TEST_TYPE}}-mssql/data/sessions
 | 
			
		||||
 | 
			
		||||
[log]
 | 
			
		||||
MODE                 = {{TEST_LOGGER}}
 | 
			
		||||
ROOT_PATH            = {{REPO_TEST_DIR}}mssql-log
 | 
			
		||||
ENABLE_SSH_LOG       = true
 | 
			
		||||
logger.xorm.MODE     = file
 | 
			
		||||
 | 
			
		||||
[log.test]
 | 
			
		||||
LEVEL                = Info
 | 
			
		||||
COLORIZE             = true
 | 
			
		||||
 | 
			
		||||
[log.file]
 | 
			
		||||
LEVEL                = Debug
 | 
			
		||||
 | 
			
		||||
[security]
 | 
			
		||||
PASSWORD_HASH_ALGO = argon2
 | 
			
		||||
DISABLE_GIT_HOOKS = false
 | 
			
		||||
INSTALL_LOCK   = true
 | 
			
		||||
SECRET_KEY     = 9pCviYTWSb
 | 
			
		||||
INTERNAL_TOKEN = eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYmYiOjE0OTU1NTE2MTh9.hhSVGOANkaKk3vfCd2jDOIww4pUk0xtg9JRde5UogyQ
 | 
			
		||||
DISABLE_QUERY_AUTH_TOKEN = true
 | 
			
		||||
 | 
			
		||||
[lfs]
 | 
			
		||||
PATH = tests/{{TEST_TYPE}}/gitea-{{TEST_TYPE}}-mssql/data/lfs
 | 
			
		||||
 | 
			
		||||
[packages]
 | 
			
		||||
ENABLED = true
 | 
			
		||||
 | 
			
		||||
[actions]
 | 
			
		||||
ENABLED = true
 | 
			
		||||
| 
						 | 
				
			
			@ -162,18 +162,6 @@ func InitTest(requireGitea bool) {
 | 
			
		|||
				log.Fatal("db.Exec: CREATE SCHEMA: %v", err)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	case setting.Database.Type.IsMSSQL():
 | 
			
		||||
		host, port := setting.ParseMSSQLHostPort(setting.Database.Host)
 | 
			
		||||
		db, err := sql.Open("mssql", fmt.Sprintf("server=%s; port=%s; database=%s; user id=%s; password=%s;",
 | 
			
		||||
			host, port, "master", setting.Database.User, setting.Database.Passwd))
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			log.Fatal("sql.Open: %v", err)
 | 
			
		||||
		}
 | 
			
		||||
		if _, err := db.Exec(fmt.Sprintf("If(db_id(N'%s') IS NULL) BEGIN CREATE DATABASE %s; END;", setting.Database.Name, setting.Database.Name)); err != nil {
 | 
			
		||||
			log.Fatal("db.Exec: %v", err)
 | 
			
		||||
		}
 | 
			
		||||
		defer db.Close()
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	routers.InitWebInstalled(graceful.GetManager().HammerContext())
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -19,7 +19,6 @@ function initPreInstall() {
 | 
			
		|||
  const defaultDbHosts = {
 | 
			
		||||
    mysql: '127.0.0.1:3306',
 | 
			
		||||
    postgres: '127.0.0.1:5432',
 | 
			
		||||
    mssql: '127.0.0.1:1433',
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  const dbHost = document.getElementById('db_host');
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue