Compare commits

...

99 Commits

Author SHA1 Message Date
yp05327 7aa1ee7709
Merge db0bfbb3ea into 9b2536b78f 2024-04-27 10:47:26 +01:00
silverwind 9b2536b78f
Update misspell to 0.5.1 and add `misspellings.csv` (#30573)
Misspell 0.5.0 supports passing a csv file to extend the list of
misspellings, so I added some common ones from the codebase. There is at
least one typo in a API response so we need to decided whether to revert
that and then likely remove the dict entry.
2024-04-27 08:03:49 +00:00
silverwind dcc3c17e5c
Suppress browserslist warning in webpack target (#30571)
1. Set
[`BROWSERSLIST_IGNORE_OLD_DATA`](c6ddf7b387/node.js (L400))
to avoid warning on outdated browserslist data which the end user can
likely not do anything about and which is currently visible in the v1.21
branch.
2. Suppress all command echoing and add a "Running webpack..." message
in place.

Warning in question was this:

```
Browserslist: caniuse-lite is outdated. Please run:
  npx update-browserslist-db@latest
  Why you should do it regularly: https://github.com/browserslist/update-db#readme
```
2024-04-27 07:21:07 +00:00
GiteaBot 27861d711b [skip ci] Updated translations via Crowdin 2024-04-27 00:24:31 +00:00
silverwind c93eefb42b
Diff color enhancements, add line number background (#30670)
1. Bring back the background on line numbers. This feature was lost a
long time ago.

<img width="457" alt="Screenshot 2024-04-24 at 01 36 09"
src="https://github.com/go-gitea/gitea/assets/115237/76a7f5a9-c22a-4c72-9f0a-ebf16a66513e">
<img width="473" alt="Screenshot 2024-04-24 at 01 22 47"
src="https://github.com/go-gitea/gitea/assets/115237/eef06cf2-f1b9-40e3-947d-dd5852ec12a3">
<img width="457" alt="Screenshot 2024-04-24 at 02 13 18"
src="https://github.com/go-gitea/gitea/assets/115237/59e317d4-76a7-468c-8a19-10d88c675cc3">
<img width="459" alt="Screenshot 2024-04-24 at 01 23 21"
src="https://github.com/go-gitea/gitea/assets/115237/f1a46f8d-8846-4d78-a9d7-8b7dc18ac6e4">

2. Expanded lines background is now full-line, including line numbers:

<img width="1303" alt="Screenshot 2024-04-24 at 01 37 12"
src="https://github.com/go-gitea/gitea/assets/115237/271eefe2-0869-424e-93fb-ccd8adc87806">

3. Sort affected colors alphabetically in the CSS

Fixes #14603
2024-04-26 19:37:21 +00:00
yp05327 db0bfbb3ea
Merge branch 'main' into fix-incorrect-recently-pushed-new-branches-check 2024-04-25 19:14:10 +09:00
yp05327 f1784504da
Merge branch 'main' into fix-incorrect-recently-pushed-new-branches-check 2024-04-22 15:38:40 +09:00
yp05327 43495eb81a improve 2024-04-18 12:07:13 +00:00
yp05327 7031377e1e fix 2024-04-18 11:02:35 +00:00
yp05327 c397f08812 improve 2024-04-12 05:58:32 +00:00
yp05327 ed19b8bdd7 use container.FilterSlice 2024-04-12 05:54:45 +00:00
yp05327 58147c14f7
Merge branch 'main' into fix-incorrect-recently-pushed-new-branches-check 2024-04-12 14:52:53 +09:00
yp05327 a8a5de2cdf fix test 2024-04-09 02:49:26 +00:00
yp05327 263a4438e4 fix test 2024-04-09 02:04:38 +00:00
yp05327 eed8b07efd fix 2024-04-09 01:57:46 +00:00
yp05327 c4386f0532 fix 2024-04-09 01:45:47 +00:00
yp05327 7b06c463e6 fix 2024-04-09 01:44:02 +00:00
yp05327 17ad1f6835
Merge branch 'main' into fix-incorrect-recently-pushed-new-branches-check 2024-04-09 10:39:09 +09:00
yp05327 5af46f7ce9 fix 2024-04-09 00:59:02 +00:00
yp05327 66f96761e8 fix conflict 2024-04-09 00:55:32 +00:00
yp05327 01088a9f41
Merge branch 'main' into fix-incorrect-recently-pushed-new-branches-check 2024-02-22 11:29:04 +09:00
yp05327 ba4406ff2c use db.Find instead of FindBranch 2024-01-24 08:43:53 +00:00
yp05327 58dbb670b0
Merge branch 'main' into fix-incorrect-recently-pushed-new-branches-check 2024-01-24 17:36:31 +09:00
yp05327 2e860edbd4 fix fixture 2024-01-24 08:35:53 +00:00
yp05327 6f5f65ee79
Merge branch 'main' into fix-incorrect-recently-pushed-new-branches-check 2023-12-07 11:08:24 +09:00
yp05327 4bd9cdba22
Update models/git/branch.go
Co-authored-by: Lunny Xiao <xiaolunwen@gmail.com>
2023-11-20 08:35:29 +09:00
yp05327 b3d6bed21d fix lint 2023-11-17 01:36:20 +00:00
yp05327 3922011044 fix lint 2023-11-17 01:26:07 +00:00
yp05327 e44cec43f6 fix indexer test 2023-11-17 01:20:31 +00:00
yp05327 3d98673fd6 fix api user orgs test 2023-11-17 01:03:30 +00:00
yp05327 bff0db2601
Merge branch 'main' into fix-incorrect-recently-pushed-new-branches-check 2023-11-16 16:47:21 +09:00
yp05327 2d53287c89
Merge branch 'main' into fix-incorrect-recently-pushed-new-branches-check 2023-11-10 13:08:24 +09:00
yp05327 2b677fc2ae
Update models/git/branch.go
Co-authored-by: silverwind <me@silverwind.io>
2023-11-10 11:40:53 +09:00
yp05327 2549c33632
Update models/git/branch.go
Co-authored-by: silverwind <me@silverwind.io>
2023-11-10 11:40:44 +09:00
yp05327 a2425ce6ac
Update models/git/branch.go
Co-authored-by: silverwind <me@silverwind.io>
2023-11-10 11:40:36 +09:00
yp05327 7fa0362d36 remove ignore no repo error 2023-09-06 07:22:48 +00:00
yp05327 34734c2265 fix comment 2023-08-28 07:49:42 +00:00
yp05327 e79c8e0b58 fix ci 2023-08-28 07:49:32 +00:00
yp05327 8f3d5c9bc3 fix 2023-08-28 05:23:28 +00:00
yp05327 330c3f8f5d rewrite test 2023-08-28 04:48:12 +00:00
yp05327 38f4b6680b remove test repo meta data 2023-08-28 01:26:18 +00:00
yp05327 60fd886265
Merge branch 'main' into fix-incorrect-recently-pushed-new-branches-check 2023-08-28 10:22:05 +09:00
yp05327 44c80aed15 remove unnecessary file 2023-08-22 23:50:50 +00:00
yp05327 bb53d5756d
Merge branch 'main' into fix-incorrect-recently-pushed-new-branches-check 2023-08-21 13:35:58 +09:00
yp05327 6248701203 add permission check 2023-08-15 01:11:39 +00:00
yp05327 2e93f87122 follow 26257 2023-08-15 00:50:58 +00:00
yp05327 a641d84bb1
Merge branch 'main' into fix-incorrect-recently-pushed-new-branches-check 2023-08-15 09:48:53 +09:00
yp05327 5bfa11ba03 follow 26257 2023-08-15 00:43:35 +00:00
yp05327 aa2b8c4855 fix conflicts 2023-08-15 00:16:42 +00:00
yp05327 d7cb37c8ba improve 2023-08-01 01:28:15 +00:00
yp05327 08b0159874 fix test 2023-07-31 23:47:25 +00:00
yp05327 8e96323ef0 fix test 2023-07-31 08:59:43 +00:00
yp05327 7559311bae
Merge branch 'main' into fix-incorrect-recently-pushed-new-branches-check 2023-07-31 11:02:43 +09:00
yp05327 4df1529e2e fix conflicts 2023-07-31 01:58:30 +00:00
yp05327 dcc91fbb70 fix 2023-07-27 06:14:59 +00:00
yp05327 9a9dd060b0 improve test 2023-07-27 06:12:54 +00:00
yp05327 fb3afac3e5 fix TestSearchIssues 2023-07-27 02:56:28 +00:00
yp05327 64ece1cbe5 fix TestTeam_AddRepository 2023-07-27 02:19:12 +00:00
yp05327 5cf3d9e505 fix TestIssue_DeleteIssue 2023-07-27 02:14:50 +00:00
yp05327 3b6ff9ba0a improve test 2023-07-27 01:49:52 +00:00
yp05327 a583c64fd0 fix test 2023-07-26 23:55:46 +00:00
yp05327 b57883c31c improve 2023-07-26 08:44:47 +00:00
yp05327 76f472dba8 move ListOptions 2023-07-26 08:40:20 +00:00
yp05327 d60c75883b
Merge branch 'main' into fix-incorrect-recently-pushed-new-branches-check 2023-07-26 17:32:35 +09:00
yp05327 66071ac97b remove test code 2023-07-26 08:31:38 +00:00
yp05327 86892d458d fix tests 2023-07-25 02:05:43 +00:00
yp05327 f9b4085b57 fix test 2023-07-24 08:22:39 +00:00
yp05327 274e5abdac fix test 2023-07-24 08:17:54 +00:00
yp05327 94025efd44 improve 2023-07-24 08:09:29 +00:00
yp05327 4de1b0514c revert RepoIDs 2023-07-24 02:40:50 +00:00
yp05327 9a33437cd6 improve 2023-07-24 02:34:06 +00:00
yp05327 6517ad975f fix 2023-07-24 00:20:01 +00:00
yp05327 17876b4e89
Merge branch 'main' into fix-incorrect-recently-pushed-new-branches-check 2023-07-24 09:17:19 +09:00
yp05327 e263227a88 fix TestFixtureGeneration 2023-07-21 08:29:22 +00:00
yp05327 4d42a63805 fix TestFindOrgs 2023-07-21 08:20:20 +00:00
yp05327 63562c31b8 fix TestSearchRepository 2023-07-21 08:04:38 +00:00
yp05327 5449bc139a fix TestSearchUsers 2023-07-21 08:01:15 +00:00
yp05327 d848876744 fix repo size 2023-07-21 07:56:14 +00:00
yp05327 f06e09151d fix test 2023-07-21 06:45:23 +00:00
yp05327 1ecb6fbc3e fix org_user 2023-07-21 05:34:56 +00:00
yp05327 f7295177bd use searchrepo 2023-07-21 02:48:42 +00:00
yp05327 0bfec1a3e8 add test 2023-07-21 01:19:13 +00:00
yp05327 69b76246b0 fix bug 2023-07-21 00:08:45 +00:00
yp05327 a7fc27917c
Merge branch 'main' into fix-incorrect-recently-pushed-new-branches-check 2023-07-21 08:51:55 +09:00
yp05327 c704332d23 fix 2023-07-20 08:56:50 +00:00
yp05327 5c3f7aa231 add test 1 2023-07-20 08:53:31 +00:00
yp05327 d93b2bcc80 use findbranch to search branch 2023-07-20 05:19:56 +00:00
yp05327 e74709ed15
Merge branch 'main' into fix-incorrect-recently-pushed-new-branches-check 2023-07-20 13:16:53 +09:00
yp05327 d3f72aac2f remove PathEscapeSegments 2023-07-13 07:52:58 +00:00
yp05327 bc176bb1bc improve 2023-07-13 06:20:33 +00:00
yp05327 172ceebf14 fix lint 2023-07-11 05:04:24 +00:00
yp05327 54f4fd56cd improve TODO 2023-07-11 05:02:20 +00:00
yp05327 4c116821fa allow forked repo from forked repo 2023-07-11 04:25:41 +00:00
yp05327 2b0abf9331 use branch.id instead of branch.name 2023-07-11 04:18:36 +00:00
yp05327 71dd740416 avoid attach already created pr branch 2023-07-11 02:35:36 +00:00
yp05327 266d07fdd9
Merge branch 'main' into fix-incorrect-recently-pushed-new-branches-check 2023-07-11 10:47:59 +09:00
yp05327 df97530659 support show notification in forked repo 2023-07-11 01:39:58 +00:00
yp05327 b3e3b7311c support show notification in origin repo 2023-07-11 01:10:12 +00:00
yp05327 c8f707b890 fix 2023-07-10 08:30:09 +00:00
69 changed files with 1167 additions and 241 deletions

View File

@ -30,7 +30,7 @@ EDITORCONFIG_CHECKER_PACKAGE ?= github.com/editorconfig-checker/editorconfig-che
GOFUMPT_PACKAGE ?= mvdan.cc/gofumpt@v0.6.0 GOFUMPT_PACKAGE ?= mvdan.cc/gofumpt@v0.6.0
GOLANGCI_LINT_PACKAGE ?= github.com/golangci/golangci-lint/cmd/golangci-lint@v1.57.2 GOLANGCI_LINT_PACKAGE ?= github.com/golangci/golangci-lint/cmd/golangci-lint@v1.57.2
GXZ_PACKAGE ?= github.com/ulikunitz/xz/cmd/gxz@v0.5.11 GXZ_PACKAGE ?= github.com/ulikunitz/xz/cmd/gxz@v0.5.11
MISSPELL_PACKAGE ?= github.com/golangci/misspell/cmd/misspell@v0.4.1 MISSPELL_PACKAGE ?= github.com/golangci/misspell/cmd/misspell@v0.5.1
SWAGGER_PACKAGE ?= github.com/go-swagger/go-swagger/cmd/swagger@db51e79a0e37c572d8b59ae0c58bf2bbbbe53285 SWAGGER_PACKAGE ?= github.com/go-swagger/go-swagger/cmd/swagger@db51e79a0e37c572d8b59ae0c58bf2bbbbe53285
XGO_PACKAGE ?= src.techknowlogick.com/xgo@latest XGO_PACKAGE ?= src.techknowlogick.com/xgo@latest
GO_LICENSES_PACKAGE ?= github.com/google/go-licenses@v1 GO_LICENSES_PACKAGE ?= github.com/google/go-licenses@v1
@ -397,11 +397,11 @@ lint-md: node_modules
.PHONY: lint-spell .PHONY: lint-spell
lint-spell: lint-spell:
@go run $(MISSPELL_PACKAGE) -error $(SPELLCHECK_FILES) @go run $(MISSPELL_PACKAGE) -dict tools/misspellings.csv -error $(SPELLCHECK_FILES)
.PHONY: lint-spell-fix .PHONY: lint-spell-fix
lint-spell-fix: lint-spell-fix:
@go run $(MISSPELL_PACKAGE) -w $(SPELLCHECK_FILES) @go run $(MISSPELL_PACKAGE) -dict tools/misspellings.csv -w $(SPELLCHECK_FILES)
.PHONY: lint-go .PHONY: lint-go
lint-go: lint-go:
@ -908,8 +908,9 @@ webpack: $(WEBPACK_DEST)
$(WEBPACK_DEST): $(WEBPACK_SOURCES) $(WEBPACK_CONFIGS) package-lock.json $(WEBPACK_DEST): $(WEBPACK_SOURCES) $(WEBPACK_CONFIGS) package-lock.json
@$(MAKE) -s node-check node_modules @$(MAKE) -s node-check node_modules
rm -rf $(WEBPACK_DEST_ENTRIES) @rm -rf $(WEBPACK_DEST_ENTRIES)
npx webpack @echo "Running webpack..."
@BROWSERSLIST_IGNORE_OLD_DATA=true npx webpack
@touch $(WEBPACK_DEST) @touch $(WEBPACK_DEST)
.PHONY: svg .PHONY: svg

View File

@ -1322,7 +1322,7 @@ Defaultly every storage has their default base path like below
| actions_log | actions_log/ | | actions_log | actions_log/ |
| actions_artifacts | actions_artifacts/ | | actions_artifacts | actions_artifacts/ |
And bucket, basepath or `SERVE_DIRECT` could be special or overrided, if you want to use a different you can: And bucket, basepath or `SERVE_DIRECT` could be special or overridden, if you want to use a different you can:
```ini ```ini
[storage.actions_log] [storage.actions_log]

View File

@ -262,11 +262,11 @@ func CancelPreviousJobs(ctx context.Context, repoID int64, ref, workflowID strin
// InsertRun inserts a run // InsertRun inserts a run
func InsertRun(ctx context.Context, run *ActionRun, jobs []*jobparser.SingleWorkflow) error { func InsertRun(ctx context.Context, run *ActionRun, jobs []*jobparser.SingleWorkflow) error {
ctx, commiter, err := db.TxContext(ctx) ctx, committer, err := db.TxContext(ctx)
if err != nil { if err != nil {
return err return err
} }
defer commiter.Close() defer committer.Close()
index, err := db.GetNextResourceIndex(ctx, "action_run_index", run.RepoID) index, err := db.GetNextResourceIndex(ctx, "action_run_index", run.RepoID)
if err != nil { if err != nil {
@ -331,7 +331,7 @@ func InsertRun(ctx context.Context, run *ActionRun, jobs []*jobparser.SingleWork
} }
} }
return commiter.Commit() return committer.Commit()
} }
func GetRunByID(ctx context.Context, id int64) (*ActionRun, error) { func GetRunByID(ctx context.Context, id int64) (*ActionRun, error) {

View File

@ -216,11 +216,11 @@ func GetRunningTaskByToken(ctx context.Context, token string) (*ActionTask, erro
} }
func CreateTaskForRunner(ctx context.Context, runner *ActionRunner) (*ActionTask, bool, error) { func CreateTaskForRunner(ctx context.Context, runner *ActionRunner) (*ActionTask, bool, error) {
ctx, commiter, err := db.TxContext(ctx) ctx, committer, err := db.TxContext(ctx)
if err != nil { if err != nil {
return nil, false, err return nil, false, err
} }
defer commiter.Close() defer committer.Close()
e := db.GetEngine(ctx) e := db.GetEngine(ctx)
@ -322,7 +322,7 @@ func CreateTaskForRunner(ctx context.Context, runner *ActionRunner) (*ActionTask
task.Job = job task.Job = job
if err := commiter.Commit(); err != nil { if err := committer.Commit(); err != nil {
return nil, false, err return nil, false, err
} }
@ -347,11 +347,11 @@ func UpdateTaskByState(ctx context.Context, state *runnerv1.TaskState) (*ActionT
stepStates[v.Id] = v stepStates[v.Id] = v
} }
ctx, commiter, err := db.TxContext(ctx) ctx, committer, err := db.TxContext(ctx)
if err != nil { if err != nil {
return nil, err return nil, err
} }
defer commiter.Close() defer committer.Close()
e := db.GetEngine(ctx) e := db.GetEngine(ctx)
@ -412,7 +412,7 @@ func UpdateTaskByState(ctx context.Context, state *runnerv1.TaskState) (*ActionT
} }
} }
if err := commiter.Commit(); err != nil { if err := committer.Commit(); err != nil {
return nil, err return nil, err
} }

View File

@ -13,7 +13,7 @@ import (
// ActionTasksVersion // ActionTasksVersion
// If both ownerID and repoID is zero, its scope is global. // If both ownerID and repoID is zero, its scope is global.
// If ownerID is not zero and repoID is zero, its scope is org (there is no user-level runner currrently). // If ownerID is not zero and repoID is zero, its scope is org (there is no user-level runner currently).
// If ownerID is zero and repoID is not zero, its scope is repo. // If ownerID is zero and repoID is not zero, its scope is repo.
type ActionTasksVersion struct { type ActionTasksVersion struct {
ID int64 `xorm:"pk autoincr"` ID int64 `xorm:"pk autoincr"`
@ -73,11 +73,11 @@ func increaseTasksVersionByScope(ctx context.Context, ownerID, repoID int64) err
} }
func IncreaseTaskVersion(ctx context.Context, ownerID, repoID int64) error { func IncreaseTaskVersion(ctx context.Context, ownerID, repoID int64) error {
ctx, commiter, err := db.TxContext(ctx) ctx, committer, err := db.TxContext(ctx)
if err != nil { if err != nil {
return err return err
} }
defer commiter.Close() defer committer.Close()
// 1. increase global // 1. increase global
if err := increaseTasksVersionByScope(ctx, 0, 0); err != nil { if err := increaseTasksVersionByScope(ctx, 0, 0); err != nil {
@ -101,5 +101,5 @@ func IncreaseTaskVersion(ctx context.Context, ownerID, repoID int64) error {
} }
} }
return commiter.Commit() return committer.Commit()
} }

View File

@ -1,173 +1,185 @@
- -
id: 1 id: 1
user_id: 2 user_id: 1
repo_id: 3 repo_id: 63
mode: 4 mode: 4
- -
id: 2 id: 2
user_id: 2 user_id: 2
repo_id: 5 repo_id: 3
mode: 4 mode: 4
- -
id: 3 id: 3
user_id: 2 user_id: 2
repo_id: 5
mode: 4
-
id: 4
user_id: 2
repo_id: 24 repo_id: 24
mode: 2 mode: 2
- -
id: 4 id: 5
user_id: 2 user_id: 2
repo_id: 32 repo_id: 32
mode: 4 mode: 4
- -
id: 5 id: 6
user_id: 4 user_id: 4
repo_id: 3 repo_id: 3
mode: 2 mode: 2
- -
id: 6 id: 7
user_id: 4 user_id: 4
repo_id: 4 repo_id: 4
mode: 2 mode: 2
- -
id: 7 id: 8
user_id: 4 user_id: 4
repo_id: 40 repo_id: 40
mode: 2 mode: 2
- -
id: 8 id: 9
user_id: 10 user_id: 10
repo_id: 21 repo_id: 21
mode: 2 mode: 2
- -
id: 9 id: 10
user_id: 10 user_id: 10
repo_id: 32 repo_id: 32
mode: 2 mode: 2
- -
id: 10 id: 11
user_id: 12
repo_id: 62
mode: 4
-
id: 12
user_id: 15 user_id: 15
repo_id: 21 repo_id: 21
mode: 2 mode: 2
- -
id: 11 id: 13
user_id: 15 user_id: 15
repo_id: 22 repo_id: 22
mode: 2 mode: 2
- -
id: 12 id: 14
user_id: 15 user_id: 15
repo_id: 23 repo_id: 23
mode: 4 mode: 4
- -
id: 13 id: 15
user_id: 15 user_id: 15
repo_id: 24 repo_id: 24
mode: 4 mode: 4
- -
id: 14 id: 16
user_id: 15 user_id: 15
repo_id: 32 repo_id: 32
mode: 2 mode: 2
-
id: 15
user_id: 18
repo_id: 21
mode: 2
-
id: 16
user_id: 18
repo_id: 22
mode: 2
- -
id: 17 id: 17
user_id: 18 user_id: 18
repo_id: 21
mode: 2
-
id: 18
user_id: 18
repo_id: 22
mode: 2
-
id: 19
user_id: 18
repo_id: 23 repo_id: 23
mode: 4 mode: 4
- -
id: 18 id: 20
user_id: 18 user_id: 18
repo_id: 24 repo_id: 24
mode: 4 mode: 4
- -
id: 19 id: 21
user_id: 20 user_id: 20
repo_id: 24 repo_id: 24
mode: 1 mode: 1
- -
id: 20 id: 22
user_id: 20 user_id: 20
repo_id: 27 repo_id: 27
mode: 4 mode: 4
- -
id: 21 id: 23
user_id: 20 user_id: 20
repo_id: 28 repo_id: 28
mode: 4 mode: 4
- -
id: 22 id: 24
user_id: 29 user_id: 29
repo_id: 4 repo_id: 4
mode: 2 mode: 2
- -
id: 23 id: 25
user_id: 29 user_id: 29
repo_id: 24 repo_id: 24
mode: 1 mode: 1
- -
id: 24 id: 26
user_id: 31 user_id: 31
repo_id: 27 repo_id: 27
mode: 4 mode: 4
- -
id: 25 id: 27
user_id: 31 user_id: 31
repo_id: 28 repo_id: 28
mode: 4 mode: 4
- -
id: 26 id: 28
user_id: 38 user_id: 38
repo_id: 60 repo_id: 60
mode: 2 mode: 2
- -
id: 27 id: 29
user_id: 38 user_id: 38
repo_id: 61 repo_id: 61
mode: 1 mode: 1
- -
id: 28 id: 30
user_id: 39 user_id: 39
repo_id: 61 repo_id: 61
mode: 1 mode: 1
- -
id: 29 id: 31
user_id: 40 user_id: 40
repo_id: 61 repo_id: 61
mode: 4 mode: 4

View File

@ -45,3 +45,267 @@
is_deleted: false is_deleted: false
deleted_by_id: 0 deleted_by_id: 0
deleted_unix: 0 deleted_unix: 0
-
id: 5
repo_id: 10
name: 'master'
commit_id: '65f1bf27bc3bf70f64657658635e66094edbcb4d'
commit_message: 'Initial commit'
commit_time: 1489927679
pusher_id: 12
is_deleted: false
deleted_by_id: 0
deleted_unix: 0
-
id: 6
repo_id: 10
name: 'new-commit'
commit_id: 'cb24c347e328d83c1e0c3c908a6b2c0a2fcb8a3d'
commit_message: 'add'
commit_time: 1489927680
pusher_id: 12
is_deleted: false
deleted_by_id: 0
deleted_unix: 0
-
id: 7
repo_id: 10
name: 'no-commit'
commit_id: '65f1bf27bc3bf70f64657658635e66094edbcb4d'
commit_message: 'Initial commit'
commit_time: 1489927679
pusher_id: 12
is_deleted: false
deleted_by_id: 0
deleted_unix: 0
-
id: 8
repo_id: 10
name: 'opening-pr'
commit_id: 'cb24c347e328d83c1e0c3c908a6b2c0a2fcb8a3d'
commit_message: 'add'
commit_time: 1489927680
pusher_id: 12
is_deleted: false
deleted_by_id: 0
deleted_unix: 0
-
id: 9
repo_id: 10
name: 'closed-pr'
commit_id: 'cb24c347e328d83c1e0c3c908a6b2c0a2fcb8a3d'
commit_message: 'add'
commit_time: 1489927680
pusher_id: 12
is_deleted: false
deleted_by_id: 0
deleted_unix: 0
-
id: 10
repo_id: 10
name: 'merged-pr'
commit_id: 'cb24c347e328d83c1e0c3c908a6b2c0a2fcb8a3d'
commit_message: 'add'
commit_time: 1489927680
pusher_id: 12
is_deleted: false
deleted_by_id: 0
deleted_unix: 0
-
id: 11
repo_id: 10
name: 'closed-pr-with-deleted-branch'
commit_id: 'cb24c347e328d83c1e0c3c908a6b2c0a2fcb8a3d'
commit_message: 'add'
commit_time: 1489927680
pusher_id: 12
is_deleted: true
deleted_by_id: 12
deleted_unix: 1489927700
-
id: 12
repo_id: 10
name: 'merged-pr-with-deleted-branch'
commit_id: 'cb24c347e328d83c1e0c3c908a6b2c0a2fcb8a3d'
commit_message: 'add'
commit_time: 1489927680
pusher_id: 12
is_deleted: true
deleted_by_id: 12
deleted_unix: 1489927700
-
id: 13
repo_id: 10
name: 'deleted-branch'
commit_id: 'cb24c347e328d83c1e0c3c908a6b2c0a2fcb8a3d'
commit_message: 'add'
commit_time: 1489927680
pusher_id: 12
is_deleted: true
deleted_by_id: 12
deleted_unix: 1489927700
-
id: 14
repo_id: 11
name: 'master'
commit_id: '65f1bf27bc3bf70f64657658635e66094edbcb4d'
commit_message: 'Initial commit'
commit_time: 1489927679
pusher_id: 13
is_deleted: false
deleted_by_id: 0
deleted_unix: 0
-
id: 15
repo_id: 11
name: 'user-fork-new-commit'
commit_id: 'cb24c347e328d83c1e0c3c908a6b2c0a2fcb8a3d'
commit_message: 'add'
commit_time: 1489927680
pusher_id: 13
is_deleted: false
deleted_by_id: 0
deleted_unix: 0
-
id: 16
repo_id: 11
name: 'user-fork-no-commit'
commit_id: '65f1bf27bc3bf70f64657658635e66094edbcb4d'
commit_message: 'Initial commit'
commit_time: 1489927679
pusher_id: 13
is_deleted: false
deleted_by_id: 0
deleted_unix: 0
-
id: 17
repo_id: 62
name: 'master'
commit_id: '65f1bf27bc3bf70f64657658635e66094edbcb4d'
commit_message: 'Initial commit'
commit_time: 1489927679
pusher_id: 12
is_deleted: false
deleted_by_id: 0
deleted_unix: 0
-
id: 18
repo_id: 62
name: 'org-fork-new-commit'
commit_id: 'cb24c347e328d83c1e0c3c908a6b2c0a2fcb8a3d'
commit_message: 'add'
commit_time: 1489927691
pusher_id: 12
is_deleted: false
deleted_by_id: 0
deleted_unix: 0
-
id: 19
repo_id: 62
name: 'org-fork-no-commit'
commit_id: '65f1bf27bc3bf70f64657658635e66094edbcb4d'
commit_message: 'Initial commit'
commit_time: 1489927691
pusher_id: 12
is_deleted: false
deleted_by_id: 0
deleted_unix: 0
-
id: 20
repo_id: 63
name: 'master'
commit_id: '65f1bf27bc3bf70f64657658635e66094edbcb4d'
commit_message: 'Initial commit'
commit_time: 1489927679
pusher_id: 1
is_deleted: false
deleted_by_id: 0
deleted_unix: 0
-
id: 21
repo_id: 63
name: 'private-org-fork-new-commit'
commit_id: 'cb24c347e328d83c1e0c3c908a6b2c0a2fcb8a3d'
commit_message: 'add'
commit_time: 1489927680
pusher_id: 1
is_deleted: false
deleted_by_id: 0
deleted_unix: 0
-
id: 22
repo_id: 63
name: 'private-org-fork-no-commit'
commit_id: '65f1bf27bc3bf70f64657658635e66094edbcb4d'
commit_message: 'Initial commit'
commit_time: 1489927679
pusher_id: 1
is_deleted: false
deleted_by_id: 0
deleted_unix: 0
-
id: 23
repo_id: 63
name: 'private-org-fork-no-permission-new-commit'
commit_id: 'cb24c347e328d83c1e0c3c908a6b2c0a2fcb8a3d'
commit_message: 'add'
commit_time: 1489927680
pusher_id: 2
is_deleted: false
deleted_by_id: 0
deleted_unix: 0
-
id: 24
repo_id: 63
name: 'private-org-fork-no-permission-no-commit'
commit_id: '65f1bf27bc3bf70f64657658635e66094edbcb4d'
commit_message: 'Initial commit'
commit_time: 1489927679
pusher_id: 2
is_deleted: false
deleted_by_id: 0
deleted_unix: 0
-
id: 25
repo_id: 10
name: 'same-name-branch-in-pr'
commit_id: 'cb24c347e328d83c1e0c3c908a6b2c0a2fcb8a3d'
commit_message: 'add'
commit_time: 1489927680
pusher_id: 13
is_deleted: false
deleted_by_id: 0
deleted_unix: 0
-
id: 26
repo_id: 11
name: 'same-name-branch-in-pr'
commit_id: 'cb24c347e328d83c1e0c3c908a6b2c0a2fcb8a3d'
commit_message: 'add'
commit_time: 1489927680
pusher_id: 13
is_deleted: false
deleted_by_id: 0
deleted_unix: 0

View File

@ -372,3 +372,105 @@
created_unix: 1707270422 created_unix: 1707270422
updated_unix: 1707270422 updated_unix: 1707270422
is_locked: false is_locked: false
-
id: 23
repo_id: 10
index: 2
poster_id: 12
original_author_id: 0
name: opening pr for recently new branch search test
content: content
milestone_id: 0
priority: 0
is_closed: false
is_pull: true
num_comments: 0
created_unix: 946684830
updated_unix: 978307200
is_locked: false
-
id: 24
repo_id: 10
index: 3
poster_id: 12
original_author_id: 0
name: closed pr for recently new branch search test
content: content
milestone_id: 0
priority: 0
is_closed: true
is_pull: true
num_comments: 0
created_unix: 946684830
updated_unix: 978307200
is_locked: false
-
id: 25
repo_id: 10
index: 4
poster_id: 12
original_author_id: 0
name: merged pr for recently new branch search test
content: content
milestone_id: 0
priority: 0
is_closed: false
is_pull: true
num_comments: 0
created_unix: 946684830
updated_unix: 978307200
is_locked: false
-
id: 26
repo_id: 10
index: 5
poster_id: 12
original_author_id: 0
name: closed pr with deleted branch for recently new branch search test
content: content
milestone_id: 0
priority: 0
is_closed: true
is_pull: true
num_comments: 0
created_unix: 946684830
updated_unix: 978307200
is_locked: false
-
id: 27
repo_id: 10
index: 6
poster_id: 12
original_author_id: 0
name: merged pr with deleted branch for recently new branch search test
content: content
milestone_id: 0
priority: 0
is_closed: false
is_pull: true
num_comments: 0
created_unix: 946684830
updated_unix: 978307200
is_locked: false
-
id: 28
repo_id: 11
index: 1
poster_id: 13
original_author_id: 0
name: pr with same branch name for recently new branch search test
content: content
milestone_id: 0
priority: 0
is_closed: false
is_pull: true
num_comments: 0
created_unix: 946684830
updated_unix: 978307200
is_locked: false

View File

@ -1,27 +1,35 @@
- -
group_id: 1 group_id: 1
max_index: 5 max_index: 5
- -
group_id: 2 group_id: 2
max_index: 2 max_index: 2
- -
group_id: 3 group_id: 3
max_index: 2 max_index: 2
- -
group_id: 10 group_id: 10
max_index: 1 max_index: 6
- -
group_id: 32 group_id: 32
max_index: 2 max_index: 2
- -
group_id: 48 group_id: 48
max_index: 1 max_index: 1
- -
group_id: 42 group_id: 42
max_index: 1 max_index: 1
- -
group_id: 50 group_id: 50
max_index: 1 max_index: 1
- -
group_id: 51 group_id: 51
max_index: 1 max_index: 1

View File

@ -117,3 +117,15 @@
uid: 40 uid: 40
org_id: 41 org_id: 41
is_public: true is_public: true
-
id: 21
uid: 12
org_id: 25
is_public: true
-
id: 22
uid: 2
org_id: 35
is_public: true

View File

@ -1,7 +1,7 @@
- -
id: 1 id: 1
type: 0 # gitea pull request type: 0 # gitea pull request
status: 2 # mergable status: 2 # mergeable
issue_id: 2 issue_id: 2
index: 2 index: 2
head_repo_id: 1 head_repo_id: 1
@ -16,7 +16,7 @@
- -
id: 2 id: 2
type: 0 # gitea pull request type: 0 # gitea pull request
status: 2 # mergable status: 2 # mergeable
issue_id: 3 issue_id: 3
index: 3 index: 3
head_repo_id: 1 head_repo_id: 1
@ -29,7 +29,7 @@
- -
id: 3 id: 3
type: 0 # gitea pull request type: 0 # gitea pull request
status: 2 # mergable status: 2 # mergeable
issue_id: 8 issue_id: 8
index: 1 index: 1
head_repo_id: 11 head_repo_id: 11
@ -42,7 +42,7 @@
- -
id: 4 id: 4
type: 0 # gitea pull request type: 0 # gitea pull request
status: 2 # mergable status: 2 # mergeable
issue_id: 9 issue_id: 9
index: 1 index: 1
head_repo_id: 48 head_repo_id: 48
@ -55,7 +55,7 @@
- -
id: 5 # this PR is outdated (one commit behind branch1 ) id: 5 # this PR is outdated (one commit behind branch1 )
type: 0 # gitea pull request type: 0 # gitea pull request
status: 2 # mergable status: 2 # mergeable
issue_id: 11 issue_id: 11
index: 5 index: 5
head_repo_id: 1 head_repo_id: 1
@ -68,7 +68,7 @@
- -
id: 6 id: 6
type: 0 # gitea pull request type: 0 # gitea pull request
status: 2 # mergable status: 2 # mergeable
issue_id: 12 issue_id: 12
index: 2 index: 2
head_repo_id: 3 head_repo_id: 3
@ -81,7 +81,7 @@
- -
id: 7 id: 7
type: 0 # gitea pull request type: 0 # gitea pull request
status: 2 # mergable status: 2 # mergeable
issue_id: 19 issue_id: 19
index: 1 index: 1
head_repo_id: 58 head_repo_id: 58
@ -94,7 +94,7 @@
- -
id: 8 id: 8
type: 0 # gitea pull request type: 0 # gitea pull request
status: 2 # mergable status: 2 # mergeable
issue_id: 20 issue_id: 20
index: 1 index: 1
head_repo_id: 23 head_repo_id: 23
@ -103,7 +103,7 @@
- -
id: 9 id: 9
type: 0 # gitea pull request type: 0 # gitea pull request
status: 2 # mergable status: 2 # mergeable
issue_id: 21 issue_id: 21
index: 1 index: 1
head_repo_id: 60 head_repo_id: 60
@ -112,8 +112,86 @@
- -
id: 10 id: 10
type: 0 # gitea pull request type: 0 # gitea pull request
status: 2 # mergable status: 2 # mergeable
issue_id: 22 issue_id: 22
index: 1 index: 1
head_repo_id: 61 head_repo_id: 61
base_repo_id: 61 base_repo_id: 61
-
id: 11
type: 0 # gitea pull request
status: 2 # mergable
issue_id: 23
index: 2
head_repo_id: 10
base_repo_id: 10
head_branch: opening-pr
base_branch: master
merge_base: cb24c347e328d83c1e0c3c908a6b2c0a2fcb8a3d
has_merged: false
-
id: 12
type: 0 # gitea pull request
status: 2 # mergable
issue_id: 24
index: 3
head_repo_id: 10
base_repo_id: 10
head_branch: closed-pr
base_branch: master
merge_base: cb24c347e328d83c1e0c3c908a6b2c0a2fcb8a3d
has_merged: false
-
id: 13
type: 0 # gitea pull request
status: 3 # manually merged
issue_id: 25
index: 4
head_repo_id: 10
base_repo_id: 10
head_branch: merged-pr
base_branch: master
merge_base: cb24c347e328d83c1e0c3c908a6b2c0a2fcb8a3d
has_merged: true
-
id: 14
type: 0 # gitea pull request
status: 2 # mergable
issue_id: 26
index: 5
head_repo_id: 10
base_repo_id: 10
head_branch: closed-pr-with-deleted-branch
base_branch: master
merge_base: cb24c347e328d83c1e0c3c908a6b2c0a2fcb8a3d
has_merged: false
-
id: 15
type: 0 # gitea pull request
status: 3 # manually merged
issue_id: 27
index: 6
head_repo_id: 10
base_repo_id: 10
head_branch: merged-pr-with-deleted-branch
base_branch: master
merge_base: cb24c347e328d83c1e0c3c908a6b2c0a2fcb8a3d
has_merged: true
-
id: 16
type: 0 # gitea pull request
status: 2 # mergable
issue_id: 28
index: 1
head_repo_id: 11
base_repo_id: 10
head_branch: same-name-branch-in-pr
base_branch: master
merge_base: cb24c347e328d83c1e0c3c908a6b2c0a2fcb8a3d
has_merged: false

View File

@ -712,3 +712,15 @@
type: 3 type: 3
config: "{\"IgnoreWhitespaceConflicts\":false,\"AllowMerge\":true,\"AllowRebase\":true,\"AllowRebaseMerge\":true,\"AllowSquash\":true}" config: "{\"IgnoreWhitespaceConflicts\":false,\"AllowMerge\":true,\"AllowRebase\":true,\"AllowRebaseMerge\":true,\"AllowSquash\":true}"
created_unix: 946684810 created_unix: 946684810
-
id: 108
repo_id: 62
type: 1
created_unix: 946684810
-
id: 109
repo_id: 63
type: 1
created_unix: 946684810

View File

@ -282,11 +282,11 @@
default_branch: master default_branch: master
num_watches: 0 num_watches: 0
num_stars: 0 num_stars: 0
num_forks: 1 num_forks: 3
num_issues: 0 num_issues: 0
num_closed_issues: 0 num_closed_issues: 0
num_pulls: 1 num_pulls: 6
num_closed_pulls: 0 num_closed_pulls: 2
num_milestones: 1 num_milestones: 1
num_closed_milestones: 0 num_closed_milestones: 0
num_projects: 0 num_projects: 0
@ -316,7 +316,7 @@
num_forks: 0 num_forks: 0
num_issues: 0 num_issues: 0
num_closed_issues: 0 num_closed_issues: 0
num_pulls: 0 num_pulls: 1
num_closed_pulls: 0 num_closed_pulls: 0
num_milestones: 0 num_milestones: 0
num_closed_milestones: 0 num_closed_milestones: 0
@ -327,7 +327,7 @@
is_archived: false is_archived: false
is_mirror: false is_mirror: false
status: 0 status: 0
is_fork: false is_fork: true
fork_id: 10 fork_id: 10
is_template: false is_template: false
template_id: 0 template_id: 0
@ -1768,3 +1768,63 @@
size: 0 size: 0
is_fsck_enabled: true is_fsck_enabled: true
close_issues_via_commit_in_any_branch: false close_issues_via_commit_in_any_branch: false
-
id: 62
owner_id: 25
owner_name: org25
lower_name: org_fork_repo62
name: org_fork_repo62
num_watches: 0
num_stars: 0
num_forks: 0
num_issues: 0
num_closed_issues: 0
num_pulls: 0
num_closed_pulls: 0
num_milestones: 0
num_closed_milestones: 0
num_projects: 0
num_closed_projects: 0
is_private: false
is_empty: false
is_archived: false
is_mirror: false
status: 0
is_fork: true
fork_id: 10
is_template: false
template_id: 0
size: 0
is_fsck_enabled: true
close_issues_via_commit_in_any_branch: false
-
id: 63
owner_id: 35
owner_name: private_org35
lower_name: private_org_fork_repo63
name: private_org_fork_repo63
num_watches: 0
num_stars: 0
num_forks: 0
num_issues: 0
num_closed_issues: 0
num_pulls: 0
num_closed_pulls: 0
num_milestones: 0
num_closed_milestones: 0
num_projects: 0
num_closed_projects: 0
is_private: true
is_empty: false
is_archived: false
is_mirror: false
status: 0
is_fork: true
fork_id: 10
is_template: false
template_id: 0
size: 0
is_fsck_enabled: true
close_issues_via_commit_in_any_branch: false

View File

@ -191,7 +191,7 @@
lower_name: owners lower_name: owners
name: Owners name: Owners
authorize: 4 # owner authorize: 4 # owner
num_repos: 0 num_repos: 1
num_members: 1 num_members: 1
includes_all_repositories: false includes_all_repositories: false
can_create_org_repo: true can_create_org_repo: true
@ -239,3 +239,25 @@
num_members: 2 num_members: 2
includes_all_repositories: false includes_all_repositories: false
can_create_org_repo: false can_create_org_repo: false
-
id: 23
org_id: 25
lower_name: owners
name: Owners
authorize: 4 # owner
num_repos: 0
num_members: 1
includes_all_repositories: false
can_create_org_repo: true
-
id: 24
org_id: 35
lower_name: team24noreadcode
name: team24noreadcode
authorize: 0 # no access
num_repos: 1
num_members: 1
includes_all_repositories: false
can_create_org_repo: false

View File

@ -75,3 +75,15 @@
org_id: 41 org_id: 41
team_id: 22 team_id: 22
repo_id: 61 repo_id: 61
-
id: 14
org_id: 35
team_id: 18
repo_id: 63
-
id: 15
org_id: 35
team_id: 24
repo_id: 63

View File

@ -322,3 +322,21 @@
team_id: 22 team_id: 22
type: 3 type: 3
access_mode: 1 access_mode: 1
-
id: 55
team_id: 18
type: 1 # code
access_mode: 4
-
id: 56
team_id: 23
type: 1 # code
access_mode: 4
-
id: 57
team_id: 24
type: 1 # code
access_mode: 0

View File

@ -147,3 +147,15 @@
org_id: 41 org_id: 41
team_id: 22 team_id: 22
uid: 39 uid: 39
-
id: 26
org_id: 25
team_id: 23
uid: 12
-
id: 27
org_id: 35
team_id: 24
uid: 2

View File

@ -917,9 +917,9 @@
num_followers: 0 num_followers: 0
num_following: 0 num_following: 0
num_stars: 0 num_stars: 0
num_repos: 0 num_repos: 1
num_teams: 1 num_teams: 2
num_members: 1 num_members: 2
visibility: 0 visibility: 0
repo_admin_change_team_access: false repo_admin_change_team_access: false
theme: "" theme: ""
@ -1288,9 +1288,9 @@
num_followers: 0 num_followers: 0
num_following: 0 num_following: 0
num_stars: 0 num_stars: 0
num_repos: 0 num_repos: 1
num_teams: 1 num_teams: 2
num_members: 1 num_members: 2
visibility: 2 visibility: 2
repo_admin_change_team_access: false repo_admin_change_team_access: false
theme: "" theme: ""

View File

@ -10,9 +10,11 @@ import (
"code.gitea.io/gitea/models/db" "code.gitea.io/gitea/models/db"
repo_model "code.gitea.io/gitea/models/repo" repo_model "code.gitea.io/gitea/models/repo"
"code.gitea.io/gitea/models/unit"
user_model "code.gitea.io/gitea/models/user" user_model "code.gitea.io/gitea/models/user"
"code.gitea.io/gitea/modules/git" "code.gitea.io/gitea/modules/git"
"code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/optional"
"code.gitea.io/gitea/modules/timeutil" "code.gitea.io/gitea/modules/timeutil"
"code.gitea.io/gitea/modules/util" "code.gitea.io/gitea/modules/util"
@ -102,8 +104,9 @@ func (err ErrBranchesEqual) Unwrap() error {
// for pagination, keyword search and filtering // for pagination, keyword search and filtering
type Branch struct { type Branch struct {
ID int64 ID int64
RepoID int64 `xorm:"UNIQUE(s)"` 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 Repo *repo_model.Repository `xorm:"-"`
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
CommitID string CommitID string
CommitMessage string `xorm:"TEXT"` // it only stores the message summary (the first line) CommitMessage string `xorm:"TEXT"` // it only stores the message summary (the first line)
PusherID int64 PusherID int64
@ -139,6 +142,14 @@ func (b *Branch) LoadPusher(ctx context.Context) (err error) {
return err return err
} }
func (b *Branch) LoadRepo(ctx context.Context) (err error) {
if b.Repo != nil || b.RepoID == 0 {
return nil
}
b.Repo, err = repo_model.GetRepositoryByID(ctx, b.RepoID)
return err
}
func init() { func init() {
db.RegisterModel(new(Branch)) db.RegisterModel(new(Branch))
db.RegisterModel(new(RenamedBranch)) db.RegisterModel(new(RenamedBranch))
@ -400,24 +411,105 @@ func RenameBranch(ctx context.Context, repo *repo_model.Repository, from, to str
return committer.Commit() return committer.Commit()
} }
// FindRecentlyPushedNewBranches return at most 2 new branches pushed by the user in 6 hours which has no opened PRs created type FindRecentlyPushedNewBranchesOptions struct {
// except the indicate branch Actor *user_model.User
func FindRecentlyPushedNewBranches(ctx context.Context, repoID, userID int64, excludeBranchName string) (BranchList, error) { Repo *repo_model.Repository
branches := make(BranchList, 0, 2) BaseRepo *repo_model.Repository
subQuery := builder.Select("head_branch").From("pull_request"). CommitAfterUnix int64
InnerJoin("issue", "issue.id = pull_request.issue_id"). MaxCount int
Where(builder.Eq{ }
"pull_request.head_repo_id": repoID,
"issue.is_closed": false, type RecentlyPushedNewBranch struct {
}) BranchDisplayName string
err := db.GetEngine(ctx). BranchLink string
Where("pusher_id=? AND is_deleted=?", userID, false). BranchCompareURL string
And("name <> ?", excludeBranchName). CommitTime timeutil.TimeStamp
And("repo_id = ?", repoID). }
And("commit_time >= ?", time.Now().Add(-time.Hour*6).Unix()).
NotIn("name", subQuery). // FindRecentlyPushedNewBranches return at most 2 new branches pushed by the user in 2 hours which has no opened PRs created
OrderBy("branch.commit_time DESC"). // opts.Actor should not be nil
Limit(2). // if opts.CommitAfterUnix is 0, we will find the branches that were committed to in the last 2 hours
Find(&branches) // if opts.ListOptions is not set, we will only display top 2 latest branch
return branches, err func FindRecentlyPushedNewBranches(ctx context.Context, opts *FindRecentlyPushedNewBranchesOptions) ([]*RecentlyPushedNewBranch, error) {
// find all related repo ids
repoOpts := repo_model.SearchRepoOptions{
Actor: opts.Actor,
Private: true,
AllPublic: false, // Include also all public repositories of users and public organisations
AllLimited: false, // Include also all public repositories of limited organisations
Fork: optional.Some(true),
ForkFrom: opts.BaseRepo.ID,
Archived: optional.Some(false),
}
repoCond := repo_model.SearchRepositoryCondition(&repoOpts).And(repo_model.AccessibleRepositoryCondition(opts.Actor, unit.TypeCode))
if opts.Repo.ID == opts.BaseRepo.ID {
// should also include the base repo's branches
repoCond = repoCond.Or(builder.Eq{"id": opts.BaseRepo.ID})
} else {
// in fork repo, we only detect the fork repo's branch
repoCond = repoCond.And(builder.Eq{"id": opts.Repo.ID})
}
repoIDs := builder.Select("id").From("repository").Where(repoCond)
if opts.CommitAfterUnix == 0 {
opts.CommitAfterUnix = time.Now().Add(-time.Hour * 2).Unix()
}
baseBranch, err := GetBranch(ctx, opts.BaseRepo.ID, opts.BaseRepo.DefaultBranch)
if err != nil {
return nil, err
}
// find all related branches, these branches may already created PRs, we will check later
branches, err := db.Find[Branch](ctx, FindBranchOptions{
RepoCond: builder.In("branch.repo_id", repoIDs),
CommitCond: builder.Neq{"branch.commit_id": baseBranch.CommitID}, // newly created branch have no changes, so skip them,
PusherID: opts.Actor.ID,
IsDeletedBranch: optional.Some(false),
CommitAfterUnix: opts.CommitAfterUnix,
OrderBy: "branch.updated_unix DESC",
ListOptions: db.ListOptionsAll,
})
if err != nil {
return nil, err
}
newBranches := make([]*RecentlyPushedNewBranch, 0, len(branches))
if opts.MaxCount == 0 {
// by default we display 2 recently pushed new branch
opts.MaxCount = 2
}
for _, branch := range branches {
// whether branch have already created PR
count, err := db.GetEngine(ctx).Table("pull_request").
// we should not only use branch name here, because if there are branches with same name in other repos,
// we can not detect them correctly
Where(builder.Eq{"head_repo_id": branch.RepoID, "head_branch": branch.Name}).Count()
if err != nil {
return nil, err
}
// if no PR, we add to the result
if count == 0 {
if err := branch.LoadRepo(ctx); err != nil {
return nil, err
}
branchDisplayName := branch.Name
if branch.Repo.ID != opts.BaseRepo.ID && branch.Repo.ID != opts.Repo.ID {
branchDisplayName = fmt.Sprintf("%s:%s", branch.Repo.FullName(), branchDisplayName)
}
newBranches = append(newBranches, &RecentlyPushedNewBranch{
BranchDisplayName: branchDisplayName,
BranchLink: fmt.Sprintf("%s/src/branch/%s", branch.Repo.Link(), util.PathEscapeSegments(branch.Name)),
BranchCompareURL: branch.Repo.ComposeBranchCompareURL(opts.BaseRepo, branch.Name),
CommitTime: branch.CommitTime,
})
}
if len(newBranches) == opts.MaxCount {
break
}
}
return newBranches, nil
} }

View File

@ -7,6 +7,7 @@ import (
"context" "context"
"code.gitea.io/gitea/models/db" "code.gitea.io/gitea/models/db"
repo_model "code.gitea.io/gitea/models/repo"
user_model "code.gitea.io/gitea/models/user" user_model "code.gitea.io/gitea/models/user"
"code.gitea.io/gitea/modules/container" "code.gitea.io/gitea/modules/container"
"code.gitea.io/gitea/modules/optional" "code.gitea.io/gitea/modules/optional"
@ -59,30 +60,74 @@ func (branches BranchList) LoadPusher(ctx context.Context) error {
return nil return nil
} }
func (branches BranchList) LoadRepo(ctx context.Context) error {
ids := container.FilterSlice(branches, func(branch *Branch) (int64, bool) {
return branch.RepoID, branch.RepoID > 0 && branch.Repo == nil
})
reposMap := make(map[int64]*repo_model.Repository, len(ids))
if err := db.GetEngine(ctx).In("id", ids).Find(&reposMap); err != nil {
return err
}
for _, branch := range branches {
if branch.RepoID <= 0 || branch.Repo != nil {
continue
}
branch.Repo = reposMap[branch.RepoID]
}
return nil
}
type FindBranchOptions struct { type FindBranchOptions struct {
db.ListOptions db.ListOptions
RepoID int64 RepoID int64
RepoCond builder.Cond
ExcludeBranchNames []string ExcludeBranchNames []string
CommitCond builder.Cond
PusherID int64
IsDeletedBranch optional.Option[bool] IsDeletedBranch optional.Option[bool]
CommitAfterUnix int64
CommitBeforeUnix int64
OrderBy string OrderBy string
Keyword string Keyword string
} }
func (opts FindBranchOptions) ToConds() builder.Cond { func (opts FindBranchOptions) ToConds() builder.Cond {
cond := builder.NewCond() cond := builder.NewCond()
if opts.RepoID > 0 { if opts.RepoID > 0 {
cond = cond.And(builder.Eq{"repo_id": opts.RepoID}) cond = cond.And(builder.Eq{"repo_id": opts.RepoID})
} }
if opts.RepoCond != nil {
cond = cond.And(opts.RepoCond)
}
if len(opts.ExcludeBranchNames) > 0 { if len(opts.ExcludeBranchNames) > 0 {
cond = cond.And(builder.NotIn("name", opts.ExcludeBranchNames)) cond = cond.And(builder.NotIn("branch.name", opts.ExcludeBranchNames))
} }
if opts.CommitCond != nil {
cond = cond.And(opts.CommitCond)
}
if opts.PusherID > 0 {
cond = cond.And(builder.Eq{"branch.pusher_id": opts.PusherID})
}
if opts.IsDeletedBranch.Has() { if opts.IsDeletedBranch.Has() {
cond = cond.And(builder.Eq{"is_deleted": opts.IsDeletedBranch.Value()}) cond = cond.And(builder.Eq{"branch.is_deleted": opts.IsDeletedBranch.Value()})
} }
if opts.Keyword != "" { if opts.Keyword != "" {
cond = cond.And(builder.Like{"name", opts.Keyword}) cond = cond.And(builder.Like{"name", opts.Keyword})
} }
if opts.CommitAfterUnix != 0 {
cond = cond.And(builder.Gte{"branch.commit_time": opts.CommitAfterUnix})
}
if opts.CommitBeforeUnix != 0 {
cond = cond.And(builder.Lte{"branch.commit_time": opts.CommitBeforeUnix})
}
return cond return cond
} }

View File

@ -12,6 +12,7 @@ import (
issues_model "code.gitea.io/gitea/models/issues" issues_model "code.gitea.io/gitea/models/issues"
repo_model "code.gitea.io/gitea/models/repo" repo_model "code.gitea.io/gitea/models/repo"
"code.gitea.io/gitea/models/unittest" "code.gitea.io/gitea/models/unittest"
user_model "code.gitea.io/gitea/models/user"
"code.gitea.io/gitea/modules/git" "code.gitea.io/gitea/modules/git"
"code.gitea.io/gitea/modules/optional" "code.gitea.io/gitea/modules/optional"
@ -183,3 +184,90 @@ func TestOnlyGetDeletedBranchOnCorrectRepo(t *testing.T) {
assert.NoError(t, err) assert.NoError(t, err)
assert.NotNil(t, deletedBranch) assert.NotNil(t, deletedBranch)
} }
func TestFindRecentlyPushedNewBranches(t *testing.T) {
assert.NoError(t, unittest.PrepareTestDatabase())
repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 10})
user1 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1})
user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
user12 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 12})
user13 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 13})
tests := []struct {
name string
opts *git_model.FindRecentlyPushedNewBranchesOptions
count int
want []string
}{
// user12 is the owner of the repo10 and the organization org25
// in repo10, user12 has opening/closed/merged pr and closed/merged pr with deleted branch
{
name: "new branch of the repo, org fork repo, pr branches and deleted branch",
opts: &git_model.FindRecentlyPushedNewBranchesOptions{
Actor: user12,
CommitAfterUnix: 1489927670,
MaxCount: 10,
},
count: 2,
want: []string{"new-commit", "org25/org_fork_repo62:org-fork-new-commit"},
},
// user13 pushed 2 branches with the same name in repo10 and repo11
// and repo11's branch has a pr, but repo10's branch doesn't
// in this case, we should get repo10's branch but not repo11's branch
{
name: "new branch from user fork repo and same name branch",
opts: &git_model.FindRecentlyPushedNewBranchesOptions{
Actor: user13,
CommitAfterUnix: 1489927670,
MaxCount: 10,
},
count: 2,
want: []string{"user13/repo11:user-fork-new-commit", "same-name-branch-in-pr"},
},
// user1 is the owner of private_org35
{
name: "new branch from private org with code permission repo",
opts: &git_model.FindRecentlyPushedNewBranchesOptions{
Actor: user1,
CommitAfterUnix: 1489927670,
},
count: 1,
want: []string{"private_org35/private_org_fork_repo63:private-org-fork-new-commit"},
},
// user2 does not have code permission in private_org35
{
name: "new branch from private org with no code permission repo",
opts: &git_model.FindRecentlyPushedNewBranchesOptions{
Actor: user2,
CommitAfterUnix: 1489927670,
},
count: 0,
want: []string{},
},
{
name: "test commitAfterUnix option",
opts: &git_model.FindRecentlyPushedNewBranchesOptions{
Actor: user12,
CommitAfterUnix: 1489927690,
},
count: 1,
want: []string{"org25/org_fork_repo62:org-fork-new-commit"},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
tt.opts.Repo = repo
tt.opts.BaseRepo = repo
branches, err := git_model.FindRecentlyPushedNewBranches(db.DefaultContext, tt.opts)
assert.NoError(t, err)
assert.Equal(t, tt.count, len(branches))
for i := 0; i < tt.count; i++ {
assert.Equal(t, tt.want[i], branches[i].BranchDisplayName)
}
})
}
}

