diff --git a/.drone.yml b/.drone.yml index 8a73e84a00..f2b34ef7e3 100644 --- a/.drone.yml +++ b/.drone.yml @@ -561,7 +561,7 @@ steps: # TODO: We should probably build all dependencies into a test image - name: test-e2e - image: mcr.microsoft.com/playwright:v1.27.0-focal + image: mcr.microsoft.com/playwright:v1.27.1-focal commands: - curl -sLO https://go.dev/dl/go1.19.linux-amd64.tar.gz && tar -C /usr/local -xzf go1.19.linux-amd64.tar.gz - groupadd --gid 1001 gitea && useradd -m --gid 1001 --uid 1001 gitea diff --git a/.eslintrc.yaml b/.eslintrc.yaml index 4dafc8f492..cd86b680ee 100644 --- a/.eslintrc.yaml +++ b/.eslintrc.yaml @@ -254,7 +254,7 @@ rules: no-irregular-whitespace: [2] no-iterator: [2] no-label-var: [2] - no-labels: [2] + no-labels: [0] no-lone-blocks: [2] no-lonely-if: [0] no-loop-func: [0] @@ -333,7 +333,7 @@ rules: no-void: [2] no-warning-comments: [0] no-whitespace-before-property: [2] - no-with: [2] + no-with: [0] nonblock-statement-body-position: [2] object-curly-newline: [0] object-curly-spacing: [2, never] @@ -378,11 +378,11 @@ rules: sonarjs/no-duplicated-branches: [0] sonarjs/no-element-overwrite: [2] sonarjs/no-empty-collection: [2] - sonarjs/no-extra-arguments: [0] + sonarjs/no-extra-arguments: [2] sonarjs/no-gratuitous-expressions: [2] sonarjs/no-identical-conditions: [2] - sonarjs/no-identical-expressions: [0] - sonarjs/no-identical-functions: [0] + sonarjs/no-identical-expressions: [2] + sonarjs/no-identical-functions: [2, 5] sonarjs/no-ignored-return: [2] sonarjs/no-inverted-boolean-check: [2] sonarjs/no-nested-switch: [0] @@ -394,7 +394,7 @@ rules: sonarjs/no-small-switch: [0] sonarjs/no-unused-collection: [2] sonarjs/no-use-of-empty-return-value: [2] - sonarjs/no-useless-catch: [0] + sonarjs/no-useless-catch: [2] sonarjs/non-existent-operator: [2] sonarjs/prefer-immediate-return: [0] sonarjs/prefer-object-literal: [0] diff --git a/.gitpod.yml b/.gitpod.yml index 6dc6bb513d..0b6ad1f30e 100644 --- a/.gitpod.yml +++ b/.gitpod.yml @@ -33,6 +33,7 @@ vscode: - johnsoncodehk.volar - ms-azuretools.vscode-docker - zixuanchen.vitest-explorer + - alexcvzz.vscode-sqlite ports: - name: Gitea diff --git a/.stylelintrc.yaml b/.stylelintrc.yaml index 9bad55d371..342bf6a4e8 100644 --- a/.stylelintrc.yaml +++ b/.stylelintrc.yaml @@ -16,6 +16,7 @@ rules: declaration-empty-line-before: null function-no-unknown: null hue-degree-notation: null + import-notation: string indentation: 2 max-line-length: null no-descending-specificity: null diff --git a/cmd/admin.go b/cmd/admin.go index 2cf63d384a..525bc2cfcd 100644 --- a/cmd/admin.go +++ b/cmd/admin.go @@ -588,7 +588,7 @@ func runCreateUser(c *cli.Context) error { } if err := user_model.CreateUser(u, overwriteDefault); err != nil { - return fmt.Errorf("CreateUser: %v", err) + return fmt.Errorf("CreateUser: %w", err) } if c.Bool("access-token") { @@ -735,7 +735,7 @@ func runRepoSyncReleases(_ *cli.Context) error { Private: true, }) if err != nil { - return fmt.Errorf("SearchRepositoryByName: %v", err) + return fmt.Errorf("SearchRepositoryByName: %w", err) } if len(repos) == 0 { break diff --git a/cmd/cmd.go b/cmd/cmd.go index 36d54bb19f..f20a936325 100644 --- a/cmd/cmd.go +++ b/cmd/cmd.go @@ -68,7 +68,7 @@ Ensure you are running in the correct environment or set the correct configurati If this is the intended configuration file complete the [database] section.`, setting.CustomConf) } if err := db.InitEngine(ctx); err != nil { - return fmt.Errorf("unable to initialize the database using the configuration in %q. Error: %v", setting.CustomConf, err) + return fmt.Errorf("unable to initialize the database using the configuration in %q. Error: %w", setting.CustomConf, err) } return nil } diff --git a/cmd/dump_repo.go b/cmd/dump_repo.go index 72456c61d3..5f41ab69a9 100644 --- a/cmd/dump_repo.go +++ b/cmd/dump_repo.go @@ -166,7 +166,7 @@ func runDumpRepository(ctx *cli.Context) error { // make sure the directory doesn't exist or is empty, prevent from deleting user files repoDir := ctx.String("repo_dir") if exists, err := util.IsExist(repoDir); err != nil { - return fmt.Errorf("unable to stat repo_dir %q: %v", repoDir, err) + return fmt.Errorf("unable to stat repo_dir %q: %w", repoDir, err) } else if exists { if isDir, _ := util.IsDir(repoDir); !isDir { return fmt.Errorf("repo_dir %q already exists but it's not a directory", repoDir) diff --git a/cmd/embedded.go b/cmd/embedded.go index ffdc3d6a63..b71ee6dfe7 100644 --- a/cmd/embedded.go +++ b/cmd/embedded.go @@ -186,11 +186,11 @@ func runViewDo(c *cli.Context) error { data, err := assets[0].Section.Asset(assets[0].Name) if err != nil { - return fmt.Errorf("%s: %v", assets[0].Path, err) + return fmt.Errorf("%s: %w", assets[0].Path, err) } if _, err = os.Stdout.Write(data); err != nil { - return fmt.Errorf("%s: %v", assets[0].Path, err) + return fmt.Errorf("%s: %w", assets[0].Path, err) } return nil @@ -251,11 +251,11 @@ func extractAsset(d string, a asset, overwrite, rename bool) error { data, err := a.Section.Asset(a.Name) if err != nil { - return fmt.Errorf("%s: %v", a.Path, err) + return fmt.Errorf("%s: %w", a.Path, err) } if err := os.MkdirAll(dir, os.ModePerm); err != nil { - return fmt.Errorf("%s: %v", dir, err) + return fmt.Errorf("%s: %w", dir, err) } perms := os.ModePerm & 0o666 @@ -263,7 +263,7 @@ func extractAsset(d string, a asset, overwrite, rename bool) error { fi, err := os.Lstat(dest) if err != nil { if !errors.Is(err, os.ErrNotExist) { - return fmt.Errorf("%s: %v", dest, err) + return fmt.Errorf("%s: %w", dest, err) } } else if !overwrite && !rename { fmt.Printf("%s already exists; skipped.\n", dest) @@ -272,7 +272,7 @@ func extractAsset(d string, a asset, overwrite, rename bool) error { return fmt.Errorf("%s already exists, but it's not a regular file", dest) } else if rename { if err := util.Rename(dest, dest+".bak"); err != nil { - return fmt.Errorf("Error creating backup for %s: %v", dest, err) + return fmt.Errorf("Error creating backup for %s: %w", dest, err) } // Attempt to respect file permissions mask (even if user:group will be set anew) perms = fi.Mode() @@ -280,12 +280,12 @@ func extractAsset(d string, a asset, overwrite, rename bool) error { file, err := os.OpenFile(dest, os.O_WRONLY|os.O_TRUNC|os.O_CREATE, perms) if err != nil { - return fmt.Errorf("%s: %v", dest, err) + return fmt.Errorf("%s: %w", dest, err) } defer file.Close() if _, err = file.Write(data); err != nil { - return fmt.Errorf("%s: %v", dest, err) + return fmt.Errorf("%s: %w", dest, err) } fmt.Println(dest) @@ -325,7 +325,7 @@ func getPatterns(args []string) ([]glob.Glob, error) { pat := make([]glob.Glob, len(args)) for i := range args { if g, err := glob.Compile(args[i], '/'); err != nil { - return nil, fmt.Errorf("'%s': Invalid glob pattern: %v", args[i], err) + return nil, fmt.Errorf("'%s': Invalid glob pattern: %w", args[i], err) } else { pat[i] = g } diff --git a/cmd/hook.go b/cmd/hook.go index ab6d48b545..3970d27cf2 100644 --- a/cmd/hook.go +++ b/cmd/hook.go @@ -312,7 +312,7 @@ func runHookPostReceive(c *cli.Context) error { // First of all run update-server-info no matter what if _, _, err := git.NewCommand(ctx, "update-server-info").RunStdString(nil); err != nil { - return fmt.Errorf("Failed to call 'git update-server-info': %v", err) + return fmt.Errorf("Failed to call 'git update-server-info': %w", err) } // Now if we're an internal don't do anything else diff --git a/custom/conf/app.example.ini b/custom/conf/app.example.ini index ec0b7c5235..b59ceee4f1 100644 --- a/custom/conf/app.example.ini +++ b/custom/conf/app.example.ini @@ -2196,7 +2196,8 @@ ROUTER = console ;SHOW_FOOTER_VERSION = true ;; Show template execution time in the footer ;SHOW_FOOTER_TEMPLATE_LOAD_TIME = true - +;; Generate sitemap. Defaults to `true`. +; ENABLE_SITEMAP = true ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/docs/content/doc/advanced/config-cheat-sheet.en-us.md b/docs/content/doc/advanced/config-cheat-sheet.en-us.md index 3fd853fb14..df1911934c 100644 --- a/docs/content/doc/advanced/config-cheat-sheet.en-us.md +++ b/docs/content/doc/advanced/config-cheat-sheet.en-us.md @@ -810,9 +810,9 @@ Default templates for project boards: - `STACKTRACE_LEVEL`: **log.STACKTRACE_LEVEL**: Sets the log level at which to log stack traces. - `MODE`: **name**: Sets the mode of this sublogger - Defaults to the provided subsection name. This allows you to have two different file loggers at different levels. - `EXPRESSION`: **""**: A regular expression to match either the function name, file or message. Defaults to empty. Only log messages that match the expression will be saved in the logger. -- `FLAGS`: **stdflags**: A comma separated string representing the log flags. Defaults to `stdflags` which represents the prefix: `2009/01/23 01:23:23 ...a/b/c/d.go:23:runtime.Caller() [I]: message`. `none` means don't prefix log lines. See `modules/log/base.go` for more information. +- `FLAGS`: **stdflags**: A comma separated string representing the log flags. Defaults to `stdflags` which represents the prefix: `2009/01/23 01:23:23 ...a/b/c/d.go:23:runtime.Caller() [I]: message`. `none` means don't prefix log lines. See `modules/log/flags.go` for more information. - `PREFIX`: **""**: An additional prefix for every log line in this logger. Defaults to empty. -- `COLORIZE`: **false**: Colorize the log lines by default +- `COLORIZE`: **false**: Whether to colorize the log lines ### Console log mode (`log.console`, `log.console.*`, or `MODE=console`) @@ -1233,3 +1233,4 @@ PROXY_HOSTS = *.github.com - `SHOW_FOOTER_BRANDING`: **false**: Show Gitea branding in the footer. - `SHOW_FOOTER_VERSION`: **true**: Show Gitea and Go version information in the footer. - `SHOW_FOOTER_TEMPLATE_LOAD_TIME`: **true**: Show time of template execution in the footer. +- `ENABLE_SITEMAP`: **true**: Generate sitemap. diff --git a/models/activities/action.go b/models/activities/action.go index 3c8acb5ba8..147511edec 100644 --- a/models/activities/action.go +++ b/models/activities/action.go @@ -359,11 +359,11 @@ func GetFeeds(ctx context.Context, opts GetFeedsOptions) (ActionList, error) { actions := make([]*Action, 0, opts.PageSize) if err := sess.Desc("`action`.created_unix").Find(&actions); err != nil { - return nil, fmt.Errorf("Find: %v", err) + return nil, fmt.Errorf("Find: %w", err) } if err := ActionList(actions).loadAttributes(ctx); err != nil { - return nil, fmt.Errorf("LoadAttributes: %v", err) + return nil, fmt.Errorf("LoadAttributes: %w", err) } return actions, nil @@ -415,7 +415,7 @@ func activityQueryCondition(opts GetFeedsOptions) (builder.Cond, error) { env := organization.OrgFromUser(opts.RequestedUser).AccessibleTeamReposEnv(opts.RequestedTeam) teamRepoIDs, err := env.RepoIDs(1, opts.RequestedUser.NumRepos) if err != nil { - return nil, fmt.Errorf("GetTeamRepositories: %v", err) + return nil, fmt.Errorf("GetTeamRepositories: %w", err) } cond = cond.And(builder.In("repo_id", teamRepoIDs)) } @@ -477,14 +477,14 @@ func notifyWatchers(ctx context.Context, actions ...*Action) error { // Add feeds for user self and all watchers. watchers, err = repo_model.GetWatchers(ctx, act.RepoID) if err != nil { - return fmt.Errorf("get watchers: %v", err) + return fmt.Errorf("get watchers: %w", err) } } // Add feed for actioner. act.UserID = act.ActUserID if _, err = e.Insert(act); err != nil { - return fmt.Errorf("insert new actioner: %v", err) + return fmt.Errorf("insert new actioner: %w", err) } if repoChanged { @@ -493,7 +493,7 @@ func notifyWatchers(ctx context.Context, actions ...*Action) error { // check repo owner exist. if err := act.Repo.GetOwner(ctx); err != nil { - return fmt.Errorf("can't get repo owner: %v", err) + return fmt.Errorf("can't get repo owner: %w", err) } } else if act.Repo == nil { act.Repo = repo @@ -504,7 +504,7 @@ func notifyWatchers(ctx context.Context, actions ...*Action) error { act.ID = 0 act.UserID = act.Repo.Owner.ID if err = db.Insert(ctx, act); err != nil { - return fmt.Errorf("insert new actioner: %v", err) + return fmt.Errorf("insert new actioner: %w", err) } } @@ -557,7 +557,7 @@ func notifyWatchers(ctx context.Context, actions ...*Action) error { } if err = db.Insert(ctx, act); err != nil { - return fmt.Errorf("insert new action: %v", err) + return fmt.Errorf("insert new action: %w", err) } } } diff --git a/models/activities/action_list.go b/models/activities/action_list.go index f349b94ac8..86aa8689e2 100644 --- a/models/activities/action_list.go +++ b/models/activities/action_list.go @@ -36,7 +36,7 @@ func (actions ActionList) loadUsers(ctx context.Context) (map[int64]*user_model. In("id", userIDs). Find(&userMaps) if err != nil { - return nil, fmt.Errorf("find user: %v", err) + return nil, fmt.Errorf("find user: %w", err) } for _, action := range actions { @@ -62,7 +62,7 @@ func (actions ActionList) loadRepositories(ctx context.Context) error { repoMaps := make(map[int64]*repo_model.Repository, len(repoIDs)) err := db.GetEngine(ctx).In("id", repoIDs).Find(&repoMaps) if err != nil { - return fmt.Errorf("find repository: %v", err) + return fmt.Errorf("find repository: %w", err) } for _, action := range actions { diff --git a/models/activities/notification.go b/models/activities/notification.go index 0a61088167..5748b807a0 100644 --- a/models/activities/notification.go +++ b/models/activities/notification.go @@ -403,7 +403,7 @@ func (n *Notification) loadRepo(ctx context.Context) (err error) { if n.Repository == nil { n.Repository, err = repo_model.GetRepositoryByIDCtx(ctx, n.RepoID) if err != nil { - return fmt.Errorf("getRepositoryByID [%d]: %v", n.RepoID, err) + return fmt.Errorf("getRepositoryByID [%d]: %w", n.RepoID, err) } } return nil @@ -413,7 +413,7 @@ func (n *Notification) loadIssue(ctx context.Context) (err error) { if n.Issue == nil && n.IssueID != 0 { n.Issue, err = issues_model.GetIssueByID(ctx, n.IssueID) if err != nil { - return fmt.Errorf("getIssueByID [%d]: %v", n.IssueID, err) + return fmt.Errorf("getIssueByID [%d]: %w", n.IssueID, err) } return n.Issue.LoadAttributes(ctx) } @@ -440,7 +440,7 @@ func (n *Notification) loadUser(ctx context.Context) (err error) { if n.User == nil { n.User, err = user_model.GetUserByIDCtx(ctx, n.UserID) if err != nil { - return fmt.Errorf("getUserByID [%d]: %v", n.UserID, err) + return fmt.Errorf("getUserByID [%d]: %w", n.UserID, err) } } return nil diff --git a/models/activities/repo_activity.go b/models/activities/repo_activity.go index 3052d65e83..4c8aa7e81d 100644 --- a/models/activities/repo_activity.go +++ b/models/activities/repo_activity.go @@ -49,32 +49,32 @@ func GetActivityStats(ctx context.Context, repo *repo_model.Repository, timeFrom stats := &ActivityStats{Code: &git.CodeActivityStats{}} if releases { if err := stats.FillReleases(repo.ID, timeFrom); err != nil { - return nil, fmt.Errorf("FillReleases: %v", err) + return nil, fmt.Errorf("FillReleases: %w", err) } } if prs { if err := stats.FillPullRequests(repo.ID, timeFrom); err != nil { - return nil, fmt.Errorf("FillPullRequests: %v", err) + return nil, fmt.Errorf("FillPullRequests: %w", err) } } if issues { if err := stats.FillIssues(repo.ID, timeFrom); err != nil { - return nil, fmt.Errorf("FillIssues: %v", err) + return nil, fmt.Errorf("FillIssues: %w", err) } } if err := stats.FillUnresolvedIssues(repo.ID, timeFrom, issues, prs); err != nil { - return nil, fmt.Errorf("FillUnresolvedIssues: %v", err) + return nil, fmt.Errorf("FillUnresolvedIssues: %w", err) } if code { gitRepo, closer, err := git.RepositoryFromContextOrOpen(ctx, repo.RepoPath()) if err != nil { - return nil, fmt.Errorf("OpenRepository: %v", err) + return nil, fmt.Errorf("OpenRepository: %w", err) } defer closer.Close() code, err := gitRepo.GetCodeActivityStats(timeFrom, repo.DefaultBranch) if err != nil { - return nil, fmt.Errorf("FillFromGit: %v", err) + return nil, fmt.Errorf("FillFromGit: %w", err) } stats.Code = code } @@ -85,13 +85,13 @@ func GetActivityStats(ctx context.Context, repo *repo_model.Repository, timeFrom func GetActivityStatsTopAuthors(ctx context.Context, repo *repo_model.Repository, timeFrom time.Time, count int) ([]*ActivityAuthorData, error) { gitRepo, closer, err := git.RepositoryFromContextOrOpen(ctx, repo.RepoPath()) if err != nil { - return nil, fmt.Errorf("OpenRepository: %v", err) + return nil, fmt.Errorf("OpenRepository: %w", err) } defer closer.Close() code, err := gitRepo.GetCodeActivityStats(timeFrom, "") if err != nil { - return nil, fmt.Errorf("FillFromGit: %v", err) + return nil, fmt.Errorf("FillFromGit: %w", err) } if code.Authors == nil { return nil, nil diff --git a/models/asymkey/gpg_key.go b/models/asymkey/gpg_key.go index 78dc453e0d..83774533aa 100644 --- a/models/asymkey/gpg_key.go +++ b/models/asymkey/gpg_key.go @@ -226,7 +226,7 @@ func DeleteGPGKey(doer *user_model.User, id int64) (err error) { if IsErrGPGKeyNotExist(err) { return nil } - return fmt.Errorf("GetPublicKeyByID: %v", err) + return fmt.Errorf("GetPublicKeyByID: %w", err) } // Check if user has access to delete this key. diff --git a/models/asymkey/ssh_key.go b/models/asymkey/ssh_key.go index 9f95bb5baf..7ed4ad6b3f 100644 --- a/models/asymkey/ssh_key.go +++ b/models/asymkey/ssh_key.go @@ -130,7 +130,7 @@ func AddPublicKey(ownerID int64, name, content string, authSourceID int64) (*Pub LoginSourceID: authSourceID, } if err = addKey(ctx, key); err != nil { - return nil, fmt.Errorf("addKey: %v", err) + return nil, fmt.Errorf("addKey: %w", err) } return key, committer.Commit() diff --git a/models/asymkey/ssh_key_deploy.go b/models/asymkey/ssh_key_deploy.go index fd8388e61d..d5c981da47 100644 --- a/models/asymkey/ssh_key_deploy.go +++ b/models/asymkey/ssh_key_deploy.go @@ -151,7 +151,7 @@ func AddDeployKey(repoID int64, name, content string, readOnly bool) (*DeployKey pkey.Content = content pkey.Name = name if err = addKey(ctx, pkey); err != nil { - return nil, fmt.Errorf("addKey: %v", err) + return nil, fmt.Errorf("addKey: %w", err) } } diff --git a/models/asymkey/ssh_key_fingerprint.go b/models/asymkey/ssh_key_fingerprint.go index 747a7e6473..788d58dbab 100644 --- a/models/asymkey/ssh_key_fingerprint.go +++ b/models/asymkey/ssh_key_fingerprint.go @@ -95,7 +95,7 @@ func CalcFingerprint(publicKeyContent string) (string, error) { log.Info("%s", publicKeyContent) return "", err } - return "", fmt.Errorf("%s: %v", fnName, err) + return "", fmt.Errorf("%s: %w", fnName, err) } return fp, nil } diff --git a/models/asymkey/ssh_key_parse.go b/models/asymkey/ssh_key_parse.go index 3f52a4e9e0..2462310ed9 100644 --- a/models/asymkey/ssh_key_parse.go +++ b/models/asymkey/ssh_key_parse.go @@ -44,7 +44,7 @@ const ssh2keyStart = "---- BEGIN SSH2 PUBLIC KEY ----" func extractTypeFromBase64Key(key string) (string, error) { b, err := base64.StdEncoding.DecodeString(key) if err != nil || len(b) < 4 { - return "", fmt.Errorf("invalid key format: %v", err) + return "", fmt.Errorf("invalid key format: %w", err) } keyLength := int(binary.BigEndian.Uint32(b)) @@ -85,7 +85,7 @@ func parseKeyString(content string) (string, error) { t, err := extractTypeFromBase64Key(keyContent) if err != nil { - return "", fmt.Errorf("extractTypeFromBase64Key: %v", err) + return "", fmt.Errorf("extractTypeFromBase64Key: %w", err) } keyType = t } else { @@ -104,14 +104,14 @@ func parseKeyString(content string) (string, error) { var pk rsa.PublicKey _, err2 := asn1.Unmarshal(block.Bytes, &pk) if err2 != nil { - return "", fmt.Errorf("failed to parse DER encoded public key as either PKIX or PEM RSA Key: %v %v", err, err2) + return "", fmt.Errorf("failed to parse DER encoded public key as either PKIX or PEM RSA Key: %v %w", err, err2) } pub = &pk } sshKey, err := ssh.NewPublicKey(pub) if err != nil { - return "", fmt.Errorf("unable to convert to ssh public key: %v", err) + return "", fmt.Errorf("unable to convert to ssh public key: %w", err) } content = string(ssh.MarshalAuthorizedKey(sshKey)) } @@ -138,7 +138,7 @@ func parseKeyString(content string) (string, error) { // If keyType is not given, extract it from content. If given, validate it. t, err := extractTypeFromBase64Key(keyContent) if err != nil { - return "", fmt.Errorf("extractTypeFromBase64Key: %v", err) + return "", fmt.Errorf("extractTypeFromBase64Key: %w", err) } if len(keyType) == 0 { keyType = t @@ -149,7 +149,7 @@ func parseKeyString(content string) (string, error) { // Finally we need to check whether we can actually read the proposed key: _, _, _, _, err := ssh.ParseAuthorizedKey([]byte(keyType + " " + keyContent + " " + keyComment)) if err != nil { - return "", fmt.Errorf("invalid ssh public key: %v", err) + return "", fmt.Errorf("invalid ssh public key: %w", err) } return keyType + " " + keyContent + " " + keyComment, nil } @@ -191,7 +191,7 @@ func CheckPublicKeyString(content string) (_ string, err error) { keyType, length, err = SSHKeyGenParsePublicKey(content) } if err != nil { - return "", fmt.Errorf("%s: %v", fnName, err) + return "", fmt.Errorf("%s: %w", fnName, err) } log.Trace("Key info [native: %v]: %s-%d", setting.SSH.StartBuiltinServer, keyType, length) @@ -220,7 +220,7 @@ func SSHNativeParsePublicKey(keyLine string) (string, int, error) { if strings.Contains(err.Error(), "ssh: unknown key algorithm") { return "", 0, ErrKeyUnableVerify{err.Error()} } - return "", 0, fmt.Errorf("ParsePublicKey: %v", err) + return "", 0, fmt.Errorf("ParsePublicKey: %w", err) } // The ssh library can parse the key, so next we find out what key exactly we have. @@ -267,12 +267,12 @@ func SSHNativeParsePublicKey(keyLine string) (string, int, error) { func writeTmpKeyFile(content string) (string, error) { tmpFile, err := os.CreateTemp(setting.SSH.KeyTestPath, "gitea_keytest") if err != nil { - return "", fmt.Errorf("TempFile: %v", err) + return "", fmt.Errorf("TempFile: %w", err) } defer tmpFile.Close() if _, err = tmpFile.WriteString(content); err != nil { - return "", fmt.Errorf("WriteString: %v", err) + return "", fmt.Errorf("WriteString: %w", err) } return tmpFile.Name(), nil } @@ -281,7 +281,7 @@ func writeTmpKeyFile(content string) (string, error) { func SSHKeyGenParsePublicKey(key string) (string, int, error) { tmpName, err := writeTmpKeyFile(key) if err != nil { - return "", 0, fmt.Errorf("writeTmpKeyFile: %v", err) + return "", 0, fmt.Errorf("writeTmpKeyFile: %w", err) } defer func() { if err := util.Remove(tmpName); err != nil { diff --git a/models/asymkey/ssh_key_principals.go b/models/asymkey/ssh_key_principals.go index 7a5c234f6f..e0d407af35 100644 --- a/models/asymkey/ssh_key_principals.go +++ b/models/asymkey/ssh_key_principals.go @@ -51,7 +51,7 @@ func AddPrincipalKey(ownerID int64, content string, authSourceID int64) (*Public LoginSourceID: authSourceID, } if err = db.Insert(ctx, key); err != nil { - return nil, fmt.Errorf("addKey: %v", err) + return nil, fmt.Errorf("addKey: %w", err) } if err = committer.Commit(); err != nil { diff --git a/models/auth/oauth2.go b/models/auth/oauth2.go index e42084c086..ccd9336f65 100644 --- a/models/auth/oauth2.go +++ b/models/auth/oauth2.go @@ -570,7 +570,7 @@ func DeleteOAuth2RelictsByUserID(ctx context.Context, userID int64) error { &OAuth2Application{UID: userID}, &OAuth2Grant{UserID: userID}, ); err != nil { - return fmt.Errorf("DeleteBeans: %v", err) + return fmt.Errorf("DeleteBeans: %w", err) } return nil diff --git a/models/auth/token.go b/models/auth/token.go index 3afef832da..17c07531f8 100644 --- a/models/auth/token.go +++ b/models/auth/token.go @@ -86,7 +86,7 @@ func init() { var err error successfulAccessTokenCache, err = lru.New(setting.SuccessfulTokensCacheSize) if err != nil { - return fmt.Errorf("unable to allocate AccessToken cache: %v", err) + return fmt.Errorf("unable to allocate AccessToken cache: %w", err) } } else { successfulAccessTokenCache = nil diff --git a/models/db/engine.go b/models/db/engine.go index f0c9ec46e9..41949eb6f6 100755 --- a/models/db/engine.go +++ b/models/db/engine.go @@ -130,7 +130,7 @@ func SyncAllTables() error { func InitEngine(ctx context.Context) error { xormEngine, err := newXORMEngine() if err != nil { - return fmt.Errorf("failed to connect to database: %v", err) + return fmt.Errorf("failed to connect to database: %w", err) } xormEngine.SetMapper(names.GonicMapper{}) @@ -189,16 +189,16 @@ func InitEngineWithMigration(ctx context.Context, migrateFunc func(*xorm.Engine) // However, we should think carefully about should we support re-install on an installed instance, // as there may be other problems due to secret reinitialization. if err = migrateFunc(x); err != nil { - return fmt.Errorf("migrate: %v", err) + return fmt.Errorf("migrate: %w", err) } if err = SyncAllTables(); err != nil { - return fmt.Errorf("sync database struct error: %v", err) + return fmt.Errorf("sync database struct error: %w", err) } for _, initFunc := range initFuncs { if err := initFunc(); err != nil { - return fmt.Errorf("initFunc failed: %v", err) + return fmt.Errorf("initFunc failed: %w", err) } } diff --git a/models/git/branches.go b/models/git/branches.go index 7f05a56676..b17d762dbe 100644 --- a/models/git/branches.go +++ b/models/git/branches.go @@ -270,7 +270,7 @@ type WhitelistOptions struct { // to avoid unnecessary whitelist delete and regenerate. func UpdateProtectBranch(ctx context.Context, repo *repo_model.Repository, protectBranch *ProtectedBranch, opts WhitelistOptions) (err error) { if err = repo.GetOwner(ctx); err != nil { - return fmt.Errorf("GetOwner: %v", err) + return fmt.Errorf("GetOwner: %w", err) } whitelist, err := updateUserWhitelist(ctx, repo, protectBranch.WhitelistUserIDs, opts.UserIDs) @@ -313,13 +313,13 @@ func UpdateProtectBranch(ctx context.Context, repo *repo_model.Repository, prote // Make sure protectBranch.ID is not 0 for whitelists if protectBranch.ID == 0 { if _, err = db.GetEngine(ctx).Insert(protectBranch); err != nil { - return fmt.Errorf("Insert: %v", err) + return fmt.Errorf("Insert: %w", err) } return nil } if _, err = db.GetEngine(ctx).ID(protectBranch.ID).AllCols().Update(protectBranch); err != nil { - return fmt.Errorf("Update: %v", err) + return fmt.Errorf("Update: %w", err) } return nil @@ -378,11 +378,11 @@ func updateUserWhitelist(ctx context.Context, repo *repo_model.Repository, curre for _, userID := range newWhitelist { user, err := user_model.GetUserByIDCtx(ctx, userID) if err != nil { - return nil, fmt.Errorf("GetUserByID [user_id: %d, repo_id: %d]: %v", userID, repo.ID, err) + return nil, fmt.Errorf("GetUserByID [user_id: %d, repo_id: %d]: %w", userID, repo.ID, err) } perm, err := access_model.GetUserRepoPermission(ctx, repo, user) if err != nil { - return nil, fmt.Errorf("GetUserRepoPermission [user_id: %d, repo_id: %d]: %v", userID, repo.ID, err) + return nil, fmt.Errorf("GetUserRepoPermission [user_id: %d, repo_id: %d]: %w", userID, repo.ID, err) } if !perm.CanWrite(unit.TypeCode) { @@ -405,7 +405,7 @@ func updateTeamWhitelist(ctx context.Context, repo *repo_model.Repository, curre teams, err := organization.GetTeamsWithAccessToRepo(ctx, repo.OwnerID, repo.ID, perm.AccessModeRead) if err != nil { - return nil, fmt.Errorf("GetTeamsWithAccessToRepo [org_id: %d, repo_id: %d]: %v", repo.OwnerID, repo.ID, err) + return nil, fmt.Errorf("GetTeamsWithAccessToRepo [org_id: %d, repo_id: %d]: %w", repo.OwnerID, repo.ID, err) } whitelist = make([]int64, 0, len(teams)) diff --git a/models/git/commit_status.go b/models/git/commit_status.go index 9e24221862..620baa036c 100644 --- a/models/git/commit_status.go +++ b/models/git/commit_status.go @@ -128,13 +128,13 @@ func (status *CommitStatus) loadAttributes(ctx context.Context) (err error) { if status.Repo == nil { status.Repo, err = repo_model.GetRepositoryByIDCtx(ctx, status.RepoID) if err != nil { - return fmt.Errorf("getRepositoryByID [%d]: %v", status.RepoID, err) + return fmt.Errorf("getRepositoryByID [%d]: %w", status.RepoID, err) } } if status.Creator == nil && status.CreatorID > 0 { status.Creator, err = user_model.GetUserByIDCtx(ctx, status.CreatorID) if err != nil { - return fmt.Errorf("getUserByID [%d]: %v", status.CreatorID, err) + return fmt.Errorf("getUserByID [%d]: %w", status.CreatorID, err) } } return nil @@ -294,12 +294,12 @@ func NewCommitStatus(opts NewCommitStatusOptions) error { // Get the next Status Index idx, err := GetNextCommitStatusIndex(opts.Repo.ID, opts.SHA) if err != nil { - return fmt.Errorf("generate commit status index failed: %v", err) + return fmt.Errorf("generate commit status index failed: %w", err) } ctx, committer, err := db.TxContext() if err != nil { - return fmt.Errorf("NewCommitStatus[repo_id: %d, user_id: %d, sha: %s]: %v", opts.Repo.ID, opts.Creator.ID, opts.SHA, err) + return fmt.Errorf("NewCommitStatus[repo_id: %d, user_id: %d, sha: %s]: %w", opts.Repo.ID, opts.Creator.ID, opts.SHA, err) } defer committer.Close() @@ -316,7 +316,7 @@ func NewCommitStatus(opts NewCommitStatusOptions) error { // Insert new CommitStatus if _, err = db.GetEngine(ctx).Insert(opts.CommitStatus); err != nil { - return fmt.Errorf("Insert CommitStatus[%s, %s]: %v", repoPath, opts.SHA, err) + return fmt.Errorf("Insert CommitStatus[%s, %s]: %w", repoPath, opts.SHA, err) } return committer.Commit() diff --git a/models/git/lfs.go b/models/git/lfs.go index 1dab31d5f9..58042edfdb 100644 --- a/models/git/lfs.go +++ b/models/git/lfs.go @@ -316,7 +316,7 @@ func CopyLFS(ctx context.Context, newRepo, oldRepo *repo_model.Repository) error func GetRepoLFSSize(ctx context.Context, repoID int64) (int64, error) { lfsSize, err := db.GetEngine(ctx).Where("repository_id = ?", repoID).SumInt(new(LFSMetaObject), "size") if err != nil { - return 0, fmt.Errorf("updateSize: GetLFSMetaObjects: %v", err) + return 0, fmt.Errorf("updateSize: GetLFSMetaObjects: %w", err) } return lfsSize, nil } diff --git a/models/issues/assignees.go b/models/issues/assignees.go index 7f589f5d7e..d960d5ebaf 100644 --- a/models/issues/assignees.go +++ b/models/issues/assignees.go @@ -85,12 +85,12 @@ func ToggleIssueAssignee(issue *Issue, doer *user_model.User, assigneeID int64) func toggleIssueAssignee(ctx context.Context, issue *Issue, doer *user_model.User, assigneeID int64, isCreate bool) (removed bool, comment *Comment, err error) { removed, err = toggleUserAssignee(ctx, issue, assigneeID) if err != nil { - return false, nil, fmt.Errorf("UpdateIssueUserByAssignee: %v", err) + return false, nil, fmt.Errorf("UpdateIssueUserByAssignee: %w", err) } // Repo infos if err = issue.LoadRepo(ctx); err != nil { - return false, nil, fmt.Errorf("loadRepo: %v", err) + return false, nil, fmt.Errorf("loadRepo: %w", err) } opts := &CreateCommentOptions{ @@ -104,7 +104,7 @@ func toggleIssueAssignee(ctx context.Context, issue *Issue, doer *user_model.Use // Comment comment, err = CreateCommentCtx(ctx, opts) if err != nil { - return false, nil, fmt.Errorf("createComment: %v", err) + return false, nil, fmt.Errorf("createComment: %w", err) } // if pull request is in the middle of creation - don't call webhook diff --git a/models/issues/comment.go b/models/issues/comment.go index 9ab6cab7d0..6877991a93 100644 --- a/models/issues/comment.go +++ b/models/issues/comment.go @@ -573,13 +573,13 @@ func (c *Comment) UpdateAttachments(uuids []string) error { attachments, err := repo_model.GetAttachmentsByUUIDs(ctx, uuids) if err != nil { - return fmt.Errorf("getAttachmentsByUUIDs [uuids: %v]: %v", uuids, err) + return fmt.Errorf("getAttachmentsByUUIDs [uuids: %v]: %w", uuids, err) } for i := 0; i < len(attachments); i++ { attachments[i].IssueID = c.IssueID attachments[i].CommentID = c.ID if err := repo_model.UpdateAttachment(ctx, attachments[i]); err != nil { - return fmt.Errorf("update attachment [id: %d]: %v", attachments[i].ID, err) + return fmt.Errorf("update attachment [id: %d]: %w", attachments[i].ID, err) } } return committer.Commit() @@ -874,7 +874,7 @@ func updateCommentInfos(ctx context.Context, opts *CreateCommentOptions, comment // Check attachments attachments, err := repo_model.GetAttachmentsByUUIDs(ctx, opts.Attachments) if err != nil { - return fmt.Errorf("getAttachmentsByUUIDs [uuids: %v]: %v", opts.Attachments, err) + return fmt.Errorf("getAttachmentsByUUIDs [uuids: %v]: %w", opts.Attachments, err) } for i := range attachments { @@ -882,11 +882,11 @@ func updateCommentInfos(ctx context.Context, opts *CreateCommentOptions, comment attachments[i].CommentID = comment.ID // No assign value could be 0, so ignore AllCols(). if _, err = db.GetEngine(ctx).ID(attachments[i].ID).Update(attachments[i]); err != nil { - return fmt.Errorf("update attachment [%d]: %v", attachments[i].ID, err) + return fmt.Errorf("update attachment [%d]: %w", attachments[i].ID, err) } } case CommentTypeReopen, CommentTypeClose: - if err = updateIssueClosedNum(ctx, opts.Issue); err != nil { + if err = repo_model.UpdateRepoIssueNumbers(ctx, opts.Issue.RepoID, opts.Issue.IsPull, true); err != nil { return err } } @@ -1034,7 +1034,7 @@ func CreateRefComment(doer *user_model.User, repo *repo_model.Repository, issue CommitSHA: commitSHA, }) if err != nil { - return fmt.Errorf("check reference comment: %v", err) + return fmt.Errorf("check reference comment: %w", err) } else if has { return nil } @@ -1152,7 +1152,7 @@ func UpdateComment(c *Comment, doer *user_model.User) error { return err } if err := committer.Commit(); err != nil { - return fmt.Errorf("Commit: %v", err) + return fmt.Errorf("Commit: %w", err) } return nil diff --git a/models/issues/issue.go b/models/issues/issue.go index f77166db11..ca48f425f2 100644 --- a/models/issues/issue.go +++ b/models/issues/issue.go @@ -196,7 +196,7 @@ func (issue *Issue) LoadRepo(ctx context.Context) (err error) { if issue.Repo == nil { issue.Repo, err = repo_model.GetRepositoryByIDCtx(ctx, issue.RepoID) if err != nil { - return fmt.Errorf("getRepositoryByID [%d]: %v", issue.RepoID, err) + return fmt.Errorf("getRepositoryByID [%d]: %w", issue.RepoID, err) } } return nil @@ -234,7 +234,7 @@ func (issue *Issue) LoadLabels(ctx context.Context) (err error) { if issue.Labels == nil { issue.Labels, err = GetLabelsByIssueID(ctx, issue.ID) if err != nil { - return fmt.Errorf("getLabelsByIssueID [%d]: %v", issue.ID, err) + return fmt.Errorf("getLabelsByIssueID [%d]: %w", issue.ID, err) } } return nil @@ -252,7 +252,7 @@ func (issue *Issue) loadPoster(ctx context.Context) (err error) { issue.PosterID = -1 issue.Poster = user_model.NewGhostUser() if !user_model.IsErrUserNotExist(err) { - return fmt.Errorf("getUserByID.(poster) [%d]: %v", issue.PosterID, err) + return fmt.Errorf("getUserByID.(poster) [%d]: %w", issue.PosterID, err) } err = nil return @@ -268,7 +268,7 @@ func (issue *Issue) loadPullRequest(ctx context.Context) (err error) { if IsErrPullRequestNotExist(err) { return err } - return fmt.Errorf("getPullRequestByIssueID [%d]: %v", issue.ID, err) + return fmt.Errorf("getPullRequestByIssueID [%d]: %w", issue.ID, err) } issue.PullRequest.Issue = issue } @@ -361,7 +361,7 @@ func (issue *Issue) loadMilestone(ctx context.Context) (err error) { if (issue.Milestone == nil || issue.Milestone.ID != issue.MilestoneID) && issue.MilestoneID > 0 { issue.Milestone, err = GetMilestoneByRepoID(ctx, issue.RepoID, issue.MilestoneID) if err != nil && !IsErrMilestoneNotExist(err) { - return fmt.Errorf("getMilestoneByRepoID [repo_id: %d, milestone_id: %d]: %v", issue.RepoID, issue.MilestoneID, err) + return fmt.Errorf("getMilestoneByRepoID [repo_id: %d, milestone_id: %d]: %w", issue.RepoID, issue.MilestoneID, err) } } return nil @@ -401,7 +401,7 @@ func (issue *Issue) LoadAttributes(ctx context.Context) (err error) { if issue.Attachments == nil { issue.Attachments, err = repo_model.GetAttachmentsByIssueID(ctx, issue.ID) if err != nil { - return fmt.Errorf("getAttachmentsByIssueID [%d]: %v", issue.ID, err) + return fmt.Errorf("getAttachmentsByIssueID [%d]: %w", issue.ID, err) } } @@ -518,19 +518,19 @@ func (issue *Issue) getLabels(ctx context.Context) (err error) { issue.Labels, err = GetLabelsByIssueID(ctx, issue.ID) if err != nil { - return fmt.Errorf("getLabelsByIssueID: %v", err) + return fmt.Errorf("getLabelsByIssueID: %w", err) } return nil } func clearIssueLabels(ctx context.Context, issue *Issue, doer *user_model.User) (err error) { if err = issue.getLabels(ctx); err != nil { - return fmt.Errorf("getLabels: %v", err) + return fmt.Errorf("getLabels: %w", err) } for i := range issue.Labels { if err = deleteIssueLabel(ctx, issue, issue.Labels[i], doer); err != nil { - return fmt.Errorf("removeLabel: %v", err) + return fmt.Errorf("removeLabel: %w", err) } } @@ -565,7 +565,7 @@ func ClearIssueLabels(issue *Issue, doer *user_model.User) (err error) { } if err = committer.Commit(); err != nil { - return fmt.Errorf("Commit: %v", err) + return fmt.Errorf("Commit: %w", err) } return nil @@ -635,13 +635,13 @@ func ReplaceIssueLabels(issue *Issue, labels []*Label, doer *user_model.User) (e if len(toAdd) > 0 { if err = newIssueLabels(ctx, issue, toAdd, doer); err != nil { - return fmt.Errorf("addLabels: %v", err) + return fmt.Errorf("addLabels: %w", err) } } for _, l := range toRemove { if err = deleteIssueLabel(ctx, issue, l, doer); err != nil { - return fmt.Errorf("removeLabel: %v", err) + return fmt.Errorf("removeLabel: %w", err) } } @@ -725,7 +725,8 @@ func doChangeIssueStatus(ctx context.Context, issue *Issue, doer *user_model.Use } } - if err := updateIssueClosedNum(ctx, issue); err != nil { + // update repository's issue closed number + if err := repo_model.UpdateRepoIssueNumbers(ctx, issue.RepoID, issue.IsPull, true); err != nil { return nil, err } @@ -766,11 +767,11 @@ func ChangeIssueTitle(issue *Issue, doer *user_model.User, oldTitle string) (err defer committer.Close() if err = UpdateIssueCols(ctx, issue, "name"); err != nil { - return fmt.Errorf("updateIssueCols: %v", err) + return fmt.Errorf("updateIssueCols: %w", err) } if err = issue.LoadRepo(ctx); err != nil { - return fmt.Errorf("loadRepo: %v", err) + return fmt.Errorf("loadRepo: %w", err) } opts := &CreateCommentOptions{ @@ -782,7 +783,7 @@ func ChangeIssueTitle(issue *Issue, doer *user_model.User, oldTitle string) (err NewTitle: issue.Title, } if _, err = CreateCommentCtx(ctx, opts); err != nil { - return fmt.Errorf("createComment: %v", err) + return fmt.Errorf("createComment: %w", err) } if err = issue.AddCrossReferences(ctx, doer, true); err != nil { return err @@ -800,11 +801,11 @@ func ChangeIssueRef(issue *Issue, doer *user_model.User, oldRef string) (err err defer committer.Close() if err = UpdateIssueCols(ctx, issue, "ref"); err != nil { - return fmt.Errorf("updateIssueCols: %v", err) + return fmt.Errorf("updateIssueCols: %w", err) } if err = issue.LoadRepo(ctx); err != nil { - return fmt.Errorf("loadRepo: %v", err) + return fmt.Errorf("loadRepo: %w", err) } oldRefFriendly := strings.TrimPrefix(oldRef, git.BranchPrefix) newRefFriendly := strings.TrimPrefix(issue.Ref, git.BranchPrefix) @@ -818,7 +819,7 @@ func ChangeIssueRef(issue *Issue, doer *user_model.User, oldRef string) (err err NewRef: newRefFriendly, } if _, err = CreateCommentCtx(ctx, opts); err != nil { - return fmt.Errorf("createComment: %v", err) + return fmt.Errorf("createComment: %w", err) } return committer.Commit() @@ -850,12 +851,12 @@ func UpdateIssueAttachments(issueID int64, uuids []string) (err error) { defer committer.Close() attachments, err := repo_model.GetAttachmentsByUUIDs(ctx, uuids) if err != nil { - return fmt.Errorf("getAttachmentsByUUIDs [uuids: %v]: %v", uuids, err) + return fmt.Errorf("getAttachmentsByUUIDs [uuids: %v]: %w", uuids, err) } for i := 0; i < len(attachments); i++ { attachments[i].IssueID = issueID if err := repo_model.UpdateAttachment(ctx, attachments[i]); err != nil { - return fmt.Errorf("update attachment [id: %d]: %v", attachments[i].ID, err) + return fmt.Errorf("update attachment [id: %d]: %w", attachments[i].ID, err) } } return committer.Commit() @@ -871,28 +872,28 @@ func ChangeIssueContent(issue *Issue, doer *user_model.User, content string) (er hasContentHistory, err := HasIssueContentHistory(ctx, issue.ID, 0) if err != nil { - return fmt.Errorf("HasIssueContentHistory: %v", err) + return fmt.Errorf("HasIssueContentHistory: %w", err) } if !hasContentHistory { if err = SaveIssueContentHistory(ctx, issue.PosterID, issue.ID, 0, issue.CreatedUnix, issue.Content, true); err != nil { - return fmt.Errorf("SaveIssueContentHistory: %v", err) + return fmt.Errorf("SaveIssueContentHistory: %w", err) } } issue.Content = content if err = UpdateIssueCols(ctx, issue, "content"); err != nil { - return fmt.Errorf("UpdateIssueCols: %v", err) + return fmt.Errorf("UpdateIssueCols: %w", err) } if err = SaveIssueContentHistory(ctx, doer.ID, issue.ID, 0, timeutil.TimeStampNow(), issue.Content, false); err != nil { - return fmt.Errorf("SaveIssueContentHistory: %v", err) + return fmt.Errorf("SaveIssueContentHistory: %w", err) } if err = issue.AddCrossReferences(ctx, doer, true); err != nil { - return fmt.Errorf("addCrossReferences: %v", err) + return fmt.Errorf("addCrossReferences: %w", err) } return committer.Commit() @@ -969,7 +970,7 @@ func NewIssueWithIndex(ctx context.Context, doer *user_model.User, opts NewIssue if opts.Issue.MilestoneID > 0 { milestone, err := GetMilestoneByRepoID(ctx, opts.Issue.RepoID, opts.Issue.MilestoneID) if err != nil && !IsErrMilestoneNotExist(err) { - return fmt.Errorf("getMilestoneByID: %v", err) + return fmt.Errorf("getMilestoneByID: %w", err) } // Assume milestone is invalid and drop silently. @@ -1023,7 +1024,7 @@ func NewIssueWithIndex(ctx context.Context, doer *user_model.User, opts NewIssue // So we have to get all needed labels first. labels := make([]*Label, 0, len(opts.LabelIDs)) if err = e.In("id", opts.LabelIDs).Find(&labels); err != nil { - return fmt.Errorf("find all labels [label_ids: %v]: %v", opts.LabelIDs, err) + return fmt.Errorf("find all labels [label_ids: %v]: %w", opts.LabelIDs, err) } if err = opts.Issue.loadPoster(ctx); err != nil { @@ -1037,7 +1038,7 @@ func NewIssueWithIndex(ctx context.Context, doer *user_model.User, opts NewIssue } if err = newIssueLabel(ctx, opts.Issue, label, opts.Issue.Poster); err != nil { - return fmt.Errorf("addLabel [id: %d]: %v", label.ID, err) + return fmt.Errorf("addLabel [id: %d]: %w", label.ID, err) } } } @@ -1049,13 +1050,13 @@ func NewIssueWithIndex(ctx context.Context, doer *user_model.User, opts NewIssue if len(opts.Attachments) > 0 { attachments, err := repo_model.GetAttachmentsByUUIDs(ctx, opts.Attachments) if err != nil { - return fmt.Errorf("getAttachmentsByUUIDs [uuids: %v]: %v", opts.Attachments, err) + return fmt.Errorf("getAttachmentsByUUIDs [uuids: %v]: %w", opts.Attachments, err) } for i := 0; i < len(attachments); i++ { attachments[i].IssueID = opts.Issue.ID if _, err = e.ID(attachments[i].ID).Update(attachments[i]); err != nil { - return fmt.Errorf("update attachment [id: %d]: %v", attachments[i].ID, err) + return fmt.Errorf("update attachment [id: %d]: %w", attachments[i].ID, err) } } } @@ -1090,11 +1091,11 @@ func NewIssue(repo *repo_model.Repository, issue *Issue, labelIDs []int64, uuids if repo_model.IsErrUserDoesNotHaveAccessToRepo(err) || IsErrNewIssueInsert(err) { return err } - return fmt.Errorf("newIssue: %v", err) + return fmt.Errorf("newIssue: %w", err) } if err = committer.Commit(); err != nil { - return fmt.Errorf("Commit: %v", err) + return fmt.Errorf("Commit: %w", err) } return nil @@ -1614,7 +1615,7 @@ func UpdateIssueMentions(ctx context.Context, issueID int64, mentions []*user_mo ids[i] = u.ID } if err := UpdateIssueUsersByMentions(ctx, issueID, ids); err != nil { - return fmt.Errorf("UpdateIssueUsersByMentions: %v", err) + return fmt.Errorf("UpdateIssueUsersByMentions: %w", err) } return nil } @@ -1992,7 +1993,7 @@ func UpdateIssueByAPI(issue *Issue, doer *user_model.User) (statusChangeComment defer committer.Close() if err := issue.LoadRepo(ctx); err != nil { - return nil, false, fmt.Errorf("loadRepo: %v", err) + return nil, false, fmt.Errorf("loadRepo: %w", err) } // Reload the issue @@ -2020,7 +2021,7 @@ func UpdateIssueByAPI(issue *Issue, doer *user_model.User) (statusChangeComment } _, err := CreateCommentCtx(ctx, opts) if err != nil { - return nil, false, fmt.Errorf("createComment: %v", err) + return nil, false, fmt.Errorf("createComment: %w", err) } } @@ -2056,7 +2057,7 @@ func UpdateIssueDeadline(issue *Issue, deadlineUnix timeutil.TimeStamp, doer *us // Make the comment if _, err = createDeadlineComment(ctx, doer, issue, deadlineUnix); err != nil { - return fmt.Errorf("createRemovedDueDateComment: %v", err) + return fmt.Errorf("createRemovedDueDateComment: %w", err) } return committer.Commit() @@ -2093,7 +2094,7 @@ func (issue *Issue) GetParticipantIDsByIssue(ctx context.Context) ([]int64, erro Join("INNER", "`user`", "`user`.id = `comment`.poster_id"). Distinct("poster_id"). Find(&userIDs); err != nil { - return nil, fmt.Errorf("get poster IDs: %v", err) + return nil, fmt.Errorf("get poster IDs: %w", err) } if !util.IsInt64InSlice(issue.PosterID, userIDs) { return append(userIDs, issue.PosterID), nil @@ -2137,24 +2138,15 @@ func (issue *Issue) BlockingDependencies(ctx context.Context) (issueDeps []*Depe return issueDeps, err } -func updateIssueClosedNum(ctx context.Context, issue *Issue) (err error) { - if issue.IsPull { - err = repo_model.StatsCorrectNumClosed(ctx, issue.RepoID, true, "num_closed_pulls") - } else { - err = repo_model.StatsCorrectNumClosed(ctx, issue.RepoID, false, "num_closed_issues") - } - return err -} - // FindAndUpdateIssueMentions finds users mentioned in the given content string, and saves them in the database. func FindAndUpdateIssueMentions(ctx context.Context, issue *Issue, doer *user_model.User, content string) (mentions []*user_model.User, err error) { rawMentions := references.FindAllMentionsMarkdown(content) mentions, err = ResolveIssueMentionsByVisibility(ctx, issue, doer, rawMentions) if err != nil { - return nil, fmt.Errorf("UpdateIssueMentions [%d]: %v", issue.ID, err) + return nil, fmt.Errorf("UpdateIssueMentions [%d]: %w", issue.ID, err) } if err = UpdateIssueMentions(ctx, issue.ID, mentions); err != nil { - return nil, fmt.Errorf("UpdateIssueMentions [%d]: %v", issue.ID, err) + return nil, fmt.Errorf("UpdateIssueMentions [%d]: %w", issue.ID, err) } return mentions, err } @@ -2206,7 +2198,7 @@ func ResolveIssueMentionsByVisibility(ctx context.Context, issue *Issue, doer *u Where("team_repo.repo_id=?", issue.Repo.ID). In("team.lower_name", mentionTeams). Find(&teams); err != nil { - return nil, fmt.Errorf("find mentioned teams: %v", err) + return nil, fmt.Errorf("find mentioned teams: %w", err) } if len(teams) != 0 { checked := make([]int64, 0, len(teams)) @@ -2222,7 +2214,7 @@ func ResolveIssueMentionsByVisibility(ctx context.Context, issue *Issue, doer *u } has, err := db.GetEngine(ctx).Get(&organization.TeamUnit{OrgID: issue.Repo.Owner.ID, TeamID: team.ID, Type: unittype}) if err != nil { - return nil, fmt.Errorf("get team units (%d): %v", team.ID, err) + return nil, fmt.Errorf("get team units (%d): %w", team.ID, err) } if has { checked = append(checked, team.ID) @@ -2237,7 +2229,7 @@ func ResolveIssueMentionsByVisibility(ctx context.Context, issue *Issue, doer *u And("`user`.is_active = ?", true). And("`user`.prohibit_login = ?", false). Find(&teamusers); err != nil { - return nil, fmt.Errorf("get teams users: %v", err) + return nil, fmt.Errorf("get teams users: %w", err) } if len(teamusers) > 0 { users = make([]*user_model.User, 0, len(teamusers)) @@ -2273,7 +2265,7 @@ func ResolveIssueMentionsByVisibility(ctx context.Context, issue *Issue, doer *u And("`user`.prohibit_login = ?", false). In("`user`.lower_name", mentionUsers). Find(&unchecked); err != nil { - return nil, fmt.Errorf("find mentioned users: %v", err) + return nil, fmt.Errorf("find mentioned users: %w", err) } for _, user := range unchecked { if already := resolved[user.LowerName]; already || user.IsOrganization() { @@ -2282,7 +2274,7 @@ func ResolveIssueMentionsByVisibility(ctx context.Context, issue *Issue, doer *u // Normal users must have read access to the referencing issue perm, err := access_model.GetUserRepoPermission(ctx, issue.Repo, user) if err != nil { - return nil, fmt.Errorf("GetUserRepoPermission [%d]: %v", user.ID, err) + return nil, fmt.Errorf("GetUserRepoPermission [%d]: %w", user.ID, err) } if !perm.CanReadIssuesOrPulls(issue.IsPull) { continue diff --git a/models/issues/issue_list.go b/models/issues/issue_list.go index deadb6a564..bbe2292dd1 100644 --- a/models/issues/issue_list.go +++ b/models/issues/issue_list.go @@ -51,7 +51,7 @@ func (issues IssueList) loadRepositories(ctx context.Context) ([]*repo_model.Rep In("id", repoIDs[:limit]). Find(&repoMaps) if err != nil { - return nil, fmt.Errorf("find repository: %v", err) + return nil, fmt.Errorf("find repository: %w", err) } left -= limit repoIDs = repoIDs[limit:] @@ -161,7 +161,7 @@ func (issues IssueList) loadLabels(ctx context.Context) error { err = rows.Scan(&labelIssue) if err != nil { if err1 := rows.Close(); err1 != nil { - return fmt.Errorf("IssueList.loadLabels: Close: %v", err1) + return fmt.Errorf("IssueList.loadLabels: Close: %w", err1) } return err } @@ -170,7 +170,7 @@ func (issues IssueList) loadLabels(ctx context.Context) error { // When there are no rows left and we try to close it. // Since that is not relevant for us, we can safely ignore it. if err1 := rows.Close(); err1 != nil { - return fmt.Errorf("IssueList.loadLabels: Close: %v", err1) + return fmt.Errorf("IssueList.loadLabels: Close: %w", err1) } left -= limit issueIDs = issueIDs[limit:] @@ -287,7 +287,7 @@ func (issues IssueList) loadAssignees(ctx context.Context) error { err = rows.Scan(&assigneeIssue) if err != nil { if err1 := rows.Close(); err1 != nil { - return fmt.Errorf("IssueList.loadAssignees: Close: %v", err1) + return fmt.Errorf("IssueList.loadAssignees: Close: %w", err1) } return err } @@ -295,7 +295,7 @@ func (issues IssueList) loadAssignees(ctx context.Context) error { assignees[assigneeIssue.IssueAssignee.IssueID] = append(assignees[assigneeIssue.IssueAssignee.IssueID], assigneeIssue.Assignee) } if err1 := rows.Close(); err1 != nil { - return fmt.Errorf("IssueList.loadAssignees: Close: %v", err1) + return fmt.Errorf("IssueList.loadAssignees: Close: %w", err1) } left -= limit issueIDs = issueIDs[limit:] @@ -342,14 +342,14 @@ func (issues IssueList) loadPullRequests(ctx context.Context) error { err = rows.Scan(&pr) if err != nil { if err1 := rows.Close(); err1 != nil { - return fmt.Errorf("IssueList.loadPullRequests: Close: %v", err1) + return fmt.Errorf("IssueList.loadPullRequests: Close: %w", err1) } return err } pullRequestMaps[pr.IssueID] = &pr } if err1 := rows.Close(); err1 != nil { - return fmt.Errorf("IssueList.loadPullRequests: Close: %v", err1) + return fmt.Errorf("IssueList.loadPullRequests: Close: %w", err1) } left -= limit issuesIDs = issuesIDs[limit:] @@ -387,14 +387,14 @@ func (issues IssueList) loadAttachments(ctx context.Context) (err error) { err = rows.Scan(&attachment) if err != nil { if err1 := rows.Close(); err1 != nil { - return fmt.Errorf("IssueList.loadAttachments: Close: %v", err1) + return fmt.Errorf("IssueList.loadAttachments: Close: %w", err1) } return err } attachments[attachment.IssueID] = append(attachments[attachment.IssueID], &attachment) } if err1 := rows.Close(); err1 != nil { - return fmt.Errorf("IssueList.loadAttachments: Close: %v", err1) + return fmt.Errorf("IssueList.loadAttachments: Close: %w", err1) } left -= limit issuesIDs = issuesIDs[limit:] @@ -433,14 +433,14 @@ func (issues IssueList) loadComments(ctx context.Context, cond builder.Cond) (er err = rows.Scan(&comment) if err != nil { if err1 := rows.Close(); err1 != nil { - return fmt.Errorf("IssueList.loadComments: Close: %v", err1) + return fmt.Errorf("IssueList.loadComments: Close: %w", err1) } return err } comments[comment.IssueID] = append(comments[comment.IssueID], &comment) } if err1 := rows.Close(); err1 != nil { - return fmt.Errorf("IssueList.loadComments: Close: %v", err1) + return fmt.Errorf("IssueList.loadComments: Close: %w", err1) } left -= limit issuesIDs = issuesIDs[limit:] @@ -492,14 +492,14 @@ func (issues IssueList) loadTotalTrackedTimes(ctx context.Context) (err error) { err = rows.Scan(&totalTime) if err != nil { if err1 := rows.Close(); err1 != nil { - return fmt.Errorf("IssueList.loadTotalTrackedTimes: Close: %v", err1) + return fmt.Errorf("IssueList.loadTotalTrackedTimes: Close: %w", err1) } return err } trackedTimes[totalTime.IssueID] = totalTime.Time } if err1 := rows.Close(); err1 != nil { - return fmt.Errorf("IssueList.loadTotalTrackedTimes: Close: %v", err1) + return fmt.Errorf("IssueList.loadTotalTrackedTimes: Close: %w", err1) } left -= limit ids = ids[limit:] @@ -514,35 +514,35 @@ func (issues IssueList) loadTotalTrackedTimes(ctx context.Context) (err error) { // loadAttributes loads all attributes, expect for attachments and comments func (issues IssueList) loadAttributes(ctx context.Context) error { if _, err := issues.loadRepositories(ctx); err != nil { - return fmt.Errorf("issue.loadAttributes: loadRepositories: %v", err) + return fmt.Errorf("issue.loadAttributes: loadRepositories: %w", err) } if err := issues.loadPosters(ctx); err != nil { - return fmt.Errorf("issue.loadAttributes: loadPosters: %v", err) + return fmt.Errorf("issue.loadAttributes: loadPosters: %w", err) } if err := issues.loadLabels(ctx); err != nil { - return fmt.Errorf("issue.loadAttributes: loadLabels: %v", err) + return fmt.Errorf("issue.loadAttributes: loadLabels: %w", err) } if err := issues.loadMilestones(ctx); err != nil { - return fmt.Errorf("issue.loadAttributes: loadMilestones: %v", err) + return fmt.Errorf("issue.loadAttributes: loadMilestones: %w", err) } if err := issues.loadProjects(ctx); err != nil { - return fmt.Errorf("issue.loadAttributes: loadProjects: %v", err) + return fmt.Errorf("issue.loadAttributes: loadProjects: %w", err) } if err := issues.loadAssignees(ctx); err != nil { - return fmt.Errorf("issue.loadAttributes: loadAssignees: %v", err) + return fmt.Errorf("issue.loadAttributes: loadAssignees: %w", err) } if err := issues.loadPullRequests(ctx); err != nil { - return fmt.Errorf("issue.loadAttributes: loadPullRequests: %v", err) + return fmt.Errorf("issue.loadAttributes: loadPullRequests: %w", err) } if err := issues.loadTotalTrackedTimes(ctx); err != nil { - return fmt.Errorf("issue.loadAttributes: loadTotalTrackedTimes: %v", err) + return fmt.Errorf("issue.loadAttributes: loadTotalTrackedTimes: %w", err) } return nil diff --git a/models/issues/issue_user.go b/models/issues/issue_user.go index f5d22589af..c1a68c96e8 100644 --- a/models/issues/issue_user.go +++ b/models/issues/issue_user.go @@ -29,7 +29,7 @@ func init() { func NewIssueUsers(ctx context.Context, repo *repo_model.Repository, issue *Issue) error { assignees, err := repo_model.GetRepoAssignees(ctx, repo) if err != nil { - return fmt.Errorf("getAssignees: %v", err) + return fmt.Errorf("getAssignees: %w", err) } // Poster can be anyone, append later if not one of assignees. diff --git a/models/issues/issue_xref.go b/models/issues/issue_xref.go index 6de91058e8..e389f63d72 100644 --- a/models/issues/issue_xref.go +++ b/models/issues/issue_xref.go @@ -334,7 +334,7 @@ func (pr *PullRequest) ResolveCrossReferences(ctx context.Context) ([]*Comment, In("ref_action", []references.XRefAction{references.XRefActionCloses, references.XRefActionReopens}). OrderBy("id"). Find(&unfiltered); err != nil { - return nil, fmt.Errorf("get reference: %v", err) + return nil, fmt.Errorf("get reference: %w", err) } refs := make([]*Comment, 0, len(unfiltered)) diff --git a/models/issues/label.go b/models/issues/label.go index be97454e26..bbdc99e265 100644 --- a/models/issues/label.go +++ b/models/issues/label.go @@ -667,7 +667,7 @@ func newIssueLabels(ctx context.Context, issue *Issue, labels []*Label, doer *us } if err = newIssueLabel(ctx, issue, label, doer); err != nil { - return fmt.Errorf("newIssueLabel: %v", err) + return fmt.Errorf("newIssueLabel: %w", err) } } diff --git a/models/issues/pull.go b/models/issues/pull.go index 18b67eb305..f03cabc3c8 100644 --- a/models/issues/pull.go +++ b/models/issues/pull.go @@ -228,7 +228,7 @@ func (pr *PullRequest) loadAttributes(ctx context.Context) (err error) { pr.MergerID = -1 pr.Merger = user_model.NewGhostUser() } else if err != nil { - return fmt.Errorf("getUserByID [%d]: %v", pr.MergerID, err) + return fmt.Errorf("getUserByID [%d]: %w", pr.MergerID, err) } } @@ -255,7 +255,7 @@ func (pr *PullRequest) LoadHeadRepoCtx(ctx context.Context) (err error) { pr.HeadRepo, err = repo_model.GetRepositoryByIDCtx(ctx, pr.HeadRepoID) if err != nil && !repo_model.IsErrRepoNotExist(err) { // Head repo maybe deleted, but it should still work - return fmt.Errorf("getRepositoryByID(head): %v", err) + return fmt.Errorf("getRepositoryByID(head): %w", err) } pr.isHeadRepoLoaded = true } @@ -290,7 +290,7 @@ func (pr *PullRequest) LoadBaseRepoCtx(ctx context.Context) (err error) { pr.BaseRepo, err = repo_model.GetRepositoryByIDCtx(ctx, pr.BaseRepoID) if err != nil { - return fmt.Errorf("repo_model.GetRepositoryByID(base): %v", err) + return fmt.Errorf("repo_model.GetRepositoryByID(base): %w", err) } return nil } @@ -482,7 +482,7 @@ func (pr *PullRequest) SetMerged(ctx context.Context) (bool, error) { } if _, err := changeIssueStatus(ctx, pr.Issue, pr.Merger, true, true); err != nil { - return false, fmt.Errorf("Issue.changeStatus: %v", err) + return false, fmt.Errorf("Issue.changeStatus: %w", err) } // reset the conflicted files as there cannot be any if we're merged @@ -490,7 +490,7 @@ func (pr *PullRequest) SetMerged(ctx context.Context) (bool, error) { // We need to save all of the data used to compute this merge as it may have already been changed by TestPatch. FIXME: need to set some state to prevent TestPatch from running whilst we are merging. if _, err := sess.Where("id = ?", pr.ID).Cols("has_merged, status, merge_base, merged_commit_id, merger_id, merged_unix, conflicted_files").Update(pr); err != nil { - return false, fmt.Errorf("Failed to update pr[%d]: %v", pr.ID, err) + return false, fmt.Errorf("Failed to update pr[%d]: %w", pr.ID, err) } return true, nil @@ -507,7 +507,7 @@ func NewPullRequest(outerCtx context.Context, repo *repo_model.Repository, issue idx, err := db.GetNextResourceIndex(ctx, "issue_index", repo.ID) if err != nil { - return fmt.Errorf("generate pull request index failed: %v", err) + return fmt.Errorf("generate pull request index failed: %w", err) } issue.Index = idx @@ -522,18 +522,18 @@ func NewPullRequest(outerCtx context.Context, repo *repo_model.Repository, issue if repo_model.IsErrUserDoesNotHaveAccessToRepo(err) || IsErrNewIssueInsert(err) { return err } - return fmt.Errorf("newIssue: %v", err) + return fmt.Errorf("newIssue: %w", err) } pr.Index = issue.Index pr.BaseRepo = repo pr.IssueID = issue.ID if err = db.Insert(ctx, pr); err != nil { - return fmt.Errorf("insert pull repo: %v", err) + return fmt.Errorf("insert pull repo: %w", err) } if err = committer.Commit(); err != nil { - return fmt.Errorf("Commit: %v", err) + return fmt.Errorf("Commit: %w", err) } return nil diff --git a/models/issues/pull_list.go b/models/issues/pull_list.go index 8eeffa2c0d..c69f18492b 100644 --- a/models/issues/pull_list.go +++ b/models/issues/pull_list.go @@ -168,7 +168,7 @@ func (prs PullRequestList) loadAttributes(ctx context.Context) error { Where("id > 0"). In("id", issueIDs). Find(&issues); err != nil { - return fmt.Errorf("find issues: %v", err) + return fmt.Errorf("find issues: %w", err) } set := make(map[int64]*Issue) @@ -205,7 +205,7 @@ func (prs PullRequestList) InvalidateCodeComments(ctx context.Context, doer *use Where("type = ? and invalidated = ?", CommentTypeCode, false). In("issue_id", issueIDs). Find(&codeComments); err != nil { - return fmt.Errorf("find code comments: %v", err) + return fmt.Errorf("find code comments: %w", err) } for _, comment := range codeComments { if err := comment.CheckInvalidation(repo, doer, branch); err != nil { diff --git a/models/issues/reaction.go b/models/issues/reaction.go index 02cffad3ba..c7503c23a2 100644 --- a/models/issues/reaction.go +++ b/models/issues/reaction.go @@ -355,7 +355,7 @@ func (list ReactionList) LoadUsers(ctx context.Context, repo *repo_model.Reposit In("id", userIDs). Find(&userMaps) if err != nil { - return nil, fmt.Errorf("find user: %v", err) + return nil, fmt.Errorf("find user: %w", err) } for _, reaction := range list { diff --git a/models/issues/review.go b/models/issues/review.go index 26fcea9eef..3d2fceda2d 100644 --- a/models/issues/review.go +++ b/models/issues/review.go @@ -790,10 +790,10 @@ func AddTeamReviewRequest(issue *Issue, reviewer *organization.Team, doer *user_ official, err := IsOfficialReviewerTeam(ctx, issue, reviewer) if err != nil { - return nil, fmt.Errorf("isOfficialReviewerTeam(): %v", err) + return nil, fmt.Errorf("isOfficialReviewerTeam(): %w", err) } else if !official { if official, err = IsOfficialReviewer(ctx, issue, doer); err != nil { - return nil, fmt.Errorf("isOfficialReviewer(): %v", err) + return nil, fmt.Errorf("isOfficialReviewer(): %w", err) } } @@ -823,7 +823,7 @@ func AddTeamReviewRequest(issue *Issue, reviewer *organization.Team, doer *user_ ReviewID: review.ID, }) if err != nil { - return nil, fmt.Errorf("CreateCommentCtx(): %v", err) + return nil, fmt.Errorf("CreateCommentCtx(): %w", err) } return comment, committer.Commit() @@ -852,7 +852,7 @@ func RemoveTeamReviewRequest(issue *Issue, reviewer *organization.Team, doer *us official, err := IsOfficialReviewerTeam(ctx, issue, reviewer) if err != nil { - return nil, fmt.Errorf("isOfficialReviewerTeam(): %v", err) + return nil, fmt.Errorf("isOfficialReviewerTeam(): %w", err) } if official { @@ -882,7 +882,7 @@ func RemoveTeamReviewRequest(issue *Issue, reviewer *organization.Team, doer *us AssigneeTeamID: reviewer.ID, // Use AssigneeTeamID as reviewer team ID }) if err != nil { - return nil, fmt.Errorf("CreateCommentCtx(): %v", err) + return nil, fmt.Errorf("CreateCommentCtx(): %w", err) } return comment, committer.Commit() diff --git a/models/migrations/migrations.go b/models/migrations/migrations.go index a6201c1090..31b88a7981 100644 --- a/models/migrations/migrations.go +++ b/models/migrations/migrations.go @@ -423,18 +423,20 @@ var migrations = []Migration{ NewMigration("Update counts of all open milestones", updateOpenMilestoneCounts), // v230 -> v231 NewMigration("Add ConfidentialClient column (default true) to OAuth2Application table", addConfidentialClientColumnToOAuth2ApplicationTable), + // v231 -> v232 + NewMigration("Add index for hook_task", addIndexForHookTask), } // GetCurrentDBVersion returns the current db version func GetCurrentDBVersion(x *xorm.Engine) (int64, error) { if err := x.Sync(new(Version)); err != nil { - return -1, fmt.Errorf("sync: %v", err) + return -1, fmt.Errorf("sync: %w", err) } currentVersion := &Version{ID: 1} has, err := x.Get(currentVersion) if err != nil { - return -1, fmt.Errorf("get: %v", err) + return -1, fmt.Errorf("get: %w", err) } if !has { return -1, nil @@ -476,13 +478,13 @@ func Migrate(x *xorm.Engine) error { // Set a new clean the default mapper to GonicMapper as that is the default for Gitea. x.SetMapper(names.GonicMapper{}) if err := x.Sync(new(Version)); err != nil { - return fmt.Errorf("sync: %v", err) + return fmt.Errorf("sync: %w", err) } currentVersion := &Version{ID: 1} has, err := x.Get(currentVersion) if err != nil { - return fmt.Errorf("get: %v", err) + return fmt.Errorf("get: %w", err) } else if !has { // If the version record does not exist we think // it is a fresh installation and we can skip all migrations. @@ -490,7 +492,7 @@ func Migrate(x *xorm.Engine) error { currentVersion.Version = int64(minDBVersion + len(migrations)) if _, err = x.InsertOne(currentVersion); err != nil { - return fmt.Errorf("insert: %v", err) + return fmt.Errorf("insert: %w", err) } } @@ -519,7 +521,7 @@ Please try upgrading to a lower version first (suggested v1.6.4), then upgrade t // Reset the mapper between each migration - migrations are not supposed to depend on each other x.SetMapper(names.GonicMapper{}) if err = m.Migrate(x); err != nil { - return fmt.Errorf("migration[%d]: %s failed: %v", v+int64(i), m.Description(), err) + return fmt.Errorf("migration[%d]: %s failed: %w", v+int64(i), m.Description(), err) } currentVersion.Version = v + int64(i) + 1 if _, err = x.ID(1).Update(currentVersion); err != nil { @@ -918,7 +920,7 @@ func dropTableColumns(sess *xorm.Session, tableName string, columnNames ...strin cols += "DROP COLUMN `" + col + "` CASCADE" } if _, err := sess.Exec(fmt.Sprintf("ALTER TABLE `%s` %s", tableName, cols)); err != nil { - return fmt.Errorf("Drop table `%s` columns %v: %v", tableName, columnNames, err) + return fmt.Errorf("Drop table `%s` columns %v: %w", tableName, columnNames, err) } case setting.Database.UseMySQL: // Drop indexes on columns first @@ -946,7 +948,7 @@ func dropTableColumns(sess *xorm.Session, tableName string, columnNames ...strin cols += "DROP COLUMN `" + col + "`" } if _, err := sess.Exec(fmt.Sprintf("ALTER TABLE `%s` %s", tableName, cols)); err != nil { - return fmt.Errorf("Drop table `%s` columns %v: %v", tableName, columnNames, err) + return fmt.Errorf("Drop table `%s` columns %v: %w", tableName, columnNames, err) } case setting.Database.UseMSSQL: cols := "" @@ -960,27 +962,27 @@ func dropTableColumns(sess *xorm.Session, tableName string, columnNames ...strin tableName, strings.ReplaceAll(cols, "`", "'")) constraints := make([]string, 0) if err := sess.SQL(sql).Find(&constraints); err != nil { - return fmt.Errorf("Find constraints: %v", err) + return fmt.Errorf("Find constraints: %w", err) } for _, constraint := range constraints { if _, err := sess.Exec(fmt.Sprintf("ALTER TABLE `%s` DROP CONSTRAINT `%s`", tableName, constraint)); err != nil { - return fmt.Errorf("Drop table `%s` default constraint `%s`: %v", tableName, constraint, err) + return fmt.Errorf("Drop table `%s` default constraint `%s`: %w", tableName, constraint, err) } } sql = fmt.Sprintf("SELECT DISTINCT Name FROM sys.indexes INNER JOIN sys.index_columns ON indexes.index_id = index_columns.index_id AND indexes.object_id = index_columns.object_id WHERE indexes.object_id = OBJECT_ID('%[1]s') AND index_columns.column_id IN (SELECT column_id FROM sys.columns WHERE LOWER(name) IN (%[2]s) AND object_id = OBJECT_ID('%[1]s'))", tableName, strings.ReplaceAll(cols, "`", "'")) constraints = make([]string, 0) if err := sess.SQL(sql).Find(&constraints); err != nil { - return fmt.Errorf("Find constraints: %v", err) + return fmt.Errorf("Find constraints: %w", err) } for _, constraint := range constraints { if _, err := sess.Exec(fmt.Sprintf("DROP INDEX `%[2]s` ON `%[1]s`", tableName, constraint)); err != nil { - return fmt.Errorf("Drop index `%[2]s` on `%[1]s`: %v", tableName, constraint, err) + return fmt.Errorf("Drop index `%s` on `%s`: %w", constraint, tableName, err) } } if _, err := sess.Exec(fmt.Sprintf("ALTER TABLE `%s` DROP COLUMN %s", tableName, cols)); err != nil { - return fmt.Errorf("Drop table `%s` columns %v: %v", tableName, columnNames, err) + return fmt.Errorf("Drop table `%s` columns %v: %w", tableName, columnNames, err) } default: log.Fatal("Unrecognized DB") diff --git a/models/migrations/v113.go b/models/migrations/v113.go index 199c02ac98..4af246863d 100644 --- a/models/migrations/v113.go +++ b/models/migrations/v113.go @@ -17,7 +17,7 @@ func featureChangeTargetBranch(x *xorm.Engine) error { } if err := x.Sync2(new(Comment)); err != nil { - return fmt.Errorf("Sync2: %v", err) + return fmt.Errorf("Sync2: %w", err) } return nil } diff --git a/models/migrations/v115.go b/models/migrations/v115.go index b242ccf238..3e61cb6e0e 100644 --- a/models/migrations/v115.go +++ b/models/migrations/v115.go @@ -45,11 +45,11 @@ func renameExistingUserAvatarName(x *xorm.Engine) error { migrated := 0 for { if err := sess.Begin(); err != nil { - return fmt.Errorf("session.Begin: %v", err) + return fmt.Errorf("session.Begin: %w", err) } users := make([]*User, 0, 50) if err := sess.Table("user").Asc("id").Limit(50, start).Find(&users); err != nil { - return fmt.Errorf("select users from id [%d]: %v", start, err) + return fmt.Errorf("select users from id [%d]: %w", start, err) } if len(users) == 0 { _ = sess.Rollback() @@ -76,7 +76,7 @@ func renameExistingUserAvatarName(x *xorm.Engine) error { newAvatar, err := copyOldAvatarToNewLocation(user.ID, oldAvatar) if err != nil { _ = sess.Rollback() - return fmt.Errorf("[user: %s] %v", user.LowerName, err) + return fmt.Errorf("[user: %s] %w", user.LowerName, err) } else if newAvatar == oldAvatar { continue } @@ -84,7 +84,7 @@ func renameExistingUserAvatarName(x *xorm.Engine) error { user.Avatar = newAvatar if _, err := sess.ID(user.ID).Cols("avatar").Update(user); err != nil { _ = sess.Rollback() - return fmt.Errorf("[user: %s] user table update: %v", user.LowerName, err) + return fmt.Errorf("[user: %s] user table update: %w", user.LowerName, err) } deleteList.Add(filepath.Join(setting.Avatar.Path, oldAvatar)) @@ -104,7 +104,7 @@ func renameExistingUserAvatarName(x *xorm.Engine) error { } if err := sess.Commit(); err != nil { _ = sess.Rollback() - return fmt.Errorf("commit session: %v", err) + return fmt.Errorf("commit session: %w", err) } } @@ -138,13 +138,13 @@ func renameExistingUserAvatarName(x *xorm.Engine) error { func copyOldAvatarToNewLocation(userID int64, oldAvatar string) (string, error) { fr, err := os.Open(filepath.Join(setting.Avatar.Path, oldAvatar)) if err != nil { - return "", fmt.Errorf("os.Open: %v", err) + return "", fmt.Errorf("os.Open: %w", err) } defer fr.Close() data, err := io.ReadAll(fr) if err != nil { - return "", fmt.Errorf("io.ReadAll: %v", err) + return "", fmt.Errorf("io.ReadAll: %w", err) } newAvatar := fmt.Sprintf("%x", md5.Sum([]byte(fmt.Sprintf("%d-%x", userID, md5.Sum(data))))) @@ -153,7 +153,7 @@ func copyOldAvatarToNewLocation(userID int64, oldAvatar string) (string, error) } if err := os.WriteFile(filepath.Join(setting.Avatar.Path, newAvatar), data, 0o666); err != nil { - return "", fmt.Errorf("os.WriteFile: %v", err) + return "", fmt.Errorf("os.WriteFile: %w", err) } return newAvatar, nil diff --git a/models/migrations/v125.go b/models/migrations/v125.go index ac567f66b9..64483e1397 100644 --- a/models/migrations/v125.go +++ b/models/migrations/v125.go @@ -17,7 +17,7 @@ func addReviewMigrateInfo(x *xorm.Engine) error { } if err := x.Sync2(new(Review)); err != nil { - return fmt.Errorf("Sync2: %v", err) + return fmt.Errorf("Sync2: %w", err) } return nil } diff --git a/models/migrations/v127.go b/models/migrations/v127.go index d8f0de4a6e..7be1e326d4 100644 --- a/models/migrations/v127.go +++ b/models/migrations/v127.go @@ -36,10 +36,10 @@ func addLanguageStats(x *xorm.Engine) error { } if err := x.Sync2(new(LanguageStat)); err != nil { - return fmt.Errorf("Sync2: %v", err) + return fmt.Errorf("Sync2: %w", err) } if err := x.Sync2(new(RepoIndexerStatus)); err != nil { - return fmt.Errorf("Sync2: %v", err) + return fmt.Errorf("Sync2: %w", err) } return nil } diff --git a/models/migrations/v128.go b/models/migrations/v128.go index aba0ed6897..7e84ff5b71 100644 --- a/models/migrations/v128.go +++ b/models/migrations/v128.go @@ -59,7 +59,7 @@ func fixMergeBase(x *xorm.Engine) error { for { prs := make([]PullRequest, 0, 50) if err := x.Limit(limit, start).Asc("id").Find(&prs); err != nil { - return fmt.Errorf("Find: %v", err) + return fmt.Errorf("Find: %w", err) } if len(prs) == 0 { break @@ -70,7 +70,7 @@ func fixMergeBase(x *xorm.Engine) error { baseRepo := &Repository{ID: pr.BaseRepoID} has, err := x.Table("repository").Get(baseRepo) if err != nil { - return fmt.Errorf("Unable to get base repo %d %v", pr.BaseRepoID, err) + return fmt.Errorf("Unable to get base repo %d %w", pr.BaseRepoID, err) } if !has { log.Error("Missing base repo with id %d for PR ID %d", pr.BaseRepoID, pr.ID) diff --git a/models/migrations/v131.go b/models/migrations/v131.go index a38c7be634..48fd3e29c9 100644 --- a/models/migrations/v131.go +++ b/models/migrations/v131.go @@ -16,7 +16,7 @@ func addSystemWebhookColumn(x *xorm.Engine) error { } if err := x.Sync2(new(Webhook)); err != nil { - return fmt.Errorf("Sync2: %v", err) + return fmt.Errorf("Sync2: %w", err) } return nil } diff --git a/models/migrations/v132.go b/models/migrations/v132.go index 3f7b1c9709..e67a67e907 100644 --- a/models/migrations/v132.go +++ b/models/migrations/v132.go @@ -16,7 +16,7 @@ func addBranchProtectionProtectedFilesColumn(x *xorm.Engine) error { } if err := x.Sync2(new(ProtectedBranch)); err != nil { - return fmt.Errorf("Sync2: %v", err) + return fmt.Errorf("Sync2: %w", err) } return nil } diff --git a/models/migrations/v134.go b/models/migrations/v134.go index 06d0f8276a..75c6768720 100644 --- a/models/migrations/v134.go +++ b/models/migrations/v134.go @@ -58,7 +58,7 @@ func refixMergeBase(x *xorm.Engine) error { for { prs := make([]PullRequest, 0, 50) if err := x.Limit(limit, start).Asc("id").Where("has_merged = ?", true).Find(&prs); err != nil { - return fmt.Errorf("Find: %v", err) + return fmt.Errorf("Find: %w", err) } if len(prs) == 0 { break @@ -69,7 +69,7 @@ func refixMergeBase(x *xorm.Engine) error { baseRepo := &Repository{ID: pr.BaseRepoID} has, err := x.Table("repository").Get(baseRepo) if err != nil { - return fmt.Errorf("Unable to get base repo %d %v", pr.BaseRepoID, err) + return fmt.Errorf("Unable to get base repo %d %w", pr.BaseRepoID, err) } if !has { log.Error("Missing base repo with id %d for PR ID %d", pr.BaseRepoID, pr.ID) diff --git a/models/migrations/v135.go b/models/migrations/v135.go index 8d859d42c0..eaa852d44f 100644 --- a/models/migrations/v135.go +++ b/models/migrations/v135.go @@ -16,7 +16,7 @@ func addOrgIDLabelColumn(x *xorm.Engine) error { } if err := x.Sync2(new(Label)); err != nil { - return fmt.Errorf("Sync2: %v", err) + return fmt.Errorf("Sync2: %w", err) } return nil } diff --git a/models/migrations/v136.go b/models/migrations/v136.go index 94372e4142..b2192f3853 100644 --- a/models/migrations/v136.go +++ b/models/migrations/v136.go @@ -44,7 +44,7 @@ func addCommitDivergenceToPulls(x *xorm.Engine) error { } if err := x.Sync2(new(PullRequest)); err != nil { - return fmt.Errorf("Sync2: %v", err) + return fmt.Errorf("Sync2: %w", err) } last := 0 @@ -80,7 +80,7 @@ func addCommitDivergenceToPulls(x *xorm.Engine) error { baseRepo := &Repository{ID: pr.BaseRepoID} has, err := x.Table("repository").Get(baseRepo) if err != nil { - return fmt.Errorf("Unable to get base repo %d %v", pr.BaseRepoID, err) + return fmt.Errorf("Unable to get base repo %d %w", pr.BaseRepoID, err) } if !has { log.Error("Missing base repo with id %d for PR ID %d", pr.BaseRepoID, pr.ID) @@ -101,7 +101,7 @@ func addCommitDivergenceToPulls(x *xorm.Engine) error { pr.CommitsBehind = divergence.Behind if _, err = sess.ID(pr.ID).Cols("commits_ahead", "commits_behind").Update(pr); err != nil { - return fmt.Errorf("Update Cols: %v", err) + return fmt.Errorf("Update Cols: %w", err) } migrated++ } diff --git a/models/migrations/v138.go b/models/migrations/v138.go index 2db9b821ad..03235200ab 100644 --- a/models/migrations/v138.go +++ b/models/migrations/v138.go @@ -16,7 +16,7 @@ func addResolveDoerIDCommentColumn(x *xorm.Engine) error { } if err := x.Sync2(new(Comment)); err != nil { - return fmt.Errorf("Sync2: %v", err) + return fmt.Errorf("Sync2: %w", err) } return nil } diff --git a/models/migrations/v140.go b/models/migrations/v140.go index 871d14b84e..b54740f1a9 100644 --- a/models/migrations/v140.go +++ b/models/migrations/v140.go @@ -34,7 +34,7 @@ func fixLanguageStatsToSaveSize(x *xorm.Engine) error { } if err := x.Sync2(new(LanguageStat)); err != nil { - return fmt.Errorf("Sync2: %v", err) + return fmt.Errorf("Sync2: %w", err) } x.Delete(&RepoIndexerStatus{IndexerType: RepoIndexerTypeStats}) diff --git a/models/migrations/v141.go b/models/migrations/v141.go index ab05698b8c..21247cc78f 100644 --- a/models/migrations/v141.go +++ b/models/migrations/v141.go @@ -16,7 +16,7 @@ func addKeepActivityPrivateUserColumn(x *xorm.Engine) error { } if err := x.Sync2(new(User)); err != nil { - return fmt.Errorf("Sync2: %v", err) + return fmt.Errorf("Sync2: %w", err) } return nil } diff --git a/models/migrations/v145.go b/models/migrations/v145.go index ee79c20e97..afc60497e3 100644 --- a/models/migrations/v145.go +++ b/models/migrations/v145.go @@ -53,16 +53,16 @@ func increaseLanguageField(x *xorm.Engine) error { if err := sess.SQL(`SELECT i.name AS Name FROM sys.indexes i INNER JOIN sys.index_columns ic ON i.index_id = ic.index_id AND i.object_id = ic.object_id - INNER JOIN sys.tables AS t + INNER JOIN sys.tables AS t ON t.object_id = i.object_id INNER JOIN sys.columns c ON t.object_id = c.object_id AND ic.column_id = c.column_id WHERE t.name = 'language_stat' AND c.name = 'language'`).Find(&constraints); err != nil { - return fmt.Errorf("Find constraints: %v", err) + return fmt.Errorf("Find constraints: %w", err) } for _, constraint := range constraints { if _, err := sess.Exec(fmt.Sprintf("DROP INDEX [%s] ON `language_stat`", constraint)); err != nil { - return fmt.Errorf("Drop table `language_stat` constraint `%s`: %v", constraint, err) + return fmt.Errorf("Drop table `language_stat` constraint `%s`: %w", constraint, err) } } if _, err := sess.Exec(fmt.Sprintf("ALTER TABLE language_stat ALTER COLUMN language %s", sqlType)); err != nil { diff --git a/models/migrations/v149.go b/models/migrations/v149.go index 60c0fae8bc..4d2cf5b976 100644 --- a/models/migrations/v149.go +++ b/models/migrations/v149.go @@ -19,7 +19,7 @@ func addCreatedAndUpdatedToMilestones(x *xorm.Engine) error { } if err := x.Sync2(new(Milestone)); err != nil { - return fmt.Errorf("Sync2: %v", err) + return fmt.Errorf("Sync2: %w", err) } return nil } diff --git a/models/migrations/v155.go b/models/migrations/v155.go index 58d78b6cfb..f95b4dfa3f 100644 --- a/models/migrations/v155.go +++ b/models/migrations/v155.go @@ -16,7 +16,7 @@ func addChangedProtectedFilesPullRequestColumn(x *xorm.Engine) error { } if err := x.Sync2(new(PullRequest)); err != nil { - return fmt.Errorf("Sync2: %v", err) + return fmt.Errorf("Sync2: %w", err) } return nil } diff --git a/models/migrations/v156.go b/models/migrations/v156.go index 26f97fe984..2c146892d2 100644 --- a/models/migrations/v156.go +++ b/models/migrations/v156.go @@ -123,7 +123,7 @@ func fixPublisherIDforTagReleases(x *xorm.Engine) error { continue } log.Error("Error whilst getting commit for Tag: %s in [%d]%s/%s. Error: %v", release.TagName, repo.ID, repo.OwnerName, repo.Name, err) - return fmt.Errorf("GetTagCommit: %v", err) + return fmt.Errorf("GetTagCommit: %w", err) } if commit.Author.Email == "" { @@ -135,7 +135,7 @@ func fixPublisherIDforTagReleases(x *xorm.Engine) error { continue } log.Error("Error whilst getting commit for Tag: %s in [%d]%s/%s. Error: %v", release.TagName, repo.ID, repo.OwnerName, repo.Name, err) - return fmt.Errorf("GetCommit: %v", err) + return fmt.Errorf("GetCommit: %w", err) } } diff --git a/models/migrations/v164.go b/models/migrations/v164.go index 01ba796563..02343fac24 100644 --- a/models/migrations/v164.go +++ b/models/migrations/v164.go @@ -32,7 +32,7 @@ func (grant *OAuth2Grant) TableName() string { func addScopeAndNonceColumnsToOAuth2Grant(x *xorm.Engine) error { if err := x.Sync2(new(OAuth2Grant)); err != nil { - return fmt.Errorf("Sync2: %v", err) + return fmt.Errorf("Sync2: %w", err) } return nil } diff --git a/models/migrations/v167.go b/models/migrations/v167.go index fd91f226ab..26d7cfd4f8 100644 --- a/models/migrations/v167.go +++ b/models/migrations/v167.go @@ -18,7 +18,7 @@ func addUserRedirect(x *xorm.Engine) (err error) { } if err := x.Sync2(new(UserRedirect)); err != nil { - return fmt.Errorf("Sync2: %v", err) + return fmt.Errorf("Sync2: %w", err) } return nil } diff --git a/models/migrations/v170.go b/models/migrations/v170.go index 853a23d290..2d654fb2b1 100644 --- a/models/migrations/v170.go +++ b/models/migrations/v170.go @@ -16,7 +16,7 @@ func addDismissedReviewColumn(x *xorm.Engine) error { } if err := x.Sync2(new(Review)); err != nil { - return fmt.Errorf("Sync2: %v", err) + return fmt.Errorf("Sync2: %w", err) } return nil } diff --git a/models/migrations/v171.go b/models/migrations/v171.go index 2547ff0f77..8b27493cea 100644 --- a/models/migrations/v171.go +++ b/models/migrations/v171.go @@ -16,7 +16,7 @@ func addSortingColToProjectBoard(x *xorm.Engine) error { } if err := x.Sync2(new(ProjectBoard)); err != nil { - return fmt.Errorf("Sync2: %v", err) + return fmt.Errorf("Sync2: %w", err) } return nil } diff --git a/models/migrations/v173.go b/models/migrations/v173.go index dd4589066d..c1f167e6f6 100644 --- a/models/migrations/v173.go +++ b/models/migrations/v173.go @@ -16,7 +16,7 @@ func addTimeIDCommentColumn(x *xorm.Engine) error { } if err := x.Sync2(new(Comment)); err != nil { - return fmt.Errorf("Sync2: %v", err) + return fmt.Errorf("Sync2: %w", err) } return nil } diff --git a/models/migrations/v174.go b/models/migrations/v174.go index 5915d3626b..b6c555525e 100644 --- a/models/migrations/v174.go +++ b/models/migrations/v174.go @@ -28,7 +28,7 @@ func addRepoTransfer(x *xorm.Engine) error { } if err := sess.Sync2(new(RepoTransfer)); err != nil { - return fmt.Errorf("Sync2: %v", err) + return fmt.Errorf("Sync2: %w", err) } return sess.Commit() diff --git a/models/migrations/v177.go b/models/migrations/v177.go index c65fd3de00..f28826f170 100644 --- a/models/migrations/v177.go +++ b/models/migrations/v177.go @@ -25,7 +25,7 @@ func deleteOrphanedIssueLabels(x *xorm.Engine) error { } if err := sess.Sync2(new(IssueLabel)); err != nil { - return fmt.Errorf("Sync2: %v", err) + return fmt.Errorf("Sync2: %w", err) } if _, err := sess.Exec(`DELETE FROM issue_label WHERE issue_label.id IN ( diff --git a/models/migrations/v183.go b/models/migrations/v183.go index cc752bf827..0dc3af28a7 100644 --- a/models/migrations/v183.go +++ b/models/migrations/v183.go @@ -32,7 +32,7 @@ func createPushMirrorTable(x *xorm.Engine) error { } if err := sess.Sync2(new(PushMirror)); err != nil { - return fmt.Errorf("Sync2: %v", err) + return fmt.Errorf("Sync2: %w", err) } return sess.Commit() diff --git a/models/migrations/v184.go b/models/migrations/v184.go index 97bc72d5d9..593a8100a8 100644 --- a/models/migrations/v184.go +++ b/models/migrations/v184.go @@ -43,7 +43,7 @@ func renameTaskErrorsToMessage(x *xorm.Engine) error { } if err := sess.Sync2(new(Task)); err != nil { - return fmt.Errorf("error on Sync2: %v", err) + return fmt.Errorf("error on Sync2: %w", err) } if messageExist { diff --git a/models/migrations/v190.go b/models/migrations/v190.go index 8d1fba8373..00046ff2a1 100644 --- a/models/migrations/v190.go +++ b/models/migrations/v190.go @@ -18,7 +18,7 @@ func addAgitFlowPullRequest(x *xorm.Engine) error { } if err := x.Sync2(new(PullRequest)); err != nil { - return fmt.Errorf("sync2: %v", err) + return fmt.Errorf("sync2: %w", err) } return nil } diff --git a/models/migrations/v194.go b/models/migrations/v194.go index 7ea160e2b2..6bd2f19ef5 100644 --- a/models/migrations/v194.go +++ b/models/migrations/v194.go @@ -16,7 +16,7 @@ func addBranchProtectionUnprotectedFilesColumn(x *xorm.Engine) error { } if err := x.Sync2(new(ProtectedBranch)); err != nil { - return fmt.Errorf("Sync2: %v", err) + return fmt.Errorf("Sync2: %w", err) } return nil } diff --git a/models/migrations/v195.go b/models/migrations/v195.go index 06694eb57d..8594dddf1f 100644 --- a/models/migrations/v195.go +++ b/models/migrations/v195.go @@ -20,7 +20,7 @@ func addTableCommitStatusIndex(x *xorm.Engine) error { } if err := x.Sync2(new(CommitStatusIndex)); err != nil { - return fmt.Errorf("Sync2: %v", err) + return fmt.Errorf("Sync2: %w", err) } sess := x.NewSession() diff --git a/models/migrations/v196.go b/models/migrations/v196.go index c0332c7bb4..0423d0268b 100644 --- a/models/migrations/v196.go +++ b/models/migrations/v196.go @@ -16,7 +16,7 @@ func addColorColToProjectBoard(x *xorm.Engine) error { } if err := x.Sync2(new(ProjectBoard)); err != nil { - return fmt.Errorf("Sync2: %v", err) + return fmt.Errorf("Sync2: %w", err) } return nil } diff --git a/models/migrations/v198.go b/models/migrations/v198.go index e3c31460a9..4b1515109e 100644 --- a/models/migrations/v198.go +++ b/models/migrations/v198.go @@ -27,7 +27,7 @@ func addTableIssueContentHistory(x *xorm.Engine) error { sess := x.NewSession() defer sess.Close() if err := sess.Sync2(new(IssueContentHistory)); err != nil { - return fmt.Errorf("Sync2: %v", err) + return fmt.Errorf("Sync2: %w", err) } return sess.Commit() } diff --git a/models/migrations/v200.go b/models/migrations/v200.go index 56ac06cb13..f0f107bf77 100644 --- a/models/migrations/v200.go +++ b/models/migrations/v200.go @@ -17,7 +17,7 @@ func addTableAppState(x *xorm.Engine) error { Content string `xorm:"LONGTEXT"` } if err := x.Sync2(new(AppState)); err != nil { - return fmt.Errorf("Sync2: %v", err) + return fmt.Errorf("Sync2: %w", err) } return nil } diff --git a/models/migrations/v202.go b/models/migrations/v202.go index 664728969a..1bfc28d637 100644 --- a/models/migrations/v202.go +++ b/models/migrations/v202.go @@ -18,7 +18,7 @@ func createUserSettingsTable(x *xorm.Engine) error { SettingValue string `xorm:"text"` } if err := x.Sync2(new(UserSetting)); err != nil { - return fmt.Errorf("sync2: %v", err) + return fmt.Errorf("sync2: %w", err) } return nil } diff --git a/models/migrations/v206.go b/models/migrations/v206.go index c6a5dc811c..525a475722 100644 --- a/models/migrations/v206.go +++ b/models/migrations/v206.go @@ -20,7 +20,7 @@ func addAuthorizeColForTeamUnit(x *xorm.Engine) error { } if err := x.Sync2(new(TeamUnit)); err != nil { - return fmt.Errorf("sync2: %v", err) + return fmt.Errorf("sync2: %w", err) } // migrate old permission diff --git a/models/migrations/v210.go b/models/migrations/v210.go index f32fae77ba..891c96fb30 100644 --- a/models/migrations/v210.go +++ b/models/migrations/v210.go @@ -144,7 +144,7 @@ func remigrateU2FCredentials(x *xorm.Engine) error { if !has { has, err := sess.Where("`lower_name`=?", remigrated.LowerName).And("`user_id`=?", remigrated.UserID).Exist(new(webauthnCredential)) if err != nil { - return fmt.Errorf("unable to check webauthn_credential[lower_name: %s, user_id:%v]. Error: %w", remigrated.LowerName, remigrated.UserID, err) + return fmt.Errorf("unable to check webauthn_credential[lower_name: %s, user_id: %d]. Error: %w", remigrated.LowerName, remigrated.UserID, err) } if !has { _, err = sess.Insert(remigrated) diff --git a/models/migrations/v211.go b/models/migrations/v211.go index 26ccfd2037..ec7cb46d47 100644 --- a/models/migrations/v211.go +++ b/models/migrations/v211.go @@ -20,7 +20,7 @@ func createForeignReferenceTable(x *xorm.Engine) error { } if err := x.Sync2(new(ForeignReference)); err != nil { - return fmt.Errorf("Sync2: %v", err) + return fmt.Errorf("Sync2: %w", err) } return nil } diff --git a/models/migrations/v223.go b/models/migrations/v223.go index d7ee4812b8..9f4c6acfe3 100644 --- a/models/migrations/v223.go +++ b/models/migrations/v223.go @@ -54,7 +54,7 @@ func renameCredentialIDBytes(x *xorm.Engine) error { } if err := sess.Sync2(new(webauthnCredential)); err != nil { - return fmt.Errorf("error on Sync2: %v", err) + return fmt.Errorf("error on Sync2: %w", err) } if credentialIDExist { diff --git a/models/migrations/v227.go b/models/migrations/v227.go index 8a3a9c877e..36c0a5eef1 100644 --- a/models/migrations/v227.go +++ b/models/migrations/v227.go @@ -45,7 +45,7 @@ func insertSettingsIfNotExist(x *xorm.Engine, sysSettings []*SystemSetting) erro func createSystemSettingsTable(x *xorm.Engine) error { if err := x.Sync2(new(SystemSetting)); err != nil { - return fmt.Errorf("sync2: %v", err) + return fmt.Errorf("sync2: %w", err) } // migrate xx to database diff --git a/models/migrations/v231.go b/models/migrations/v231.go new file mode 100644 index 0000000000..34dc72294a --- /dev/null +++ b/models/migrations/v231.go @@ -0,0 +1,19 @@ +// Copyright 2022 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package migrations + +import ( + "xorm.io/xorm" +) + +func addIndexForHookTask(x *xorm.Engine) error { + type HookTask struct { + ID int64 `xorm:"pk autoincr"` + HookID int64 `xorm:"index"` + UUID string `xorm:"unique"` + } + + return x.Sync(new(HookTask)) +} diff --git a/models/migrations/v70.go b/models/migrations/v70.go index 7d34c89d11..b2563544b2 100644 --- a/models/migrations/v70.go +++ b/models/migrations/v70.go @@ -38,7 +38,7 @@ func addIssueDependencies(x *xorm.Engine) (err error) { ) if err = x.Sync(new(IssueDependency)); err != nil { - return fmt.Errorf("Error creating issue_dependency_table column definition: %v", err) + return fmt.Errorf("Error creating issue_dependency_table column definition: %w", err) } // Update Comment definition @@ -76,7 +76,7 @@ func addIssueDependencies(x *xorm.Engine) (err error) { } if err = x.Sync(new(Comment)); err != nil { - return fmt.Errorf("Error updating issue_comment table column definition: %v", err) + return fmt.Errorf("Error updating issue_comment table column definition: %w", err) } // RepoUnit describes all units of a repository @@ -93,7 +93,7 @@ func addIssueDependencies(x *xorm.Engine) (err error) { units := make([]*RepoUnit, 0, 100) err = x.Where("`type` = ?", v16UnitTypeIssues).Find(&units) if err != nil { - return fmt.Errorf("Query repo units: %v", err) + return fmt.Errorf("Query repo units: %w", err) } for _, unit := range units { if unit.Config == nil { diff --git a/models/migrations/v71.go b/models/migrations/v71.go index 163ec3ee5f..70314386d7 100644 --- a/models/migrations/v71.go +++ b/models/migrations/v71.go @@ -30,7 +30,7 @@ func addScratchHash(x *xorm.Engine) error { } if err := x.Sync2(new(TwoFactor)); err != nil { - return fmt.Errorf("Sync2: %v", err) + return fmt.Errorf("Sync2: %w", err) } sess := x.NewSession() @@ -61,7 +61,7 @@ func addScratchHash(x *xorm.Engine) error { tfa.ScratchHash = hashToken(tfa.ScratchToken, salt) if _, err := sess.ID(tfa.ID).Cols("scratch_salt, scratch_hash").Update(tfa); err != nil { - return fmt.Errorf("couldn't add in scratch_hash and scratch_salt: %v", err) + return fmt.Errorf("couldn't add in scratch_hash and scratch_salt: %w", err) } } diff --git a/models/migrations/v72.go b/models/migrations/v72.go index 612f58aab5..2be4233863 100644 --- a/models/migrations/v72.go +++ b/models/migrations/v72.go @@ -25,7 +25,7 @@ func addReview(x *xorm.Engine) error { } if err := x.Sync2(new(Review)); err != nil { - return fmt.Errorf("Sync2: %v", err) + return fmt.Errorf("Sync2: %w", err) } return nil } diff --git a/models/migrations/v76.go b/models/migrations/v76.go index a82ae40ba7..2686422723 100644 --- a/models/migrations/v76.go +++ b/models/migrations/v76.go @@ -43,7 +43,7 @@ func addPullRequestRebaseWithMerge(x *xorm.Engine) error { // Updating existing issue units units := make([]*RepoUnit, 0, 100) if err := sess.Where("`type` = ?", v16UnitTypePRs).Find(&units); err != nil { - return fmt.Errorf("Query repo units: %v", err) + return fmt.Errorf("Query repo units: %w", err) } for _, unit := range units { if unit.Config == nil { diff --git a/models/migrations/v81.go b/models/migrations/v81.go index 4e9e7658ee..5141f97576 100644 --- a/models/migrations/v81.go +++ b/models/migrations/v81.go @@ -24,7 +24,7 @@ func changeU2FCounterType(x *xorm.Engine) error { } if err != nil { - return fmt.Errorf("Error changing u2f_registration counter column type: %v", err) + return fmt.Errorf("Error changing u2f_registration counter column type: %w", err) } return nil diff --git a/models/migrations/v85.go b/models/migrations/v85.go index 9611d6e72a..317660eb6f 100644 --- a/models/migrations/v85.go +++ b/models/migrations/v85.go @@ -41,7 +41,7 @@ func hashAppToken(x *xorm.Engine) error { } if err := sess.Sync2(new(AccessToken)); err != nil { - return fmt.Errorf("Sync2: %v", err) + return fmt.Errorf("Sync2: %w", err) } if err := sess.Commit(); err != nil { @@ -79,7 +79,7 @@ func hashAppToken(x *xorm.Engine) error { token.Sha1 = "" // ensure to blank out column in case drop column doesn't work if _, err := sess.ID(token.ID).Cols("token_hash, token_salt, token_last_eight, sha1").Update(token); err != nil { - return fmt.Errorf("couldn't add in sha1, token_hash, token_salt and token_last_eight: %v", err) + return fmt.Errorf("couldn't add in sha1, token_hash, token_salt and token_last_eight: %w", err) } } @@ -113,7 +113,7 @@ func resyncHashAppTokenWithUniqueHash(x *xorm.Engine) error { return err } if err := sess.Sync2(new(AccessToken)); err != nil { - return fmt.Errorf("Sync2: %v", err) + return fmt.Errorf("Sync2: %w", err) } return sess.Commit() } diff --git a/models/org.go b/models/org.go index 53be80c3df..150c41f55d 100644 --- a/models/org.go +++ b/models/org.go @@ -25,14 +25,14 @@ func removeOrgUser(ctx context.Context, orgID, userID int64) error { And("org_id=?", orgID). Get(ou) if err != nil { - return fmt.Errorf("get org-user: %v", err) + return fmt.Errorf("get org-user: %w", err) } else if !has { return nil } org, err := organization.GetOrgByID(ctx, orgID) if err != nil { - return fmt.Errorf("GetUserByID [%d]: %v", orgID, err) + return fmt.Errorf("GetUserByID [%d]: %w", orgID, err) } // Check if the user to delete is the last member in owner team. @@ -62,11 +62,11 @@ func removeOrgUser(ctx context.Context, orgID, userID int64) error { // Delete all repository accesses and unwatch them. env, err := organization.AccessibleReposEnv(ctx, org, userID) if err != nil { - return fmt.Errorf("AccessibleReposEnv: %v", err) + return fmt.Errorf("AccessibleReposEnv: %w", err) } repoIDs, err := env.RepoIDs(1, org.NumRepos) if err != nil { - return fmt.Errorf("GetUserRepositories [%d]: %v", userID, err) + return fmt.Errorf("GetUserRepositories [%d]: %w", userID, err) } for _, repoID := range repoIDs { if err = repo_model.WatchRepo(ctx, userID, repoID, false); err != nil { diff --git a/models/org_team.go b/models/org_team.go index 6066e7f5c9..290b1c8b6a 100644 --- a/models/org_team.go +++ b/models/org_team.go @@ -31,23 +31,23 @@ func AddRepository(ctx context.Context, t *organization.Team, repo *repo_model.R } if err = organization.IncrTeamRepoNum(ctx, t.ID); err != nil { - return fmt.Errorf("update team: %v", err) + return fmt.Errorf("update team: %w", err) } t.NumRepos++ if err = access_model.RecalculateTeamAccesses(ctx, repo, 0); err != nil { - return fmt.Errorf("recalculateAccesses: %v", err) + return fmt.Errorf("recalculateAccesses: %w", err) } // Make all team members watch this repo if enabled in global settings if setting.Service.AutoWatchNewRepos { if err = t.GetMembersCtx(ctx); err != nil { - return fmt.Errorf("getMembers: %v", err) + return fmt.Errorf("getMembers: %w", err) } for _, u := range t.Members { if err = repo_model.WatchRepo(ctx, u.ID, repo.ID, true); err != nil { - return fmt.Errorf("watchRepo: %v", err) + return fmt.Errorf("watchRepo: %w", err) } } } @@ -60,13 +60,13 @@ func AddRepository(ctx context.Context, t *organization.Team, repo *repo_model.R func addAllRepositories(ctx context.Context, t *organization.Team) error { orgRepos, err := organization.GetOrgRepositories(ctx, t.OrgID) if err != nil { - return fmt.Errorf("get org repos: %v", err) + return fmt.Errorf("get org repos: %w", err) } for _, repo := range orgRepos { if !organization.HasTeamRepo(ctx, t.OrgID, t.ID, repo.ID) { if err := AddRepository(ctx, t, repo); err != nil { - return fmt.Errorf("AddRepository: %v", err) + return fmt.Errorf("AddRepository: %w", err) } } } @@ -180,7 +180,7 @@ func removeRepository(ctx context.Context, t *organization.Team, repo *repo_mode teamUsers, err := organization.GetTeamUsersByTeamID(ctx, t.ID) if err != nil { - return fmt.Errorf("getTeamUsersByTeamID: %v", err) + return fmt.Errorf("getTeamUsersByTeamID: %w", err) } for _, teamUser := range teamUsers { has, err := access_model.HasAccess(ctx, teamUser.UID, repo) @@ -287,7 +287,7 @@ func NewTeam(t *organization.Team) (err error) { if t.IncludesAllRepositories { err = addAllRepositories(ctx, t) if err != nil { - return fmt.Errorf("addAllRepositories: %v", err) + return fmt.Errorf("addAllRepositories: %w", err) } } @@ -329,7 +329,7 @@ func UpdateTeam(t *organization.Team, authChanged, includeAllChanged bool) (err if _, err = sess.ID(t.ID).Cols("name", "lower_name", "description", "can_create_org_repo", "authorize", "includes_all_repositories").Update(t); err != nil { - return fmt.Errorf("update: %v", err) + return fmt.Errorf("update: %w", err) } // update units for team @@ -351,12 +351,12 @@ func UpdateTeam(t *organization.Team, authChanged, includeAllChanged bool) (err // Update access for team members if needed. if authChanged { if err = t.GetRepositoriesCtx(ctx); err != nil { - return fmt.Errorf("getRepositories: %v", err) + return fmt.Errorf("getRepositories: %w", err) } for _, repo := range t.Repos { if err = access_model.RecalculateTeamAccesses(ctx, repo, 0); err != nil { - return fmt.Errorf("recalculateTeamAccesses: %v", err) + return fmt.Errorf("recalculateTeamAccesses: %w", err) } } } @@ -365,7 +365,7 @@ func UpdateTeam(t *organization.Team, authChanged, includeAllChanged bool) (err if includeAllChanged && t.IncludesAllRepositories { err = addAllRepositories(ctx, t) if err != nil { - return fmt.Errorf("addAllRepositories: %v", err) + return fmt.Errorf("addAllRepositories: %w", err) } } @@ -397,7 +397,7 @@ func DeleteTeam(t *organization.Team) error { builder.Select("id").From("repository").Where(builder.Eq{"owner_id": t.OrgID})). Find(&protections) if err != nil { - return fmt.Errorf("findProtectedBranches: %v", err) + return fmt.Errorf("findProtectedBranches: %w", err) } for _, p := range protections { var matched1, matched2, matched3 bool @@ -419,7 +419,7 @@ func DeleteTeam(t *organization.Team) error { "merge_whitelist_team_i_ds", "approvals_whitelist_team_i_ds", ).Update(p); err != nil { - return fmt.Errorf("updateProtectedBranches: %v", err) + return fmt.Errorf("updateProtectedBranches: %w", err) } } } @@ -496,14 +496,14 @@ func AddTeamMember(team *organization.Team, userID int64) error { And("mode < ?", team.AccessMode). SetExpr("mode", team.AccessMode). Update(new(access_model.Access)); err != nil { - return fmt.Errorf("update user accesses: %v", err) + return fmt.Errorf("update user accesses: %w", err) } // for not exist access var repoIDs []int64 accessSubQuery := builder.Select("repo_id").From("access").Where(builder.Eq{"user_id": userID}) if err := sess.SQL(subQuery.And(builder.NotIn("repo_id", accessSubQuery))).Find(&repoIDs); err != nil { - return fmt.Errorf("select id accesses: %v", err) + return fmt.Errorf("select id accesses: %w", err) } accesses := make([]*access_model.Access, 0, 100) @@ -511,7 +511,7 @@ func AddTeamMember(team *organization.Team, userID int64) error { accesses = append(accesses, &access_model.Access{RepoID: repoID, UserID: userID, Mode: team.AccessMode}) if (i%100 == 0 || i == len(repoIDs)-1) && len(accesses) > 0 { if err = db.Insert(ctx, accesses); err != nil { - return fmt.Errorf("insert new user accesses: %v", err) + return fmt.Errorf("insert new user accesses: %w", err) } accesses = accesses[:0] } diff --git a/models/organization/org.go b/models/organization/org.go index 58b58e6732..993ca3f10d 100644 --- a/models/organization/org.go +++ b/models/organization/org.go @@ -288,10 +288,10 @@ func CreateOrganization(org *Organization, owner *user_model.User) (err error) { } if err = db.Insert(ctx, org); err != nil { - return fmt.Errorf("insert organization: %v", err) + return fmt.Errorf("insert organization: %w", err) } if err = user_model.GenerateRandomAvatar(ctx, org.AsUser()); err != nil { - return fmt.Errorf("generate random avatar: %v", err) + return fmt.Errorf("generate random avatar: %w", err) } // Add initial creator to organization and owner team. @@ -299,7 +299,7 @@ func CreateOrganization(org *Organization, owner *user_model.User) (err error) { UID: owner.ID, OrgID: org.ID, }); err != nil { - return fmt.Errorf("insert org-user relation: %v", err) + return fmt.Errorf("insert org-user relation: %w", err) } // Create default owner team. @@ -313,7 +313,7 @@ func CreateOrganization(org *Organization, owner *user_model.User) (err error) { CanCreateOrgRepo: true, } if err = db.Insert(ctx, t); err != nil { - return fmt.Errorf("insert owner team: %v", err) + return fmt.Errorf("insert owner team: %w", err) } // insert units for team @@ -335,7 +335,7 @@ func CreateOrganization(org *Organization, owner *user_model.User) (err error) { OrgID: org.ID, TeamID: t.ID, }); err != nil { - return fmt.Errorf("insert team-user relation: %v", err) + return fmt.Errorf("insert team-user relation: %w", err) } return committer.Commit() @@ -372,11 +372,11 @@ func DeleteOrganization(ctx context.Context, org *Organization) error { &TeamUnit{OrgID: org.ID}, &TeamInvite{OrgID: org.ID}, ); err != nil { - return fmt.Errorf("DeleteBeans: %v", err) + return fmt.Errorf("DeleteBeans: %w", err) } if _, err := db.GetEngine(ctx).ID(org.ID).Delete(new(user_model.User)); err != nil { - return fmt.Errorf("Delete: %v", err) + return fmt.Errorf("Delete: %w", err) } return nil @@ -760,7 +760,7 @@ func (env *accessibleReposEnv) CountRepos() (int64, error) { Distinct("`repository`.id"). Count(&repo_model.Repository{}) if err != nil { - return 0, fmt.Errorf("count user repositories in organization: %v", err) + return 0, fmt.Errorf("count user repositories in organization: %w", err) } return repoCount, nil } @@ -785,7 +785,7 @@ func (env *accessibleReposEnv) RepoIDs(page, pageSize int) ([]int64, error) { func (env *accessibleReposEnv) Repos(page, pageSize int) ([]*repo_model.Repository, error) { repoIDs, err := env.RepoIDs(page, pageSize) if err != nil { - return nil, fmt.Errorf("GetUserRepositoryIDs: %v", err) + return nil, fmt.Errorf("GetUserRepositoryIDs: %w", err) } repos := make([]*repo_model.Repository, 0, len(repoIDs)) @@ -814,7 +814,7 @@ func (env *accessibleReposEnv) MirrorRepoIDs() ([]int64, error) { func (env *accessibleReposEnv) MirrorRepos() ([]*repo_model.Repository, error) { repoIDs, err := env.MirrorRepoIDs() if err != nil { - return nil, fmt.Errorf("MirrorRepoIDs: %v", err) + return nil, fmt.Errorf("MirrorRepoIDs: %w", err) } repos := make([]*repo_model.Repository, 0, len(repoIDs)) diff --git a/models/organization/org_user.go b/models/organization/org_user.go index a7bc8f7d4c..7a5d17a75a 100644 --- a/models/organization/org_user.go +++ b/models/organization/org_user.go @@ -118,7 +118,7 @@ func loadOrganizationOwners(ctx context.Context, users user_model.UserList, orgI And("team_id=?", ownerTeam.ID). Find(&ownerMaps) if err != nil { - return nil, fmt.Errorf("find team users: %v", err) + return nil, fmt.Errorf("find team users: %w", err) } return ownerMaps, nil } diff --git a/models/perm/access/access.go b/models/perm/access/access.go index 0e5e4ff2bb..7344e114a6 100644 --- a/models/perm/access/access.go +++ b/models/perm/access/access.go @@ -87,7 +87,7 @@ func updateUserAccess(accessMap map[int64]*userAccess, user *user_model.User, mo func refreshAccesses(ctx context.Context, repo *repo_model.Repository, accessMap map[int64]*userAccess) (err error) { minMode := perm.AccessModeRead if err := repo.GetOwner(ctx); err != nil { - return fmt.Errorf("GetOwner: %v", err) + return fmt.Errorf("GetOwner: %w", err) } // If the repo isn't private and isn't owned by a organization, @@ -111,14 +111,14 @@ func refreshAccesses(ctx context.Context, repo *repo_model.Repository, accessMap // Delete old accesses and insert new ones for repository. if _, err = db.DeleteByBean(ctx, &Access{RepoID: repo.ID}); err != nil { - return fmt.Errorf("delete old accesses: %v", err) + return fmt.Errorf("delete old accesses: %w", err) } if len(newAccesses) == 0 { return nil } if err = db.Insert(ctx, newAccesses); err != nil { - return fmt.Errorf("insert new accesses: %v", err) + return fmt.Errorf("insert new accesses: %w", err) } return nil } @@ -127,7 +127,7 @@ func refreshAccesses(ctx context.Context, repo *repo_model.Repository, accessMap func refreshCollaboratorAccesses(ctx context.Context, repoID int64, accessMap map[int64]*userAccess) error { collaborators, err := repo_model.GetCollaborators(ctx, repoID, db.ListOptions{}) if err != nil { - return fmt.Errorf("getCollaborations: %v", err) + return fmt.Errorf("getCollaborations: %w", err) } for _, c := range collaborators { if c.User.IsGhost() { @@ -151,7 +151,7 @@ func RecalculateTeamAccesses(ctx context.Context, repo *repo_model.Repository, i } if err = refreshCollaboratorAccesses(ctx, repo.ID, accessMap); err != nil { - return fmt.Errorf("refreshCollaboratorAccesses: %v", err) + return fmt.Errorf("refreshCollaboratorAccesses: %w", err) } teams, err := organization.FindOrgTeams(ctx, repo.Owner.ID) @@ -173,7 +173,7 @@ func RecalculateTeamAccesses(ctx context.Context, repo *repo_model.Repository, i } if err = t.GetMembersCtx(ctx); err != nil { - return fmt.Errorf("getMembers '%d': %v", t.ID, err) + return fmt.Errorf("getMembers '%d': %w", t.ID, err) } for _, m := range t.Members { updateUserAccess(accessMap, m, t.AccessMode) @@ -224,10 +224,10 @@ func RecalculateUserAccess(ctx context.Context, repo *repo_model.Repository, uid // Delete old user accesses and insert new one for repository. if _, err = e.Delete(&Access{RepoID: repo.ID, UserID: uid}); err != nil { - return fmt.Errorf("delete old user accesses: %v", err) + return fmt.Errorf("delete old user accesses: %w", err) } else if accessMode >= minMode { if err = db.Insert(ctx, &Access{RepoID: repo.ID, UserID: uid, Mode: accessMode}); err != nil { - return fmt.Errorf("insert new user accesses: %v", err) + return fmt.Errorf("insert new user accesses: %w", err) } } return nil @@ -241,7 +241,7 @@ func RecalculateAccesses(ctx context.Context, repo *repo_model.Repository) error accessMap := make(map[int64]*userAccess, 20) if err := refreshCollaboratorAccesses(ctx, repo.ID, accessMap); err != nil { - return fmt.Errorf("refreshCollaboratorAccesses: %v", err) + return fmt.Errorf("refreshCollaboratorAccesses: %w", err) } return refreshAccesses(ctx, repo, accessMap) } diff --git a/models/project/project.go b/models/project/project.go index af2c8ac2af..ccdf5342d4 100644 --- a/models/project/project.go +++ b/models/project/project.go @@ -147,7 +147,7 @@ func GetProjects(ctx context.Context, opts SearchOptions) ([]*Project, int64, er count, err := e.Where(cond).Count(new(Project)) if err != nil { - return nil, 0, fmt.Errorf("Count: %v", err) + return nil, 0, fmt.Errorf("Count: %w", err) } e = e.Where(cond) diff --git a/models/repo.go b/models/repo.go index 08fbb0abea..569dafee5f 100644 --- a/models/repo.go +++ b/models/repo.go @@ -74,12 +74,12 @@ func DeleteRepository(doer *user_model.User, uid, repoID int64) error { // Delete Deploy Keys deployKeys, err := asymkey_model.ListDeployKeys(ctx, &asymkey_model.ListDeployKeysOptions{RepoID: repoID}) if err != nil { - return fmt.Errorf("listDeployKeys: %v", err) + return fmt.Errorf("listDeployKeys: %w", err) } needRewriteKeysFile := len(deployKeys) > 0 for _, dKey := range deployKeys { if err := DeleteDeployKey(ctx, doer, dKey.ID); err != nil { - return fmt.Errorf("deleteDeployKeys: %v", err) + return fmt.Errorf("deleteDeployKeys: %w", err) } } @@ -152,7 +152,7 @@ func DeleteRepository(doer *user_model.User, uid, repoID int64) error { &repo_model.Watch{RepoID: repoID}, &webhook.Webhook{RepoID: repoID}, ); err != nil { - return fmt.Errorf("deleteBeans: %v", err) + return fmt.Errorf("deleteBeans: %w", err) } // Delete Labels and related objects @@ -178,7 +178,7 @@ func DeleteRepository(doer *user_model.User, uid, repoID int64) error { if repo.IsFork { if _, err := db.Exec(ctx, "UPDATE `repository` SET num_forks=num_forks-1 WHERE id=?", repo.ForkID); err != nil { - return fmt.Errorf("decrease fork count: %v", err) + return fmt.Errorf("decrease fork count: %w", err) } } @@ -193,7 +193,7 @@ func DeleteRepository(doer *user_model.User, uid, repoID int64) error { } if err := project_model.DeleteProjectByRepoIDCtx(ctx, repoID); err != nil { - return fmt.Errorf("unable to delete projects for repo[%d]: %v", repoID, err) + return fmt.Errorf("unable to delete projects for repo[%d]: %w", repoID, err) } // Remove LFS objects @@ -310,7 +310,7 @@ func DeleteRepository(doer *user_model.User, uid, repoID int64) error { if len(repo.Avatar) > 0 { if err := storage.RepoAvatars.Delete(repo.CustomAvatarRelativePath()); err != nil { - return fmt.Errorf("Failed to remove %s: %v", repo.Avatar, err) + return fmt.Errorf("Failed to remove %s: %w", repo.Avatar, err) } } @@ -404,24 +404,19 @@ func repoStatsCorrectIssueNumComments(ctx context.Context, id int64) error { } func repoStatsCorrectNumIssues(ctx context.Context, id int64) error { - return repoStatsCorrectNum(ctx, id, false, "num_issues") + return repo_model.UpdateRepoIssueNumbers(ctx, id, false, false) } func repoStatsCorrectNumPulls(ctx context.Context, id int64) error { - return repoStatsCorrectNum(ctx, id, true, "num_pulls") -} - -func repoStatsCorrectNum(ctx context.Context, id int64, isPull bool, field string) error { - _, err := db.GetEngine(ctx).Exec("UPDATE `repository` SET "+field+"=(SELECT COUNT(*) FROM `issue` WHERE repo_id=? AND is_pull=?) WHERE id=?", id, isPull, id) - return err + return repo_model.UpdateRepoIssueNumbers(ctx, id, true, false) } func repoStatsCorrectNumClosedIssues(ctx context.Context, id int64) error { - return repo_model.StatsCorrectNumClosed(ctx, id, false, "num_closed_issues") + return repo_model.UpdateRepoIssueNumbers(ctx, id, false, true) } func repoStatsCorrectNumClosedPulls(ctx context.Context, id int64) error { - return repo_model.StatsCorrectNumClosed(ctx, id, true, "num_closed_pulls") + return repo_model.UpdateRepoIssueNumbers(ctx, id, true, true) } func statsQuery(args ...interface{}) func(context.Context) ([]map[string][]byte, error) { @@ -619,18 +614,18 @@ func DeleteDeployKey(ctx context.Context, doer *user_model.User, id int64) error if asymkey_model.IsErrDeployKeyNotExist(err) { return nil } - return fmt.Errorf("GetDeployKeyByID: %v", err) + return fmt.Errorf("GetDeployKeyByID: %w", err) } // Check if user has access to delete this key. if !doer.IsAdmin { repo, err := repo_model.GetRepositoryByIDCtx(ctx, key.RepoID) if err != nil { - return fmt.Errorf("GetRepositoryByID: %v", err) + return fmt.Errorf("GetRepositoryByID: %w", err) } has, err := access_model.IsUserRepoAdmin(ctx, repo, doer) if err != nil { - return fmt.Errorf("GetUserRepoPermission: %v", err) + return fmt.Errorf("GetUserRepoPermission: %w", err) } else if !has { return asymkey_model.ErrKeyAccessDenied{ UserID: doer.ID, @@ -643,7 +638,7 @@ func DeleteDeployKey(ctx context.Context, doer *user_model.User, id int64) error if _, err := db.DeleteByBean(ctx, &asymkey_model.DeployKey{ ID: key.ID, }); err != nil { - return fmt.Errorf("delete deploy key [%d]: %v", key.ID, err) + return fmt.Errorf("delete deploy key [%d]: %w", key.ID, err) } // Check if this is the last reference to same key content. diff --git a/models/repo/attachment.go b/models/repo/attachment.go index 5d4e11ae72..180d7730ba 100644 --- a/models/repo/attachment.go +++ b/models/repo/attachment.go @@ -40,7 +40,7 @@ func init() { func (a *Attachment) IncreaseDownloadCount() error { // Update download count. if _, err := db.GetEngine(db.DefaultContext).Exec("UPDATE `attachment` SET download_count=download_count+1 WHERE id=?", a.ID); err != nil { - return fmt.Errorf("increase attachment count: %v", err) + return fmt.Errorf("increase attachment count: %w", err) } return nil diff --git a/models/repo/avatar.go b/models/repo/avatar.go index cdf85bf1ac..1bc37598fe 100644 --- a/models/repo/avatar.go +++ b/models/repo/avatar.go @@ -36,7 +36,7 @@ func generateRandomAvatar(ctx context.Context, repo *Repository) error { seed := idToString img, err := avatar.RandomImage([]byte(seed)) if err != nil { - return fmt.Errorf("RandomImage: %v", err) + return fmt.Errorf("RandomImage: %w", err) } repo.Avatar = idToString @@ -47,7 +47,7 @@ func generateRandomAvatar(ctx context.Context, repo *Repository) error { } return err }); err != nil { - return fmt.Errorf("Failed to create dir %s: %v", repo.CustomAvatarRelativePath(), err) + return fmt.Errorf("Failed to create dir %s: %w", repo.CustomAvatarRelativePath(), err) } log.Info("New random avatar created for repository: %d", repo.ID) diff --git a/models/repo/collaboration.go b/models/repo/collaboration.go index be05eba74c..0aaa749210 100644 --- a/models/repo/collaboration.go +++ b/models/repo/collaboration.go @@ -40,7 +40,7 @@ type Collaborator struct { func GetCollaborators(ctx context.Context, repoID int64, listOptions db.ListOptions) ([]*Collaborator, error) { collaborations, err := getCollaborations(ctx, repoID, listOptions) if err != nil { - return nil, fmt.Errorf("getCollaborations: %v", err) + return nil, fmt.Errorf("getCollaborations: %w", err) } collaborators := make([]*Collaborator, 0, len(collaborations)) @@ -114,7 +114,7 @@ func ChangeCollaborationAccessModeCtx(ctx context.Context, repo *Repository, uid } has, err := e.Get(collaboration) if err != nil { - return fmt.Errorf("get collaboration: %v", err) + return fmt.Errorf("get collaboration: %w", err) } else if !has { return nil } @@ -128,9 +128,9 @@ func ChangeCollaborationAccessModeCtx(ctx context.Context, repo *Repository, uid ID(collaboration.ID). Cols("mode"). Update(collaboration); err != nil { - return fmt.Errorf("update collaboration: %v", err) + return fmt.Errorf("update collaboration: %w", err) } else if _, err = e.Exec("UPDATE access SET mode = ? WHERE user_id = ? AND repo_id = ?", mode, uid, repo.ID); err != nil { - return fmt.Errorf("update access table: %v", err) + return fmt.Errorf("update access table: %w", err) } return nil diff --git a/models/repo/release.go b/models/repo/release.go index 2e7bc6d322..14428f15f7 100644 --- a/models/repo/release.go +++ b/models/repo/release.go @@ -156,7 +156,7 @@ func AddReleaseAttachments(ctx context.Context, releaseID int64, attachmentUUIDs // Check attachments attachments, err := GetAttachmentsByUUIDs(ctx, attachmentUUIDs) if err != nil { - return fmt.Errorf("GetAttachmentsByUUIDs [uuids: %v]: %v", attachmentUUIDs, err) + return fmt.Errorf("GetAttachmentsByUUIDs [uuids: %v]: %w", attachmentUUIDs, err) } for i := range attachments { @@ -166,7 +166,7 @@ func AddReleaseAttachments(ctx context.Context, releaseID int64, attachmentUUIDs attachments[i].ReleaseID = releaseID // No assign value could be 0, so ignore AllCols(). if _, err = db.GetEngine(ctx).ID(attachments[i].ID).Update(attachments[i]); err != nil { - return fmt.Errorf("update attachment [%d]: %v", attachments[i].ID, err) + return fmt.Errorf("update attachment [%d]: %w", attachments[i].ID, err) } } @@ -413,7 +413,7 @@ func PushUpdateDeleteTagsContext(ctx context.Context, repo *Repository, tags []s Where("repo_id = ? AND is_tag = ?", repo.ID, true). In("lower_tag_name", lowerTags). Delete(new(Release)); err != nil { - return fmt.Errorf("Delete: %v", err) + return fmt.Errorf("Delete: %w", err) } if _, err := db.GetEngine(ctx). @@ -423,7 +423,7 @@ func PushUpdateDeleteTagsContext(ctx context.Context, repo *Repository, tags []s Update(&Release{ IsDraft: true, }); err != nil { - return fmt.Errorf("Update: %v", err) + return fmt.Errorf("Update: %w", err) } return nil @@ -436,18 +436,18 @@ func PushUpdateDeleteTag(repo *Repository, tagName string) error { if IsErrReleaseNotExist(err) { return nil } - return fmt.Errorf("GetRelease: %v", err) + return fmt.Errorf("GetRelease: %w", err) } if rel.IsTag { if _, err = db.GetEngine(db.DefaultContext).ID(rel.ID).Delete(new(Release)); err != nil { - return fmt.Errorf("Delete: %v", err) + return fmt.Errorf("Delete: %w", err) } } else { rel.IsDraft = true rel.NumCommits = 0 rel.Sha1 = "" if _, err = db.GetEngine(db.DefaultContext).ID(rel.ID).AllCols().Update(rel); err != nil { - return fmt.Errorf("Update: %v", err) + return fmt.Errorf("Update: %w", err) } } @@ -458,13 +458,13 @@ func PushUpdateDeleteTag(repo *Repository, tagName string) error { func SaveOrUpdateTag(repo *Repository, newRel *Release) error { rel, err := GetRelease(repo.ID, newRel.TagName) if err != nil && !IsErrReleaseNotExist(err) { - return fmt.Errorf("GetRelease: %v", err) + return fmt.Errorf("GetRelease: %w", err) } if rel == nil { rel = newRel if _, err = db.GetEngine(db.DefaultContext).Insert(rel); err != nil { - return fmt.Errorf("InsertOne: %v", err) + return fmt.Errorf("InsertOne: %w", err) } } else { rel.Sha1 = newRel.Sha1 @@ -475,7 +475,7 @@ func SaveOrUpdateTag(repo *Repository, newRel *Release) error { rel.PublisherID = newRel.PublisherID } if _, err = db.GetEngine(db.DefaultContext).ID(rel.ID).AllCols().Update(rel); err != nil { - return fmt.Errorf("Update: %v", err) + return fmt.Errorf("Update: %w", err) } } return nil diff --git a/models/repo/repo.go b/models/repo/repo.go index ce698baaef..77e0367a5a 100644 --- a/models/repo/repo.go +++ b/models/repo/repo.go @@ -760,40 +760,35 @@ func CountRepositories(ctx context.Context, opts CountRepositoryOptions) (int64, count, err := sess.Count(new(Repository)) if err != nil { - return 0, fmt.Errorf("countRepositories: %v", err) + return 0, fmt.Errorf("countRepositories: %w", err) } return count, nil } -// StatsCorrectNumClosed update repository's issue related numbers -func StatsCorrectNumClosed(ctx context.Context, id int64, isPull bool, field string) error { - _, err := db.Exec(ctx, "UPDATE `repository` SET "+field+"=(SELECT COUNT(*) FROM `issue` WHERE repo_id=? AND is_closed=? AND is_pull=?) WHERE id=?", id, true, isPull, id) - return err -} - -// UpdateRepoIssueNumbers update repository issue numbers +// UpdateRepoIssueNumbers updates one of a repositories amount of (open|closed) (issues|PRs) with the current count func UpdateRepoIssueNumbers(ctx context.Context, repoID int64, isPull, isClosed bool) error { - e := db.GetEngine(ctx) - if isPull { - if _, err := e.ID(repoID).Decr("num_pulls").Update(new(Repository)); err != nil { - return err - } - if isClosed { - if _, err := e.ID(repoID).Decr("num_closed_pulls").Update(new(Repository)); err != nil { - return err - } - } - } else { - if _, err := e.ID(repoID).Decr("num_issues").Update(new(Repository)); err != nil { - return err - } - if isClosed { - if _, err := e.ID(repoID).Decr("num_closed_issues").Update(new(Repository)); err != nil { - return err - } - } + field := "num_" + if isClosed { + field += "closed_" } - return nil + if isPull { + field += "pulls" + } else { + field += "issues" + } + + subQuery := builder.Select("count(*)"). + From("issue").Where(builder.Eq{ + "repo_id": repoID, + "is_pull": isPull, + }.And(builder.If(isClosed, builder.Eq{"is_closed": isClosed}))) + + // builder.Update(cond) will generate SQL like UPDATE ... SET cond + query := builder.Update(builder.Eq{field: subQuery}). + From("repository"). + Where(builder.Eq{"id": repoID}) + _, err := db.Exec(ctx, query) + return err } // CountNullArchivedRepository counts the number of repositories with is_archived is null diff --git a/models/repo/repo_indexer.go b/models/repo/repo_indexer.go index cba70a14e5..67ba3382dc 100644 --- a/models/repo/repo_indexer.go +++ b/models/repo/repo_indexer.go @@ -95,13 +95,13 @@ func GetIndexerStatus(ctx context.Context, repo *Repository, indexerType RepoInd func UpdateIndexerStatus(ctx context.Context, repo *Repository, indexerType RepoIndexerType, sha string) error { status, err := GetIndexerStatus(ctx, repo, indexerType) if err != nil { - return fmt.Errorf("UpdateIndexerStatus: Unable to getIndexerStatus for repo: %s Error: %v", repo.FullName(), err) + return fmt.Errorf("UpdateIndexerStatus: Unable to getIndexerStatus for repo: %s Error: %w", repo.FullName(), err) } if len(status.CommitSha) == 0 { status.CommitSha = sha if err := db.Insert(ctx, status); err != nil { - return fmt.Errorf("UpdateIndexerStatus: Unable to insert repoIndexerStatus for repo: %s Sha: %s Error: %v", repo.FullName(), sha, err) + return fmt.Errorf("UpdateIndexerStatus: Unable to insert repoIndexerStatus for repo: %s Sha: %s Error: %w", repo.FullName(), sha, err) } return nil } @@ -109,7 +109,7 @@ func UpdateIndexerStatus(ctx context.Context, repo *Repository, indexerType Repo _, err = db.GetEngine(ctx).ID(status.ID).Cols("commit_sha"). Update(status) if err != nil { - return fmt.Errorf("UpdateIndexerStatus: Unable to update repoIndexerStatus for repo: %s Sha: %s Error: %v", repo.FullName(), sha, err) + return fmt.Errorf("UpdateIndexerStatus: Unable to update repoIndexerStatus for repo: %s Sha: %s Error: %w", repo.FullName(), sha, err) } return nil } diff --git a/models/repo/repo_list.go b/models/repo/repo_list.go index 0cd0a3c8e3..191970d275 100644 --- a/models/repo/repo_list.go +++ b/models/repo/repo_list.go @@ -81,7 +81,7 @@ func (repos RepositoryList) loadAttributes(ctx context.Context) error { Where("id > 0"). In("id", set.Values()). Find(&users); err != nil { - return fmt.Errorf("find users: %v", err) + return fmt.Errorf("find users: %w", err) } for i := range repos { repos[i].Owner = users[repos[i].OwnerID] @@ -93,7 +93,7 @@ func (repos RepositoryList) loadAttributes(ctx context.Context) error { Where("`is_primary` = ? AND `language` != ?", true, "other"). In("`repo_id`", repoIDs). Find(&stats); err != nil { - return fmt.Errorf("find primary languages: %v", err) + return fmt.Errorf("find primary languages: %w", err) } stats.LoadAttributes() for i := range repos { @@ -537,7 +537,7 @@ func SearchRepositoryByCondition(opts *SearchRepoOptions, cond builder.Cond, loa } repos := make(RepositoryList, 0, defaultSize) if err := sess.Find(&repos); err != nil { - return nil, 0, fmt.Errorf("Repo: %v", err) + return nil, 0, fmt.Errorf("Repo: %w", err) } if opts.PageSize <= 0 { @@ -546,7 +546,7 @@ func SearchRepositoryByCondition(opts *SearchRepoOptions, cond builder.Cond, loa if loadAttributes { if err := repos.loadAttributes(ctx); err != nil { - return nil, 0, fmt.Errorf("LoadAttributes: %v", err) + return nil, 0, fmt.Errorf("LoadAttributes: %w", err) } } @@ -582,7 +582,7 @@ func searchRepositoryByCondition(ctx context.Context, opts *SearchRepoOptions, c Where(cond). Count(new(Repository)) if err != nil { - return nil, 0, fmt.Errorf("Count: %v", err) + return nil, 0, fmt.Errorf("Count: %w", err) } } @@ -725,7 +725,7 @@ func GetUserRepositories(opts *SearchRepoOptions) (RepositoryList, int64, error) count, err := sess.Where(cond).Count(new(Repository)) if err != nil { - return nil, 0, fmt.Errorf("Count: %v", err) + return nil, 0, fmt.Errorf("Count: %w", err) } sess = sess.Where(cond).OrderBy(opts.OrderBy.String()) diff --git a/models/repo/update.go b/models/repo/update.go index 64a225d2f5..cc21deb0bc 100644 --- a/models/repo/update.go +++ b/models/repo/update.go @@ -119,7 +119,7 @@ func CheckCreateRepository(doer, u *user_model.User, name string, overwriteOrAdo has, err := IsRepositoryExist(db.DefaultContext, u, name) if err != nil { - return fmt.Errorf("IsRepositoryExist: %v", err) + return fmt.Errorf("IsRepositoryExist: %w", err) } else if has { return ErrRepoAlreadyExist{u.Name, name} } @@ -150,14 +150,14 @@ func ChangeRepositoryName(doer *user_model.User, repo *Repository, newRepoName s has, err := IsRepositoryExist(db.DefaultContext, repo.Owner, newRepoName) if err != nil { - return fmt.Errorf("IsRepositoryExist: %v", err) + return fmt.Errorf("IsRepositoryExist: %w", err) } else if has { return ErrRepoAlreadyExist{repo.Owner.Name, newRepoName} } newRepoPath := RepoPath(repo.Owner.Name, newRepoName) if err = util.Rename(repo.RepoPath(), newRepoPath); err != nil { - return fmt.Errorf("rename repository directory: %v", err) + return fmt.Errorf("rename repository directory: %w", err) } wikiPath := repo.WikiPath() @@ -168,7 +168,7 @@ func ChangeRepositoryName(doer *user_model.User, repo *Repository, newRepoName s } if isExist { if err = util.Rename(wikiPath, WikiPath(repo.Owner.Name, newRepoName)); err != nil { - return fmt.Errorf("rename repository wiki: %v", err) + return fmt.Errorf("rename repository wiki: %w", err) } } diff --git a/models/repo/upload.go b/models/repo/upload.go index e3ce7e458f..e115c8e50e 100644 --- a/models/repo/upload.go +++ b/models/repo/upload.go @@ -70,19 +70,19 @@ func NewUpload(name string, buf []byte, file multipart.File) (_ *Upload, err err localPath := upload.LocalPath() if err = os.MkdirAll(path.Dir(localPath), os.ModePerm); err != nil { - return nil, fmt.Errorf("MkdirAll: %v", err) + return nil, fmt.Errorf("MkdirAll: %w", err) } fw, err := os.Create(localPath) if err != nil { - return nil, fmt.Errorf("Create: %v", err) + return nil, fmt.Errorf("Create: %w", err) } defer fw.Close() if _, err = fw.Write(buf); err != nil { - return nil, fmt.Errorf("Write: %v", err) + return nil, fmt.Errorf("Write: %w", err) } else if _, err = io.Copy(fw, file); err != nil { - return nil, fmt.Errorf("Copy: %v", err) + return nil, fmt.Errorf("Copy: %w", err) } if _, err := db.GetEngine(db.DefaultContext).Insert(upload); err != nil { @@ -134,7 +134,7 @@ func DeleteUploads(uploads ...*Upload) (err error) { if _, err = db.GetEngine(ctx). In("id", ids). Delete(new(Upload)); err != nil { - return fmt.Errorf("delete uploads: %v", err) + return fmt.Errorf("delete uploads: %w", err) } if err = committer.Commit(); err != nil { @@ -152,7 +152,7 @@ func DeleteUploads(uploads ...*Upload) (err error) { } if err := util.Remove(localPath); err != nil { - return fmt.Errorf("remove upload: %v", err) + return fmt.Errorf("remove upload: %w", err) } } @@ -166,11 +166,11 @@ func DeleteUploadByUUID(uuid string) error { if IsErrUploadNotExist(err) { return nil } - return fmt.Errorf("GetUploadByUUID: %v", err) + return fmt.Errorf("GetUploadByUUID: %w", err) } if err := DeleteUploads(upload); err != nil { - return fmt.Errorf("DeleteUpload: %v", err) + return fmt.Errorf("DeleteUpload: %w", err) } return nil diff --git a/models/repo_collaboration.go b/models/repo_collaboration.go index 05df2f29aa..58d6b0f488 100644 --- a/models/repo_collaboration.go +++ b/models/repo_collaboration.go @@ -66,7 +66,7 @@ func reconsiderRepoIssuesAssignee(ctx context.Context, repo *repo_model.Reposito if _, err := db.GetEngine(ctx).Where(builder.Eq{"assignee_id": uid}). In("issue_id", builder.Select("id").From("issue").Where(builder.Eq{"repo_id": repo.ID})). Delete(&issues_model.IssueAssignees{}); err != nil { - return fmt.Errorf("Could not delete assignee[%d] %v", uid, err) + return fmt.Errorf("Could not delete assignee[%d] %w", uid, err) } return nil } diff --git a/models/repo_transfer.go b/models/repo_transfer.go index 636d49b989..d6a3985fe5 100644 --- a/models/repo_transfer.go +++ b/models/repo_transfer.go @@ -179,7 +179,7 @@ func CreatePendingRepositoryTransfer(doer, newOwner *user_model.User, repoID int // Check if new owner has repository with same name. if has, err := repo_model.IsRepositoryExist(ctx, newOwner, repo.Name); err != nil { - return fmt.Errorf("IsRepositoryExist: %v", err) + return fmt.Errorf("IsRepositoryExist: %w", err) } else if has { return repo_model.ErrRepoAlreadyExist{ Uname: newOwner.LowerName, @@ -253,13 +253,13 @@ func TransferOwnership(doer *user_model.User, newOwnerName string, repo *repo_mo newOwner, err := user_model.GetUserByName(ctx, newOwnerName) if err != nil { - return fmt.Errorf("get new owner '%s': %v", newOwnerName, err) + return fmt.Errorf("get new owner '%s': %w", newOwnerName, err) } newOwnerName = newOwner.Name // ensure capitalisation matches // Check if new owner has repository with same name. if has, err := repo_model.IsRepositoryExist(ctx, newOwner, repo.Name); err != nil { - return fmt.Errorf("IsRepositoryExist: %v", err) + return fmt.Errorf("IsRepositoryExist: %w", err) } else if has { return repo_model.ErrRepoAlreadyExist{ Uname: newOwnerName, @@ -278,13 +278,13 @@ func TransferOwnership(doer *user_model.User, newOwnerName string, repo *repo_mo // Update repository. if _, err := sess.ID(repo.ID).Update(repo); err != nil { - return fmt.Errorf("update owner: %v", err) + return fmt.Errorf("update owner: %w", err) } // Remove redundant collaborators. collaborators, err := repo_model.GetCollaborators(ctx, repo.ID, db.ListOptions{}) if err != nil { - return fmt.Errorf("getCollaborators: %v", err) + return fmt.Errorf("getCollaborators: %w", err) } // Dummy object. @@ -293,7 +293,7 @@ func TransferOwnership(doer *user_model.User, newOwnerName string, repo *repo_mo if c.IsGhost() { collaboration.ID = c.Collaboration.ID if _, err := sess.Delete(collaboration); err != nil { - return fmt.Errorf("remove collaborator '%d': %v", c.ID, err) + return fmt.Errorf("remove collaborator '%d': %w", c.ID, err) } collaboration.ID = 0 } @@ -301,14 +301,14 @@ func TransferOwnership(doer *user_model.User, newOwnerName string, repo *repo_mo if c.ID != newOwner.ID { isMember, err := organization.IsOrganizationMember(ctx, newOwner.ID, c.ID) if err != nil { - return fmt.Errorf("IsOrgMember: %v", err) + return fmt.Errorf("IsOrgMember: %w", err) } else if !isMember { continue } } collaboration.UserID = c.ID if _, err := sess.Delete(collaboration); err != nil { - return fmt.Errorf("remove collaborator '%d': %v", c.ID, err) + return fmt.Errorf("remove collaborator '%d': %w", c.ID, err) } collaboration.UserID = 0 } @@ -316,42 +316,42 @@ func TransferOwnership(doer *user_model.User, newOwnerName string, repo *repo_mo // Remove old team-repository relations. if oldOwner.IsOrganization() { if err := organization.RemoveOrgRepo(ctx, oldOwner.ID, repo.ID); err != nil { - return fmt.Errorf("removeOrgRepo: %v", err) + return fmt.Errorf("removeOrgRepo: %w", err) } } if newOwner.IsOrganization() { teams, err := organization.FindOrgTeams(ctx, newOwner.ID) if err != nil { - return fmt.Errorf("LoadTeams: %v", err) + return fmt.Errorf("LoadTeams: %w", err) } for _, t := range teams { if t.IncludesAllRepositories { if err := AddRepository(ctx, t, repo); err != nil { - return fmt.Errorf("AddRepository: %v", err) + return fmt.Errorf("AddRepository: %w", err) } } } } else if err := access_model.RecalculateAccesses(ctx, repo); err != nil { // Organization called this in addRepository method. - return fmt.Errorf("recalculateAccesses: %v", err) + return fmt.Errorf("recalculateAccesses: %w", err) } // Update repository count. if _, err := sess.Exec("UPDATE `user` SET num_repos=num_repos+1 WHERE id=?", newOwner.ID); err != nil { - return fmt.Errorf("increase new owner repository count: %v", err) + return fmt.Errorf("increase new owner repository count: %w", err) } else if _, err := sess.Exec("UPDATE `user` SET num_repos=num_repos-1 WHERE id=?", oldOwner.ID); err != nil { - return fmt.Errorf("decrease old owner repository count: %v", err) + return fmt.Errorf("decrease old owner repository count: %w", err) } if err := repo_model.WatchRepo(ctx, doer.ID, repo.ID, true); err != nil { - return fmt.Errorf("watchRepo: %v", err) + return fmt.Errorf("watchRepo: %w", err) } // Remove watch for organization. if oldOwner.IsOrganization() { if err := repo_model.WatchRepo(ctx, oldOwner.ID, repo.ID, false); err != nil { - return fmt.Errorf("watchRepo [false]: %v", err) + return fmt.Errorf("watchRepo [false]: %w", err) } } @@ -366,7 +366,7 @@ func TransferOwnership(doer *user_model.User, newOwnerName string, repo *repo_mo WHERE issue.repo_id = ? AND ((label.org_id = 0 AND issue.repo_id != label.repo_id) OR (label.repo_id = 0 AND label.org_id != ?)) ) AS il_too )`, repo.ID, newOwner.ID); err != nil { - return fmt.Errorf("Unable to remove old org labels: %v", err) + return fmt.Errorf("Unable to remove old org labels: %w", err) } if _, err := sess.Exec(`DELETE FROM comment WHERE comment.id IN ( @@ -378,7 +378,7 @@ func TransferOwnership(doer *user_model.User, newOwnerName string, repo *repo_mo WHERE com.type = ? AND issue.repo_id = ? AND ((label.org_id = 0 AND issue.repo_id != label.repo_id) OR (label.repo_id = 0 AND label.org_id != ?)) ) AS il_too)`, issues_model.CommentTypeLabel, repo.ID, newOwner.ID); err != nil { - return fmt.Errorf("Unable to remove old org label comments: %v", err) + return fmt.Errorf("Unable to remove old org label comments: %w", err) } } @@ -386,11 +386,11 @@ func TransferOwnership(doer *user_model.User, newOwnerName string, repo *repo_mo dir := user_model.UserPath(newOwner.Name) if err := os.MkdirAll(dir, os.ModePerm); err != nil { - return fmt.Errorf("Failed to create dir %s: %v", dir, err) + return fmt.Errorf("Failed to create dir %s: %w", dir, err) } if err := util.Rename(repo_model.RepoPath(oldOwner.Name, repo.Name), repo_model.RepoPath(newOwner.Name, repo.Name)); err != nil { - return fmt.Errorf("rename repository directory: %v", err) + return fmt.Errorf("rename repository directory: %w", err) } repoRenamed = true @@ -402,13 +402,13 @@ func TransferOwnership(doer *user_model.User, newOwnerName string, repo *repo_mo return err } else if isExist { if err := util.Rename(wikiPath, repo_model.WikiPath(newOwner.Name, repo.Name)); err != nil { - return fmt.Errorf("rename repository wiki: %v", err) + return fmt.Errorf("rename repository wiki: %w", err) } wikiRenamed = true } if err := deleteRepositoryTransfer(ctx, repo.ID); err != nil { - return fmt.Errorf("deleteRepositoryTransfer: %v", err) + return fmt.Errorf("deleteRepositoryTransfer: %w", err) } repo.Status = repo_model.RepositoryReady if err := repo_model.UpdateRepositoryCols(ctx, repo, "status"); err != nil { @@ -417,11 +417,11 @@ func TransferOwnership(doer *user_model.User, newOwnerName string, repo *repo_mo // If there was previously a redirect at this location, remove it. if err := repo_model.DeleteRedirect(ctx, newOwner.ID, repo.Name); err != nil { - return fmt.Errorf("delete repo redirect: %v", err) + return fmt.Errorf("delete repo redirect: %w", err) } if err := repo_model.NewRedirect(ctx, oldOwner.ID, repo.ID, repo.Name, repo.Name); err != nil { - return fmt.Errorf("repo_model.NewRedirect: %v", err) + return fmt.Errorf("repo_model.NewRedirect: %w", err) } return committer.Commit() diff --git a/models/system/setting.go b/models/system/setting.go index ff8b48e618..9711d38f3b 100644 --- a/models/system/setting.go +++ b/models/system/setting.go @@ -243,7 +243,7 @@ func Init() error { var err error GravatarSourceURL, err = url.Parse(setting.GravatarSource) if err != nil { - return fmt.Errorf("Failed to parse Gravatar URL(%s): %v", setting.GravatarSource, err) + return fmt.Errorf("Failed to parse Gravatar URL(%s): %w", setting.GravatarSource, err) } } diff --git a/models/user.go b/models/user.go index 68be0d8555..85f465127a 100644 --- a/models/user.go +++ b/models/user.go @@ -35,10 +35,10 @@ func DeleteUser(ctx context.Context, u *user_model.User, purge bool) (err error) watchedRepoIDs := make([]int64, 0, 10) if err = e.Table("watch").Cols("watch.repo_id"). Where("watch.user_id = ?", u.ID).And("watch.mode <>?", repo_model.WatchModeDont).Find(&watchedRepoIDs); err != nil { - return fmt.Errorf("get all watches: %v", err) + return fmt.Errorf("get all watches: %w", err) } if _, err = e.Decr("num_watches").In("id", watchedRepoIDs).NoAutoTime().Update(new(repo_model.Repository)); err != nil { - return fmt.Errorf("decrease repository num_watches: %v", err) + return fmt.Errorf("decrease repository num_watches: %w", err) } // ***** END: Watch ***** @@ -46,9 +46,9 @@ func DeleteUser(ctx context.Context, u *user_model.User, purge bool) (err error) starredRepoIDs := make([]int64, 0, 10) if err = e.Table("star").Cols("star.repo_id"). Where("star.uid = ?", u.ID).Find(&starredRepoIDs); err != nil { - return fmt.Errorf("get all stars: %v", err) + return fmt.Errorf("get all stars: %w", err) } else if _, err = e.Decr("num_stars").In("id", starredRepoIDs).NoAutoTime().Update(new(repo_model.Repository)); err != nil { - return fmt.Errorf("decrease repository num_stars: %v", err) + return fmt.Errorf("decrease repository num_stars: %w", err) } // ***** END: Star ***** @@ -56,17 +56,17 @@ func DeleteUser(ctx context.Context, u *user_model.User, purge bool) (err error) followeeIDs := make([]int64, 0, 10) if err = e.Table("follow").Cols("follow.follow_id"). Where("follow.user_id = ?", u.ID).Find(&followeeIDs); err != nil { - return fmt.Errorf("get all followees: %v", err) + return fmt.Errorf("get all followees: %w", err) } else if _, err = e.Decr("num_followers").In("id", followeeIDs).Update(new(user_model.User)); err != nil { - return fmt.Errorf("decrease user num_followers: %v", err) + return fmt.Errorf("decrease user num_followers: %w", err) } followerIDs := make([]int64, 0, 10) if err = e.Table("follow").Cols("follow.user_id"). Where("follow.follow_id = ?", u.ID).Find(&followerIDs); err != nil { - return fmt.Errorf("get all followers: %v", err) + return fmt.Errorf("get all followers: %w", err) } else if _, err = e.Decr("num_following").In("id", followerIDs).Update(new(user_model.User)); err != nil { - return fmt.Errorf("decrease user num_following: %v", err) + return fmt.Errorf("decrease user num_following: %w", err) } // ***** END: Follow ***** @@ -90,7 +90,7 @@ func DeleteUser(ctx context.Context, u *user_model.User, purge bool) (err error) &pull_model.AutoMerge{DoerID: u.ID}, &pull_model.ReviewState{UserID: u.ID}, ); err != nil { - return fmt.Errorf("deleteBeans: %v", err) + return fmt.Errorf("deleteBeans: %w", err) } if err := auth_model.DeleteOAuth2RelictsByUserID(ctx, u.ID); err != nil { @@ -135,7 +135,7 @@ func DeleteUser(ctx context.Context, u *user_model.User, purge bool) (err error) // Also, as we didn't update branch protections when removing entries from `access` table, // it's safer to iterate all protected branches. if err = e.Limit(batchSize, start).Find(&protections); err != nil { - return fmt.Errorf("findProtectedBranches: %v", err) + return fmt.Errorf("findProtectedBranches: %w", err) } if len(protections) == 0 { break @@ -160,7 +160,7 @@ func DeleteUser(ctx context.Context, u *user_model.User, purge bool) (err error) "merge_whitelist_user_i_ds", "approvals_whitelist_user_i_ds", ).Update(p); err != nil { - return fmt.Errorf("updateProtectedBranches: %v", err) + return fmt.Errorf("updateProtectedBranches: %w", err) } } } @@ -170,39 +170,39 @@ func DeleteUser(ctx context.Context, u *user_model.User, purge bool) (err error) // ***** START: PublicKey ***** if _, err = db.DeleteByBean(ctx, &asymkey_model.PublicKey{OwnerID: u.ID}); err != nil { - return fmt.Errorf("deletePublicKeys: %v", err) + return fmt.Errorf("deletePublicKeys: %w", err) } // ***** END: PublicKey ***** // ***** START: GPGPublicKey ***** keys, err := asymkey_model.ListGPGKeys(ctx, u.ID, db.ListOptions{}) if err != nil { - return fmt.Errorf("ListGPGKeys: %v", err) + return fmt.Errorf("ListGPGKeys: %w", err) } // Delete GPGKeyImport(s). for _, key := range keys { if _, err = db.DeleteByBean(ctx, &asymkey_model.GPGKeyImport{KeyID: key.KeyID}); err != nil { - return fmt.Errorf("deleteGPGKeyImports: %v", err) + return fmt.Errorf("deleteGPGKeyImports: %w", err) } } if _, err = db.DeleteByBean(ctx, &asymkey_model.GPGKey{OwnerID: u.ID}); err != nil { - return fmt.Errorf("deleteGPGKeys: %v", err) + return fmt.Errorf("deleteGPGKeys: %w", err) } // ***** END: GPGPublicKey ***** // Clear assignee. if _, err = db.DeleteByBean(ctx, &issues_model.IssueAssignees{AssigneeID: u.ID}); err != nil { - return fmt.Errorf("clear assignee: %v", err) + return fmt.Errorf("clear assignee: %w", err) } // ***** START: ExternalLoginUser ***** if err = user_model.RemoveAllAccountLinks(ctx, u); err != nil { - return fmt.Errorf("ExternalLoginUser: %v", err) + return fmt.Errorf("ExternalLoginUser: %w", err) } // ***** END: ExternalLoginUser ***** if _, err = e.ID(u.ID).Delete(new(user_model.User)); err != nil { - return fmt.Errorf("delete: %v", err) + return fmt.Errorf("delete: %w", err) } return nil diff --git a/models/user/avatar.go b/models/user/avatar.go index 1c75c7406b..f73ac56c5e 100644 --- a/models/user/avatar.go +++ b/models/user/avatar.go @@ -35,7 +35,7 @@ func GenerateRandomAvatar(ctx context.Context, u *User) error { img, err := avatar.RandomImage([]byte(seed)) if err != nil { - return fmt.Errorf("RandomImage: %v", err) + return fmt.Errorf("RandomImage: %w", err) } u.Avatar = avatars.HashEmail(seed) @@ -47,7 +47,7 @@ func GenerateRandomAvatar(ctx context.Context, u *User) error { } return err }); err != nil { - return fmt.Errorf("Failed to create dir %s: %v", u.CustomAvatarRelativePath(), err) + return fmt.Errorf("Failed to create dir %s: %w", u.CustomAvatarRelativePath(), err) } if _, err := db.GetEngine(ctx).ID(u.ID).Cols("avatar").Update(u); err != nil { diff --git a/models/user/email_address.go b/models/user/email_address.go index 964e7ae08c..d6279b6639 100644 --- a/models/user/email_address.go +++ b/models/user/email_address.go @@ -264,7 +264,7 @@ func AddEmailAddresses(emails []*EmailAddress) error { } if err := db.Insert(db.DefaultContext, emails); err != nil { - return fmt.Errorf("Insert: %v", err) + return fmt.Errorf("Insert: %w", err) } return nil @@ -485,7 +485,7 @@ func SearchEmails(opts *SearchEmailOptions) ([]*SearchEmailResult, int64, error) count, err := db.GetEngine(db.DefaultContext).Join("INNER", "`user`", "`user`.ID = email_address.uid"). Where(cond).Count(new(EmailAddress)) if err != nil { - return nil, 0, fmt.Errorf("Count: %v", err) + return nil, 0, fmt.Errorf("Count: %w", err) } orderby := opts.SortType.String() @@ -530,7 +530,7 @@ func ActivateUserEmail(userID int64, email string, activate bool) (err error) { } if activate { if used, err := IsEmailActive(ctx, email, addr.ID); err != nil { - return fmt.Errorf("unable to check isEmailActive() for %s: %v", email, err) + return fmt.Errorf("unable to check isEmailActive() for %s: %w", email, err) } else if used { return ErrEmailAlreadyUsed{Email: email} } @@ -551,10 +551,10 @@ func ActivateUserEmail(userID int64, email string, activate bool) (err error) { if user.IsActive != activate { user.IsActive = activate if user.Rands, err = GetUserSalt(); err != nil { - return fmt.Errorf("unable to generate salt: %v", err) + return fmt.Errorf("unable to generate salt: %w", err) } if err = UpdateUserCols(ctx, &user, "is_active", "rands"); err != nil { - return fmt.Errorf("unable to updateUserCols() for user ID: %d: %v", userID, err) + return fmt.Errorf("unable to updateUserCols() for user ID: %d: %w", userID, err) } } } diff --git a/models/user/list.go b/models/user/list.go index 68e62ca15d..6c43c961c8 100644 --- a/models/user/list.go +++ b/models/user/list.go @@ -55,7 +55,7 @@ func (users UserList) loadTwoFactorStatus(ctx context.Context) (map[int64]*auth. userIDs := users.GetUserIDs() tokenMaps := make(map[int64]*auth.TwoFactor, len(userIDs)) if err := db.GetEngine(ctx).In("uid", userIDs).Find(&tokenMaps); err != nil { - return nil, fmt.Errorf("find two factor: %v", err) + return nil, fmt.Errorf("find two factor: %w", err) } return tokenMaps, nil } @@ -66,7 +66,7 @@ func (users UserList) userIDsWithWebAuthn(ctx context.Context) ([]int64, error) } ids := make([]int64, 0, len(users)) if err := db.GetEngine(ctx).Table(new(auth.WebAuthnCredential)).In("user_id", users.GetUserIDs()).Select("user_id").Distinct("user_id").Find(&ids); err != nil { - return nil, fmt.Errorf("find two factor: %v", err) + return nil, fmt.Errorf("find two factor: %w", err) } return ids, nil } diff --git a/models/user/search.go b/models/user/search.go index 0aa9949367..fa4a021a47 100644 --- a/models/user/search.go +++ b/models/user/search.go @@ -105,7 +105,7 @@ func SearchUsers(opts *SearchUserOptions) (users []*User, _ int64, _ error) { defer sessCount.Close() count, err := sessCount.Count(new(User)) if err != nil { - return nil, 0, fmt.Errorf("Count: %v", err) + return nil, 0, fmt.Errorf("Count: %w", err) } if len(opts.OrderBy) == 0 { diff --git a/models/user/user.go b/models/user/user.go index a3c10c2492..9a2da6dbc1 100644 --- a/models/user/user.go +++ b/models/user/user.go @@ -827,12 +827,12 @@ func ChangeUserName(u *User, newUserName string) (err error) { } if _, err = db.GetEngine(ctx).Exec("UPDATE `repository` SET owner_name=? WHERE owner_name=?", newUserName, oldUserName); err != nil { - return fmt.Errorf("Change repo owner name: %v", err) + return fmt.Errorf("Change repo owner name: %w", err) } // Do not fail if directory does not exist if err = util.Rename(UserPath(oldUserName), UserPath(newUserName)); err != nil && !os.IsNotExist(err) { - return fmt.Errorf("Rename user directory: %v", err) + return fmt.Errorf("Rename user directory: %w", err) } if err = NewUserRedirect(ctx, u.ID, oldUserName, newUserName); err != nil { diff --git a/models/webhook/hooktask.go b/models/webhook/hooktask.go index 2b9b63c09b..246484aea9 100644 --- a/models/webhook/hooktask.go +++ b/models/webhook/hooktask.go @@ -103,9 +103,9 @@ type HookResponse struct { // HookTask represents a hook task. type HookTask struct { - ID int64 `xorm:"pk autoincr"` - HookID int64 - UUID string + ID int64 `xorm:"pk autoincr"` + HookID int64 `xorm:"index"` + UUID string `xorm:"unique"` api.Payloader `xorm:"-"` PayloadContent string `xorm:"LONGTEXT"` EventType HookEventType @@ -270,7 +270,7 @@ func CleanupHookTaskTable(ctx context.Context, cleanupType HookTaskCleanupType, return db.ErrCancelledf("Before deleting hook_task records for hook id %d", hookID) default: } - if err = deleteDeliveredHookTasksByWebhook(hookID, numberToKeep); err != nil { + if err = deleteDeliveredHookTasksByWebhook(ctx, hookID, numberToKeep); err != nil { return err } } @@ -279,10 +279,10 @@ func CleanupHookTaskTable(ctx context.Context, cleanupType HookTaskCleanupType, return nil } -func deleteDeliveredHookTasksByWebhook(hookID int64, numberDeliveriesToKeep int) error { +func deleteDeliveredHookTasksByWebhook(ctx context.Context, hookID int64, numberDeliveriesToKeep int) error { log.Trace("Deleting hook_task rows for webhook %d, keeping the most recent %d deliveries", hookID, numberDeliveriesToKeep) deliveryDates := make([]int64, 0, 10) - err := db.GetEngine(db.DefaultContext).Table("hook_task"). + err := db.GetEngine(ctx).Table("hook_task"). Where("hook_task.hook_id = ? AND hook_task.is_delivered = ? AND hook_task.delivered is not null", hookID, true). Cols("hook_task.delivered"). Join("INNER", "webhook", "hook_task.hook_id = webhook.id"). @@ -294,7 +294,7 @@ func deleteDeliveredHookTasksByWebhook(hookID int64, numberDeliveriesToKeep int) } if len(deliveryDates) > 0 { - deletes, err := db.GetEngine(db.DefaultContext). + deletes, err := db.GetEngine(ctx). Where("hook_id = ? and is_delivered = ? and delivered <= ?", hookID, true, deliveryDates[0]). Delete(new(HookTask)) if err != nil { diff --git a/models/webhook/webhook.go b/models/webhook/webhook.go index 4551dcff5f..aebe0d6e72 100644 --- a/models/webhook/webhook.go +++ b/models/webhook/webhook.go @@ -608,14 +608,14 @@ func DeleteDefaultSystemWebhook(id int64) error { func CopyDefaultWebhooksToRepo(ctx context.Context, repoID int64) error { ws, err := GetDefaultWebhooks(ctx) if err != nil { - return fmt.Errorf("GetDefaultWebhooks: %v", err) + return fmt.Errorf("GetDefaultWebhooks: %w", err) } for _, w := range ws { w.ID = 0 w.RepoID = repoID if err := CreateWebhook(ctx, w); err != nil { - return fmt.Errorf("CreateWebhook: %v", err) + return fmt.Errorf("CreateWebhook: %w", err) } } return nil diff --git a/modules/avatar/avatar.go b/modules/avatar/avatar.go index 6ca75ed90f..2de77de009 100644 --- a/modules/avatar/avatar.go +++ b/modules/avatar/avatar.go @@ -30,7 +30,7 @@ func RandomImageSize(size int, data []byte) (image.Image, error) { // we use white as background, and use dark colors to draw blocks imgMaker, err := identicon.New(size, color.White, identicon.DarkColors...) if err != nil { - return nil, fmt.Errorf("identicon.New: %v", err) + return nil, fmt.Errorf("identicon.New: %w", err) } return imgMaker.Make(data), nil } @@ -46,7 +46,7 @@ func RandomImage(data []byte) (image.Image, error) { func Prepare(data []byte) (*image.Image, error) { imgCfg, _, err := image.DecodeConfig(bytes.NewReader(data)) if err != nil { - return nil, fmt.Errorf("DecodeConfig: %v", err) + return nil, fmt.Errorf("DecodeConfig: %w", err) } if imgCfg.Width > setting.Avatar.MaxWidth { return nil, fmt.Errorf("Image width is too large: %d > %d", imgCfg.Width, setting.Avatar.MaxWidth) @@ -57,7 +57,7 @@ func Prepare(data []byte) (*image.Image, error) { img, _, err := image.Decode(bytes.NewReader(data)) if err != nil { - return nil, fmt.Errorf("Decode: %v", err) + return nil, fmt.Errorf("Decode: %w", err) } if imgCfg.Width != imgCfg.Height { diff --git a/modules/context/package.go b/modules/context/package.go index d12bdc4913..ce0f9a511b 100644 --- a/modules/context/package.go +++ b/modules/context/package.go @@ -85,12 +85,15 @@ func packageAssignment(ctx *Context, errCb func(int, string, interface{})) { } func determineAccessMode(ctx *Context) (perm.AccessMode, error) { - accessMode := perm.AccessModeNone - if setting.Service.RequireSignInView && ctx.Doer == nil { - return accessMode, nil + return perm.AccessModeNone, nil } + if ctx.Doer != nil && !ctx.Doer.IsGhost() && (!ctx.Doer.IsActive || ctx.Doer.ProhibitLogin) { + return perm.AccessModeNone, nil + } + + accessMode := perm.AccessModeNone if ctx.Package.Owner.IsOrganization() { org := organization.OrgFromUser(ctx.Package.Owner) diff --git a/modules/doctor/authorizedkeys.go b/modules/doctor/authorizedkeys.go index d4ceef87c0..b3e9699a02 100644 --- a/modules/doctor/authorizedkeys.go +++ b/modules/doctor/authorizedkeys.go @@ -31,12 +31,12 @@ func checkAuthorizedKeys(ctx context.Context, logger log.Logger, autofix bool) e if err != nil { if !autofix { logger.Critical("Unable to open authorized_keys file. ERROR: %v", err) - return fmt.Errorf("Unable to open authorized_keys file. ERROR: %v", err) + return fmt.Errorf("Unable to open authorized_keys file. ERROR: %w", err) } logger.Warn("Unable to open authorized_keys. (ERROR: %v). Attempting to rewrite...", err) if err = asymkey_model.RewriteAllPublicKeys(); err != nil { logger.Critical("Unable to rewrite authorized_keys file. ERROR: %v", err) - return fmt.Errorf("Unable to rewrite authorized_keys file. ERROR: %v", err) + return fmt.Errorf("Unable to rewrite authorized_keys file. ERROR: %w", err) } } defer f.Close() @@ -57,7 +57,7 @@ func checkAuthorizedKeys(ctx context.Context, logger log.Logger, autofix bool) e regenerated := &bytes.Buffer{} if err := asymkey_model.RegeneratePublicKeys(ctx, regenerated); err != nil { logger.Critical("Unable to regenerate authorized_keys file. ERROR: %v", err) - return fmt.Errorf("Unable to regenerate authorized_keys file. ERROR: %v", err) + return fmt.Errorf("Unable to regenerate authorized_keys file. ERROR: %w", err) } scanner = bufio.NewScanner(regenerated) for scanner.Scan() { @@ -80,7 +80,7 @@ func checkAuthorizedKeys(ctx context.Context, logger log.Logger, autofix bool) e err = asymkey_model.RewriteAllPublicKeys() if err != nil { logger.Critical("Unable to rewrite authorized_keys file. ERROR: %v", err) - return fmt.Errorf("Unable to rewrite authorized_keys file. ERROR: %v", err) + return fmt.Errorf("Unable to rewrite authorized_keys file. ERROR: %w", err) } } return nil diff --git a/modules/doctor/breaking.go b/modules/doctor/breaking.go index 391c8e76c5..51122d9a61 100644 --- a/modules/doctor/breaking.go +++ b/modules/doctor/breaking.go @@ -47,7 +47,7 @@ func checkUserEmail(ctx context.Context, logger log.Logger, _ bool) error { } return nil }); err != nil { - return fmt.Errorf("iterateUserAccounts: %v", err) + return fmt.Errorf("iterateUserAccounts: %w", err) } if invalidUserCount == 0 { @@ -70,7 +70,7 @@ func checkUserName(ctx context.Context, logger log.Logger, _ bool) error { } return nil }); err != nil { - return fmt.Errorf("iterateUserAccounts: %v", err) + return fmt.Errorf("iterateUserAccounts: %w", err) } if invalidUserCount == 0 { diff --git a/modules/doctor/heads.go b/modules/doctor/heads.go index 7f3b2a8a02..33efc27a22 100644 --- a/modules/doctor/heads.go +++ b/modules/doctor/heads.go @@ -49,7 +49,7 @@ func synchronizeRepoHeads(ctx context.Context, logger log.Logger, autofix bool) } // otherwise, let's try fixing HEAD - err := git.NewCommand(ctx, "symbolic-ref").AddDashesAndList("HEAD", repo.DefaultBranch).Run(runOpts) + err := git.NewCommand(ctx, "symbolic-ref").AddDashesAndList("HEAD", git.BranchPrefix+repo.DefaultBranch).Run(runOpts) if err != nil { logger.Warn("Failed to fix HEAD for %s/%s: %v", repo.OwnerName, repo.Name, err) return nil diff --git a/modules/doctor/mergebase.go b/modules/doctor/mergebase.go index 4a10c72e6e..b279c453f7 100644 --- a/modules/doctor/mergebase.go +++ b/modules/doctor/mergebase.go @@ -78,7 +78,7 @@ func checkPRMergeBase(ctx context.Context, logger log.Logger, autofix bool) erro if autofix { if err := pr.UpdateCols("merge_base"); err != nil { logger.Critical("Failed to update merge_base. ERROR: %v", err) - return fmt.Errorf("Failed to update merge_base. ERROR: %v", err) + return fmt.Errorf("Failed to update merge_base. ERROR: %w", err) } } else { logger.Info("#%d onto %s in %s/%s: MergeBase should be %s but is %s", pr.Index, pr.BaseBranch, pr.BaseRepo.OwnerName, pr.BaseRepo.Name, oldMergeBase, pr.MergeBase) diff --git a/modules/doctor/misc.go b/modules/doctor/misc.go index 2d2bcb910d..277d66a177 100644 --- a/modules/doctor/misc.go +++ b/modules/doctor/misc.go @@ -43,7 +43,7 @@ func checkScriptType(ctx context.Context, logger log.Logger, autofix bool) error path, err := exec.LookPath(setting.ScriptType) if err != nil { logger.Critical("ScriptType \"%q\" is not on the current PATH. Error: %v", setting.ScriptType, err) - return fmt.Errorf("ScriptType \"%q\" is not on the current PATH. Error: %v", setting.ScriptType, err) + return fmt.Errorf("ScriptType \"%q\" is not on the current PATH. Error: %w", setting.ScriptType, err) } logger.Info("ScriptType %s is on the current PATH at %s", setting.ScriptType, path) return nil @@ -54,13 +54,13 @@ func checkHooks(ctx context.Context, logger log.Logger, autofix bool) error { results, err := repository.CheckDelegateHooks(repo.RepoPath()) if err != nil { logger.Critical("Unable to check delegate hooks for repo %-v. ERROR: %v", repo, err) - return fmt.Errorf("Unable to check delegate hooks for repo %-v. ERROR: %v", repo, err) + return fmt.Errorf("Unable to check delegate hooks for repo %-v. ERROR: %w", repo, err) } if len(results) > 0 && autofix { logger.Warn("Regenerated hooks for %s", repo.FullName()) if err := repository.CreateDelegateHooks(repo.RepoPath()); err != nil { logger.Critical("Unable to recreate delegate hooks for %-v. ERROR: %v", repo, err) - return fmt.Errorf("Unable to recreate delegate hooks for %-v. ERROR: %v", repo, err) + return fmt.Errorf("Unable to recreate delegate hooks for %-v. ERROR: %w", repo, err) } } for _, result := range results { diff --git a/modules/doctor/paths.go b/modules/doctor/paths.go index 22c095c227..5a27045457 100644 --- a/modules/doctor/paths.go +++ b/modules/doctor/paths.go @@ -29,7 +29,7 @@ func checkConfigurationFile(logger log.Logger, autofix bool, fileOpts configurat if os.IsNotExist(err) && autofix && fileOpts.IsDirectory { if err := os.MkdirAll(fileOpts.Path, 0o777); err != nil { logger.Error(" Directory does not exist and could not be created. ERROR: %v", err) - return fmt.Errorf("Configuration directory: \"%q\" does not exist and could not be created. ERROR: %v", fileOpts.Path, err) + return fmt.Errorf("Configuration directory: \"%q\" does not exist and could not be created. ERROR: %w", fileOpts.Path, err) } fi, err = os.Stat(fileOpts.Path) } @@ -37,7 +37,7 @@ func checkConfigurationFile(logger log.Logger, autofix bool, fileOpts configurat if err != nil { if fileOpts.Required { logger.Error(" Is REQUIRED but is not accessible. ERROR: %v", err) - return fmt.Errorf("Configuration file \"%q\" is not accessible but is required. Error: %v", fileOpts.Path, err) + return fmt.Errorf("Configuration file \"%q\" is not accessible but is required. Error: %w", fileOpts.Path, err) } logger.Warn(" NOTICE: is not accessible (Error: %v)", err) // this is a non-critical error @@ -46,14 +46,14 @@ func checkConfigurationFile(logger log.Logger, autofix bool, fileOpts configurat if fileOpts.IsDirectory && !fi.IsDir() { logger.Error(" ERROR: not a directory") - return fmt.Errorf("Configuration directory \"%q\" is not a directory. Error: %v", fileOpts.Path, err) + return fmt.Errorf("Configuration directory \"%q\" is not a directory. Error: %w", fileOpts.Path, err) } else if !fileOpts.IsDirectory && !fi.Mode().IsRegular() { logger.Error(" ERROR: not a regular file") - return fmt.Errorf("Configuration file \"%q\" is not a regular file. Error: %v", fileOpts.Path, err) + return fmt.Errorf("Configuration file \"%q\" is not a regular file. Error: %w", fileOpts.Path, err) } else if fileOpts.Writable { if err := isWritableDir(fileOpts.Path); err != nil { logger.Error(" ERROR: is required to be writable but is not writable: %v", err) - return fmt.Errorf("Configuration file \"%q\" is required to be writable but is not. Error: %v", fileOpts.Path, err) + return fmt.Errorf("Configuration file \"%q\" is required to be writable but is not. Error: %w", fileOpts.Path, err) } } return nil diff --git a/modules/git/blame.go b/modules/git/blame.go index 1653ecbf85..832b12213c 100644 --- a/modules/git/blame.go +++ b/modules/git/blame.go @@ -106,7 +106,7 @@ func (r *BlameReader) Close() error { _ = r.output.Close() if err := r.cmd.Wait(); err != nil { - return fmt.Errorf("Wait: %v", err) + return fmt.Errorf("Wait: %w", err) } return nil @@ -129,13 +129,13 @@ func createBlameReader(ctx context.Context, dir string, command ...string) (*Bla stdout, err := cmd.StdoutPipe() if err != nil { defer finished() - return nil, fmt.Errorf("StdoutPipe: %v", err) + return nil, fmt.Errorf("StdoutPipe: %w", err) } if err = cmd.Start(); err != nil { defer finished() _ = stdout.Close() - return nil, fmt.Errorf("Start: %v", err) + return nil, fmt.Errorf("Start: %w", err) } reader := bufio.NewReader(stdout) diff --git a/modules/git/diff.go b/modules/git/diff.go index 13ff6bd1e6..1a43d0dd4a 100644 --- a/modules/git/diff.go +++ b/modules/git/diff.go @@ -41,7 +41,7 @@ func GetReverseRawDiff(ctx context.Context, repoPath, commitID string, writer io Stdout: writer, Stderr: stderr, }); err != nil { - return fmt.Errorf("Run: %v - %s", err, stderr) + return fmt.Errorf("Run: %w - %s", err, stderr) } return nil } @@ -89,7 +89,7 @@ func GetRepoRawDiffForFile(repo *Repository, startCommit, endCommit string, diff Stdout: writer, Stderr: stderr, }); err != nil { - return fmt.Errorf("Run: %v - %s", err, stderr) + return fmt.Errorf("Run: %w - %s", err, stderr) } return nil } diff --git a/modules/git/error.go b/modules/git/error.go index 40c4106414..ebfea8e702 100644 --- a/modules/git/error.go +++ b/modules/git/error.go @@ -116,7 +116,7 @@ func (err *ErrPushOutOfDate) Error() string { // Unwrap unwraps the underlying error func (err *ErrPushOutOfDate) Unwrap() error { - return fmt.Errorf("%v - %s", err.Err, err.StdErr) + return fmt.Errorf("%w - %s", err.Err, err.StdErr) } // ErrPushRejected represents an error if merging fails due to rejection from a hook @@ -139,7 +139,7 @@ func (err *ErrPushRejected) Error() string { // Unwrap unwraps the underlying error func (err *ErrPushRejected) Unwrap() error { - return fmt.Errorf("%v - %s", err.Err, err.StdErr) + return fmt.Errorf("%w - %s", err.Err, err.StdErr) } // GenerateMessage generates the remote message from the stderr diff --git a/modules/git/parse_gogit.go b/modules/git/parse_gogit.go index 409432c5d6..4a8dcfdf35 100644 --- a/modules/git/parse_gogit.go +++ b/modules/git/parse_gogit.go @@ -56,7 +56,7 @@ func parseTreeEntries(data []byte, ptree *Tree) ([]*TreeEntry, error) { } id, err := NewIDFromString(string(data[pos : pos+40])) if err != nil { - return nil, fmt.Errorf("Invalid ls-tree output: %v", err) + return nil, fmt.Errorf("Invalid ls-tree output: %w", err) } entry.ID = id entry.gogitTreeEntry.Hash = id @@ -80,7 +80,7 @@ func parseTreeEntries(data []byte, ptree *Tree) ([]*TreeEntry, error) { if data[pos] == '"' { entry.gogitTreeEntry.Name, err = strconv.Unquote(string(data[pos:end])) if err != nil { - return nil, fmt.Errorf("Invalid ls-tree output: %v", err) + return nil, fmt.Errorf("Invalid ls-tree output: %w", err) } } else { entry.gogitTreeEntry.Name = string(data[pos:end]) diff --git a/modules/git/pipeline/catfile.go b/modules/git/pipeline/catfile.go index 40dd2bca29..c1d4bd1665 100644 --- a/modules/git/pipeline/catfile.go +++ b/modules/git/pipeline/catfile.go @@ -33,7 +33,7 @@ func CatFileBatchCheck(ctx context.Context, shasToCheckReader *io.PipeReader, ca Stdout: catFileCheckWriter, Stderr: stderr, }); err != nil { - _ = catFileCheckWriter.CloseWithError(fmt.Errorf("git cat-file --batch-check [%s]: %v - %s", tmpBasePath, err, errbuf.String())) + _ = catFileCheckWriter.CloseWithError(fmt.Errorf("git cat-file --batch-check [%s]: %w - %s", tmpBasePath, err, errbuf.String())) } } @@ -51,7 +51,7 @@ func CatFileBatchCheckAllObjects(ctx context.Context, catFileCheckWriter *io.Pip Stderr: stderr, }); err != nil { log.Error("git cat-file --batch-check --batch-all-object [%s]: %v - %s", tmpBasePath, err, errbuf.String()) - err = fmt.Errorf("git cat-file --batch-check --batch-all-object [%s]: %v - %s", tmpBasePath, err, errbuf.String()) + err = fmt.Errorf("git cat-file --batch-check --batch-all-object [%s]: %w - %s", tmpBasePath, err, errbuf.String()) _ = catFileCheckWriter.CloseWithError(err) errChan <- err } @@ -71,7 +71,7 @@ func CatFileBatch(ctx context.Context, shasToBatchReader *io.PipeReader, catFile Stdin: shasToBatchReader, Stderr: stderr, }); err != nil { - _ = shasToBatchReader.CloseWithError(fmt.Errorf("git rev-list [%s]: %v - %s", tmpBasePath, err, errbuf.String())) + _ = shasToBatchReader.CloseWithError(fmt.Errorf("git rev-list [%s]: %w - %s", tmpBasePath, err, errbuf.String())) } } diff --git a/modules/git/pipeline/namerev.go b/modules/git/pipeline/namerev.go index 8356e70234..85ba7db23e 100644 --- a/modules/git/pipeline/namerev.go +++ b/modules/git/pipeline/namerev.go @@ -29,6 +29,6 @@ func NameRevStdin(ctx context.Context, shasToNameReader *io.PipeReader, nameRevS Stdin: shasToNameReader, Stderr: stderr, }); err != nil { - _ = shasToNameReader.CloseWithError(fmt.Errorf("git name-rev [%s]: %v - %s", tmpBasePath, err, errbuf.String())) + _ = shasToNameReader.CloseWithError(fmt.Errorf("git name-rev [%s]: %w - %s", tmpBasePath, err, errbuf.String())) } } diff --git a/modules/git/pipeline/revlist.go b/modules/git/pipeline/revlist.go index 5f62e85e7f..93142034ec 100644 --- a/modules/git/pipeline/revlist.go +++ b/modules/git/pipeline/revlist.go @@ -31,7 +31,7 @@ func RevListAllObjects(ctx context.Context, revListWriter *io.PipeWriter, wg *sy Stderr: stderr, }); err != nil { log.Error("git rev-list --objects --all [%s]: %v - %s", basePath, err, errbuf.String()) - err = fmt.Errorf("git rev-list --objects --all [%s]: %v - %s", basePath, err, errbuf.String()) + err = fmt.Errorf("git rev-list --objects --all [%s]: %w - %s", basePath, err, errbuf.String()) _ = revListWriter.CloseWithError(err) errChan <- err } @@ -50,7 +50,7 @@ func RevListObjects(ctx context.Context, revListWriter *io.PipeWriter, wg *sync. Stderr: stderr, }); err != nil { log.Error("git rev-list [%s]: %v - %s", tmpBasePath, err, errbuf.String()) - errChan <- fmt.Errorf("git rev-list [%s]: %v - %s", tmpBasePath, err, errbuf.String()) + errChan <- fmt.Errorf("git rev-list [%s]: %w - %s", tmpBasePath, err, errbuf.String()) } } diff --git a/modules/git/repo.go b/modules/git/repo.go index 575b686e29..8ba3ae4fda 100644 --- a/modules/git/repo.go +++ b/modules/git/repo.go @@ -90,7 +90,7 @@ func (repo *Repository) IsEmpty() (bool, error) { if err.Error() == "exit status 1" && errbuf.String() == "" { return true, nil } - return true, fmt.Errorf("check empty: %v - %s", err, errbuf.String()) + return true, fmt.Errorf("check empty: %w - %s", err, errbuf.String()) } return strings.TrimSpace(output.String()) == "", nil @@ -251,7 +251,7 @@ func Push(ctx context.Context, repoPath string, opts PushOptions) error { } if errbuf.Len() > 0 && err != nil { - return fmt.Errorf("%v - %s", err, errbuf.String()) + return fmt.Errorf("%w - %s", err, errbuf.String()) } return err diff --git a/modules/git/repo_attribute.go b/modules/git/repo_attribute.go index 60dc993dc2..d9c50be6f7 100644 --- a/modules/git/repo_attribute.go +++ b/modules/git/repo_attribute.go @@ -68,7 +68,7 @@ func (repo *Repository) CheckAttribute(opts CheckAttributeOpts) (map[string]map[ Stdout: stdOut, Stderr: stdErr, }); err != nil { - return nil, fmt.Errorf("failed to run check-attr: %v\n%s\n%s", err, stdOut.String(), stdErr.String()) + return nil, fmt.Errorf("failed to run check-attr: %w\n%s\n%s", err, stdOut.String(), stdErr.String()) } // FIXME: This is incorrect on versions < 1.8.5 diff --git a/modules/git/repo_compare.go b/modules/git/repo_compare.go index aad78370ff..7575b11658 100644 --- a/modules/git/repo_compare.go +++ b/modules/git/repo_compare.go @@ -62,7 +62,7 @@ func (repo *Repository) GetCompareInfo(basePath, baseBranch, headBranch string, // Add a temporary remote tmpRemote = strconv.FormatInt(time.Now().UnixNano(), 10) if err = repo.AddRemote(tmpRemote, basePath, false); err != nil { - return nil, fmt.Errorf("AddRemote: %v", err) + return nil, fmt.Errorf("AddRemote: %w", err) } defer func() { if err := repo.RemoveRemote(tmpRemote); err != nil { @@ -100,7 +100,7 @@ func (repo *Repository) GetCompareInfo(basePath, baseBranch, headBranch string, } compareInfo.Commits, err = repo.parsePrettyFormatLogToList(logs) if err != nil { - return nil, fmt.Errorf("parsePrettyFormatLogToList: %v", err) + return nil, fmt.Errorf("parsePrettyFormatLogToList: %w", err) } } else { compareInfo.Commits = []*Commit{} @@ -166,7 +166,7 @@ func (repo *Repository) GetDiffNumChangedFiles(base, head string, directComparis return w.numLines, nil } } - return 0, fmt.Errorf("%v: Stderr: %s", err, stderr) + return 0, fmt.Errorf("%w: Stderr: %s", err, stderr) } return w.numLines, nil } @@ -215,20 +215,20 @@ func parseDiffStat(stdout string) (numFiles, totalAdditions, totalDeletions int, numFiles, err = strconv.Atoi(groups[1]) if err != nil { - return 0, 0, 0, fmt.Errorf("unable to parse shortstat: %s. Error parsing NumFiles %v", stdout, err) + return 0, 0, 0, fmt.Errorf("unable to parse shortstat: %s. Error parsing NumFiles %w", stdout, err) } if len(groups[2]) != 0 { totalAdditions, err = strconv.Atoi(groups[2]) if err != nil { - return 0, 0, 0, fmt.Errorf("unable to parse shortstat: %s. Error parsing NumAdditions %v", stdout, err) + return 0, 0, 0, fmt.Errorf("unable to parse shortstat: %s. Error parsing NumAdditions %w", stdout, err) } } if len(groups[3]) != 0 { totalDeletions, err = strconv.Atoi(groups[3]) if err != nil { - return 0, 0, 0, fmt.Errorf("unable to parse shortstat: %s. Error parsing NumDeletions %v", stdout, err) + return 0, 0, 0, fmt.Errorf("unable to parse shortstat: %s. Error parsing NumDeletions %w", stdout, err) } } return numFiles, totalAdditions, totalDeletions, err diff --git a/modules/git/repo_gpg.go b/modules/git/repo_gpg.go index abbb349159..25188d07e3 100644 --- a/modules/git/repo_gpg.go +++ b/modules/git/repo_gpg.go @@ -18,7 +18,7 @@ func (gpgSettings *GPGSettings) LoadPublicKeyContent() error { "gpg -a --export", "gpg", "-a", "--export", gpgSettings.KeyID) if err != nil { - return fmt.Errorf("Unable to get default signing key: %s, %s, %v", gpgSettings.KeyID, stderr, err) + return fmt.Errorf("Unable to get default signing key: %s, %s, %w", gpgSettings.KeyID, stderr, err) } gpgSettings.PublicKeyContent = content return nil diff --git a/modules/git/repo_tag.go b/modules/git/repo_tag.go index fd0de7b3a1..8585d824f9 100644 --- a/modules/git/repo_tag.go +++ b/modules/git/repo_tag.go @@ -166,7 +166,7 @@ func parseTagRef(ref map[string]string) (tag *Tag, err error) { tag.ID, err = NewIDFromString(ref["objectname"]) if err != nil { - return nil, fmt.Errorf("parse objectname '%s': %v", ref["objectname"], err) + return nil, fmt.Errorf("parse objectname '%s': %w", ref["objectname"], err) } if tag.Type == "commit" { @@ -176,7 +176,7 @@ func parseTagRef(ref map[string]string) (tag *Tag, err error) { // annotated tag tag.Object, err = NewIDFromString(ref["object"]) if err != nil { - return nil, fmt.Errorf("parse object '%s': %v", ref["object"], err) + return nil, fmt.Errorf("parse object '%s': %w", ref["object"], err) } } diff --git a/modules/graceful/net_unix.go b/modules/graceful/net_unix.go index c7524a79db..0bb589e231 100644 --- a/modules/graceful/net_unix.go +++ b/modules/graceful/net_unix.go @@ -52,7 +52,7 @@ func getProvidedFDs() (savedErr error) { } n, err := strconv.Atoi(numFDs) if err != nil { - savedErr = fmt.Errorf("%s is not a number: %s. Err: %v", listenFDs, numFDs, err) + savedErr = fmt.Errorf("%s is not a number: %s. Err: %w", listenFDs, numFDs, err) return } @@ -81,7 +81,7 @@ func getProvidedFDs() (savedErr error) { } // If needed we can handle packetconns here. - savedErr = fmt.Errorf("Error getting provided socket fd %d: %v", i, err) + savedErr = fmt.Errorf("Error getting provided socket fd %d: %w", i, err) return } }) @@ -98,7 +98,7 @@ func CloseProvidedListeners() error { if err != nil { log.Error("Error in closing unused provided listener: %v", err) if returnableError != nil { - returnableError = fmt.Errorf("%v & %v", returnableError, err) + returnableError = fmt.Errorf("%v & %w", returnableError, err) } else { returnableError = err } @@ -198,7 +198,7 @@ func GetListenerUnix(network string, address *net.UnixAddr) (*net.UnixListener, // make a fresh listener if err := util.Remove(address.Name); err != nil && !os.IsNotExist(err) { - return nil, fmt.Errorf("Failed to remove unix socket %s: %v", address.Name, err) + return nil, fmt.Errorf("Failed to remove unix socket %s: %w", address.Name, err) } l, err := net.ListenUnix(network, address) @@ -208,7 +208,7 @@ func GetListenerUnix(network string, address *net.UnixAddr) (*net.UnixListener, fileMode := os.FileMode(setting.UnixSocketPermission) if err = os.Chmod(address.Name, fileMode); err != nil { - return nil, fmt.Errorf("Failed to set permission of unix socket to %s: %v", fileMode.String(), err) + return nil, fmt.Errorf("Failed to set permission of unix socket to %s: %w", fileMode.String(), err) } activeListeners = append(activeListeners, l) diff --git a/modules/hostmatcher/http.go b/modules/hostmatcher/http.go index 31430a9595..84cd2974ec 100644 --- a/modules/hostmatcher/http.go +++ b/modules/hostmatcher/http.go @@ -35,7 +35,7 @@ func NewDialContext(usage string, allowList, blockList *HostMatchList) func(ctx // in Control func, the addr was already resolved to IP:PORT format, there is no cost to do ResolveTCPAddr here tcpAddr, err := net.ResolveTCPAddr(network, ipAddr) if err != nil { - return fmt.Errorf("%s can only call HTTP servers via TCP, deny '%s(%s:%s)', err=%v", usage, host, network, ipAddr, err) + return fmt.Errorf("%s can only call HTTP servers via TCP, deny '%s(%s:%s)', err=%w", usage, host, network, ipAddr, err) } var blockedError error diff --git a/modules/indexer/code/bleve.go b/modules/indexer/code/bleve.go index f1298b01ed..3ea1c86178 100644 --- a/modules/indexer/code/bleve.go +++ b/modules/indexer/code/bleve.go @@ -199,7 +199,7 @@ func (b *BleveIndexer) addUpdate(ctx context.Context, batchWriter git.WriteClose return err } if size, err = strconv.ParseInt(strings.TrimSpace(stdout), 10, 64); err != nil { - return fmt.Errorf("Misformatted git cat-file output: %v", err) + return fmt.Errorf("Misformatted git cat-file output: %w", err) } } diff --git a/modules/indexer/code/elastic_search.go b/modules/indexer/code/elastic_search.go index 108a224675..dd3c9c9771 100644 --- a/modules/indexer/code/elastic_search.go +++ b/modules/indexer/code/elastic_search.go @@ -228,7 +228,7 @@ func (b *ElasticSearchIndexer) addUpdate(ctx context.Context, batchWriter git.Wr return nil, err } if size, err = strconv.ParseInt(strings.TrimSpace(stdout), 10, 64); err != nil { - return nil, fmt.Errorf("misformatted git cat-file output: %v", err) + return nil, fmt.Errorf("misformatted git cat-file output: %w", err) } } diff --git a/modules/indexer/issues/bleve.go b/modules/indexer/issues/bleve.go index c298b7de3e..dff1cf0c60 100644 --- a/modules/indexer/issues/bleve.go +++ b/modules/indexer/issues/bleve.go @@ -40,7 +40,7 @@ func indexerID(id int64) string { func idOfIndexerID(indexerID string) (int64, error) { id, err := strconv.ParseInt(indexerID, 36, 64) if err != nil { - return 0, fmt.Errorf("Unexpected indexer ID %s: %v", indexerID, err) + return 0, fmt.Errorf("Unexpected indexer ID %s: %w", indexerID, err) } return id, nil } diff --git a/modules/log/conn.go b/modules/log/conn.go index bd1d76d071..155f2866ca 100644 --- a/modules/log/conn.go +++ b/modules/log/conn.go @@ -108,7 +108,7 @@ func NewConn() LoggerProvider { func (log *ConnLogger) Init(jsonconfig string) error { err := json.Unmarshal([]byte(jsonconfig), log) if err != nil { - return fmt.Errorf("Unable to parse JSON: %v", err) + return fmt.Errorf("Unable to parse JSON: %w", err) } log.NewWriterLogger(&connWriter{ ReconnectOnMsg: log.ReconnectOnMsg, diff --git a/modules/log/console.go b/modules/log/console.go index 8c78add474..fc7c9b4967 100644 --- a/modules/log/console.go +++ b/modules/log/console.go @@ -54,7 +54,7 @@ func NewConsoleLogger() LoggerProvider { func (log *ConsoleLogger) Init(config string) error { err := json.Unmarshal([]byte(config), log) if err != nil { - return fmt.Errorf("Unable to parse JSON: %v", err) + return fmt.Errorf("Unable to parse JSON: %w", err) } if log.Stderr { log.NewWriterLogger(&nopWriteCloser{ diff --git a/modules/log/event.go b/modules/log/event.go index 41bb241da8..aebd156212 100644 --- a/modules/log/event.go +++ b/modules/log/event.go @@ -293,9 +293,9 @@ func (m *MultiChannelledLog) ReleaseReopen() error { for _, logger := range m.loggers { if err := logger.ReleaseReopen(); err != nil { if accumulatedErr == nil { - accumulatedErr = fmt.Errorf("Error whilst reopening: %s Error: %v", logger.GetName(), err) + accumulatedErr = fmt.Errorf("Error whilst reopening: %s Error: %w", logger.GetName(), err) } else { - accumulatedErr = fmt.Errorf("Error whilst reopening: %s Error: %v & %v", logger.GetName(), err, accumulatedErr) + accumulatedErr = fmt.Errorf("Error whilst reopening: %s Error: %v & %w", logger.GetName(), err, accumulatedErr) } } } diff --git a/modules/log/file.go b/modules/log/file.go index 8110a9587e..d0cba7817c 100644 --- a/modules/log/file.go +++ b/modules/log/file.go @@ -103,7 +103,7 @@ func NewFileLogger() LoggerProvider { // } func (log *FileLogger) Init(config string) error { if err := json.Unmarshal([]byte(config), log); err != nil { - return fmt.Errorf("Unable to parse JSON: %v", err) + return fmt.Errorf("Unable to parse JSON: %w", err) } if len(log.Filename) == 0 { return errors.New("config must have filename") @@ -145,7 +145,7 @@ func (log *FileLogger) initFd() error { fd := log.mw.fd finfo, err := fd.Stat() if err != nil { - return fmt.Errorf("get stat: %v", err) + return fmt.Errorf("get stat: %w", err) } log.maxsizeCursize = int(finfo.Size()) log.dailyOpenDate = time.Now().Day() @@ -178,7 +178,7 @@ func (log *FileLogger) DoRotate() error { // close fd before rename // Rename the file to its newfound home if err = util.Rename(log.Filename, fname); err != nil { - return fmt.Errorf("Rotate: %v", err) + return fmt.Errorf("Rotate: %w", err) } if log.Compress { @@ -187,7 +187,7 @@ func (log *FileLogger) DoRotate() error { // re-start logger if err = log.StartLogger(); err != nil { - return fmt.Errorf("Rotate StartLogger: %v", err) + return fmt.Errorf("Rotate StartLogger: %w", err) } go log.deleteOldLog() @@ -236,7 +236,7 @@ func (log *FileLogger) deleteOldLog() { if !info.IsDir() && info.ModTime().Unix() < (time.Now().Unix()-60*60*24*log.Maxdays) { if strings.HasPrefix(filepath.Base(path), filepath.Base(log.Filename)) { if err := util.Remove(path); err != nil { - returnErr = fmt.Errorf("Failed to remove %s: %v", path, err) + returnErr = fmt.Errorf("Failed to remove %s: %w", path, err) } } } diff --git a/modules/log/log.go b/modules/log/log.go index f805a36231..4303ecf4c0 100644 --- a/modules/log/log.go +++ b/modules/log/log.go @@ -219,9 +219,9 @@ func ReleaseReopen() error { logger := value.(*MultiChannelledLogger) if err := logger.ReleaseReopen(); err != nil { if accumulatedErr == nil { - accumulatedErr = fmt.Errorf("Error reopening %s: %v", key.(string), err) + accumulatedErr = fmt.Errorf("Error reopening %s: %w", key.(string), err) } else { - accumulatedErr = fmt.Errorf("Error reopening %s: %v & %v", key.(string), err, accumulatedErr) + accumulatedErr = fmt.Errorf("Error reopening %s: %v & %w", key.(string), err, accumulatedErr) } } return true diff --git a/modules/log/smtp.go b/modules/log/smtp.go index 1706517d6a..61af50b81a 100644 --- a/modules/log/smtp.go +++ b/modules/log/smtp.go @@ -60,7 +60,7 @@ func NewSMTPLogger() LoggerProvider { func (log *SMTPLogger) Init(jsonconfig string) error { err := json.Unmarshal([]byte(jsonconfig), log) if err != nil { - return fmt.Errorf("Unable to parse JSON: %v", err) + return fmt.Errorf("Unable to parse JSON: %w", err) } log.NewWriterLogger(&smtpWriter{ owner: log, diff --git a/modules/markup/external/external.go b/modules/markup/external/external.go index 23dd45ba0a..0eeb2d70a5 100644 --- a/modules/markup/external/external.go +++ b/modules/markup/external/external.go @@ -90,7 +90,7 @@ func (p *Renderer) Render(ctx *markup.RenderContext, input io.Reader, output io. // write to temp file f, err := os.CreateTemp("", "gitea_input") if err != nil { - return fmt.Errorf("%s create temp file when rendering %s failed: %v", p.Name(), p.Command, err) + return fmt.Errorf("%s create temp file when rendering %s failed: %w", p.Name(), p.Command, err) } tmpPath := f.Name() defer func() { @@ -102,12 +102,12 @@ func (p *Renderer) Render(ctx *markup.RenderContext, input io.Reader, output io. _, err = io.Copy(f, input) if err != nil { f.Close() - return fmt.Errorf("%s write data to temp file when rendering %s failed: %v", p.Name(), p.Command, err) + return fmt.Errorf("%s write data to temp file when rendering %s failed: %w", p.Name(), p.Command, err) } err = f.Close() if err != nil { - return fmt.Errorf("%s close temp file when rendering %s failed: %v", p.Name(), p.Command, err) + return fmt.Errorf("%s close temp file when rendering %s failed: %w", p.Name(), p.Command, err) } args = append(args, f.Name()) } @@ -137,7 +137,7 @@ func (p *Renderer) Render(ctx *markup.RenderContext, input io.Reader, output io. process.SetSysProcAttribute(cmd) if err := cmd.Run(); err != nil { - return fmt.Errorf("%s render run command %s %v failed: %v", p.Name(), commands[0], args, err) + return fmt.Errorf("%s render run command %s %v failed: %w", p.Name(), commands[0], args, err) } return nil } diff --git a/modules/markup/orgmode/orgmode.go b/modules/markup/orgmode/orgmode.go index 1c02f274ba..abbff1e435 100644 --- a/modules/markup/orgmode/orgmode.go +++ b/modules/markup/orgmode/orgmode.go @@ -110,7 +110,7 @@ func Render(ctx *markup.RenderContext, input io.Reader, output io.Writer) error res, err := org.New().Silent().Parse(input, "").Write(w) if err != nil { - return fmt.Errorf("orgmode.Render failed: %v", err) + return fmt.Errorf("orgmode.Render failed: %w", err) } _, err = io.Copy(output, strings.NewReader(res)) return err diff --git a/modules/mcaptcha/mcaptcha.go b/modules/mcaptcha/mcaptcha.go index b889cf423b..0c0fcce49d 100644 --- a/modules/mcaptcha/mcaptcha.go +++ b/modules/mcaptcha/mcaptcha.go @@ -21,7 +21,7 @@ func Verify(ctx context.Context, token string) (bool, error) { Token: token, }) if err != nil { - return false, fmt.Errorf("wasn't able to verify mCaptcha: %v", err) + return false, fmt.Errorf("wasn't able to verify mCaptcha: %w", err) } return valid, nil } diff --git a/modules/options/dynamic.go b/modules/options/dynamic.go index eeef11e8da..3739867580 100644 --- a/modules/options/dynamic.go +++ b/modules/options/dynamic.go @@ -32,12 +32,12 @@ func Dir(name string) ([]string, error) { isDir, err := util.IsDir(customDir) if err != nil { - return []string{}, fmt.Errorf("Unabe to check if custom directory %s is a directory. %v", customDir, err) + return []string{}, fmt.Errorf("Unabe to check if custom directory %s is a directory. %w", customDir, err) } if isDir { files, err := util.StatDir(customDir, true) if err != nil { - return []string{}, fmt.Errorf("Failed to read custom directory. %v", err) + return []string{}, fmt.Errorf("Failed to read custom directory. %w", err) } result = append(result, files...) @@ -47,12 +47,12 @@ func Dir(name string) ([]string, error) { isDir, err = util.IsDir(staticDir) if err != nil { - return []string{}, fmt.Errorf("unable to check if static directory %s is a directory. %v", staticDir, err) + return []string{}, fmt.Errorf("unable to check if static directory %s is a directory. %w", staticDir, err) } if isDir { files, err := util.StatDir(staticDir, true) if err != nil { - return []string{}, fmt.Errorf("Failed to read static directory. %v", err) + return []string{}, fmt.Errorf("Failed to read static directory. %w", err) } result = append(result, files...) diff --git a/modules/packages/nuget/symbol_extractor.go b/modules/packages/nuget/symbol_extractor.go index 13641ca6ef..9c04d7bfb4 100644 --- a/modules/packages/nuget/symbol_extractor.go +++ b/modules/packages/nuget/symbol_extractor.go @@ -75,7 +75,7 @@ func ExtractPortablePdb(r io.ReaderAt, size int64) (PortablePdbList, error) { id, err := ParseDebugHeaderID(buf) if err != nil { buf.Close() - return fmt.Errorf("Invalid PDB file: %v", err) + return fmt.Errorf("Invalid PDB file: %w", err) } if _, err := buf.Seek(0, io.SeekStart); err != nil { diff --git a/modules/private/hook.go b/modules/private/hook.go index 559019344e..e208c14378 100644 --- a/modules/private/hook.go +++ b/modules/private/hook.go @@ -163,7 +163,7 @@ func HookProcReceive(ctx context.Context, ownerName, repoName string, opts HookO req.Body(jsonBytes) resp, err := req.Response() if err != nil { - return nil, fmt.Errorf("Unable to contact gitea: %v", err.Error()) + return nil, fmt.Errorf("Unable to contact gitea: %w", err) } defer resp.Body.Close() @@ -189,7 +189,7 @@ func SetDefaultBranch(ctx context.Context, ownerName, repoName, branch string) e req.SetTimeout(60*time.Second, 60*time.Second) resp, err := req.Response() if err != nil { - return fmt.Errorf("Unable to contact gitea: %v", err) + return fmt.Errorf("Unable to contact gitea: %w", err) } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { @@ -213,7 +213,7 @@ func SSHLog(ctx context.Context, isErr bool, msg string) error { req.SetTimeout(60*time.Second, 60*time.Second) resp, err := req.Response() if err != nil { - return fmt.Errorf("unable to contact gitea: %v", err) + return fmt.Errorf("unable to contact gitea: %w", err) } defer resp.Body.Close() diff --git a/modules/queue/queue_wrapped.go b/modules/queue/queue_wrapped.go index 02f7818aa8..e581ba75f3 100644 --- a/modules/queue/queue_wrapped.go +++ b/modules/queue/queue_wrapped.go @@ -76,9 +76,9 @@ func (q *delayedStarter) setInternal(atShutdown func(func()), handle HandlerFunc i++ if q.maxAttempts > 0 && i > q.maxAttempts { if bs, ok := q.cfg.([]byte); ok { - return fmt.Errorf("unable to create queue %v for %s with cfg %s by max attempts: error: %v", q.underlying, q.name, string(bs), err) + return fmt.Errorf("unable to create queue %v for %s with cfg %s by max attempts: error: %w", q.underlying, q.name, string(bs), err) } - return fmt.Errorf("unable to create queue %v for %s with cfg %#v by max attempts: error: %v", q.underlying, q.name, q.cfg, err) + return fmt.Errorf("unable to create queue %v for %s with cfg %#v by max attempts: error: %w", q.underlying, q.name, q.cfg, err) } sleepTime := 100 * time.Millisecond if q.timeout > 0 && q.maxAttempts > 0 { diff --git a/modules/recaptcha/recaptcha.go b/modules/recaptcha/recaptcha.go index c6798f7117..91b70dc588 100644 --- a/modules/recaptcha/recaptcha.go +++ b/modules/recaptcha/recaptcha.go @@ -37,7 +37,7 @@ func Verify(ctx context.Context, response string) (bool, error) { req, err := http.NewRequestWithContext(ctx, http.MethodPost, util.URLJoin(setting.Service.RecaptchaURL, apiURL), strings.NewReader(post.Encode())) if err != nil { - return false, fmt.Errorf("Failed to create CAPTCHA request: %v", err) + return false, fmt.Errorf("Failed to create CAPTCHA request: %w", err) } req.Header.Set("Content-Type", "application/x-www-form-urlencoded") diff --git a/modules/repository/commits.go b/modules/repository/commits.go index c4a69f4a01..7d6eec151f 100644 --- a/modules/repository/commits.go +++ b/modules/repository/commits.go @@ -78,7 +78,7 @@ func (pc *PushCommits) toAPIPayloadCommit(ctx context.Context, repoPath, repoLin fileStatus, err := git.GetCommitFileStatus(ctx, repoPath, commit.Sha1) if err != nil { - return nil, fmt.Errorf("FileStatus [commit_sha1: %s]: %v", commit.Sha1, err) + return nil, fmt.Errorf("FileStatus [commit_sha1: %s]: %w", commit.Sha1, err) } return &api.PayloadCommit{ diff --git a/modules/repository/create.go b/modules/repository/create.go index 966a6a2f21..1fec0335a2 100644 --- a/modules/repository/create.go +++ b/modules/repository/create.go @@ -37,7 +37,7 @@ func CreateRepositoryByExample(ctx context.Context, doer, u *user_model.User, re has, err := repo_model.IsRepositoryExist(ctx, u, repo.Name) if err != nil { - return fmt.Errorf("IsRepositoryExist: %v", err) + return fmt.Errorf("IsRepositoryExist: %w", err) } else if has { return repo_model.ErrRepoAlreadyExist{ Uname: u.Name, @@ -100,11 +100,11 @@ func CreateRepositoryByExample(ctx context.Context, doer, u *user_model.User, re // Remember visibility preference. u.LastRepoVisibility = repo.IsPrivate if err = user_model.UpdateUserCols(ctx, u, "last_repo_visibility"); err != nil { - return fmt.Errorf("UpdateUserCols: %v", err) + return fmt.Errorf("UpdateUserCols: %w", err) } if err = user_model.IncrUserRepoNum(ctx, u.ID); err != nil { - return fmt.Errorf("IncrUserRepoNum: %v", err) + return fmt.Errorf("IncrUserRepoNum: %w", err) } u.NumRepos++ @@ -112,40 +112,40 @@ func CreateRepositoryByExample(ctx context.Context, doer, u *user_model.User, re if u.IsOrganization() { teams, err := organization.FindOrgTeams(ctx, u.ID) if err != nil { - return fmt.Errorf("FindOrgTeams: %v", err) + return fmt.Errorf("FindOrgTeams: %w", err) } for _, t := range teams { if t.IncludesAllRepositories { if err := models.AddRepository(ctx, t, repo); err != nil { - return fmt.Errorf("AddRepository: %v", err) + return fmt.Errorf("AddRepository: %w", err) } } } if isAdmin, err := access_model.IsUserRepoAdmin(ctx, repo, doer); err != nil { - return fmt.Errorf("IsUserRepoAdmin: %v", err) + return fmt.Errorf("IsUserRepoAdmin: %w", err) } else if !isAdmin { // Make creator repo admin if it wasn't assigned automatically if err = addCollaborator(ctx, repo, doer); err != nil { - return fmt.Errorf("addCollaborator: %v", err) + return fmt.Errorf("addCollaborator: %w", err) } if err = repo_model.ChangeCollaborationAccessModeCtx(ctx, repo, doer.ID, perm.AccessModeAdmin); err != nil { - return fmt.Errorf("ChangeCollaborationAccessModeCtx: %v", err) + return fmt.Errorf("ChangeCollaborationAccessModeCtx: %w", err) } } } else if err = access_model.RecalculateAccesses(ctx, repo); err != nil { // Organization automatically called this in AddRepository method. - return fmt.Errorf("RecalculateAccesses: %v", err) + return fmt.Errorf("RecalculateAccesses: %w", err) } if setting.Service.AutoWatchNewRepos { if err = repo_model.WatchRepo(ctx, doer.ID, repo.ID, true); err != nil { - return fmt.Errorf("WatchRepo: %v", err) + return fmt.Errorf("WatchRepo: %w", err) } } if err = webhook.CopyDefaultWebhooksToRepo(ctx, repo.ID); err != nil { - return fmt.Errorf("CopyDefaultWebhooksToRepo: %v", err) + return fmt.Errorf("CopyDefaultWebhooksToRepo: %w", err) } return nil @@ -248,7 +248,7 @@ func CreateRepository(doer, u *user_model.User, opts CreateRepoOptions) (*repo_m return fmt.Errorf( "delete repo directory %s/%s failed(2): %v", u.Name, repo.Name, err2) } - return fmt.Errorf("initRepository: %v", err) + return fmt.Errorf("initRepository: %w", err) } // Initialize Issue Labels if selected @@ -256,12 +256,12 @@ func CreateRepository(doer, u *user_model.User, opts CreateRepoOptions) (*repo_m if err = InitializeLabels(ctx, repo.ID, opts.IssueLabels, false); err != nil { rollbackRepo = repo rollbackRepo.OwnerID = u.ID - return fmt.Errorf("InitializeLabels: %v", err) + return fmt.Errorf("InitializeLabels: %w", err) } } if err := CheckDaemonExportOK(ctx, repo); err != nil { - return fmt.Errorf("checkDaemonExportOK: %v", err) + return fmt.Errorf("checkDaemonExportOK: %w", err) } if stdout, _, err := git.NewCommand(ctx, "update-server-info"). @@ -270,7 +270,7 @@ func CreateRepository(doer, u *user_model.User, opts CreateRepoOptions) (*repo_m log.Error("CreateRepository(git update-server-info) in %v: Stdout: %s\nError: %v", repo, stdout, err) rollbackRepo = repo rollbackRepo.OwnerID = u.ID - return fmt.Errorf("CreateRepository(git update-server-info): %v", err) + return fmt.Errorf("CreateRepository(git update-server-info): %w", err) } return nil }); err != nil { @@ -290,12 +290,12 @@ func CreateRepository(doer, u *user_model.User, opts CreateRepoOptions) (*repo_m func UpdateRepoSize(ctx context.Context, repo *repo_model.Repository) error { size, err := util.GetDirectorySize(repo.RepoPath()) if err != nil { - return fmt.Errorf("updateSize: %v", err) + return fmt.Errorf("updateSize: %w", err) } lfsSize, err := git_model.GetRepoLFSSize(ctx, repo.ID) if err != nil { - return fmt.Errorf("updateSize: GetLFSMetaObjects: %v", err) + return fmt.Errorf("updateSize: GetLFSMetaObjects: %w", err) } return repo_model.UpdateRepoSize(ctx, repo.ID, size+lfsSize) @@ -339,7 +339,7 @@ func UpdateRepository(ctx context.Context, repo *repo_model.Repository, visibili e := db.GetEngine(ctx) if _, err = e.ID(repo.ID).AllCols().Update(repo); err != nil { - return fmt.Errorf("update: %v", err) + return fmt.Errorf("update: %w", err) } if err = UpdateRepoSize(ctx, repo); err != nil { @@ -348,12 +348,12 @@ func UpdateRepository(ctx context.Context, repo *repo_model.Repository, visibili if visibilityChanged { if err = repo.GetOwner(ctx); err != nil { - return fmt.Errorf("getOwner: %v", err) + return fmt.Errorf("getOwner: %w", err) } if repo.Owner.IsOrganization() { // Organization repository need to recalculate access table when visibility is changed. if err = access_model.RecalculateTeamAccesses(ctx, repo, 0); err != nil { - return fmt.Errorf("recalculateTeamAccesses: %v", err) + return fmt.Errorf("recalculateTeamAccesses: %w", err) } } @@ -374,12 +374,12 @@ func UpdateRepository(ctx context.Context, repo *repo_model.Repository, visibili forkRepos, err := repo_model.GetRepositoriesByForkID(ctx, repo.ID) if err != nil { - return fmt.Errorf("getRepositoriesByForkID: %v", err) + return fmt.Errorf("getRepositoriesByForkID: %w", err) } for i := range forkRepos { forkRepos[i].IsPrivate = repo.IsPrivate || repo.Owner.Visibility == api.VisibleTypePrivate if err = UpdateRepository(ctx, forkRepos[i], true); err != nil { - return fmt.Errorf("updateRepository[%d]: %v", forkRepos[i].ID, err) + return fmt.Errorf("updateRepository[%d]: %w", forkRepos[i].ID, err) } } } diff --git a/modules/repository/generate.go b/modules/repository/generate.go index a69dd12a78..c5fd7d60bf 100644 --- a/modules/repository/generate.go +++ b/modules/repository/generate.go @@ -153,22 +153,22 @@ func generateRepoCommit(ctx context.Context, repo, templateRepo, generateRepo *r Depth: 1, Branch: templateRepo.DefaultBranch, }); err != nil { - return fmt.Errorf("git clone: %v", err) + return fmt.Errorf("git clone: %w", err) } if err := util.RemoveAll(path.Join(tmpDir, ".git")); err != nil { - return fmt.Errorf("remove git dir: %v", err) + return fmt.Errorf("remove git dir: %w", err) } // Variable expansion gt, err := checkGiteaTemplate(tmpDir) if err != nil { - return fmt.Errorf("checkGiteaTemplate: %v", err) + return fmt.Errorf("checkGiteaTemplate: %w", err) } if gt != nil { if err := util.Remove(gt.Path); err != nil { - return fmt.Errorf("remove .giteatemplate: %v", err) + return fmt.Errorf("remove .giteatemplate: %w", err) } // Avoid walking tree if there are no globs @@ -215,7 +215,7 @@ func generateRepoCommit(ctx context.Context, repo, templateRepo, generateRepo *r SetDescription(fmt.Sprintf("generateRepoCommit (git remote add): %s to %s", templateRepoPath, tmpDir)). RunStdString(&git.RunOpts{Dir: tmpDir, Env: env}); err != nil { log.Error("Unable to add %v as remote origin to temporary repo to %s: stdout %s\nError: %v", repo, tmpDir, stdout, err) - return fmt.Errorf("git remote add: %v", err) + return fmt.Errorf("git remote add: %w", err) } // set default branch based on whether it's specified in the newly generated repo or not @@ -230,7 +230,7 @@ func generateRepoCommit(ctx context.Context, repo, templateRepo, generateRepo *r func generateGitContent(ctx context.Context, repo, templateRepo, generateRepo *repo_model.Repository) (err error) { tmpDir, err := os.MkdirTemp(os.TempDir(), "gitea-"+repo.Name) if err != nil { - return fmt.Errorf("Failed to create temp dir for repository %s: %v", repo.RepoPath(), err) + return fmt.Errorf("Failed to create temp dir for repository %s: %w", repo.RepoPath(), err) } defer func() { @@ -240,12 +240,12 @@ func generateGitContent(ctx context.Context, repo, templateRepo, generateRepo *r }() if err = generateRepoCommit(ctx, repo, templateRepo, generateRepo, tmpDir); err != nil { - return fmt.Errorf("generateRepoCommit: %v", err) + return fmt.Errorf("generateRepoCommit: %w", err) } // re-fetch repo if repo, err = repo_model.GetRepositoryByIDCtx(ctx, repo.ID); err != nil { - return fmt.Errorf("getRepositoryByID: %v", err) + return fmt.Errorf("getRepositoryByID: %w", err) } // if there was no default branch supplied when generating the repo, use the default one from the template @@ -255,14 +255,14 @@ func generateGitContent(ctx context.Context, repo, templateRepo, generateRepo *r gitRepo, err := git.OpenRepository(ctx, repo.RepoPath()) if err != nil { - return fmt.Errorf("openRepository: %v", err) + return fmt.Errorf("openRepository: %w", err) } defer gitRepo.Close() if err = gitRepo.SetDefaultBranch(repo.DefaultBranch); err != nil { - return fmt.Errorf("setDefaultBranch: %v", err) + return fmt.Errorf("setDefaultBranch: %w", err) } if err = UpdateRepository(ctx, repo, false); err != nil { - return fmt.Errorf("updateRepository: %v", err) + return fmt.Errorf("updateRepository: %w", err) } return nil @@ -275,11 +275,11 @@ func GenerateGitContent(ctx context.Context, templateRepo, generateRepo *repo_mo } if err := UpdateRepoSize(ctx, generateRepo); err != nil { - return fmt.Errorf("failed to update size for repository: %v", err) + return fmt.Errorf("failed to update size for repository: %w", err) } if err := git_model.CopyLFS(ctx, generateRepo, templateRepo); err != nil { - return fmt.Errorf("failed to copy LFS: %v", err) + return fmt.Errorf("failed to copy LFS: %w", err) } return nil } @@ -342,14 +342,14 @@ func GenerateRepository(ctx context.Context, doer, owner *user_model.User, templ } if err = CheckDaemonExportOK(ctx, generateRepo); err != nil { - return generateRepo, fmt.Errorf("checkDaemonExportOK: %v", err) + return generateRepo, fmt.Errorf("checkDaemonExportOK: %w", err) } if stdout, _, err := git.NewCommand(ctx, "update-server-info"). SetDescription(fmt.Sprintf("GenerateRepository(git update-server-info): %s", repoPath)). RunStdString(&git.RunOpts{Dir: repoPath}); err != nil { log.Error("GenerateRepository(git update-server-info) in %v: Stdout: %s\nError: %v", generateRepo, stdout, err) - return generateRepo, fmt.Errorf("error in GenerateRepository(git update-server-info): %v", err) + return generateRepo, fmt.Errorf("error in GenerateRepository(git update-server-info): %w", err) } return generateRepo, nil diff --git a/modules/repository/hooks.go b/modules/repository/hooks.go index 7bc77552bd..4d7d294a92 100644 --- a/modules/repository/hooks.go +++ b/modules/repository/hooks.go @@ -123,30 +123,30 @@ func createDelegateHooks(repoPath string) (err error) { newHookPath := filepath.Join(hookDir, hookName+".d", "gitea") if err := os.MkdirAll(filepath.Join(hookDir, hookName+".d"), os.ModePerm); err != nil { - return fmt.Errorf("create hooks dir '%s': %v", filepath.Join(hookDir, hookName+".d"), err) + return fmt.Errorf("create hooks dir '%s': %w", filepath.Join(hookDir, hookName+".d"), err) } // WARNING: This will override all old server-side hooks if err = util.Remove(oldHookPath); err != nil && !os.IsNotExist(err) { - return fmt.Errorf("unable to pre-remove old hook file '%s' prior to rewriting: %v ", oldHookPath, err) + return fmt.Errorf("unable to pre-remove old hook file '%s' prior to rewriting: %w ", oldHookPath, err) } if err = os.WriteFile(oldHookPath, []byte(hookTpls[i]), 0o777); err != nil { - return fmt.Errorf("write old hook file '%s': %v", oldHookPath, err) + return fmt.Errorf("write old hook file '%s': %w", oldHookPath, err) } if err = ensureExecutable(oldHookPath); err != nil { - return fmt.Errorf("Unable to set %s executable. Error %v", oldHookPath, err) + return fmt.Errorf("Unable to set %s executable. Error %w", oldHookPath, err) } if err = util.Remove(newHookPath); err != nil && !os.IsNotExist(err) { - return fmt.Errorf("unable to pre-remove new hook file '%s' prior to rewriting: %v", newHookPath, err) + return fmt.Errorf("unable to pre-remove new hook file '%s' prior to rewriting: %w", newHookPath, err) } if err = os.WriteFile(newHookPath, []byte(giteaHookTpls[i]), 0o777); err != nil { - return fmt.Errorf("write new hook file '%s': %v", newHookPath, err) + return fmt.Errorf("write new hook file '%s': %w", newHookPath, err) } if err = ensureExecutable(newHookPath); err != nil { - return fmt.Errorf("Unable to set %s executable. Error %v", oldHookPath, err) + return fmt.Errorf("Unable to set %s executable. Error %w", oldHookPath, err) } } diff --git a/modules/repository/init.go b/modules/repository/init.go index 473729a599..65072a9599 100644 --- a/modules/repository/init.go +++ b/modules/repository/init.go @@ -91,7 +91,7 @@ func GetRepoInitFile(tp, name string) ([]byte, error) { func GetLabelTemplateFile(name string) ([][3]string, error) { data, err := GetRepoInitFile("label", name) if err != nil { - return nil, ErrIssueLabelTemplateLoad{name, fmt.Errorf("GetRepoInitFile: %v", err)} + return nil, ErrIssueLabelTemplateLoad{name, fmt.Errorf("GetRepoInitFile: %w", err)} } lines := strings.Split(string(data), "\n") @@ -232,13 +232,13 @@ func prepareRepoCommit(ctx context.Context, repo *repo_model.Repository, tmpDir, SetDescription(fmt.Sprintf("prepareRepoCommit (git clone): %s to %s", repoPath, tmpDir)). RunStdString(&git.RunOpts{Dir: "", Env: env}); err != nil { log.Error("Failed to clone from %v into %s: stdout: %s\nError: %v", repo, tmpDir, stdout, err) - return fmt.Errorf("git clone: %v", err) + return fmt.Errorf("git clone: %w", err) } // README data, err := GetRepoInitFile("readme", opts.Readme) if err != nil { - return fmt.Errorf("GetRepoInitFile[%s]: %v", opts.Readme, err) + return fmt.Errorf("GetRepoInitFile[%s]: %w", opts.Readme, err) } cloneLink := repo.CloneLink() @@ -256,7 +256,7 @@ func prepareRepoCommit(ctx context.Context, repo *repo_model.Repository, tmpDir, } if err = os.WriteFile(filepath.Join(tmpDir, "README.md"), []byte(res), 0o644); err != nil { - return fmt.Errorf("write README.md: %v", err) + return fmt.Errorf("write README.md: %w", err) } // .gitignore @@ -266,7 +266,7 @@ func prepareRepoCommit(ctx context.Context, repo *repo_model.Repository, tmpDir, for _, name := range names { data, err = GetRepoInitFile("gitignore", name) if err != nil { - return fmt.Errorf("GetRepoInitFile[%s]: %v", name, err) + return fmt.Errorf("GetRepoInitFile[%s]: %w", name, err) } buf.WriteString("# ---> " + name + "\n") buf.Write(data) @@ -275,7 +275,7 @@ func prepareRepoCommit(ctx context.Context, repo *repo_model.Repository, tmpDir, if buf.Len() > 0 { if err = os.WriteFile(filepath.Join(tmpDir, ".gitignore"), buf.Bytes(), 0o644); err != nil { - return fmt.Errorf("write .gitignore: %v", err) + return fmt.Errorf("write .gitignore: %w", err) } } } @@ -284,11 +284,11 @@ func prepareRepoCommit(ctx context.Context, repo *repo_model.Repository, tmpDir, if len(opts.License) > 0 { data, err = GetRepoInitFile("license", opts.License) if err != nil { - return fmt.Errorf("GetRepoInitFile[%s]: %v", opts.License, err) + return fmt.Errorf("GetRepoInitFile[%s]: %w", opts.License, err) } if err = os.WriteFile(filepath.Join(tmpDir, "LICENSE"), data, 0o644); err != nil { - return fmt.Errorf("write LICENSE: %v", err) + return fmt.Errorf("write LICENSE: %w", err) } } @@ -314,7 +314,7 @@ func initRepoCommit(ctx context.Context, tmpPath string, repo *repo_model.Reposi SetDescription(fmt.Sprintf("initRepoCommit (git add): %s", tmpPath)). RunStdString(&git.RunOpts{Dir: tmpPath}); err != nil { log.Error("git add --all failed: Stdout: %s\nError: %v", stdout, err) - return fmt.Errorf("git add --all: %v", err) + return fmt.Errorf("git add --all: %w", err) } cmd := git.NewCommand(ctx, @@ -344,7 +344,7 @@ func initRepoCommit(ctx context.Context, tmpPath string, repo *repo_model.Reposi SetDescription(fmt.Sprintf("initRepoCommit (git commit): %s", tmpPath)). RunStdString(&git.RunOpts{Dir: tmpPath, Env: env}); err != nil { log.Error("Failed to commit: %v: Stdout: %s\nError: %v", cmd.String(), stdout, err) - return fmt.Errorf("git commit: %v", err) + return fmt.Errorf("git commit: %w", err) } if len(defaultBranch) == 0 { @@ -355,7 +355,7 @@ func initRepoCommit(ctx context.Context, tmpPath string, repo *repo_model.Reposi SetDescription(fmt.Sprintf("initRepoCommit (git push): %s", tmpPath)). RunStdString(&git.RunOpts{Dir: tmpPath, Env: InternalPushingEnvironment(u, repo)}); err != nil { log.Error("Failed to push back to HEAD: Stdout: %s\nError: %v", stdout, err) - return fmt.Errorf("git push: %v", err) + return fmt.Errorf("git push: %w", err) } return nil @@ -378,9 +378,9 @@ func checkInitRepository(ctx context.Context, owner, name string) (err error) { // Init git bare new repository. if err = git.InitRepository(ctx, repoPath, true); err != nil { - return fmt.Errorf("git.InitRepository: %v", err) + return fmt.Errorf("git.InitRepository: %w", err) } else if err = createDelegateHooks(repoPath); err != nil { - return fmt.Errorf("createDelegateHooks: %v", err) + return fmt.Errorf("createDelegateHooks: %w", err) } return nil } @@ -395,7 +395,7 @@ func initRepository(ctx context.Context, repoPath string, u *user_model.User, re if opts.AutoInit { tmpDir, err := os.MkdirTemp(os.TempDir(), "gitea-"+repo.Name) if err != nil { - return fmt.Errorf("Failed to create temp dir for repository %s: %v", repo.RepoPath(), err) + return fmt.Errorf("Failed to create temp dir for repository %s: %w", repo.RepoPath(), err) } defer func() { if err := util.RemoveAll(tmpDir); err != nil { @@ -404,19 +404,19 @@ func initRepository(ctx context.Context, repoPath string, u *user_model.User, re }() if err = prepareRepoCommit(ctx, repo, tmpDir, repoPath, opts); err != nil { - return fmt.Errorf("prepareRepoCommit: %v", err) + return fmt.Errorf("prepareRepoCommit: %w", err) } // Apply changes and commit. if err = initRepoCommit(ctx, tmpDir, repo, u, opts.DefaultBranch); err != nil { - return fmt.Errorf("initRepoCommit: %v", err) + return fmt.Errorf("initRepoCommit: %w", err) } } // Re-fetch the repository from database before updating it (else it would // override changes that were done earlier with sql) if repo, err = repo_model.GetRepositoryByIDCtx(ctx, repo.ID); err != nil { - return fmt.Errorf("getRepositoryByID: %v", err) + return fmt.Errorf("getRepositoryByID: %w", err) } if !opts.AutoInit { @@ -429,16 +429,16 @@ func initRepository(ctx context.Context, repoPath string, u *user_model.User, re repo.DefaultBranch = opts.DefaultBranch gitRepo, err := git.OpenRepository(ctx, repo.RepoPath()) if err != nil { - return fmt.Errorf("openRepository: %v", err) + return fmt.Errorf("openRepository: %w", err) } defer gitRepo.Close() if err = gitRepo.SetDefaultBranch(repo.DefaultBranch); err != nil { - return fmt.Errorf("setDefaultBranch: %v", err) + return fmt.Errorf("setDefaultBranch: %w", err) } } if err = UpdateRepository(ctx, repo, false); err != nil { - return fmt.Errorf("updateRepository: %v", err) + return fmt.Errorf("updateRepository: %w", err) } return nil diff --git a/modules/repository/repo.go b/modules/repository/repo.go index b01be322d2..de6de3bda4 100644 --- a/modules/repository/repo.go +++ b/modules/repository/repo.go @@ -70,7 +70,7 @@ func MigrateRepositoryGitData(ctx context.Context, u *user_model.User, var err error if err = util.RemoveAll(repoPath); err != nil { - return repo, fmt.Errorf("Failed to remove %s: %v", repoPath, err) + return repo, fmt.Errorf("Failed to remove %s: %w", repoPath, err) } if err = git.Clone(ctx, opts.CloneAddr, repoPath, git.CloneRepoOptions{ @@ -79,7 +79,7 @@ func MigrateRepositoryGitData(ctx context.Context, u *user_model.User, Timeout: migrateTimeout, SkipTLSVerify: setting.Migrations.SkipTLSVerify, }); err != nil { - return repo, fmt.Errorf("Clone: %v", err) + return repo, fmt.Errorf("Clone: %w", err) } if err := git.WriteCommitGraph(ctx, repoPath); err != nil { @@ -91,7 +91,7 @@ func MigrateRepositoryGitData(ctx context.Context, u *user_model.User, wikiRemotePath := WikiRemoteURL(ctx, opts.CloneAddr) if len(wikiRemotePath) > 0 { if err := util.RemoveAll(wikiPath); err != nil { - return repo, fmt.Errorf("Failed to remove %s: %v", wikiPath, err) + return repo, fmt.Errorf("Failed to remove %s: %w", wikiPath, err) } if err := git.Clone(ctx, wikiRemotePath, wikiPath, git.CloneRepoOptions{ @@ -103,7 +103,7 @@ func MigrateRepositoryGitData(ctx context.Context, u *user_model.User, }); err != nil { log.Warn("Clone wiki: %v", err) if err := util.RemoveAll(wikiPath); err != nil { - return repo, fmt.Errorf("Failed to remove %s: %v", wikiPath, err) + return repo, fmt.Errorf("Failed to remove %s: %w", wikiPath, err) } } else { if err := git.WriteCommitGraph(ctx, wikiPath); err != nil { @@ -118,25 +118,25 @@ func MigrateRepositoryGitData(ctx context.Context, u *user_model.User, } if err = CheckDaemonExportOK(ctx, repo); err != nil { - return repo, fmt.Errorf("checkDaemonExportOK: %v", err) + return repo, fmt.Errorf("checkDaemonExportOK: %w", err) } if stdout, _, err := git.NewCommand(ctx, "update-server-info"). SetDescription(fmt.Sprintf("MigrateRepositoryGitData(git update-server-info): %s", repoPath)). RunStdString(&git.RunOpts{Dir: repoPath}); err != nil { log.Error("MigrateRepositoryGitData(git update-server-info) in %v: Stdout: %s\nError: %v", repo, stdout, err) - return repo, fmt.Errorf("error in MigrateRepositoryGitData(git update-server-info): %v", err) + return repo, fmt.Errorf("error in MigrateRepositoryGitData(git update-server-info): %w", err) } gitRepo, err := git.OpenRepository(ctx, repoPath) if err != nil { - return repo, fmt.Errorf("OpenRepository: %v", err) + return repo, fmt.Errorf("OpenRepository: %w", err) } defer gitRepo.Close() repo.IsEmpty, err = gitRepo.IsEmpty() if err != nil { - return repo, fmt.Errorf("git.IsEmpty: %v", err) + return repo, fmt.Errorf("git.IsEmpty: %w", err) } if !repo.IsEmpty { @@ -144,7 +144,7 @@ func MigrateRepositoryGitData(ctx context.Context, u *user_model.User, // Try to get HEAD branch and set it as default branch. headBranch, err := gitRepo.GetHEADBranch() if err != nil { - return repo, fmt.Errorf("GetHEADBranch: %v", err) + return repo, fmt.Errorf("GetHEADBranch: %w", err) } if headBranch != nil { repo.DefaultBranch = headBranch.Name @@ -207,7 +207,7 @@ func MigrateRepositoryGitData(ctx context.Context, u *user_model.User, } if err = repo_model.InsertMirror(ctx, &mirrorModel); err != nil { - return repo, fmt.Errorf("InsertOne: %v", err) + return repo, fmt.Errorf("InsertOne: %w", err) } repo.IsMirror = true @@ -231,11 +231,11 @@ func MigrateRepositoryGitData(ctx context.Context, u *user_model.User, func cleanUpMigrateGitConfig(configPath string) error { cfg, err := ini.Load(configPath) if err != nil { - return fmt.Errorf("open config file: %v", err) + return fmt.Errorf("open config file: %w", err) } cfg.DeleteSection("remote \"origin\"") if err = cfg.SaveToIndent(configPath, "\t"); err != nil { - return fmt.Errorf("save config file: %v", err) + return fmt.Errorf("save config file: %w", err) } return nil } @@ -244,22 +244,22 @@ func cleanUpMigrateGitConfig(configPath string) error { func CleanUpMigrateInfo(ctx context.Context, repo *repo_model.Repository) (*repo_model.Repository, error) { repoPath := repo.RepoPath() if err := createDelegateHooks(repoPath); err != nil { - return repo, fmt.Errorf("createDelegateHooks: %v", err) + return repo, fmt.Errorf("createDelegateHooks: %w", err) } if repo.HasWiki() { if err := createDelegateHooks(repo.WikiPath()); err != nil { - return repo, fmt.Errorf("createDelegateHooks.(wiki): %v", err) + return repo, fmt.Errorf("createDelegateHooks.(wiki): %w", err) } } _, _, err := git.NewCommand(ctx, "remote", "rm", "origin").RunStdString(&git.RunOpts{Dir: repoPath}) if err != nil && !strings.HasPrefix(err.Error(), "exit status 128 - fatal: No such remote ") { - return repo, fmt.Errorf("CleanUpMigrateInfo: %v", err) + return repo, fmt.Errorf("CleanUpMigrateInfo: %w", err) } if repo.HasWiki() { if err := cleanUpMigrateGitConfig(path.Join(repo.WikiPath(), "config")); err != nil { - return repo, fmt.Errorf("cleanUpMigrateGitConfig (wiki): %v", err) + return repo, fmt.Errorf("cleanUpMigrateGitConfig (wiki): %w", err) } } diff --git a/modules/repository/temp.go b/modules/repository/temp.go index 5947d29965..21af039469 100644 --- a/modules/repository/temp.go +++ b/modules/repository/temp.go @@ -27,12 +27,12 @@ func LocalCopyPath() string { func CreateTemporaryPath(prefix string) (string, error) { if err := os.MkdirAll(LocalCopyPath(), os.ModePerm); err != nil { log.Error("Unable to create localcopypath directory: %s (%v)", LocalCopyPath(), err) - return "", fmt.Errorf("Failed to create localcopypath directory %s: %v", LocalCopyPath(), err) + return "", fmt.Errorf("Failed to create localcopypath directory %s: %w", LocalCopyPath(), err) } basePath, err := os.MkdirTemp(LocalCopyPath(), prefix+".git") if err != nil { log.Error("Unable to create temporary directory: %s-*.git (%v)", prefix, err) - return "", fmt.Errorf("Failed to create dir %s-*.git: %v", prefix, err) + return "", fmt.Errorf("Failed to create dir %s-*.git: %w", prefix, err) } return basePath, nil diff --git a/modules/setting/database.go b/modules/setting/database.go index af4e780d76..4e55457395 100644 --- a/modules/setting/database.go +++ b/modules/setting/database.go @@ -137,7 +137,7 @@ func DBConnStr() (string, error) { return "", errors.New("this binary version does not build support for SQLite3") } if err := os.MkdirAll(path.Dir(Database.Path), os.ModePerm); err != nil { - return "", fmt.Errorf("Failed to create directories: %v", err) + return "", fmt.Errorf("Failed to create directories: %w", err) } journalMode := "" if Database.SQLiteJournalMode != "" { diff --git a/modules/setting/directory.go b/modules/setting/directory.go index 5dcdd89c04..2641510286 100644 --- a/modules/setting/directory.go +++ b/modules/setting/directory.go @@ -23,13 +23,13 @@ func PrepareAppDataPath() error { if os.IsNotExist(err) { err = os.MkdirAll(AppDataPath, os.ModePerm) if err != nil { - return fmt.Errorf("unable to create the APP_DATA_PATH directory: %q, Error: %v", AppDataPath, err) + return fmt.Errorf("unable to create the APP_DATA_PATH directory: %q, Error: %w", AppDataPath, err) } return nil } if err != nil { - return fmt.Errorf("unable to use APP_DATA_PATH %q. Error: %v", AppDataPath, err) + return fmt.Errorf("unable to use APP_DATA_PATH %q. Error: %w", AppDataPath, err) } if !st.IsDir() /* also works for symlink */ { diff --git a/modules/setting/setting.go b/modules/setting/setting.go index f93be2fbd1..043acb733d 100644 --- a/modules/setting/setting.go +++ b/modules/setting/setting.go @@ -22,6 +22,7 @@ import ( "time" "code.gitea.io/gitea/modules/container" + "code.gitea.io/gitea/modules/generate" "code.gitea.io/gitea/modules/json" "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/user" @@ -451,6 +452,7 @@ var ( RunUser string IsWindows bool HasRobotsTxt bool + EnableSitemap bool InternalToken string // internal access token ) @@ -962,6 +964,11 @@ func loadFromConf(allowEmpty bool, extraConfig string) { SuccessfulTokensCacheSize = sec.Key("SUCCESSFUL_TOKENS_CACHE_SIZE").MustInt(20) InternalToken = loadSecret(sec, "INTERNAL_TOKEN_URI", "INTERNAL_TOKEN") + if InstallLock && InternalToken == "" { + // if Gitea has been installed but the InternalToken hasn't been generated (upgrade from an old release), we should generate + // some users do cluster deployment, they still depend on this auto-generating behavior. + generateSaveInternalToken() + } cfgdata := sec.Key("PASSWORD_COMPLEXITY").Strings(",") if len(cfgdata) == 0 { @@ -1094,6 +1101,7 @@ func loadFromConf(allowEmpty bool, extraConfig string) { ShowFooterBranding = Cfg.Section("other").Key("SHOW_FOOTER_BRANDING").MustBool(false) ShowFooterVersion = Cfg.Section("other").Key("SHOW_FOOTER_VERSION").MustBool(true) ShowFooterTemplateLoadTime = Cfg.Section("other").Key("SHOW_FOOTER_TEMPLATE_LOAD_TIME").MustBool(true) + EnableSitemap = Cfg.Section("other").Key("ENABLE_SITEMAP").MustBool(true) UI.ShowUserEmail = Cfg.Section("ui").Key("SHOW_USER_EMAIL").MustBool(true) UI.DefaultShowFullName = Cfg.Section("ui").Key("DEFAULT_SHOW_FULL_NAME").MustBool(false) @@ -1182,6 +1190,19 @@ func loadSecret(sec *ini.Section, uriKey, verbatimKey string) string { } } +// generateSaveInternalToken generates and saves the internal token to app.ini +func generateSaveInternalToken() { + token, err := generate.NewInternalToken() + if err != nil { + log.Fatal("Error generate internal token: %v", err) + } + + InternalToken = token + CreateOrAppendToCustomConf("security.INTERNAL_TOKEN", func(cfg *ini.File) { + cfg.Section("security").Key("INTERNAL_TOKEN").SetValue(token) + }) +} + // MakeAbsoluteAssetURL returns the absolute asset url prefix without a trailing slash func MakeAbsoluteAssetURL(appURL, staticURLPrefix string) string { parsedPrefix, err := url.Parse(strings.TrimSuffix(staticURLPrefix, "/")) diff --git a/modules/system/item_runtime.go b/modules/system/item_runtime.go index ef758a5675..e022a0daad 100644 --- a/modules/system/item_runtime.go +++ b/modules/system/item_runtime.go @@ -6,7 +6,8 @@ package system // RuntimeState contains app state for runtime, and we can save remote version for update checker here in future type RuntimeState struct { - LastAppPath string `json:"last_app_path"` + LastAppPath string `json:"last_app_path"` + LastCustomConf string `json:"last_custom_conf"` } // Name returns the item name diff --git a/modules/timeutil/timestamp.go b/modules/timeutil/timestamp.go index 40fcb8603f..36b2aff575 100644 --- a/modules/timeutil/timestamp.go +++ b/modules/timeutil/timestamp.go @@ -103,5 +103,5 @@ func (ts TimeStamp) FormatDate() string { // IsZero is zero time func (ts TimeStamp) IsZero() bool { - return ts.AsTimeInLocation(time.Local).IsZero() + return int64(ts) == 0 } diff --git a/options/locale/locale_bg-BG.ini b/options/locale/locale_bg-BG.ini index 24617e648d..61c2929ba2 100644 --- a/options/locale/locale_bg-BG.ini +++ b/options/locale/locale_bg-BG.ini @@ -72,6 +72,8 @@ error404=Страницата, която се опитвате да достъ +[filter] + [error] [startpage] diff --git a/options/locale/locale_cs-CZ.ini b/options/locale/locale_cs-CZ.ini index 6da1cac65d..a89e441f75 100644 --- a/options/locale/locale_cs-CZ.ini +++ b/options/locale/locale_cs-CZ.ini @@ -106,6 +106,8 @@ never=Nikdy rss_feed=RSS kanál +[filter] + [error] occurred=Došlo k chybě report_message=Pokud jste si jisti, že se jedná o chybu Gitea, prosím vyhledejte problém na GitHub a v případě potřeby otevřete nový problém. @@ -740,9 +742,6 @@ create_oauth2_application_button=Vytvořit aplikaci create_oauth2_application_success=Úspěšně jste vytvořili novou OAuth2 aplikaci. update_oauth2_application_success=Úspěšně jste aktualizovali OAuth2 aplikaci. oauth2_application_name=Název aplikace -oauth2_select_type=Jaký typ aplikace se hodí? -oauth2_type_web=Webová (např. Node.JS, Tomcat, Go) -oauth2_type_native=Nativní (např. Mobil, Desktop, Prohlížeč) oauth2_redirect_uri=URI přesměrování save_application=Uložit oauth2_client_id=ID klienta diff --git a/options/locale/locale_de-DE.ini b/options/locale/locale_de-DE.ini index 789774e322..d8874fd5fa 100644 --- a/options/locale/locale_de-DE.ini +++ b/options/locale/locale_de-DE.ini @@ -106,6 +106,8 @@ never=Niemals rss_feed=RSS Feed +[filter] + [error] occurred=Ein Fehler ist aufgetreten report_message=Wenn du dir sicher bist, dass dies ein Fehler von Gitea ist, suche bitte auf GitHub nach diesem Fehler und erstelle gegebenenfalls ein neues Issue. @@ -734,9 +736,6 @@ create_oauth2_application_button=Anwendung erstellen create_oauth2_application_success=Du hast erfolgreich eine neue OAuth2 Anwendung erstellt. update_oauth2_application_success=Du hast erfolgreich eine neue OAuth2 Anwendung bearbeitet. oauth2_application_name=Name der Anwendung -oauth2_select_type=Welcher Anwendungstyp passt? -oauth2_type_web=Web (z.B. Node.JS, Tomcat, Go) -oauth2_type_native=Native (z.B. Mobile, Desktop, Browser) oauth2_redirect_uri=Weiterleitungs-URI save_application=Speichern oauth2_client_id=Client-ID diff --git a/options/locale/locale_el-GR.ini b/options/locale/locale_el-GR.ini index 62ef37d4b1..200dabaf89 100644 --- a/options/locale/locale_el-GR.ini +++ b/options/locale/locale_el-GR.ini @@ -106,6 +106,10 @@ never=Ποτέ rss_feed=Ροή RSS +[filter] +string.asc=A - Z +string.desc=Z - A + [error] occurred=Παρουσιάστηκε ένα σφάλμα report_message=Αν είστε σίγουροι ότι πρόκειται για ένα πρόβλημα στο Gitea, παρακαλώ αναζητήστε στα ζητήματα στο GitHub ή ανοίξτε ένα νέο ζήτημα εάν είναι απαραίτητο. @@ -268,8 +272,11 @@ users=Χρήστες organizations=Οργανισμοί search=Αναζήτηση code=Κώδικας +search.type.tooltip=Τύπος αναζήτησης search.fuzzy=Fuzzy +search.fuzzy.tooltip=Συμπερίληψη και των αποτελεσμάτων που είναι πλησιέστερα με τον όρο αναζήτησης search.match=Ταίριασμα +search.match.tooltip=Συμπερίληψη μόνο των αποτελεσμάτων που ταιριάζουν ακριβώς με τον όρο αναζήτησης code_search_unavailable=Η αναζήτηση κώδικα δεν είναι διαθέσιμη αυτή τη στιγμή. Παρακαλώ επικοινωνήστε με το διαχειριστή. repo_no_results=Δεν βρέθηκαν αποθετήρια που να ταιρίαζουν με τα κριτήρια. user_no_results=Δεν βρέθηκαν χρήστες που να ταιριάζουν με τα κριτήρια. @@ -409,6 +416,10 @@ repo.transfer.body=Για να το αποδεχτείτε ή να το απορ repo.collaborator.added.subject=%s σας πρόσθεσε στο %s repo.collaborator.added.text=Έχετε προστεθεί ως συνεργάτης του αποθετηρίου: +team_invite.subject=%[1]s σας προσκάλεσε να συμμετέχετε στον οργανισμό %[2]s +team_invite.text_1=%[1]s σας προσκάλεσε να συμμετέχετε στην ομάδα %[2]s στον οργανισμός %[3]. +team_invite.text_2=Παρακαλώ κάντε κλικ στον παρακάτω σύνδεσμο για να συμμετάσχετε στην ομάδα: +team_invite.text_3=Σημείωση: Αυτή η πρόσκληση προοριζόταν για %[1]s. Αν δεν περιμένατε αυτή την πρόσκληση, μπορείτε να αγνοήσετε αυτό το email. [modal] yes=Ναι @@ -485,6 +496,7 @@ user_not_exist=Δεν υπάρχει ο χρήστης. team_not_exist=Δεν υπάρχει η ομάδα. last_org_owner=Δεν μπορείτε να καταργήσετε τον τελευταίο χρήστη από την ομάδα 'ιδιοκτήτών'. Πρέπει να υπάρχει τουλάχιστον ένας ιδιοκτήτης για έναν οργανισμό. cannot_add_org_to_team=Ένας οργανισμός δεν μπορεί να προστεθεί ως μέλος ομάδας. +duplicate_invite_to_team=Ο χρήστης είχε ήδη προσκληθεί ως μέλος της ομάδας. invalid_ssh_key=Δεν είναι δυνατή η επαλήθευση του SSH κλειδιού σας: %s invalid_gpg_key=Δεν είναι δυνατή η επαλήθευση του GPG κλειδιού σας: %s @@ -736,9 +748,7 @@ create_oauth2_application_button=Δημιουργία Εφαρμογής create_oauth2_application_success=Δημιουργήσατε επιτυχώς μια νέα εφαρμογή OAuth2. update_oauth2_application_success=Ενημερώσατε επιτυχώς την εφαρμογή OAuth2. oauth2_application_name=Όνομα Εφαρμογής -oauth2_select_type=Ποιος τύπος εφαρμογής ταιριάζει; -oauth2_type_web=Web (πχ Node.JS, Tomcat, Go) -oauth2_type_native=Εγγενές (π.χ. Κινητό, Επιφάνεια Εργασίας, Πρόγραμμα Περιήγησης) +oauth2_confidential_client=Εμπιστευτικός Πελάτης. Επιλέξτε το για εφαρμογές που διατηρούν το μυστικό κωδικό κρυφό, όπως πχ οι εφαρμογές ιστού. Μην επιλέγετε για εγγενείς εφαρμογές, συμπεριλαμβανομένων εφαρμογών επιφάνειας εργασίας και εφαρμογών για κινητά. oauth2_redirect_uri=URI Ανακατεύθυνσης save_application=Αποθήκευση oauth2_client_id=Ταυτότητα Πελάτη @@ -1764,8 +1774,11 @@ activity.git_stats_deletion_n=%d διαγραφές search=Αναζήτηση search.search_repo=Αναζήτηση αποθετηρίου +search.type.tooltip=Τύπος αναζήτησης search.fuzzy=Fuzzy +search.fuzzy.tooltip=Συμπερίληψη και των αποτελεσμάτων που είναι πλησιέστερα με τον όρο αναζήτησης search.match=Ταίριασμα +search.match.tooltip=Συμπερίληψη μόνο των αποτελεσμάτων που ταιριάζουν ακριβώς με τον όρο αναζήτησης search.results=Αποτελέσματα αναζήτησης για "%s" σε %s search.code_no_results=Δεν βρέθηκε πηγαίος κώδικας που να ταιριάζει με τον όρο αναζήτησης. search.code_search_unavailable=Η αναζήτηση κώδικα δεν είναι διαθέσιμη αυτή τη στιγμή. Παρακαλώ επικοινωνήστε με το διαχειριστή. @@ -1899,6 +1912,7 @@ settings.confirm_delete=Διαγραφή Αποθετηρίου settings.add_collaborator=Προσθήκη Συνεργάτη settings.add_collaborator_success=Έχει προστεθεί ο συνεργάτης. settings.add_collaborator_inactive_user=Δεν είναι δυνατή η προσθήκη ενός ανενεργού χρήστη ως συνεργάτη. +settings.add_collaborator_owner=Δεν είναι δυνατή η προσθήκη ενός ιδιοκτήτη σαν συνεργάτη. settings.add_collaborator_duplicate=Ο συνεργάτης έχει ήδη προστεθεί σε αυτό το αποθετήριο. settings.delete_collaborator=Αφαίρεση settings.collaborator_deletion=Αφαίρεση Συνεργάτη @@ -2394,6 +2408,8 @@ teams.members=Μέλη Ομάδας teams.update_settings=Ενημέρωση Ρυθμίσεων teams.delete_team=Διαγραφή Ομάδας teams.add_team_member=Προσθήκη Μέλους Ομάδας +teams.invite_team_member=Πρόσκληση στο %s +teams.invite_team_member.list=Εκκρεμείς Προσκλήσεις teams.delete_team_title=Διαγραφή Ομάδας teams.delete_team_desc=Η διαγραφή μιας ομάδας ανακαλεί τη πρόσβαση στο αποθετήριο από τα μέλη της. Συνέχεια; teams.delete_team_success=Η ομάδα έχει διαγραφεί. @@ -2418,6 +2434,9 @@ teams.all_repositories_helper=Η ομάδα έχει πρόσβαση σε όλ teams.all_repositories_read_permission_desc=Αυτή η ομάδα χορηγεί πρόσβαση Ανάγνωσης σε όλα τα αποθετήρια: τα μέλη μπορούν να δουν και να κλωνοποιήσουν αποθετήρια. teams.all_repositories_write_permission_desc=Αυτή η ομάδα χορηγεί πρόσβαση Εγγραφής σε όλα τα αποθετήρια: τα μέλη μπορούν να διαβάσουν και να κάνουν push σε αποθετήρια. teams.all_repositories_admin_permission_desc=Αυτή η ομάδα παρέχει πρόσβαση Διαχείρισης σε όλα τα αποθετήρια: τα μέλη μπορούν να διαβάσουν, να κάνουν push και να προσθέσουν συνεργάτες στα αποθετήρια. +teams.invite.title=Έχετε προσκληθεί να συμμετέχετε στην ομάδα %s στον οργανισμό %s. +teams.invite.by=Προσκλήθηκε από %s +teams.invite.description=Παρακαλώ κάντε κλικ στον παρακάτω σύνδεσμο για συμμετοχή στην ομάδα. [admin] dashboard=Πίνακας Ελέγχου @@ -2871,6 +2890,8 @@ config.access_log_template=Πρότυπο config.xorm_log_mode=Λειτουργία Καταγραφών XORM config.xorm_log_sql=Καταγραφή SQL +config.get_setting_failed=Αποτυχία λήψης ρύθμισης %s +config.set_setting_failed=Αποτυχία ορισμού της ρύθμισης %s monitor.cron=Προγραμματισμένες Εργασίες monitor.name=Όνομα @@ -3035,6 +3056,9 @@ pin=Καρφίτσωμα ειδοποίησης mark_as_read=Σήμανση ως αναγνωσμένο mark_as_unread=Σήμανση ως μη αναγνωσμένο mark_all_as_read=Σήμανση όλων ως αναγνωσμένα +subscriptions=Συνδρομές +watching=Παρακολούθηση +no_subscriptions=Καμία συνδρομή [gpg] default_key=Υπογραφή με το προεπιλεγμένο κλειδί @@ -3094,6 +3118,7 @@ container.details.platform=Πλατφόρμα container.details.repository_site=Ιστοσελίδα Αποθετηρίου container.details.documentation_site=Ιστοσελίδα Τεκμηρίωσης container.pull=Κατεβάστε την εικόνα από τη γραμμή εντολών: +container.digest=Σύνοψη: container.documentation=Για περισσότερες πληροφορίες σχετικά με το μητρώο για Container, ανατρέξτε στην τεκμηρίωση. container.multi_arch=ΛΣ / Αρχιτεκτονική container.layers=Στρώματα Εικόνας diff --git a/options/locale/locale_es-ES.ini b/options/locale/locale_es-ES.ini index 31264ea9bd..3a16819c3d 100644 --- a/options/locale/locale_es-ES.ini +++ b/options/locale/locale_es-ES.ini @@ -106,6 +106,10 @@ never=Nunca rss_feed=Fuentes RSS +[filter] +string.asc=A - Z +string.desc=Z - A + [error] occurred=Ha ocurrido un error report_message=Si estás seguro de que este es un error de Gitea, por favor busca un problema en GitHub y abre un nuevo problema si es necesario. @@ -270,6 +274,7 @@ search=Buscar code=Código search.type.tooltip=Tipo de búsqueda search.fuzzy=Parcial +search.fuzzy.tooltip=Incluye los resultados que también coincidan con el término de búsqueda search.match=Coincidir search.match.tooltip=Incluye sólo los resultados que coincidan con el término de búsqueda exacto code_search_unavailable=Actualmente la búsqueda de código no está disponible. Póngase en contacto con el administrador de su sitio. @@ -411,6 +416,10 @@ repo.transfer.body=Para aceptarlo o rechazarlo, visita %s o simplemente ignórel repo.collaborator.added.subject=%s le añadió en %s repo.collaborator.added.text=Has sido añadido como colaborador del repositorio: +team_invite.subject=%[1]s le ha invitado a unirse a la organización de %[2]s +team_invite.text_1=%[1]s le ha invitado a unirse al equipo %[2]s en la organización %[3]s. +team_invite.text_2=Por favor, haz clic en el siguiente enlace para unirte al equipo: +team_invite.text_3=Nota: Esta invitación estaba destinada a %[1]s. Si no esperabas esta invitación, puedes ignorar este correo electrónico. [modal] yes=Sí @@ -487,6 +496,7 @@ user_not_exist=Este usuario no existe. team_not_exist=Este equipo no existe. last_org_owner=No puedes eliminar al último usuario del equipo de 'propietarios'. Todas las organizaciones deben tener al menos un propietario. cannot_add_org_to_team=Una organización no puede ser añadida como miembro de un equipo. +duplicate_invite_to_team=El usuario ya fue invitado como miembro del equipo. invalid_ssh_key=No se puede verificar su clave SSH: %s invalid_gpg_key=No se puede verificar su clave GPG: %s @@ -739,9 +749,6 @@ create_oauth2_application_button=Crear Aplicación create_oauth2_application_success=Ha creado una nueva aplicación OAuth2 con éxito. update_oauth2_application_success=Ha actualizado correctamente la aplicación OAuth2. oauth2_application_name=Nombre de la Aplicación -oauth2_select_type=¿Qué tipo de aplicación es? -oauth2_type_web=Web (por ejemplo: Node.JS, Tomcat, Go) -oauth2_type_native=Nativa (por ejemplo, móvil, escritorio, navegador) oauth2_redirect_uri=URI de redireccionado save_application=Guardar oauth2_client_id=ID de cliente @@ -1769,6 +1776,7 @@ search=Buscar search.search_repo=Buscar repositorio search.type.tooltip=Tipo de búsqueda search.fuzzy=Parcial +search.fuzzy.tooltip=Incluye los resultados que también coinciden aproximadamente con el término de búsqueda search.match=Coincidir search.match.tooltip=Incluye sólo los resultados que coincidan con el término de búsqueda exacto search.results=Resultados de la búsqueda para "%s" en %s @@ -2401,6 +2409,8 @@ teams.members=Miembros del equipo teams.update_settings=Actualizar configuración teams.delete_team=Eliminar equipo teams.add_team_member=Añadir miembro al equipo +teams.invite_team_member=Invitar a %s +teams.invite_team_member.list=Invitaciones pendientes teams.delete_team_title=Eliminar equipo teams.delete_team_desc=Eliminar un equipo revoca el acceso de repositorio a sus miembros ¿Continuar? teams.delete_team_success=El equipo ha sido eliminado. @@ -2425,6 +2435,9 @@ teams.all_repositories_helper=El equipo tiene acceso a todos los repositorios. S teams.all_repositories_read_permission_desc=Este equipo concede Leer a todos los repositorios: los miembros pueden ver y clonar repositorios. teams.all_repositories_write_permission_desc=Este equipo concede Escribir a todos los repositorios: los miembros pueden leer y enviar a los repositorios. teams.all_repositories_admin_permission_desc=Este equipo concede a Administrador acceso a todos los repositorios: los miembros pueden leer, enviar y agregar colaboradores a los repositorios. +teams.invite.title=Has sido invitado a unirte al equipo %s en la organización %s. +teams.invite.by=Invitado por %s +teams.invite.description=Por favor, haga clic en el botón de abajo para unirse al equipo. [admin] dashboard=Panel de control @@ -2878,6 +2891,8 @@ config.access_log_template=Plantilla config.xorm_log_mode=Modo de registro XORM config.xorm_log_sql=Registrar SQL +config.get_setting_failed=Error al obtener la configuración %s +config.set_setting_failed=Error al configurar %s monitor.cron=Tareas de Cron monitor.name=Nombre diff --git a/options/locale/locale_fa-IR.ini b/options/locale/locale_fa-IR.ini index e86480d0bc..a1e20b61dc 100644 --- a/options/locale/locale_fa-IR.ini +++ b/options/locale/locale_fa-IR.ini @@ -91,6 +91,8 @@ error404=صفحه موردنظر شما یا وجود نداردGitHubista tai avaa uusi ongelma tarvittaessa. diff --git a/options/locale/locale_fr-FR.ini b/options/locale/locale_fr-FR.ini index eaedeaf9c3..c5c140404a 100644 --- a/options/locale/locale_fr-FR.ini +++ b/options/locale/locale_fr-FR.ini @@ -106,6 +106,8 @@ never=Jamais rss_feed=Flux RSS +[filter] + [error] occurred=Une erreur s’est produite report_message=Si vous êtes sûr qu'il s'agit d'un bug de Gitea, cherchez s’il existe des tickets sur GitHub ou ouvrez-en un nouveau si nécessaire. @@ -740,9 +742,6 @@ create_oauth2_application_button=Créer une application create_oauth2_application_success=Vous avez créé avec succès une nouvelle application OAuth2. update_oauth2_application_success=Vous avez mis à jour l'application OAuth2 avec succès. oauth2_application_name=Nom de l'Application -oauth2_select_type=De quel type d'application s'agit-il ? -oauth2_type_web=Web (par exemple Node.JS, Tomcat, Go) -oauth2_type_native=Native (par exemple Mobile, Bureau, Navigateur) oauth2_redirect_uri=URL de redirection save_application=Enregistrer oauth2_client_id=ID du client diff --git a/options/locale/locale_hu-HU.ini b/options/locale/locale_hu-HU.ini index c5bd8c5af2..1edb42932e 100644 --- a/options/locale/locale_hu-HU.ini +++ b/options/locale/locale_hu-HU.ini @@ -80,6 +80,8 @@ error404=Az elérni kívánt oldal vagy nem létezik, vagy er ekki til never=Aldrei +[filter] + [error] occurred=Villa kom upp report_message=Ef þú ert viss um að þetta sé villa í Gitea þá skaltu leita að vandamálum á GitHub eða opna nýtt vandamál ef þörf krefst. @@ -551,9 +553,6 @@ access_token_deletion=Eyða Aðgangslykli create_oauth2_application_button=Skapa Forrit update_oauth2_application_success=Þú hefur uppfært OAuth2 forritið. oauth2_application_name=Forritsheiti -oauth2_select_type=Hvaða forritsgerð passar? -oauth2_type_web=Net (t.d. Node.JS, Tomcat, Go) -oauth2_type_native=Á kerfi (t.d. síma, tölvu, vafra) oauth2_redirect_uri=Áframsendingar Vefslóð save_application=Vista oauth2_client_id=Auðkenni Notanda diff --git a/options/locale/locale_it-IT.ini b/options/locale/locale_it-IT.ini index 2a159dda6f..2c859a93e4 100644 --- a/options/locale/locale_it-IT.ini +++ b/options/locale/locale_it-IT.ini @@ -106,6 +106,8 @@ never=Mai rss_feed=Feed RSS +[filter] + [error] occurred=Si è verificato un errore report_message=Se sei sicuro che questo sia un bug Gitea, cerca i problemi su GitHub o apri un nuovo problema se necessario. @@ -734,9 +736,6 @@ create_oauth2_application_button=Crea applicazione create_oauth2_application_success=Hai creato con successo una nuova applicazione OAuth2. update_oauth2_application_success=Hai aggiornato con successo l'applicazione OAuth2. oauth2_application_name=Nome applicazione -oauth2_select_type=Quale tipo di applicazione é adatto? -oauth2_type_web=Web (es: Node.JS, Tomcat, Go) -oauth2_type_native=Nativo (es. Mobile, Desktop, Browser) oauth2_redirect_uri=URI di reindirizzamento save_application=Salva oauth2_client_id=Client ID diff --git a/options/locale/locale_ja-JP.ini b/options/locale/locale_ja-JP.ini index a4c6349eee..11adea6555 100644 --- a/options/locale/locale_ja-JP.ini +++ b/options/locale/locale_ja-JP.ini @@ -106,6 +106,8 @@ never=無し rss_feed=RSSフィード +[filter] + [error] occurred=エラーが発生しました. report_message=Gitea のバグが疑われる場合は、GitHubでIssueを検索して、見つからなければ新しいIssueを作成してください。 @@ -740,9 +742,6 @@ create_oauth2_application_button=アプリケーション作成 create_oauth2_application_success=新しいOAuth2アプリケーションを作成しました。 update_oauth2_application_success=OAuth2アプリケーションを更新しました。 oauth2_application_name=アプリケーション名 -oauth2_select_type=アプリケーションタイプを選択 -oauth2_type_web=Web (Node.JS, Tomcat, Go など) -oauth2_type_native=Native (モバイル, デスクトップ, ブラウザーなど) oauth2_redirect_uri=リダイレクトURI save_application=保存 oauth2_client_id=クライアントID diff --git a/options/locale/locale_ko-KR.ini b/options/locale/locale_ko-KR.ini index db2cee952b..46aec04754 100644 --- a/options/locale/locale_ko-KR.ini +++ b/options/locale/locale_ko-KR.ini @@ -74,6 +74,8 @@ loading=불러오는 중... +[filter] + [error] [startpage] diff --git a/options/locale/locale_lv-LV.ini b/options/locale/locale_lv-LV.ini index d6fd4fee75..4f91e7e076 100644 --- a/options/locale/locale_lv-LV.ini +++ b/options/locale/locale_lv-LV.ini @@ -106,6 +106,8 @@ never=Nekad rss_feed=RSS barotne +[filter] + [error] occurred=Radusies kļūda report_message=Ja esat pārliecināts, ka šī ir Gitea kļūda, pārbaudiet, ka tā jau nav zināma meklējot GitHub vai ziņojiet par jaunu kļūdu, ja nepieciešams. @@ -734,9 +736,6 @@ create_oauth2_application_button=Izveidot lietotni create_oauth2_application_success=OAuth2 lietotne veiksmīgi izveidota. update_oauth2_application_success=OAuth2 lietotne veiksmīgi atjaunināta. oauth2_application_name=Lietotnes nosaukums -oauth2_select_type=Kāds lietotnes veids visvairāk atbilst? -oauth2_type_web=Tīmekļa (piemēram, Node.JS, Tomcat, Go) -oauth2_type_native=Specializētā (piemēram, mobilā, darbvirsmas, tīmekļa pārlūks) oauth2_redirect_uri=Novirzīšanas URI save_application=Saglabāt oauth2_client_id=Klienta ID diff --git a/options/locale/locale_ml-IN.ini b/options/locale/locale_ml-IN.ini index 90731f6f70..0b91ce8fa0 100644 --- a/options/locale/locale_ml-IN.ini +++ b/options/locale/locale_ml-IN.ini @@ -65,6 +65,8 @@ loading=ലഭ്യമാക്കുന്നു… +[filter] + [error] [startpage] @@ -487,9 +489,6 @@ create_oauth2_application_button=അപ്ലിക്കേഷൻ സൃഷ് create_oauth2_application_success=നിങ്ങൾ വിജയകരമായി ഒരു പുതിയ OAuth2 അപ്ലിക്കേഷൻ സൃഷ്ടിച്ചു. update_oauth2_application_success=നിങ്ങൾ വിജയകരമായി ഒരു പുതിയ OAuth2 അപ്ലിക്കേഷൻ പുതുക്കി. oauth2_application_name=അപ്ലിക്കേഷന്റെ പേര് -oauth2_select_type=ഏത് തരം അപ്ലിക്കേഷനാണ് ഇതു്? -oauth2_type_web=വെബ് (e.g. Node.JS, Tomcat, Go) -oauth2_type_native=നേറ്റീവ് (ഉദാ. മൊബൈൽ, ഡെസ്ക്ടോപ്പ്, ബ്രൌസർ) oauth2_redirect_uri=URI റീഡയറക്‌ട് ചെയ്യുക save_application=സംരക്ഷിയ്ക്കുക oauth2_client_id=ക്ലൈന്റ് ഐഡി diff --git a/options/locale/locale_nl-NL.ini b/options/locale/locale_nl-NL.ini index 0320efbf22..294ba7e34b 100644 --- a/options/locale/locale_nl-NL.ini +++ b/options/locale/locale_nl-NL.ini @@ -106,6 +106,8 @@ never=Nooit rss_feed=RSS Feed +[filter] + [error] occurred=Er is een fout opgetreden report_message=Als je zeker weet dat dit een Gitea bug is, zoek dan naar problemen op GitHub of open een nieuw probleem indien nodig. @@ -734,9 +736,6 @@ create_oauth2_application_button=Maak applicatie create_oauth2_application_success=Je hebt met succes een nieuwe OAuth2-applicatie aangemaakt. update_oauth2_application_success=Je hebt de OAuth2-applicatie succesvol bijgewerkt. oauth2_application_name=Applicatie naam -oauth2_select_type=Welk type toepassing past? -oauth2_type_web=Web (bijv. Node.JS, Tomcat, Go) -oauth2_type_native=Native (bijv. Mobiel, Desktop, Browser) oauth2_redirect_uri=Omleidings URL save_application=Opslaan oauth2_client_id=Client-ID diff --git a/options/locale/locale_pl-PL.ini b/options/locale/locale_pl-PL.ini index 005b9bdb20..8d2b7461d5 100644 --- a/options/locale/locale_pl-PL.ini +++ b/options/locale/locale_pl-PL.ini @@ -104,6 +104,8 @@ error404=Strona, do której próbujesz dotrzeć nie istnieje lu never=Nigdy +[filter] + [error] occurred=Wystąpił błąd report_message=Jeśli jesteś pewien, że jest to błąd Gitea, poszukaj już istniejącego zgłoszenia na GitHub lub w razie potrzeby otwórz nowy problem. @@ -686,9 +688,6 @@ create_oauth2_application_button=Stwórz aplikację create_oauth2_application_success=Udało Ci się stworzyć nową aplikację OAuth2. update_oauth2_application_success=Udało Ci się zaktualizować aplikację OAuth2. oauth2_application_name=Nazwa aplikacji -oauth2_select_type=Który typ aplikacji jest dla niej właściwy? -oauth2_type_web=Webowa (np. Node.JS, Tomcat, Go) -oauth2_type_native=Natywna (np. mobilna, pulpitowa, przeglądarkowa) oauth2_redirect_uri=URI przekierowania save_application=Zapisz oauth2_client_id=ID klienta diff --git a/options/locale/locale_pt-BR.ini b/options/locale/locale_pt-BR.ini index 86e375c6ba..41710ce6fa 100644 --- a/options/locale/locale_pt-BR.ini +++ b/options/locale/locale_pt-BR.ini @@ -106,6 +106,8 @@ never=Nunca rss_feed=Feed RSS +[filter] + [error] occurred=Ocorreu um erro report_message=Se você tem certeza de que é um bug do Gitea, procure por issues no GitHub ou abra uma nova issue, se necessário. @@ -736,9 +738,6 @@ create_oauth2_application_button=Criar aplicativo create_oauth2_application_success=Você criou com sucesso um novo aplicativo OAuth2. update_oauth2_application_success=Você alterou com sucesso o aplicativo OAuth2. oauth2_application_name=Nome do aplicativo -oauth2_select_type=Que tipo de aplicativo se encaixa? -oauth2_type_web=Web (exemplo: Node.JS, Tomcat, Go) -oauth2_type_native=Nativo (exemplo: Celular, Computador, Navegador) oauth2_redirect_uri=Redirecionar URI save_application=Salvar oauth2_client_id=Client ID diff --git a/options/locale/locale_pt-PT.ini b/options/locale/locale_pt-PT.ini index 14f6a33ca2..e16f06abfd 100644 --- a/options/locale/locale_pt-PT.ini +++ b/options/locale/locale_pt-PT.ini @@ -106,6 +106,10 @@ never=Nunca rss_feed=Fonte RSS +[filter] +string.asc=A - Z +string.desc=Z - A + [error] occurred=Ocorreu um erro report_message=Se tiver certeza de que se trata de um erro do Gitea, procure, por favor, questões relacionadas no GitHub ou abra uma nova questão, se necessário. @@ -745,9 +749,7 @@ create_oauth2_application_button=Criar aplicação create_oauth2_application_success=Criou com sucesso uma nova aplicação OAuth2. update_oauth2_application_success=Modificou com sucesso a aplicação OAuth2. oauth2_application_name=Nome da aplicação -oauth2_select_type=Que tipo de aplicaçãoo se encaixa? -oauth2_type_web=Web (por exemplo: Node.JS, Tomcat, Go) -oauth2_type_native=Nativa (por exemplo: Telemóvel, Computador, Navegador) +oauth2_confidential_client=Cliente confidencial. Escolha para aplicações que mantêm o segredo confidencial, tais como aplicações web. Não escolha para aplicações nativas, incluindo aplicações para computador e aplicações móveis. oauth2_redirect_uri=URI de reencaminhamento save_application=Guardar oauth2_client_id=ID do cliente diff --git a/options/locale/locale_ru-RU.ini b/options/locale/locale_ru-RU.ini index f83ccb73ed..f3efcf8c70 100644 --- a/options/locale/locale_ru-RU.ini +++ b/options/locale/locale_ru-RU.ini @@ -106,6 +106,8 @@ never=Никогда rss_feed=RSS-лента +[filter] + [error] occurred=Произошла ошибка missing_csrf=Некорректный запрос: CSRF токен отсутствует @@ -723,9 +725,6 @@ create_oauth2_application_button=Создать приложение create_oauth2_application_success=Вы успешно создали новое приложение OAuth2. update_oauth2_application_success=Изменения настроек приложения OAuth2 успешно применены. oauth2_application_name=Имя приложения -oauth2_select_type=Какой тип приложения подходит? -oauth2_type_web=Веб (например: Node.JS, Tomcat, Go) -oauth2_type_native=Нативный (например: телефон, ПК, браузер) oauth2_redirect_uri=URI переадресации save_application=Сохранить oauth2_client_id=ID клиента diff --git a/options/locale/locale_si-LK.ini b/options/locale/locale_si-LK.ini index 6652c43f22..5308886635 100644 --- a/options/locale/locale_si-LK.ini +++ b/options/locale/locale_si-LK.ini @@ -91,6 +91,8 @@ error404=ඔබ ළඟා වීමට උත්සාහ කරන පිටු never=කිසි විටෙකත් +[filter] + [error] missing_csrf=නරක ඉල්ලීම: CSRF ටෝකන් නොමැත @@ -655,9 +657,6 @@ create_oauth2_application_button=යෙදුම සාදන්න create_oauth2_application_success=ඔබ නව Oauth2 යෙදුමක් සාර්ථකව නිර්මාණය කර ඇත. update_oauth2_application_success=ඔබ Oauth2 යෙදුම සාර්ථකව යාවත්කාලීන කර ඇත. oauth2_application_name=යෙදුමේ නම -oauth2_select_type=කුමන යෙදුම් වර්ගය ගැලපේද? -oauth2_type_web=වෙබ් (උදා: Node.JS, ටොම්කැට්, යන්න) -oauth2_type_native=දේශීය (උදා: ජංගම, පරිගණක, බ්රව්සරය) oauth2_redirect_uri=නැවත හරවා යැවීමේ URI save_application=සුරකින්න oauth2_client_id=අනුග්‍රාහකයේ හැඳු. diff --git a/options/locale/locale_sk-SK.ini b/options/locale/locale_sk-SK.ini index 1e0f9dc006..be254f65b1 100644 --- a/options/locale/locale_sk-SK.ini +++ b/options/locale/locale_sk-SK.ini @@ -106,6 +106,8 @@ never=Nikdy rss_feed=RSS kanál +[filter] + [error] occurred=Vyskytla sa chyba report_message=Ak ste si istí, že toto je chyba v Gitea, prehľadajte problémy na GitHub alebo otvorte nový issue podľa potreby. @@ -736,7 +738,6 @@ create_oauth2_application_button=Vytvoriť aplikáciu create_oauth2_application_success=Úspešne ste vytvorili novú aplikáciu OAuth2. update_oauth2_application_success=Úspešne ste aktualizovali aplikáciu OAuth2. oauth2_application_name=Názov aplikácie -oauth2_select_type=Ktorý typ aplikácie sa hodí? oauth2_redirect_uri=Presmerovanie URI save_application=Uložiť oauth2_client_id=ID klienta diff --git a/options/locale/locale_sv-SE.ini b/options/locale/locale_sv-SE.ini index 12d6693bde..55bfbcb5b1 100644 --- a/options/locale/locale_sv-SE.ini +++ b/options/locale/locale_sv-SE.ini @@ -79,6 +79,8 @@ error404=Sidan du försöker nå finns inte eller så h +[filter] + [error] [startpage] @@ -559,9 +561,6 @@ create_oauth2_application_button=Skapa applikation create_oauth2_application_success=Du har lyckats med att skapa en ny OAuth2-applikation. update_oauth2_application_success=Du har lyckats uppdatera OAuth2-applikationen. oauth2_application_name=Applikationsnamn -oauth2_select_type=Vilken typ av applikation passar? -oauth2_type_web=Webb (t.ex. Node.JS, Tomcat, Go) -oauth2_type_native=Native (ex. Mobil, Desktop, Webbläsare) oauth2_redirect_uri=Omdirigerings-URI save_application=Spara oauth2_client_id=Klient-ID diff --git a/options/locale/locale_tr-TR.ini b/options/locale/locale_tr-TR.ini index d6eb62acaa..37b7491f6a 100644 --- a/options/locale/locale_tr-TR.ini +++ b/options/locale/locale_tr-TR.ini @@ -106,6 +106,10 @@ never=Asla rss_feed=RSS Beslemesi +[filter] +string.asc=A - Z +string.desc=Z - A + [error] occurred=Bir hata oluştu report_message=Bunun bir Gitea hatası olduğundan eminseniz, lütfen GitHub sayfasında sorunu arayın veya gerekiyorsa yeni bir sorun açın. @@ -412,6 +416,10 @@ repo.transfer.body=Kabul veya reddetmek için %s ziyaret edin veya görmezden ge repo.collaborator.added.subject=%s sizi %s ekledi repo.collaborator.added.text=Bu depo için katkıcı olarak eklendiniz: +team_invite.subject=%[1] sizi %[2] organizasyonuna katılmaya davet etti +team_invite.text_1=%[1] sizi %[3] organizasyonundaki %[2] takımına katılmaya davet etti. +team_invite.text_2=Takıma katılmak lütfen aşağıdaki bağlantıya tıklayın: +team_invite.text_3=Not: Bu davet %[1] içindi. Bu daveti beklemiyorsanız, e-postayı yok sayabilirsiniz. [modal] yes=Evet @@ -488,6 +496,7 @@ user_not_exist=Böyle bir kullanıcı yok. team_not_exist=Böyle bir takım bulunmuyor. last_org_owner=Son kullanıcıyı 'sahipler' takımından çıkaramazsınız. Bir organizasyonun en az bir sahibi olmalıdır. cannot_add_org_to_team=Organizasyon, takım üyesi olarak eklenemez. +duplicate_invite_to_team=Bu kullanıcı zaten takım üyesi olarak davet edilmişti. invalid_ssh_key=SSH anahtarınız doğrulanamıyor: %s invalid_gpg_key=GPG anahtarınız doğrulanamıyor: %s @@ -740,9 +749,7 @@ create_oauth2_application_button=Uygulama Oluştur create_oauth2_application_success=Başarıyla yeni bir OAuth2 uygulaması oluşturdunuz. update_oauth2_application_success=OAuth2 uygulamasını başarıyla güncellediniz. oauth2_application_name=Uygulama Adı -oauth2_select_type=Hangi uygulama türü uyuyor? -oauth2_type_web=Web (ör. Node.JS, Tomcat, Go) -oauth2_type_native=Yerel (ör. Mobil, Masaüstü, Tarayıcı) +oauth2_confidential_client=Güvenli İstemci. Web uygulamaları gibi sırları güvende tutan uygulamalar için bunu seçin. Masaüstü ve mobil uygulamaları da içeren doğal uygulamalar için seçmeyin. oauth2_redirect_uri=Yönlendirme URI'si save_application=Kaydet oauth2_client_id=İstemci Kimliği @@ -2403,6 +2410,8 @@ teams.members=Takım Üyeleri teams.update_settings=Ayarları Güncelle teams.delete_team=Takımı Sil teams.add_team_member=Takım Üyesi Ekle +teams.invite_team_member=%s daveti +teams.invite_team_member.list=Bekleyen Davetler teams.delete_team_title=Takımı Sil teams.delete_team_desc=Bir takımı silmek, üyelerinden depo erişimini iptal eder. Devam edilsin mi? teams.delete_team_success=Takım silindi. @@ -2427,6 +2436,8 @@ teams.all_repositories_helper=Takımın tüm depolara erişimi vardır. Bunu se teams.all_repositories_read_permission_desc=Bu takım tüm depolara Okuma erişimi sağlar: üyeler depoları görüntüleyebilir ve kopyalayabilir. teams.all_repositories_write_permission_desc=Bu takım tüm depolara Yazma erişimi sağlar: üyeler depolardan okuyabilir ve depolara itebilir. teams.all_repositories_admin_permission_desc=Bu takım tüm depolara Yönetici erişimi sağlar: üyeler depolardan okuyabilir, itebilir ve katkıcıları ekleyebilir. +teams.invite.by=%s tarafından davet edildi +teams.invite.description=Takıma katılmak için aşağıdaki düğmeye tıklayın. [admin] dashboard=Pano @@ -2880,6 +2891,8 @@ config.access_log_template=Şablon config.xorm_log_mode=XORM Günlük Kipi config.xorm_log_sql=SQL Günlüğü +config.get_setting_failed=%s ayarı alınamadı +config.set_setting_failed=%s ayarı yapılamadı monitor.cron=Cron Görevleri monitor.name=İsim diff --git a/options/locale/locale_uk-UA.ini b/options/locale/locale_uk-UA.ini index e88e9cf14b..0b02a82ec2 100644 --- a/options/locale/locale_uk-UA.ini +++ b/options/locale/locale_uk-UA.ini @@ -92,6 +92,8 @@ error404=Сторінка, до якої ви намагаєтеся зверн never=Ніколи +[filter] + [error] occurred=Сталася помилка missing_csrf=Некоректний запит: токен CSRF не задано @@ -681,9 +683,6 @@ create_oauth2_application_button=Створити програму create_oauth2_application_success=Ви успішно створили нову програму OAuth2. update_oauth2_application_success=Ви успішно оновили програму OAuth2. oauth2_application_name=Назва програми -oauth2_select_type=Який тип програми підходить? -oauth2_type_web=Веб (напр. Node.JS, Tomcat, Go) -oauth2_type_native=Рідний (напр. мобільний, робочий стіл, веб-переглядач) oauth2_redirect_uri=URI перенаправлення save_application=Зберегти oauth2_client_id=ID Клієнта diff --git a/options/locale/locale_zh-CN.ini b/options/locale/locale_zh-CN.ini index 3e009b5d2b..6d8f03edf4 100644 --- a/options/locale/locale_zh-CN.ini +++ b/options/locale/locale_zh-CN.ini @@ -106,6 +106,10 @@ never=从不 rss_feed=RSS 订阅源 +[filter] +string.asc=A - Z +string.desc=Z - A + [error] occurred=发生了一个错误 report_message=如果您确定这是一个 Gitea bug,请在 GitHub 上搜索问题,或在必要时打开一个新问题。 @@ -745,9 +749,7 @@ create_oauth2_application_button=创建应用 create_oauth2_application_success=您已成功创建了一个新的 OAuth2 应用。 update_oauth2_application_success=您已成功更新了此 OAuth2 应用。 oauth2_application_name=应用名称 -oauth2_select_type=哪种应用类型合适? -oauth2_type_web=Web (例如 Node.JS, Tomacat, Go) -oauth2_type_native=原生 (例如移动,桌面,浏览器) +oauth2_confidential_client=机密客户端。是否是能够维持凭据机密性的应用,比如网页应用程序。如果是本地应用程序请不要勾选,包括桌面和移动端应用。 oauth2_redirect_uri=重定向 URI save_application=保存 oauth2_client_id=客户端ID diff --git a/options/locale/locale_zh-HK.ini b/options/locale/locale_zh-HK.ini index cb241d5ef4..71e6f7a508 100644 --- a/options/locale/locale_zh-HK.ini +++ b/options/locale/locale_zh-HK.ini @@ -46,6 +46,8 @@ cancel=取消 +[filter] + [error] [startpage] diff --git a/options/locale/locale_zh-TW.ini b/options/locale/locale_zh-TW.ini index 5827d0b207..ff2a238fa0 100644 --- a/options/locale/locale_zh-TW.ini +++ b/options/locale/locale_zh-TW.ini @@ -106,6 +106,8 @@ never=從來沒有 rss_feed=RSS 摘要 +[filter] + [error] occurred=發生錯誤 report_message=如果您確定這是 Gitea 的 bug,請到 GitHub 搜尋相關的問題,如果有需要您也可以建立新問題。 @@ -738,9 +740,6 @@ create_oauth2_application_button=建立應用程式 create_oauth2_application_success=您已成功新增一個 OAuth2 應用程式。 update_oauth2_application_success=您已成功更新了 OAuth2 應用程式。 oauth2_application_name=應用程式名稱 -oauth2_select_type=適用哪種程式類別? -oauth2_type_web=Web (例如 Node.JS, Tomacat, Go) -oauth2_type_native=原生應用程式 (Mobile, Desktop, Browser) oauth2_redirect_uri=重新導向 URI save_application=儲存 oauth2_client_id=客戶端 ID diff --git a/package-lock.json b/package-lock.json index 69f1ce409b..cd11a43e4f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "@claviska/jquery-minicolors": "2.3.6", "@mcaptcha/vanilla-glue": "0.1.0-alpha-3", "@primer/octicons": "17.7.0", - "@vue/compiler-sfc": "3.2.40", + "@vue/compiler-sfc": "3.2.41", "add-asset-webpack-plugin": "2.0.1", "css-loader": "6.7.1", "dropzone": "6.0.0-beta.2", @@ -21,21 +21,21 @@ "font-awesome": "4.7.0", "jquery": "3.6.1", "jquery.are-you-sure": "1.9.0", - "katex": "0.16.2", + "katex": "0.16.3", "less": "4.1.3", "less-loader": "11.1.0", "license-checker-webpack-plugin": "0.2.1", "mermaid": "9.1.7", "mini-css-extract-plugin": "2.6.1", - "monaco-editor": "0.34.0", + "monaco-editor": "0.34.1", "monaco-editor-webpack-plugin": "7.0.1", "pretty-ms": "8.0.0", "sortablejs": "1.15.0", - "swagger-ui-dist": "4.14.2", + "swagger-ui-dist": "4.15.0", "tippy.js": "6.3.7", "tributejs": "5.1.3", "uint8-to-base64": "0.2.0", - "vue": "3.2.40", + "vue": "3.2.41", "vue-bar-graph": "2.0.0", "vue-loader": "17.0.0", "vue3-calendar-heatmap": "2.0.0", @@ -47,23 +47,23 @@ "wrap-ansi": "8.0.1" }, "devDependencies": { - "@playwright/test": "1.27.0", - "@rollup/pluginutils": "5.0.1", + "@playwright/test": "1.27.1", + "@rollup/pluginutils": "5.0.2", "@stoplight/spectral-cli": "6.5.1", - "eslint": "8.25.0", + "eslint": "8.26.0", "eslint-plugin-import": "2.26.0", "eslint-plugin-jquery": "1.5.1", - "eslint-plugin-sonarjs": "0.15.0", + "eslint-plugin-sonarjs": "0.16.0", "eslint-plugin-unicorn": "44.0.2", "eslint-plugin-vue": "9.6.0", "jsdom": "20.0.1", "markdownlint-cli": "0.32.2", "postcss-less": "6.0.0", - "stylelint": "14.13.0", - "stylelint-config-standard": "28.0.0", - "svgo": "2.8.0", - "updates": "13.1.8", - "vitest": "0.24.1" + "stylelint": "14.14.0", + "stylelint-config-standard": "29.0.0", + "svgo": "3.0.0", + "updates": "13.1.10", + "vitest": "0.24.3" }, "engines": { "node": ">= 14.0.0" @@ -182,9 +182,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.19.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.3.tgz", - "integrity": "sha512-pJ9xOlNWHiy9+FuFP09DEAFbAn4JskgRsVcc169w2xRBC3FRGuQEwjeIMMND9L2zc0iEhO/tGv4Zq+km+hxNpQ==", + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.6.tgz", + "integrity": "sha512-h1IUp81s2JYJ3mRkdxJgs4UvmSsRvDrx5ICSJbPvtWYv5i1nTBGcBpnog+89rAFMwvvru6E5NUHdBe01UeSzYA==", "bin": { "parser": "bin/babel-parser.js" }, @@ -193,9 +193,9 @@ } }, "node_modules/@braintree/sanitize-url": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-6.0.0.tgz", - "integrity": "sha512-mgmE7XBYY/21erpzhexk4Cj1cyTQ9LzvnTxtzM17BJ7ERMNE6W72mQRo0I1Ud8eFJ+RVVIcBNhLFZ3GX4XFz5w==" + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-6.0.1.tgz", + "integrity": "sha512-zr9Qs9KFQiEvMWdZesjcmRJlUck5NR+eKGS1uyKk+oYTWwlYrsoPEi6VmG6/TzBD1hKCGEimrhTgGS6hvn/xIQ==" }, "node_modules/@claviska/jquery-minicolors": { "version": "2.3.6", @@ -231,9 +231,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.10.tgz", - "integrity": "sha512-FNONeQPy/ox+5NBkcSbYJxoXj9GWu8gVGJTVmUyoOCKQFDTrHVKgNSzChdNt0I8Aj/iKcsDf2r9BFwv+FSNUXg==", + "version": "0.15.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.12.tgz", + "integrity": "sha512-IC7TqIqiyE0MmvAhWkl/8AEzpOtbhRNDo7aph47We1NbE5w2bt/Q+giAhe0YYeVpYnIhGMcuZY92qDK6dQauvA==", "cpu": [ "arm" ], @@ -246,9 +246,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.10.tgz", - "integrity": "sha512-w0Ou3Z83LOYEkwaui2M8VwIp+nLi/NA60lBLMvaJ+vXVMcsARYdEzLNE7RSm4+lSg4zq4d7fAVuzk7PNQ5JFgg==", + "version": "0.15.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.12.tgz", + "integrity": "sha512-tZEowDjvU7O7I04GYvWQOS4yyP9E/7YlsB0jjw1Ycukgr2ycEzKyIk5tms5WnLBymaewc6VmRKnn5IJWgK4eFw==", "cpu": [ "loong64" ], @@ -306,9 +306,9 @@ "dev": true }, "node_modules/@humanwhocodes/config-array": { - "version": "0.10.7", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.7.tgz", - "integrity": "sha512-MDl6D6sBsaV452/QSdX+4CXIjZhIcI0PELsxUjk4U828yd58vk3bTIvk/6w5FY+4hIy9sLW0sfrV7K7Kc++j/w==", + "version": "0.11.6", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.6.tgz", + "integrity": "sha512-jJr+hPTJYKyDILJfhNSHsjiwXYf26Flsz8DvNndOsHs5pwSnpGUEy8yzF0JYhCEvTDdV2vuOK5tt8BVhwO5/hg==", "dev": true, "dependencies": { "@humanwhocodes/object-schema": "^1.2.1", @@ -338,6 +338,19 @@ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", @@ -363,28 +376,15 @@ "@jridgewell/trace-mapping": "^0.3.9" } }, - "node_modules/@jridgewell/source-map/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.14", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.16", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.16.tgz", - "integrity": "sha512-LCQ+NeThyJ4k1W2d+vIKdxuSt9R3pQSZ4P92m7EakaYuXcVWbHuT5bjNcqLd4Rdgi6xYWYDvBJZJLZSLanjDcA==", + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", "dependencies": { "@jridgewell/resolve-uri": "3.1.0", "@jridgewell/sourcemap-codec": "1.4.14" @@ -496,13 +496,13 @@ } }, "node_modules/@playwright/test": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.27.0.tgz", - "integrity": "sha512-L4BswoJvGkFsEHhEgzVNHBnkFB1FbnBQn3QmvTl7+AouoJQ4a8tLwZKvytdovCsNi7B5cXuRo58yGvfM5PnExw==", + "version": "1.27.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.27.1.tgz", + "integrity": "sha512-mrL2q0an/7tVqniQQF6RBL2saskjljXzqNcCOVMUjRIgE6Y38nCNaP+Dc2FBW06bcpD3tqIws/HT9qiMHbNU0A==", "dev": true, "dependencies": { "@types/node": "*", - "playwright-core": "1.27.0" + "playwright-core": "1.27.1" }, "bin": { "playwright": "cli.js" @@ -572,10 +572,16 @@ "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", "dev": true }, + "node_modules/@rollup/plugin-commonjs/node_modules/@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", + "dev": true + }, "node_modules/@rollup/pluginutils": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.1.tgz", - "integrity": "sha512-4HaCVEXXuObvcPUaUlLt4faHYHCeQOOWNj8NKFGaRSrw3ZLD0TWeAFZicV9vXjnE2nkNuaVTfTuwAnjR+6uc9A==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz", + "integrity": "sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==", "dev": true, "dependencies": { "@types/estree": "^1.0.0", @@ -594,12 +600,6 @@ } } }, - "node_modules/@rollup/pluginutils/node_modules/@types/estree": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", - "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==", - "dev": true - }, "node_modules/@stoplight/better-ajv-errors": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@stoplight/better-ajv-errors/-/better-ajv-errors-1.0.3.tgz", @@ -757,9 +757,9 @@ } }, "node_modules/@stoplight/spectral-core": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/@stoplight/spectral-core/-/spectral-core-1.14.2.tgz", - "integrity": "sha512-W2Z31lasEICpZS50STFskOdkn4g0Va81XA1A88LIj9mvlctDFf4BfpjLgIjKkI4f2DEK5C4j3COcbbzV8y5Xig==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@stoplight/spectral-core/-/spectral-core-1.15.0.tgz", + "integrity": "sha512-+DwK8SmnujMZJaxJeNU11vWY+DFOnt4oQM1TzAuvufdd3Y6Lsno88Jl31OaR1M9Fn7l/u3v1anBB/SSl/fI5rQ==", "dev": true, "dependencies": { "@stoplight/better-ajv-errors": "1.0.3", @@ -948,9 +948,9 @@ } }, "node_modules/@stoplight/spectral-ruleset-bundler": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@stoplight/spectral-ruleset-bundler/-/spectral-ruleset-bundler-1.3.2.tgz", - "integrity": "sha512-sy7mHVBwmo5/8dUlnWiel2UND1Mnu3x+okBAgLmkGcIpXz74rMmVY3h5vT6rjxw65WZ3/c3mtm1dRQuSe+q5fw==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@stoplight/spectral-ruleset-bundler/-/spectral-ruleset-bundler-1.3.3.tgz", + "integrity": "sha512-hfHl7XZeF/wWMpSrsLqLnH2GevRHjSIqtBL2aRjO2SjMCTbO9LVz80p4sYaxrCcu4wQ6K71gMZXsG687+3fAeg==", "dev": true, "dependencies": { "@rollup/plugin-commonjs": "~22.0.2", @@ -1031,10 +1031,16 @@ "node": "^12.20 || >=14.13" } }, + "node_modules/@stoplight/spectral-ruleset-bundler/node_modules/@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", + "dev": true + }, "node_modules/@stoplight/spectral-ruleset-migrator": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@stoplight/spectral-ruleset-migrator/-/spectral-ruleset-migrator-1.7.4.tgz", - "integrity": "sha512-QySMWSvGUC5D8cNDvXhrXEY0a4DB5hewHwjxXbwlH51fVNiVKJ4+KcaCW3s2yAT4T1p6/ij8NkLX9T81D4vSCg==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@stoplight/spectral-ruleset-migrator/-/spectral-ruleset-migrator-1.8.0.tgz", + "integrity": "sha512-zg6RPF+d8uS7zAp5TzUph3hQG4sgGcG5Fsw8Zx24H1REyuSkjiIfyee2Kf13c3BcIlTXvnFc4csz2rNXpZO7Ug==", "dev": true, "dependencies": { "@stoplight/json": "~3.20.1", @@ -1245,9 +1251,9 @@ } }, "node_modules/@types/eslint": { - "version": "8.4.6", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.6.tgz", - "integrity": "sha512-/fqTbjxyFUaYNO7VcW5g+4npmqVACz1bB7RTHYuLj+PRjw9hrCwrUXVQFpChUS0JsyEFvMZ7U/PfmvWgxJhI9g==", + "version": "8.4.7", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.7.tgz", + "integrity": "sha512-ehM7cCt2RSFs42mb+lcmhFT9ouIlV92PuaeRGn8N8c98oMjG4Z5pJHA9b1QiCcuqnbPSHcyfiD3mlhqMaHsQIw==", "dependencies": { "@types/estree": "*", "@types/json-schema": "*" @@ -1263,9 +1269,9 @@ } }, "node_modules/@types/estree": { - "version": "0.0.39", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", - "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", + "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==" }, "node_modules/@types/json-schema": { "version": "7.0.11", @@ -1290,9 +1296,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "18.8.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.8.3.tgz", - "integrity": "sha512-0os9vz6BpGwxGe9LOhgP/ncvYN5Tx1fNcd2TM3rD/aCGBkysb+ZWpXEocG24h6ZzOi13+VB8HndAQFezsSOw1w==" + "version": "18.11.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.4.tgz", + "integrity": "sha512-BxcJpBu8D3kv/GZkx/gSMz6VnTJREBj/4lbzYOQueUOELkt8WrO6zAcSPmp9uRPEW/d+lUO8QK0W2xnS1hEU0A==" }, "node_modules/@types/normalize-package-data": { "version": "2.4.1", @@ -1321,36 +1327,36 @@ "dev": true }, "node_modules/@vue/compiler-core": { - "version": "3.2.40", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.40.tgz", - "integrity": "sha512-2Dc3Stk0J/VyQ4OUr2yEC53kU28614lZS+bnrCbFSAIftBJ40g/2yQzf4mPBiFuqguMB7hyHaujdgZAQ67kZYA==", + "version": "3.2.41", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.41.tgz", + "integrity": "sha512-oA4mH6SA78DT+96/nsi4p9DX97PHcNROxs51lYk7gb9Z4BPKQ3Mh+BLn6CQZBw857Iuhu28BfMSRHAlPvD4vlw==", "dependencies": { "@babel/parser": "^7.16.4", - "@vue/shared": "3.2.40", + "@vue/shared": "3.2.41", "estree-walker": "^2.0.2", "source-map": "^0.6.1" } }, "node_modules/@vue/compiler-dom": { - "version": "3.2.40", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.40.tgz", - "integrity": "sha512-OZCNyYVC2LQJy4H7h0o28rtk+4v+HMQygRTpmibGoG9wZyomQiS5otU7qo3Wlq5UfHDw2RFwxb9BJgKjVpjrQw==", + "version": "3.2.41", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.41.tgz", + "integrity": "sha512-xe5TbbIsonjENxJsYRbDJvthzqxLNk+tb3d/c47zgREDa/PCp6/Y4gC/skM4H6PIuX5DAxm7fFJdbjjUH2QTMw==", "dependencies": { - "@vue/compiler-core": "3.2.40", - "@vue/shared": "3.2.40" + "@vue/compiler-core": "3.2.41", + "@vue/shared": "3.2.41" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.2.40", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.40.tgz", - "integrity": "sha512-tzqwniIN1fu1PDHC3CpqY/dPCfN/RN1thpBC+g69kJcrl7mbGiHKNwbA6kJ3XKKy8R6JLKqcpVugqN4HkeBFFg==", + "version": "3.2.41", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.41.tgz", + "integrity": "sha512-+1P2m5kxOeaxVmJNXnBskAn3BenbTmbxBxWOtBq3mQTCokIreuMULFantBUclP0+KnzNCMOvcnKinqQZmiOF8w==", "dependencies": { "@babel/parser": "^7.16.4", - "@vue/compiler-core": "3.2.40", - "@vue/compiler-dom": "3.2.40", - "@vue/compiler-ssr": "3.2.40", - "@vue/reactivity-transform": "3.2.40", - "@vue/shared": "3.2.40", + "@vue/compiler-core": "3.2.41", + "@vue/compiler-dom": "3.2.41", + "@vue/compiler-ssr": "3.2.41", + "@vue/reactivity-transform": "3.2.41", + "@vue/shared": "3.2.41", "estree-walker": "^2.0.2", "magic-string": "^0.25.7", "postcss": "^8.1.10", @@ -1358,69 +1364,69 @@ } }, "node_modules/@vue/compiler-ssr": { - "version": "3.2.40", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.40.tgz", - "integrity": "sha512-80cQcgasKjrPPuKcxwuCx7feq+wC6oFl5YaKSee9pV3DNq+6fmCVwEEC3vvkf/E2aI76rIJSOYHsWSEIxK74oQ==", + "version": "3.2.41", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.41.tgz", + "integrity": "sha512-Y5wPiNIiaMz/sps8+DmhaKfDm1xgj6GrH99z4gq2LQenfVQcYXmHIOBcs5qPwl7jaW3SUQWjkAPKMfQemEQZwQ==", "dependencies": { - "@vue/compiler-dom": "3.2.40", - "@vue/shared": "3.2.40" + "@vue/compiler-dom": "3.2.41", + "@vue/shared": "3.2.41" } }, "node_modules/@vue/reactivity": { - "version": "3.2.40", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.40.tgz", - "integrity": "sha512-N9qgGLlZmtUBMHF9xDT4EkD9RdXde1Xbveb+niWMXuHVWQP5BzgRmE3SFyUBBcyayG4y1lhoz+lphGRRxxK4RA==", + "version": "3.2.41", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.41.tgz", + "integrity": "sha512-9JvCnlj8uc5xRiQGZ28MKGjuCoPhhTwcoAdv3o31+cfGgonwdPNuvqAXLhlzu4zwqavFEG5tvaoINQEfxz+l6g==", "dependencies": { - "@vue/shared": "3.2.40" + "@vue/shared": "3.2.41" } }, "node_modules/@vue/reactivity-transform": { - "version": "3.2.40", - "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.40.tgz", - "integrity": "sha512-HQUCVwEaacq6fGEsg2NUuGKIhUveMCjOk8jGHqLXPI2w6zFoPrlQhwWEaINTv5kkZDXKEnCijAp+4gNEHG03yw==", + "version": "3.2.41", + "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.41.tgz", + "integrity": "sha512-mK5+BNMsL4hHi+IR3Ft/ho6Za+L3FA5j8WvreJ7XzHrqkPq8jtF/SMo7tuc9gHjLDwKZX1nP1JQOKo9IEAn54A==", "dependencies": { "@babel/parser": "^7.16.4", - "@vue/compiler-core": "3.2.40", - "@vue/shared": "3.2.40", + "@vue/compiler-core": "3.2.41", + "@vue/shared": "3.2.41", "estree-walker": "^2.0.2", "magic-string": "^0.25.7" } }, "node_modules/@vue/runtime-core": { - "version": "3.2.40", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.40.tgz", - "integrity": "sha512-U1+rWf0H8xK8aBUZhnrN97yoZfHbjgw/bGUzfgKPJl69/mXDuSg8CbdBYBn6VVQdR947vWneQBFzdhasyzMUKg==", + "version": "3.2.41", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.41.tgz", + "integrity": "sha512-0LBBRwqnI0p4FgIkO9q2aJBBTKDSjzhnxrxHYengkAF6dMOjeAIZFDADAlcf2h3GDALWnblbeprYYpItiulSVQ==", "dependencies": { - "@vue/reactivity": "3.2.40", - "@vue/shared": "3.2.40" + "@vue/reactivity": "3.2.41", + "@vue/shared": "3.2.41" } }, "node_modules/@vue/runtime-dom": { - "version": "3.2.40", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.40.tgz", - "integrity": "sha512-AO2HMQ+0s2+MCec8hXAhxMgWhFhOPJ/CyRXnmTJ6XIOnJFLrH5Iq3TNwvVcODGR295jy77I6dWPj+wvFoSYaww==", + "version": "3.2.41", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.41.tgz", + "integrity": "sha512-U7zYuR1NVIP8BL6jmOqmapRAHovEFp7CSw4pR2FacqewXNGqZaRfHoNLQsqQvVQ8yuZNZtxSZy0FFyC70YXPpA==", "dependencies": { - "@vue/runtime-core": "3.2.40", - "@vue/shared": "3.2.40", + "@vue/runtime-core": "3.2.41", + "@vue/shared": "3.2.41", "csstype": "^2.6.8" } }, "node_modules/@vue/server-renderer": { - "version": "3.2.40", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.40.tgz", - "integrity": "sha512-gtUcpRwrXOJPJ4qyBpU3EyxQa4EkV8I4f8VrDePcGCPe4O/hd0BPS7v9OgjIQob6Ap8VDz9G+mGTKazE45/95w==", + "version": "3.2.41", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.41.tgz", + "integrity": "sha512-7YHLkfJdTlsZTV0ae5sPwl9Gn/EGr2hrlbcS/8naXm2CDpnKUwC68i1wGlrYAfIgYWL7vUZwk2GkYLQH5CvFig==", "dependencies": { - "@vue/compiler-ssr": "3.2.40", - "@vue/shared": "3.2.40" + "@vue/compiler-ssr": "3.2.41", + "@vue/shared": "3.2.41" }, "peerDependencies": { - "vue": "3.2.40" + "vue": "3.2.41" } }, "node_modules/@vue/shared": { - "version": "3.2.40", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.40.tgz", - "integrity": "sha512-0PLQ6RUtZM0vO3teRfzGi4ltLUO5aO+kLgwh4Um3THSR03rpQWLTuRCkuO5A41ITzwdWeKdPHtSARuPkoo5pCQ==" + "version": "3.2.41", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.41.tgz", + "integrity": "sha512-W9mfWLHmJhkfAmV+7gDjcHeAWALQtgGT3JErxULl0oz6R6+3ug91I7IErs93eCFhPCZPHBs4QJS7YWEV7A3sxw==" }, "node_modules/@webassemblyjs/ast": { "version": "1.11.1", @@ -1615,9 +1621,9 @@ } }, "node_modules/acorn": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", - "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", + "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", "bin": { "acorn": "bin/acorn" }, @@ -2050,9 +2056,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001418", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001418.tgz", - "integrity": "sha512-oIs7+JL3K9JRQ3jPZjlH6qyYDp+nBTCais7hjh0s+fuBwufc7uZ7hPYMXrDOJhV360KGMTcczMRObk0/iMqZRg==", + "version": "1.0.30001423", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001423.tgz", + "integrity": "sha512-09iwWGOlifvE1XuHokFMP7eR38a0JnajoyL3/i87c8ZjRWRrdKo1fqjNfugfBD0UDBIOz0U+jtNhJ0EPm1VleQ==", "funding": [ { "type": "opencollective", @@ -2345,15 +2351,15 @@ } }, "node_modules/css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", "dev": true, "dependencies": { "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", "nth-check": "^2.0.1" }, "funding": { @@ -2361,16 +2367,17 @@ } }, "node_modules/css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", "dev": true, "dependencies": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" }, "engines": { - "node": ">=8.0.0" + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" } }, "node_modules/css-what": { @@ -2397,15 +2404,16 @@ } }, "node_modules/csso": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", - "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", "dev": true, "dependencies": { - "css-tree": "^1.1.2" + "css-tree": "~2.2.0" }, "engines": { - "node": ">=8.0.0" + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" } }, "node_modules/cssom": { @@ -3198,9 +3206,9 @@ } }, "node_modules/decimal.js": { - "version": "10.4.1", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.1.tgz", - "integrity": "sha512-F29o+vci4DodHYT9UrR5IEbfBw9pE5eSapIJdTqXK5+6hq+t8VRxwQyKlW2i+KDKFkkJQRvFyI/QXD83h8LyQw==", + "version": "10.4.2", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.2.tgz", + "integrity": "sha512-ic1yEvwT6GuvaYwBLLY6/aFFgjZdySKTE8en/fkU3QICTmRtgtSlFn0u0BXN06InZwtfCelR7j8LRiDI/02iGA==", "dev": true }, "node_modules/deep-eql": { @@ -3415,24 +3423,27 @@ } }, "node_modules/dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", "dev": true, "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" }, "funding": { "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" } }, "node_modules/dom-serializer/node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", + "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==", "dev": true, + "engines": { + "node": ">=0.12" + }, "funding": { "url": "https://github.com/fb55/entities?sponsor=1" } @@ -3462,12 +3473,12 @@ } }, "node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", "dev": true, "dependencies": { - "domelementtype": "^2.2.0" + "domelementtype": "^2.3.0" }, "engines": { "node": ">= 4" @@ -3482,14 +3493,14 @@ "integrity": "sha512-Be9tbQMZds4a3C6xTmz68NlMfeONA//4dOavl/1rNw50E+/QO0KVpbcU0PcaW0nsQxurXls9ZocqFxk8R2mWEA==" }, "node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", + "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", "dev": true, "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.1" }, "funding": { "url": "https://github.com/fb55/domutils?sponsor=1" @@ -3522,9 +3533,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.276", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.276.tgz", - "integrity": "sha512-EpuHPqu8YhonqLBXHoU6hDJCD98FCe6KDoet3/gY1qsQ6usjJoHqBH2YIVs8FXaAtHwVL8Uqa/fsYao/vq9VWQ==" + "version": "1.4.284", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", + "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==" }, "node_modules/emoji-regex": { "version": "8.0.0", @@ -3692,9 +3703,9 @@ } }, "node_modules/esbuild": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.10.tgz", - "integrity": "sha512-N7wBhfJ/E5fzn/SpNgX+oW2RLRjwaL8Y0ezqNqhjD6w0H2p0rDuEz2FKZqpqLnO8DCaWumKe8dsC/ljvVSSxng==", + "version": "0.15.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.12.tgz", + "integrity": "sha512-PcT+/wyDqJQsRVhaE9uX/Oq4XLrFh0ce/bs2TJh4CSaw9xuvI+xFrH2nAYOADbhQjUgAhNWC5LKoUsakm4dxng==", "hasInstallScript": true, "bin": { "esbuild": "bin/esbuild" @@ -3703,34 +3714,34 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/android-arm": "0.15.10", - "@esbuild/linux-loong64": "0.15.10", - "esbuild-android-64": "0.15.10", - "esbuild-android-arm64": "0.15.10", - "esbuild-darwin-64": "0.15.10", - "esbuild-darwin-arm64": "0.15.10", - "esbuild-freebsd-64": "0.15.10", - "esbuild-freebsd-arm64": "0.15.10", - "esbuild-linux-32": "0.15.10", - "esbuild-linux-64": "0.15.10", - "esbuild-linux-arm": "0.15.10", - "esbuild-linux-arm64": "0.15.10", - "esbuild-linux-mips64le": "0.15.10", - "esbuild-linux-ppc64le": "0.15.10", - "esbuild-linux-riscv64": "0.15.10", - "esbuild-linux-s390x": "0.15.10", - "esbuild-netbsd-64": "0.15.10", - "esbuild-openbsd-64": "0.15.10", - "esbuild-sunos-64": "0.15.10", - "esbuild-windows-32": "0.15.10", - "esbuild-windows-64": "0.15.10", - "esbuild-windows-arm64": "0.15.10" + "@esbuild/android-arm": "0.15.12", + "@esbuild/linux-loong64": "0.15.12", + "esbuild-android-64": "0.15.12", + "esbuild-android-arm64": "0.15.12", + "esbuild-darwin-64": "0.15.12", + "esbuild-darwin-arm64": "0.15.12", + "esbuild-freebsd-64": "0.15.12", + "esbuild-freebsd-arm64": "0.15.12", + "esbuild-linux-32": "0.15.12", + "esbuild-linux-64": "0.15.12", + "esbuild-linux-arm": "0.15.12", + "esbuild-linux-arm64": "0.15.12", + "esbuild-linux-mips64le": "0.15.12", + "esbuild-linux-ppc64le": "0.15.12", + "esbuild-linux-riscv64": "0.15.12", + "esbuild-linux-s390x": "0.15.12", + "esbuild-netbsd-64": "0.15.12", + "esbuild-openbsd-64": "0.15.12", + "esbuild-sunos-64": "0.15.12", + "esbuild-windows-32": "0.15.12", + "esbuild-windows-64": "0.15.12", + "esbuild-windows-arm64": "0.15.12" } }, "node_modules/esbuild-android-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.10.tgz", - "integrity": "sha512-UI7krF8OYO1N7JYTgLT9ML5j4+45ra3amLZKx7LO3lmLt1Ibn8t3aZbX5Pu4BjWiqDuJ3m/hsvhPhK/5Y/YpnA==", + "version": "0.15.12", + "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.12.tgz", + "integrity": "sha512-MJKXwvPY9g0rGps0+U65HlTsM1wUs9lbjt5CU19RESqycGFDRijMDQsh68MtbzkqWSRdEtiKS1mtPzKneaAI0Q==", "cpu": [ "x64" ], @@ -3743,9 +3754,9 @@ } }, "node_modules/esbuild-android-arm64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.10.tgz", - "integrity": "sha512-EOt55D6xBk5O05AK8brXUbZmoFj4chM8u3riGflLa6ziEoVvNjRdD7Cnp82NHQGfSHgYR06XsPI8/sMuA/cUwg==", + "version": "0.15.12", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.12.tgz", + "integrity": "sha512-Hc9SEcZbIMhhLcvhr1DH+lrrec9SFTiRzfJ7EGSBZiiw994gfkVV6vG0sLWqQQ6DD7V4+OggB+Hn0IRUdDUqvA==", "cpu": [ "arm64" ], @@ -3758,9 +3769,9 @@ } }, "node_modules/esbuild-darwin-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.10.tgz", - "integrity": "sha512-hbDJugTicqIm+WKZgp208d7FcXcaK8j2c0l+fqSJ3d2AzQAfjEYDRM3Z2oMeqSJ9uFxyj/muSACLdix7oTstRA==", + "version": "0.15.12", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.12.tgz", + "integrity": "sha512-qkmqrTVYPFiePt5qFjP8w/S+GIUMbt6k8qmiPraECUWfPptaPJUGkCKrWEfYFRWB7bY23FV95rhvPyh/KARP8Q==", "cpu": [ "x64" ], @@ -3773,9 +3784,9 @@ } }, "node_modules/esbuild-darwin-arm64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.10.tgz", - "integrity": "sha512-M1t5+Kj4IgSbYmunf2BB6EKLkWUq+XlqaFRiGOk8bmBapu9bCDrxjf4kUnWn59Dka3I27EiuHBKd1rSO4osLFQ==", + "version": "0.15.12", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.12.tgz", + "integrity": "sha512-z4zPX02tQ41kcXMyN3c/GfZpIjKoI/BzHrdKUwhC/Ki5BAhWv59A9M8H+iqaRbwpzYrYidTybBwiZAIWCLJAkw==", "cpu": [ "arm64" ], @@ -3788,9 +3799,9 @@ } }, "node_modules/esbuild-freebsd-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.10.tgz", - "integrity": "sha512-KMBFMa7C8oc97nqDdoZwtDBX7gfpolkk6Bcmj6YFMrtCMVgoU/x2DI1p74DmYl7CSS6Ppa3xgemrLrr5IjIn0w==", + "version": "0.15.12", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.12.tgz", + "integrity": "sha512-XFL7gKMCKXLDiAiBjhLG0XECliXaRLTZh6hsyzqUqPUf/PY4C6EJDTKIeqqPKXaVJ8+fzNek88285krSz1QECw==", "cpu": [ "x64" ], @@ -3803,9 +3814,9 @@ } }, "node_modules/esbuild-freebsd-arm64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.10.tgz", - "integrity": "sha512-m2KNbuCX13yQqLlbSojFMHpewbn8wW5uDS6DxRpmaZKzyq8Dbsku6hHvh2U+BcLwWY4mpgXzFUoENEf7IcioGg==", + "version": "0.15.12", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.12.tgz", + "integrity": "sha512-jwEIu5UCUk6TjiG1X+KQnCGISI+ILnXzIzt9yDVrhjug2fkYzlLbl0K43q96Q3KB66v6N1UFF0r5Ks4Xo7i72g==", "cpu": [ "arm64" ], @@ -3818,9 +3829,9 @@ } }, "node_modules/esbuild-linux-32": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.10.tgz", - "integrity": "sha512-guXrwSYFAvNkuQ39FNeV4sNkNms1bLlA5vF1H0cazZBOLdLFIny6BhT+TUbK/hdByMQhtWQ5jI9VAmPKbVPu1w==", + "version": "0.15.12", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.12.tgz", + "integrity": "sha512-uSQuSEyF1kVzGzuIr4XM+v7TPKxHjBnLcwv2yPyCz8riV8VUCnO/C4BF3w5dHiVpCd5Z1cebBtZJNlC4anWpwA==", "cpu": [ "ia32" ], @@ -3833,9 +3844,9 @@ } }, "node_modules/esbuild-linux-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.10.tgz", - "integrity": "sha512-jd8XfaSJeucMpD63YNMO1JCrdJhckHWcMv6O233bL4l6ogQKQOxBYSRP/XLWP+6kVTu0obXovuckJDcA0DKtQA==", + "version": "0.15.12", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.12.tgz", + "integrity": "sha512-QcgCKb7zfJxqT9o5z9ZUeGH1k8N6iX1Y7VNsEi5F9+HzN1OIx7ESxtQXDN9jbeUSPiRH1n9cw6gFT3H4qbdvcA==", "cpu": [ "x64" ], @@ -3848,9 +3859,9 @@ } }, "node_modules/esbuild-linux-arm": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.10.tgz", - "integrity": "sha512-6N8vThLL/Lysy9y4Ex8XoLQAlbZKUyExCWyayGi2KgTBelKpPgj6RZnUaKri0dHNPGgReJriKVU6+KDGQwn10A==", + "version": "0.15.12", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.12.tgz", + "integrity": "sha512-Wf7T0aNylGcLu7hBnzMvsTfEXdEdJY/hY3u36Vla21aY66xR0MS5I1Hw8nVquXjTN0A6fk/vnr32tkC/C2lb0A==", "cpu": [ "arm" ], @@ -3863,9 +3874,9 @@ } }, "node_modules/esbuild-linux-arm64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.10.tgz", - "integrity": "sha512-GByBi4fgkvZFTHFDYNftu1DQ1GzR23jws0oWyCfhnI7eMOe+wgwWrc78dbNk709Ivdr/evefm2PJiUBMiusS1A==", + "version": "0.15.12", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.12.tgz", + "integrity": "sha512-HtNq5xm8fUpZKwWKS2/YGwSfTF+339L4aIA8yphNKYJckd5hVdhfdl6GM2P3HwLSCORS++++7++//ApEwXEuAQ==", "cpu": [ "arm64" ], @@ -3878,9 +3889,9 @@ } }, "node_modules/esbuild-linux-mips64le": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.10.tgz", - "integrity": "sha512-BxP+LbaGVGIdQNJUNF7qpYjEGWb0YyHVSKqYKrn+pTwH/SiHUxFyJYSP3pqkku61olQiSBnSmWZ+YUpj78Tw7Q==", + "version": "0.15.12", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.12.tgz", + "integrity": "sha512-Qol3+AvivngUZkTVFgLpb0H6DT+N5/zM3V1YgTkryPYFeUvuT5JFNDR3ZiS6LxhyF8EE+fiNtzwlPqMDqVcc6A==", "cpu": [ "mips64el" ], @@ -3893,9 +3904,9 @@ } }, "node_modules/esbuild-linux-ppc64le": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.10.tgz", - "integrity": "sha512-LoSQCd6498PmninNgqd/BR7z3Bsk/mabImBWuQ4wQgmQEeanzWd5BQU2aNi9mBURCLgyheuZS6Xhrw5luw3OkQ==", + "version": "0.15.12", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.12.tgz", + "integrity": "sha512-4D8qUCo+CFKaR0cGXtGyVsOI7w7k93Qxb3KFXWr75An0DHamYzq8lt7TNZKoOq/Gh8c40/aKaxvcZnTgQ0TJNg==", "cpu": [ "ppc64" ], @@ -3908,9 +3919,9 @@ } }, "node_modules/esbuild-linux-riscv64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.10.tgz", - "integrity": "sha512-Lrl9Cr2YROvPV4wmZ1/g48httE8z/5SCiXIyebiB5N8VT7pX3t6meI7TQVHw/wQpqP/AF4SksDuFImPTM7Z32Q==", + "version": "0.15.12", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.12.tgz", + "integrity": "sha512-G9w6NcuuCI6TUUxe6ka0enjZHDnSVK8bO+1qDhMOCtl7Tr78CcZilJj8SGLN00zO5iIlwNRZKHjdMpfFgNn1VA==", "cpu": [ "riscv64" ], @@ -3923,9 +3934,9 @@ } }, "node_modules/esbuild-linux-s390x": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.10.tgz", - "integrity": "sha512-ReP+6q3eLVVP2lpRrvl5EodKX7EZ1bS1/z5j6hsluAlZP5aHhk6ghT6Cq3IANvvDdscMMCB4QEbI+AjtvoOFpA==", + "version": "0.15.12", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.12.tgz", + "integrity": "sha512-Lt6BDnuXbXeqSlVuuUM5z18GkJAZf3ERskGZbAWjrQoi9xbEIsj/hEzVnSAFLtkfLuy2DE4RwTcX02tZFunXww==", "cpu": [ "s390x" ], @@ -3957,9 +3968,9 @@ } }, "node_modules/esbuild-netbsd-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.10.tgz", - "integrity": "sha512-iGDYtJCMCqldMskQ4eIV+QSS/CuT7xyy9i2/FjpKvxAuCzrESZXiA1L64YNj6/afuzfBe9i8m/uDkFHy257hTw==", + "version": "0.15.12", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.12.tgz", + "integrity": "sha512-jlUxCiHO1dsqoURZDQts+HK100o0hXfi4t54MNRMCAqKGAV33JCVvMplLAa2FwviSojT/5ZG5HUfG3gstwAG8w==", "cpu": [ "x64" ], @@ -3972,9 +3983,9 @@ } }, "node_modules/esbuild-openbsd-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.10.tgz", - "integrity": "sha512-ftMMIwHWrnrYnvuJQRJs/Smlcb28F9ICGde/P3FUTCgDDM0N7WA0o9uOR38f5Xe2/OhNCgkjNeb7QeaE3cyWkQ==", + "version": "0.15.12", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.12.tgz", + "integrity": "sha512-1o1uAfRTMIWNOmpf8v7iudND0L6zRBYSH45sofCZywrcf7NcZA+c7aFsS1YryU+yN7aRppTqdUK1PgbZVaB1Dw==", "cpu": [ "x64" ], @@ -3987,9 +3998,9 @@ } }, "node_modules/esbuild-sunos-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.10.tgz", - "integrity": "sha512-mf7hBL9Uo2gcy2r3rUFMjVpTaGpFJJE5QTDDqUFf1632FxteYANffDZmKbqX0PfeQ2XjUDE604IcE7OJeoHiyg==", + "version": "0.15.12", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.12.tgz", + "integrity": "sha512-nkl251DpoWoBO9Eq9aFdoIt2yYmp4I3kvQjba3jFKlMXuqQ9A4q+JaqdkCouG3DHgAGnzshzaGu6xofGcXyPXg==", "cpu": [ "x64" ], @@ -4002,9 +4013,9 @@ } }, "node_modules/esbuild-windows-32": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.10.tgz", - "integrity": "sha512-ttFVo+Cg8b5+qHmZHbEc8Vl17kCleHhLzgT8X04y8zudEApo0PxPg9Mz8Z2cKH1bCYlve1XL8LkyXGFjtUYeGg==", + "version": "0.15.12", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.12.tgz", + "integrity": "sha512-WlGeBZHgPC00O08luIp5B2SP4cNCp/PcS+3Pcg31kdcJPopHxLkdCXtadLU9J82LCfw4TVls21A6lilQ9mzHrw==", "cpu": [ "ia32" ], @@ -4017,9 +4028,9 @@ } }, "node_modules/esbuild-windows-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.10.tgz", - "integrity": "sha512-2H0gdsyHi5x+8lbng3hLbxDWR7mKHWh5BXZGKVG830KUmXOOWFE2YKJ4tHRkejRduOGDrBvHBriYsGtmTv3ntA==", + "version": "0.15.12", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.12.tgz", + "integrity": "sha512-VActO3WnWZSN//xjSfbiGOSyC+wkZtI8I4KlgrTo5oHJM6z3MZZBCuFaZHd8hzf/W9KPhF0lY8OqlmWC9HO5AA==", "cpu": [ "x64" ], @@ -4032,9 +4043,9 @@ } }, "node_modules/esbuild-windows-arm64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.10.tgz", - "integrity": "sha512-S+th4F+F8VLsHLR0zrUcG+Et4hx0RKgK1eyHc08kztmLOES8BWwMiaGdoW9hiXuzznXQ0I/Fg904MNbr11Nktw==", + "version": "0.15.12", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.12.tgz", + "integrity": "sha512-Of3MIacva1OK/m4zCNIvBfz8VVROBmQT+gRX6pFTLPngFYcj6TFH/12VveAqq1k9VB2l28EoVMNMUCcmsfwyuA==", "cpu": [ "arm64" ], @@ -4151,14 +4162,15 @@ } }, "node_modules/eslint": { - "version": "8.25.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.25.0.tgz", - "integrity": "sha512-DVlJOZ4Pn50zcKW5bYH7GQK/9MsoQG2d5eDH0ebEkE8PbgzTTmtt/VTH9GGJ4BfeZCpBLqFfvsjX35UacUL83A==", + "version": "8.26.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.26.0.tgz", + "integrity": "sha512-kzJkpaw1Bfwheq4VXUezFriD1GxszX6dUekM7Z3aC2o4hju+tsR/XyTC3RcoSD7jmy9VkPU3+N6YjVU2e96Oyg==", "dev": true, "dependencies": { "@eslint/eslintrc": "^1.3.3", - "@humanwhocodes/config-array": "^0.10.5", + "@humanwhocodes/config-array": "^0.11.6", "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -4174,14 +4186,14 @@ "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", - "glob-parent": "^6.0.1", + "glob-parent": "^6.0.2", "globals": "^13.15.0", - "globby": "^11.1.0", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", "js-sdsl": "^4.1.4", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", @@ -4314,12 +4326,12 @@ } }, "node_modules/eslint-plugin-sonarjs": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-sonarjs/-/eslint-plugin-sonarjs-0.15.0.tgz", - "integrity": "sha512-LuxHdAe6VqSbi1phsUvNjbmXLuvlobmryQJJNyQYbdubCfz6K8tmgoqNiJPnz0pP2AbYDbtuPm0ajOMgMrC+dQ==", + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-sonarjs/-/eslint-plugin-sonarjs-0.16.0.tgz", + "integrity": "sha512-al8ojAzcQW8Eu0tWn841ldhPpPcjrJ59TzzTfAVWR45bWvdAASCmrGl8vK0MWHyKVDdC0i17IGbtQQ1KgxLlVA==", "dev": true, "engines": { - "node": ">=12" + "node": ">=14" }, "peerDependencies": { "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" @@ -5231,9 +5243,9 @@ } }, "node_modules/immer": { - "version": "9.0.15", - "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.15.tgz", - "integrity": "sha512-2eB/sswms9AEUSkOm4SbV5Y7Vmt/bKRwByd52jfLkW4OLYeaTP3EEiJ9agqU0O/tq6Dk62Zfj+TJSqfm1rLVGQ==", + "version": "9.0.16", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.16.tgz", + "integrity": "sha512-qenGE7CstVm1NrHQbMh8YaSzTZTFNP3zPqr3YU0S0UY441j4bJTg4A2Hh5KAhwgaiU6ZZ1Ar6y/2f4TblnMReQ==", "dev": true, "funding": { "type": "opencollective", @@ -5422,9 +5434,9 @@ } }, "node_modules/is-core-module": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", - "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", "dependencies": { "has": "^1.0.3" }, @@ -5509,6 +5521,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/is-plain-obj": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", @@ -5636,6 +5657,33 @@ "node": ">=0.10.0" } }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, "node_modules/joycon": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", @@ -5804,9 +5852,9 @@ "integrity": "sha512-b+z6yF1d4EOyDgylzQo5IminlUmzSeqR1hs/bzjBNjuGras4FXq/6TrzjxfN0j+TmI0ltJzTNlqXUMCniciwKQ==" }, "node_modules/katex": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.2.tgz", - "integrity": "sha512-70DJdQAyh9EMsthw3AaQlDyFf54X7nWEUIa5W+rq8XOpEk//w5Th7/8SqFqpvi/KZ2t6MHUj4f9wLmztBmAYQA==", + "version": "0.16.3", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.3.tgz", + "integrity": "sha512-3EykQddareoRmbtNiNEDgl3IGjryyrp2eg/25fHDEnlHymIDi33bptkMv6K4EOC2LZCybLW/ZkEo6Le+EM9pmA==", "funding": [ "https://opencollective.com/katex", "https://github.com/sponsors/katex" @@ -5889,28 +5937,6 @@ "webpack": "^5.0.0" } }, - "node_modules/less/node_modules/make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "optional": true, - "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/less/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "optional": true, - "bin": { - "semver": "bin/semver" - } - }, "node_modules/leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", @@ -6006,9 +6032,9 @@ } }, "node_modules/loader-utils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", - "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.3.tgz", + "integrity": "sha512-THWqIsn8QRnvLl0shHYVBN9syumU8pYWEHPTmkiVGd+7K5eFNVSY6AJhRvgGF70gg1Dz+l/k8WicvFCxdEs60A==", "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -6128,6 +6154,28 @@ "sourcemap-codec": "^1.4.8" } }, + "node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "optional": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "optional": true, + "bin": { + "semver": "bin/semver" + } + }, "node_modules/map-obj": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", @@ -6278,9 +6326,9 @@ } }, "node_modules/mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "version": "2.0.28", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", "dev": true }, "node_modules/mdurl": { @@ -6483,10 +6531,13 @@ } }, "node_modules/minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/minimist-options": { "version": "4.1.0", @@ -6508,9 +6559,9 @@ "integrity": "sha512-9ARkWHBs+6YJIvrIp0Ik5tyTTtP9PoV0Ssu2Ocq5y9v8+NOOpWiRshAp8c4rZVWTOe+157on/5G+zj5pwIQFEQ==" }, "node_modules/monaco-editor": { - "version": "0.34.0", - "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.34.0.tgz", - "integrity": "sha512-VF+S5zG8wxfinLKLrWcl4WUizMx+LeJrG4PM/M78OhcwocpV0jiyhX/pG6Q9jIOhrb/ckYi6nHnaR5OojlOZCQ==" + "version": "0.34.1", + "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.34.1.tgz", + "integrity": "sha512-FKc80TyiMaruhJKKPz5SpJPIjL+dflGvz4CpuThaPMc94AyN7SeC9HQ8hrvaxX7EyHdJcUY5i4D0gNyJj1vSZQ==" }, "node_modules/monaco-editor-webpack-plugin": { "version": "7.0.1", @@ -7097,9 +7148,9 @@ } }, "node_modules/playwright-core": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.27.0.tgz", - "integrity": "sha512-VBKaaFUVKDo3akW+o4DwbK1ZyXh46tcSwQKPK3lruh8IJd5feu55XVZx4vOkbb2uqrNdIF51sgsadYT533SdpA==", + "version": "1.27.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.27.1.tgz", + "integrity": "sha512-9EmeXDncC2Pmp/z+teoVYlvmPWUC6ejSSYZUln7YaP89Z6lpAaiaAnqroUt/BoLo8tn7WYShcfaCh+xofZa44Q==", "dev": true, "bin": { "playwright": "cli.js" @@ -7127,9 +7178,9 @@ } }, "node_modules/postcss": { - "version": "8.4.17", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.17.tgz", - "integrity": "sha512-UNxNOLQydcOFi41yHNMcKRZ39NeXlr8AxGuZJsdub8vIb12fHzcq37DTU/QtbI6WLxNg2gF9Z+8qtRwTj1UI1Q==", + "version": "8.4.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.18.tgz", + "integrity": "sha512-Wi8mWhncLJm11GATDaQKobXSNEYGUHeQLiQqDFG1qQ5UTDPTEvKw0Xt5NsTpktGTwLps3ByrWsBrG0rB8YQ9oA==", "funding": [ { "type": "opencollective", @@ -7766,9 +7817,23 @@ "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==" }, "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, "node_modules/safe-regex": { "version": "2.1.1", @@ -8042,6 +8107,15 @@ "node": ">=0.10.0" } }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, "node_modules/sourcemap-codec": { "version": "1.4.8", "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", @@ -8109,13 +8183,6 @@ "spdx-ranges": "^2.0.0" } }, - "node_modules/stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", - "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility", - "dev": true - }, "node_modules/stacktracey": { "version": "2.1.8", "resolved": "https://registry.npmjs.org/stacktracey/-/stacktracey-2.1.8.tgz", @@ -8193,6 +8260,15 @@ "node": ">=8" } }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/strip-indent": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", @@ -8236,9 +8312,9 @@ "dev": true }, "node_modules/stylelint": { - "version": "14.13.0", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-14.13.0.tgz", - "integrity": "sha512-NJSAdloiAB/jgVJKxMR90mWlctvmeBFGFVUvyKngi9+j/qPSJ5ZB+u8jOmGbLTnS7OHrII9NFGehPRyar8U5vg==", + "version": "14.14.0", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-14.14.0.tgz", + "integrity": "sha512-yUI+4xXfPHVnueYddSQ/e1GuEA/2wVhWQbGj16AmWLtQJtn28lVxfS4b0CsWyVRPgd3Auzi0NXOthIEUhtQmmA==", "dev": true, "dependencies": { "@csstools/selector-specificity": "^2.0.2", @@ -8264,7 +8340,7 @@ "micromatch": "^4.0.5", "normalize-path": "^3.0.0", "picocolors": "^1.0.0", - "postcss": "^8.4.16", + "postcss": "^8.4.17", "postcss-media-query-parser": "^0.2.3", "postcss-resolve-nested-selector": "^0.1.1", "postcss-safe-parser": "^6.0.0", @@ -8301,15 +8377,15 @@ } }, "node_modules/stylelint-config-standard": { - "version": "28.0.0", - "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-28.0.0.tgz", - "integrity": "sha512-q/StuowDdDmFCravzGHAwgS9pjX0bdOQUEBBDIkIWsQuYGgYz/xsO8CM6eepmIQ1fc5bKdDVimlJZ6MoOUcJ5Q==", + "version": "29.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-29.0.0.tgz", + "integrity": "sha512-uy8tZLbfq6ZrXy4JKu3W+7lYLgRQBxYTUUB88vPgQ+ZzAxdrvcaSUW9hOMNLYBnwH+9Kkj19M2DHdZ4gKwI7tg==", "dev": true, "dependencies": { "stylelint-config-recommended": "^9.0.0" }, "peerDependencies": { - "stylelint": "^14.11.0" + "stylelint": "^14.14.0" } }, "node_modules/stylelint/node_modules/balanced-match": { @@ -8379,24 +8455,27 @@ "dev": true }, "node_modules/svgo": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", - "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.0.0.tgz", + "integrity": "sha512-mSqPn6RDeNqJvCeqHERlfWJjd4crP/2PgFelil9WpTwC4D3okAUopPsH3lnEyl7ONXfDVyISOihDjO0uK8YVAA==", "dev": true, "dependencies": { "@trysound/sax": "0.2.0", "commander": "^7.2.0", - "css-select": "^4.1.3", - "css-tree": "^1.1.3", - "csso": "^4.2.0", - "picocolors": "^1.0.0", - "stable": "^0.1.8" + "css-select": "^5.1.0", + "css-tree": "^2.2.1", + "csso": "^5.0.5", + "picocolors": "^1.0.0" }, "bin": { "svgo": "bin/svgo" }, "engines": { - "node": ">=10.13.0" + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/svgo" } }, "node_modules/svgo/node_modules/commander": { @@ -8409,9 +8488,9 @@ } }, "node_modules/swagger-ui-dist": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-4.14.2.tgz", - "integrity": "sha512-kOIU7Ts3TrXDLb3/c9jRe4qGp8O3bRT19FFJA8wJfrRFkcK/4atPn3krhtBVJ57ZkNNofworXHxuYwmaisXBdg==" + "version": "4.15.0", + "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-4.15.0.tgz", + "integrity": "sha512-vAsIdNHraLuBRm1vrxcMaLk/y/PGBTvHLf4lQGQ3LaEXkORtIxw11sBMpYJL3keOLaFJ1OqNXuURd6eShoFLZQ==" }, "node_modules/symbol-tree": { "version": "3.2.4", @@ -8516,19 +8595,6 @@ "ajv": "^6.9.1" } }, - "node_modules/terser-webpack-plugin/node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -8551,34 +8617,11 @@ "url": "https://opencollective.com/webpack" } }, - "node_modules/terser-webpack-plugin/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, "node_modules/terser/node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" }, - "node_modules/terser/node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -8586,9 +8629,9 @@ "dev": true }, "node_modules/tinybench": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.3.0.tgz", - "integrity": "sha512-zs1gMVBwyyG2QbVchYIbnabRhMOCGvrwZz/q+SV+LIMa9q5YDQZi2kkI6ZRqV2Bz7ba1uvrc7ieUoE4KWnGeKg==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.3.1.tgz", + "integrity": "sha512-hGYWYBMPr7p4g5IarQE7XhlyWveh1EKhy4wUBS1LrHXCKYgvz+4/jCqgmJqZxxldesn05vccrtME2RLLZNW7iA==", "dev": true }, "node_modules/tinypool": { @@ -8711,15 +8754,6 @@ "json5": "lib/cli.js" } }, - "node_modules/tsconfig-paths/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/tslib": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", @@ -8833,9 +8867,9 @@ } }, "node_modules/updates": { - "version": "13.1.8", - "resolved": "https://registry.npmjs.org/updates/-/updates-13.1.8.tgz", - "integrity": "sha512-hcDCkif1i4MWArx1QkJjLHyPCr8taYyzoypQ7ST/vbmNJyH/cpiawQf+5frvH5uekiSSwtuQNWKdFWB3UH4sew==", + "version": "13.1.10", + "resolved": "https://registry.npmjs.org/updates/-/updates-13.1.10.tgz", + "integrity": "sha512-YSt1ncMoBXAQZndhLwiywvEGHXmA4424SlAf2HMUDuf8qE9Tlqj0s6IANb388HrjkybdZJkaadLSg/hkigwnuQ==", "dev": true, "bin": { "updates": "bin/updates.js" @@ -8964,9 +8998,9 @@ } }, "node_modules/vitest": { - "version": "0.24.1", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.24.1.tgz", - "integrity": "sha512-NKkK1xnDIOOr42pKBfGQQl6b6IWdFVBpG6ZS1T+nUlJuqcOiZ7lxjVwHy9wrtTYpJ0BWww9y6bSGYXubD29Nag==", + "version": "0.24.3", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.24.3.tgz", + "integrity": "sha512-aM0auuPPgMSstWvr851hB74g/LKaKBzSxcG3da7ejfZbx08Y21JpZmbmDYrMTCGhVZKqTGwzcnLMwyfz2WzkhQ==", "dev": true, "dependencies": { "@types/chai": "^4.3.3", @@ -9032,15 +9066,15 @@ } }, "node_modules/vue": { - "version": "3.2.40", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.40.tgz", - "integrity": "sha512-1mGHulzUbl2Nk3pfvI5aXYYyJUs1nm4kyvuz38u4xlQkLUn1i2R7nDbI4TufECmY8v1qNBHYy62bCaM+3cHP2A==", + "version": "3.2.41", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.41.tgz", + "integrity": "sha512-uuuvnrDXEeZ9VUPljgHkqB5IaVO8SxhPpqF2eWOukVrBnRBx2THPSGQBnVRt0GrIG1gvCmFXMGbd7FqcT1ixNQ==", "dependencies": { - "@vue/compiler-dom": "3.2.40", - "@vue/compiler-sfc": "3.2.40", - "@vue/runtime-dom": "3.2.40", - "@vue/server-renderer": "3.2.40", - "@vue/shared": "3.2.40" + "@vue/compiler-dom": "3.2.41", + "@vue/compiler-sfc": "3.2.41", + "@vue/runtime-dom": "3.2.41", + "@vue/server-renderer": "3.2.41", + "@vue/shared": "3.2.41" } }, "node_modules/vue-bar-graph": { @@ -9529,9 +9563,9 @@ } }, "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.1.1.tgz", - "integrity": "sha512-qDOv24WjnYuL+wbwHdlsYZFy+cgPtrYw0Tn7GLORicQp9BkQLzrgI3Pm4VyR9ERZ41YTn7KlMPuL1n05WdZvmg==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "engines": { "node": ">=12" }, @@ -9802,14 +9836,14 @@ } }, "@babel/parser": { - "version": "7.19.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.3.tgz", - "integrity": "sha512-pJ9xOlNWHiy9+FuFP09DEAFbAn4JskgRsVcc169w2xRBC3FRGuQEwjeIMMND9L2zc0iEhO/tGv4Zq+km+hxNpQ==" + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.6.tgz", + "integrity": "sha512-h1IUp81s2JYJ3mRkdxJgs4UvmSsRvDrx5ICSJbPvtWYv5i1nTBGcBpnog+89rAFMwvvru6E5NUHdBe01UeSzYA==" }, "@braintree/sanitize-url": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-6.0.0.tgz", - "integrity": "sha512-mgmE7XBYY/21erpzhexk4Cj1cyTQ9LzvnTxtzM17BJ7ERMNE6W72mQRo0I1Ud8eFJ+RVVIcBNhLFZ3GX4XFz5w==" + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-6.0.1.tgz", + "integrity": "sha512-zr9Qs9KFQiEvMWdZesjcmRJlUck5NR+eKGS1uyKk+oYTWwlYrsoPEi6VmG6/TzBD1hKCGEimrhTgGS6hvn/xIQ==" }, "@claviska/jquery-minicolors": { "version": "2.3.6", @@ -9830,15 +9864,15 @@ "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==" }, "@esbuild/android-arm": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.10.tgz", - "integrity": "sha512-FNONeQPy/ox+5NBkcSbYJxoXj9GWu8gVGJTVmUyoOCKQFDTrHVKgNSzChdNt0I8Aj/iKcsDf2r9BFwv+FSNUXg==", + "version": "0.15.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.12.tgz", + "integrity": "sha512-IC7TqIqiyE0MmvAhWkl/8AEzpOtbhRNDo7aph47We1NbE5w2bt/Q+giAhe0YYeVpYnIhGMcuZY92qDK6dQauvA==", "optional": true }, "@esbuild/linux-loong64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.10.tgz", - "integrity": "sha512-w0Ou3Z83LOYEkwaui2M8VwIp+nLi/NA60lBLMvaJ+vXVMcsARYdEzLNE7RSm4+lSg4zq4d7fAVuzk7PNQ5JFgg==", + "version": "0.15.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.12.tgz", + "integrity": "sha512-tZEowDjvU7O7I04GYvWQOS4yyP9E/7YlsB0jjw1Ycukgr2ycEzKyIk5tms5WnLBymaewc6VmRKnn5IJWgK4eFw==", "optional": true }, "@eslint/eslintrc": { @@ -9879,9 +9913,9 @@ } }, "@humanwhocodes/config-array": { - "version": "0.10.7", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.7.tgz", - "integrity": "sha512-MDl6D6sBsaV452/QSdX+4CXIjZhIcI0PELsxUjk4U828yd58vk3bTIvk/6w5FY+4hIy9sLW0sfrV7K7Kc++j/w==", + "version": "0.11.6", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.6.tgz", + "integrity": "sha512-jJr+hPTJYKyDILJfhNSHsjiwXYf26Flsz8DvNndOsHs5pwSnpGUEy8yzF0JYhCEvTDdV2vuOK5tt8BVhwO5/hg==", "dev": true, "requires": { "@humanwhocodes/object-schema": "^1.2.1", @@ -9901,6 +9935,16 @@ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, "@jridgewell/resolve-uri": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", @@ -9918,18 +9962,6 @@ "requires": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" - }, - "dependencies": { - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - } } }, "@jridgewell/sourcemap-codec": { @@ -9938,9 +9970,9 @@ "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" }, "@jridgewell/trace-mapping": { - "version": "0.3.16", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.16.tgz", - "integrity": "sha512-LCQ+NeThyJ4k1W2d+vIKdxuSt9R3pQSZ4P92m7EakaYuXcVWbHuT5bjNcqLd4Rdgi6xYWYDvBJZJLZSLanjDcA==", + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", "requires": { "@jridgewell/resolve-uri": "3.1.0", "@jridgewell/sourcemap-codec": "1.4.14" @@ -9997,13 +10029,13 @@ } }, "@playwright/test": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.27.0.tgz", - "integrity": "sha512-L4BswoJvGkFsEHhEgzVNHBnkFB1FbnBQn3QmvTl7+AouoJQ4a8tLwZKvytdovCsNi7B5cXuRo58yGvfM5PnExw==", + "version": "1.27.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.27.1.tgz", + "integrity": "sha512-mrL2q0an/7tVqniQQF6RBL2saskjljXzqNcCOVMUjRIgE6Y38nCNaP+Dc2FBW06bcpD3tqIws/HT9qiMHbNU0A==", "dev": true, "requires": { "@types/node": "*", - "playwright-core": "1.27.0" + "playwright-core": "1.27.1" } }, "@popperjs/core": { @@ -10052,26 +10084,24 @@ "dev": true } } + }, + "@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", + "dev": true } } }, "@rollup/pluginutils": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.1.tgz", - "integrity": "sha512-4HaCVEXXuObvcPUaUlLt4faHYHCeQOOWNj8NKFGaRSrw3ZLD0TWeAFZicV9vXjnE2nkNuaVTfTuwAnjR+6uc9A==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz", + "integrity": "sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==", "dev": true, "requires": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", "picomatch": "^2.3.1" - }, - "dependencies": { - "@types/estree": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", - "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==", - "dev": true - } } }, "@stoplight/better-ajv-errors": { @@ -10202,9 +10232,9 @@ } }, "@stoplight/spectral-core": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/@stoplight/spectral-core/-/spectral-core-1.14.2.tgz", - "integrity": "sha512-W2Z31lasEICpZS50STFskOdkn4g0Va81XA1A88LIj9mvlctDFf4BfpjLgIjKkI4f2DEK5C4j3COcbbzV8y5Xig==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@stoplight/spectral-core/-/spectral-core-1.15.0.tgz", + "integrity": "sha512-+DwK8SmnujMZJaxJeNU11vWY+DFOnt4oQM1TzAuvufdd3Y6Lsno88Jl31OaR1M9Fn7l/u3v1anBB/SSl/fI5rQ==", "dev": true, "requires": { "@stoplight/better-ajv-errors": "1.0.3", @@ -10366,9 +10396,9 @@ } }, "@stoplight/spectral-ruleset-bundler": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@stoplight/spectral-ruleset-bundler/-/spectral-ruleset-bundler-1.3.2.tgz", - "integrity": "sha512-sy7mHVBwmo5/8dUlnWiel2UND1Mnu3x+okBAgLmkGcIpXz74rMmVY3h5vT6rjxw65WZ3/c3mtm1dRQuSe+q5fw==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@stoplight/spectral-ruleset-bundler/-/spectral-ruleset-bundler-1.3.3.tgz", + "integrity": "sha512-hfHl7XZeF/wWMpSrsLqLnH2GevRHjSIqtBL2aRjO2SjMCTbO9LVz80p4sYaxrCcu4wQ6K71gMZXsG687+3fAeg==", "dev": true, "requires": { "@rollup/plugin-commonjs": "~22.0.2", @@ -10432,13 +10462,19 @@ "@types/json-schema": "^7.0.4", "utility-types": "^3.10.0" } + }, + "@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", + "dev": true } } }, "@stoplight/spectral-ruleset-migrator": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@stoplight/spectral-ruleset-migrator/-/spectral-ruleset-migrator-1.7.4.tgz", - "integrity": "sha512-QySMWSvGUC5D8cNDvXhrXEY0a4DB5hewHwjxXbwlH51fVNiVKJ4+KcaCW3s2yAT4T1p6/ij8NkLX9T81D4vSCg==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@stoplight/spectral-ruleset-migrator/-/spectral-ruleset-migrator-1.8.0.tgz", + "integrity": "sha512-zg6RPF+d8uS7zAp5TzUph3hQG4sgGcG5Fsw8Zx24H1REyuSkjiIfyee2Kf13c3BcIlTXvnFc4csz2rNXpZO7Ug==", "dev": true, "requires": { "@stoplight/json": "~3.20.1", @@ -10622,9 +10658,9 @@ } }, "@types/eslint": { - "version": "8.4.6", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.6.tgz", - "integrity": "sha512-/fqTbjxyFUaYNO7VcW5g+4npmqVACz1bB7RTHYuLj+PRjw9hrCwrUXVQFpChUS0JsyEFvMZ7U/PfmvWgxJhI9g==", + "version": "8.4.7", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.7.tgz", + "integrity": "sha512-ehM7cCt2RSFs42mb+lcmhFT9ouIlV92PuaeRGn8N8c98oMjG4Z5pJHA9b1QiCcuqnbPSHcyfiD3mlhqMaHsQIw==", "requires": { "@types/estree": "*", "@types/json-schema": "*" @@ -10640,9 +10676,9 @@ } }, "@types/estree": { - "version": "0.0.39", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", - "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", + "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==" }, "@types/json-schema": { "version": "7.0.11", @@ -10667,9 +10703,9 @@ "dev": true }, "@types/node": { - "version": "18.8.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.8.3.tgz", - "integrity": "sha512-0os9vz6BpGwxGe9LOhgP/ncvYN5Tx1fNcd2TM3rD/aCGBkysb+ZWpXEocG24h6ZzOi13+VB8HndAQFezsSOw1w==" + "version": "18.11.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.4.tgz", + "integrity": "sha512-BxcJpBu8D3kv/GZkx/gSMz6VnTJREBj/4lbzYOQueUOELkt8WrO6zAcSPmp9uRPEW/d+lUO8QK0W2xnS1hEU0A==" }, "@types/normalize-package-data": { "version": "2.4.1", @@ -10698,36 +10734,36 @@ "dev": true }, "@vue/compiler-core": { - "version": "3.2.40", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.40.tgz", - "integrity": "sha512-2Dc3Stk0J/VyQ4OUr2yEC53kU28614lZS+bnrCbFSAIftBJ40g/2yQzf4mPBiFuqguMB7hyHaujdgZAQ67kZYA==", + "version": "3.2.41", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.41.tgz", + "integrity": "sha512-oA4mH6SA78DT+96/nsi4p9DX97PHcNROxs51lYk7gb9Z4BPKQ3Mh+BLn6CQZBw857Iuhu28BfMSRHAlPvD4vlw==", "requires": { "@babel/parser": "^7.16.4", - "@vue/shared": "3.2.40", + "@vue/shared": "3.2.41", "estree-walker": "^2.0.2", "source-map": "^0.6.1" } }, "@vue/compiler-dom": { - "version": "3.2.40", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.40.tgz", - "integrity": "sha512-OZCNyYVC2LQJy4H7h0o28rtk+4v+HMQygRTpmibGoG9wZyomQiS5otU7qo3Wlq5UfHDw2RFwxb9BJgKjVpjrQw==", + "version": "3.2.41", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.41.tgz", + "integrity": "sha512-xe5TbbIsonjENxJsYRbDJvthzqxLNk+tb3d/c47zgREDa/PCp6/Y4gC/skM4H6PIuX5DAxm7fFJdbjjUH2QTMw==", "requires": { - "@vue/compiler-core": "3.2.40", - "@vue/shared": "3.2.40" + "@vue/compiler-core": "3.2.41", + "@vue/shared": "3.2.41" } }, "@vue/compiler-sfc": { - "version": "3.2.40", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.40.tgz", - "integrity": "sha512-tzqwniIN1fu1PDHC3CpqY/dPCfN/RN1thpBC+g69kJcrl7mbGiHKNwbA6kJ3XKKy8R6JLKqcpVugqN4HkeBFFg==", + "version": "3.2.41", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.41.tgz", + "integrity": "sha512-+1P2m5kxOeaxVmJNXnBskAn3BenbTmbxBxWOtBq3mQTCokIreuMULFantBUclP0+KnzNCMOvcnKinqQZmiOF8w==", "requires": { "@babel/parser": "^7.16.4", - "@vue/compiler-core": "3.2.40", - "@vue/compiler-dom": "3.2.40", - "@vue/compiler-ssr": "3.2.40", - "@vue/reactivity-transform": "3.2.40", - "@vue/shared": "3.2.40", + "@vue/compiler-core": "3.2.41", + "@vue/compiler-dom": "3.2.41", + "@vue/compiler-ssr": "3.2.41", + "@vue/reactivity-transform": "3.2.41", + "@vue/shared": "3.2.41", "estree-walker": "^2.0.2", "magic-string": "^0.25.7", "postcss": "^8.1.10", @@ -10735,66 +10771,66 @@ } }, "@vue/compiler-ssr": { - "version": "3.2.40", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.40.tgz", - "integrity": "sha512-80cQcgasKjrPPuKcxwuCx7feq+wC6oFl5YaKSee9pV3DNq+6fmCVwEEC3vvkf/E2aI76rIJSOYHsWSEIxK74oQ==", + "version": "3.2.41", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.41.tgz", + "integrity": "sha512-Y5wPiNIiaMz/sps8+DmhaKfDm1xgj6GrH99z4gq2LQenfVQcYXmHIOBcs5qPwl7jaW3SUQWjkAPKMfQemEQZwQ==", "requires": { - "@vue/compiler-dom": "3.2.40", - "@vue/shared": "3.2.40" + "@vue/compiler-dom": "3.2.41", + "@vue/shared": "3.2.41" } }, "@vue/reactivity": { - "version": "3.2.40", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.40.tgz", - "integrity": "sha512-N9qgGLlZmtUBMHF9xDT4EkD9RdXde1Xbveb+niWMXuHVWQP5BzgRmE3SFyUBBcyayG4y1lhoz+lphGRRxxK4RA==", + "version": "3.2.41", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.41.tgz", + "integrity": "sha512-9JvCnlj8uc5xRiQGZ28MKGjuCoPhhTwcoAdv3o31+cfGgonwdPNuvqAXLhlzu4zwqavFEG5tvaoINQEfxz+l6g==", "requires": { - "@vue/shared": "3.2.40" + "@vue/shared": "3.2.41" } }, "@vue/reactivity-transform": { - "version": "3.2.40", - "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.40.tgz", - "integrity": "sha512-HQUCVwEaacq6fGEsg2NUuGKIhUveMCjOk8jGHqLXPI2w6zFoPrlQhwWEaINTv5kkZDXKEnCijAp+4gNEHG03yw==", + "version": "3.2.41", + "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.41.tgz", + "integrity": "sha512-mK5+BNMsL4hHi+IR3Ft/ho6Za+L3FA5j8WvreJ7XzHrqkPq8jtF/SMo7tuc9gHjLDwKZX1nP1JQOKo9IEAn54A==", "requires": { "@babel/parser": "^7.16.4", - "@vue/compiler-core": "3.2.40", - "@vue/shared": "3.2.40", + "@vue/compiler-core": "3.2.41", + "@vue/shared": "3.2.41", "estree-walker": "^2.0.2", "magic-string": "^0.25.7" } }, "@vue/runtime-core": { - "version": "3.2.40", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.40.tgz", - "integrity": "sha512-U1+rWf0H8xK8aBUZhnrN97yoZfHbjgw/bGUzfgKPJl69/mXDuSg8CbdBYBn6VVQdR947vWneQBFzdhasyzMUKg==", + "version": "3.2.41", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.41.tgz", + "integrity": "sha512-0LBBRwqnI0p4FgIkO9q2aJBBTKDSjzhnxrxHYengkAF6dMOjeAIZFDADAlcf2h3GDALWnblbeprYYpItiulSVQ==", "requires": { - "@vue/reactivity": "3.2.40", - "@vue/shared": "3.2.40" + "@vue/reactivity": "3.2.41", + "@vue/shared": "3.2.41" } }, "@vue/runtime-dom": { - "version": "3.2.40", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.40.tgz", - "integrity": "sha512-AO2HMQ+0s2+MCec8hXAhxMgWhFhOPJ/CyRXnmTJ6XIOnJFLrH5Iq3TNwvVcODGR295jy77I6dWPj+wvFoSYaww==", + "version": "3.2.41", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.41.tgz", + "integrity": "sha512-U7zYuR1NVIP8BL6jmOqmapRAHovEFp7CSw4pR2FacqewXNGqZaRfHoNLQsqQvVQ8yuZNZtxSZy0FFyC70YXPpA==", "requires": { - "@vue/runtime-core": "3.2.40", - "@vue/shared": "3.2.40", + "@vue/runtime-core": "3.2.41", + "@vue/shared": "3.2.41", "csstype": "^2.6.8" } }, "@vue/server-renderer": { - "version": "3.2.40", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.40.tgz", - "integrity": "sha512-gtUcpRwrXOJPJ4qyBpU3EyxQa4EkV8I4f8VrDePcGCPe4O/hd0BPS7v9OgjIQob6Ap8VDz9G+mGTKazE45/95w==", + "version": "3.2.41", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.41.tgz", + "integrity": "sha512-7YHLkfJdTlsZTV0ae5sPwl9Gn/EGr2hrlbcS/8naXm2CDpnKUwC68i1wGlrYAfIgYWL7vUZwk2GkYLQH5CvFig==", "requires": { - "@vue/compiler-ssr": "3.2.40", - "@vue/shared": "3.2.40" + "@vue/compiler-ssr": "3.2.41", + "@vue/shared": "3.2.41" } }, "@vue/shared": { - "version": "3.2.40", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.40.tgz", - "integrity": "sha512-0PLQ6RUtZM0vO3teRfzGi4ltLUO5aO+kLgwh4Um3THSR03rpQWLTuRCkuO5A41ITzwdWeKdPHtSARuPkoo5pCQ==" + "version": "3.2.41", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.41.tgz", + "integrity": "sha512-W9mfWLHmJhkfAmV+7gDjcHeAWALQtgGT3JErxULl0oz6R6+3ug91I7IErs93eCFhPCZPHBs4QJS7YWEV7A3sxw==" }, "@webassemblyjs/ast": { "version": "1.11.1", @@ -10973,9 +11009,9 @@ } }, "acorn": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", - "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==" + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", + "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==" }, "acorn-globals": { "version": "7.0.1", @@ -11272,9 +11308,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001418", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001418.tgz", - "integrity": "sha512-oIs7+JL3K9JRQ3jPZjlH6qyYDp+nBTCais7hjh0s+fuBwufc7uZ7hPYMXrDOJhV360KGMTcczMRObk0/iMqZRg==" + "version": "1.0.30001423", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001423.tgz", + "integrity": "sha512-09iwWGOlifvE1XuHokFMP7eR38a0JnajoyL3/i87c8ZjRWRrdKo1fqjNfugfBD0UDBIOz0U+jtNhJ0EPm1VleQ==" }, "chai": { "version": "4.3.6", @@ -11499,26 +11535,26 @@ } }, "css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", "dev": true, "requires": { "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", "nth-check": "^2.0.1" } }, "css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", "dev": true, "requires": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" } }, "css-what": { @@ -11533,12 +11569,12 @@ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" }, "csso": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", - "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", "dev": true, "requires": { - "css-tree": "^1.1.2" + "css-tree": "~2.2.0" } }, "cssom": { @@ -12189,9 +12225,9 @@ } }, "decimal.js": { - "version": "10.4.1", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.1.tgz", - "integrity": "sha512-F29o+vci4DodHYT9UrR5IEbfBw9pE5eSapIJdTqXK5+6hq+t8VRxwQyKlW2i+KDKFkkJQRvFyI/QXD83h8LyQw==", + "version": "10.4.2", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.2.tgz", + "integrity": "sha512-ic1yEvwT6GuvaYwBLLY6/aFFgjZdySKTE8en/fkU3QICTmRtgtSlFn0u0BXN06InZwtfCelR7j8LRiDI/02iGA==", "dev": true }, "deep-eql": { @@ -12351,20 +12387,20 @@ } }, "dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", "dev": true, "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" }, "dependencies": { "entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", + "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==", "dev": true } } @@ -12385,12 +12421,12 @@ } }, "domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", "dev": true, "requires": { - "domelementtype": "^2.2.0" + "domelementtype": "^2.3.0" } }, "dompurify": { @@ -12399,14 +12435,14 @@ "integrity": "sha512-Be9tbQMZds4a3C6xTmz68NlMfeONA//4dOavl/1rNw50E+/QO0KVpbcU0PcaW0nsQxurXls9ZocqFxk8R2mWEA==" }, "domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", + "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", "dev": true, "requires": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.1" } }, "dropzone": { @@ -12436,9 +12472,9 @@ } }, "electron-to-chromium": { - "version": "1.4.276", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.276.tgz", - "integrity": "sha512-EpuHPqu8YhonqLBXHoU6hDJCD98FCe6KDoet3/gY1qsQ6usjJoHqBH2YIVs8FXaAtHwVL8Uqa/fsYao/vq9VWQ==" + "version": "1.4.284", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", + "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==" }, "emoji-regex": { "version": "8.0.0", @@ -12567,116 +12603,116 @@ } }, "esbuild": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.10.tgz", - "integrity": "sha512-N7wBhfJ/E5fzn/SpNgX+oW2RLRjwaL8Y0ezqNqhjD6w0H2p0rDuEz2FKZqpqLnO8DCaWumKe8dsC/ljvVSSxng==", + "version": "0.15.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.12.tgz", + "integrity": "sha512-PcT+/wyDqJQsRVhaE9uX/Oq4XLrFh0ce/bs2TJh4CSaw9xuvI+xFrH2nAYOADbhQjUgAhNWC5LKoUsakm4dxng==", "requires": { - "@esbuild/android-arm": "0.15.10", - "@esbuild/linux-loong64": "0.15.10", - "esbuild-android-64": "0.15.10", - "esbuild-android-arm64": "0.15.10", - "esbuild-darwin-64": "0.15.10", - "esbuild-darwin-arm64": "0.15.10", - "esbuild-freebsd-64": "0.15.10", - "esbuild-freebsd-arm64": "0.15.10", - "esbuild-linux-32": "0.15.10", - "esbuild-linux-64": "0.15.10", - "esbuild-linux-arm": "0.15.10", - "esbuild-linux-arm64": "0.15.10", - "esbuild-linux-mips64le": "0.15.10", - "esbuild-linux-ppc64le": "0.15.10", - "esbuild-linux-riscv64": "0.15.10", - "esbuild-linux-s390x": "0.15.10", - "esbuild-netbsd-64": "0.15.10", - "esbuild-openbsd-64": "0.15.10", - "esbuild-sunos-64": "0.15.10", - "esbuild-windows-32": "0.15.10", - "esbuild-windows-64": "0.15.10", - "esbuild-windows-arm64": "0.15.10" + "@esbuild/android-arm": "0.15.12", + "@esbuild/linux-loong64": "0.15.12", + "esbuild-android-64": "0.15.12", + "esbuild-android-arm64": "0.15.12", + "esbuild-darwin-64": "0.15.12", + "esbuild-darwin-arm64": "0.15.12", + "esbuild-freebsd-64": "0.15.12", + "esbuild-freebsd-arm64": "0.15.12", + "esbuild-linux-32": "0.15.12", + "esbuild-linux-64": "0.15.12", + "esbuild-linux-arm": "0.15.12", + "esbuild-linux-arm64": "0.15.12", + "esbuild-linux-mips64le": "0.15.12", + "esbuild-linux-ppc64le": "0.15.12", + "esbuild-linux-riscv64": "0.15.12", + "esbuild-linux-s390x": "0.15.12", + "esbuild-netbsd-64": "0.15.12", + "esbuild-openbsd-64": "0.15.12", + "esbuild-sunos-64": "0.15.12", + "esbuild-windows-32": "0.15.12", + "esbuild-windows-64": "0.15.12", + "esbuild-windows-arm64": "0.15.12" } }, "esbuild-android-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.10.tgz", - "integrity": "sha512-UI7krF8OYO1N7JYTgLT9ML5j4+45ra3amLZKx7LO3lmLt1Ibn8t3aZbX5Pu4BjWiqDuJ3m/hsvhPhK/5Y/YpnA==", + "version": "0.15.12", + "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.12.tgz", + "integrity": "sha512-MJKXwvPY9g0rGps0+U65HlTsM1wUs9lbjt5CU19RESqycGFDRijMDQsh68MtbzkqWSRdEtiKS1mtPzKneaAI0Q==", "optional": true }, "esbuild-android-arm64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.10.tgz", - "integrity": "sha512-EOt55D6xBk5O05AK8brXUbZmoFj4chM8u3riGflLa6ziEoVvNjRdD7Cnp82NHQGfSHgYR06XsPI8/sMuA/cUwg==", + "version": "0.15.12", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.12.tgz", + "integrity": "sha512-Hc9SEcZbIMhhLcvhr1DH+lrrec9SFTiRzfJ7EGSBZiiw994gfkVV6vG0sLWqQQ6DD7V4+OggB+Hn0IRUdDUqvA==", "optional": true }, "esbuild-darwin-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.10.tgz", - "integrity": "sha512-hbDJugTicqIm+WKZgp208d7FcXcaK8j2c0l+fqSJ3d2AzQAfjEYDRM3Z2oMeqSJ9uFxyj/muSACLdix7oTstRA==", + "version": "0.15.12", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.12.tgz", + "integrity": "sha512-qkmqrTVYPFiePt5qFjP8w/S+GIUMbt6k8qmiPraECUWfPptaPJUGkCKrWEfYFRWB7bY23FV95rhvPyh/KARP8Q==", "optional": true }, "esbuild-darwin-arm64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.10.tgz", - "integrity": "sha512-M1t5+Kj4IgSbYmunf2BB6EKLkWUq+XlqaFRiGOk8bmBapu9bCDrxjf4kUnWn59Dka3I27EiuHBKd1rSO4osLFQ==", + "version": "0.15.12", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.12.tgz", + "integrity": "sha512-z4zPX02tQ41kcXMyN3c/GfZpIjKoI/BzHrdKUwhC/Ki5BAhWv59A9M8H+iqaRbwpzYrYidTybBwiZAIWCLJAkw==", "optional": true }, "esbuild-freebsd-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.10.tgz", - "integrity": "sha512-KMBFMa7C8oc97nqDdoZwtDBX7gfpolkk6Bcmj6YFMrtCMVgoU/x2DI1p74DmYl7CSS6Ppa3xgemrLrr5IjIn0w==", + "version": "0.15.12", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.12.tgz", + "integrity": "sha512-XFL7gKMCKXLDiAiBjhLG0XECliXaRLTZh6hsyzqUqPUf/PY4C6EJDTKIeqqPKXaVJ8+fzNek88285krSz1QECw==", "optional": true }, "esbuild-freebsd-arm64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.10.tgz", - "integrity": "sha512-m2KNbuCX13yQqLlbSojFMHpewbn8wW5uDS6DxRpmaZKzyq8Dbsku6hHvh2U+BcLwWY4mpgXzFUoENEf7IcioGg==", + "version": "0.15.12", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.12.tgz", + "integrity": "sha512-jwEIu5UCUk6TjiG1X+KQnCGISI+ILnXzIzt9yDVrhjug2fkYzlLbl0K43q96Q3KB66v6N1UFF0r5Ks4Xo7i72g==", "optional": true }, "esbuild-linux-32": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.10.tgz", - "integrity": "sha512-guXrwSYFAvNkuQ39FNeV4sNkNms1bLlA5vF1H0cazZBOLdLFIny6BhT+TUbK/hdByMQhtWQ5jI9VAmPKbVPu1w==", + "version": "0.15.12", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.12.tgz", + "integrity": "sha512-uSQuSEyF1kVzGzuIr4XM+v7TPKxHjBnLcwv2yPyCz8riV8VUCnO/C4BF3w5dHiVpCd5Z1cebBtZJNlC4anWpwA==", "optional": true }, "esbuild-linux-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.10.tgz", - "integrity": "sha512-jd8XfaSJeucMpD63YNMO1JCrdJhckHWcMv6O233bL4l6ogQKQOxBYSRP/XLWP+6kVTu0obXovuckJDcA0DKtQA==", + "version": "0.15.12", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.12.tgz", + "integrity": "sha512-QcgCKb7zfJxqT9o5z9ZUeGH1k8N6iX1Y7VNsEi5F9+HzN1OIx7ESxtQXDN9jbeUSPiRH1n9cw6gFT3H4qbdvcA==", "optional": true }, "esbuild-linux-arm": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.10.tgz", - "integrity": "sha512-6N8vThLL/Lysy9y4Ex8XoLQAlbZKUyExCWyayGi2KgTBelKpPgj6RZnUaKri0dHNPGgReJriKVU6+KDGQwn10A==", + "version": "0.15.12", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.12.tgz", + "integrity": "sha512-Wf7T0aNylGcLu7hBnzMvsTfEXdEdJY/hY3u36Vla21aY66xR0MS5I1Hw8nVquXjTN0A6fk/vnr32tkC/C2lb0A==", "optional": true }, "esbuild-linux-arm64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.10.tgz", - "integrity": "sha512-GByBi4fgkvZFTHFDYNftu1DQ1GzR23jws0oWyCfhnI7eMOe+wgwWrc78dbNk709Ivdr/evefm2PJiUBMiusS1A==", + "version": "0.15.12", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.12.tgz", + "integrity": "sha512-HtNq5xm8fUpZKwWKS2/YGwSfTF+339L4aIA8yphNKYJckd5hVdhfdl6GM2P3HwLSCORS++++7++//ApEwXEuAQ==", "optional": true }, "esbuild-linux-mips64le": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.10.tgz", - "integrity": "sha512-BxP+LbaGVGIdQNJUNF7qpYjEGWb0YyHVSKqYKrn+pTwH/SiHUxFyJYSP3pqkku61olQiSBnSmWZ+YUpj78Tw7Q==", + "version": "0.15.12", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.12.tgz", + "integrity": "sha512-Qol3+AvivngUZkTVFgLpb0H6DT+N5/zM3V1YgTkryPYFeUvuT5JFNDR3ZiS6LxhyF8EE+fiNtzwlPqMDqVcc6A==", "optional": true }, "esbuild-linux-ppc64le": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.10.tgz", - "integrity": "sha512-LoSQCd6498PmninNgqd/BR7z3Bsk/mabImBWuQ4wQgmQEeanzWd5BQU2aNi9mBURCLgyheuZS6Xhrw5luw3OkQ==", + "version": "0.15.12", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.12.tgz", + "integrity": "sha512-4D8qUCo+CFKaR0cGXtGyVsOI7w7k93Qxb3KFXWr75An0DHamYzq8lt7TNZKoOq/Gh8c40/aKaxvcZnTgQ0TJNg==", "optional": true }, "esbuild-linux-riscv64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.10.tgz", - "integrity": "sha512-Lrl9Cr2YROvPV4wmZ1/g48httE8z/5SCiXIyebiB5N8VT7pX3t6meI7TQVHw/wQpqP/AF4SksDuFImPTM7Z32Q==", + "version": "0.15.12", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.12.tgz", + "integrity": "sha512-G9w6NcuuCI6TUUxe6ka0enjZHDnSVK8bO+1qDhMOCtl7Tr78CcZilJj8SGLN00zO5iIlwNRZKHjdMpfFgNn1VA==", "optional": true }, "esbuild-linux-s390x": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.10.tgz", - "integrity": "sha512-ReP+6q3eLVVP2lpRrvl5EodKX7EZ1bS1/z5j6hsluAlZP5aHhk6ghT6Cq3IANvvDdscMMCB4QEbI+AjtvoOFpA==", + "version": "0.15.12", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.12.tgz", + "integrity": "sha512-Lt6BDnuXbXeqSlVuuUM5z18GkJAZf3ERskGZbAWjrQoi9xbEIsj/hEzVnSAFLtkfLuy2DE4RwTcX02tZFunXww==", "optional": true }, "esbuild-loader": { @@ -12693,39 +12729,39 @@ } }, "esbuild-netbsd-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.10.tgz", - "integrity": "sha512-iGDYtJCMCqldMskQ4eIV+QSS/CuT7xyy9i2/FjpKvxAuCzrESZXiA1L64YNj6/afuzfBe9i8m/uDkFHy257hTw==", + "version": "0.15.12", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.12.tgz", + "integrity": "sha512-jlUxCiHO1dsqoURZDQts+HK100o0hXfi4t54MNRMCAqKGAV33JCVvMplLAa2FwviSojT/5ZG5HUfG3gstwAG8w==", "optional": true }, "esbuild-openbsd-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.10.tgz", - "integrity": "sha512-ftMMIwHWrnrYnvuJQRJs/Smlcb28F9ICGde/P3FUTCgDDM0N7WA0o9uOR38f5Xe2/OhNCgkjNeb7QeaE3cyWkQ==", + "version": "0.15.12", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.12.tgz", + "integrity": "sha512-1o1uAfRTMIWNOmpf8v7iudND0L6zRBYSH45sofCZywrcf7NcZA+c7aFsS1YryU+yN7aRppTqdUK1PgbZVaB1Dw==", "optional": true }, "esbuild-sunos-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.10.tgz", - "integrity": "sha512-mf7hBL9Uo2gcy2r3rUFMjVpTaGpFJJE5QTDDqUFf1632FxteYANffDZmKbqX0PfeQ2XjUDE604IcE7OJeoHiyg==", + "version": "0.15.12", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.12.tgz", + "integrity": "sha512-nkl251DpoWoBO9Eq9aFdoIt2yYmp4I3kvQjba3jFKlMXuqQ9A4q+JaqdkCouG3DHgAGnzshzaGu6xofGcXyPXg==", "optional": true }, "esbuild-windows-32": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.10.tgz", - "integrity": "sha512-ttFVo+Cg8b5+qHmZHbEc8Vl17kCleHhLzgT8X04y8zudEApo0PxPg9Mz8Z2cKH1bCYlve1XL8LkyXGFjtUYeGg==", + "version": "0.15.12", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.12.tgz", + "integrity": "sha512-WlGeBZHgPC00O08luIp5B2SP4cNCp/PcS+3Pcg31kdcJPopHxLkdCXtadLU9J82LCfw4TVls21A6lilQ9mzHrw==", "optional": true }, "esbuild-windows-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.10.tgz", - "integrity": "sha512-2H0gdsyHi5x+8lbng3hLbxDWR7mKHWh5BXZGKVG830KUmXOOWFE2YKJ4tHRkejRduOGDrBvHBriYsGtmTv3ntA==", + "version": "0.15.12", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.12.tgz", + "integrity": "sha512-VActO3WnWZSN//xjSfbiGOSyC+wkZtI8I4KlgrTo5oHJM6z3MZZBCuFaZHd8hzf/W9KPhF0lY8OqlmWC9HO5AA==", "optional": true }, "esbuild-windows-arm64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.10.tgz", - "integrity": "sha512-S+th4F+F8VLsHLR0zrUcG+Et4hx0RKgK1eyHc08kztmLOES8BWwMiaGdoW9hiXuzznXQ0I/Fg904MNbr11Nktw==", + "version": "0.15.12", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.12.tgz", + "integrity": "sha512-Of3MIacva1OK/m4zCNIvBfz8VVROBmQT+gRX6pFTLPngFYcj6TFH/12VveAqq1k9VB2l28EoVMNMUCcmsfwyuA==", "optional": true }, "escalade": { @@ -12799,14 +12835,15 @@ } }, "eslint": { - "version": "8.25.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.25.0.tgz", - "integrity": "sha512-DVlJOZ4Pn50zcKW5bYH7GQK/9MsoQG2d5eDH0ebEkE8PbgzTTmtt/VTH9GGJ4BfeZCpBLqFfvsjX35UacUL83A==", + "version": "8.26.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.26.0.tgz", + "integrity": "sha512-kzJkpaw1Bfwheq4VXUezFriD1GxszX6dUekM7Z3aC2o4hju+tsR/XyTC3RcoSD7jmy9VkPU3+N6YjVU2e96Oyg==", "dev": true, "requires": { "@eslint/eslintrc": "^1.3.3", - "@humanwhocodes/config-array": "^0.10.5", + "@humanwhocodes/config-array": "^0.11.6", "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -12822,14 +12859,14 @@ "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", - "glob-parent": "^6.0.1", + "glob-parent": "^6.0.2", "globals": "^13.15.0", - "globby": "^11.1.0", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", "js-sdsl": "^4.1.4", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", @@ -12960,9 +12997,9 @@ "requires": {} }, "eslint-plugin-sonarjs": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-sonarjs/-/eslint-plugin-sonarjs-0.15.0.tgz", - "integrity": "sha512-LuxHdAe6VqSbi1phsUvNjbmXLuvlobmryQJJNyQYbdubCfz6K8tmgoqNiJPnz0pP2AbYDbtuPm0ajOMgMrC+dQ==", + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-sonarjs/-/eslint-plugin-sonarjs-0.16.0.tgz", + "integrity": "sha512-al8ojAzcQW8Eu0tWn841ldhPpPcjrJ59TzzTfAVWR45bWvdAASCmrGl8vK0MWHyKVDdC0i17IGbtQQ1KgxLlVA==", "dev": true, "requires": {} }, @@ -13616,9 +13653,9 @@ "optional": true }, "immer": { - "version": "9.0.15", - "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.15.tgz", - "integrity": "sha512-2eB/sswms9AEUSkOm4SbV5Y7Vmt/bKRwByd52jfLkW4OLYeaTP3EEiJ9agqU0O/tq6Dk62Zfj+TJSqfm1rLVGQ==", + "version": "9.0.16", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.16.tgz", + "integrity": "sha512-qenGE7CstVm1NrHQbMh8YaSzTZTFNP3zPqr3YU0S0UY441j4bJTg4A2Hh5KAhwgaiU6ZZ1Ar6y/2f4TblnMReQ==", "dev": true }, "import-fresh": { @@ -13746,9 +13783,9 @@ "dev": true }, "is-core-module": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", - "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", "requires": { "has": "^1.0.3" } @@ -13800,6 +13837,12 @@ "has-tostringtag": "^1.0.0" } }, + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true + }, "is-plain-obj": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", @@ -13894,6 +13937,26 @@ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==" }, + "jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "dependencies": { + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, "joycon": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", @@ -14027,9 +14090,9 @@ "integrity": "sha512-b+z6yF1d4EOyDgylzQo5IminlUmzSeqR1hs/bzjBNjuGras4FXq/6TrzjxfN0j+TmI0ltJzTNlqXUMCniciwKQ==" }, "katex": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.2.tgz", - "integrity": "sha512-70DJdQAyh9EMsthw3AaQlDyFf54X7nWEUIa5W+rq8XOpEk//w5Th7/8SqFqpvi/KZ2t6MHUj4f9wLmztBmAYQA==", + "version": "0.16.3", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.3.tgz", + "integrity": "sha512-3EykQddareoRmbtNiNEDgl3IGjryyrp2eg/25fHDEnlHymIDi33bptkMv6K4EOC2LZCybLW/ZkEo6Le+EM9pmA==", "requires": { "commander": "^8.0.0" } @@ -14070,24 +14133,6 @@ "parse-node-version": "^1.0.1", "source-map": "~0.6.0", "tslib": "^2.3.0" - }, - "dependencies": { - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "optional": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "optional": true - } } }, "less-loader": { @@ -14177,9 +14222,9 @@ "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==" }, "loader-utils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", - "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.3.tgz", + "integrity": "sha512-THWqIsn8QRnvLl0shHYVBN9syumU8pYWEHPTmkiVGd+7K5eFNVSY6AJhRvgGF70gg1Dz+l/k8WicvFCxdEs60A==", "requires": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -14284,6 +14329,24 @@ "sourcemap-codec": "^1.4.8" } }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "optional": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "optional": true + } + } + }, "map-obj": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", @@ -14393,9 +14456,9 @@ "dev": true }, "mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "version": "2.0.28", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", "dev": true }, "mdurl": { @@ -14545,9 +14608,9 @@ } }, "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", "dev": true }, "minimist-options": { @@ -14567,9 +14630,9 @@ "integrity": "sha512-9ARkWHBs+6YJIvrIp0Ik5tyTTtP9PoV0Ssu2Ocq5y9v8+NOOpWiRshAp8c4rZVWTOe+157on/5G+zj5pwIQFEQ==" }, "monaco-editor": { - "version": "0.34.0", - "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.34.0.tgz", - "integrity": "sha512-VF+S5zG8wxfinLKLrWcl4WUizMx+LeJrG4PM/M78OhcwocpV0jiyhX/pG6Q9jIOhrb/ckYi6nHnaR5OojlOZCQ==" + "version": "0.34.1", + "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.34.1.tgz", + "integrity": "sha512-FKc80TyiMaruhJKKPz5SpJPIjL+dflGvz4CpuThaPMc94AyN7SeC9HQ8hrvaxX7EyHdJcUY5i4D0gNyJj1vSZQ==" }, "monaco-editor-webpack-plugin": { "version": "7.0.1", @@ -15003,9 +15066,9 @@ } }, "playwright-core": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.27.0.tgz", - "integrity": "sha512-VBKaaFUVKDo3akW+o4DwbK1ZyXh46tcSwQKPK3lruh8IJd5feu55XVZx4vOkbb2uqrNdIF51sgsadYT533SdpA==", + "version": "1.27.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.27.1.tgz", + "integrity": "sha512-9EmeXDncC2Pmp/z+teoVYlvmPWUC6ejSSYZUln7YaP89Z6lpAaiaAnqroUt/BoLo8tn7WYShcfaCh+xofZa44Q==", "dev": true }, "pluralize": { @@ -15021,9 +15084,9 @@ "dev": true }, "postcss": { - "version": "8.4.17", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.17.tgz", - "integrity": "sha512-UNxNOLQydcOFi41yHNMcKRZ39NeXlr8AxGuZJsdub8vIb12fHzcq37DTU/QtbI6WLxNg2gF9Z+8qtRwTj1UI1Q==", + "version": "8.4.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.18.tgz", + "integrity": "sha512-Wi8mWhncLJm11GATDaQKobXSNEYGUHeQLiQqDFG1qQ5UTDPTEvKw0Xt5NsTpktGTwLps3ByrWsBrG0rB8YQ9oA==", "requires": { "nanoid": "^3.3.4", "picocolors": "^1.0.0", @@ -15465,9 +15528,9 @@ "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==" }, "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" }, "safe-regex": { "version": "2.1.1", @@ -15682,6 +15745,15 @@ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" }, + "source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, "sourcemap-codec": { "version": "1.4.8", "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", @@ -15749,12 +15821,6 @@ "spdx-ranges": "^2.0.0" } }, - "stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", - "dev": true - }, "stacktracey": { "version": "2.1.8", "resolved": "https://registry.npmjs.org/stacktracey/-/stacktracey-2.1.8.tgz", @@ -15817,6 +15883,12 @@ "ansi-regex": "^5.0.1" } }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true + }, "strip-indent": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", @@ -15848,9 +15920,9 @@ "dev": true }, "stylelint": { - "version": "14.13.0", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-14.13.0.tgz", - "integrity": "sha512-NJSAdloiAB/jgVJKxMR90mWlctvmeBFGFVUvyKngi9+j/qPSJ5ZB+u8jOmGbLTnS7OHrII9NFGehPRyar8U5vg==", + "version": "14.14.0", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-14.14.0.tgz", + "integrity": "sha512-yUI+4xXfPHVnueYddSQ/e1GuEA/2wVhWQbGj16AmWLtQJtn28lVxfS4b0CsWyVRPgd3Auzi0NXOthIEUhtQmmA==", "dev": true, "requires": { "@csstools/selector-specificity": "^2.0.2", @@ -15876,7 +15948,7 @@ "micromatch": "^4.0.5", "normalize-path": "^3.0.0", "picocolors": "^1.0.0", - "postcss": "^8.4.16", + "postcss": "^8.4.17", "postcss-media-query-parser": "^0.2.3", "postcss-resolve-nested-selector": "^0.1.1", "postcss-safe-parser": "^6.0.0", @@ -15915,9 +15987,9 @@ "requires": {} }, "stylelint-config-standard": { - "version": "28.0.0", - "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-28.0.0.tgz", - "integrity": "sha512-q/StuowDdDmFCravzGHAwgS9pjX0bdOQUEBBDIkIWsQuYGgYz/xsO8CM6eepmIQ1fc5bKdDVimlJZ6MoOUcJ5Q==", + "version": "29.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-29.0.0.tgz", + "integrity": "sha512-uy8tZLbfq6ZrXy4JKu3W+7lYLgRQBxYTUUB88vPgQ+ZzAxdrvcaSUW9hOMNLYBnwH+9Kkj19M2DHdZ4gKwI7tg==", "dev": true, "requires": { "stylelint-config-recommended": "^9.0.0" @@ -15963,18 +16035,17 @@ "dev": true }, "svgo": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", - "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.0.0.tgz", + "integrity": "sha512-mSqPn6RDeNqJvCeqHERlfWJjd4crP/2PgFelil9WpTwC4D3okAUopPsH3lnEyl7ONXfDVyISOihDjO0uK8YVAA==", "dev": true, "requires": { "@trysound/sax": "0.2.0", "commander": "^7.2.0", - "css-select": "^4.1.3", - "css-tree": "^1.1.3", - "csso": "^4.2.0", - "picocolors": "^1.0.0", - "stable": "^0.1.8" + "css-select": "^5.1.0", + "css-tree": "^2.2.1", + "csso": "^5.0.5", + "picocolors": "^1.0.0" }, "dependencies": { "commander": { @@ -15986,9 +16057,9 @@ } }, "swagger-ui-dist": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-4.14.2.tgz", - "integrity": "sha512-kOIU7Ts3TrXDLb3/c9jRe4qGp8O3bRT19FFJA8wJfrRFkcK/4atPn3krhtBVJ57ZkNNofworXHxuYwmaisXBdg==" + "version": "4.15.0", + "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-4.15.0.tgz", + "integrity": "sha512-vAsIdNHraLuBRm1vrxcMaLk/y/PGBTvHLf4lQGQ3LaEXkORtIxw11sBMpYJL3keOLaFJ1OqNXuURd6eShoFLZQ==" }, "symbol-tree": { "version": "3.2.4", @@ -16029,15 +16100,6 @@ "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - }, - "source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } } } }, @@ -16070,16 +16132,6 @@ "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "requires": {} }, - "jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - } - }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -16094,14 +16146,6 @@ "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" } - }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "requires": { - "has-flag": "^4.0.0" - } } } }, @@ -16112,9 +16156,9 @@ "dev": true }, "tinybench": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.3.0.tgz", - "integrity": "sha512-zs1gMVBwyyG2QbVchYIbnabRhMOCGvrwZz/q+SV+LIMa9q5YDQZi2kkI6ZRqV2Bz7ba1uvrc7ieUoE4KWnGeKg==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.3.1.tgz", + "integrity": "sha512-hGYWYBMPr7p4g5IarQE7XhlyWveh1EKhy4wUBS1LrHXCKYgvz+4/jCqgmJqZxxldesn05vccrtME2RLLZNW7iA==", "dev": true }, "tinypool": { @@ -16211,12 +16255,6 @@ "requires": { "minimist": "^1.2.0" } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true } } }, @@ -16296,9 +16334,9 @@ } }, "updates": { - "version": "13.1.8", - "resolved": "https://registry.npmjs.org/updates/-/updates-13.1.8.tgz", - "integrity": "sha512-hcDCkif1i4MWArx1QkJjLHyPCr8taYyzoypQ7ST/vbmNJyH/cpiawQf+5frvH5uekiSSwtuQNWKdFWB3UH4sew==", + "version": "13.1.10", + "resolved": "https://registry.npmjs.org/updates/-/updates-13.1.10.tgz", + "integrity": "sha512-YSt1ncMoBXAQZndhLwiywvEGHXmA4424SlAf2HMUDuf8qE9Tlqj0s6IANb388HrjkybdZJkaadLSg/hkigwnuQ==", "dev": true }, "uri-js": { @@ -16386,9 +16424,9 @@ } }, "vitest": { - "version": "0.24.1", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.24.1.tgz", - "integrity": "sha512-NKkK1xnDIOOr42pKBfGQQl6b6IWdFVBpG6ZS1T+nUlJuqcOiZ7lxjVwHy9wrtTYpJ0BWww9y6bSGYXubD29Nag==", + "version": "0.24.3", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.24.3.tgz", + "integrity": "sha512-aM0auuPPgMSstWvr851hB74g/LKaKBzSxcG3da7ejfZbx08Y21JpZmbmDYrMTCGhVZKqTGwzcnLMwyfz2WzkhQ==", "dev": true, "requires": { "@types/chai": "^4.3.3", @@ -16415,15 +16453,15 @@ } }, "vue": { - "version": "3.2.40", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.40.tgz", - "integrity": "sha512-1mGHulzUbl2Nk3pfvI5aXYYyJUs1nm4kyvuz38u4xlQkLUn1i2R7nDbI4TufECmY8v1qNBHYy62bCaM+3cHP2A==", + "version": "3.2.41", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.41.tgz", + "integrity": "sha512-uuuvnrDXEeZ9VUPljgHkqB5IaVO8SxhPpqF2eWOukVrBnRBx2THPSGQBnVRt0GrIG1gvCmFXMGbd7FqcT1ixNQ==", "requires": { - "@vue/compiler-dom": "3.2.40", - "@vue/compiler-sfc": "3.2.40", - "@vue/runtime-dom": "3.2.40", - "@vue/server-renderer": "3.2.40", - "@vue/shared": "3.2.40" + "@vue/compiler-dom": "3.2.41", + "@vue/compiler-sfc": "3.2.41", + "@vue/runtime-dom": "3.2.41", + "@vue/server-renderer": "3.2.41", + "@vue/shared": "3.2.41" } }, "vue-bar-graph": { @@ -16762,9 +16800,9 @@ "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==" }, "ansi-styles": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.1.1.tgz", - "integrity": "sha512-qDOv24WjnYuL+wbwHdlsYZFy+cgPtrYw0Tn7GLORicQp9BkQLzrgI3Pm4VyR9ERZ41YTn7KlMPuL1n05WdZvmg==" + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==" }, "emoji-regex": { "version": "9.2.2", diff --git a/package.json b/package.json index cd83d399a0..035f3fd0b0 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "@claviska/jquery-minicolors": "2.3.6", "@mcaptcha/vanilla-glue": "0.1.0-alpha-3", "@primer/octicons": "17.7.0", - "@vue/compiler-sfc": "3.2.40", + "@vue/compiler-sfc": "3.2.41", "add-asset-webpack-plugin": "2.0.1", "css-loader": "6.7.1", "dropzone": "6.0.0-beta.2", @@ -21,21 +21,21 @@ "font-awesome": "4.7.0", "jquery": "3.6.1", "jquery.are-you-sure": "1.9.0", - "katex": "0.16.2", + "katex": "0.16.3", "less": "4.1.3", "less-loader": "11.1.0", "license-checker-webpack-plugin": "0.2.1", "mermaid": "9.1.7", "mini-css-extract-plugin": "2.6.1", - "monaco-editor": "0.34.0", + "monaco-editor": "0.34.1", "monaco-editor-webpack-plugin": "7.0.1", "pretty-ms": "8.0.0", "sortablejs": "1.15.0", - "swagger-ui-dist": "4.14.2", + "swagger-ui-dist": "4.15.0", "tippy.js": "6.3.7", "tributejs": "5.1.3", "uint8-to-base64": "0.2.0", - "vue": "3.2.40", + "vue": "3.2.41", "vue-bar-graph": "2.0.0", "vue-loader": "17.0.0", "vue3-calendar-heatmap": "2.0.0", @@ -47,23 +47,23 @@ "wrap-ansi": "8.0.1" }, "devDependencies": { - "@playwright/test": "1.27.0", - "@rollup/pluginutils": "5.0.1", + "@playwright/test": "1.27.1", + "@rollup/pluginutils": "5.0.2", "@stoplight/spectral-cli": "6.5.1", - "eslint": "8.25.0", + "eslint": "8.26.0", "eslint-plugin-import": "2.26.0", "eslint-plugin-jquery": "1.5.1", - "eslint-plugin-sonarjs": "0.15.0", + "eslint-plugin-sonarjs": "0.16.0", "eslint-plugin-unicorn": "44.0.2", "eslint-plugin-vue": "9.6.0", "jsdom": "20.0.1", "markdownlint-cli": "0.32.2", "postcss-less": "6.0.0", - "stylelint": "14.13.0", - "stylelint-config-standard": "28.0.0", - "svgo": "2.8.0", - "updates": "13.1.8", - "vitest": "0.24.1" + "stylelint": "14.14.0", + "stylelint-config-standard": "29.0.0", + "svgo": "3.0.0", + "updates": "13.1.10", + "vitest": "0.24.3" }, "browserslist": [ "defaults", diff --git a/public/img/svg/gitea-codebase.svg b/public/img/svg/gitea-codebase.svg index 2438230db2..cb95323a00 100644 --- a/public/img/svg/gitea-codebase.svg +++ b/public/img/svg/gitea-codebase.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/img/svg/gitea-composer.svg b/public/img/svg/gitea-composer.svg index 1285b1bf91..6647813b76 100644 --- a/public/img/svg/gitea-composer.svg +++ b/public/img/svg/gitea-composer.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/img/svg/gitea-conan.svg b/public/img/svg/gitea-conan.svg index d7d5ad5f18..55e27f9a44 100644 --- a/public/img/svg/gitea-conan.svg +++ b/public/img/svg/gitea-conan.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/img/svg/gitea-gitea.svg b/public/img/svg/gitea-gitea.svg index 39bf40ecb7..b989d10ed2 100644 --- a/public/img/svg/gitea-gitea.svg +++ b/public/img/svg/gitea-gitea.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/img/svg/gitea-gogs.svg b/public/img/svg/gitea-gogs.svg index 887147dd14..7c2a02a05b 100644 --- a/public/img/svg/gitea-gogs.svg +++ b/public/img/svg/gitea-gogs.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/img/svg/gitea-helm.svg b/public/img/svg/gitea-helm.svg index 5ab50dd29e..1e16850e38 100644 --- a/public/img/svg/gitea-helm.svg +++ b/public/img/svg/gitea-helm.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/img/svg/gitea-lock-cog.svg b/public/img/svg/gitea-lock-cog.svg index 0b10e86766..e2b90a2677 100644 --- a/public/img/svg/gitea-lock-cog.svg +++ b/public/img/svg/gitea-lock-cog.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/img/svg/gitea-maven.svg b/public/img/svg/gitea-maven.svg index e83e728276..6c1e0bc23d 100644 --- a/public/img/svg/gitea-maven.svg +++ b/public/img/svg/gitea-maven.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/img/svg/gitea-npm.svg b/public/img/svg/gitea-npm.svg index 4435e092f2..e11a4fcf59 100644 --- a/public/img/svg/gitea-npm.svg +++ b/public/img/svg/gitea-npm.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/img/svg/gitea-nuget.svg b/public/img/svg/gitea-nuget.svg index a5e38de3f6..a835cebc96 100644 --- a/public/img/svg/gitea-nuget.svg +++ b/public/img/svg/gitea-nuget.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/img/svg/gitea-pub.svg b/public/img/svg/gitea-pub.svg index 4a750c7082..0b326973e2 100644 --- a/public/img/svg/gitea-pub.svg +++ b/public/img/svg/gitea-pub.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/img/svg/gitea-python.svg b/public/img/svg/gitea-python.svg index 07548897e6..62ec452aeb 100644 --- a/public/img/svg/gitea-python.svg +++ b/public/img/svg/gitea-python.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/img/svg/gitea-rubygems.svg b/public/img/svg/gitea-rubygems.svg index 5f54dce48d..0747f8585c 100644 --- a/public/img/svg/gitea-rubygems.svg +++ b/public/img/svg/gitea-rubygems.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/routers/api/packages/api.go b/routers/api/packages/api.go index f6ab961f5e..6f53bc4ae0 100644 --- a/routers/api/packages/api.go +++ b/routers/api/packages/api.go @@ -58,6 +58,7 @@ func Routes(ctx gocontext.Context) *web.Route { authGroup := auth.NewGroup(authMethods...) r.Use(func(ctx *context.Context) { ctx.Doer = authGroup.Verify(ctx.Req, ctx.Resp, ctx, ctx.Session) + ctx.IsSigned = ctx.Doer != nil }) r.Group("/{username}", func() { @@ -215,6 +216,7 @@ func Routes(ctx gocontext.Context) *web.Route { r.Get("", npm.DownloadPackageFile) r.Delete("/-rev/{revision}", reqPackageAccess(perm.AccessModeWrite), npm.DeletePackageVersion) }) + r.Get("/-/{filename}", npm.DownloadPackageFileByName) r.Group("/-rev/{revision}", func() { r.Delete("", npm.DeletePackage) r.Put("", npm.DeletePreview) @@ -227,6 +229,7 @@ func Routes(ctx gocontext.Context) *web.Route { r.Get("", npm.DownloadPackageFile) r.Delete("/-rev/{revision}", reqPackageAccess(perm.AccessModeWrite), npm.DeletePackageVersion) }) + r.Get("/-/{filename}", npm.DownloadPackageFileByName) r.Group("/-rev/{revision}", func() { r.Delete("", npm.DeletePackage) r.Put("", npm.DeletePreview) @@ -314,6 +317,7 @@ func ContainerRoutes(ctx gocontext.Context) *web.Route { authGroup := auth.NewGroup(authMethods...) r.Use(func(ctx *context.Context) { ctx.Doer = authGroup.Verify(ctx.Req, ctx.Resp, ctx, ctx.Session) + ctx.IsSigned = ctx.Doer != nil }) r.Get("", container.ReqContainerAccess, container.DetermineSupport) diff --git a/routers/api/packages/npm/npm.go b/routers/api/packages/npm/npm.go index 2989ce6e7f..82dae0cf43 100644 --- a/routers/api/packages/npm/npm.go +++ b/routers/api/packages/npm/npm.go @@ -106,6 +106,49 @@ func DownloadPackageFile(ctx *context.Context) { ctx.ServeContent(pf.Name, s, pf.CreatedUnix.AsLocalTime()) } +// DownloadPackageFileByName finds the version and serves the contents of a package +func DownloadPackageFileByName(ctx *context.Context) { + filename := ctx.Params("filename") + + pvs, _, err := packages_model.SearchVersions(ctx, &packages_model.PackageSearchOptions{ + OwnerID: ctx.Package.Owner.ID, + Type: packages_model.TypeNpm, + Name: packages_model.SearchValue{ + ExactMatch: true, + Value: packageNameFromParams(ctx), + }, + HasFileWithName: filename, + IsInternal: util.OptionalBoolFalse, + }) + if err != nil { + apiError(ctx, http.StatusInternalServerError, err) + return + } + if len(pvs) != 1 { + apiError(ctx, http.StatusNotFound, nil) + return + } + + s, pf, err := packages_service.GetFileStreamByPackageVersion( + ctx, + pvs[0], + &packages_service.PackageFileInfo{ + Filename: filename, + }, + ) + if err != nil { + if err == packages_model.ErrPackageFileNotExist { + apiError(ctx, http.StatusNotFound, err) + return + } + apiError(ctx, http.StatusInternalServerError, err) + return + } + defer s.Close() + + ctx.ServeContent(pf.Name, s, pf.CreatedUnix.AsLocalTime()) +} + // UploadPackage creates a new package func UploadPackage(ctx *context.Context) { npmPackage, err := npm_module.ParsePackage(ctx.Req.Body) diff --git a/routers/api/v1/activitypub/reqsignature.go b/routers/api/v1/activitypub/reqsignature.go index 5c0776602b..649cb488b3 100644 --- a/routers/api/v1/activitypub/reqsignature.go +++ b/routers/api/v1/activitypub/reqsignature.go @@ -26,7 +26,7 @@ func getPublicKeyFromResponse(b []byte, keyID *url.URL) (p crypto.PublicKey, err person := ap.PersonNew(ap.IRI(keyID.String())) err = person.UnmarshalJSON(b) if err != nil { - err = fmt.Errorf("ActivityStreams type cannot be converted to one known to have publicKey property: %v", err) + err = fmt.Errorf("ActivityStreams type cannot be converted to one known to have publicKey property: %w", err) return } pubKey := person.PublicKey diff --git a/routers/api/v1/misc/signing.go b/routers/api/v1/misc/signing.go index b99e560ccf..1070cc78cb 100644 --- a/routers/api/v1/misc/signing.go +++ b/routers/api/v1/misc/signing.go @@ -59,6 +59,6 @@ func SigningKey(ctx *context.APIContext) { } _, err = ctx.Write([]byte(content)) if err != nil { - ctx.Error(http.StatusInternalServerError, "gpg export", fmt.Errorf("Error writing key content %v", err)) + ctx.Error(http.StatusInternalServerError, "gpg export", fmt.Errorf("Error writing key content %w", err)) } } diff --git a/routers/api/v1/repo/key.go b/routers/api/v1/repo/key.go index 0c780eb97d..14f6aa6148 100644 --- a/routers/api/v1/repo/key.go +++ b/routers/api/v1/repo/key.go @@ -174,7 +174,7 @@ func HandleCheckKeyStringError(ctx *context.APIContext, err error) { } else if asymkey_model.IsErrKeyUnableVerify(err) { ctx.Error(http.StatusUnprocessableEntity, "", "Unable to verify key content") } else { - ctx.Error(http.StatusUnprocessableEntity, "", fmt.Errorf("Invalid key content: %v", err)) + ctx.Error(http.StatusUnprocessableEntity, "", fmt.Errorf("Invalid key content: %w", err)) } } diff --git a/routers/api/v1/repo/pull.go b/routers/api/v1/repo/pull.go index f6507dceba..ebb9c0f261 100644 --- a/routers/api/v1/repo/pull.go +++ b/routers/api/v1/repo/pull.go @@ -1443,7 +1443,11 @@ func GetPullRequestFiles(ctx *context.APIContext) { end = totalNumberOfFiles } - apiFiles := make([]*api.ChangedFile, 0, end-start) + lenFiles := end - start + if lenFiles < 0 { + lenFiles = 0 + } + apiFiles := make([]*api.ChangedFile, 0, lenFiles) for i := start; i < end; i++ { apiFiles = append(apiFiles, convert.ToChangedFile(diff.Files[i], pr.HeadRepo, endCommitID)) } diff --git a/routers/api/v1/repo/status.go b/routers/api/v1/repo/status.go index 10e78f2a9b..97ef69a6ea 100644 --- a/routers/api/v1/repo/status.go +++ b/routers/api/v1/repo/status.go @@ -194,7 +194,7 @@ func getCommitStatuses(ctx *context.APIContext, sha string) { State: ctx.FormTrim("state"), }) if err != nil { - ctx.Error(http.StatusInternalServerError, "GetCommitStatuses", fmt.Errorf("GetCommitStatuses[%s, %s, %d]: %v", repo.FullName(), sha, ctx.FormInt("page"), err)) + ctx.Error(http.StatusInternalServerError, "GetCommitStatuses", fmt.Errorf("GetCommitStatuses[%s, %s, %d]: %w", repo.FullName(), sha, ctx.FormInt("page"), err)) return } @@ -255,7 +255,7 @@ func GetCombinedCommitStatusByRef(ctx *context.APIContext) { statuses, count, err := git_model.GetLatestCommitStatus(ctx, repo.ID, sha, utils.GetListOptions(ctx)) if err != nil { - ctx.Error(http.StatusInternalServerError, "GetLatestCommitStatus", fmt.Errorf("GetLatestCommitStatus[%s, %s]: %v", repo.FullName(), sha, err)) + ctx.Error(http.StatusInternalServerError, "GetLatestCommitStatus", fmt.Errorf("GetLatestCommitStatus[%s, %s]: %w", repo.FullName(), sha, err)) return } diff --git a/routers/api/v1/repo/tag.go b/routers/api/v1/repo/tag.go index f0f8503996..ab31866162 100644 --- a/routers/api/v1/repo/tag.go +++ b/routers/api/v1/repo/tag.go @@ -190,7 +190,7 @@ func CreateTag(ctx *context.APIContext) { commit, err := ctx.Repo.GitRepo.GetCommit(form.Target) if err != nil { - ctx.Error(http.StatusNotFound, "target not found", fmt.Errorf("target not found: %v", err)) + ctx.Error(http.StatusNotFound, "target not found", fmt.Errorf("target not found: %w", err)) return } diff --git a/routers/init.go b/routers/init.go index 9045437f87..53b33f468f 100644 --- a/routers/init.go +++ b/routers/init.go @@ -76,21 +76,31 @@ func InitGitServices() { mustInit(repo_service.Init) } -func syncAppPathForGit(ctx context.Context) error { +func syncAppConfForGit(ctx context.Context) error { runtimeState := new(system.RuntimeState) if err := system.AppState.Get(runtimeState); err != nil { return err } + + updated := false if runtimeState.LastAppPath != setting.AppPath { log.Info("AppPath changed from '%s' to '%s'", runtimeState.LastAppPath, setting.AppPath) + runtimeState.LastAppPath = setting.AppPath + updated = true + } + if runtimeState.LastCustomConf != setting.CustomConf { + log.Info("CustomConf changed from '%s' to '%s'", runtimeState.LastCustomConf, setting.CustomConf) + runtimeState.LastCustomConf = setting.CustomConf + updated = true + } + if updated { log.Info("re-sync repository hooks ...") mustInitCtx(ctx, repo_service.SyncRepositoryHooks) log.Info("re-write ssh public keys ...") mustInit(asymkey_model.RewriteAllPublicKeys) - runtimeState.LastAppPath = setting.AppPath return system.AppState.Set(runtimeState) } return nil @@ -153,7 +163,7 @@ func GlobalInitInstalled(ctx context.Context) { mustInit(repo_migrations.Init) eventsource.GetManager().Init() - mustInitCtx(ctx, syncAppPathForGit) + mustInitCtx(ctx, syncAppConfForGit) mustInit(ssh.Init) diff --git a/routers/web/auth/auth.go b/routers/web/auth/auth.go index b48bdb9951..25d70d7c47 100644 --- a/routers/web/auth/auth.go +++ b/routers/web/auth/auth.go @@ -70,7 +70,7 @@ func AutoSignIn(ctx *context.Context) (bool, error) { u, err := user_model.GetUserByName(ctx, uname) if err != nil { if !user_model.IsErrUserNotExist(err) { - return false, fmt.Errorf("GetUserByName: %v", err) + return false, fmt.Errorf("GetUserByName: %w", err) } return false, nil } diff --git a/routers/web/auth/oauth.go b/routers/web/auth/oauth.go index 9c929d990e..4fba8d8e8c 100644 --- a/routers/web/auth/oauth.go +++ b/routers/web/auth/oauth.go @@ -303,7 +303,7 @@ func InfoOAuth(ctx *context.Context) { func getOAuthGroupsForUser(user *user_model.User) ([]string, error) { orgs, err := org_model.GetUserOrgsList(user) if err != nil { - return nil, fmt.Errorf("GetUserOrgList: %v", err) + return nil, fmt.Errorf("GetUserOrgList: %w", err) } var groups []string @@ -311,7 +311,7 @@ func getOAuthGroupsForUser(user *user_model.User) ([]string, error) { groups = append(groups, org.Name) teams, err := org.LoadTeams() if err != nil { - return nil, fmt.Errorf("LoadTeams: %v", err) + return nil, fmt.Errorf("LoadTeams: %w", err) } for _, team := range teams { if team.IsMember(user.ID) { diff --git a/routers/web/feed/convert.go b/routers/web/feed/convert.go index 645d9370d5..306ecf7d6a 100644 --- a/routers/web/feed/convert.go +++ b/routers/web/feed/convert.go @@ -241,7 +241,7 @@ func feedActionsToFeedItems(ctx *context.Context, actions activities_model.Actio Name: act.ActUser.DisplayName(), Email: act.ActUser.GetEmail(), }, - Id: strconv.FormatInt(act.ID, 10), + Id: fmt.Sprintf("%v: %v", strconv.FormatInt(act.ID, 10), link.Href), Created: act.CreatedUnix.AsTime(), Content: content, }) diff --git a/routers/web/repo/lfs.go b/routers/web/repo/lfs.go index 41639c4603..67cb6837a5 100644 --- a/routers/web/repo/lfs.go +++ b/routers/web/repo/lfs.go @@ -122,14 +122,14 @@ func LFSLocks(ctx *context.Context) { Shared: true, }); err != nil { log.Error("Failed to clone repository: %s (%v)", ctx.Repo.Repository.FullName(), err) - ctx.ServerError("LFSLocks", fmt.Errorf("failed to clone repository: %s (%v)", ctx.Repo.Repository.FullName(), err)) + ctx.ServerError("LFSLocks", fmt.Errorf("failed to clone repository: %s (%w)", ctx.Repo.Repository.FullName(), err)) return } gitRepo, err := git.OpenRepository(ctx, tmpBasePath) if err != nil { log.Error("Unable to open temporary repository: %s (%v)", tmpBasePath, err) - ctx.ServerError("LFSLocks", fmt.Errorf("failed to open new temporary repository in: %s %v", tmpBasePath, err)) + ctx.ServerError("LFSLocks", fmt.Errorf("failed to open new temporary repository in: %s %w", tmpBasePath, err)) return } defer gitRepo.Close() @@ -142,7 +142,7 @@ func LFSLocks(ctx *context.Context) { if err := gitRepo.ReadTreeToIndex(ctx.Repo.Repository.DefaultBranch); err != nil { log.Error("Unable to read the default branch to the index: %s (%v)", ctx.Repo.Repository.DefaultBranch, err) - ctx.ServerError("LFSLocks", fmt.Errorf("unable to read the default branch to the index: %s (%v)", ctx.Repo.Repository.DefaultBranch, err)) + ctx.ServerError("LFSLocks", fmt.Errorf("unable to read the default branch to the index: %s (%w)", ctx.Repo.Repository.DefaultBranch, err)) return } @@ -542,7 +542,7 @@ func LFSAutoAssociate(ctx *context.Context) { metas[i] = &git_model.LFSMetaObject{} metas[i].Size, err = strconv.ParseInt(oid[idx+1:], 10, 64) if err != nil { - ctx.ServerError("LFSAutoAssociate", fmt.Errorf("illegal oid input: %s %v", oid, err)) + ctx.ServerError("LFSAutoAssociate", fmt.Errorf("illegal oid input: %s %w", oid, err)) return } metas[i].Oid = oid[:idx] diff --git a/routers/web/repo/release.go b/routers/web/repo/release.go index 1e5710fa98..0cb85f3798 100644 --- a/routers/web/repo/release.go +++ b/routers/web/repo/release.go @@ -46,11 +46,11 @@ func calReleaseNumCommitsBehind(repoCtx *context.Repository, release *repo_model if repoCtx.GitRepo.IsBranchExist(release.Target) { commit, err := repoCtx.GitRepo.GetBranchCommit(release.Target) if err != nil { - return fmt.Errorf("GetBranchCommit: %v", err) + return fmt.Errorf("GetBranchCommit: %w", err) } countCache[release.Target], err = commit.CommitsCount() if err != nil { - return fmt.Errorf("CommitsCount: %v", err) + return fmt.Errorf("CommitsCount: %w", err) } } else { // Use NumCommits of the newest release on that target diff --git a/routers/web/repo/repo.go b/routers/web/repo/repo.go index 974f03f951..3e746d3f05 100644 --- a/routers/web/repo/repo.go +++ b/routers/web/repo/repo.go @@ -90,7 +90,7 @@ func checkContextUser(ctx *context.Context, uid int64) *user_model.User { } if err != nil { - ctx.ServerError("GetUserByID", fmt.Errorf("[%d]: %v", uid, err)) + ctx.ServerError("GetUserByID", fmt.Errorf("[%d]: %w", uid, err)) return nil } diff --git a/routers/web/repo/setting.go b/routers/web/repo/setting.go index e7abec0d3e..2b5691ce88 100644 --- a/routers/web/repo/setting.go +++ b/routers/web/repo/setting.go @@ -1197,7 +1197,7 @@ func UpdateAvatarSetting(ctx *context.Context, form forms.AvatarForm) error { r, err := form.Avatar.Open() if err != nil { - return fmt.Errorf("Avatar.Open: %v", err) + return fmt.Errorf("Avatar.Open: %w", err) } defer r.Close() @@ -1207,14 +1207,14 @@ func UpdateAvatarSetting(ctx *context.Context, form forms.AvatarForm) error { data, err := io.ReadAll(r) if err != nil { - return fmt.Errorf("io.ReadAll: %v", err) + return fmt.Errorf("io.ReadAll: %w", err) } st := typesniffer.DetectContentType(data) if !(st.IsImage() && !st.IsSvgImage()) { return errors.New(ctx.Tr("settings.uploaded_avatar_not_a_image")) } if err = repo_service.UploadAvatar(ctxRepo, data); err != nil { - return fmt.Errorf("UploadAvatar: %v", err) + return fmt.Errorf("UploadAvatar: %w", err) } return nil } diff --git a/routers/web/user/home.go b/routers/web/user/home.go index 837caedc84..95ec1aa2fa 100644 --- a/routers/web/user/home.go +++ b/routers/web/user/home.go @@ -697,11 +697,11 @@ func issueIDsFromSearch(ctx *context.Context, ctxUser *user_model.User, keyword searchRepoIDs, err := issues_model.GetRepoIDsForIssuesOptions(opts, ctxUser) if err != nil { - return nil, fmt.Errorf("GetRepoIDsForIssuesOptions: %v", err) + return nil, fmt.Errorf("GetRepoIDsForIssuesOptions: %w", err) } issueIDsFromSearch, err := issue_indexer.SearchIssuesByKeyword(ctx, searchRepoIDs, keyword) if err != nil { - return nil, fmt.Errorf("SearchIssuesByKeyword: %v", err) + return nil, fmt.Errorf("SearchIssuesByKeyword: %w", err) } return issueIDsFromSearch, nil diff --git a/routers/web/user/setting/profile.go b/routers/web/user/setting/profile.go index c9a7afe982..ba3f5b5080 100644 --- a/routers/web/user/setting/profile.go +++ b/routers/web/user/setting/profile.go @@ -162,7 +162,7 @@ func UpdateAvatarSetting(ctx *context.Context, form *forms.AvatarForm, ctxUser * if form.Avatar != nil && form.Avatar.Filename != "" { fr, err := form.Avatar.Open() if err != nil { - return fmt.Errorf("Avatar.Open: %v", err) + return fmt.Errorf("Avatar.Open: %w", err) } defer fr.Close() @@ -172,7 +172,7 @@ func UpdateAvatarSetting(ctx *context.Context, form *forms.AvatarForm, ctxUser * data, err := io.ReadAll(fr) if err != nil { - return fmt.Errorf("io.ReadAll: %v", err) + return fmt.Errorf("io.ReadAll: %w", err) } st := typesniffer.DetectContentType(data) @@ -180,7 +180,7 @@ func UpdateAvatarSetting(ctx *context.Context, form *forms.AvatarForm, ctxUser * return errors.New(ctx.Tr("settings.uploaded_avatar_not_a_image")) } if err = user_service.UploadAvatar(ctxUser, data); err != nil { - return fmt.Errorf("UploadAvatar: %v", err) + return fmt.Errorf("UploadAvatar: %w", err) } } else if ctxUser.UseCustomAvatar && ctxUser.Avatar == "" { // No avatar is uploaded but setting has been changed to enable, @@ -191,7 +191,7 @@ func UpdateAvatarSetting(ctx *context.Context, form *forms.AvatarForm, ctxUser * } if err := user_model.UpdateUserCols(ctx, ctxUser, "avatar", "avatar_email", "use_custom_avatar"); err != nil { - return fmt.Errorf("UpdateUser: %v", err) + return fmt.Errorf("UpdateUser: %w", err) } return nil diff --git a/routers/web/web.go b/routers/web/web.go index 9b814c3f54..0b16e756e1 100644 --- a/routers/web/web.go +++ b/routers/web/web.go @@ -296,12 +296,19 @@ func RegisterRoutes(m *web.Route) { } } + sitemapEnabled := func(ctx *context.Context) { + if !setting.EnableSitemap { + ctx.Error(http.StatusNotFound) + return + } + } + // FIXME: not all routes need go through same middleware. // Especially some AJAX requests, we can reduce middleware number to improve performance. // Routers. // for health check m.Get("/", Home) - m.Get("/sitemap.xml", ignExploreSignIn, HomeSitemap) + m.Get("/sitemap.xml", sitemapEnabled, ignExploreSignIn, HomeSitemap) m.Group("/.well-known", func() { m.Get("/openid-configuration", auth.OIDCWellKnown) m.Group("", func() { @@ -318,9 +325,9 @@ func RegisterRoutes(m *web.Route) { ctx.Redirect(setting.AppSubURL + "/explore/repos") }) m.Get("/repos", explore.Repos) - m.Get("/repos/sitemap-{idx}.xml", explore.Repos) + m.Get("/repos/sitemap-{idx}.xml", sitemapEnabled, explore.Repos) m.Get("/users", explore.Users) - m.Get("/users/sitemap-{idx}.xml", explore.Users) + m.Get("/users/sitemap-{idx}.xml", sitemapEnabled, explore.Users) m.Get("/organizations", explore.Organizations) m.Get("/code", explore.Code) m.Get("/topics/search", explore.TopicSearch) diff --git a/services/agit/agit.go b/services/agit/agit.go index cea2b1f580..a7e701d6c4 100644 --- a/services/agit/agit.go +++ b/services/agit/agit.go @@ -99,7 +99,7 @@ func ProcReceive(ctx context.Context, repo *repo_model.Repository, gitRepo *git. pr, err := issues_model.GetUnmergedPullRequest(repo.ID, repo.ID, headBranch, baseBranchName, issues_model.PullRequestFlowAGit) if err != nil { if !issues_model.IsErrPullRequestNotExist(err) { - return nil, fmt.Errorf("Failed to get unmerged agit flow pull request in repository: %s/%s Error: %v", ownerName, repoName, err) + return nil, fmt.Errorf("Failed to get unmerged agit flow pull request in repository: %s/%s Error: %w", ownerName, repoName, err) } // create a new pull request @@ -109,7 +109,7 @@ func ProcReceive(ctx context.Context, repo *repo_model.Repository, gitRepo *git. if !has || len(title) == 0 { commit, err := gitRepo.GetCommit(opts.NewCommitIDs[i]) if err != nil { - return nil, fmt.Errorf("Failed to get commit %s in repository: %s/%s Error: %v", opts.NewCommitIDs[i], ownerName, repoName, err) + return nil, fmt.Errorf("Failed to get commit %s in repository: %s/%s Error: %w", opts.NewCommitIDs[i], ownerName, repoName, err) } title = strings.Split(commit.CommitMessage, "\n")[0] } @@ -118,7 +118,7 @@ func ProcReceive(ctx context.Context, repo *repo_model.Repository, gitRepo *git. pusher, err := user_model.GetUserByID(opts.UserID) if err != nil { - return nil, fmt.Errorf("Failed to get user. Error: %v", err) + return nil, fmt.Errorf("Failed to get user. Error: %w", err) } prIssue := &issues_model.Issue{ @@ -160,12 +160,12 @@ func ProcReceive(ctx context.Context, repo *repo_model.Repository, gitRepo *git. // update exist pull request if err := pr.LoadBaseRepoCtx(ctx); err != nil { - return nil, fmt.Errorf("Unable to load base repository for PR[%d] Error: %v", pr.ID, err) + return nil, fmt.Errorf("Unable to load base repository for PR[%d] Error: %w", pr.ID, err) } oldCommitID, err := gitRepo.GetRefCommitID(pr.GetGitRefName()) if err != nil { - return nil, fmt.Errorf("Unable to get ref commit id in base repository for PR[%d] Error: %v", pr.ID, err) + return nil, fmt.Errorf("Unable to get ref commit id in base repository for PR[%d] Error: %w", pr.ID, err) } if oldCommitID == opts.NewCommitIDs[i] { @@ -181,7 +181,7 @@ func ProcReceive(ctx context.Context, repo *repo_model.Repository, gitRepo *git. if !forcePush { output, _, err := git.NewCommand(ctx, "rev-list", "--max-count=1").AddDynamicArguments(oldCommitID, "^"+opts.NewCommitIDs[i]).RunStdString(&git.RunOpts{Dir: repo.RepoPath(), Env: os.Environ()}) if err != nil { - return nil, fmt.Errorf("Fail to detect force push: %v", err) + return nil, fmt.Errorf("Fail to detect force push: %w", err) } else if len(output) > 0 { results = append(results, private.HookProcReceiveRefResult{ OriginalRef: opts.RefFullNames[i], @@ -195,17 +195,17 @@ func ProcReceive(ctx context.Context, repo *repo_model.Repository, gitRepo *git. pr.HeadCommitID = opts.NewCommitIDs[i] if err = pull_service.UpdateRef(ctx, pr); err != nil { - return nil, fmt.Errorf("Failed to update pull ref. Error: %v", err) + return nil, fmt.Errorf("Failed to update pull ref. Error: %w", err) } pull_service.AddToTaskQueue(pr) pusher, err := user_model.GetUserByID(opts.UserID) if err != nil { - return nil, fmt.Errorf("Failed to get user. Error: %v", err) + return nil, fmt.Errorf("Failed to get user. Error: %w", err) } err = pr.LoadIssue() if err != nil { - return nil, fmt.Errorf("Failed to load pull issue. Error: %v", err) + return nil, fmt.Errorf("Failed to load pull issue. Error: %w", err) } comment, err := issues_model.CreatePushPullComment(ctx, pusher, pr, oldCommitID, opts.NewCommitIDs[i]) if err == nil && comment != nil { diff --git a/services/attachment/attachment.go b/services/attachment/attachment.go index cce36206a7..557cc808a3 100644 --- a/services/attachment/attachment.go +++ b/services/attachment/attachment.go @@ -29,7 +29,7 @@ func NewAttachment(attach *repo_model.Attachment, file io.Reader) (*repo_model.A attach.UUID = uuid.New().String() size, err := storage.Attachments.Save(attach.RelativePath(), file, -1) if err != nil { - return fmt.Errorf("Create: %v", err) + return fmt.Errorf("Create: %w", err) } attach.Size = size diff --git a/services/auth/source/ldap/source_search.go b/services/auth/source/ldap/source_search.go index a97a1179d9..6ea84ec288 100644 --- a/services/auth/source/ldap/source_search.go +++ b/services/auth/source/ldap/source_search.go @@ -125,13 +125,13 @@ func dial(source *Source) (*ldap.Conn, error) { conn, err := ldap.Dial("tcp", net.JoinHostPort(source.Host, strconv.Itoa(source.Port))) if err != nil { - return nil, fmt.Errorf("error during Dial: %v", err) + return nil, fmt.Errorf("error during Dial: %w", err) } if source.SecurityProtocol == SecurityProtocolStartTLS { if err = conn.StartTLS(tlsConfig); err != nil { conn.Close() - return nil, fmt.Errorf("error during StartTLS: %v", err) + return nil, fmt.Errorf("error during StartTLS: %w", err) } } diff --git a/services/auth/source/oauth2/jwtsigningkey.go b/services/auth/source/oauth2/jwtsigningkey.go index d9312ee820..352f932746 100644 --- a/services/auth/source/oauth2/jwtsigningkey.go +++ b/services/auth/source/oauth2/jwtsigningkey.go @@ -339,7 +339,7 @@ func InitSigningKey() error { } if err != nil { - return fmt.Errorf("Error while loading or creating JWT key: %v", err) + return fmt.Errorf("Error while loading or creating JWT key: %w", err) } signingKey, err := CreateJWTSigningKey(setting.OAuth2.JWTSigningAlgorithm, key) diff --git a/services/auth/source/smtp/auth.go b/services/auth/source/smtp/auth.go index a9e4b0e5f4..487c049722 100644 --- a/services/auth/source/smtp/auth.go +++ b/services/auth/source/smtp/auth.go @@ -95,7 +95,7 @@ func Authenticate(a smtp.Auth, source *Source) error { hasStartTLS, _ := client.Extension("STARTTLS") if !source.UseTLS() && hasStartTLS { if err = client.StartTLS(tlsConfig); err != nil { - return fmt.Errorf("failed to start StartTLS: %v", err) + return fmt.Errorf("failed to start StartTLS: %w", err) } } diff --git a/services/issue/milestone.go b/services/issue/milestone.go index d7c5fa4551..756a8625de 100644 --- a/services/issue/milestone.go +++ b/services/issue/milestone.go @@ -19,7 +19,7 @@ func changeMilestoneAssign(ctx context.Context, doer *user_model.User, issue *is if issue.MilestoneID > 0 { has, err := issues_model.HasMilestoneByRepoID(ctx, issue.RepoID, issue.MilestoneID) if err != nil { - return fmt.Errorf("HasMilestoneByRepoID: %v", err) + return fmt.Errorf("HasMilestoneByRepoID: %w", err) } if !has { return fmt.Errorf("HasMilestoneByRepoID: issue doesn't exist") @@ -76,7 +76,7 @@ func ChangeMilestoneAssign(issue *issues_model.Issue, doer *user_model.User, old } if err = committer.Commit(); err != nil { - return fmt.Errorf("Commit: %v", err) + return fmt.Errorf("Commit: %w", err) } notification.NotifyIssueChangeMilestone(doer, issue, oldMilestoneID) diff --git a/services/mailer/mail_issue.go b/services/mailer/mail_issue.go index 15bfa4af41..33a20694e8 100644 --- a/services/mailer/mail_issue.go +++ b/services/mailer/mail_issue.go @@ -44,13 +44,13 @@ const ( func mailIssueCommentToParticipants(ctx *mailCommentContext, mentions []*user_model.User) error { // Required by the mail composer; make sure to load these before calling the async function if err := ctx.Issue.LoadRepo(ctx); err != nil { - return fmt.Errorf("LoadRepo(): %v", err) + return fmt.Errorf("LoadRepo(): %w", err) } if err := ctx.Issue.LoadPoster(); err != nil { - return fmt.Errorf("LoadPoster(): %v", err) + return fmt.Errorf("LoadPoster(): %w", err) } if err := ctx.Issue.LoadPullRequest(); err != nil { - return fmt.Errorf("LoadPullRequest(): %v", err) + return fmt.Errorf("LoadPullRequest(): %w", err) } // Enough room to avoid reallocations @@ -62,21 +62,21 @@ func mailIssueCommentToParticipants(ctx *mailCommentContext, mentions []*user_mo // =========== Assignees =========== ids, err := issues_model.GetAssigneeIDsByIssue(ctx.Issue.ID) if err != nil { - return fmt.Errorf("GetAssigneeIDsByIssue(%d): %v", ctx.Issue.ID, err) + return fmt.Errorf("GetAssigneeIDsByIssue(%d): %w", ctx.Issue.ID, err) } unfiltered = append(unfiltered, ids...) // =========== Participants (i.e. commenters, reviewers) =========== ids, err = issues_model.GetParticipantsIDsByIssueID(ctx.Issue.ID) if err != nil { - return fmt.Errorf("GetParticipantsIDsByIssueID(%d): %v", ctx.Issue.ID, err) + return fmt.Errorf("GetParticipantsIDsByIssueID(%d): %w", ctx.Issue.ID, err) } unfiltered = append(unfiltered, ids...) // =========== Issue watchers =========== ids, err = issues_model.GetIssueWatchersIDs(ctx, ctx.Issue.ID, true) if err != nil { - return fmt.Errorf("GetIssueWatchersIDs(%d): %v", ctx.Issue.ID, err) + return fmt.Errorf("GetIssueWatchersIDs(%d): %w", ctx.Issue.ID, err) } unfiltered = append(unfiltered, ids...) @@ -85,7 +85,7 @@ func mailIssueCommentToParticipants(ctx *mailCommentContext, mentions []*user_mo if !(ctx.Issue.IsPull && ctx.Issue.PullRequest.IsWorkInProgress() && ctx.ActionType != activities_model.ActionCreatePullRequest) { ids, err = repo_model.GetRepoWatchersIDs(ctx, ctx.Issue.RepoID) if err != nil { - return fmt.Errorf("GetRepoWatchersIDs(%d): %v", ctx.Issue.RepoID, err) + return fmt.Errorf("GetRepoWatchersIDs(%d): %w", ctx.Issue.RepoID, err) } unfiltered = append(ids, unfiltered...) } @@ -99,13 +99,13 @@ func mailIssueCommentToParticipants(ctx *mailCommentContext, mentions []*user_mo // =========== Mentions =========== if err = mailIssueCommentBatch(ctx, mentions, visited, true); err != nil { - return fmt.Errorf("mailIssueCommentBatch() mentions: %v", err) + return fmt.Errorf("mailIssueCommentBatch() mentions: %w", err) } // Avoid mailing explicit unwatched ids, err = issues_model.GetIssueWatchersIDs(ctx, ctx.Issue.ID, false) if err != nil { - return fmt.Errorf("GetIssueWatchersIDs(%d): %v", ctx.Issue.ID, err) + return fmt.Errorf("GetIssueWatchersIDs(%d): %w", ctx.Issue.ID, err) } visited.AddMultiple(ids...) @@ -114,7 +114,7 @@ func mailIssueCommentToParticipants(ctx *mailCommentContext, mentions []*user_mo return err } if err = mailIssueCommentBatch(ctx, unfilteredUsers, visited, false); err != nil { - return fmt.Errorf("mailIssueCommentBatch(): %v", err) + return fmt.Errorf("mailIssueCommentBatch(): %w", err) } return nil diff --git a/services/mailer/mailer.go b/services/mailer/mailer.go index 1f43c7f827..46b0c8e2f4 100644 --- a/services/mailer/mailer.go +++ b/services/mailer/mailer.go @@ -161,7 +161,7 @@ func (s *smtpSender) Send(from string, to []string, msg io.WriterTo) error { conn, err := net.Dial(network, address) if err != nil { - return fmt.Errorf("failed to establish network connection to SMTP server: %v", err) + return fmt.Errorf("failed to establish network connection to SMTP server: %w", err) } defer conn.Close() @@ -175,7 +175,7 @@ func (s *smtpSender) Send(from string, to []string, msg io.WriterTo) error { if opts.UseClientCert { cert, err := tls.LoadX509KeyPair(opts.ClientCertFile, opts.ClientKeyFile) if err != nil { - return fmt.Errorf("could not load SMTP client certificate: %v", err) + return fmt.Errorf("could not load SMTP client certificate: %w", err) } tlsconfig.Certificates = []tls.Certificate{cert} } @@ -191,7 +191,7 @@ func (s *smtpSender) Send(from string, to []string, msg io.WriterTo) error { } client, err := smtp.NewClient(conn, host) if err != nil { - return fmt.Errorf("could not initiate SMTP session: %v", err) + return fmt.Errorf("could not initiate SMTP session: %w", err) } if opts.EnableHelo { @@ -199,12 +199,12 @@ func (s *smtpSender) Send(from string, to []string, msg io.WriterTo) error { if len(hostname) == 0 { hostname, err = os.Hostname() if err != nil { - return fmt.Errorf("could not retrieve system hostname: %v", err) + return fmt.Errorf("could not retrieve system hostname: %w", err) } } if err = client.Hello(hostname); err != nil { - return fmt.Errorf("failed to issue HELO command: %v", err) + return fmt.Errorf("failed to issue HELO command: %w", err) } } @@ -212,7 +212,7 @@ func (s *smtpSender) Send(from string, to []string, msg io.WriterTo) error { hasStartTLS, _ := client.Extension("STARTTLS") if hasStartTLS { if err = client.StartTLS(tlsconfig); err != nil { - return fmt.Errorf("failed to start TLS connection: %v", err) + return fmt.Errorf("failed to start TLS connection: %w", err) } } else { log.Warn("StartTLS requested, but SMTP server does not support it; falling back to regular SMTP") @@ -238,34 +238,34 @@ func (s *smtpSender) Send(from string, to []string, msg io.WriterTo) error { if auth != nil { if err = client.Auth(auth); err != nil { - return fmt.Errorf("failed to authenticate SMTP: %v", err) + return fmt.Errorf("failed to authenticate SMTP: %w", err) } } } if opts.OverrideEnvelopeFrom { if err = client.Mail(opts.EnvelopeFrom); err != nil { - return fmt.Errorf("failed to issue MAIL command: %v", err) + return fmt.Errorf("failed to issue MAIL command: %w", err) } } else { if err = client.Mail(from); err != nil { - return fmt.Errorf("failed to issue MAIL command: %v", err) + return fmt.Errorf("failed to issue MAIL command: %w", err) } } for _, rec := range to { if err = client.Rcpt(rec); err != nil { - return fmt.Errorf("failed to issue RCPT command: %v", err) + return fmt.Errorf("failed to issue RCPT command: %w", err) } } w, err := client.Data() if err != nil { - return fmt.Errorf("failed to issue DATA command: %v", err) + return fmt.Errorf("failed to issue DATA command: %w", err) } else if _, err = msg.WriteTo(w); err != nil { - return fmt.Errorf("SMTP write failed: %v", err) + return fmt.Errorf("SMTP write failed: %w", err) } else if err = w.Close(); err != nil { - return fmt.Errorf("SMTP close failed: %v", err) + return fmt.Errorf("SMTP close failed: %w", err) } return client.Quit() diff --git a/services/migrations/dump.go b/services/migrations/dump.go index 31fb1b4cf3..4ab4539c89 100644 --- a/services/migrations/dump.go +++ b/services/migrations/dump.go @@ -157,7 +157,7 @@ func (g *RepositoryDumper) CreateRepo(repo *base.Repository, opts base.MigrateOp SkipTLSVerify: setting.Migrations.SkipTLSVerify, }) if err != nil { - return fmt.Errorf("Clone: %v", err) + return fmt.Errorf("Clone: %w", err) } if err := git.WriteCommitGraph(g.ctx, repoPath); err != nil { return err @@ -168,7 +168,7 @@ func (g *RepositoryDumper) CreateRepo(repo *base.Repository, opts base.MigrateOp wikiRemotePath := repository.WikiRemoteURL(g.ctx, remoteAddr) if len(wikiRemotePath) > 0 { if err := os.MkdirAll(wikiPath, os.ModePerm); err != nil { - return fmt.Errorf("Failed to remove %s: %v", wikiPath, err) + return fmt.Errorf("Failed to remove %s: %w", wikiPath, err) } if err := git.Clone(g.ctx, wikiRemotePath, wikiPath, git.CloneRepoOptions{ @@ -180,7 +180,7 @@ func (g *RepositoryDumper) CreateRepo(repo *base.Repository, opts base.MigrateOp }); err != nil { log.Warn("Clone wiki: %v", err) if err := os.RemoveAll(wikiPath); err != nil { - return fmt.Errorf("Failed to remove %s: %v", wikiPath, err) + return fmt.Errorf("Failed to remove %s: %w", wikiPath, err) } } else if err := git.WriteCommitGraph(g.ctx, wikiPath); err != nil { return err diff --git a/services/migrations/gitea_downloader.go b/services/migrations/gitea_downloader.go index c52f302691..9775af1cdc 100644 --- a/services/migrations/gitea_downloader.go +++ b/services/migrations/gitea_downloader.go @@ -408,7 +408,7 @@ func (g *GiteaDownloader) GetIssues(page, perPage int) ([]*base.Issue, bool, err Type: gitea_sdk.IssueTypeIssue, }) if err != nil { - return nil, false, fmt.Errorf("error while listing issues: %v", err) + return nil, false, fmt.Errorf("error while listing issues: %w", err) } for _, issue := range issues { @@ -476,7 +476,7 @@ func (g *GiteaDownloader) GetComments(commentable base.Commentable) ([]*base.Com Page: i, }}) if err != nil { - return nil, false, fmt.Errorf("error while listing comments for issue #%d. Error: %v", commentable.GetForeignIndex(), err) + return nil, false, fmt.Errorf("error while listing comments for issue #%d. Error: %w", commentable.GetForeignIndex(), err) } for _, comment := range comments { @@ -520,7 +520,7 @@ func (g *GiteaDownloader) GetPullRequests(page, perPage int) ([]*base.PullReques State: gitea_sdk.StateAll, }) if err != nil { - return nil, false, fmt.Errorf("error while listing pull requests (page: %d, pagesize: %d). Error: %v", page, perPage, err) + return nil, false, fmt.Errorf("error while listing pull requests (page: %d, pagesize: %d). Error: %w", page, perPage, err) } for _, pr := range prs { var milestone string diff --git a/services/migrations/gitea_uploader.go b/services/migrations/gitea_uploader.go index c4cb59f572..8a7533b3d1 100644 --- a/services/migrations/gitea_uploader.go +++ b/services/migrations/gitea_uploader.go @@ -288,12 +288,12 @@ func (g *GiteaLocalUploader) CreateReleases(releases ...*base.Release) error { commit, err := g.gitRepo.GetTagCommit(rel.TagName) if !git.IsErrNotExist(err) { if err != nil { - return fmt.Errorf("GetTagCommit[%v]: %v", rel.TagName, err) + return fmt.Errorf("GetTagCommit[%v]: %w", rel.TagName, err) } rel.Sha1 = commit.ID.String() rel.NumCommits, err = commit.CommitsCount() if err != nil { - return fmt.Errorf("CommitsCount: %v", err) + return fmt.Errorf("CommitsCount: %w", err) } } } diff --git a/services/migrations/github.go b/services/migrations/github.go index 0ffdbb042a..016d058865 100644 --- a/services/migrations/github.go +++ b/services/migrations/github.go @@ -427,7 +427,7 @@ func (g *GithubDownloaderV3) GetIssues(page, perPage int) ([]*base.Issue, bool, g.waitAndPickClient() issues, resp, err := g.getClient().Issues.ListByRepo(g.ctx, g.repoOwner, g.repoName, opt) if err != nil { - return nil, false, fmt.Errorf("error while listing repos: %v", err) + return nil, false, fmt.Errorf("error while listing repos: %w", err) } log.Trace("Request get issues %d/%d, but in fact get %d", perPage, page, len(issues)) g.setRate(&resp.Rate) @@ -523,7 +523,7 @@ func (g *GithubDownloaderV3) getComments(commentable base.Commentable) ([]*base. g.waitAndPickClient() comments, resp, err := g.getClient().Issues.ListComments(g.ctx, g.repoOwner, g.repoName, int(commentable.GetForeignIndex()), opt) if err != nil { - return nil, fmt.Errorf("error while listing repos: %v", err) + return nil, fmt.Errorf("error while listing repos: %w", err) } g.setRate(&resp.Rate) for _, comment := range comments { @@ -595,7 +595,7 @@ func (g *GithubDownloaderV3) GetAllComments(page, perPage int) ([]*base.Comment, g.waitAndPickClient() comments, resp, err := g.getClient().Issues.ListComments(g.ctx, g.repoOwner, g.repoName, 0, opt) if err != nil { - return nil, false, fmt.Errorf("error while listing repos: %v", err) + return nil, false, fmt.Errorf("error while listing repos: %w", err) } isEnd := resp.NextPage == 0 @@ -663,7 +663,7 @@ func (g *GithubDownloaderV3) GetPullRequests(page, perPage int) ([]*base.PullReq g.waitAndPickClient() prs, resp, err := g.getClient().PullRequests.List(g.ctx, g.repoOwner, g.repoName, opt) if err != nil { - return nil, false, fmt.Errorf("error while listing repos: %v", err) + return nil, false, fmt.Errorf("error while listing repos: %w", err) } log.Trace("Request get pull requests %d/%d, but in fact get %d", perPage, page, len(prs)) g.setRate(&resp.Rate) @@ -813,7 +813,7 @@ func (g *GithubDownloaderV3) GetReviews(reviewable base.Reviewable) ([]*base.Rev g.waitAndPickClient() reviews, resp, err := g.getClient().PullRequests.ListReviews(g.ctx, g.repoOwner, g.repoName, int(reviewable.GetForeignIndex()), opt) if err != nil { - return nil, fmt.Errorf("error while listing repos: %v", err) + return nil, fmt.Errorf("error while listing repos: %w", err) } g.setRate(&resp.Rate) for _, review := range reviews { @@ -827,7 +827,7 @@ func (g *GithubDownloaderV3) GetReviews(reviewable base.Reviewable) ([]*base.Rev g.waitAndPickClient() reviewComments, resp, err := g.getClient().PullRequests.ListReviewComments(g.ctx, g.repoOwner, g.repoName, int(reviewable.GetForeignIndex()), review.GetID(), opt2) if err != nil { - return nil, fmt.Errorf("error while listing repos: %v", err) + return nil, fmt.Errorf("error while listing repos: %w", err) } g.setRate(&resp.Rate) @@ -853,7 +853,7 @@ func (g *GithubDownloaderV3) GetReviews(reviewable base.Reviewable) ([]*base.Rev g.waitAndPickClient() reviewers, resp, err := g.getClient().PullRequests.ListReviewers(g.ctx, g.repoOwner, g.repoName, int(reviewable.GetForeignIndex()), opt) if err != nil { - return nil, fmt.Errorf("error while listing repos: %v", err) + return nil, fmt.Errorf("error while listing repos: %w", err) } g.setRate(&resp.Rate) for _, user := range reviewers.Users { diff --git a/services/migrations/gitlab.go b/services/migrations/gitlab.go index 95bec59e83..b8bb0c77b5 100644 --- a/services/migrations/gitlab.go +++ b/services/migrations/gitlab.go @@ -398,7 +398,7 @@ func (g *GitlabDownloader) GetIssues(page, perPage int) ([]*base.Issue, bool, er issues, _, err := g.client.Issues.ListProjectIssues(g.repoID, opt, nil, gitlab.WithContext(g.ctx)) if err != nil { - return nil, false, fmt.Errorf("error while listing issues: %v", err) + return nil, false, fmt.Errorf("error while listing issues: %w", err) } for _, issue := range issues { @@ -419,7 +419,7 @@ func (g *GitlabDownloader) GetIssues(page, perPage int) ([]*base.Issue, bool, er for { awards, _, err := g.client.AwardEmoji.ListIssueAwardEmoji(g.repoID, issue.IID, &gitlab.ListAwardEmojiOptions{Page: awardPage, PerPage: perPage}, gitlab.WithContext(g.ctx)) if err != nil { - return nil, false, fmt.Errorf("error while listing issue awards: %v", err) + return nil, false, fmt.Errorf("error while listing issue awards: %w", err) } for i := range awards { @@ -487,7 +487,7 @@ func (g *GitlabDownloader) GetComments(commentable base.Commentable) ([]*base.Co } if err != nil { - return nil, false, fmt.Errorf("error while listing comments: %v %v", g.repoID, err) + return nil, false, fmt.Errorf("error while listing comments: %v %w", g.repoID, err) } for _, comment := range comments { // Flatten comment threads @@ -541,7 +541,7 @@ func (g *GitlabDownloader) GetPullRequests(page, perPage int) ([]*base.PullReque prs, _, err := g.client.MergeRequests.ListProjectMergeRequests(g.repoID, opt, nil, gitlab.WithContext(g.ctx)) if err != nil { - return nil, false, fmt.Errorf("error while listing merge requests: %v", err) + return nil, false, fmt.Errorf("error while listing merge requests: %w", err) } for _, pr := range prs { @@ -583,7 +583,7 @@ func (g *GitlabDownloader) GetPullRequests(page, perPage int) ([]*base.PullReque for { awards, _, err := g.client.AwardEmoji.ListMergeRequestAwardEmoji(g.repoID, pr.IID, &gitlab.ListAwardEmojiOptions{Page: awardPage, PerPage: perPage}, gitlab.WithContext(g.ctx)) if err != nil { - return nil, false, fmt.Errorf("error while listing merge requests awards: %v", err) + return nil, false, fmt.Errorf("error while listing merge requests awards: %w", err) } for i := range awards { diff --git a/services/migrations/gogs.go b/services/migrations/gogs.go index 46cc3ca416..14bc734c4e 100644 --- a/services/migrations/gogs.go +++ b/services/migrations/gogs.go @@ -223,7 +223,7 @@ func (g *GogsDownloader) getIssues(page int, state string) ([]*base.Issue, bool, State: state, }) if err != nil { - return nil, false, fmt.Errorf("error while listing repos: %v", err) + return nil, false, fmt.Errorf("error while listing repos: %w", err) } for _, issue := range issues { @@ -242,7 +242,7 @@ func (g *GogsDownloader) GetComments(commentable base.Commentable) ([]*base.Comm comments, err := g.client.ListIssueComments(g.repoOwner, g.repoName, commentable.GetForeignIndex()) if err != nil { - return nil, false, fmt.Errorf("error while listing repos: %v", err) + return nil, false, fmt.Errorf("error while listing repos: %w", err) } for _, comment := range comments { if len(comment.Body) == 0 || comment.Poster == nil { diff --git a/services/org/org.go b/services/org/org.go index b24b7e34c4..39845610d2 100644 --- a/services/org/org.go +++ b/services/org/org.go @@ -28,20 +28,20 @@ func DeleteOrganization(org *organization.Organization) error { // Check ownership of repository. count, err := repo_model.CountRepositories(ctx, repo_model.CountRepositoryOptions{OwnerID: org.ID}) if err != nil { - return fmt.Errorf("GetRepositoryCount: %v", err) + return fmt.Errorf("GetRepositoryCount: %w", err) } else if count > 0 { return models.ErrUserOwnRepos{UID: org.ID} } // Check ownership of packages. if ownsPackages, err := packages_model.HasOwnerPackages(ctx, org.ID); err != nil { - return fmt.Errorf("HasOwnerPackages: %v", err) + return fmt.Errorf("HasOwnerPackages: %w", err) } else if ownsPackages { return models.ErrUserOwnPackages{UID: org.ID} } if err := organization.DeleteOrganization(ctx, org); err != nil { - return fmt.Errorf("DeleteOrganization: %v", err) + return fmt.Errorf("DeleteOrganization: %w", err) } if err := commiter.Commit(); err != nil { @@ -54,13 +54,13 @@ func DeleteOrganization(org *organization.Organization) error { path := user_model.UserPath(org.Name) if err := util.RemoveAll(path); err != nil { - return fmt.Errorf("Failed to RemoveAll %s: %v", path, err) + return fmt.Errorf("Failed to RemoveAll %s: %w", path, err) } if len(org.Avatar) > 0 { avatarPath := org.CustomAvatarRelativePath() if err := storage.Avatars.Delete(avatarPath); err != nil { - return fmt.Errorf("Failed to remove %s: %v", avatarPath, err) + return fmt.Errorf("Failed to remove %s: %w", avatarPath, err) } } diff --git a/services/pull/check.go b/services/pull/check.go index 765672190d..830ff640b5 100644 --- a/services/pull/check.go +++ b/services/pull/check.go @@ -168,13 +168,13 @@ func getMergeCommit(ctx context.Context, pr *issues_model.PullRequest) (*git.Com var err error pr.BaseRepo, err = repo_model.GetRepositoryByID(pr.BaseRepoID) if err != nil { - return nil, fmt.Errorf("GetRepositoryByID: %v", err) + return nil, fmt.Errorf("GetRepositoryByID: %w", err) } } indexTmpPath, err := os.MkdirTemp(os.TempDir(), "gitea-"+pr.BaseRepo.Name) if err != nil { - return nil, fmt.Errorf("Failed to create temp dir for repository %s: %v", pr.BaseRepo.RepoPath(), err) + return nil, fmt.Errorf("Failed to create temp dir for repository %s: %w", pr.BaseRepo.RepoPath(), err) } defer func() { if err := util.RemoveAll(indexTmpPath); err != nil { @@ -192,12 +192,12 @@ func getMergeCommit(ctx context.Context, pr *issues_model.PullRequest) (*git.Com if strings.Contains(err.Error(), "exit status 1") { return nil, nil } - return nil, fmt.Errorf("git merge-base --is-ancestor: %v", err) + return nil, fmt.Errorf("git merge-base --is-ancestor: %w", err) } commitIDBytes, err := os.ReadFile(pr.BaseRepo.RepoPath() + "/" + headFile) if err != nil { - return nil, fmt.Errorf("ReadFile(%s): %v", headFile, err) + return nil, fmt.Errorf("ReadFile(%s): %w", headFile, err) } commitID := string(commitIDBytes) if len(commitID) < 40 { @@ -209,7 +209,7 @@ func getMergeCommit(ctx context.Context, pr *issues_model.PullRequest) (*git.Com mergeCommit, _, err := git.NewCommand(ctx, "rev-list", "--ancestry-path", "--merges", "--reverse").AddDynamicArguments(cmd). RunStdString(&git.RunOpts{Dir: "", Env: []string{"GIT_INDEX_FILE=" + indexTmpPath, "GIT_DIR=" + pr.BaseRepo.RepoPath()}}) if err != nil { - return nil, fmt.Errorf("git rev-list --ancestry-path --merges --reverse: %v", err) + return nil, fmt.Errorf("git rev-list --ancestry-path --merges --reverse: %w", err) } else if len(mergeCommit) < 40 { // PR was maybe fast-forwarded, so just use last commit of PR mergeCommit = commitID[:40] @@ -217,13 +217,13 @@ func getMergeCommit(ctx context.Context, pr *issues_model.PullRequest) (*git.Com gitRepo, err := git.OpenRepository(ctx, pr.BaseRepo.RepoPath()) if err != nil { - return nil, fmt.Errorf("OpenRepository: %v", err) + return nil, fmt.Errorf("OpenRepository: %w", err) } defer gitRepo.Close() commit, err := gitRepo.GetCommit(mergeCommit[:40]) if err != nil { - return nil, fmt.Errorf("GetMergeCommit[%v]: %v", mergeCommit[:40], err) + return nil, fmt.Errorf("GetMergeCommit[%v]: %w", mergeCommit[:40], err) } return commit, nil diff --git a/services/pull/merge.go b/services/pull/merge.go index f9a4e6705f..0ca3730183 100644 --- a/services/pull/merge.go +++ b/services/pull/merge.go @@ -136,10 +136,10 @@ func GetDefaultMergeMessage(baseGitRepo *git.Repository, pr *issues_model.PullRe func Merge(ctx context.Context, pr *issues_model.PullRequest, doer *user_model.User, baseGitRepo *git.Repository, mergeStyle repo_model.MergeStyle, expectedHeadCommitID, message string) error { if err := pr.LoadHeadRepo(); err != nil { log.Error("LoadHeadRepo: %v", err) - return fmt.Errorf("LoadHeadRepo: %v", err) + return fmt.Errorf("LoadHeadRepo: %w", err) } else if err := pr.LoadBaseRepo(); err != nil { log.Error("LoadBaseRepo: %v", err) - return fmt.Errorf("LoadBaseRepo: %v", err) + return fmt.Errorf("LoadBaseRepo: %w", err) } pullWorkingPool.CheckIn(fmt.Sprint(pr.ID)) @@ -247,7 +247,7 @@ func rawMerge(ctx context.Context, pr *issues_model.PullRequest, doer *user_mode trackingCommitID, _, err := git.NewCommand(ctx, "show-ref", "--hash").AddDynamicArguments(git.BranchPrefix + trackingBranch).RunStdString(&git.RunOpts{Dir: tmpBasePath}) if err != nil { log.Error("show-ref[%s] --hash refs/heads/trackingn: %v", tmpBasePath, git.BranchPrefix+trackingBranch, err) - return "", fmt.Errorf("getDiffTree: %v", err) + return "", fmt.Errorf("getDiffTree: %w", err) } if strings.TrimSpace(trackingCommitID) != expectedHeadCommitID { return "", models.ErrSHADoesNotMatch{ @@ -263,19 +263,19 @@ func rawMerge(ctx context.Context, pr *issues_model.PullRequest, doer *user_mode sparseCheckoutList, err := getDiffTree(ctx, tmpBasePath, baseBranch, trackingBranch) if err != nil { log.Error("getDiffTree(%s, %s, %s): %v", tmpBasePath, baseBranch, trackingBranch, err) - return "", fmt.Errorf("getDiffTree: %v", err) + return "", fmt.Errorf("getDiffTree: %w", err) } infoPath := filepath.Join(tmpBasePath, ".git", "info") if err := os.MkdirAll(infoPath, 0o700); err != nil { log.Error("Unable to create .git/info in %s: %v", tmpBasePath, err) - return "", fmt.Errorf("Unable to create .git/info in tmpBasePath: %v", err) + return "", fmt.Errorf("Unable to create .git/info in tmpBasePath: %w", err) } sparseCheckoutListPath := filepath.Join(infoPath, "sparse-checkout") if err := os.WriteFile(sparseCheckoutListPath, []byte(sparseCheckoutList), 0o600); err != nil { log.Error("Unable to write .git/info/sparse-checkout file in %s: %v", tmpBasePath, err) - return "", fmt.Errorf("Unable to write .git/info/sparse-checkout file in tmpBasePath: %v", err) + return "", fmt.Errorf("Unable to write .git/info/sparse-checkout file in tmpBasePath: %w", err) } gitConfigCommand := func() *git.Command { @@ -290,7 +290,7 @@ func rawMerge(ctx context.Context, pr *issues_model.PullRequest, doer *user_mode Stderr: &errbuf, }); err != nil { log.Error("git config [filter.lfs.process -> <> ]: %v\n%s\n%s", err, outbuf.String(), errbuf.String()) - return "", fmt.Errorf("git config [filter.lfs.process -> <> ]: %v\n%s\n%s", err, outbuf.String(), errbuf.String()) + return "", fmt.Errorf("git config [filter.lfs.process -> <> ]: %w\n%s\n%s", err, outbuf.String(), errbuf.String()) } outbuf.Reset() errbuf.Reset() @@ -302,7 +302,7 @@ func rawMerge(ctx context.Context, pr *issues_model.PullRequest, doer *user_mode Stderr: &errbuf, }); err != nil { log.Error("git config [filter.lfs.required -> ]: %v\n%s\n%s", err, outbuf.String(), errbuf.String()) - return "", fmt.Errorf("git config [filter.lfs.required -> ]: %v\n%s\n%s", err, outbuf.String(), errbuf.String()) + return "", fmt.Errorf("git config [filter.lfs.required -> ]: %w\n%s\n%s", err, outbuf.String(), errbuf.String()) } outbuf.Reset() errbuf.Reset() @@ -314,7 +314,7 @@ func rawMerge(ctx context.Context, pr *issues_model.PullRequest, doer *user_mode Stderr: &errbuf, }); err != nil { log.Error("git config [filter.lfs.clean -> <> ]: %v\n%s\n%s", err, outbuf.String(), errbuf.String()) - return "", fmt.Errorf("git config [filter.lfs.clean -> <> ]: %v\n%s\n%s", err, outbuf.String(), errbuf.String()) + return "", fmt.Errorf("git config [filter.lfs.clean -> <> ]: %w\n%s\n%s", err, outbuf.String(), errbuf.String()) } outbuf.Reset() errbuf.Reset() @@ -326,7 +326,7 @@ func rawMerge(ctx context.Context, pr *issues_model.PullRequest, doer *user_mode Stderr: &errbuf, }); err != nil { log.Error("git config [filter.lfs.smudge -> <> ]: %v\n%s\n%s", err, outbuf.String(), errbuf.String()) - return "", fmt.Errorf("git config [filter.lfs.smudge -> <> ]: %v\n%s\n%s", err, outbuf.String(), errbuf.String()) + return "", fmt.Errorf("git config [filter.lfs.smudge -> <> ]: %w\n%s\n%s", err, outbuf.String(), errbuf.String()) } outbuf.Reset() errbuf.Reset() @@ -338,7 +338,7 @@ func rawMerge(ctx context.Context, pr *issues_model.PullRequest, doer *user_mode Stderr: &errbuf, }); err != nil { log.Error("git config [core.sparseCheckout -> true ]: %v\n%s\n%s", err, outbuf.String(), errbuf.String()) - return "", fmt.Errorf("git config [core.sparsecheckout -> true]: %v\n%s\n%s", err, outbuf.String(), errbuf.String()) + return "", fmt.Errorf("git config [core.sparsecheckout -> true]: %w\n%s\n%s", err, outbuf.String(), errbuf.String()) } outbuf.Reset() errbuf.Reset() @@ -351,7 +351,7 @@ func rawMerge(ctx context.Context, pr *issues_model.PullRequest, doer *user_mode Stderr: &errbuf, }); err != nil { log.Error("git read-tree HEAD: %v\n%s\n%s", err, outbuf.String(), errbuf.String()) - return "", fmt.Errorf("Unable to read base branch in to the index: %v\n%s\n%s", err, outbuf.String(), errbuf.String()) + return "", fmt.Errorf("Unable to read base branch in to the index: %w\n%s\n%s", err, outbuf.String(), errbuf.String()) } outbuf.Reset() errbuf.Reset() @@ -409,7 +409,7 @@ func rawMerge(ctx context.Context, pr *issues_model.PullRequest, doer *user_mode Stderr: &errbuf, }); err != nil { log.Error("git checkout base prior to merge post staging rebase [%s:%s -> %s:%s]: %v\n%s\n%s", pr.HeadRepo.FullName(), pr.HeadBranch, pr.BaseRepo.FullName(), pr.BaseBranch, err, outbuf.String(), errbuf.String()) - return "", fmt.Errorf("git checkout base prior to merge post staging rebase [%s:%s -> %s:%s]: %v\n%s\n%s", pr.HeadRepo.FullName(), pr.HeadBranch, pr.BaseRepo.FullName(), pr.BaseBranch, err, outbuf.String(), errbuf.String()) + return "", fmt.Errorf("git checkout base prior to merge post staging rebase [%s:%s -> %s:%s]: %w\n%s\n%s", pr.HeadRepo.FullName(), pr.HeadBranch, pr.BaseRepo.FullName(), pr.BaseBranch, err, outbuf.String(), errbuf.String()) } outbuf.Reset() errbuf.Reset() @@ -435,7 +435,7 @@ func rawMerge(ctx context.Context, pr *issues_model.PullRequest, doer *user_mode if readErr != nil { // Abandon this attempt to handle the error log.Error("git rebase staging on to base [%s:%s -> %s:%s]: %v\n%s\n%s", pr.HeadRepo.FullName(), pr.HeadBranch, pr.BaseRepo.FullName(), pr.BaseBranch, err, outbuf.String(), errbuf.String()) - return "", fmt.Errorf("git rebase staging on to base [%s:%s -> %s:%s]: %v\n%s\n%s", pr.HeadRepo.FullName(), pr.HeadBranch, pr.BaseRepo.FullName(), pr.BaseBranch, err, outbuf.String(), errbuf.String()) + return "", fmt.Errorf("git rebase staging on to base [%s:%s -> %s:%s]: %w\n%s\n%s", pr.HeadRepo.FullName(), pr.HeadBranch, pr.BaseRepo.FullName(), pr.BaseBranch, err, outbuf.String(), errbuf.String()) } commitSha = strings.TrimSpace(string(commitShaBytes)) ok = true @@ -445,7 +445,7 @@ func rawMerge(ctx context.Context, pr *issues_model.PullRequest, doer *user_mode if !ok { log.Error("Unable to determine failing commit sha for this rebase message. Cannot cast as models.ErrRebaseConflicts.") log.Error("git rebase staging on to base [%s:%s -> %s:%s]: %v\n%s\n%s", pr.HeadRepo.FullName(), pr.HeadBranch, pr.BaseRepo.FullName(), pr.BaseBranch, err, outbuf.String(), errbuf.String()) - return "", fmt.Errorf("git rebase staging on to base [%s:%s -> %s:%s]: %v\n%s\n%s", pr.HeadRepo.FullName(), pr.HeadBranch, pr.BaseRepo.FullName(), pr.BaseBranch, err, outbuf.String(), errbuf.String()) + return "", fmt.Errorf("git rebase staging on to base [%s:%s -> %s:%s]: %w\n%s\n%s", pr.HeadRepo.FullName(), pr.HeadBranch, pr.BaseRepo.FullName(), pr.BaseBranch, err, outbuf.String(), errbuf.String()) } log.Debug("RebaseConflict at %s [%s:%s -> %s:%s]: %v\n%s\n%s", commitSha, pr.HeadRepo.FullName(), pr.HeadBranch, pr.BaseRepo.FullName(), pr.BaseBranch, err, outbuf.String(), errbuf.String()) return "", models.ErrRebaseConflicts{ @@ -457,7 +457,7 @@ func rawMerge(ctx context.Context, pr *issues_model.PullRequest, doer *user_mode } } log.Error("git rebase staging on to base [%s:%s -> %s:%s]: %v\n%s\n%s", pr.HeadRepo.FullName(), pr.HeadBranch, pr.BaseRepo.FullName(), pr.BaseBranch, err, outbuf.String(), errbuf.String()) - return "", fmt.Errorf("git rebase staging on to base [%s:%s -> %s:%s]: %v\n%s\n%s", pr.HeadRepo.FullName(), pr.HeadBranch, pr.BaseRepo.FullName(), pr.BaseBranch, err, outbuf.String(), errbuf.String()) + return "", fmt.Errorf("git rebase staging on to base [%s:%s -> %s:%s]: %w\n%s\n%s", pr.HeadRepo.FullName(), pr.HeadBranch, pr.BaseRepo.FullName(), pr.BaseBranch, err, outbuf.String(), errbuf.String()) } outbuf.Reset() errbuf.Reset() @@ -475,7 +475,7 @@ func rawMerge(ctx context.Context, pr *issues_model.PullRequest, doer *user_mode Stderr: &errbuf, }); err != nil { log.Error("git checkout base prior to merge post staging rebase [%s:%s -> %s:%s]: %v\n%s\n%s", pr.HeadRepo.FullName(), pr.HeadBranch, pr.BaseRepo.FullName(), pr.BaseBranch, err, outbuf.String(), errbuf.String()) - return "", fmt.Errorf("git checkout base prior to merge post staging rebase [%s:%s -> %s:%s]: %v\n%s\n%s", pr.HeadRepo.FullName(), pr.HeadBranch, pr.BaseRepo.FullName(), pr.BaseBranch, err, outbuf.String(), errbuf.String()) + return "", fmt.Errorf("git checkout base prior to merge post staging rebase [%s:%s -> %s:%s]: %w\n%s\n%s", pr.HeadRepo.FullName(), pr.HeadBranch, pr.BaseRepo.FullName(), pr.BaseBranch, err, outbuf.String(), errbuf.String()) } outbuf.Reset() errbuf.Reset() @@ -509,7 +509,7 @@ func rawMerge(ctx context.Context, pr *issues_model.PullRequest, doer *user_mode if err = pr.Issue.LoadPoster(); err != nil { log.Error("LoadPoster: %v", err) - return "", fmt.Errorf("LoadPoster: %v", err) + return "", fmt.Errorf("LoadPoster: %w", err) } sig := pr.Issue.Poster.NewGitSig() if signArg == "" { @@ -521,7 +521,7 @@ func rawMerge(ctx context.Context, pr *issues_model.PullRequest, doer *user_mode Stderr: &errbuf, }); err != nil { log.Error("git commit [%s:%s -> %s:%s]: %v\n%s\n%s", pr.HeadRepo.FullName(), pr.HeadBranch, pr.BaseRepo.FullName(), pr.BaseBranch, err, outbuf.String(), errbuf.String()) - return "", fmt.Errorf("git commit [%s:%s -> %s:%s]: %v\n%s\n%s", pr.HeadRepo.FullName(), pr.HeadBranch, pr.BaseRepo.FullName(), pr.BaseBranch, err, outbuf.String(), errbuf.String()) + return "", fmt.Errorf("git commit [%s:%s -> %s:%s]: %w\n%s\n%s", pr.HeadRepo.FullName(), pr.HeadBranch, pr.BaseRepo.FullName(), pr.BaseBranch, err, outbuf.String(), errbuf.String()) } } else { if setting.Repository.PullRequest.AddCoCommitterTrailers && committer.String() != sig.String() { @@ -539,7 +539,7 @@ func rawMerge(ctx context.Context, pr *issues_model.PullRequest, doer *user_mode Stderr: &errbuf, }); err != nil { log.Error("git commit [%s:%s -> %s:%s]: %v\n%s\n%s", pr.HeadRepo.FullName(), pr.HeadBranch, pr.BaseRepo.FullName(), pr.BaseBranch, err, outbuf.String(), errbuf.String()) - return "", fmt.Errorf("git commit [%s:%s -> %s:%s]: %v\n%s\n%s", pr.HeadRepo.FullName(), pr.HeadBranch, pr.BaseRepo.FullName(), pr.BaseBranch, err, outbuf.String(), errbuf.String()) + return "", fmt.Errorf("git commit [%s:%s -> %s:%s]: %w\n%s\n%s", pr.HeadRepo.FullName(), pr.HeadBranch, pr.BaseRepo.FullName(), pr.BaseBranch, err, outbuf.String(), errbuf.String()) } } outbuf.Reset() @@ -551,15 +551,15 @@ func rawMerge(ctx context.Context, pr *issues_model.PullRequest, doer *user_mode // OK we should cache our current head and origin/headbranch mergeHeadSHA, err := git.GetFullCommitID(ctx, tmpBasePath, "HEAD") if err != nil { - return "", fmt.Errorf("Failed to get full commit id for HEAD: %v", err) + return "", fmt.Errorf("Failed to get full commit id for HEAD: %w", err) } mergeBaseSHA, err := git.GetFullCommitID(ctx, tmpBasePath, "original_"+baseBranch) if err != nil { - return "", fmt.Errorf("Failed to get full commit id for origin/%s: %v", pr.BaseBranch, err) + return "", fmt.Errorf("Failed to get full commit id for origin/%s: %w", pr.BaseBranch, err) } mergeCommitID, err := git.GetFullCommitID(ctx, tmpBasePath, baseBranch) if err != nil { - return "", fmt.Errorf("Failed to get full commit id for the new merge: %v", err) + return "", fmt.Errorf("Failed to get full commit id for the new merge: %w", err) } // Now it's questionable about where this should go - either after or before the push @@ -643,7 +643,7 @@ func commitAndSignNoAuthor(ctx context.Context, pr *issues_model.PullRequest, me Stderr: &errbuf, }); err != nil { log.Error("git commit [%s:%s -> %s:%s]: %v\n%s\n%s", pr.HeadRepo.FullName(), pr.HeadBranch, pr.BaseRepo.FullName(), pr.BaseBranch, err, outbuf.String(), errbuf.String()) - return fmt.Errorf("git commit [%s:%s -> %s:%s]: %v\n%s\n%s", pr.HeadRepo.FullName(), pr.HeadBranch, pr.BaseRepo.FullName(), pr.BaseBranch, err, outbuf.String(), errbuf.String()) + return fmt.Errorf("git commit [%s:%s -> %s:%s]: %w\n%s\n%s", pr.HeadRepo.FullName(), pr.HeadBranch, pr.BaseRepo.FullName(), pr.BaseBranch, err, outbuf.String(), errbuf.String()) } } else { if err := git.NewCommand(ctx, "commit").AddArguments(signArg).AddArguments("-m").AddDynamicArguments(message). @@ -654,7 +654,7 @@ func commitAndSignNoAuthor(ctx context.Context, pr *issues_model.PullRequest, me Stderr: &errbuf, }); err != nil { log.Error("git commit [%s:%s -> %s:%s]: %v\n%s\n%s", pr.HeadRepo.FullName(), pr.HeadBranch, pr.BaseRepo.FullName(), pr.BaseBranch, err, outbuf.String(), errbuf.String()) - return fmt.Errorf("git commit [%s:%s -> %s:%s]: %v\n%s\n%s", pr.HeadRepo.FullName(), pr.HeadBranch, pr.BaseRepo.FullName(), pr.BaseBranch, err, outbuf.String(), errbuf.String()) + return fmt.Errorf("git commit [%s:%s -> %s:%s]: %w\n%s\n%s", pr.HeadRepo.FullName(), pr.HeadBranch, pr.BaseRepo.FullName(), pr.BaseBranch, err, outbuf.String(), errbuf.String()) } } return nil @@ -687,7 +687,7 @@ func runMergeCommand(pr *issues_model.PullRequest, mergeStyle repo_model.MergeSt } } log.Error("git merge [%s:%s -> %s:%s]: %v\n%s\n%s", pr.HeadRepo.FullName(), pr.HeadBranch, pr.BaseRepo.FullName(), pr.BaseBranch, err, outbuf.String(), errbuf.String()) - return fmt.Errorf("git merge [%s:%s -> %s:%s]: %v\n%s\n%s", pr.HeadRepo.FullName(), pr.HeadBranch, pr.BaseRepo.FullName(), pr.BaseBranch, err, outbuf.String(), errbuf.String()) + return fmt.Errorf("git merge [%s:%s -> %s:%s]: %w\n%s\n%s", pr.HeadRepo.FullName(), pr.HeadBranch, pr.BaseRepo.FullName(), pr.BaseBranch, err, outbuf.String(), errbuf.String()) } return nil @@ -764,11 +764,11 @@ func IsUserAllowedToMerge(ctx context.Context, pr *issues_model.PullRequest, p a // CheckPullBranchProtections checks whether the PR is ready to be merged (reviews and status checks) func CheckPullBranchProtections(ctx context.Context, pr *issues_model.PullRequest, skipProtectedFilesCheck bool) (err error) { if err = pr.LoadBaseRepoCtx(ctx); err != nil { - return fmt.Errorf("LoadBaseRepo: %v", err) + return fmt.Errorf("LoadBaseRepo: %w", err) } if err = pr.LoadProtectedBranchCtx(ctx); err != nil { - return fmt.Errorf("LoadProtectedBranch: %v", err) + return fmt.Errorf("LoadProtectedBranch: %w", err) } if pr.ProtectedBranch == nil { return nil diff --git a/services/pull/patch.go b/services/pull/patch.go index b9f190826a..9b87ac22e2 100644 --- a/services/pull/patch.go +++ b/services/pull/patch.go @@ -37,13 +37,13 @@ func DownloadDiffOrPatch(ctx context.Context, pr *issues_model.PullRequest, w io gitRepo, closer, err := git.RepositoryFromContextOrOpen(ctx, pr.BaseRepo.RepoPath()) if err != nil { - return fmt.Errorf("OpenRepository: %v", err) + return fmt.Errorf("OpenRepository: %w", err) } defer closer.Close() if err := gitRepo.GetDiffOrPatch(pr.MergeBase, pr.GetGitRefName(), w, patch, binary); err != nil { log.Error("Unable to get patch file from %s to %s in %s Error: %v", pr.MergeBase, pr.HeadBranch, pr.BaseRepo.FullName(), err) - return fmt.Errorf("Unable to get patch file from %s to %s in %s Error: %v", pr.MergeBase, pr.HeadBranch, pr.BaseRepo.FullName(), err) + return fmt.Errorf("Unable to get patch file from %s to %s in %s Error: %w", pr.MergeBase, pr.HeadBranch, pr.BaseRepo.FullName(), err) } return nil } @@ -74,7 +74,7 @@ func TestPatch(pr *issues_model.PullRequest) error { gitRepo, err := git.OpenRepository(ctx, tmpBasePath) if err != nil { - return fmt.Errorf("OpenRepository: %v", err) + return fmt.Errorf("OpenRepository: %w", err) } defer gitRepo.Close() @@ -84,7 +84,7 @@ func TestPatch(pr *issues_model.PullRequest) error { var err2 error pr.MergeBase, err2 = gitRepo.GetRefCommitID(git.BranchPrefix + "base") if err2 != nil { - return fmt.Errorf("GetMergeBase: %v and can't find commit ID for base: %v", err, err2) + return fmt.Errorf("GetMergeBase: %v and can't find commit ID for base: %w", err, err2) } } pr.MergeBase = strings.TrimSpace(pr.MergeBase) @@ -104,7 +104,7 @@ func TestPatch(pr *issues_model.PullRequest) error { // 3. Check for protected files changes if err = checkPullFilesProtection(pr, gitRepo); err != nil { - return fmt.Errorf("pr.CheckPullFilesProtection(): %v", err) + return fmt.Errorf("pr.CheckPullFilesProtection(): %w", err) } if len(pr.ChangedProtectedFiles) > 0 { @@ -237,7 +237,7 @@ func AttemptThreeWayMerge(ctx context.Context, gitPath string, gitRepo *git.Repo // First we use read-tree to do a simple three-way merge if _, _, err := git.NewCommand(ctx, "read-tree", "-m").AddDynamicArguments(base, ours, theirs).RunStdString(&git.RunOpts{Dir: gitPath}); err != nil { log.Error("Unable to run read-tree -m! Error: %v", err) - return false, nil, fmt.Errorf("unable to run read-tree -m! Error: %v", err) + return false, nil, fmt.Errorf("unable to run read-tree -m! Error: %w", err) } // Then we use git ls-files -u to list the unmerged files and collate the triples in unmergedfiles @@ -319,7 +319,7 @@ func checkConflicts(ctx context.Context, pr *issues_model.PullRequest, gitRepo * tmpPatchFile, err := os.CreateTemp("", "patch") if err != nil { log.Error("Unable to create temporary patch file! Error: %v", err) - return false, fmt.Errorf("unable to create temporary patch file! Error: %v", err) + return false, fmt.Errorf("unable to create temporary patch file! Error: %w", err) } defer func() { _ = util.Remove(tmpPatchFile.Name()) @@ -328,12 +328,12 @@ func checkConflicts(ctx context.Context, pr *issues_model.PullRequest, gitRepo * if err := gitRepo.GetDiffBinary(pr.MergeBase, "tracking", tmpPatchFile); err != nil { tmpPatchFile.Close() log.Error("Unable to get patch file from %s to %s in %s Error: %v", pr.MergeBase, pr.HeadBranch, pr.BaseRepo.FullName(), err) - return false, fmt.Errorf("unable to get patch file from %s to %s in %s Error: %v", pr.MergeBase, pr.HeadBranch, pr.BaseRepo.FullName(), err) + return false, fmt.Errorf("unable to get patch file from %s to %s in %s Error: %w", pr.MergeBase, pr.HeadBranch, pr.BaseRepo.FullName(), err) } stat, err := tmpPatchFile.Stat() if err != nil { tmpPatchFile.Close() - return false, fmt.Errorf("unable to stat patch file: %v", err) + return false, fmt.Errorf("unable to stat patch file: %w", err) } patchPath := tmpPatchFile.Name() tmpPatchFile.Close() @@ -350,7 +350,7 @@ func checkConflicts(ctx context.Context, pr *issues_model.PullRequest, gitRepo * // 4. Read the base branch in to the index of the temporary repository _, _, err = git.NewCommand(gitRepo.Ctx, "read-tree", "base").RunStdString(&git.RunOpts{Dir: tmpBasePath}) if err != nil { - return false, fmt.Errorf("git read-tree %s: %v", pr.BaseBranch, err) + return false, fmt.Errorf("git read-tree %s: %w", pr.BaseBranch, err) } // 5. Now get the pull request configuration to check if we need to ignore whitespace @@ -383,7 +383,7 @@ func checkConflicts(ctx context.Context, pr *issues_model.PullRequest, gitRepo * stderrReader, stderrWriter, err := os.Pipe() if err != nil { log.Error("Unable to open stderr pipe: %v", err) - return false, fmt.Errorf("unable to open stderr pipe: %v", err) + return false, fmt.Errorf("unable to open stderr pipe: %w", err) } defer func() { _ = stderrReader.Close() @@ -467,7 +467,7 @@ func checkConflicts(ctx context.Context, pr *issues_model.PullRequest, gitRepo * return true, nil } } else if err != nil { - return false, fmt.Errorf("git apply --check: %v", err) + return false, fmt.Errorf("git apply --check: %w", err) } return false, nil } diff --git a/services/pull/patch_unmerged.go b/services/pull/patch_unmerged.go index 465465d0da..3f1bb7d523 100644 --- a/services/pull/patch_unmerged.go +++ b/services/pull/patch_unmerged.go @@ -64,7 +64,7 @@ func readUnmergedLsFileLines(ctx context.Context, tmpBasePath string, outputChan lsFilesReader, lsFilesWriter, err := os.Pipe() if err != nil { log.Error("Unable to open stderr pipe: %v", err) - outputChan <- &lsFileLine{err: fmt.Errorf("unable to open stderr pipe: %v", err)} + outputChan <- &lsFileLine{err: fmt.Errorf("unable to open stderr pipe: %w", err)} return } defer func() { @@ -117,7 +117,7 @@ func readUnmergedLsFileLines(ctx context.Context, tmpBasePath string, outputChan }, }) if err != nil { - outputChan <- &lsFileLine{err: fmt.Errorf("git ls-files -u -z: %v", git.ConcatenateError(err, stderr.String()))} + outputChan <- &lsFileLine{err: fmt.Errorf("git ls-files -u -z: %w", git.ConcatenateError(err, stderr.String()))} } } @@ -163,7 +163,7 @@ func unmergedFiles(ctx context.Context, tmpBasePath string, unmerged chan *unmer log.Trace("Got line: %v Current State:\n%v", line, next) if line.err != nil { log.Error("Unable to run ls-files -u -z! Error: %v", line.err) - unmerged <- &unmergedFile{err: fmt.Errorf("unable to run ls-files -u -z! Error: %v", line.err)} + unmerged <- &unmergedFile{err: fmt.Errorf("unable to run ls-files -u -z! Error: %w", line.err)} return } diff --git a/services/pull/pull.go b/services/pull/pull.go index 3b58c675a3..5f8bd6b671 100644 --- a/services/pull/pull.go +++ b/services/pull/pull.go @@ -224,7 +224,7 @@ func ChangeTargetBranch(ctx context.Context, pr *issues_model.PullRequest, doer NewRef: targetBranch, } if _, err = issues_model.CreateComment(options); err != nil { - return fmt.Errorf("CreateChangeTargetBranchComment: %v", err) + return fmt.Errorf("CreateChangeTargetBranchComment: %w", err) } return nil @@ -233,11 +233,11 @@ func ChangeTargetBranch(ctx context.Context, pr *issues_model.PullRequest, doer func checkForInvalidation(ctx context.Context, requests issues_model.PullRequestList, repoID int64, doer *user_model.User, branch string) error { repo, err := repo_model.GetRepositoryByID(repoID) if err != nil { - return fmt.Errorf("GetRepositoryByID: %v", err) + return fmt.Errorf("GetRepositoryByID: %w", err) } gitRepo, err := git.OpenRepository(ctx, repo.RepoPath()) if err != nil { - return fmt.Errorf("git.OpenRepository: %v", err) + return fmt.Errorf("git.OpenRepository: %w", err) } go func() { // FIXME: graceful: We need to tell the manager we're doing something... @@ -353,26 +353,26 @@ func AddTestPullRequestTask(doer *user_model.User, repoID int64, branch string, // A commit can be considered to leave the PR untouched if the patch/diff with its merge base is unchanged func checkIfPRContentChanged(ctx context.Context, pr *issues_model.PullRequest, oldCommitID, newCommitID string) (hasChanged bool, err error) { if err = pr.LoadHeadRepoCtx(ctx); err != nil { - return false, fmt.Errorf("LoadHeadRepo: %v", err) + return false, fmt.Errorf("LoadHeadRepo: %w", err) } else if pr.HeadRepo == nil { // corrupt data assumed changed return true, nil } if err = pr.LoadBaseRepoCtx(ctx); err != nil { - return false, fmt.Errorf("LoadBaseRepo: %v", err) + return false, fmt.Errorf("LoadBaseRepo: %w", err) } headGitRepo, err := git.OpenRepository(ctx, pr.HeadRepo.RepoPath()) if err != nil { - return false, fmt.Errorf("OpenRepository: %v", err) + return false, fmt.Errorf("OpenRepository: %w", err) } defer headGitRepo.Close() // Add a temporary remote. tmpRemote := "checkIfPRContentChanged-" + fmt.Sprint(time.Now().UnixNano()) if err = headGitRepo.AddRemote(tmpRemote, pr.BaseRepo.RepoPath(), true); err != nil { - return false, fmt.Errorf("AddRemote: %s/%s-%s: %v", pr.HeadRepo.OwnerName, pr.HeadRepo.Name, tmpRemote, err) + return false, fmt.Errorf("AddRemote: %s/%s-%s: %w", pr.HeadRepo.OwnerName, pr.HeadRepo.Name, tmpRemote, err) } defer func() { if err := headGitRepo.RemoveRemote(tmpRemote); err != nil { @@ -382,7 +382,7 @@ func checkIfPRContentChanged(ctx context.Context, pr *issues_model.PullRequest, // To synchronize repo and get a base ref _, base, err := headGitRepo.GetMergeBase(tmpRemote, pr.BaseBranch, pr.HeadBranch) if err != nil { - return false, fmt.Errorf("GetMergeBase: %v", err) + return false, fmt.Errorf("GetMergeBase: %w", err) } diffBefore := &bytes.Buffer{} @@ -394,7 +394,7 @@ func checkIfPRContentChanged(ctx context.Context, pr *issues_model.PullRequest, } if err := headGitRepo.GetDiffFromMergeBase(base, newCommitID, diffAfter); err != nil { // New commit should be found - return false, fmt.Errorf("GetDiffFromMergeBase: %v", err) + return false, fmt.Errorf("GetDiffFromMergeBase: %w", err) } diffBeforeLines := bufio.NewScanner(diffBefore) @@ -443,10 +443,10 @@ func pushToBaseRepoHelper(ctx context.Context, pr *issues_model.PullRequest, pre baseRepoPath := pr.BaseRepo.RepoPath() if err = pr.LoadIssue(); err != nil { - return fmt.Errorf("unable to load issue %d for pr %d: %v", pr.IssueID, pr.ID, err) + return fmt.Errorf("unable to load issue %d for pr %d: %w", pr.IssueID, pr.ID, err) } if err = pr.Issue.LoadPoster(); err != nil { - return fmt.Errorf("unable to load poster %d for pr %d: %v", pr.Issue.PosterID, pr.ID, err) + return fmt.Errorf("unable to load poster %d for pr %d: %w", pr.Issue.PosterID, pr.ID, err) } gitRefName := pr.GetGitRefName() @@ -476,7 +476,7 @@ func pushToBaseRepoHelper(ctx context.Context, pr *issues_model.PullRequest, pre return err } log.Error("Unable to push PR head for %s#%d (%-v:%s) due to Error: %v", pr.BaseRepo.FullName(), pr.Index, pr.BaseRepo, gitRefName, err) - return fmt.Errorf("Push: %s:%s %s:%s %v", pr.HeadRepo.FullName(), pr.HeadBranch, pr.BaseRepo.FullName(), gitRefName, err) + return fmt.Errorf("Push: %s:%s %s:%s %w", pr.HeadRepo.FullName(), pr.HeadBranch, pr.BaseRepo.FullName(), gitRefName, err) } return nil diff --git a/services/pull/review.go b/services/pull/review.go index 8d8903c6a9..16c9e108ee 100644 --- a/services/pull/review.go +++ b/services/pull/review.go @@ -120,15 +120,15 @@ var notEnoughLines = regexp.MustCompile(`exit status 128 - fatal: file .* has on func createCodeComment(ctx context.Context, doer *user_model.User, repo *repo_model.Repository, issue *issues_model.Issue, content, treePath string, line, reviewID int64) (*issues_model.Comment, error) { var commitID, patch string if err := issue.LoadPullRequest(); err != nil { - return nil, fmt.Errorf("GetPullRequestByIssueID: %v", err) + return nil, fmt.Errorf("GetPullRequestByIssueID: %w", err) } pr := issue.PullRequest if err := pr.LoadBaseRepoCtx(ctx); err != nil { - return nil, fmt.Errorf("LoadHeadRepo: %v", err) + return nil, fmt.Errorf("LoadHeadRepo: %w", err) } gitRepo, closer, err := git.RepositoryFromContextOrOpen(ctx, pr.BaseRepo.RepoPath()) if err != nil { - return nil, fmt.Errorf("RepositoryFromContextOrOpen: %v", err) + return nil, fmt.Errorf("RepositoryFromContextOrOpen: %w", err) } defer closer.Close() @@ -151,13 +151,13 @@ func createCodeComment(ctx context.Context, doer *user_model.User, repo *repo_mo invalidated = first[0].Invalidated patch = first[0].Patch } else if err != nil && !issues_model.IsErrCommentNotExist(err) { - return nil, fmt.Errorf("Find first comment for %d line %d path %s. Error: %v", reviewID, line, treePath, err) + return nil, fmt.Errorf("Find first comment for %d line %d path %s. Error: %w", reviewID, line, treePath, err) } else { review, err := issues_model.GetReviewByID(ctx, reviewID) if err == nil && len(review.CommitID) > 0 { head = review.CommitID } else if err != nil && !issues_model.IsErrReviewNotExist(err) { - return nil, fmt.Errorf("GetReviewByID %d. Error: %v", reviewID, err) + return nil, fmt.Errorf("GetReviewByID %d. Error: %w", reviewID, err) } } } @@ -170,7 +170,7 @@ func createCodeComment(ctx context.Context, doer *user_model.User, repo *repo_mo if err == nil { commitID = commit.ID.String() } else if !(strings.Contains(err.Error(), "exit status 128 - fatal: no such path") || notEnoughLines.MatchString(err.Error())) { - return nil, fmt.Errorf("LineBlame[%s, %s, %s, %d]: %v", pr.GetGitRefName(), gitRepo.Path, treePath, line, err) + return nil, fmt.Errorf("LineBlame[%s, %s, %s, %d]: %w", pr.GetGitRefName(), gitRepo.Path, treePath, line, err) } } } @@ -179,7 +179,7 @@ func createCodeComment(ctx context.Context, doer *user_model.User, repo *repo_mo if len(patch) == 0 && reviewID != 0 { headCommitID, err := gitRepo.GetRefCommitID(pr.GetGitRefName()) if err != nil { - return nil, fmt.Errorf("GetRefCommitID[%s]: %v", pr.GetGitRefName(), err) + return nil, fmt.Errorf("GetRefCommitID[%s]: %w", pr.GetGitRefName(), err) } if len(commitID) == 0 { commitID = headCommitID @@ -191,7 +191,7 @@ func createCodeComment(ctx context.Context, doer *user_model.User, repo *repo_mo }() go func() { if err := git.GetRepoRawDiffForFile(gitRepo, pr.MergeBase, headCommitID, git.RawDiffNormal, treePath, writer); err != nil { - _ = writer.CloseWithError(fmt.Errorf("GetRawDiffForLine[%s, %s, %s, %s]: %v", gitRepo.Path, pr.MergeBase, headCommitID, treePath, err)) + _ = writer.CloseWithError(fmt.Errorf("GetRawDiffForLine[%s, %s, %s, %s]: %w", gitRepo.Path, pr.MergeBase, headCommitID, treePath, err)) return } _ = writer.Close() diff --git a/services/pull/temp_repo.go b/services/pull/temp_repo.go index 6624f5659b..15e776c4b9 100644 --- a/services/pull/temp_repo.go +++ b/services/pull/temp_repo.go @@ -25,7 +25,7 @@ import ( func createTemporaryRepo(ctx context.Context, pr *issues_model.PullRequest) (string, error) { if err := pr.LoadHeadRepoCtx(ctx); err != nil { log.Error("LoadHeadRepo: %v", err) - return "", fmt.Errorf("LoadHeadRepo: %v", err) + return "", fmt.Errorf("LoadHeadRepo: %w", err) } else if pr.HeadRepo == nil { log.Error("Pr %d HeadRepo %d does not exist", pr.ID, pr.HeadRepoID) return "", &repo_model.ErrRepoNotExist{ @@ -33,7 +33,7 @@ func createTemporaryRepo(ctx context.Context, pr *issues_model.PullRequest) (str } } else if err := pr.LoadBaseRepoCtx(ctx); err != nil { log.Error("LoadBaseRepo: %v", err) - return "", fmt.Errorf("LoadBaseRepo: %v", err) + return "", fmt.Errorf("LoadBaseRepo: %w", err) } else if pr.BaseRepo == nil { log.Error("Pr %d BaseRepo %d does not exist", pr.ID, pr.BaseRepoID) return "", &repo_model.ErrRepoNotExist{ @@ -41,10 +41,10 @@ func createTemporaryRepo(ctx context.Context, pr *issues_model.PullRequest) (str } } else if err := pr.HeadRepo.GetOwner(ctx); err != nil { log.Error("HeadRepo.GetOwner: %v", err) - return "", fmt.Errorf("HeadRepo.GetOwner: %v", err) + return "", fmt.Errorf("HeadRepo.GetOwner: %w", err) } else if err := pr.BaseRepo.GetOwner(ctx); err != nil { log.Error("BaseRepo.GetOwner: %v", err) - return "", fmt.Errorf("BaseRepo.GetOwner: %v", err) + return "", fmt.Errorf("BaseRepo.GetOwner: %w", err) } // Clone base repo. @@ -90,7 +90,7 @@ func createTemporaryRepo(ctx context.Context, pr *issues_model.PullRequest) (str if err := repo_module.RemoveTemporaryPath(tmpBasePath); err != nil { log.Error("CreateTempRepo: RemoveTemporaryPath: %s", err) } - return "", fmt.Errorf("Unable to add base repository to temporary repo [%s -> tmpBasePath]: %v", pr.BaseRepo.FullName(), err) + return "", fmt.Errorf("Unable to add base repository to temporary repo [%s -> tmpBasePath]: %w", pr.BaseRepo.FullName(), err) } var outbuf, errbuf strings.Builder @@ -104,7 +104,7 @@ func createTemporaryRepo(ctx context.Context, pr *issues_model.PullRequest) (str if err := repo_module.RemoveTemporaryPath(tmpBasePath); err != nil { log.Error("CreateTempRepo: RemoveTemporaryPath: %s", err) } - return "", fmt.Errorf("Unable to add base repository as origin [%s -> tmpBasePath]: %v\n%s\n%s", pr.BaseRepo.FullName(), err, outbuf.String(), errbuf.String()) + return "", fmt.Errorf("Unable to add base repository as origin [%s -> tmpBasePath]: %w\n%s\n%s", pr.BaseRepo.FullName(), err, outbuf.String(), errbuf.String()) } outbuf.Reset() errbuf.Reset() @@ -119,7 +119,7 @@ func createTemporaryRepo(ctx context.Context, pr *issues_model.PullRequest) (str if err := repo_module.RemoveTemporaryPath(tmpBasePath); err != nil { log.Error("CreateTempRepo: RemoveTemporaryPath: %s", err) } - return "", fmt.Errorf("Unable to fetch origin base branch [%s:%s -> base, original_base in tmpBasePath]: %v\n%s\n%s", pr.BaseRepo.FullName(), pr.BaseBranch, err, outbuf.String(), errbuf.String()) + return "", fmt.Errorf("Unable to fetch origin base branch [%s:%s -> base, original_base in tmpBasePath]: %w\n%s\n%s", pr.BaseRepo.FullName(), pr.BaseBranch, err, outbuf.String(), errbuf.String()) } outbuf.Reset() errbuf.Reset() @@ -134,7 +134,7 @@ func createTemporaryRepo(ctx context.Context, pr *issues_model.PullRequest) (str if err := repo_module.RemoveTemporaryPath(tmpBasePath); err != nil { log.Error("CreateTempRepo: RemoveTemporaryPath: %s", err) } - return "", fmt.Errorf("Unable to set HEAD as base branch [tmpBasePath]: %v\n%s\n%s", err, outbuf.String(), errbuf.String()) + return "", fmt.Errorf("Unable to set HEAD as base branch [tmpBasePath]: %w\n%s\n%s", err, outbuf.String(), errbuf.String()) } outbuf.Reset() errbuf.Reset() @@ -144,7 +144,7 @@ func createTemporaryRepo(ctx context.Context, pr *issues_model.PullRequest) (str if err := repo_module.RemoveTemporaryPath(tmpBasePath); err != nil { log.Error("CreateTempRepo: RemoveTemporaryPath: %s", err) } - return "", fmt.Errorf("Unable to head base repository to temporary repo [%s -> tmpBasePath]: %v", pr.HeadRepo.FullName(), err) + return "", fmt.Errorf("Unable to head base repository to temporary repo [%s -> tmpBasePath]: %w", pr.HeadRepo.FullName(), err) } if err := git.NewCommand(ctx, "remote", "add").AddDynamicArguments(remoteRepoName, headRepoPath). @@ -157,7 +157,7 @@ func createTemporaryRepo(ctx context.Context, pr *issues_model.PullRequest) (str if err := repo_module.RemoveTemporaryPath(tmpBasePath); err != nil { log.Error("CreateTempRepo: RemoveTemporaryPath: %s", err) } - return "", fmt.Errorf("Unable to add head repository as head_repo [%s -> tmpBasePath]: %v\n%s\n%s", pr.HeadRepo.FullName(), err, outbuf.String(), errbuf.String()) + return "", fmt.Errorf("Unable to add head repository as head_repo [%s -> tmpBasePath]: %w\n%s\n%s", pr.HeadRepo.FullName(), err, outbuf.String(), errbuf.String()) } outbuf.Reset() errbuf.Reset() @@ -187,7 +187,7 @@ func createTemporaryRepo(ctx context.Context, pr *issues_model.PullRequest) (str } } log.Error("Unable to fetch head_repo head branch [%s:%s -> tracking in %s]: %v:\n%s\n%s", pr.HeadRepo.FullName(), pr.HeadBranch, tmpBasePath, err, outbuf.String(), errbuf.String()) - return "", fmt.Errorf("Unable to fetch head_repo head branch [%s:%s -> tracking in tmpBasePath]: %v\n%s\n%s", pr.HeadRepo.FullName(), headBranch, err, outbuf.String(), errbuf.String()) + return "", fmt.Errorf("Unable to fetch head_repo head branch [%s:%s -> tracking in tmpBasePath]: %w\n%s\n%s", pr.HeadRepo.FullName(), headBranch, err, outbuf.String(), errbuf.String()) } outbuf.Reset() errbuf.Reset() diff --git a/services/pull/update.go b/services/pull/update.go index 49258a9862..bd4880a2fc 100644 --- a/services/pull/update.go +++ b/services/pull/update.go @@ -50,10 +50,10 @@ func Update(ctx context.Context, pull *issues_model.PullRequest, doer *user_mode if err := pr.LoadHeadRepoCtx(ctx); err != nil { log.Error("LoadHeadRepo: %v", err) - return fmt.Errorf("LoadHeadRepo: %v", err) + return fmt.Errorf("LoadHeadRepo: %w", err) } else if err = pr.LoadBaseRepoCtx(ctx); err != nil { log.Error("LoadBaseRepo: %v", err) - return fmt.Errorf("LoadBaseRepo: %v", err) + return fmt.Errorf("LoadBaseRepo: %w", err) } diffCount, err := GetDiverging(ctx, pull) diff --git a/services/release/release.go b/services/release/release.go index 25b89e1a0b..8ccc222fb2 100644 --- a/services/release/release.go +++ b/services/release/release.go @@ -36,7 +36,7 @@ func createTag(gitRepo *git.Repository, rel *repo_model.Release, msg string) (bo protectedTags, err := git_model.GetProtectedTags(rel.Repo.ID) if err != nil { - return false, fmt.Errorf("GetProtectedTags: %v", err) + return false, fmt.Errorf("GetProtectedTags: %w", err) } // Trim '--' prefix to prevent command line argument vulnerability. @@ -53,7 +53,7 @@ func createTag(gitRepo *git.Repository, rel *repo_model.Release, msg string) (bo commit, err := gitRepo.GetCommit(rel.Target) if err != nil { - return false, fmt.Errorf("createTag::GetCommit[%v]: %v", rel.Target, err) + return false, fmt.Errorf("createTag::GetCommit[%v]: %w", rel.Target, err) } if len(msg) > 0 { @@ -92,13 +92,13 @@ func createTag(gitRepo *git.Repository, rel *repo_model.Release, msg string) (bo } commit, err := gitRepo.GetTagCommit(rel.TagName) if err != nil { - return false, fmt.Errorf("GetTagCommit: %v", err) + return false, fmt.Errorf("GetTagCommit: %w", err) } rel.Sha1 = commit.ID.String() rel.NumCommits, err = commit.CommitsCount() if err != nil { - return false, fmt.Errorf("CommitsCount: %v", err) + return false, fmt.Errorf("CommitsCount: %w", err) } if rel.PublisherID <= 0 { @@ -207,7 +207,7 @@ func UpdateRelease(doer *user_model.User, gitRepo *git.Repository, rel *repo_mod } if err = repo_model.AddReleaseAttachments(ctx, rel.ID, addAttachmentUUIDs); err != nil { - return fmt.Errorf("AddReleaseAttachments: %v", err) + return fmt.Errorf("AddReleaseAttachments: %w", err) } deletedUUIDs := make(container.Set[string]) @@ -215,7 +215,7 @@ func UpdateRelease(doer *user_model.User, gitRepo *git.Repository, rel *repo_mod // Check attachments attachments, err := repo_model.GetAttachmentsByUUIDs(ctx, delAttachmentUUIDs) if err != nil { - return fmt.Errorf("GetAttachmentsByUUIDs [uuids: %v]: %v", delAttachmentUUIDs, err) + return fmt.Errorf("GetAttachmentsByUUIDs [uuids: %v]: %w", delAttachmentUUIDs, err) } for _, attach := range attachments { if attach.ReleaseID != rel.ID { @@ -225,7 +225,7 @@ func UpdateRelease(doer *user_model.User, gitRepo *git.Repository, rel *repo_mod } if _, err := repo_model.DeleteAttachments(ctx, attachments, false); err != nil { - return fmt.Errorf("DeleteAttachments [uuids: %v]: %v", delAttachmentUUIDs, err) + return fmt.Errorf("DeleteAttachments [uuids: %v]: %w", delAttachmentUUIDs, err) } } @@ -237,7 +237,7 @@ func UpdateRelease(doer *user_model.User, gitRepo *git.Repository, rel *repo_mod // Check attachments attachments, err := repo_model.GetAttachmentsByUUIDs(ctx, updateAttachmentsList) if err != nil { - return fmt.Errorf("GetAttachmentsByUUIDs [uuids: %v]: %v", updateAttachmentsList, err) + return fmt.Errorf("GetAttachmentsByUUIDs [uuids: %v]: %w", updateAttachmentsList, err) } for _, attach := range attachments { if attach.ReleaseID != rel.ID { @@ -271,12 +271,13 @@ func UpdateRelease(doer *user_model.User, gitRepo *git.Repository, rel *repo_mod } } + if !isCreated { + notification.NotifyUpdateRelease(doer, rel) + return + } + if !rel.IsDraft { - if isCreated { - notification.NotifyNewRelease(rel) - } else { - notification.NotifyUpdateRelease(doer, rel) - } + notification.NotifyNewRelease(rel) } return err @@ -286,18 +287,18 @@ func UpdateRelease(doer *user_model.User, gitRepo *git.Repository, rel *repo_mod func DeleteReleaseByID(ctx context.Context, id int64, doer *user_model.User, delTag bool) error { rel, err := repo_model.GetReleaseByID(ctx, id) if err != nil { - return fmt.Errorf("GetReleaseByID: %v", err) + return fmt.Errorf("GetReleaseByID: %w", err) } repo, err := repo_model.GetRepositoryByIDCtx(ctx, rel.RepoID) if err != nil { - return fmt.Errorf("GetRepositoryByID: %v", err) + return fmt.Errorf("GetRepositoryByID: %w", err) } if delTag { protectedTags, err := git_model.GetProtectedTags(rel.RepoID) if err != nil { - return fmt.Errorf("GetProtectedTags: %v", err) + return fmt.Errorf("GetProtectedTags: %w", err) } isAllowed, err := git_model.IsUserAllowedToControlTag(protectedTags, rel.TagName, rel.PublisherID) if err != nil { @@ -313,7 +314,7 @@ func DeleteReleaseByID(ctx context.Context, id int64, doer *user_model.User, del SetDescription(fmt.Sprintf("DeleteReleaseByID (git tag -d): %d", rel.ID)). RunStdString(&git.RunOpts{Dir: repo.RepoPath()}); err != nil && !strings.Contains(err.Error(), "not found") { log.Error("DeleteReleaseByID (git tag -d): %d in %v Failed:\nStdout: %s\nError: %v", rel.ID, repo, stdout, err) - return fmt.Errorf("git tag -d: %v", err) + return fmt.Errorf("git tag -d: %w", err) } notification.NotifyPushCommits( @@ -326,23 +327,23 @@ func DeleteReleaseByID(ctx context.Context, id int64, doer *user_model.User, del notification.NotifyDeleteRef(doer, repo, "tag", git.TagPrefix+rel.TagName) if err := repo_model.DeleteReleaseByID(id); err != nil { - return fmt.Errorf("DeleteReleaseByID: %v", err) + return fmt.Errorf("DeleteReleaseByID: %w", err) } } else { rel.IsTag = true if err = repo_model.UpdateRelease(ctx, rel); err != nil { - return fmt.Errorf("Update: %v", err) + return fmt.Errorf("Update: %w", err) } } rel.Repo = repo if err = rel.LoadAttributes(); err != nil { - return fmt.Errorf("LoadAttributes: %v", err) + return fmt.Errorf("LoadAttributes: %w", err) } if err := repo_model.DeleteAttachmentsByRelease(rel.ID); err != nil { - return fmt.Errorf("DeleteAttachments: %v", err) + return fmt.Errorf("DeleteAttachments: %w", err) } for i := range rel.Attachments { @@ -352,9 +353,7 @@ func DeleteReleaseByID(ctx context.Context, id int64, doer *user_model.User, del } } - if !rel.IsDraft { - notification.NotifyDeleteRelease(doer, rel) - } + notification.NotifyDeleteRelease(doer, rel) return nil } diff --git a/services/repository/adopt.go b/services/repository/adopt.go index 9e04c15977..3b986c66c6 100644 --- a/services/repository/adopt.go +++ b/services/repository/adopt.go @@ -71,16 +71,16 @@ func AdoptRepository(doer, u *user_model.User, opts repo_module.CreateRepoOption return err } if err := adoptRepository(ctx, repoPath, doer, repo, opts); err != nil { - return fmt.Errorf("createDelegateHooks: %v", err) + return fmt.Errorf("createDelegateHooks: %w", err) } if err := repo_module.CheckDaemonExportOK(ctx, repo); err != nil { - return fmt.Errorf("checkDaemonExportOK: %v", err) + return fmt.Errorf("checkDaemonExportOK: %w", err) } // Initialize Issue Labels if selected if len(opts.IssueLabels) > 0 { if err := repo_module.InitializeLabels(ctx, repo.ID, opts.IssueLabels, false); err != nil { - return fmt.Errorf("InitializeLabels: %v", err) + return fmt.Errorf("InitializeLabels: %w", err) } } @@ -88,7 +88,7 @@ func AdoptRepository(doer, u *user_model.User, opts repo_module.CreateRepoOption SetDescription(fmt.Sprintf("CreateRepository(git update-server-info): %s", repoPath)). RunStdString(&git.RunOpts{Dir: repoPath}); err != nil { log.Error("CreateRepository(git update-server-info) in %v: Stdout: %s\nError: %v", repo, stdout, err) - return fmt.Errorf("CreateRepository(git update-server-info): %v", err) + return fmt.Errorf("CreateRepository(git update-server-info): %w", err) } return nil }); err != nil { @@ -111,13 +111,13 @@ func adoptRepository(ctx context.Context, repoPath string, u *user_model.User, r } if err := repo_module.CreateDelegateHooks(repoPath); err != nil { - return fmt.Errorf("createDelegateHooks: %v", err) + return fmt.Errorf("createDelegateHooks: %w", err) } // Re-fetch the repository from database before updating it (else it would // override changes that were done earlier with sql) if repo, err = repo_model.GetRepositoryByIDCtx(ctx, repo.ID); err != nil { - return fmt.Errorf("getRepositoryByID: %v", err) + return fmt.Errorf("getRepositoryByID: %w", err) } repo.IsEmpty = false @@ -125,7 +125,7 @@ func adoptRepository(ctx context.Context, repoPath string, u *user_model.User, r // Don't bother looking this repo in the context it won't be there gitRepo, err := git.OpenRepository(ctx, repo.RepoPath()) if err != nil { - return fmt.Errorf("openRepository: %v", err) + return fmt.Errorf("openRepository: %w", err) } defer gitRepo.Close() @@ -133,14 +133,14 @@ func adoptRepository(ctx context.Context, repoPath string, u *user_model.User, r repo.DefaultBranch = opts.DefaultBranch if err = gitRepo.SetDefaultBranch(repo.DefaultBranch); err != nil { - return fmt.Errorf("setDefaultBranch: %v", err) + return fmt.Errorf("setDefaultBranch: %w", err) } } else { repo.DefaultBranch, err = gitRepo.GetDefaultBranch() if err != nil { repo.DefaultBranch = setting.Repository.DefaultBranch if err = gitRepo.SetDefaultBranch(repo.DefaultBranch); err != nil { - return fmt.Errorf("setDefaultBranch: %v", err) + return fmt.Errorf("setDefaultBranch: %w", err) } } } @@ -176,12 +176,12 @@ func adoptRepository(ctx context.Context, repoPath string, u *user_model.User, r } if err = gitRepo.SetDefaultBranch(repo.DefaultBranch); err != nil { - return fmt.Errorf("setDefaultBranch: %v", err) + return fmt.Errorf("setDefaultBranch: %w", err) } } if err = repo_module.UpdateRepository(ctx, repo, false); err != nil { - return fmt.Errorf("updateRepository: %v", err) + return fmt.Errorf("updateRepository: %w", err) } return nil diff --git a/services/repository/archiver/archiver.go b/services/repository/archiver/archiver.go index ae43503bae..79537ea051 100644 --- a/services/repository/archiver/archiver.go +++ b/services/repository/archiver/archiver.go @@ -139,7 +139,7 @@ func (aReq *ArchiveRequest) GetArchiveName() string { func (aReq *ArchiveRequest) Await(ctx context.Context) (*repo_model.RepoArchiver, error) { archiver, err := repo_model.GetRepoArchiver(ctx, aReq.RepoID, aReq.Type, aReq.CommitID) if err != nil { - return nil, fmt.Errorf("models.GetRepoArchiver: %v", err) + return nil, fmt.Errorf("models.GetRepoArchiver: %w", err) } if archiver != nil && archiver.Status == repo_model.ArchiverReady { @@ -148,7 +148,7 @@ func (aReq *ArchiveRequest) Await(ctx context.Context) (*repo_model.RepoArchiver } if err := StartArchive(aReq); err != nil { - return nil, fmt.Errorf("archiver.StartArchive: %v", err) + return nil, fmt.Errorf("archiver.StartArchive: %w", err) } poll := time.NewTicker(time.Second * 1) @@ -164,7 +164,7 @@ func (aReq *ArchiveRequest) Await(ctx context.Context) (*repo_model.RepoArchiver case <-poll.C: archiver, err = repo_model.GetRepoArchiver(ctx, aReq.RepoID, aReq.Type, aReq.CommitID) if err != nil { - return nil, fmt.Errorf("repo_model.GetRepoArchiver: %v", err) + return nil, fmt.Errorf("repo_model.GetRepoArchiver: %w", err) } if archiver != nil && archiver.Status == repo_model.ArchiverReady { return archiver, nil @@ -218,7 +218,7 @@ func doArchive(r *ArchiveRequest) (*repo_model.RepoArchiver, error) { } if !errors.Is(err, os.ErrNotExist) { - return nil, fmt.Errorf("unable to stat archive: %v", err) + return nil, fmt.Errorf("unable to stat archive: %w", err) } rd, w := io.Pipe() @@ -229,7 +229,7 @@ func doArchive(r *ArchiveRequest) (*repo_model.RepoArchiver, error) { done := make(chan error, 1) // Ensure that there is some capacity which will ensure that the goroutine below can always finish repo, err := repo_model.GetRepositoryByID(archiver.RepoID) if err != nil { - return nil, fmt.Errorf("archiver.LoadRepo failed: %v", err) + return nil, fmt.Errorf("archiver.LoadRepo failed: %w", err) } gitRepo, err := git.OpenRepository(ctx, repo.RepoPath()) @@ -268,7 +268,7 @@ func doArchive(r *ArchiveRequest) (*repo_model.RepoArchiver, error) { // TODO: add submodule data to zip if _, err := storage.RepoArchives.Save(rPath, rd, -1); err != nil { - return nil, fmt.Errorf("unable to write archive: %v", err) + return nil, fmt.Errorf("unable to write archive: %w", err) } err = <-done diff --git a/services/repository/avatar.go b/services/repository/avatar.go index b9bd36ab66..b80a8fb775 100644 --- a/services/repository/avatar.go +++ b/services/repository/avatar.go @@ -45,7 +45,7 @@ func UploadAvatar(repo *repo_model.Repository, data []byte) error { // Then repo will be removed - only it avatar file will be removed repo.Avatar = newAvatar if err := repo_model.UpdateRepositoryCols(ctx, repo, "avatar"); err != nil { - return fmt.Errorf("UploadAvatar: Update repository avatar: %v", err) + return fmt.Errorf("UploadAvatar: Update repository avatar: %w", err) } if err := storage.SaveFrom(storage.RepoAvatars, repo.CustomAvatarRelativePath(), func(w io.Writer) error { @@ -54,12 +54,12 @@ func UploadAvatar(repo *repo_model.Repository, data []byte) error { } return err }); err != nil { - return fmt.Errorf("UploadAvatar %s failed: Failed to remove old repo avatar %s: %v", repo.RepoPath(), newAvatar, err) + return fmt.Errorf("UploadAvatar %s failed: Failed to remove old repo avatar %s: %w", repo.RepoPath(), newAvatar, err) } if len(oldAvatarPath) > 0 { if err := storage.RepoAvatars.Delete(oldAvatarPath); err != nil { - return fmt.Errorf("UploadAvatar: Failed to remove old repo avatar %s: %v", oldAvatarPath, err) + return fmt.Errorf("UploadAvatar: Failed to remove old repo avatar %s: %w", oldAvatarPath, err) } } @@ -84,11 +84,11 @@ func DeleteAvatar(repo *repo_model.Repository) error { repo.Avatar = "" if err := repo_model.UpdateRepositoryCols(ctx, repo, "avatar"); err != nil { - return fmt.Errorf("DeleteAvatar: Update repository avatar: %v", err) + return fmt.Errorf("DeleteAvatar: Update repository avatar: %w", err) } if err := storage.RepoAvatars.Delete(avatarPath); err != nil { - return fmt.Errorf("DeleteAvatar: Failed to remove %s: %v", avatarPath, err) + return fmt.Errorf("DeleteAvatar: Failed to remove %s: %w", avatarPath, err) } return committer.Commit() diff --git a/services/repository/branch.go b/services/repository/branch.go index 6c9a5d76ca..1328422582 100644 --- a/services/repository/branch.go +++ b/services/repository/branch.go @@ -42,7 +42,7 @@ func CreateNewBranch(ctx context.Context, doer *user_model.User, repo *repo_mode if git.IsErrPushOutOfDate(err) || git.IsErrPushRejected(err) { return err } - return fmt.Errorf("Push: %v", err) + return fmt.Errorf("Push: %w", err) } return nil @@ -99,7 +99,7 @@ func CreateNewBranchFromCommit(ctx context.Context, doer *user_model.User, repo if git.IsErrPushOutOfDate(err) || git.IsErrPushRejected(err) { return err } - return fmt.Errorf("Push: %v", err) + return fmt.Errorf("Push: %w", err) } return nil diff --git a/services/repository/check.go b/services/repository/check.go index 1b2da4cc08..5529a61b39 100644 --- a/services/repository/check.go +++ b/services/repository/check.go @@ -86,7 +86,7 @@ func GitGcRepos(ctx context.Context, timeout time.Duration, args ...git.CmdArg) if err = system_model.CreateRepositoryNotice(desc); err != nil { log.Error("CreateRepositoryNotice: %v", err) } - return fmt.Errorf("Repository garbage collection failed in repo: %s: Error: %v", repo.FullName(), err) + return fmt.Errorf("Repository garbage collection failed in repo: %s: Error: %w", repo.FullName(), err) } // Now update the size of the repository @@ -96,7 +96,7 @@ func GitGcRepos(ctx context.Context, timeout time.Duration, args ...git.CmdArg) if err = system_model.CreateRepositoryNotice(desc); err != nil { log.Error("CreateRepositoryNotice: %v", err) } - return fmt.Errorf("Updating size as part of garbage collection failed in repo: %s: Error: %v", repo.FullName(), err) + return fmt.Errorf("Updating size as part of garbage collection failed in repo: %s: Error: %w", repo.FullName(), err) } return nil diff --git a/services/repository/files/cherry_pick.go b/services/repository/files/cherry_pick.go index 0107d99e66..a30d4f6025 100644 --- a/services/repository/files/cherry_pick.go +++ b/services/repository/files/cherry_pick.go @@ -51,7 +51,7 @@ func CherryPick(ctx context.Context, repo *repo_model.Repository, doer *user_mod } else { lastCommitID, err := t.gitRepo.ConvertToSHA1(opts.LastCommitID) if err != nil { - return nil, fmt.Errorf("CherryPick: Invalid last commit ID: %v", err) + return nil, fmt.Errorf("CherryPick: Invalid last commit ID: %w", err) } opts.LastCommitID = lastCommitID.String() if commit.ID.String() != opts.LastCommitID { @@ -81,7 +81,7 @@ func CherryPick(ctx context.Context, repo *repo_model.Repository, doer *user_mod conflict, _, err := pull.AttemptThreeWayMerge(ctx, t.basePath, t.gitRepo, base, opts.LastCommitID, right, description) if err != nil { - return nil, fmt.Errorf("failed to three-way merge %s onto %s: %v", right, opts.OldBranch, err) + return nil, fmt.Errorf("failed to three-way merge %s onto %s: %w", right, opts.OldBranch, err) } if conflict { diff --git a/services/repository/files/commit.go b/services/repository/files/commit.go index ecd981b5ff..bc5a4c8ed3 100644 --- a/services/repository/files/commit.go +++ b/services/repository/files/commit.go @@ -26,13 +26,13 @@ func CreateCommitStatus(ctx context.Context, repo *repo_model.Repository, creato // confirm that commit is exist gitRepo, closer, err := git.RepositoryFromContextOrOpen(ctx, repo.RepoPath()) if err != nil { - return fmt.Errorf("OpenRepository[%s]: %v", repoPath, err) + return fmt.Errorf("OpenRepository[%s]: %w", repoPath, err) } defer closer.Close() if _, err := gitRepo.GetCommit(sha); err != nil { gitRepo.Close() - return fmt.Errorf("GetCommit[%s]: %v", sha, err) + return fmt.Errorf("GetCommit[%s]: %w", sha, err) } gitRepo.Close() @@ -42,7 +42,7 @@ func CreateCommitStatus(ctx context.Context, repo *repo_model.Repository, creato SHA: sha, CommitStatus: status, }); err != nil { - return fmt.Errorf("NewCommitStatus[repo_id: %d, user_id: %d, sha: %s]: %v", repo.ID, creator.ID, sha, err) + return fmt.Errorf("NewCommitStatus[repo_id: %d, user_id: %d, sha: %s]: %w", repo.ID, creator.ID, sha, err) } if status.State.IsSuccess() { diff --git a/services/repository/files/delete.go b/services/repository/files/delete.go index 781a762d0f..f098052ad8 100644 --- a/services/repository/files/delete.go +++ b/services/repository/files/delete.go @@ -104,7 +104,7 @@ func DeleteRepoFile(ctx context.Context, repo *repo_model.Repository, doer *user } else { lastCommitID, err := t.gitRepo.ConvertToSHA1(opts.LastCommitID) if err != nil { - return nil, fmt.Errorf("DeleteRepoFile: Invalid last commit ID: %v", err) + return nil, fmt.Errorf("DeleteRepoFile: Invalid last commit ID: %w", err) } opts.LastCommitID = lastCommitID.String() } @@ -112,7 +112,7 @@ func DeleteRepoFile(ctx context.Context, repo *repo_model.Repository, doer *user // Get the files in the index filesInIndex, err := t.LsFiles(opts.TreePath) if err != nil { - return nil, fmt.Errorf("DeleteRepoFile: %v", err) + return nil, fmt.Errorf("DeleteRepoFile: %w", err) } // Find the file we want to delete in the index diff --git a/services/repository/files/patch.go b/services/repository/files/patch.go index 437890c488..2be01f25be 100644 --- a/services/repository/files/patch.go +++ b/services/repository/files/patch.go @@ -125,7 +125,7 @@ func ApplyDiffPatch(ctx context.Context, repo *repo_model.Repository, doer *user } else { lastCommitID, err := t.gitRepo.ConvertToSHA1(opts.LastCommitID) if err != nil { - return nil, fmt.Errorf("ApplyPatch: Invalid last commit ID: %v", err) + return nil, fmt.Errorf("ApplyPatch: Invalid last commit ID: %w", err) } opts.LastCommitID = lastCommitID.String() if commit.ID.String() != opts.LastCommitID { @@ -152,7 +152,7 @@ func ApplyDiffPatch(ctx context.Context, repo *repo_model.Repository, doer *user Stderr: stderr, Stdin: strings.NewReader(opts.Content), }); err != nil { - return nil, fmt.Errorf("Error: Stdout: %s\nStderr: %s\nErr: %v", stdout.String(), stderr.String(), err) + return nil, fmt.Errorf("Error: Stdout: %s\nStderr: %s\nErr: %w", stdout.String(), stderr.String(), err) } // Now write the tree diff --git a/services/repository/files/temp_repo.go b/services/repository/files/temp_repo.go index 9513f2341e..b96d9e7b3d 100644 --- a/services/repository/files/temp_repo.go +++ b/services/repository/files/temp_repo.go @@ -67,7 +67,7 @@ func (t *TemporaryUploadRepository) Clone(branch string) error { Name: t.repo.Name, } } else { - return fmt.Errorf("Clone: %v %s", err, stderr) + return fmt.Errorf("Clone: %w %s", err, stderr) } } gitRepo, err := git.OpenRepository(t.ctx, t.basePath) @@ -94,7 +94,7 @@ func (t *TemporaryUploadRepository) Init() error { // SetDefaultIndex sets the git index to our HEAD func (t *TemporaryUploadRepository) SetDefaultIndex() error { if _, _, err := git.NewCommand(t.ctx, "read-tree", "HEAD").RunStdString(&git.RunOpts{Dir: t.basePath}); err != nil { - return fmt.Errorf("SetDefaultIndex: %v", err) + return fmt.Errorf("SetDefaultIndex: %w", err) } return nil } @@ -111,7 +111,7 @@ func (t *TemporaryUploadRepository) LsFiles(filenames ...string) ([]string, erro Stderr: stdErr, }); err != nil { log.Error("Unable to run git ls-files for temporary repo: %s (%s) Error: %v\nstdout: %s\nstderr: %s", t.repo.FullName(), t.basePath, err, stdOut.String(), stdErr.String()) - err = fmt.Errorf("Unable to run git ls-files for temporary repo of: %s Error: %v\nstdout: %s\nstderr: %s", t.repo.FullName(), err, stdOut.String(), stdErr.String()) + err = fmt.Errorf("Unable to run git ls-files for temporary repo of: %s Error: %w\nstdout: %s\nstderr: %s", t.repo.FullName(), err, stdOut.String(), stdErr.String()) return nil, err } @@ -144,7 +144,7 @@ func (t *TemporaryUploadRepository) RemoveFilesFromIndex(filenames ...string) er Stderr: stdErr, }); err != nil { log.Error("Unable to update-index for temporary repo: %s (%s) Error: %v\nstdout: %s\nstderr: %s", t.repo.FullName(), t.basePath, err, stdOut.String(), stdErr.String()) - return fmt.Errorf("Unable to update-index for temporary repo: %s Error: %v\nstdout: %s\nstderr: %s", t.repo.FullName(), err, stdOut.String(), stdErr.String()) + return fmt.Errorf("Unable to update-index for temporary repo: %s Error: %w\nstdout: %s\nstderr: %s", t.repo.FullName(), err, stdOut.String(), stdErr.String()) } return nil } @@ -162,7 +162,7 @@ func (t *TemporaryUploadRepository) HashObject(content io.Reader) (string, error Stderr: stdErr, }); err != nil { log.Error("Unable to hash-object to temporary repo: %s (%s) Error: %v\nstdout: %s\nstderr: %s", t.repo.FullName(), t.basePath, err, stdOut.String(), stdErr.String()) - return "", fmt.Errorf("Unable to hash-object to temporary repo: %s Error: %v\nstdout: %s\nstderr: %s", t.repo.FullName(), err, stdOut.String(), stdErr.String()) + return "", fmt.Errorf("Unable to hash-object to temporary repo: %s Error: %w\nstdout: %s\nstderr: %s", t.repo.FullName(), err, stdOut.String(), stdErr.String()) } return strings.TrimSpace(stdOut.String()), nil @@ -179,7 +179,7 @@ func (t *TemporaryUploadRepository) AddObjectToIndex(mode, objectHash, objectPat } } log.Error("Unable to add object to index: %s %s %s in temporary repo %s(%s) Error: %v", mode, objectHash, objectPath, t.repo.FullName(), t.basePath, err) - return fmt.Errorf("Unable to add object to index at %s in temporary repo %s Error: %v", objectPath, t.repo.FullName(), err) + return fmt.Errorf("Unable to add object to index at %s in temporary repo %s Error: %w", objectPath, t.repo.FullName(), err) } return nil } @@ -189,7 +189,7 @@ func (t *TemporaryUploadRepository) WriteTree() (string, error) { stdout, _, err := git.NewCommand(t.ctx, "write-tree").RunStdString(&git.RunOpts{Dir: t.basePath}) if err != nil { log.Error("Unable to write tree in temporary repo: %s(%s): Error: %v", t.repo.FullName(), t.basePath, err) - return "", fmt.Errorf("Unable to write-tree in temporary repo for: %s Error: %v", t.repo.FullName(), err) + return "", fmt.Errorf("Unable to write-tree in temporary repo for: %s Error: %w", t.repo.FullName(), err) } return strings.TrimSpace(stdout), nil } @@ -207,7 +207,7 @@ func (t *TemporaryUploadRepository) GetLastCommitByRef(ref string) (string, erro stdout, _, err := git.NewCommand(t.ctx, "rev-parse").AddDynamicArguments(ref).RunStdString(&git.RunOpts{Dir: t.basePath}) if err != nil { log.Error("Unable to get last ref for %s in temporary repo: %s(%s): Error: %v", ref, t.repo.FullName(), t.basePath, err) - return "", fmt.Errorf("Unable to rev-parse %s in temporary repo for: %s Error: %v", ref, t.repo.FullName(), err) + return "", fmt.Errorf("Unable to rev-parse %s in temporary repo for: %s Error: %w", ref, t.repo.FullName(), err) } return strings.TrimSpace(stdout), nil } @@ -292,7 +292,7 @@ func (t *TemporaryUploadRepository) CommitTreeWithDate(parent string, author, co }); err != nil { log.Error("Unable to commit-tree in temporary repo: %s (%s) Error: %v\nStdout: %s\nStderr: %s", t.repo.FullName(), t.basePath, err, stdout, stderr) - return "", fmt.Errorf("Unable to commit-tree in temporary repo: %s Error: %v\nStdout: %s\nStderr: %s", + return "", fmt.Errorf("Unable to commit-tree in temporary repo: %s Error: %w\nStdout: %s\nStderr: %s", t.repo.FullName(), err, stdout, stderr) } return strings.TrimSpace(stdout.String()), nil @@ -328,7 +328,7 @@ func (t *TemporaryUploadRepository) DiffIndex() (*gitdiff.Diff, error) { stdoutReader, stdoutWriter, err := os.Pipe() if err != nil { log.Error("Unable to open stdout pipe: %v", err) - return nil, fmt.Errorf("Unable to open stdout pipe: %v", err) + return nil, fmt.Errorf("Unable to open stdout pipe: %w", err) } defer func() { _ = stdoutReader.Close() @@ -361,7 +361,7 @@ func (t *TemporaryUploadRepository) DiffIndex() (*gitdiff.Diff, error) { } log.Error("Unable to run diff-index pipeline in temporary repo %s (%s). Error: %v\nStderr: %s", t.repo.FullName(), t.basePath, err, stderr) - return nil, fmt.Errorf("Unable to run diff-index pipeline in temporary repo %s. Error: %v\nStderr: %s", + return nil, fmt.Errorf("Unable to run diff-index pipeline in temporary repo %s. Error: %w\nStderr: %s", t.repo.FullName(), err, stderr) } diff --git a/services/repository/files/update.go b/services/repository/files/update.go index 87c622a9be..1721b00b01 100644 --- a/services/repository/files/update.go +++ b/services/repository/files/update.go @@ -226,7 +226,7 @@ func CreateOrUpdateRepoFile(ctx context.Context, repo *repo_model.Repository, do } else { lastCommitID, err := t.gitRepo.ConvertToSHA1(opts.LastCommitID) if err != nil { - return nil, fmt.Errorf("ConvertToSHA1: Invalid last commit ID: %v", err) + return nil, fmt.Errorf("ConvertToSHA1: Invalid last commit ID: %w", err) } opts.LastCommitID = lastCommitID.String() @@ -321,7 +321,7 @@ func CreateOrUpdateRepoFile(ctx context.Context, repo *repo_model.Repository, do // Get the two paths (might be the same if not moving) from the index if they exist filesInIndex, err := t.LsFiles(opts.TreePath, opts.FromTreePath) if err != nil { - return nil, fmt.Errorf("UpdateRepoFile: %v", err) + return nil, fmt.Errorf("UpdateRepoFile: %w", err) } // If is a new file (not updating) then the given path shouldn't exist if opts.IsNewFile { @@ -436,7 +436,7 @@ func CreateOrUpdateRepoFile(ctx context.Context, repo *repo_model.Repository, do if !exist { if err := contentStore.Put(lfsMetaObject.Pointer, strings.NewReader(opts.Content)); err != nil { if _, err2 := git_model.RemoveLFSMetaObjectByOid(repo.ID, lfsMetaObject.Oid); err2 != nil { - return nil, fmt.Errorf("Error whilst removing failed inserted LFS object %s: %v (Prev Error: %v)", lfsMetaObject.Oid, err2, err) + return nil, fmt.Errorf("Error whilst removing failed inserted LFS object %s: %v (Prev Error: %w)", lfsMetaObject.Oid, err2, err) } return nil, err } diff --git a/services/repository/files/upload.go b/services/repository/files/upload.go index b2dadb6497..3728780991 100644 --- a/services/repository/files/upload.go +++ b/services/repository/files/upload.go @@ -42,7 +42,7 @@ func cleanUpAfterFailure(infos *[]uploadInfo, t *TemporaryUploadRepository, orig } if !info.lfsMetaObject.Existing { if _, err := git_model.RemoveLFSMetaObjectByOid(t.repo.ID, info.lfsMetaObject.Oid); err != nil { - original = fmt.Errorf("%v, %v", original, err) + original = fmt.Errorf("%w, %v", original, err) // We wrap the original error - as this is the underlying error that required the fallback } } } @@ -57,7 +57,7 @@ func UploadRepoFiles(ctx context.Context, repo *repo_model.Repository, doer *use uploads, err := repo_model.GetUploadsByUUIDs(opts.Files) if err != nil { - return fmt.Errorf("GetUploadsByUUIDs [uuids: %v]: %v", opts.Files, err) + return fmt.Errorf("GetUploadsByUUIDs [uuids: %v]: %w", opts.Files, err) } names := make([]string, len(uploads)) diff --git a/services/repository/fork.go b/services/repository/fork.go index af0ade99a9..136d7ccab6 100644 --- a/services/repository/fork.go +++ b/services/repository/fork.go @@ -134,22 +134,22 @@ func ForkRepository(ctx context.Context, doer, owner *user_model.User, opts Fork SetDescription(fmt.Sprintf("ForkRepository(git clone): %s to %s", opts.BaseRepo.FullName(), repo.FullName())). RunStdBytes(&git.RunOpts{Timeout: 10 * time.Minute}); err != nil { log.Error("Fork Repository (git clone) Failed for %v (from %v):\nStdout: %s\nError: %v", repo, opts.BaseRepo, stdout, err) - return fmt.Errorf("git clone: %v", err) + return fmt.Errorf("git clone: %w", err) } if err := repo_module.CheckDaemonExportOK(txCtx, repo); err != nil { - return fmt.Errorf("checkDaemonExportOK: %v", err) + return fmt.Errorf("checkDaemonExportOK: %w", err) } if stdout, _, err := git.NewCommand(txCtx, "update-server-info"). SetDescription(fmt.Sprintf("ForkRepository(git update-server-info): %s", repo.FullName())). RunStdString(&git.RunOpts{Dir: repoPath}); err != nil { log.Error("Fork Repository (git update-server-info) failed for %v:\nStdout: %s\nError: %v", repo, stdout, err) - return fmt.Errorf("git update-server-info: %v", err) + return fmt.Errorf("git update-server-info: %w", err) } if err = repo_module.CreateDelegateHooks(repoPath); err != nil { - return fmt.Errorf("createDelegateHooks: %v", err) + return fmt.Errorf("createDelegateHooks: %w", err) } return nil }) diff --git a/services/repository/hooks.go b/services/repository/hooks.go index 45a031f38e..d326cd26b1 100644 --- a/services/repository/hooks.go +++ b/services/repository/hooks.go @@ -36,11 +36,11 @@ func SyncRepositoryHooks(ctx context.Context) error { } if err := repo_module.CreateDelegateHooks(repo.RepoPath()); err != nil { - return fmt.Errorf("SyncRepositoryHook: %v", err) + return fmt.Errorf("SyncRepositoryHook: %w", err) } if repo.HasWiki() { if err := repo_module.CreateDelegateHooks(repo.WikiPath()); err != nil { - return fmt.Errorf("SyncRepositoryHook: %v", err) + return fmt.Errorf("SyncRepositoryHook: %w", err) } } return nil diff --git a/services/repository/push.go b/services/repository/push.go index d645928c43..3a7205d18b 100644 --- a/services/repository/push.go +++ b/services/repository/push.go @@ -84,14 +84,14 @@ func pushUpdates(optsList []*repo_module.PushUpdateOptions) error { repo, err := repo_model.GetRepositoryByOwnerAndName(optsList[0].RepoUserName, optsList[0].RepoName) if err != nil { - return fmt.Errorf("GetRepositoryByOwnerAndName failed: %v", err) + return fmt.Errorf("GetRepositoryByOwnerAndName failed: %w", err) } repoPath := repo.RepoPath() gitRepo, err := git.OpenRepository(ctx, repoPath) if err != nil { - return fmt.Errorf("OpenRepository[%s]: %v", repoPath, err) + return fmt.Errorf("OpenRepository[%s]: %w", repoPath, err) } defer gitRepo.Close() @@ -129,7 +129,7 @@ func pushUpdates(optsList []*repo_module.PushUpdateOptions) error { } else { // is new tag newCommit, err := gitRepo.GetCommit(opts.NewCommitID) if err != nil { - return fmt.Errorf("gitRepo.GetCommit: %v", err) + return fmt.Errorf("gitRepo.GetCommit: %w", err) } commits := repo_module.NewPushCommits() @@ -162,7 +162,7 @@ func pushUpdates(optsList []*repo_module.PushUpdateOptions) error { newCommit, err := gitRepo.GetCommit(opts.NewCommitID) if err != nil { - return fmt.Errorf("gitRepo.GetCommit: %v", err) + return fmt.Errorf("gitRepo.GetCommit: %w", err) } refName := opts.RefName() @@ -182,19 +182,19 @@ func pushUpdates(optsList []*repo_module.PushUpdateOptions) error { } // Update the is empty and default_branch columns if err := repo_model.UpdateRepositoryCols(db.DefaultContext, repo, "default_branch", "is_empty"); err != nil { - return fmt.Errorf("UpdateRepositoryCols: %v", err) + return fmt.Errorf("UpdateRepositoryCols: %w", err) } } l, err = newCommit.CommitsBeforeLimit(10) if err != nil { - return fmt.Errorf("newCommit.CommitsBeforeLimit: %v", err) + return fmt.Errorf("newCommit.CommitsBeforeLimit: %w", err) } notification.NotifyCreateRef(pusher, repo, "branch", opts.RefFullName, opts.NewCommitID) } else { l, err = newCommit.CommitsBeforeUntil(opts.OldCommitID) if err != nil { - return fmt.Errorf("newCommit.CommitsBeforeUntil: %v", err) + return fmt.Errorf("newCommit.CommitsBeforeUntil: %w", err) } isForce, err := repo_module.IsForcePush(ctx, opts) @@ -277,12 +277,12 @@ func pushUpdates(optsList []*repo_module.PushUpdateOptions) error { } } if err := PushUpdateAddDeleteTags(repo, gitRepo, addTags, delTags); err != nil { - return fmt.Errorf("PushUpdateAddDeleteTags: %v", err) + return fmt.Errorf("PushUpdateAddDeleteTags: %w", err) } // Change repository last updated time. if err := repo_model.UpdateRepositoryUpdatedTime(repo.ID, time.Now()); err != nil { - return fmt.Errorf("UpdateRepositoryUpdatedTime: %v", err) + return fmt.Errorf("UpdateRepositoryUpdatedTime: %w", err) } return nil @@ -311,7 +311,7 @@ func pushUpdateAddTags(ctx context.Context, repo *repo_model.Repository, gitRepo releases, err := repo_model.GetReleasesByRepoIDAndNames(ctx, repo.ID, lowerTags) if err != nil { - return fmt.Errorf("GetReleasesByRepoIDAndNames: %v", err) + return fmt.Errorf("GetReleasesByRepoIDAndNames: %w", err) } relMap := make(map[string]*repo_model.Release) for _, rel := range releases { @@ -325,11 +325,11 @@ func pushUpdateAddTags(ctx context.Context, repo *repo_model.Repository, gitRepo for i, lowerTag := range lowerTags { tag, err := gitRepo.GetTag(tags[i]) if err != nil { - return fmt.Errorf("GetTag: %v", err) + return fmt.Errorf("GetTag: %w", err) } commit, err := tag.Commit(gitRepo) if err != nil { - return fmt.Errorf("Commit: %v", err) + return fmt.Errorf("Commit: %w", err) } sig := tag.Tagger @@ -348,7 +348,7 @@ func pushUpdateAddTags(ctx context.Context, repo *repo_model.Repository, gitRepo if !ok { author, err = user_model.GetUserByEmailContext(ctx, sig.Email) if err != nil && !user_model.IsErrUserNotExist(err) { - return fmt.Errorf("GetUserByEmail: %v", err) + return fmt.Errorf("GetUserByEmail: %w", err) } if author != nil { emailToUser[sig.Email] = author @@ -359,7 +359,7 @@ func pushUpdateAddTags(ctx context.Context, repo *repo_model.Repository, gitRepo commitsCount, err := commit.CommitsCount() if err != nil { - return fmt.Errorf("CommitsCount: %v", err) + return fmt.Errorf("CommitsCount: %w", err) } rel, has := relMap[lowerTag] @@ -393,14 +393,14 @@ func pushUpdateAddTags(ctx context.Context, repo *repo_model.Repository, gitRepo rel.PublisherID = author.ID } if err = repo_model.UpdateRelease(ctx, rel); err != nil { - return fmt.Errorf("Update: %v", err) + return fmt.Errorf("Update: %w", err) } } } if len(newReleases) > 0 { if err = db.Insert(ctx, newReleases); err != nil { - return fmt.Errorf("Insert: %v", err) + return fmt.Errorf("Insert: %w", err) } } diff --git a/services/repository/repository.go b/services/repository/repository.go index 47687d9a73..763ef74927 100644 --- a/services/repository/repository.go +++ b/services/repository/repository.go @@ -97,7 +97,7 @@ func UpdateRepository(repo *repo_model.Repository, visibilityChanged bool) (err defer committer.Close() if err = repo_module.UpdateRepository(ctx, repo, visibilityChanged); err != nil { - return fmt.Errorf("updateRepository: %v", err) + return fmt.Errorf("updateRepository: %w", err) } return committer.Commit() diff --git a/services/task/migrate.go b/services/task/migrate.go index 775cbf6128..faca6908a2 100644 --- a/services/task/migrate.go +++ b/services/task/migrate.go @@ -133,9 +133,9 @@ func runMigrateTask(t *admin_model.Task) (err error) { err = util.SanitizeErrorCredentialURLs(err) if strings.Contains(err.Error(), "Authentication failed") || strings.Contains(err.Error(), "could not read Username") { - return fmt.Errorf("Authentication failed: %v", err.Error()) + return fmt.Errorf("Authentication failed: %w", err) } else if strings.Contains(err.Error(), "fatal:") { - return fmt.Errorf("Migration failed: %v", err.Error()) + return fmt.Errorf("Migration failed: %w", err) } // do not be tempted to coalesce this line with the return diff --git a/services/user/user.go b/services/user/user.go index dab9ac61a4..c8b497a5c4 100644 --- a/services/user/user.go +++ b/services/user/user.go @@ -78,14 +78,14 @@ func DeleteUser(ctx context.Context, u *user_model.User, purge bool) error { Actor: u, }) if err != nil { - return fmt.Errorf("SearchRepositoryByName: %v", err) + return fmt.Errorf("SearchRepositoryByName: %w", err) } if len(repos) == 0 { break } for _, repo := range repos { if err := models.DeleteRepository(u, u.ID, repo.ID); err != nil { - return fmt.Errorf("unable to delete repository %s for %s[%d]. Error: %v", repo.Name, u.Name, u.ID, err) + return fmt.Errorf("unable to delete repository %s for %s[%d]. Error: %w", repo.Name, u.Name, u.ID, err) } } } @@ -107,7 +107,7 @@ func DeleteUser(ctx context.Context, u *user_model.User, purge bool) error { IncludePrivate: true, }) if err != nil { - return fmt.Errorf("unable to find org list for %s[%d]. Error: %v", u.Name, u.ID, err) + return fmt.Errorf("unable to find org list for %s[%d]. Error: %w", u.Name, u.ID, err) } if len(orgs) == 0 { break @@ -118,7 +118,7 @@ func DeleteUser(ctx context.Context, u *user_model.User, purge bool) error { err = organization.DeleteOrganization(ctx, org) } if err != nil { - return fmt.Errorf("unable to remove user %s[%d] from org %s[%d]. Error: %v", u.Name, u.ID, org.Name, org.ID, err) + return fmt.Errorf("unable to remove user %s[%d] from org %s[%d]. Error: %w", u.Name, u.ID, org.Name, org.ID, err) } } } @@ -145,7 +145,7 @@ func DeleteUser(ctx context.Context, u *user_model.User, purge bool) error { // Check ownership of repository. count, err := repo_model.CountRepositories(ctx, repo_model.CountRepositoryOptions{OwnerID: u.ID}) if err != nil { - return fmt.Errorf("GetRepositoryCount: %v", err) + return fmt.Errorf("GetRepositoryCount: %w", err) } else if count > 0 { return models.ErrUserOwnRepos{UID: u.ID} } @@ -153,20 +153,20 @@ func DeleteUser(ctx context.Context, u *user_model.User, purge bool) error { // Check membership of organization. count, err = organization.GetOrganizationCount(ctx, u) if err != nil { - return fmt.Errorf("GetOrganizationCount: %v", err) + return fmt.Errorf("GetOrganizationCount: %w", err) } else if count > 0 { return models.ErrUserHasOrgs{UID: u.ID} } // Check ownership of packages. if ownsPackages, err := packages_model.HasOwnerPackages(ctx, u.ID); err != nil { - return fmt.Errorf("HasOwnerPackages: %v", err) + return fmt.Errorf("HasOwnerPackages: %w", err) } else if ownsPackages { return models.ErrUserOwnPackages{UID: u.ID} } if err := models.DeleteUser(ctx, u, purge); err != nil { - return fmt.Errorf("DeleteUser: %v", err) + return fmt.Errorf("DeleteUser: %w", err) } if err := committer.Commit(); err != nil { @@ -185,7 +185,7 @@ func DeleteUser(ctx context.Context, u *user_model.User, purge bool) error { // so just keep error logs of those operations. path := user_model.UserPath(u.Name) if err := util.RemoveAll(path); err != nil { - err = fmt.Errorf("Failed to RemoveAll %s: %v", path, err) + err = fmt.Errorf("Failed to RemoveAll %s: %w", path, err) _ = system_model.CreateNotice(ctx, system_model.NoticeTask, fmt.Sprintf("delete user '%s': %v", u.Name, err)) return err } @@ -193,7 +193,7 @@ func DeleteUser(ctx context.Context, u *user_model.User, purge bool) error { if u.Avatar != "" { avatarPath := u.CustomAvatarRelativePath() if err := storage.Avatars.Delete(avatarPath); err != nil { - err = fmt.Errorf("Failed to remove %s: %v", avatarPath, err) + err = fmt.Errorf("Failed to remove %s: %w", avatarPath, err) _ = system_model.CreateNotice(ctx, system_model.NoticeTask, fmt.Sprintf("delete user '%s': %v", u.Name, err)) return err } @@ -248,7 +248,7 @@ func UploadAvatar(u *user_model.User, data []byte) error { // Other users will lose their avatars too. u.Avatar = fmt.Sprintf("%x", md5.Sum([]byte(fmt.Sprintf("%d-%x", u.ID, md5.Sum(data))))) if err = user_model.UpdateUserCols(ctx, u, "use_custom_avatar", "avatar"); err != nil { - return fmt.Errorf("updateUser: %v", err) + return fmt.Errorf("updateUser: %w", err) } if err := storage.SaveFrom(storage.Avatars, u.CustomAvatarRelativePath(), func(w io.Writer) error { @@ -257,7 +257,7 @@ func UploadAvatar(u *user_model.User, data []byte) error { } return err }); err != nil { - return fmt.Errorf("Failed to create dir %s: %v", u.CustomAvatarRelativePath(), err) + return fmt.Errorf("Failed to create dir %s: %w", u.CustomAvatarRelativePath(), err) } return committer.Commit() @@ -269,14 +269,14 @@ func DeleteAvatar(u *user_model.User) error { log.Trace("DeleteAvatar[%d]: %s", u.ID, aPath) if len(u.Avatar) > 0 { if err := storage.Avatars.Delete(aPath); err != nil { - return fmt.Errorf("Failed to remove %s: %v", aPath, err) + return fmt.Errorf("Failed to remove %s: %w", aPath, err) } } u.UseCustomAvatar = false u.Avatar = "" if _, err := db.GetEngine(db.DefaultContext).ID(u.ID).Cols("avatar, use_custom_avatar").Update(u); err != nil { - return fmt.Errorf("UpdateUser: %v", err) + return fmt.Errorf("UpdateUser: %w", err) } return nil } diff --git a/services/webhook/webhook.go b/services/webhook/webhook.go index e877e16eda..342e764f4d 100644 --- a/services/webhook/webhook.go +++ b/services/webhook/webhook.go @@ -190,7 +190,7 @@ func PrepareWebhook(ctx context.Context, w *webhook_model.Webhook, event webhook if ok { payloader, err = webhook.payloadCreator(p, event, w.Meta) if err != nil { - return fmt.Errorf("create payload for %s[%s]: %v", w.Type, event, err) + return fmt.Errorf("create payload for %s[%s]: %w", w.Type, event, err) } } else { payloader = p @@ -202,7 +202,7 @@ func PrepareWebhook(ctx context.Context, w *webhook_model.Webhook, event webhook EventType: event, }) if err != nil { - return fmt.Errorf("CreateHookTask: %v", err) + return fmt.Errorf("CreateHookTask: %w", err) } return enqueueHookTask(task) @@ -220,7 +220,7 @@ func PrepareWebhooks(ctx context.Context, source EventSource, event webhook_mode IsActive: util.OptionalBoolTrue, }) if err != nil { - return fmt.Errorf("ListWebhooksByOpts: %v", err) + return fmt.Errorf("ListWebhooksByOpts: %w", err) } ws = append(ws, repoHooks...) @@ -234,7 +234,7 @@ func PrepareWebhooks(ctx context.Context, source EventSource, event webhook_mode IsActive: util.OptionalBoolTrue, }) if err != nil { - return fmt.Errorf("ListWebhooksByOpts: %v", err) + return fmt.Errorf("ListWebhooksByOpts: %w", err) } ws = append(ws, orgHooks...) } @@ -242,7 +242,7 @@ func PrepareWebhooks(ctx context.Context, source EventSource, event webhook_mode // Add any admin-defined system webhooks systemHooks, err := webhook_model.GetSystemWebhooks(ctx, util.OptionalBoolTrue) if err != nil { - return fmt.Errorf("GetSystemWebhooks: %v", err) + return fmt.Errorf("GetSystemWebhooks: %w", err) } ws = append(ws, systemHooks...) diff --git a/services/wiki/wiki.go b/services/wiki/wiki.go index 8faada4d59..f6986cff86 100644 --- a/services/wiki/wiki.go +++ b/services/wiki/wiki.go @@ -83,11 +83,11 @@ func InitWiki(ctx context.Context, repo *repo_model.Repository) error { } if err := git.InitRepository(ctx, repo.WikiPath(), true); err != nil { - return fmt.Errorf("InitRepository: %v", err) + return fmt.Errorf("InitRepository: %w", err) } else if err = repo_module.CreateDelegateHooks(repo.WikiPath()); err != nil { - return fmt.Errorf("createDelegateHooks: %v", err) + return fmt.Errorf("createDelegateHooks: %w", err) } else if _, _, err = git.NewCommand(ctx, "symbolic-ref", "HEAD", git.BranchPrefix+DefaultBranch).RunStdString(&git.RunOpts{Dir: repo.WikiPath()}); err != nil { - return fmt.Errorf("unable to set default wiki branch to master: %v", err) + return fmt.Errorf("unable to set default wiki branch to master: %w", err) } return nil } @@ -132,7 +132,7 @@ func updateWikiPage(ctx context.Context, doer *user_model.User, repo *repo_model defer wikiWorkingPool.CheckOut(fmt.Sprint(repo.ID)) if err = InitWiki(ctx, repo); err != nil { - return fmt.Errorf("InitWiki: %v", err) + return fmt.Errorf("InitWiki: %w", err) } hasMasterBranch := git.IsBranchExist(ctx, repo.WikiPath(), DefaultBranch) @@ -158,20 +158,20 @@ func updateWikiPage(ctx context.Context, doer *user_model.User, repo *repo_model if err := git.Clone(ctx, repo.WikiPath(), basePath, cloneOpts); err != nil { log.Error("Failed to clone repository: %s (%v)", repo.FullName(), err) - return fmt.Errorf("Failed to clone repository: %s (%v)", repo.FullName(), err) + return fmt.Errorf("Failed to clone repository: %s (%w)", repo.FullName(), err) } gitRepo, err := git.OpenRepository(ctx, basePath) if err != nil { log.Error("Unable to open temporary repository: %s (%v)", basePath, err) - return fmt.Errorf("Failed to open new temporary repository in: %s %v", basePath, err) + return fmt.Errorf("Failed to open new temporary repository in: %s %w", basePath, err) } defer gitRepo.Close() if hasMasterBranch { if err := gitRepo.ReadTreeToIndex("HEAD"); err != nil { log.Error("Unable to read HEAD tree to index in: %s %v", basePath, err) - return fmt.Errorf("Unable to read HEAD tree to index in: %s %v", basePath, err) + return fmt.Errorf("Unable to read HEAD tree to index in: %s %w", basePath, err) } } @@ -265,7 +265,7 @@ func updateWikiPage(ctx context.Context, doer *user_model.User, repo *repo_model if git.IsErrPushOutOfDate(err) || git.IsErrPushRejected(err) { return err } - return fmt.Errorf("Push: %v", err) + return fmt.Errorf("Push: %w", err) } return nil @@ -288,7 +288,7 @@ func DeleteWikiPage(ctx context.Context, doer *user_model.User, repo *repo_model defer wikiWorkingPool.CheckOut(fmt.Sprint(repo.ID)) if err = InitWiki(ctx, repo); err != nil { - return fmt.Errorf("InitWiki: %v", err) + return fmt.Errorf("InitWiki: %w", err) } basePath, err := repo_module.CreateTemporaryPath("update-wiki") @@ -307,19 +307,19 @@ func DeleteWikiPage(ctx context.Context, doer *user_model.User, repo *repo_model Branch: DefaultBranch, }); err != nil { log.Error("Failed to clone repository: %s (%v)", repo.FullName(), err) - return fmt.Errorf("Failed to clone repository: %s (%v)", repo.FullName(), err) + return fmt.Errorf("Failed to clone repository: %s (%w)", repo.FullName(), err) } gitRepo, err := git.OpenRepository(ctx, basePath) if err != nil { log.Error("Unable to open temporary repository: %s (%v)", basePath, err) - return fmt.Errorf("Failed to open new temporary repository in: %s %v", basePath, err) + return fmt.Errorf("Failed to open new temporary repository in: %s %w", basePath, err) } defer gitRepo.Close() if err := gitRepo.ReadTreeToIndex("HEAD"); err != nil { log.Error("Unable to read HEAD tree to index in: %s %v", basePath, err) - return fmt.Errorf("Unable to read HEAD tree to index in: %s %v", basePath, err) + return fmt.Errorf("Unable to read HEAD tree to index in: %s %w", basePath, err) } found, wikiPath, err := prepareWikiFileName(gitRepo, wikiName) @@ -372,7 +372,7 @@ func DeleteWikiPage(ctx context.Context, doer *user_model.User, repo *repo_model if git.IsErrPushOutOfDate(err) || git.IsErrPushRejected(err) { return err } - return fmt.Errorf("Push: %v", err) + return fmt.Errorf("Push: %w", err) } return nil diff --git a/templates/repo/branch/list.tmpl b/templates/repo/branch/list.tmpl index 3702410df5..abce6591bd 100644 --- a/templates/repo/branch/list.tmpl +++ b/templates/repo/branch/list.tmpl @@ -106,7 +106,7 @@ {{end}} {{end}} - + {{if and $.IsWriter (not $.Repository.IsArchived) (not .IsDeleted)}}