View File

@ -379,7 +379,7 @@ func TestCountIssues(t *testing.T) {
assert.NoError(t, unittest.PrepareTestDatabase()) assert.NoError(t, unittest.PrepareTestDatabase())
count, err := issues_model.CountIssues(db.DefaultContext, &issues_model.IssuesOptions{}) count, err := issues_model.CountIssues(db.DefaultContext, &issues_model.IssuesOptions{})
assert.NoError(t, err) assert.NoError(t, err)
assert.EqualValues(t, 22, count) assert.EqualValues(t, 28, count)
} }
func TestIssueLoadAttributes(t *testing.T) { func TestIssueLoadAttributes(t *testing.T) {

View File

@ -807,7 +807,7 @@ func UpdateAllowEdits(ctx context.Context, pr *PullRequest) error {
// Mergeable returns if the pullrequest is mergeable. // Mergeable returns if the pullrequest is mergeable.
func (pr *PullRequest) Mergeable(ctx context.Context) bool { func (pr *PullRequest) Mergeable(ctx context.Context) bool {
// If a pull request isn't mergable if it's: // If a pull request isn't mergeable if it's:
// - Being conflict checked. // - Being conflict checked.
// - Has a conflict. // - Has a conflict.
// - Received a error while being conflict checked. // - Received a error while being conflict checked.

View File

@ -187,8 +187,8 @@ func AddTime(ctx context.Context, user *user_model.User, issue *Issue, amount in
Issue: issue, Issue: issue,
Repo: issue.Repo, Repo: issue.Repo,
Doer: user, Doer: user,
// Content before v1.21 did store the formated string instead of seconds, // Content before v1.21 did store the formatted string instead of seconds,
// so use "|" as delimeter to mark the new format // so use "|" as delimiter to mark the new format
Content: fmt.Sprintf("|%d", amount), Content: fmt.Sprintf("|%d", amount),
Type: CommentTypeAddTimeManual, Type: CommentTypeAddTimeManual,
TimeID: t.ID, TimeID: t.ID,
@ -267,8 +267,8 @@ func DeleteIssueUserTimes(ctx context.Context, issue *Issue, user *user_model.Us
Issue: issue, Issue: issue,
Repo: issue.Repo, Repo: issue.Repo,
Doer: user, Doer: user,
// Content before v1.21 did store the formated string instead of seconds, // Content before v1.21 did store the formatted string instead of seconds,
// so use "|" as delimeter to mark the new format // so use "|" as delimiter to mark the new format
Content: fmt.Sprintf("|%d", removedTime), Content: fmt.Sprintf("|%d", removedTime),
Type: CommentTypeDeleteTimeManual, Type: CommentTypeDeleteTimeManual,
}); err != nil { }); err != nil {
@ -298,8 +298,8 @@ func DeleteTime(ctx context.Context, t *TrackedTime) error {
Issue: t.Issue, Issue: t.Issue,
Repo: t.Issue.Repo, Repo: t.Issue.Repo,
Doer: t.User, Doer: t.User,
// Content before v1.21 did store the formated string instead of seconds, // Content before v1.21 did store the formatted string instead of seconds,
// so use "|" as delimeter to mark the new format // so use "|" as delimiter to mark the new format
Content: fmt.Sprintf("|%d", t.Time), Content: fmt.Sprintf("|%d", t.Time),
Type: CommentTypeDeleteTimeManual, Type: CommentTypeDeleteTimeManual,
}); err != nil { }); err != nil {

View File

@ -4,4 +4,4 @@
package v1_17 //nolint package v1_17 //nolint
// This migration added non-ideal indices to the action table which on larger datasets slowed things down // This migration added non-ideal indices to the action table which on larger datasets slowed things down
// it has been superceded by v218.go // it has been superseded by v218.go

View File

@ -81,7 +81,7 @@ func TestUserListIsPublicMember(t *testing.T) {
{3, map[int64]bool{2: true, 4: false, 28: true}}, {3, map[int64]bool{2: true, 4: false, 28: true}},
{6, map[int64]bool{5: true, 28: true}}, {6, map[int64]bool{5: true, 28: true}},
{7, map[int64]bool{5: false}}, {7, map[int64]bool{5: false}},
{25, map[int64]bool{24: true}}, {25, map[int64]bool{12: true, 24: true}},
{22, map[int64]bool{}}, {22, map[int64]bool{}},
} }
for _, v := range tt { for _, v := range tt {
@ -108,8 +108,8 @@ func TestUserListIsUserOrgOwner(t *testing.T) {
{3, map[int64]bool{2: true, 4: false, 28: false}}, {3, map[int64]bool{2: true, 4: false, 28: false}},
{6, map[int64]bool{5: true, 28: false}}, {6, map[int64]bool{5: true, 28: false}},
{7, map[int64]bool{5: true}}, {7, map[int64]bool{5: true}},
{25, map[int64]bool{24: false}}, // ErrTeamNotExist {25, map[int64]bool{12: true, 24: false}}, // ErrTeamNotExist
{22, map[int64]bool{}}, // No member {22, map[int64]bool{}}, // No member
} }
for _, v := range tt { for _, v := range tt {
t.Run(fmt.Sprintf("IsUserOrgOwnerOfOrgId%d", v.orgid), func(t *testing.T) { t.Run(fmt.Sprintf("IsUserOrgOwnerOfOrgId%d", v.orgid), func(t *testing.T) {

View File

@ -175,6 +175,8 @@ type SearchRepoOptions struct {
// True -> include just forks // True -> include just forks
// False -> include just non-forks // False -> include just non-forks
Fork optional.Option[bool] Fork optional.Option[bool]
// If Fork option is True, you can use this option to limit the forks of a special repo by repo id.
ForkFrom int64
// None -> include templates AND non-templates // None -> include templates AND non-templates
// True -> include just templates // True -> include just templates
// False -> include just non-templates // False -> include just non-templates
@ -514,6 +516,10 @@ func SearchRepositoryCondition(opts *SearchRepoOptions) builder.Cond {
cond = cond.And(builder.Eq{"is_fork": false}) cond = cond.And(builder.Eq{"is_fork": false})
} else { } else {
cond = cond.And(builder.Eq{"is_fork": opts.Fork.Value()}) cond = cond.And(builder.Eq{"is_fork": opts.Fork.Value()})
if opts.ForkFrom > 0 && opts.Fork.Value() {
cond = cond.And(builder.Eq{"fork_id": opts.ForkFrom})
}
} }
} }

View File

@ -138,12 +138,12 @@ func getTestCases() []struct {
{ {
name: "AllPublic/PublicRepositoriesOfUserIncludingCollaborative", name: "AllPublic/PublicRepositoriesOfUserIncludingCollaborative",
opts: &repo_model.SearchRepoOptions{ListOptions: db.ListOptions{Page: 1, PageSize: 10}, OwnerID: 15, AllPublic: true, Template: optional.Some(false)}, opts: &repo_model.SearchRepoOptions{ListOptions: db.ListOptions{Page: 1, PageSize: 10}, OwnerID: 15, AllPublic: true, Template: optional.Some(false)},
count: 33, count: 34,
}, },
{ {
name: "AllPublic/PublicAndPrivateRepositoriesOfUserIncludingCollaborative", name: "AllPublic/PublicAndPrivateRepositoriesOfUserIncludingCollaborative",
opts: &repo_model.SearchRepoOptions{ListOptions: db.ListOptions{Page: 1, PageSize: 10}, OwnerID: 15, Private: true, AllPublic: true, AllLimited: true, Template: optional.Some(false)}, opts: &repo_model.SearchRepoOptions{ListOptions: db.ListOptions{Page: 1, PageSize: 10}, OwnerID: 15, Private: true, AllPublic: true, AllLimited: true, Template: optional.Some(false)},
count: 38, count: 39,
}, },
{ {
name: "AllPublic/PublicAndPrivateRepositoriesOfUserIncludingCollaborativeByName", name: "AllPublic/PublicAndPrivateRepositoriesOfUserIncludingCollaborativeByName",
@ -158,7 +158,7 @@ func getTestCases() []struct {
{ {
name: "AllPublic/PublicRepositoriesOfOrganization", name: "AllPublic/PublicRepositoriesOfOrganization",
opts: &repo_model.SearchRepoOptions{ListOptions: db.ListOptions{Page: 1, PageSize: 10}, OwnerID: 17, AllPublic: true, Collaborate: optional.Some(false), Template: optional.Some(false)}, opts: &repo_model.SearchRepoOptions{ListOptions: db.ListOptions{Page: 1, PageSize: 10}, OwnerID: 17, AllPublic: true, Collaborate: optional.Some(false), Template: optional.Some(false)},
count: 33, count: 34,
}, },
{ {
name: "AllTemplates", name: "AllTemplates",

View File

@ -184,7 +184,7 @@ func (ref RefName) RefGroup() string {
} }
// RefType returns the simple ref type of the reference, e.g. branch, tag // RefType returns the simple ref type of the reference, e.g. branch, tag
// It's differrent from RefGroup, which is using the name of the directory under .git/refs // It's different from RefGroup, which is using the name of the directory under .git/refs
// Here we using branch but not heads, using tag but not tags // Here we using branch but not heads, using tag but not tags
func (ref RefName) RefType() string { func (ref RefName) RefType() string {
var refType string var refType string

View File

@ -215,7 +215,7 @@ func searchIssueIsPull(t *testing.T) {
SearchOptions{ SearchOptions{
IsPull: optional.Some(true), IsPull: optional.Some(true),
}, },
[]int64{22, 21, 12, 11, 20, 19, 9, 8, 3, 2}, []int64{22, 21, 12, 11, 20, 28, 27, 26, 25, 24, 23, 19, 9, 8, 3, 2},
}, },
} }
for _, test := range tests { for _, test := range tests {
@ -236,13 +236,13 @@ func searchIssueIsClosed(t *testing.T) {
SearchOptions{ SearchOptions{
IsClosed: optional.Some(false), IsClosed: optional.Some(false),
}, },
[]int64{22, 21, 17, 16, 15, 14, 13, 12, 11, 20, 6, 19, 18, 10, 7, 9, 8, 3, 2, 1}, []int64{22, 21, 17, 16, 15, 14, 13, 12, 11, 20, 6, 28, 27, 25, 23, 19, 18, 10, 7, 9, 8, 3, 2, 1},
}, },
{ {
SearchOptions{ SearchOptions{
IsClosed: optional.Some(true), IsClosed: optional.Some(true),
}, },
[]int64{5, 4}, []int64{5, 26, 24, 4},
}, },
} }
for _, test := range tests { for _, test := range tests {
@ -302,7 +302,7 @@ func searchIssueByLabelID(t *testing.T) {
SearchOptions{ SearchOptions{
ExcludedLabelIDs: []int64{1}, ExcludedLabelIDs: []int64{1},
}, },
[]int64{22, 21, 17, 16, 15, 14, 13, 12, 11, 20, 6, 5, 19, 18, 10, 7, 4, 9, 8, 3}, []int64{22, 21, 17, 16, 15, 14, 13, 12, 11, 20, 6, 5, 28, 27, 26, 25, 24, 23, 19, 18, 10, 7, 4, 9, 8, 3},
}, },
} }
for _, test := range tests { for _, test := range tests {
@ -323,7 +323,7 @@ func searchIssueByTime(t *testing.T) {
SearchOptions{ SearchOptions{
UpdatedAfterUnix: optional.Some(int64(0)), UpdatedAfterUnix: optional.Some(int64(0)),
}, },
[]int64{22, 21, 17, 16, 15, 14, 13, 12, 11, 20, 6, 5, 19, 18, 10, 7, 4, 9, 8, 3, 2, 1}, []int64{22, 21, 17, 16, 15, 14, 13, 12, 11, 20, 6, 5, 28, 27, 26, 25, 24, 23, 19, 18, 10, 7, 4, 9, 8, 3, 2, 1},
}, },
} }
for _, test := range tests { for _, test := range tests {
@ -344,7 +344,7 @@ func searchIssueWithOrder(t *testing.T) {
SearchOptions{ SearchOptions{
SortBy: internal.SortByCreatedAsc, SortBy: internal.SortByCreatedAsc,
}, },
[]int64{1, 2, 3, 8, 9, 4, 7, 10, 18, 19, 5, 6, 20, 11, 12, 13, 14, 15, 16, 17, 21, 22}, []int64{1, 2, 3, 8, 9, 4, 7, 10, 18, 19, 23, 24, 25, 26, 27, 28, 5, 6, 20, 11, 12, 13, 14, 15, 16, 17, 21, 22},
}, },
} }
for _, test := range tests { for _, test := range tests {
@ -402,7 +402,7 @@ func searchIssueWithPaginator(t *testing.T) {
}, },
}, },
[]int64{22, 21, 17, 16, 15}, []int64{22, 21, 17, 16, 15},
22, 28,
}, },
} }
for _, test := range tests { for _, test := range tests {

View File

@ -134,7 +134,7 @@ func (pm *Manager) AddTypedContext(parent context.Context, description, processT
// //
// Most processes will not need to use the cancel function but there will be cases whereby you want to cancel the process but not immediately remove it from the // Most processes will not need to use the cancel function but there will be cases whereby you want to cancel the process but not immediately remove it from the
// process table. // process table.
func (pm *Manager) AddContextTimeout(parent context.Context, timeout time.Duration, description string) (ctx context.Context, cancel context.CancelFunc, finshed FinishedFunc) { func (pm *Manager) AddContextTimeout(parent context.Context, timeout time.Duration, description string) (ctx context.Context, cancel context.CancelFunc, finished FinishedFunc) {
if timeout <= 0 { if timeout <= 0 {
// it's meaningless to use timeout <= 0, and it must be a bug! so we must panic here to tell developers to make the timeout correct // it's meaningless to use timeout <= 0, and it must be a bug! so we must panic here to tell developers to make the timeout correct
panic("the timeout must be greater than zero, otherwise the context will be cancelled immediately") panic("the timeout must be greater than zero, otherwise the context will be cancelled immediately")
@ -142,9 +142,9 @@ func (pm *Manager) AddContextTimeout(parent context.Context, timeout time.Durati
ctx, cancel = context.WithTimeout(parent, timeout) ctx, cancel = context.WithTimeout(parent, timeout)
ctx, _, finshed = pm.Add(ctx, description, cancel, NormalProcessType, true) ctx, _, finished = pm.Add(ctx, description, cancel, NormalProcessType, true)
return ctx, cancel, finshed return ctx, cancel, finished
} }
// Add create a new process // Add create a new process

View File

@ -49,9 +49,9 @@ func TestSubjectBodySeparator(t *testing.T) {
test("Multiple\n---\n-------\n---\nSeparators", test("Multiple\n---\n-------\n---\nSeparators",
"Multiple\n", "Multiple\n",
"\n-------\n---\nSeparators") "\n-------\n---\nSeparators")
test("Insuficient\n--\nSeparators", test("Insufficient\n--\nSeparators",
"", "",
"Insuficient\n--\nSeparators") "Insufficient\n--\nSeparators")
} }
func TestJSEscapeSafe(t *testing.T) { func TestJSEscapeSafe(t *testing.T) {

View File

@ -436,6 +436,7 @@ oauth_signin_submit=Vincular conta
oauth.signin.error=Ocorreu um erro durante o processamento do pedido de autorização. Se este erro persistir, contacte o administrador. oauth.signin.error=Ocorreu um erro durante o processamento do pedido de autorização. Se este erro persistir, contacte o administrador.
oauth.signin.error.access_denied=O pedido de autorização foi negado. oauth.signin.error.access_denied=O pedido de autorização foi negado.
oauth.signin.error.temporarily_unavailable=A autorização falhou porque o servidor de autenticação está temporariamente indisponível. Tente mais tarde. oauth.signin.error.temporarily_unavailable=A autorização falhou porque o servidor de autenticação está temporariamente indisponível. Tente mais tarde.
oauth_callback_unable_auto_reg=O registo automático está habilitado, mas o fornecedor OAuth2 %[1]s sinalizou campos em falta: %[2]s, por isso não foi possível criar uma conta automaticamente. Crie ou vincule uma conta ou contacte o administrador do sítio.
openid_connect_submit=Estabelecer ligação openid_connect_submit=Estabelecer ligação
openid_connect_title=Estabelecer ligação a uma conta existente openid_connect_title=Estabelecer ligação a uma conta existente
openid_connect_desc=O URI do OpenID escolhido Ă© desconhecido. Associe-o a uma nova conta aqui. openid_connect_desc=O URI do OpenID escolhido Ă© desconhecido. Associe-o a uma nova conta aqui.

View File

@ -301,7 +301,7 @@ func (ar artifactRoutes) uploadArtifact(ctx *ArtifactContext) {
}) })
} }
// comfirmUploadArtifact comfirm upload artifact. // comfirmUploadArtifact confirm upload artifact.
// if all chunks are uploaded, merge them to one file. // if all chunks are uploaded, merge them to one file.
func (ar artifactRoutes) comfirmUploadArtifact(ctx *ArtifactContext) { func (ar artifactRoutes) comfirmUploadArtifact(ctx *ArtifactContext) {
_, runID, ok := validateRunID(ctx) _, runID, ok := validateRunID(ctx)

View File

@ -36,7 +36,7 @@ var withRunner = connect.WithInterceptors(connect.UnaryInterceptorFunc(func(unar
uuid := request.Header().Get(uuidHeaderKey) uuid := request.Header().Get(uuidHeaderKey)
token := request.Header().Get(tokenHeaderKey) token := request.Header().Get(tokenHeaderKey)
// TODO: version will be removed from request header after Gitea 1.20 released. // TODO: version will be removed from request header after Gitea 1.20 released.
// And Gitea will not try to read version from reuqest header // And Gitea will not try to read version from request header
version := request.Header().Get(versionHeaderKey) version := request.Header().Get(versionHeaderKey)
runner, err := actions_model.GetRunnerByUUID(ctx, uuid) runner, err := actions_model.GetRunnerByUUID(ctx, uuid)
@ -53,7 +53,7 @@ var withRunner = connect.WithInterceptors(connect.UnaryInterceptorFunc(func(unar
cols := []string{"last_online"} cols := []string{"last_online"}
// TODO: version will be removed from request header after Gitea 1.20 released. // TODO: version will be removed from request header after Gitea 1.20 released.
// And Gitea will not try to read version from reuqest header // And Gitea will not try to read version from request header
version, _ = util.SplitStringAtByteN(version, 64) version, _ = util.SplitStringAtByteN(version, 64)
if !util.IsEmptyString(version) && runner.Version != version { if !util.IsEmptyString(version) && runner.Version != version {
runner.Version = version runner.Version = version

View File

@ -19,7 +19,7 @@ The package registry code is divided into multiple modules to split the function
## Models ## Models
Every package registry implementation uses the same underlaying models: Every package registry implementation uses the same underlying models:
| Model | Description | | Model | Description |
| - | - | | - | - |

View File

@ -12,7 +12,7 @@ import (
"code.gitea.io/gitea/services/context" "code.gitea.io/gitea/services/context"
) )
// RegistrationToken is response related to registeration token // RegistrationToken is response related to registration token
// swagger:response RegistrationToken // swagger:response RegistrationToken
type RegistrationToken struct { type RegistrationToken struct {
Token string `json:"token"` Token string `json:"token"`

View File

@ -359,7 +359,7 @@ func preReceiveBranch(ctx *preReceiveContext, oldCommitID, newCommitID string, r
}) })
return return
} }
log.Error("Unable to check if mergable: protected branch %s in %-v and pr #%d. Error: %v", ctx.opts.UserID, branchName, repo, pr.Index, err) log.Error("Unable to check if mergeable: protected branch %s in %-v and pr #%d. Error: %v", ctx.opts.UserID, branchName, repo, pr.Index, err)
ctx.JSON(http.StatusInternalServerError, private.Response{ ctx.JSON(http.StatusInternalServerError, private.Response{
Err: fmt.Sprintf("Unable to get status of pull request %d. Error: %v", ctx.opts.PullRequestID, err), Err: fmt.Sprintf("Unable to get status of pull request %d. Error: %v", ctx.opts.PullRequestID, err),
}) })

View File

@ -30,7 +30,7 @@ func Organizations(ctx *context.Context) {
explore.RenderUserSearch(ctx, &user_model.SearchUserOptions{ explore.RenderUserSearch(ctx, &user_model.SearchUserOptions{
Actor: ctx.Doer, Actor: ctx.Doer,
Type: user_model.UserTypeOrganization, Type: user_model.UserTypeOrganization,
IncludeReserved: true, // administrator needs to list all acounts include reserved IncludeReserved: true, // administrator needs to list all accounts include reserved
ListOptions: db.ListOptions{ ListOptions: db.ListOptions{
PageSize: setting.UI.Admin.OrgPagingNum, PageSize: setting.UI.Admin.OrgPagingNum,
}, },

View File

@ -81,7 +81,7 @@ func Users(ctx *context.Context) {
IsRestricted: util.OptionalBoolParse(statusFilterMap["is_restricted"]), IsRestricted: util.OptionalBoolParse(statusFilterMap["is_restricted"]),
IsTwoFactorEnabled: util.OptionalBoolParse(statusFilterMap["is_2fa_enabled"]), IsTwoFactorEnabled: util.OptionalBoolParse(statusFilterMap["is_2fa_enabled"]),
IsProhibitLogin: util.OptionalBoolParse(statusFilterMap["is_prohibit_login"]), IsProhibitLogin: util.OptionalBoolParse(statusFilterMap["is_prohibit_login"]),
IncludeReserved: true, // administrator needs to list all acounts include reserved, bot, remote ones IncludeReserved: true, // administrator needs to list all accounts include reserved, bot, remote ones
ExtraParamStrings: extraParamStrings, ExtraParamStrings: extraParamStrings,
}, tplUsers) }, tplUsers)
} }

View File

@ -812,7 +812,7 @@ func CompareDiff(ctx *context.Context) {
// applicable if you have one commit to compare and that commit has a message. // applicable if you have one commit to compare and that commit has a message.
// In that case the commit message will be prepend to the template body. // In that case the commit message will be prepend to the template body.
if templateContent, ok := ctx.Data[pullRequestTemplateKey].(string); ok && templateContent != "" { if templateContent, ok := ctx.Data[pullRequestTemplateKey].(string); ok && templateContent != "" {
// Re-use the same key as that's priortized over the "content" key. // Re-use the same key as that's prioritized over the "content" key.
// Add two new lines between the content to ensure there's always at least // Add two new lines between the content to ensure there's always at least
// one empty line between them. // one empty line between them.
ctx.Data[pullRequestTemplateKey] = content + "\n\n" + templateContent ctx.Data[pullRequestTemplateKey] = content + "\n\n" + templateContent

View File

@ -1760,8 +1760,8 @@ func ViewIssue(ctx *context.Context) {
// drop error since times could be pruned from DB.. // drop error since times could be pruned from DB..
_ = comment.LoadTime(ctx) _ = comment.LoadTime(ctx)
if comment.Content != "" { if comment.Content != "" {
// Content before v1.21 did store the formated string instead of seconds, // Content before v1.21 did store the formatted string instead of seconds,
// so "|" is used as delimeter to mark the new format // so "|" is used as delimiter to mark the new format
if comment.Content[0] != '|' { if comment.Content[0] != '|' {
// handle old time comments that have formatted text stored // handle old time comments that have formatted text stored
comment.RenderedContent = templates.SanitizeHTML(comment.Content) comment.RenderedContent = templates.SanitizeHTML(comment.Content)

View File

@ -29,6 +29,7 @@ import (
"code.gitea.io/gitea/models/db" "code.gitea.io/gitea/models/db"
git_model "code.gitea.io/gitea/models/git" git_model "code.gitea.io/gitea/models/git"
issue_model "code.gitea.io/gitea/models/issues" issue_model "code.gitea.io/gitea/models/issues"
access_model "code.gitea.io/gitea/models/perm/access"
repo_model "code.gitea.io/gitea/models/repo" repo_model "code.gitea.io/gitea/models/repo"
unit_model "code.gitea.io/gitea/models/unit" unit_model "code.gitea.io/gitea/models/unit"
user_model "code.gitea.io/gitea/models/user" user_model "code.gitea.io/gitea/models/user"
@ -1027,15 +1028,27 @@ func renderHomeCode(ctx *context.Context) {
return return
} }
showRecentlyPushedNewBranches := true opts := &git_model.FindRecentlyPushedNewBranchesOptions{
if ctx.Repo.Repository.IsMirror || Actor: ctx.Doer,
!ctx.Repo.Repository.UnitEnabled(ctx, unit_model.TypePullRequests) { Repo: ctx.Repo.Repository,
showRecentlyPushedNewBranches = false BaseRepo: ctx.Repo.Repository,
} }
if showRecentlyPushedNewBranches { if ctx.Repo.Repository.IsFork {
ctx.Data["RecentlyPushedNewBranches"], err = git_model.FindRecentlyPushedNewBranches(ctx, ctx.Repo.Repository.ID, ctx.Doer.ID, ctx.Repo.Repository.DefaultBranch) opts.BaseRepo = ctx.Repo.Repository.BaseRepo
}
baseRepoPerm, err := access_model.GetUserRepoPermission(ctx, opts.BaseRepo, ctx.Doer)
if err != nil {
ctx.ServerError("GetUserRepoPermission", err)
return
}
if !opts.Repo.IsMirror && !opts.BaseRepo.IsMirror &&
opts.BaseRepo.UnitEnabled(ctx, unit_model.TypePullRequests) &&
baseRepoPerm.CanRead(unit_model.TypePullRequests) {
ctx.Data["RecentlyPushedNewBranches"], err = git_model.FindRecentlyPushedNewBranches(ctx, opts)
if err != nil { if err != nil {
ctx.ServerError("GetRecentlyPushedBranches", err) ctx.ServerError("FindRecentlyPushedNewBranches", err)
return return
} }
} }

View File

@ -72,8 +72,8 @@ func ToTimelineComment(ctx context.Context, repo *repo_model.Repository, c *issu
c.Type == issues_model.CommentTypeStopTracking || c.Type == issues_model.CommentTypeStopTracking ||
c.Type == issues_model.CommentTypeDeleteTimeManual) && c.Type == issues_model.CommentTypeDeleteTimeManual) &&
c.Content[0] == '|' { c.Content[0] == '|' {
// TimeTracking Comments from v1.21 on store the seconds instead of an formated string // TimeTracking Comments from v1.21 on store the seconds instead of an formatted string
// so we check for the "|" delimeter and convert new to legacy format on demand // so we check for the "|" delimiter and convert new to legacy format on demand
c.Content = util.SecToTime(c.Content[1:]) c.Content = util.SecToTime(c.Content[1:])
} }
} }

View File

@ -229,12 +229,12 @@ func TeamReviewRequest(ctx context.Context, issue *issues_model.Issue, doer *use
return comment, teamReviewRequestNotify(ctx, issue, doer, reviewer, isAdd, comment) return comment, teamReviewRequestNotify(ctx, issue, doer, reviewer, isAdd, comment)
} }
func ReviewRequestNotify(ctx context.Context, issue *issues_model.Issue, doer *user_model.User, reviewNotifers []*ReviewRequestNotifier) { func ReviewRequestNotify(ctx context.Context, issue *issues_model.Issue, doer *user_model.User, reviewNotifiers []*ReviewRequestNotifier) {
for _, reviewNotifer := range reviewNotifers { for _, reviewNotifier := range reviewNotifiers {
if reviewNotifer.Reviwer != nil { if reviewNotifier.Reviewer != nil {
notify_service.PullRequestReviewRequest(ctx, issue.Poster, issue, reviewNotifer.Reviwer, reviewNotifer.IsAdd, reviewNotifer.Comment) notify_service.PullRequestReviewRequest(ctx, issue.Poster, issue, reviewNotifier.Reviewer, reviewNotifier.IsAdd, reviewNotifier.Comment)
} else if reviewNotifer.ReviewTeam != nil { } else if reviewNotifier.ReviewTeam != nil {
if err := teamReviewRequestNotify(ctx, issue, issue.Poster, reviewNotifer.ReviewTeam, reviewNotifer.IsAdd, reviewNotifer.Comment); err != nil { if err := teamReviewRequestNotify(ctx, issue, issue.Poster, reviewNotifier.ReviewTeam, reviewNotifier.IsAdd, reviewNotifier.Comment); err != nil {
log.Error("teamReviewRequestNotify: %v", err) log.Error("teamReviewRequestNotify: %v", err)
} }
} }

View File

@ -90,17 +90,17 @@ func ChangeTitle(ctx context.Context, issue *issues_model.Issue, doer *user_mode
return err return err
} }
var reviewNotifers []*ReviewRequestNotifier var reviewNotifiers []*ReviewRequestNotifier
if issue.IsPull && issues_model.HasWorkInProgressPrefix(oldTitle) && !issues_model.HasWorkInProgressPrefix(title) { if issue.IsPull && issues_model.HasWorkInProgressPrefix(oldTitle) && !issues_model.HasWorkInProgressPrefix(title) {
var err error var err error
reviewNotifers, err = PullRequestCodeOwnersReview(ctx, issue, issue.PullRequest) reviewNotifiers, err = PullRequestCodeOwnersReview(ctx, issue, issue.PullRequest)
if err != nil { if err != nil {
log.Error("PullRequestCodeOwnersReview: %v", err) log.Error("PullRequestCodeOwnersReview: %v", err)
} }
} }
notify_service.IssueChangeTitle(ctx, doer, issue, oldTitle) notify_service.IssueChangeTitle(ctx, doer, issue, oldTitle)
ReviewRequestNotify(ctx, issue, issue.Poster, reviewNotifers) ReviewRequestNotify(ctx, issue, issue.Poster, reviewNotifiers)
return nil return nil
} }

View File

@ -35,9 +35,10 @@ func TestGetRefEndNamesAndURLs(t *testing.T) {
func TestIssue_DeleteIssue(t *testing.T) { func TestIssue_DeleteIssue(t *testing.T) {
assert.NoError(t, unittest.PrepareTestDatabase()) assert.NoError(t, unittest.PrepareTestDatabase())
issueCount := 5
issueIDs, err := issues_model.GetIssueIDsByRepoID(db.DefaultContext, 1) issueIDs, err := issues_model.GetIssueIDsByRepoID(db.DefaultContext, 1)
assert.NoError(t, err) assert.NoError(t, err)
assert.Len(t, issueIDs, 5) assert.Len(t, issueIDs, issueCount)
issue := &issues_model.Issue{ issue := &issues_model.Issue{
RepoID: 1, RepoID: 1,
@ -48,7 +49,7 @@ func TestIssue_DeleteIssue(t *testing.T) {
assert.NoError(t, err) assert.NoError(t, err)
issueIDs, err = issues_model.GetIssueIDsByRepoID(db.DefaultContext, 1) issueIDs, err = issues_model.GetIssueIDsByRepoID(db.DefaultContext, 1)
assert.NoError(t, err) assert.NoError(t, err)
assert.Len(t, issueIDs, 4) assert.Len(t, issueIDs, issueCount-1)
// check attachment removal // check attachment removal
attachments, err := repo_model.GetAttachmentsByIssueID(db.DefaultContext, 4) attachments, err := repo_model.GetAttachmentsByIssueID(db.DefaultContext, 4)

View File

@ -36,7 +36,7 @@ func getMergeBase(repo *git.Repository, pr *issues_model.PullRequest, baseBranch
type ReviewRequestNotifier struct { type ReviewRequestNotifier struct {
Comment *issues_model.Comment Comment *issues_model.Comment
IsAdd bool IsAdd bool
Reviwer *user_model.User Reviewer *user_model.User
ReviewTeam *org_model.Team ReviewTeam *org_model.Team
} }
@ -124,9 +124,9 @@ func PullRequestCodeOwnersReview(ctx context.Context, issue *issues_model.Issue,
return nil, err return nil, err
} }
notifiers = append(notifiers, &ReviewRequestNotifier{ notifiers = append(notifiers, &ReviewRequestNotifier{
Comment: comment, Comment: comment,
IsAdd: true, IsAdd: true,
Reviwer: u, Reviewer: u,
}) })
} }
} }

View File

@ -20,11 +20,11 @@ import (
// DeleteOrganization completely and permanently deletes everything of organization. // DeleteOrganization completely and permanently deletes everything of organization.
func DeleteOrganization(ctx context.Context, org *org_model.Organization, purge bool) error { func DeleteOrganization(ctx context.Context, org *org_model.Organization, purge bool) error {
ctx, commiter, err := db.TxContext(ctx) ctx, committer, err := db.TxContext(ctx)
if err != nil { if err != nil {
return err return err
} }
defer commiter.Close() defer committer.Close()
if purge { if purge {
err := repo_service.DeleteOwnerRepositoriesDirectly(ctx, org.AsUser()) err := repo_service.DeleteOwnerRepositoriesDirectly(ctx, org.AsUser())
@ -52,7 +52,7 @@ func DeleteOrganization(ctx context.Context, org *org_model.Organization, purge
return fmt.Errorf("DeleteOrganization: %w", err) return fmt.Errorf("DeleteOrganization: %w", err)
} }
if err := commiter.Commit(); err != nil { if err := committer.Commit(); err != nil {
return err return err
} }

View File

@ -66,7 +66,7 @@ const (
MergeCheckTypeAuto // Auto Merge (Scheduled Merge) After Checks Succeed MergeCheckTypeAuto // Auto Merge (Scheduled Merge) After Checks Succeed
) )
// CheckPullMergable check if the pull mergable based on all conditions (branch protection, merge options, ...) // CheckPullMergable check if the pull mergeable based on all conditions (branch protection, merge options, ...)
func CheckPullMergable(stdCtx context.Context, doer *user_model.User, perm *access_model.Permission, pr *issues_model.PullRequest, mergeCheckType MergeCheckType, adminSkipProtectionCheck bool) error { func CheckPullMergable(stdCtx context.Context, doer *user_model.User, perm *access_model.Permission, pr *issues_model.PullRequest, mergeCheckType MergeCheckType, adminSkipProtectionCheck bool) error {
return db.WithTx(stdCtx, func(ctx context.Context) error { return db.WithTx(stdCtx, func(ctx context.Context) error {
if pr.HasMerged { if pr.HasMerged {

View File

@ -46,7 +46,7 @@ func getCommitIDsFromRepo(ctx context.Context, repo *repo_model.Repository, oldC
return commitIDs, isForcePush, err return commitIDs, isForcePush, err
} }
// Find commits between new and old commit exclusing base branch commits // Find commits between new and old commit excluding base branch commits
commits, err := gitRepo.CommitsBetweenNotBase(newCommit, oldCommit, baseBranch) commits, err := gitRepo.CommitsBetweenNotBase(newCommit, oldCommit, baseBranch)
if err != nil { if err != nil {
return nil, false, err return nil, false, err

View File

@ -77,7 +77,7 @@ func NewPullRequest(ctx context.Context, repo *repo_model.Repository, issue *iss
} }
defer baseGitRepo.Close() defer baseGitRepo.Close()
var reviewNotifers []*issue_service.ReviewRequestNotifier var reviewNotifiers []*issue_service.ReviewRequestNotifier
if err := db.WithTx(ctx, func(ctx context.Context) error { if err := db.WithTx(ctx, func(ctx context.Context) error {
if err := issues_model.NewPullRequest(ctx, repo, issue, labelIDs, uuids, pr); err != nil { if err := issues_model.NewPullRequest(ctx, repo, issue, labelIDs, uuids, pr); err != nil {
return err return err
@ -137,7 +137,7 @@ func NewPullRequest(ctx context.Context, repo *repo_model.Repository, issue *iss
} }
if !pr.IsWorkInProgress(ctx) { if !pr.IsWorkInProgress(ctx) {
reviewNotifers, err = issue_service.PullRequestCodeOwnersReview(ctx, issue, pr) reviewNotifiers, err = issue_service.PullRequestCodeOwnersReview(ctx, issue, pr)
if err != nil { if err != nil {
return err return err
} }
@ -152,7 +152,7 @@ func NewPullRequest(ctx context.Context, repo *repo_model.Repository, issue *iss
} }
baseGitRepo.Close() // close immediately to avoid notifications will open the repository again baseGitRepo.Close() // close immediately to avoid notifications will open the repository again
issue_service.ReviewRequestNotify(ctx, issue, issue.Poster, reviewNotifers) issue_service.ReviewRequestNotify(ctx, issue, issue.Poster, reviewNotifiers)
mentions, err := issues_model.FindAndUpdateIssueMentions(ctx, issue, issue.Poster, issue.Content) mentions, err := issues_model.FindAndUpdateIssueMentions(ctx, issue, issue.Poster, issue.Content)
if err != nil { if err != nil {

View File

@ -2,10 +2,10 @@
<div class="ui positive message tw-flex tw-items-center"> <div class="ui positive message tw-flex tw-items-center">
<div class="tw-flex-1"> <div class="tw-flex-1">
{{$timeSince := TimeSince .CommitTime.AsTime ctx.Locale}} {{$timeSince := TimeSince .CommitTime.AsTime ctx.Locale}}
{{$branchLink := HTMLFormat `<a href="%s/src/branch/%s">%s</a>` $.RepoLink (PathEscapeSegments .Name) .Name}} {{$branchLink := HTMLFormat `<a href="%s">%s</a>` .BranchLink .BranchDisplayName}}
{{ctx.Locale.Tr "repo.pulls.recently_pushed_new_branches" $branchLink $timeSince}} {{ctx.Locale.Tr "repo.pulls.recently_pushed_new_branches" $branchLink $timeSince}}
</div> </div>
<a role="button" class="ui compact green button tw-m-0" href="{{$.Repository.ComposeBranchCompareURL $.Repository.BaseRepo .Name}}"> <a role="button" class="ui compact green button tw-m-0" href="{{.BranchCompareURL}}">
{{ctx.Locale.Tr "repo.pulls.compare_changes"}} {{ctx.Locale.Tr "repo.pulls.compare_changes"}}
</a> </a>
</div> </div>

View File

@ -1,6 +1,6 @@
{{if $.IsSplitStyle}} {{if $.IsSplitStyle}}
{{range $k, $line := $.section.Lines}} {{range $k, $line := $.section.Lines}}
<tr class="{{.GetHTMLDiffLineType}}-code nl-{{$k}} ol-{{$k}}"> <tr class="{{.GetHTMLDiffLineType}}-code nl-{{$k}} ol-{{$k}} line-expanded">
{{if eq .GetType 4}} {{if eq .GetType 4}}
<td class="lines-num lines-num-old" data-line-num="{{if $line.LeftIdx}}{{$line.LeftIdx}}{{end}}"> <td class="lines-num lines-num-old" data-line-num="{{if $line.LeftIdx}}{{$line.LeftIdx}}{{end}}">
<div class="tw-flex"> <div class="tw-flex">
@ -26,17 +26,17 @@
{{else}} {{else}}
{{$inlineDiff := $.section.GetComputedInlineDiffFor $line ctx.Locale}} {{$inlineDiff := $.section.GetComputedInlineDiffFor $line ctx.Locale}}
<td class="lines-num lines-num-old" data-line-num="{{if $line.LeftIdx}}{{$line.LeftIdx}}{{end}}"><span rel="{{if $line.LeftIdx}}diff-{{$.FileNameHash}}L{{$line.LeftIdx}}{{end}}"></span></td> <td class="lines-num lines-num-old" data-line-num="{{if $line.LeftIdx}}{{$line.LeftIdx}}{{end}}"><span rel="{{if $line.LeftIdx}}diff-{{$.FileNameHash}}L{{$line.LeftIdx}}{{end}}"></span></td>
<td class="blob-excerpt lines-escape lines-escape-old">{{if and $line.LeftIdx $inlineDiff.EscapeStatus.Escaped}}<button class="toggle-escape-button btn interact-bg" title="{{template "repo/diff/escape_title" dict "diff" $inlineDiff}}"></button>{{end}}</td> <td class="lines-escape lines-escape-old">{{if and $line.LeftIdx $inlineDiff.EscapeStatus.Escaped}}<button class="toggle-escape-button btn interact-bg" title="{{template "repo/diff/escape_title" dict "diff" $inlineDiff}}"></button>{{end}}</td>
<td class="blob-excerpt lines-type-marker lines-type-marker-old">{{if $line.LeftIdx}}<span class="tw-font-mono" data-type-marker=""></span>{{end}}</td> <td class="lines-type-marker lines-type-marker-old">{{if $line.LeftIdx}}<span class="tw-font-mono" data-type-marker=""></span>{{end}}</td>
<td class="blob-excerpt lines-code lines-code-old">{{/* <td class="lines-code lines-code-old">{{/*
*/}}{{if $line.LeftIdx}}{{template "repo/diff/section_code" dict "diff" $inlineDiff}}{{else}}{{/* */}}{{if $line.LeftIdx}}{{template "repo/diff/section_code" dict "diff" $inlineDiff}}{{else}}{{/*
*/}}<code class="code-inner"></code>{{/* */}}<code class="code-inner"></code>{{/*
*/}}{{end}}{{/* */}}{{end}}{{/*
*/}}</td> */}}</td>
<td class="lines-num lines-num-new" data-line-num="{{if $line.RightIdx}}{{$line.RightIdx}}{{end}}"><span rel="{{if $line.RightIdx}}diff-{{$.FileNameHash}}R{{$line.RightIdx}}{{end}}"></span></td> <td class="lines-num lines-num-new" data-line-num="{{if $line.RightIdx}}{{$line.RightIdx}}{{end}}"><span rel="{{if $line.RightIdx}}diff-{{$.FileNameHash}}R{{$line.RightIdx}}{{end}}"></span></td>
<td class="blob-excerpt lines-escape lines-escape-new">{{if and $line.RightIdx $inlineDiff.EscapeStatus.Escaped}}<button class="toggle-escape-button btn interact-bg" title="{{template "repo/diff/escape_title" dict "diff" $inlineDiff}}"></button>{{end}}</td> <td class="lines-escape lines-escape-new">{{if and $line.RightIdx $inlineDiff.EscapeStatus.Escaped}}<button class="toggle-escape-button btn interact-bg" title="{{template "repo/diff/escape_title" dict "diff" $inlineDiff}}"></button>{{end}}</td>
<td class="blob-excerpt lines-type-marker lines-type-marker-new">{{if $line.RightIdx}}<span class="tw-font-mono" data-type-marker=""></span>{{end}}</td> <td class="lines-type-marker lines-type-marker-new">{{if $line.RightIdx}}<span class="tw-font-mono" data-type-marker=""></span>{{end}}</td>
<td class="blob-excerpt lines-code lines-code-new">{{/* <td class="lines-code lines-code-new">{{/*
*/}}{{if $line.RightIdx}}{{template "repo/diff/section_code" dict "diff" $inlineDiff}}{{else}}{{/* */}}{{if $line.RightIdx}}{{template "repo/diff/section_code" dict "diff" $inlineDiff}}{{else}}{{/*
*/}}<code class="code-inner"></code>{{/* */}}<code class="code-inner"></code>{{/*
*/}}{{end}}{{/* */}}{{end}}{{/*
@ -46,7 +46,7 @@
{{end}} {{end}}
{{else}} {{else}}
{{range $k, $line := $.section.Lines}} {{range $k, $line := $.section.Lines}}
<tr class="{{.GetHTMLDiffLineType}}-code nl-{{$k}} ol-{{$k}}"> <tr class="{{.GetHTMLDiffLineType}}-code nl-{{$k}} ol-{{$k}} line-expanded">
{{if eq .GetType 4}} {{if eq .GetType 4}}
<td colspan="2" class="lines-num"> <td colspan="2" class="lines-num">
<div class="tw-flex"> <div class="tw-flex">
@ -72,9 +72,9 @@
<td class="lines-num lines-num-new" data-line-num="{{if $line.RightIdx}}{{$line.RightIdx}}{{end}}"><span rel="{{if $line.RightIdx}}diff-{{$.FileNameHash}}R{{$line.RightIdx}}{{end}}"></span></td> <td class="lines-num lines-num-new" data-line-num="{{if $line.RightIdx}}{{$line.RightIdx}}{{end}}"><span rel="{{if $line.RightIdx}}diff-{{$.FileNameHash}}R{{$line.RightIdx}}{{end}}"></span></td>
{{end}} {{end}}
{{$inlineDiff := $.section.GetComputedInlineDiffFor $line ctx.Locale}} {{$inlineDiff := $.section.GetComputedInlineDiffFor $line ctx.Locale}}
<td class="blob-excerpt lines-escape">{{if $inlineDiff.EscapeStatus.Escaped}}<button class="toggle-escape-button btn interact-bg" title="{{template "repo/diff/escape_title" dict "diff" $inlineDiff}}"></button>{{end}}</td> <td class="lines-escape">{{if $inlineDiff.EscapeStatus.Escaped}}<button class="toggle-escape-button btn interact-bg" title="{{template "repo/diff/escape_title" dict "diff" $inlineDiff}}"></button>{{end}}</td>
<td class="blob-excerpt lines-type-marker"><span class="tw-font-mono" data-type-marker="{{$line.GetLineTypeMarker}}"></span></td> <td class="lines-type-marker"><span class="tw-font-mono" data-type-marker="{{$line.GetLineTypeMarker}}"></span></td>
<td class="blob-excerpt lines-code{{if (not $line.RightIdx)}} lines-code-old{{end}}"><code {{if $inlineDiff.EscapeStatus.Escaped}}class="code-inner has-escaped" title="{{template "repo/diff/escape_title" dict "diff" $inlineDiff}}"{{else}}class="code-inner"{{end}}>{{$inlineDiff.Content}}</code></td> <td class="lines-code{{if (not $line.RightIdx)}} lines-code-old{{end}}"><code {{if $inlineDiff.EscapeStatus.Escaped}}class="code-inner has-escaped" title="{{template "repo/diff/escape_title" dict "diff" $inlineDiff}}"{{else}}class="code-inner"{{end}}>{{$inlineDiff.Content}}</code></td>
</tr> </tr>
{{end}} {{end}}
{{end}} {{end}}

View File

@ -25282,7 +25282,7 @@
} }
}, },
"RegistrationToken": { "RegistrationToken": {
"description": "RegistrationToken is response related to registeration token", "description": "RegistrationToken is response related to registration token",
"headers": { "headers": {
"token": { "token": {
"type": "string" "type": "string"

View File

@ -119,9 +119,9 @@ func TestAPIRepoIssueConfigPaths(t *testing.T) {
".github/issue_template/config", ".github/issue_template/config",
} }
for _, canidate := range templateConfigCandidates { for _, candidate := range templateConfigCandidates {
for _, extension := range []string{".yaml", ".yml"} { for _, extension := range []string{".yaml", ".yml"} {
fullPath := canidate + extension fullPath := candidate + extension
t.Run(fullPath, func(t *testing.T) { t.Run(fullPath, func(t *testing.T) {
configMap := make(map[string]any) configMap := make(map[string]any)
configMap["blank_issues_enabled"] = false configMap["blank_issues_enabled"] = false

View File

@ -223,7 +223,7 @@ func TestAPISearchIssues(t *testing.T) {
defer tests.PrepareTestEnv(t)() defer tests.PrepareTestEnv(t)()
// as this API was used in the frontend, it uses UI page size // as this API was used in the frontend, it uses UI page size
expectedIssueCount := 20 // from the fixtures expectedIssueCount := 24 // from the fixtures
if expectedIssueCount > setting.UI.IssuePagingNum { if expectedIssueCount > setting.UI.IssuePagingNum {
expectedIssueCount = setting.UI.IssuePagingNum expectedIssueCount = setting.UI.IssuePagingNum
} }
@ -247,7 +247,7 @@ func TestAPISearchIssues(t *testing.T) {
req = NewRequest(t, "GET", link.String()).AddTokenAuth(token) req = NewRequest(t, "GET", link.String()).AddTokenAuth(token)
resp = MakeRequest(t, req, http.StatusOK) resp = MakeRequest(t, req, http.StatusOK)
DecodeJSON(t, resp, &apiIssues) DecodeJSON(t, resp, &apiIssues)
assert.Len(t, apiIssues, 11) assert.Len(t, apiIssues, 15)
query.Del("since") query.Del("since")
query.Del("before") query.Del("before")
@ -256,14 +256,14 @@ func TestAPISearchIssues(t *testing.T) {
req = NewRequest(t, "GET", link.String()).AddTokenAuth(token) req = NewRequest(t, "GET", link.String()).AddTokenAuth(token)
resp = MakeRequest(t, req, http.StatusOK) resp = MakeRequest(t, req, http.StatusOK)
DecodeJSON(t, resp, &apiIssues) DecodeJSON(t, resp, &apiIssues)
assert.Len(t, apiIssues, 2) assert.Len(t, apiIssues, 4)
query.Set("state", "all") query.Set("state", "all")
link.RawQuery = query.Encode() link.RawQuery = query.Encode()
req = NewRequest(t, "GET", link.String()).AddTokenAuth(token) req = NewRequest(t, "GET", link.String()).AddTokenAuth(token)
resp = MakeRequest(t, req, http.StatusOK) resp = MakeRequest(t, req, http.StatusOK)
DecodeJSON(t, resp, &apiIssues) DecodeJSON(t, resp, &apiIssues)
assert.EqualValues(t, "22", resp.Header().Get("X-Total-Count")) assert.EqualValues(t, "28", resp.Header().Get("X-Total-Count"))
assert.Len(t, apiIssues, 20) assert.Len(t, apiIssues, 20)
query.Add("limit", "10") query.Add("limit", "10")
@ -271,7 +271,7 @@ func TestAPISearchIssues(t *testing.T) {
req = NewRequest(t, "GET", link.String()).AddTokenAuth(token) req = NewRequest(t, "GET", link.String()).AddTokenAuth(token)
resp = MakeRequest(t, req, http.StatusOK) resp = MakeRequest(t, req, http.StatusOK)
DecodeJSON(t, resp, &apiIssues) DecodeJSON(t, resp, &apiIssues)
assert.EqualValues(t, "22", resp.Header().Get("X-Total-Count")) assert.EqualValues(t, "28", resp.Header().Get("X-Total-Count"))
assert.Len(t, apiIssues, 10) assert.Len(t, apiIssues, 10)
query = url.Values{"assigned": {"true"}, "state": {"all"}} query = url.Values{"assigned": {"true"}, "state": {"all"}}
@ -321,7 +321,7 @@ func TestAPISearchIssuesWithLabels(t *testing.T) {
defer tests.PrepareTestEnv(t)() defer tests.PrepareTestEnv(t)()
// as this API was used in the frontend, it uses UI page size // as this API was used in the frontend, it uses UI page size
expectedIssueCount := 20 // from the fixtures expectedIssueCount := 24 // from the fixtures
if expectedIssueCount > setting.UI.IssuePagingNum { if expectedIssueCount > setting.UI.IssuePagingNum {
expectedIssueCount = setting.UI.IssuePagingNum expectedIssueCount = setting.UI.IssuePagingNum
} }

View File

@ -33,7 +33,7 @@ func TestNodeinfo(t *testing.T) {
assert.True(t, nodeinfo.OpenRegistrations) assert.True(t, nodeinfo.OpenRegistrations)
assert.Equal(t, "gitea", nodeinfo.Software.Name) assert.Equal(t, "gitea", nodeinfo.Software.Name)
assert.Equal(t, 29, nodeinfo.Usage.Users.Total) assert.Equal(t, 29, nodeinfo.Usage.Users.Total)
assert.Equal(t, 22, nodeinfo.Usage.LocalPosts) assert.Equal(t, 28, nodeinfo.Usage.LocalPosts)
assert.Equal(t, 3, nodeinfo.Usage.LocalComments) assert.Equal(t, 3, nodeinfo.Usage.LocalComments)
}) })
} }

View File

@ -93,9 +93,9 @@ func TestAPISearchRepo(t *testing.T) {
}{ }{
{ {
name: "RepositoriesMax50", requestURL: "/api/v1/repos/search?limit=50&private=false", expectedResults: expectedResults{ name: "RepositoriesMax50", requestURL: "/api/v1/repos/search?limit=50&private=false", expectedResults: expectedResults{
nil: {count: 35}, nil: {count: 36},
user: {count: 35}, user: {count: 36},
user2: {count: 35}, user2: {count: 36},
}, },
}, },
{ {
@ -275,8 +275,8 @@ func TestAPIViewRepo(t *testing.T) {
DecodeJSON(t, resp, &repo) DecodeJSON(t, resp, &repo)
assert.EqualValues(t, 10, repo.ID) assert.EqualValues(t, 10, repo.ID)
assert.EqualValues(t, "repo10", repo.Name) assert.EqualValues(t, "repo10", repo.Name)
assert.EqualValues(t, 1, repo.OpenPulls) assert.EqualValues(t, 4, repo.OpenPulls)
assert.EqualValues(t, 1, repo.Forks) assert.EqualValues(t, 3, repo.Forks)
req = NewRequest(t, "GET", "/api/v1/repos/user5/repo4") req = NewRequest(t, "GET", "/api/v1/repos/user5/repo4")
resp = MakeRequest(t, req, http.StatusOK) resp = MakeRequest(t, req, http.StatusOK)

View File

@ -29,6 +29,7 @@ func TestUserOrgs(t *testing.T) {
org3 := unittest.AssertExistsAndLoadBean(t, &user_model.User{Name: "org3"}) org3 := unittest.AssertExistsAndLoadBean(t, &user_model.User{Name: "org3"})
org17 := unittest.AssertExistsAndLoadBean(t, &user_model.User{Name: "org17"}) org17 := unittest.AssertExistsAndLoadBean(t, &user_model.User{Name: "org17"})
org35 := unittest.AssertExistsAndLoadBean(t, &user_model.User{Name: "private_org35"})
assert.Equal(t, []*api.Organization{ assert.Equal(t, []*api.Organization{
{ {
@ -55,6 +56,18 @@ func TestUserOrgs(t *testing.T) {
Location: "", Location: "",
Visibility: "public", Visibility: "public",
}, },
{
ID: 35,
Name: org35.Name,
UserName: org35.Name,
FullName: org35.FullName,
Email: org35.Email,
AvatarURL: org35.AvatarLink(db.DefaultContext),
Description: "",
Website: "",
Location: "",
Visibility: "private",
},
}, orgs) }, orgs)
// user itself should get it's org's he is a member of // user itself should get it's org's he is a member of
@ -102,6 +115,7 @@ func TestMyOrgs(t *testing.T) {
DecodeJSON(t, resp, &orgs) DecodeJSON(t, resp, &orgs)
org3 := unittest.AssertExistsAndLoadBean(t, &user_model.User{Name: "org3"}) org3 := unittest.AssertExistsAndLoadBean(t, &user_model.User{Name: "org3"})
org17 := unittest.AssertExistsAndLoadBean(t, &user_model.User{Name: "org17"}) org17 := unittest.AssertExistsAndLoadBean(t, &user_model.User{Name: "org17"})
org35 := unittest.AssertExistsAndLoadBean(t, &user_model.User{Name: "private_org35"})
assert.Equal(t, []*api.Organization{ assert.Equal(t, []*api.Organization{
{ {
@ -128,5 +142,17 @@ func TestMyOrgs(t *testing.T) {
Location: "", Location: "",
Visibility: "public", Visibility: "public",
}, },
{
ID: 35,
Name: org35.Name,
UserName: org35.Name,
FullName: org35.FullName,
Email: org35.Email,
AvatarURL: org35.AvatarLink(db.DefaultContext),
Description: "",
Website: "",
Location: "",
Visibility: "private",
},
}, orgs) }, orgs)
} }

View File

@ -67,7 +67,7 @@ func TestCompareBranches(t *testing.T) {
session := loginUser(t, "user2") session := loginUser(t, "user2")
// Inderect compare remove-files-b (head) with add-csv (base) branch // Indirect compare remove-files-b (head) with add-csv (base) branch
// //
// 'link_hi' and 'test.csv' are deleted, 'test.txt' is added // 'link_hi' and 'test.csv' are deleted, 'test.txt' is added
req := NewRequest(t, "GET", "/user2/repo20/compare/add-csv...remove-files-b") req := NewRequest(t, "GET", "/user2/repo20/compare/add-csv...remove-files-b")
@ -79,7 +79,7 @@ func TestCompareBranches(t *testing.T) {
inspectCompare(t, htmlDoc, diffCount, diffChanges) inspectCompare(t, htmlDoc, diffCount, diffChanges)
// Inderect compare remove-files-b (head) with remove-files-a (base) branch // Indirect compare remove-files-b (head) with remove-files-a (base) branch
// //
// 'link_hi' and 'test.csv' are deleted, 'test.txt' is added // 'link_hi' and 'test.csv' are deleted, 'test.txt' is added
@ -92,7 +92,7 @@ func TestCompareBranches(t *testing.T) {
inspectCompare(t, htmlDoc, diffCount, diffChanges) inspectCompare(t, htmlDoc, diffCount, diffChanges)
// Inderect compare remove-files-a (head) with remove-files-b (base) branch // Indirect compare remove-files-a (head) with remove-files-b (base) branch
// //
// 'link_hi' and 'test.csv' are deleted // 'link_hi' and 'test.csv' are deleted

View File

@ -407,7 +407,7 @@ func TestSearchIssues(t *testing.T) {
session := loginUser(t, "user2") session := loginUser(t, "user2")
expectedIssueCount := 20 // from the fixtures expectedIssueCount := 24 // from the fixtures
if expectedIssueCount > setting.UI.IssuePagingNum { if expectedIssueCount > setting.UI.IssuePagingNum {
expectedIssueCount = setting.UI.IssuePagingNum expectedIssueCount = setting.UI.IssuePagingNum
} }
@ -428,7 +428,7 @@ func TestSearchIssues(t *testing.T) {
req = NewRequest(t, "GET", link.String()) req = NewRequest(t, "GET", link.String())
resp = session.MakeRequest(t, req, http.StatusOK) resp = session.MakeRequest(t, req, http.StatusOK)
DecodeJSON(t, resp, &apiIssues) DecodeJSON(t, resp, &apiIssues)
assert.Len(t, apiIssues, 11) assert.Len(t, apiIssues, 15)
query.Del("since") query.Del("since")
query.Del("before") query.Del("before")
@ -437,14 +437,14 @@ func TestSearchIssues(t *testing.T) {
req = NewRequest(t, "GET", link.String()) req = NewRequest(t, "GET", link.String())
resp = session.MakeRequest(t, req, http.StatusOK) resp = session.MakeRequest(t, req, http.StatusOK)
DecodeJSON(t, resp, &apiIssues) DecodeJSON(t, resp, &apiIssues)
assert.Len(t, apiIssues, 2) assert.Len(t, apiIssues, 4)
query.Set("state", "all") query.Set("state", "all")
link.RawQuery = query.Encode() link.RawQuery = query.Encode()
req = NewRequest(t, "GET", link.String()) req = NewRequest(t, "GET", link.String())
resp = session.MakeRequest(t, req, http.StatusOK) resp = session.MakeRequest(t, req, http.StatusOK)
DecodeJSON(t, resp, &apiIssues) DecodeJSON(t, resp, &apiIssues)
assert.EqualValues(t, "22", resp.Header().Get("X-Total-Count")) assert.EqualValues(t, "28", resp.Header().Get("X-Total-Count"))
assert.Len(t, apiIssues, 20) assert.Len(t, apiIssues, 20)
query.Add("limit", "5") query.Add("limit", "5")
@ -452,7 +452,7 @@ func TestSearchIssues(t *testing.T) {
req = NewRequest(t, "GET", link.String()) req = NewRequest(t, "GET", link.String())
resp = session.MakeRequest(t, req, http.StatusOK) resp = session.MakeRequest(t, req, http.StatusOK)
DecodeJSON(t, resp, &apiIssues) DecodeJSON(t, resp, &apiIssues)
assert.EqualValues(t, "22", resp.Header().Get("X-Total-Count")) assert.EqualValues(t, "28", resp.Header().Get("X-Total-Count"))
assert.Len(t, apiIssues, 5) assert.Len(t, apiIssues, 5)
query = url.Values{"assigned": {"true"}, "state": {"all"}} query = url.Values{"assigned": {"true"}, "state": {"all"}}
@ -501,7 +501,7 @@ func TestSearchIssues(t *testing.T) {
func TestSearchIssuesWithLabels(t *testing.T) { func TestSearchIssuesWithLabels(t *testing.T) {
defer tests.PrepareTestEnv(t)() defer tests.PrepareTestEnv(t)()
expectedIssueCount := 20 // from the fixtures expectedIssueCount := 24 // from the fixtures
if expectedIssueCount > setting.UI.IssuePagingNum { if expectedIssueCount > setting.UI.IssuePagingNum {
expectedIssueCount = setting.UI.IssuePagingNum expectedIssueCount = setting.UI.IssuePagingNum
} }

21
tools/misspellings.csv Normal file
View File

@ -0,0 +1,21 @@
acounts,accounts
canidate,candidate
comfirm,confirm
converage,coverage
currrently,currently
delimeter,delimiter
differrent,different
exclusing,excluding
finshed,finished
formated,formatted
inderect,indirect
insuficient,insufficient
likly,likely
mergable,mergeable
overrided,overridden
priortized,prioritized
registeration,registration
reuqest,request
reviwer,reviewer
superceded,superseded
underlaying,underlying
1 acounts accounts
2 canidate candidate
3 comfirm confirm
4 converage coverage
5 currrently currently
6 delimeter delimiter
7 differrent different
8 exclusing excluding
9 finshed finished
10 formated formatted
11 inderect indirect
12 insuficient insufficient
13 likly likely
14 mergable mergeable
15 overrided overridden
16 priortized prioritized
17 registeration registration
18 reuqest request
19 reviwer reviewer
20 superceded superseded
21 underlaying underlying

View File

@ -2377,7 +2377,7 @@ tbody.commit-list {
.tag-code, .tag-code,
.tag-code td, .tag-code td,
.tag-code .blob-excerpt { .tag-code.line-expanded {
background-color: var(--color-box-body-highlight); background-color: var(--color-box-body-highlight);
vertical-align: middle; vertical-align: middle;
} }
@ -2393,8 +2393,8 @@ tbody.commit-list {
padding-top: 0 !important; padding-top: 0 !important;
} }
.blob-excerpt { .line-expanded {
background-color: var(--color-secondary-alpha-30); background-color: var(--color-secondary-alpha-20);
} }
.issue-keyword { .issue-keyword {
@ -2553,11 +2553,9 @@ tbody.commit-list {
.code-diff-unified .add-code, .code-diff-unified .add-code,
.code-diff-unified .add-code td, .code-diff-unified .add-code td,
.code-diff-split .add-code .lines-num-new,
.code-diff-split .add-code .lines-type-marker-new, .code-diff-split .add-code .lines-type-marker-new,
.code-diff-split .add-code .lines-escape-new, .code-diff-split .add-code .lines-escape-new,
.code-diff-split .add-code .lines-code-new, .code-diff-split .add-code .lines-code-new,
.code-diff-split .del-code .add-code.lines-num-new,
.code-diff-split .del-code .add-code.lines-type-marker-new, .code-diff-split .del-code .add-code.lines-type-marker-new,
.code-diff-split .del-code .add-code.lines-escape-new, .code-diff-split .del-code .add-code.lines-escape-new,
.code-diff-split .del-code .add-code.lines-code-new { .code-diff-split .del-code .add-code.lines-code-new {
@ -2565,17 +2563,33 @@ tbody.commit-list {
border-color: var(--color-diff-added-row-border); border-color: var(--color-diff-added-row-border);
} }
.code-diff-split .del-code .lines-num-new,
.code-diff-split .del-code .lines-type-marker-new, .code-diff-split .del-code .lines-type-marker-new,
.code-diff-split .del-code .lines-code-new, .code-diff-split .del-code .lines-code-new,
.code-diff-split .del-code .lines-escape-new, .code-diff-split .del-code .lines-escape-new,
.code-diff-split .add-code .lines-num-old,
.code-diff-split .add-code .lines-escape-old, .code-diff-split .add-code .lines-escape-old,
.code-diff-split .add-code .lines-type-marker-old, .code-diff-split .add-code .lines-type-marker-old,
.code-diff-split .add-code .lines-code-old { .code-diff-split .add-code .lines-code-old {
background: var(--color-diff-inactive); background: var(--color-diff-inactive);
} }
.code-diff-split .add-code .lines-num.lines-num-old,
.code-diff-split .del-code .lines-num.lines-num-new {
background: var(--color-diff-inactive);
}
.code-diff-unified .del-code .lines-num,
.code-diff-split .del-code .lines-num {
background: var(--color-diff-removed-linenum-bg);
color: var(--color-text);
}
.code-diff-unified .add-code .lines-num,
.code-diff-split .add-code .lines-num,
.code-diff-split .del-code .add-code.lines-num {
background: var(--color-diff-added-linenum-bg);
color: var(--color-text);
}
.code-diff-split tbody tr td:nth-child(5), .code-diff-split tbody tr td:nth-child(5),
.code-diff-split tbody tr td.add-comment-right { .code-diff-split tbody tr td.add-comment-right {
border-left: 1px solid var(--color-secondary); border-left: 1px solid var(--color-secondary);

View File

@ -3,9 +3,10 @@
/* red/green colorblind-friendly colors */ /* red/green colorblind-friendly colors */
/* from GitHub: --diffBlob-addition-*, --diffBlob-deletion-*, etc */ /* from GitHub: --diffBlob-addition-*, --diffBlob-deletion-*, etc */
:root { :root {
--color-diff-added-word-bg: #388bfd66; --color-diff-added-linenum-bg: #1979fd46;
--color-diff-added-row-bg: #388bfd26; --color-diff-added-row-bg: #1979fd20;
--color-diff-added-word-bg: #1979fd66;
--color-diff-removed-word-bg: #db6d2866; --color-diff-removed-linenum-bg: #c8622146;
--color-diff-removed-row-bg: #db6d2826; --color-diff-removed-row-bg: #c8622120;
--color-diff-removed-word-bg: #c8622166;
} }

View File

@ -143,14 +143,16 @@
--color-grey-light: #818f9e; --color-grey-light: #818f9e;
--color-gold: #b1983b; --color-gold: #b1983b;
--color-white: #ffffff; --color-white: #ffffff;
--color-diff-removed-word-bg: #6f3333; --color-diff-added-linenum-bg: #274227;
--color-diff-added-word-bg: #3c653c; --color-diff-added-row-bg: #203224;
--color-diff-removed-row-bg: #3c2626;
--color-diff-moved-row-bg: #818044;
--color-diff-added-row-bg: #283e2d;
--color-diff-removed-row-border: #634343;
--color-diff-moved-row-border: #bcca6f;
--color-diff-added-row-border: #314a37; --color-diff-added-row-border: #314a37;
--color-diff-added-word-bg: #3c653c;
--color-diff-moved-row-bg: #818044;
--color-diff-moved-row-border: #bcca6f;
--color-diff-removed-linenum-bg: #482121;
--color-diff-removed-row-bg: #301e1e;
--color-diff-removed-row-border: #634343;
--color-diff-removed-word-bg: #6f3333;
--color-diff-inactive: #22282d; --color-diff-inactive: #22282d;
--color-error-border: #a04141; --color-error-border: #a04141;
--color-error-bg: #522; --color-error-bg: #522;

View File

@ -3,9 +3,10 @@
/* red/green colorblind-friendly colors */ /* red/green colorblind-friendly colors */
/* from GitHub: --diffBlob-addition-*, --diffBlob-deletion-*, etc */ /* from GitHub: --diffBlob-addition-*, --diffBlob-deletion-*, etc */
:root { :root {
--color-diff-added-word-bg: #54aeff66; --color-diff-added-linenum-bg: #54aeff4d;
--color-diff-added-row-bg: #ddf4ff80; --color-diff-added-row-bg: #ddf4ff80;
--color-diff-added-word-bg: #54aeff66;
--color-diff-removed-word-bg: #ffb77c80; --color-diff-removed-linenum-bg: #ffb77c4d;
--color-diff-removed-row-bg: #fff1e580; --color-diff-removed-row-bg: #fff1e580;
--color-diff-removed-word-bg: #ffb77c80;
} }

View File

@ -143,14 +143,16 @@
--color-grey-light: #7c838a; --color-grey-light: #7c838a;
--color-gold: #a1882b; --color-gold: #a1882b;
--color-white: #ffffff; --color-white: #ffffff;
--color-diff-removed-word-bg: #fdb8c0; --color-diff-added-linenum-bg: #d1f8d9;
--color-diff-added-word-bg: #acf2bd;
--color-diff-removed-row-bg: #ffeef0;
--color-diff-moved-row-bg: #f1f8d1;
--color-diff-added-row-bg: #e6ffed; --color-diff-added-row-bg: #e6ffed;
--color-diff-removed-row-border: #f1c0c0;
--color-diff-moved-row-border: #d0e27f;
--color-diff-added-row-border: #e6ffed; --color-diff-added-row-border: #e6ffed;
--color-diff-added-word-bg: #acf2bd;
--color-diff-moved-row-bg: #f1f8d1;
--color-diff-moved-row-border: #d0e27f;
--color-diff-removed-linenum-bg: #ffcecb;
--color-diff-removed-row-bg: #ffeef0;
--color-diff-removed-row-border: #f1c0c0;
--color-diff-removed-word-bg: #fdb8c0;
--color-diff-inactive: #f0f2f4; --color-diff-inactive: #f0f2f4;
--color-error-border: #e0b4b4; --color-error-border: #e0b4b4;
--color-error-bg: #fff6f6; --color-error-bg: #fff6f6;

View File

@ -50,7 +50,7 @@ function processWindowErrorEvent({error, reason, message, type, filename, lineno
const assetBaseUrl = String(new URL(__webpack_public_path__, window.location.origin)); const assetBaseUrl = String(new URL(__webpack_public_path__, window.location.origin));
const {runModeIsProd} = window.config ?? {}; const {runModeIsProd} = window.config ?? {};
// `error` and `reason` are not guaranteed to be errors. If the value is falsy, it is likly a // `error` and `reason` are not guaranteed to be errors. If the value is falsy, it is likely a
// non-critical event from the browser. We log them but don't show them to users. Examples: // non-critical event from the browser. We log them but don't show them to users. Examples:
// - https://developer.mozilla.org/en-US/docs/Web/API/ResizeObserver#observation_errors // - https://developer.mozilla.org/en-US/docs/Web/API/ResizeObserver#observation_errors
// - https://github.com/mozilla-mobile/firefox-ios/issues/10817 // - https://github.com/mozilla-mobile/firefox-ios/issues/10817