Ver Fonte

chore: replace pkg/errors with cockroachdb/errors (#8098)

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: unknwon <2946214+unknwon@users.noreply.github.com>
Copilot há 2 semanas atrás
pai
commit
4ee706b2bf
96 ficheiros alterados com 605 adições e 564 exclusões
  1. 9 1
      go.mod
  2. 24 0
      go.sum
  3. 1 1
      internal/auth/auth.go
  4. 1 1
      internal/auth/github/config.go
  5. 3 2
      internal/auth/ldap/config.go
  6. 1 1
      internal/auth/pam/pam.go
  7. 1 1
      internal/auth/pam/pam_stub.go
  8. 1 1
      internal/auth/smtp/config.go
  9. 1 1
      internal/auth/smtp/provider.go
  10. 2 2
      internal/avatar/avatar.go
  11. 2 2
      internal/cmd/admin.go
  12. 1 1
      internal/cmd/backup.go
  13. 5 5
      internal/cmd/import.go
  14. 1 1
      internal/cmd/restore.go
  15. 2 3
      internal/conf/conf.go
  16. 1 1
      internal/conf/log.go
  17. 1 1
      internal/conf/utils.go
  18. 1 1
      internal/context/api.go
  19. 1 1
      internal/context/auth.go
  20. 1 1
      internal/context/repo.go
  21. 2 1
      internal/cryptoutil/aes.go
  22. 1 1
      internal/database/access_tokens.go
  23. 1 1
      internal/database/actions.go
  24. 5 4
      internal/database/attachment.go
  25. 9 9
      internal/database/backup.go
  26. 1 1
      internal/database/backup_test.go
  27. 14 13
      internal/database/comment.go
  28. 1 1
      internal/database/database.go
  29. 34 34
      internal/database/issue.go
  30. 8 7
      internal/database/issue_label.go
  31. 5 5
      internal/database/issue_mail.go
  32. 1 1
      internal/database/lfs.go
  33. 2 2
      internal/database/login_source_files.go
  34. 2 2
      internal/database/login_sources.go
  35. 1 1
      internal/database/migrations/migrations.go
  36. 1 1
      internal/database/migrations/v20.go
  37. 2 1
      internal/database/milestone.go
  38. 3 2
      internal/database/mirror.go
  39. 7 7
      internal/database/models.go
  40. 19 20
      internal/database/org.go
  41. 13 13
      internal/database/org_team.go
  42. 1 1
      internal/database/organizations.go
  43. 1 1
      internal/database/permissions.go
  44. 1 1
      internal/database/public_keys.go
  45. 40 39
      internal/database/pull.go
  46. 21 20
      internal/database/release.go
  47. 114 114
      internal/database/repo.go
  48. 14 13
      internal/database/repo_branch.go
  49. 8 9
      internal/database/repo_collaboration.go
  50. 43 43
      internal/database/repo_editor.go
  51. 4 5
      internal/database/repo_tag.go
  52. 1 1
      internal/database/repositories.go
  53. 1 1
      internal/database/schemadoc/main.go
  54. 25 25
      internal/database/ssh_key.go
  55. 10 9
      internal/database/two_factor.go
  56. 1 1
      internal/database/two_factors.go
  57. 10 11
      internal/database/update.go
  58. 2 2
      internal/database/users.go
  59. 8 7
      internal/database/webhook.go
  60. 1 1
      internal/database/webhook_dingtalk.go
  61. 2 2
      internal/database/webhook_discord.go
  62. 2 2
      internal/database/webhook_slack.go
  63. 15 15
      internal/database/wiki.go
  64. 1 1
      internal/dbutil/dsn.go
  65. 11 11
      internal/email/message.go
  66. 1 1
      internal/errutil/errutil_test.go
  67. 3 3
      internal/gitutil/diff.go
  68. 1 1
      internal/gitutil/error.go
  69. 2 3
      internal/gitutil/pull_request.go
  70. 12 13
      internal/gitutil/pull_request_test.go
  71. 1 1
      internal/gitutil/tag.go
  72. 1 1
      internal/lfsutil/oid.go
  73. 1 1
      internal/lfsutil/storage.go
  74. 2 3
      internal/process/manager.go
  75. 1 1
      internal/route/api/v1/repo/contents.go
  76. 1 1
      internal/route/api/v1/repo/hook.go
  77. 3 3
      internal/route/api/v1/repo/issue.go
  78. 1 1
      internal/route/api/v1/repo/key.go
  79. 1 1
      internal/route/api/v1/repo/repo.go
  80. 1 1
      internal/route/api/v1/user/email.go
  81. 1 1
      internal/route/api/v1/user/key.go
  82. 1 1
      internal/route/install.go
  83. 3 3
      internal/route/repo/download.go
  84. 1 1
      internal/route/repo/editor.go
  85. 1 1
      internal/route/repo/issue.go
  86. 3 3
      internal/route/repo/release.go
  87. 5 5
      internal/route/repo/setting.go
  88. 1 1
      internal/route/repo/webhook.go
  89. 2 2
      internal/route/user/auth.go
  90. 3 3
      internal/route/user/setting.go
  91. 1 1
      internal/ssh/ssh.go
  92. 2 1
      internal/template/template.go
  93. 3 3
      internal/testutil/exec.go
  94. 14 10
      internal/testutil/exec_test.go
  95. 1 1
      internal/userutil/userutil.go
  96. 2 2
      templates/embed.go

+ 9 - 1
go.mod

@@ -4,6 +4,7 @@ go 1.25.0
 
 require (
 	github.com/Masterminds/semver/v3 v3.4.0
+	github.com/cockroachdb/errors v1.12.0
 	github.com/derision-test/go-mockgen/v2 v2.1.1
 	github.com/editorconfig/editorconfig-core-go/v2 v2.6.3
 	github.com/go-ldap/ldap/v3 v3.4.11
@@ -30,7 +31,6 @@ require (
 	github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646
 	github.com/niklasfasching/go-org v1.9.1
 	github.com/olekukonko/tablewriter v0.0.5
-	github.com/pkg/errors v0.9.1
 	github.com/pquerna/otp v1.5.0
 	github.com/prometheus/client_golang v1.23.0
 	github.com/russross/blackfriday v1.6.0
@@ -70,6 +70,8 @@ require (
 	github.com/boombuler/barcode v1.0.1-0.20190219062509-6c824513bacc // indirect
 	github.com/bradfitz/gomemcache v0.0.0-20190329173943-551aad21a668 // indirect
 	github.com/cespare/xxhash/v2 v2.3.0 // indirect
+	github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect
+	github.com/cockroachdb/redact v1.1.5 // indirect
 	github.com/cpuguy83/go-md2man/v2 v2.0.7 // indirect
 	github.com/davecgh/go-spew v1.1.1 // indirect
 	github.com/denisenkom/go-mssqldb v0.12.0 // indirect
@@ -78,12 +80,14 @@ require (
 	github.com/djherbis/nio/v3 v3.0.1 // indirect
 	github.com/dustin/go-humanize v1.0.1 // indirect
 	github.com/fatih/color v1.13.0 // indirect
+	github.com/getsentry/sentry-go v0.27.0 // indirect
 	github.com/go-asn1-ber/asn1-ber v1.5.8-0.20250403174932-29230038a667 // indirect
 	github.com/go-logr/logr v1.2.3 // indirect
 	github.com/go-logr/stdr v1.2.2 // indirect
 	github.com/go-macaron/inject v0.0.0-20200308113650-138e5925c53b // indirect
 	github.com/go-redis/redis/v8 v8.11.5 // indirect
 	github.com/go-sql-driver/mysql v1.7.0 // indirect
+	github.com/gogo/protobuf v1.3.2 // indirect
 	github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 // indirect
 	github.com/golang-sql/sqlexp v0.1.0 // indirect
 	github.com/google/go-querystring v1.0.0 // indirect
@@ -98,6 +102,8 @@ require (
 	github.com/jinzhu/inflection v1.0.0 // indirect
 	github.com/jinzhu/now v1.1.5 // indirect
 	github.com/klauspost/compress v1.18.0 // indirect
+	github.com/kr/pretty v0.3.1 // indirect
+	github.com/kr/text v0.2.0 // indirect
 	github.com/lib/pq v1.10.2 // indirect
 	github.com/mattn/go-colorable v0.1.13 // indirect
 	github.com/mattn/go-isatty v0.0.20 // indirect
@@ -109,12 +115,14 @@ require (
 	github.com/modern-go/reflect2 v1.0.2 // indirect
 	github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
 	github.com/ncruces/go-strftime v0.1.9 // indirect
+	github.com/pkg/errors v0.9.1 // indirect
 	github.com/pmezard/go-difflib v1.0.0 // indirect
 	github.com/prometheus/client_model v0.6.2 // indirect
 	github.com/prometheus/common v0.65.0 // indirect
 	github.com/prometheus/procfs v0.16.1 // indirect
 	github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect
 	github.com/rivo/uniseg v0.2.0 // indirect
+	github.com/rogpeppe/go-internal v1.10.0 // indirect
 	github.com/russross/blackfriday/v2 v2.1.0 // indirect
 	github.com/saintfish/chardet v0.0.0-20120816061221-3af4cd4741ca // indirect
 	github.com/ssor/bom v0.0.0-20170718123548-6386211fdfcf // indirect

+ 24 - 0
go.sum

@@ -41,6 +41,12 @@ github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWR
 github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
 github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
 github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
+github.com/cockroachdb/errors v1.12.0 h1:d7oCs6vuIMUQRVbi6jWWWEJZahLCfJpnJSVobd1/sUo=
+github.com/cockroachdb/errors v1.12.0/go.mod h1:SvzfYNNBshAVbZ8wzNc/UPK3w1vf0dKDUP41ucAIf7g=
+github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE=
+github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs=
+github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30=
+github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg=
 github.com/couchbase/go-couchbase v0.0.0-20201026062457-7b3be89bbd89/go.mod h1:+/bddYDxXsf9qt0xpDUtRR47A2GjaXmGGAqQ/k3GJ8A=
 github.com/couchbase/gomemcached v0.0.0-20190515232915-c4b4ca0eb21d/go.mod h1:srVSlQLB8iXBVXHgnqemxUXqN6FCvClgCMPCsjBDR7c=
 github.com/couchbase/gomemcached v0.1.1/go.mod h1:mxliKQxOv84gQ0bJWbI+w9Wxdpt9HjDvgW9MjCym5Vo=
@@ -49,6 +55,7 @@ github.com/couchbase/goutils v0.0.0-20201030094643-5e82bb967e67/go.mod h1:BQwMFl
 github.com/couchbaselabs/go-couchbase v0.0.0-20190708161019-23e7ca2ce2b7/go.mod h1:mby/05p8HE5yHEAKiIH/555NoblMs7PtW6NrYshDruc=
 github.com/cpuguy83/go-md2man/v2 v2.0.7 h1:zbFlGlXEAKlwXpmvle3d8Oe3YnkKIK4xSRTd3sHPnBo=
 github.com/cpuguy83/go-md2man/v2 v2.0.7/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
+github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
 github.com/cupcake/rdb v0.0.0-20161107195141-43ba34106c76/go.mod h1:vYwsqCOLxGiisLwp9rITslkFNpZD5rz43tf41QFkTWY=
 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
@@ -83,8 +90,12 @@ github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUork
 github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
 github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
 github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
+github.com/getsentry/sentry-go v0.27.0 h1:Pv98CIbtB3LkMWmXi4Joa5OOcwbmnX88sF5qbK3r3Ps=
+github.com/getsentry/sentry-go v0.27.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY=
 github.com/go-asn1-ber/asn1-ber v1.5.8-0.20250403174932-29230038a667 h1:BP4M0CvQ4S3TGls2FvczZtj5Re/2ZzkV9VwqPHH/3Bo=
 github.com/go-asn1-ber/asn1-ber v1.5.8-0.20250403174932-29230038a667/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0=
+github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA=
+github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og=
 github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
 github.com/go-ldap/ldap/v3 v3.4.11 h1:4k0Yxweg+a3OyBLjdYn5OKglv18JNvfDykSoI8bW0gU=
 github.com/go-ldap/ldap/v3 v3.4.11/go.mod h1:bY7t0FLK8OAVpp/vV6sSlpz3EQDGcQwc8pF0ujLgKvM=
@@ -125,6 +136,8 @@ github.com/go-xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a h1:9wScpmSP5A3Bk
 github.com/go-xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a/go.mod h1:56xuuqnHyryaerycW3BfssRdxQstACi0Epw/yC5E2xM=
 github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
 github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
+github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
+github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
 github.com/gogs/chardet v0.0.0-20150115103509-2404f7772561 h1:aBzukfDxQlCTVS0NBUjI5YA3iVeaZ9Tb5PxNrrIP1xs=
 github.com/gogs/chardet v0.0.0-20150115103509-2404f7772561/go.mod h1:Pcatq5tYkCW2Q6yrR2VRHlbHpZ/R4/7qyL1TCF7vl14=
 github.com/gogs/cron v0.0.0-20171120032916-9f6c956d3e14 h1:yXtpJr/LV6PFu4nTLgfjQdcMdzjbqqXMEnHfq0Or6p8=
@@ -247,6 +260,7 @@ github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVY
 github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
 github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
 github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
+github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
 github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
 github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo=
 github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ=
@@ -339,9 +353,12 @@ github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJ
 github.com/pelletier/go-toml v1.4.0/go.mod h1:PN7xzY2wHTK0K9p34ErDQMlFxa51Fk0OUruD3k1mMwo=
 github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc=
 github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
+github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4=
+github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8=
 github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4/go.mod h1:4OwLy04Bl9Ef3GJJCoec+30X3LQs/0/m4HFRt/2LUSA=
 github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4/go.mod h1:N6UoU20jOqggOuDwUaBQpluzLNDqif3kq9z2wpdYEfQ=
 github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI=
+github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
 github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
@@ -370,6 +387,7 @@ github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94
 github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
 github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY=
 github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
+github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
 github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=
 github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog=
 github.com/russross/blackfriday v1.6.0 h1:KqfZb0pUVN2lYqZUYRddxF4OR8ZMURnJIG5Y3VRLtww=
@@ -428,6 +446,7 @@ github.com/unknwon/paginater v0.0.0-20170405233947-45e5d631308e h1:Qf3QQl/zmEbWD
 github.com/unknwon/paginater v0.0.0-20170405233947-45e5d631308e/go.mod h1:TBwoao3Q4Eb/cp+dHbXDfRTrZSsj/k7kLr2j1oWRWC0=
 github.com/urfave/cli v1.22.17 h1:SYzXoiPfQjHBbkYxbew5prZHS1TOLT3ierW8SYLqtVQ=
 github.com/urfave/cli v1.22.17/go.mod h1:b0ht0aqgH/6pBYzzxURyrM4xXNgsoT/n2ZzwQiEhNVo=
+github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 github.com/ziutek/mymysql v1.5.4 h1:GB0qdRGsTwQSBVYuVShFBKaXSnSnYYC2d9knnE1LHFs=
 github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wKdgO/C0=
@@ -461,6 +480,7 @@ golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b/go.mod h1:3//PLf8L/X+8b4vuAf
 golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
 golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
 golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
+golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA=
 golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w=
@@ -476,6 +496,7 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn
 golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
 golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
 golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
 golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
@@ -492,6 +513,7 @@ golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJ
 golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.9.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
 golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I=
@@ -552,7 +574,9 @@ golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3
 golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
 golang.org/x/tools v0.0.0-20190802220118-1d1727260058/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI=
 golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
+golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
 golang.org/x/tools v0.38.0 h1:Hx2Xv8hISq8Lm16jvBZ2VQf+RLmbd7wVUsALibYI/IQ=
 golang.org/x/tools v0.38.0/go.mod h1:yEsQ/d/YK8cjh0L6rZlY8tgtlKiBNTL14pGDJPJpYQs=
 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=

+ 1 - 1
internal/auth/auth.go

@@ -3,7 +3,7 @@ package auth
 import (
 	"fmt"
 
-	"github.com/pkg/errors"
+	"github.com/cockroachdb/errors"
 
 	"gogs.io/gogs/internal/errutil"
 )

+ 1 - 1
internal/auth/github/config.go

@@ -6,8 +6,8 @@ import (
 	"net/http"
 	"strings"
 
+	"github.com/cockroachdb/errors"
 	"github.com/google/go-github/github"
-	"github.com/pkg/errors"
 )
 
 // Config contains configuration for GitHub authentication.

+ 3 - 2
internal/auth/ldap/config.go

@@ -7,6 +7,7 @@ import (
 	"fmt"
 	"strings"
 
+	"github.com/cockroachdb/errors"
 	"github.com/go-ldap/ldap/v3"
 	log "unknwon.dev/clog/v2"
 )
@@ -162,13 +163,13 @@ func dial(ls *Config) (*ldap.Conn, error) {
 
 	conn, err := ldap.Dial("tcp", fmt.Sprintf("%s:%d", ls.Host, ls.Port))
 	if err != nil {
-		return nil, fmt.Errorf("dial: %v", err)
+		return nil, errors.Newf("dial: %v", err)
 	}
 
 	if ls.SecurityProtocol == SecurityProtocolStartTLS {
 		if err = conn.StartTLS(tlsCfg); err != nil {
 			conn.Close()
-			return nil, fmt.Errorf("StartTLS: %v", err)
+			return nil, errors.Newf("StartTLS: %v", err)
 		}
 	}
 

+ 1 - 1
internal/auth/pam/pam.go

@@ -3,8 +3,8 @@
 package pam
 
 import (
+	"github.com/cockroachdb/errors"
 	"github.com/msteinert/pam"
-	"github.com/pkg/errors"
 )
 
 func (c *Config) doAuth(login, password string) error {

+ 1 - 1
internal/auth/pam/pam_stub.go

@@ -3,7 +3,7 @@
 package pam
 
 import (
-	"github.com/pkg/errors"
+	"github.com/cockroachdb/errors"
 )
 
 func (*Config) doAuth(_, _ string) error {

+ 1 - 1
internal/auth/smtp/config.go

@@ -5,7 +5,7 @@ import (
 	"fmt"
 	"net/smtp"
 
-	"github.com/pkg/errors"
+	"github.com/cockroachdb/errors"
 )
 
 // Config contains configuration for SMTP authentication.

+ 1 - 1
internal/auth/smtp/provider.go

@@ -5,7 +5,7 @@ import (
 	"net/textproto"
 	"strings"
 
-	"github.com/pkg/errors"
+	"github.com/cockroachdb/errors"
 	log "unknwon.dev/clog/v2"
 
 	"gogs.io/gogs/internal/auth"

+ 2 - 2
internal/avatar/avatar.go

@@ -1,12 +1,12 @@
 package avatar
 
 import (
-	"fmt"
 	"image"
 	"image/color/palette"
 	"math/rand"
 	"time"
 
+	"github.com/cockroachdb/errors"
 	"github.com/issue9/identicon"
 )
 
@@ -27,7 +27,7 @@ func RandomImageWithSize(size int, data []byte) (image.Image, error) {
 	imgMaker, err := identicon.New(size,
 		palette.WebSafe[backColorIndex], palette.WebSafe[colorIndex:colorIndex+32]...)
 	if err != nil {
-		return nil, fmt.Errorf("identicon.New: %v", err)
+		return nil, errors.Newf("identicon.New: %v", err)
 	}
 	return imgMaker.Make(data), nil
 }

+ 2 - 2
internal/cmd/admin.go

@@ -6,7 +6,7 @@ import (
 	"reflect"
 	"runtime"
 
-	"github.com/pkg/errors"
+	"github.com/cockroachdb/errors"
 	"github.com/urfave/cli"
 
 	"gogs.io/gogs/internal/conf"
@@ -180,7 +180,7 @@ func adminDashboardOperation(operation func() error, successMessage string) func
 
 		if err := operation(); err != nil {
 			functionName := runtime.FuncForPC(reflect.ValueOf(operation).Pointer()).Name()
-			return fmt.Errorf("%s: %v", functionName, err)
+			return errors.Newf("%s: %v", functionName, err)
 		}
 
 		fmt.Printf("%s\n", successMessage)

+ 1 - 1
internal/cmd/backup.go

@@ -9,7 +9,7 @@ import (
 	"strconv"
 	"time"
 
-	"github.com/pkg/errors"
+	"github.com/cockroachdb/errors"
 	"github.com/unknwon/cae/zip"
 	"github.com/urfave/cli"
 	"gopkg.in/ini.v1"

+ 5 - 5
internal/cmd/import.go

@@ -8,7 +8,7 @@ import (
 	"path/filepath"
 	"time"
 
-	"github.com/pkg/errors"
+	"github.com/cockroachdb/errors"
 	"github.com/unknwon/com"
 	"github.com/urfave/cli"
 
@@ -45,9 +45,9 @@ func runImportLocale(c *cli.Context) error {
 		return errors.New("target directory is not specified")
 	}
 	if !com.IsDir(c.String("source")) {
-		return fmt.Errorf("source directory %q does not exist or is not a directory", c.String("source"))
+		return errors.Newf("source directory %q does not exist or is not a directory", c.String("source"))
 	} else if !com.IsDir(c.String("target")) {
-		return fmt.Errorf("target directory %q does not exist or is not a directory", c.String("target"))
+		return errors.Newf("target directory %q does not exist or is not a directory", c.String("target"))
 	}
 
 	err := conf.Init(c.String("config"))
@@ -74,12 +74,12 @@ func runImportLocale(c *cli.Context) error {
 		// this breaks INI parser, we need to fix that.
 		sr, err := os.Open(source)
 		if err != nil {
-			return fmt.Errorf("open: %v", err)
+			return errors.Newf("open: %v", err)
 		}
 
 		tw, err := os.Create(target)
 		if err != nil {
-			return fmt.Errorf("create: %v", err)
+			return errors.Newf("create: %v", err)
 		}
 
 		scanner := bufio.NewScanner(sr)

+ 1 - 1
internal/cmd/restore.go

@@ -6,7 +6,7 @@ import (
 	"path"
 	"path/filepath"
 
-	"github.com/pkg/errors"
+	"github.com/cockroachdb/errors"
 	"github.com/unknwon/cae/zip"
 	"github.com/urfave/cli"
 	"gopkg.in/ini.v1"

+ 2 - 3
internal/conf/conf.go

@@ -1,7 +1,6 @@
 package conf
 
 import (
-	"fmt"
 	"net/mail"
 	"net/url"
 	"os"
@@ -10,11 +9,11 @@ import (
 	"strings"
 	"time"
 
+	"github.com/cockroachdb/errors"
 	_ "github.com/go-macaron/cache/memcache"
 	_ "github.com/go-macaron/cache/redis"
 	_ "github.com/go-macaron/session/redis"
 	"github.com/gogs/go-libravatar"
-	"github.com/pkg/errors"
 	"gopkg.in/ini.v1"
 	log "unknwon.dev/clog/v2"
 
@@ -189,7 +188,7 @@ func Init(customConf string) error {
 	if Security.InstallLock {
 		currentUser, match := CheckRunUser(App.RunUser)
 		if !match {
-			return fmt.Errorf("user configured to run Gogs is %q, but the current user is %q", App.RunUser, currentUser)
+			return errors.Newf("user configured to run Gogs is %q, but the current user is %q", App.RunUser, currentUser)
 		}
 	}
 

+ 1 - 1
internal/conf/log.go

@@ -5,7 +5,7 @@ import (
 	"path/filepath"
 	"strings"
 
-	"github.com/pkg/errors"
+	"github.com/cockroachdb/errors"
 	"gopkg.in/ini.v1"
 	log "unknwon.dev/clog/v2"
 )

+ 1 - 1
internal/conf/utils.go

@@ -4,7 +4,7 @@ import (
 	"path/filepath"
 	"strings"
 
-	"github.com/pkg/errors"
+	"github.com/cockroachdb/errors"
 
 	"gogs.io/gogs/internal/osutil"
 	"gogs.io/gogs/internal/process"

+ 1 - 1
internal/context/api.go

@@ -5,7 +5,7 @@ import (
 	"net/http"
 	"strings"
 
-	"github.com/pkg/errors"
+	"github.com/cockroachdb/errors"
 	"github.com/unknwon/paginater"
 	"gopkg.in/macaron.v1"
 	log "unknwon.dev/clog/v2"

+ 1 - 1
internal/context/auth.go

@@ -6,9 +6,9 @@ import (
 	"net/url"
 	"strings"
 
+	"github.com/cockroachdb/errors"
 	"github.com/go-macaron/csrf"
 	"github.com/go-macaron/session"
-	"github.com/pkg/errors"
 	gouuid "github.com/satori/go.uuid"
 	"gopkg.in/macaron.v1"
 	log "unknwon.dev/clog/v2"

+ 1 - 1
internal/context/repo.go

@@ -6,8 +6,8 @@ import (
 	"net/url"
 	"strings"
 
+	"github.com/cockroachdb/errors"
 	"github.com/editorconfig/editorconfig-core-go/v2"
-	"github.com/pkg/errors"
 	"gopkg.in/macaron.v1"
 
 	"github.com/gogs/git-module"

+ 2 - 1
internal/cryptoutil/aes.go

@@ -4,7 +4,8 @@ import (
 	"crypto/aes"
 	"crypto/cipher"
 	"crypto/rand"
-	"errors"
+
+	"github.com/cockroachdb/errors"
 )
 
 // AESGCMEncrypt encrypts plaintext with the given key using AES in GCM mode.

+ 1 - 1
internal/database/access_tokens.go

@@ -5,7 +5,7 @@ import (
 	"fmt"
 	"time"
 
-	"github.com/pkg/errors"
+	"github.com/cockroachdb/errors"
 	gouuid "github.com/satori/go.uuid"
 	"gorm.io/gorm"
 

+ 1 - 1
internal/database/actions.go

@@ -9,10 +9,10 @@ import (
 	"time"
 	"unicode"
 
+	"github.com/cockroachdb/errors"
 	"github.com/gogs/git-module"
 	api "github.com/gogs/go-gogs-client"
 	jsoniter "github.com/json-iterator/go"
-	"github.com/pkg/errors"
 	"gorm.io/gorm"
 	log "unknwon.dev/clog/v2"
 

+ 5 - 4
internal/database/attachment.go

@@ -8,6 +8,7 @@ import (
 	"path"
 	"time"
 
+	"github.com/cockroachdb/errors"
 	gouuid "github.com/satori/go.uuid"
 	"xorm.io/xorm"
 
@@ -58,19 +59,19 @@ func NewAttachment(name string, buf []byte, file multipart.File) (_ *Attachment,
 
 	localPath := attach.LocalPath()
 	if err = os.MkdirAll(path.Dir(localPath), os.ModePerm); err != nil {
-		return nil, fmt.Errorf("MkdirAll: %v", err)
+		return nil, errors.Newf("MkdirAll: %v", err)
 	}
 
 	fw, err := os.Create(localPath)
 	if err != nil {
-		return nil, fmt.Errorf("Create: %v", err)
+		return nil, errors.Newf("Create: %v", err)
 	}
 	defer fw.Close()
 
 	if _, err = fw.Write(buf); err != nil {
-		return nil, fmt.Errorf("write: %v", err)
+		return nil, errors.Newf("write: %v", err)
 	} else if _, err = io.Copy(fw, file); err != nil {
-		return nil, fmt.Errorf("copy: %v", err)
+		return nil, errors.Newf("copy: %v", err)
 	}
 
 	if _, err := x.Insert(attach); err != nil {

+ 9 - 9
internal/database/backup.go

@@ -12,8 +12,8 @@ import (
 	"strings"
 	"sync"
 
+	"github.com/cockroachdb/errors"
 	jsoniter "github.com/json-iterator/go"
-	"github.com/pkg/errors"
 	"gorm.io/gorm"
 	"gorm.io/gorm/schema"
 	log "unknwon.dev/clog/v2"
@@ -125,14 +125,14 @@ func dumpLegacyTables(ctx context.Context, dirPath string, verbose bool) error {
 		tableFile := filepath.Join(dirPath, tableName+".json")
 		f, err := os.Create(tableFile)
 		if err != nil {
-			return fmt.Errorf("create JSON file: %v", err)
+			return errors.Newf("create JSON file: %v", err)
 		}
 
 		if err = x.Context(ctx).Asc("id").Iterate(table, func(idx int, bean any) (err error) {
 			return jsoniter.NewEncoder(f).Encode(bean)
 		}); err != nil {
 			_ = f.Close()
-			return fmt.Errorf("dump table '%s': %v", tableName, err)
+			return errors.Newf("dump table '%s': %v", tableName, err)
 		}
 		_ = f.Close()
 	}
@@ -256,25 +256,25 @@ func importLegacyTables(ctx context.Context, dirPath string, verbose bool) error
 		}
 
 		if err := x.DropTables(table); err != nil {
-			return fmt.Errorf("drop table %q: %v", tableName, err)
+			return errors.Newf("drop table %q: %v", tableName, err)
 		} else if err = x.Sync2(table); err != nil {
-			return fmt.Errorf("sync table %q: %v", tableName, err)
+			return errors.Newf("sync table %q: %v", tableName, err)
 		}
 
 		f, err := os.Open(tableFile)
 		if err != nil {
-			return fmt.Errorf("open JSON file: %v", err)
+			return errors.Newf("open JSON file: %v", err)
 		}
 		rawTableName := x.TableName(table)
 		_, isInsertProcessor := table.(xorm.BeforeInsertProcessor)
 		scanner := bufio.NewScanner(f)
 		for scanner.Scan() {
 			if err = jsoniter.Unmarshal(scanner.Bytes(), table); err != nil {
-				return fmt.Errorf("unmarshal to struct: %v", err)
+				return errors.Newf("unmarshal to struct: %v", err)
 			}
 
 			if _, err = x.Insert(table); err != nil {
-				return fmt.Errorf("insert strcut: %v", err)
+				return errors.Newf("insert strcut: %v", err)
 			}
 
 			var meta struct {
@@ -307,7 +307,7 @@ func importLegacyTables(ctx context.Context, dirPath string, verbose bool) error
 			rawTableName := snakeMapper.Obj2Table(tableName)
 			seqName := rawTableName + "_id_seq"
 			if _, err = x.Exec(fmt.Sprintf(`SELECT setval('%s', COALESCE((SELECT MAX(id)+1 FROM "%s"), 1), false);`, seqName, rawTableName)); err != nil {
-				return fmt.Errorf("reset table %q' sequence: %v", rawTableName, err)
+				return errors.Newf("reset table %q' sequence: %v", rawTableName, err)
 			}
 		}
 	}

+ 1 - 1
internal/database/backup_test.go

@@ -8,7 +8,7 @@ import (
 	"testing"
 	"time"
 
-	"github.com/pkg/errors"
+	"github.com/cockroachdb/errors"
 	"github.com/stretchr/testify/require"
 	"gorm.io/gorm"
 

+ 14 - 13
internal/database/comment.go

@@ -6,6 +6,7 @@ import (
 	"strings"
 	"time"
 
+	"github.com/cockroachdb/errors"
 	"github.com/unknwon/com"
 	log "unknwon.dev/clog/v2"
 	"xorm.io/xorm"
@@ -97,7 +98,7 @@ func (c *Comment) loadAttributes(e Engine) (err error) {
 				c.PosterID = -1
 				c.Poster = NewGhostUser()
 			} else {
-				return fmt.Errorf("getUserByID.(Poster) [%d]: %v", c.PosterID, err)
+				return errors.Newf("getUserByID.(Poster) [%d]: %v", c.PosterID, err)
 			}
 		}
 	}
@@ -105,12 +106,12 @@ func (c *Comment) loadAttributes(e Engine) (err error) {
 	if c.Issue == nil {
 		c.Issue, err = getRawIssueByID(e, c.IssueID)
 		if err != nil {
-			return fmt.Errorf("getIssueByID [%d]: %v", c.IssueID, err)
+			return errors.Newf("getIssueByID [%d]: %v", c.IssueID, err)
 		}
 		if c.Issue.Repo == nil {
 			c.Issue.Repo, err = getRepositoryByID(e, c.Issue.RepoID)
 			if err != nil {
-				return fmt.Errorf("getRepositoryByID [%d]: %v", c.Issue.RepoID, err)
+				return errors.Newf("getRepositoryByID [%d]: %v", c.Issue.RepoID, err)
 			}
 		}
 	}
@@ -118,7 +119,7 @@ func (c *Comment) loadAttributes(e Engine) (err error) {
 	if c.Attachments == nil {
 		c.Attachments, err = getAttachmentsByCommentID(e, c.ID)
 		if err != nil {
-			return fmt.Errorf("getAttachmentsByCommentID [%d]: %v", c.ID, err)
+			return errors.Newf("getAttachmentsByCommentID [%d]: %v", c.ID, err)
 		}
 	}
 
@@ -165,7 +166,7 @@ func (c *Comment) EventTag() string {
 func (c *Comment) mailParticipants(e Engine, opType ActionType, issue *Issue) (err error) {
 	mentions := markup.FindAllMentions(c.Content)
 	if err = updateIssueMentions(e, c.IssueID, mentions); err != nil {
-		return fmt.Errorf("UpdateIssueMentions [%d]: %v", c.IssueID, err)
+		return errors.Newf("UpdateIssueMentions [%d]: %v", c.IssueID, err)
 	}
 
 	switch opType {
@@ -227,7 +228,7 @@ func createComment(e *xorm.Session, opts *CreateCommentOptions) (_ *Comment, err
 				if IsErrAttachmentNotExist(err) {
 					continue
 				}
-				return nil, fmt.Errorf("getAttachmentByUUID [%s]: %v", uuid, err)
+				return nil, errors.Newf("getAttachmentByUUID [%s]: %v", uuid, err)
 			}
 			attachments = append(attachments, attach)
 		}
@@ -237,7 +238,7 @@ func createComment(e *xorm.Session, opts *CreateCommentOptions) (_ *Comment, err
 			attachments[i].CommentID = comment.ID
 			// No assign value could be 0, so ignore AllCols().
 			if _, err = e.ID(attachments[i].ID).Update(attachments[i]); err != nil {
-				return nil, fmt.Errorf("update attachment [%d]: %v", attachments[i].ID, err)
+				return nil, errors.Newf("update attachment [%d]: %v", attachments[i].ID, err)
 			}
 		}
 
@@ -273,7 +274,7 @@ func createComment(e *xorm.Session, opts *CreateCommentOptions) (_ *Comment, err
 	}
 
 	if _, err = e.Exec("UPDATE `issue` SET updated_unix = ? WHERE id = ?", time.Now().Unix(), opts.Issue.ID); err != nil {
-		return nil, fmt.Errorf("update issue 'updated_unix': %v", err)
+		return nil, errors.Newf("update issue 'updated_unix': %v", err)
 	}
 
 	// Notify watchers for whatever action comes in, ignore if no action type.
@@ -342,7 +343,7 @@ func CreateIssueComment(doer *User, repo *Repository, issue *Issue, content stri
 		Attachments: attachments,
 	})
 	if err != nil {
-		return nil, fmt.Errorf("CreateComment: %v", err)
+		return nil, errors.Newf("CreateComment: %v", err)
 	}
 
 	comment.Issue = issue
@@ -362,7 +363,7 @@ func CreateIssueComment(doer *User, repo *Repository, issue *Issue, content stri
 // CreateRefComment creates a commit reference comment to issue.
 func CreateRefComment(doer *User, repo *Repository, issue *Issue, content, commitSHA string) error {
 	if commitSHA == "" {
-		return fmt.Errorf("cannot create reference with empty commit SHA")
+		return errors.Newf("cannot create reference with empty commit SHA")
 	}
 
 	// Check if same reference from same commit has already existed.
@@ -372,7 +373,7 @@ func CreateRefComment(doer *User, repo *Repository, issue *Issue, content, commi
 		CommitSHA: commitSHA,
 	})
 	if err != nil {
-		return fmt.Errorf("check reference comment: %v", err)
+		return errors.Newf("check reference comment: %v", err)
 	} else if has {
 		return nil
 	}
@@ -423,7 +424,7 @@ func GetCommentByID(id int64) (*Comment, error) {
 func loadCommentsAttributes(e Engine, comments []*Comment) (err error) {
 	for i := range comments {
 		if err = comments[i].loadAttributes(e); err != nil {
-			return fmt.Errorf("loadAttributes [%d]: %v", comments[i].ID, err)
+			return errors.Newf("loadAttributes [%d]: %v", comments[i].ID, err)
 		}
 	}
 
@@ -527,7 +528,7 @@ func DeleteCommentByID(doer *User, id int64) error {
 	}
 
 	if err = sess.Commit(); err != nil {
-		return fmt.Errorf("commit: %v", err)
+		return errors.Newf("commit: %v", err)
 	}
 
 	_, err = DeleteAttachmentsByComment(comment.ID, true)

+ 1 - 1
internal/database/database.go

@@ -6,7 +6,7 @@ import (
 	"strings"
 	"time"
 
-	"github.com/pkg/errors"
+	"github.com/cockroachdb/errors"
 	"gorm.io/gorm"
 	"gorm.io/gorm/logger"
 	"gorm.io/gorm/schema"

+ 34 - 34
internal/database/issue.go

@@ -2,11 +2,11 @@ package database
 
 import (
 	"context"
-	"errors"
 	"fmt"
 	"strings"
 	"time"
 
+	"github.com/cockroachdb/errors"
 	"github.com/unknwon/com"
 	log "unknwon.dev/clog/v2"
 	"xorm.io/xorm"
@@ -95,7 +95,7 @@ func (issue *Issue) loadAttributes(e Engine) (err error) {
 	if issue.Repo == nil {
 		issue.Repo, err = getRepositoryByID(e, issue.RepoID)
 		if err != nil {
-			return fmt.Errorf("getRepositoryByID [%d]: %v", issue.RepoID, err)
+			return errors.Newf("getRepositoryByID [%d]: %v", issue.RepoID, err)
 		}
 	}
 
@@ -106,7 +106,7 @@ func (issue *Issue) loadAttributes(e Engine) (err error) {
 				issue.PosterID = -1
 				issue.Poster = NewGhostUser()
 			} else {
-				return fmt.Errorf("getUserByID.(Poster) [%d]: %v", issue.PosterID, err)
+				return errors.Newf("getUserByID.(Poster) [%d]: %v", issue.PosterID, err)
 			}
 		}
 	}
@@ -114,21 +114,21 @@ func (issue *Issue) loadAttributes(e Engine) (err error) {
 	if issue.Labels == nil {
 		issue.Labels, err = getLabelsByIssueID(e, issue.ID)
 		if err != nil {
-			return fmt.Errorf("getLabelsByIssueID [%d]: %v", issue.ID, err)
+			return errors.Newf("getLabelsByIssueID [%d]: %v", issue.ID, err)
 		}
 	}
 
 	if issue.Milestone == nil && issue.MilestoneID > 0 {
 		issue.Milestone, err = getMilestoneByRepoID(e, issue.RepoID, issue.MilestoneID)
 		if err != nil {
-			return fmt.Errorf("getMilestoneByRepoID [repo_id: %d, milestone_id: %d]: %v", issue.RepoID, issue.MilestoneID, err)
+			return errors.Newf("getMilestoneByRepoID [repo_id: %d, milestone_id: %d]: %v", issue.RepoID, issue.MilestoneID, err)
 		}
 	}
 
 	if issue.Assignee == nil && issue.AssigneeID > 0 {
 		issue.Assignee, err = getUserByID(e, issue.AssigneeID)
 		if err != nil {
-			return fmt.Errorf("getUserByID.(assignee) [%d]: %v", issue.AssigneeID, err)
+			return errors.Newf("getUserByID.(assignee) [%d]: %v", issue.AssigneeID, err)
 		}
 	}
 
@@ -136,21 +136,21 @@ func (issue *Issue) loadAttributes(e Engine) (err error) {
 		// It is possible pull request is not yet created.
 		issue.PullRequest, err = getPullRequestByIssueID(e, issue.ID)
 		if err != nil && !IsErrPullRequestNotExist(err) {
-			return fmt.Errorf("getPullRequestByIssueID [%d]: %v", issue.ID, err)
+			return errors.Newf("getPullRequestByIssueID [%d]: %v", issue.ID, err)
 		}
 	}
 
 	if issue.Attachments == nil {
 		issue.Attachments, err = getAttachmentsByIssueID(e, issue.ID)
 		if err != nil {
-			return fmt.Errorf("getAttachmentsByIssueID [%d]: %v", issue.ID, err)
+			return errors.Newf("getAttachmentsByIssueID [%d]: %v", issue.ID, err)
 		}
 	}
 
 	if issue.Comments == nil {
 		issue.Comments, err = getCommentsByIssueID(e, issue.ID)
 		if err != nil {
-			return fmt.Errorf("getCommentsByIssueID [%d]: %v", issue.ID, err)
+			return errors.Newf("getCommentsByIssueID [%d]: %v", issue.ID, err)
 		}
 	}
 
@@ -302,7 +302,7 @@ func (issue *Issue) getLabels(e Engine) (err error) {
 
 	issue.Labels, err = getLabelsByIssueID(e, issue.ID)
 	if err != nil {
-		return fmt.Errorf("getLabelsByIssueID: %v", err)
+		return errors.Newf("getLabelsByIssueID: %v", err)
 	}
 	return nil
 }
@@ -323,7 +323,7 @@ func (issue *Issue) RemoveLabel(doer *User, label *Label) error {
 
 func (issue *Issue) clearLabels(e *xorm.Session) (err error) {
 	if err = issue.getLabels(e); err != nil {
-		return fmt.Errorf("getLabels: %v", err)
+		return errors.Newf("getLabels: %v", err)
 	}
 
 	// NOTE: issue.removeLabel slices issue.Labels, so we need to create another slice to be unaffected.
@@ -331,7 +331,7 @@ func (issue *Issue) clearLabels(e *xorm.Session) (err error) {
 	copy(labels, issue.Labels)
 	for i := range labels {
 		if err = issue.removeLabel(e, labels[i]); err != nil {
-			return fmt.Errorf("removeLabel: %v", err)
+			return errors.Newf("removeLabel: %v", err)
 		}
 	}
 
@@ -350,7 +350,7 @@ func (issue *Issue) ClearLabels(doer *User) (err error) {
 	}
 
 	if err = sess.Commit(); err != nil {
-		return fmt.Errorf("commit: %v", err)
+		return errors.Newf("commit: %v", err)
 	}
 
 	if issue.IsPull {
@@ -391,9 +391,9 @@ func (issue *Issue) ReplaceLabels(labels []*Label) (err error) {
 	}
 
 	if err = issue.clearLabels(sess); err != nil {
-		return fmt.Errorf("clearLabels: %v", err)
+		return errors.Newf("clearLabels: %v", err)
 	} else if err = issue.addLabels(sess, labels); err != nil {
-		return fmt.Errorf("addLabels: %v", err)
+		return errors.Newf("addLabels: %v", err)
 	}
 
 	return sess.Commit()
@@ -481,7 +481,7 @@ func (issue *Issue) ChangeStatus(doer *User, repo *Repository, isClosed bool) (e
 	}
 
 	if err = sess.Commit(); err != nil {
-		return fmt.Errorf("commit: %v", err)
+		return errors.Newf("commit: %v", err)
 	}
 
 	if issue.IsPull {
@@ -524,7 +524,7 @@ func (issue *Issue) ChangeTitle(doer *User, title string) (err error) {
 	oldTitle := issue.Title
 	issue.Title = title
 	if err = UpdateIssueCols(issue, "name"); err != nil {
-		return fmt.Errorf("UpdateIssueCols: %v", err)
+		return errors.Newf("UpdateIssueCols: %v", err)
 	}
 
 	if issue.IsPull {
@@ -566,7 +566,7 @@ func (issue *Issue) ChangeContent(doer *User, content string) (err error) {
 	oldContent := issue.Content
 	issue.Content = content
 	if err = UpdateIssueCols(issue, "content"); err != nil {
-		return fmt.Errorf("UpdateIssueCols: %v", err)
+		return errors.Newf("UpdateIssueCols: %v", err)
 	}
 
 	if issue.IsPull {
@@ -607,7 +607,7 @@ func (issue *Issue) ChangeContent(doer *User, content string) (err error) {
 func (issue *Issue) ChangeAssignee(doer *User, assigneeID int64) (err error) {
 	issue.AssigneeID = assigneeID
 	if err = UpdateIssueUserByAssignee(issue); err != nil {
-		return fmt.Errorf("UpdateIssueUserByAssignee: %v", err)
+		return errors.Newf("UpdateIssueUserByAssignee: %v", err)
 	}
 
 	issue.Assignee, err = Handle.Users().GetByID(context.TODO(), issue.AssigneeID)
@@ -668,7 +668,7 @@ func newIssue(e *xorm.Session, opts NewIssueOptions) (err error) {
 	if opts.Issue.MilestoneID > 0 {
 		milestone, err := getMilestoneByRepoID(e, opts.Issue.RepoID, opts.Issue.MilestoneID)
 		if err != nil && !IsErrMilestoneNotExist(err) {
-			return fmt.Errorf("getMilestoneByID: %v", err)
+			return errors.Newf("getMilestoneByID: %v", err)
 		}
 
 		// Assume milestone is invalid and drop silently.
@@ -685,7 +685,7 @@ func newIssue(e *xorm.Session, opts NewIssueOptions) (err error) {
 	if opts.Issue.AssigneeID > 0 {
 		assignee, err := getUserByID(e, opts.Issue.AssigneeID)
 		if err != nil && !IsErrUserNotExist(err) {
-			return fmt.Errorf("get user by ID: %v", err)
+			return errors.Newf("get user by ID: %v", err)
 		}
 
 		if assignee != nil {
@@ -716,7 +716,7 @@ func newIssue(e *xorm.Session, opts NewIssueOptions) (err error) {
 		// So we have to get all needed labels first.
 		labels := make([]*Label, 0, len(opts.LableIDs))
 		if err = e.In("id", opts.LableIDs).Find(&labels); err != nil {
-			return fmt.Errorf("find all labels [label_ids: %v]: %v", opts.LableIDs, err)
+			return errors.Newf("find all labels [label_ids: %v]: %v", opts.LableIDs, err)
 		}
 
 		for _, label := range labels {
@@ -726,7 +726,7 @@ func newIssue(e *xorm.Session, opts NewIssueOptions) (err error) {
 			}
 
 			if err = opts.Issue.addLabel(e, label); err != nil {
-				return fmt.Errorf("addLabel [id: %d]: %v", label.ID, err)
+				return errors.Newf("addLabel [id: %d]: %v", label.ID, err)
 			}
 		}
 	}
@@ -738,13 +738,13 @@ func newIssue(e *xorm.Session, opts NewIssueOptions) (err error) {
 	if len(opts.Attachments) > 0 {
 		attachments, err := getAttachmentsByUUIDs(e, opts.Attachments)
 		if err != nil {
-			return fmt.Errorf("getAttachmentsByUUIDs [uuids: %v]: %v", opts.Attachments, err)
+			return errors.Newf("getAttachmentsByUUIDs [uuids: %v]: %v", 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 errors.Newf("update attachment [id: %d]: %v", attachments[i].ID, err)
 			}
 		}
 	}
@@ -766,11 +766,11 @@ func NewIssue(repo *Repository, issue *Issue, labelIDs []int64, uuids []string)
 		LableIDs:    labelIDs,
 		Attachments: uuids,
 	}); err != nil {
-		return fmt.Errorf("new issue: %v", err)
+		return errors.Newf("new issue: %v", err)
 	}
 
 	if err = sess.Commit(); err != nil {
-		return fmt.Errorf("commit: %v", err)
+		return errors.Newf("commit: %v", err)
 	}
 
 	if err = NotifyWatchers(&Action{
@@ -997,13 +997,13 @@ func Issues(opts *IssuesOptions) ([]*Issue, error) {
 
 	issues := make([]*Issue, 0, conf.UI.IssuePagingNum)
 	if err := sess.Find(&issues); err != nil {
-		return nil, fmt.Errorf("find: %v", err)
+		return nil, errors.Newf("find: %v", err)
 	}
 
 	// FIXME: use IssueList to improve performance.
 	for i := range issues {
 		if err := issues[i].LoadAttributes(); err != nil {
-			return nil, fmt.Errorf("LoadAttributes [%d]: %v", issues[i].ID, err)
+			return nil, errors.Newf("LoadAttributes [%d]: %v", issues[i].ID, err)
 		}
 	}
 
@@ -1017,7 +1017,7 @@ func GetParticipantsByIssueID(issueID int64) ([]*User, error) {
 		Where("issue_id = ?", issueID).
 		Distinct("poster_id").
 		Find(&userIDs); err != nil {
-		return nil, fmt.Errorf("get poster IDs: %v", err)
+		return nil, errors.Newf("get poster IDs: %v", err)
 	}
 	if len(userIDs) == 0 {
 		return nil, nil
@@ -1051,7 +1051,7 @@ type IssueUser struct {
 func newIssueUsers(e *xorm.Session, repo *Repository, issue *Issue) error {
 	assignees, err := repo.getAssignees(e)
 	if err != nil {
-		return fmt.Errorf("getAssignees: %v", err)
+		return errors.Newf("getAssignees: %v", err)
 	}
 
 	// Poster can be anyone, append later if not one of assignees.
@@ -1166,7 +1166,7 @@ func updateIssueMentions(e Engine, issueID int64, mentions []string) error {
 	users := make([]*User, 0, len(mentions))
 
 	if err := e.In("lower_name", mentions).Asc("lower_name").Find(&users); err != nil {
-		return fmt.Errorf("find mentioned users: %v", err)
+		return errors.Newf("find mentioned users: %v", err)
 	}
 
 	ids := make([]int64, 0, len(mentions))
@@ -1179,7 +1179,7 @@ func updateIssueMentions(e Engine, issueID int64, mentions []string) error {
 		memberIDs := make([]int64, 0, user.NumMembers)
 		orgUsers, err := getOrgUsersByOrgID(e, user.ID, 0)
 		if err != nil {
-			return fmt.Errorf("getOrgUsersByOrgID [%d]: %v", user.ID, err)
+			return errors.Newf("getOrgUsersByOrgID [%d]: %v", user.ID, err)
 		}
 
 		for _, orgUser := range orgUsers {
@@ -1190,7 +1190,7 @@ func updateIssueMentions(e Engine, issueID int64, mentions []string) error {
 	}
 
 	if err := updateIssueUsersByMentions(e, issueID, ids); err != nil {
-		return fmt.Errorf("UpdateIssueUsersByMentions: %v", err)
+		return errors.Newf("UpdateIssueUsersByMentions: %v", err)
 	}
 
 	return nil

+ 8 - 7
internal/database/issue_label.go

@@ -8,6 +8,7 @@ import (
 
 	"xorm.io/xorm"
 
+	"github.com/cockroachdb/errors"
 	api "github.com/gogs/go-gogs-client"
 
 	"gogs.io/gogs/internal/errutil"
@@ -22,7 +23,7 @@ var labelColorPattern = lazyregexp.New("#([a-fA-F0-9]{6})")
 func GetLabelTemplateFile(name string) ([][2]string, error) {
 	data, err := getRepoInitFile("label", name)
 	if err != nil {
-		return nil, fmt.Errorf("getRepoInitFile: %v", err)
+		return nil, errors.Newf("getRepoInitFile: %v", err)
 	}
 
 	lines := strings.Split(string(data), "\n")
@@ -35,11 +36,11 @@ func GetLabelTemplateFile(name string) ([][2]string, error) {
 
 		fields := strings.SplitN(line, " ", 2)
 		if len(fields) != 2 {
-			return nil, fmt.Errorf("line is malformed: %s", line)
+			return nil, errors.Newf("line is malformed: %s", line)
 		}
 
 		if !labelColorPattern.MatchString(fields[0]) {
-			return nil, fmt.Errorf("bad HTML color code in line: %s", line)
+			return nil, errors.Newf("bad HTML color code in line: %s", line)
 		}
 
 		fields[1] = strings.TrimSpace(fields[1])
@@ -192,7 +193,7 @@ func GetLabelsByRepoID(repoID int64) ([]*Label, error) {
 func getLabelsByIssueID(e Engine, issueID int64) ([]*Label, error) {
 	issueLabels, err := getIssueLabels(e, issueID)
 	if err != nil {
-		return nil, fmt.Errorf("getIssueLabels: %v", err)
+		return nil, errors.Newf("getIssueLabels: %v", err)
 	} else if len(issueLabels) == 0 {
 		return []*Label{}, nil
 	}
@@ -284,7 +285,7 @@ func newIssueLabel(e *xorm.Session, issue *Issue, label *Label) (err error) {
 	}
 
 	if err = updateLabel(e, label); err != nil {
-		return fmt.Errorf("updateLabel: %v", err)
+		return errors.Newf("updateLabel: %v", err)
 	}
 
 	issue.Labels = append(issue.Labels, label)
@@ -317,7 +318,7 @@ func newIssueLabels(e *xorm.Session, issue *Issue, labels []*Label) (err error)
 		}
 
 		if err = newIssueLabel(e, issue, labels[i]); err != nil {
-			return fmt.Errorf("newIssueLabel: %v", err)
+			return errors.Newf("newIssueLabel: %v", err)
 		}
 	}
 
@@ -362,7 +363,7 @@ func deleteIssueLabel(e *xorm.Session, issue *Issue, label *Label) (err error) {
 		label.NumClosedIssues--
 	}
 	if err = updateLabel(e, label); err != nil {
-		return fmt.Errorf("updateLabel: %v", err)
+		return errors.Newf("updateLabel: %v", err)
 	}
 
 	for i := range issue.Labels {

+ 5 - 5
internal/database/issue_mail.go

@@ -4,7 +4,7 @@ import (
 	"context"
 	"fmt"
 
-	"github.com/pkg/errors"
+	"github.com/cockroachdb/errors"
 	"github.com/unknwon/com"
 	log "unknwon.dev/clog/v2"
 
@@ -104,11 +104,11 @@ func mailIssueCommentToParticipants(issue *Issue, doer *User, mentions []string)
 
 	watchers, err := GetWatchers(issue.RepoID)
 	if err != nil {
-		return fmt.Errorf("GetWatchers [repo_id: %d]: %v", issue.RepoID, err)
+		return errors.Newf("GetWatchers [repo_id: %d]: %v", issue.RepoID, err)
 	}
 	participants, err := GetParticipantsByIssueID(issue.ID)
 	if err != nil {
-		return fmt.Errorf("GetParticipantsByIssueID [issue_id: %d]: %v", issue.ID, err)
+		return errors.Newf("GetParticipantsByIssueID [issue_id: %d]: %v", issue.ID, err)
 	}
 
 	// In case the issue poster is not watching the repository,
@@ -126,7 +126,7 @@ func mailIssueCommentToParticipants(issue *Issue, doer *User, mentions []string)
 
 		to, err := Handle.Users().GetByID(ctx, watchers[i].UserID)
 		if err != nil {
-			return fmt.Errorf("GetUserByID [%d]: %v", watchers[i].UserID, err)
+			return errors.Newf("GetUserByID [%d]: %v", watchers[i].UserID, err)
 		}
 		if to.IsOrganization() || !to.IsActive {
 			continue
@@ -177,7 +177,7 @@ func mailIssueCommentToParticipants(issue *Issue, doer *User, mentions []string)
 func (issue *Issue) MailParticipants() (err error) {
 	mentions := markup.FindAllMentions(issue.Content)
 	if err = updateIssueMentions(x, issue.ID, mentions); err != nil {
-		return fmt.Errorf("UpdateIssueMentions [%d]: %v", issue.ID, err)
+		return errors.Newf("UpdateIssueMentions [%d]: %v", issue.ID, err)
 	}
 
 	if err = mailIssueCommentToParticipants(issue, issue.Poster, mentions); err != nil {

+ 1 - 1
internal/database/lfs.go

@@ -2,10 +2,10 @@ package database
 
 import (
 	"context"
-	"errors"
 	"fmt"
 	"time"
 
+	"github.com/cockroachdb/errors"
 	"gorm.io/gorm"
 
 	"gogs.io/gogs/internal/errutil"

+ 2 - 2
internal/database/login_source_files.go

@@ -8,7 +8,7 @@ import (
 	"sync"
 	"time"
 
-	"github.com/pkg/errors"
+	"github.com/cockroachdb/errors"
 	"gopkg.in/ini.v1"
 
 	"gogs.io/gogs/internal/auth"
@@ -200,7 +200,7 @@ func loadLoginSourceFiles(authdPath string, clock func() time.Time) (loginSource
 			loginSource.Provider = github.NewProvider(&cfg)
 
 		default:
-			return fmt.Errorf("unknown type %q", authType)
+			return errors.Newf("unknown type %q", authType)
 		}
 
 		store.sources = append(store.sources, loginSource)

+ 2 - 2
internal/database/login_sources.go

@@ -6,8 +6,8 @@ import (
 	"strconv"
 	"time"
 
+	"github.com/cockroachdb/errors"
 	jsoniter "github.com/json-iterator/go"
-	"github.com/pkg/errors"
 	"gorm.io/gorm"
 
 	"gogs.io/gogs/internal/auth"
@@ -121,7 +121,7 @@ func (s *LoginSource) AfterFind(_ *gorm.DB) error {
 		s.Provider = mockProvider
 
 	default:
-		return fmt.Errorf("unrecognized login source type: %v", s.Type)
+		return errors.Newf("unrecognized login source type: %v", s.Type)
 	}
 	return nil
 }

+ 1 - 1
internal/database/migrations/migrations.go

@@ -1,7 +1,7 @@
 package migrations
 
 import (
-	"github.com/pkg/errors"
+	"github.com/cockroachdb/errors"
 	"gorm.io/gorm"
 	log "unknwon.dev/clog/v2"
 )

+ 1 - 1
internal/database/migrations/v20.go

@@ -1,7 +1,7 @@
 package migrations
 
 import (
-	"github.com/pkg/errors"
+	"github.com/cockroachdb/errors"
 	"gorm.io/gorm"
 
 	"gogs.io/gogs/internal/cryptoutil"

+ 2 - 1
internal/database/milestone.go

@@ -7,6 +7,7 @@ import (
 	log "unknwon.dev/clog/v2"
 	"xorm.io/xorm"
 
+	"github.com/cockroachdb/errors"
 	api "github.com/gogs/go-gogs-client"
 
 	"gogs.io/gogs/internal/conf"
@@ -339,7 +340,7 @@ func ChangeMilestoneAssign(doer *User, issue *Issue, oldMilestoneID int64) (err
 	}
 
 	if err = sess.Commit(); err != nil {
-		return fmt.Errorf("commit: %v", err)
+		return errors.Newf("commit: %v", err)
 	}
 
 	var hookAction api.HookIssueAction

+ 3 - 2
internal/database/mirror.go

@@ -7,6 +7,7 @@ import (
 	"strings"
 	"time"
 
+	"github.com/cockroachdb/errors"
 	"github.com/unknwon/com"
 	"gopkg.in/ini.v1"
 	log "unknwon.dev/clog/v2"
@@ -141,7 +142,7 @@ func (m *Mirror) SaveAddress(addr string) error {
 
 	err := git.RemoteRemove(repoPath, "origin")
 	if err != nil {
-		return fmt.Errorf("remove remote 'origin': %v", err)
+		return errors.Newf("remove remote 'origin': %v", err)
 	}
 
 	addrURL, err := url.Parse(addr)
@@ -151,7 +152,7 @@ func (m *Mirror) SaveAddress(addr string) error {
 
 	err = git.RemoteAdd(repoPath, "origin", addrURL.String(), git.RemoteAddOptions{MirrorFetch: true})
 	if err != nil {
-		return fmt.Errorf("add remote 'origin': %v", err)
+		return errors.Newf("add remote 'origin': %v", err)
 	}
 
 	return nil

+ 7 - 7
internal/database/models.go

@@ -10,7 +10,7 @@ import (
 	"strings"
 	"time"
 
-	"github.com/pkg/errors"
+	"github.com/cockroachdb/errors"
 	"gorm.io/gorm"
 	"gorm.io/gorm/logger"
 	log "unknwon.dev/clog/v2"
@@ -97,13 +97,13 @@ func getEngine() (*xorm.Engine, error) {
 
 	case "sqlite3":
 		if err := os.MkdirAll(path.Dir(conf.Database.Path), os.ModePerm); err != nil {
-			return nil, fmt.Errorf("create directories: %v", err)
+			return nil, errors.Newf("create directories: %v", err)
 		}
 		conf.UseSQLite3 = true
 		connStr = "file:" + conf.Database.Path + "?cache=shared&mode=rwc"
 
 	default:
-		return nil, fmt.Errorf("unknown database type: %s", conf.Database.Type)
+		return nil, errors.Newf("unknown database type: %s", conf.Database.Type)
 	}
 	return xorm.NewEngine(driver, connStr)
 }
@@ -111,7 +111,7 @@ func getEngine() (*xorm.Engine, error) {
 func NewTestEngine() error {
 	x, err := getEngine()
 	if err != nil {
-		return fmt.Errorf("connect to database: %v", err)
+		return errors.Newf("connect to database: %v", err)
 	}
 
 	if conf.UsePostgreSQL {
@@ -126,7 +126,7 @@ func SetEngine() (*gorm.DB, error) {
 	var err error
 	x, err = getEngine()
 	if err != nil {
-		return nil, fmt.Errorf("connect to database: %v", err)
+		return nil, errors.Newf("connect to database: %v", err)
 	}
 
 	if conf.UsePostgreSQL {
@@ -151,7 +151,7 @@ func SetEngine() (*gorm.DB, error) {
 		},
 	)
 	if err != nil {
-		return nil, fmt.Errorf("create 'xorm.log': %v", err)
+		return nil, errors.Newf("create 'xorm.log': %v", err)
 	}
 
 	x.SetMaxOpenConns(conf.Database.MaxOpenConns)
@@ -184,7 +184,7 @@ func NewEngine() error {
 	}
 
 	if err = migrations.Migrate(db); err != nil {
-		return fmt.Errorf("migrate: %v", err)
+		return errors.Newf("migrate: %v", err)
 	}
 
 	if err = x.StoreEngine("InnoDB").Sync2(legacyTables...); err != nil {

+ 19 - 20
internal/database/org.go

@@ -2,11 +2,10 @@ package database
 
 import (
 	"context"
-	"errors"
-	"fmt"
 	"os"
 	"strings"
 
+	"github.com/cockroachdb/errors"
 	"xorm.io/builder"
 	"xorm.io/xorm"
 
@@ -129,7 +128,7 @@ func CreateOrganization(org, owner *User) (err error) {
 	}
 
 	if _, err = sess.Insert(org); err != nil {
-		return fmt.Errorf("insert organization: %v", err)
+		return errors.Newf("insert organization: %v", err)
 	}
 	_ = userutil.GenerateRandomAvatar(org.ID, org.Name, org.Email)
 
@@ -140,7 +139,7 @@ func CreateOrganization(org, owner *User) (err error) {
 		IsOwner:  true,
 		NumTeams: 1,
 	}); err != nil {
-		return fmt.Errorf("insert org-user relation: %v", err)
+		return errors.Newf("insert org-user relation: %v", err)
 	}
 
 	// Create default owner team.
@@ -152,7 +151,7 @@ func CreateOrganization(org, owner *User) (err error) {
 		NumMembers: 1,
 	}
 	if _, err = sess.Insert(t); err != nil {
-		return fmt.Errorf("insert owner team: %v", err)
+		return errors.Newf("insert owner team: %v", err)
 	}
 
 	if _, err = sess.Insert(&TeamUser{
@@ -160,11 +159,11 @@ func CreateOrganization(org, owner *User) (err error) {
 		OrgID:  org.ID,
 		TeamID: t.ID,
 	}); err != nil {
-		return fmt.Errorf("insert team-user relation: %v", err)
+		return errors.Newf("insert team-user relation: %v", err)
 	}
 
 	if err = os.MkdirAll(repoutil.UserPath(org.Name), os.ModePerm); err != nil {
-		return fmt.Errorf("create directory: %v", err)
+		return errors.Newf("create directory: %v", err)
 	}
 
 	return sess.Commit()
@@ -228,7 +227,7 @@ func DeleteOrganization(org *User) error {
 		&OrgUser{OrgID: org.ID},
 		&TeamUser{OrgID: org.ID},
 	); err != nil {
-		return fmt.Errorf("deleteBeans: %v", err)
+		return errors.Newf("deleteBeans: %v", err)
 	}
 	return sess.Commit()
 }
@@ -364,24 +363,24 @@ func RemoveOrgUser(orgID, userID int64) error {
 
 	has, err := x.Where("uid=?", userID).And("org_id=?", orgID).Get(ou)
 	if err != nil {
-		return fmt.Errorf("get org-user: %v", err)
+		return errors.Newf("get org-user: %v", err)
 	} else if !has {
 		return nil
 	}
 
 	user, err := Handle.Users().GetByID(context.TODO(), userID)
 	if err != nil {
-		return fmt.Errorf("GetUserByID [%d]: %v", userID, err)
+		return errors.Newf("GetUserByID [%d]: %v", userID, err)
 	}
 	org, err := Handle.Users().GetByID(context.TODO(), orgID)
 	if err != nil {
-		return fmt.Errorf("GetUserByID [%d]: %v", orgID, err)
+		return errors.Newf("GetUserByID [%d]: %v", orgID, err)
 	}
 
 	// FIXME: only need to get IDs here, not all fields of repository.
 	repos, _, err := org.GetUserRepositories(user.ID, 1, org.NumRepos)
 	if err != nil {
-		return fmt.Errorf("GetUserRepositories [%d]: %v", user.ID, err)
+		return errors.Newf("GetUserRepositories [%d]: %v", user.ID, err)
 	}
 
 	// Check if the user to delete is the last member in owner team.
@@ -461,7 +460,7 @@ func (org *User) getUserTeams(e Engine, userID int64, cols ...string) ([]*Team,
 func (org *User) GetUserTeamIDs(userID int64) ([]int64, error) {
 	teams, err := org.getUserTeams(x, userID, "team.id")
 	if err != nil {
-		return nil, fmt.Errorf("getUserTeams [%d]: %v", userID, err)
+		return nil, errors.Newf("getUserTeams [%d]: %v", userID, err)
 	}
 
 	teamIDs := make([]int64, len(teams))
@@ -482,7 +481,7 @@ func (org *User) GetUserTeams(userID int64) ([]*Team, error) {
 func (org *User) GetUserRepositories(userID int64, page, pageSize int) ([]*Repository, int64, error) {
 	teamIDs, err := org.GetUserTeamIDs(userID)
 	if err != nil {
-		return nil, 0, fmt.Errorf("GetUserTeamIDs: %v", err)
+		return nil, 0, errors.Newf("GetUserTeamIDs: %v", err)
 	}
 	if len(teamIDs) == 0 {
 		// user has no team but "IN ()" is invalid SQL
@@ -491,7 +490,7 @@ func (org *User) GetUserRepositories(userID int64, page, pageSize int) ([]*Repos
 
 	var teamRepoIDs []int64
 	if err = x.Table("team_repo").In("team_id", teamIDs).Distinct("repo_id").Find(&teamRepoIDs); err != nil {
-		return nil, 0, fmt.Errorf("get team repository IDs: %v", err)
+		return nil, 0, errors.Newf("get team repository IDs: %v", err)
 	}
 	if len(teamRepoIDs) == 0 {
 		// team has no repo but "IN ()" is invalid SQL
@@ -509,7 +508,7 @@ func (org *User) GetUserRepositories(userID int64, page, pageSize int) ([]*Repos
 		Desc("updated_unix").
 		Limit(pageSize, (page-1)*pageSize).
 		Find(&repos); err != nil {
-		return nil, 0, fmt.Errorf("get user repositories: %v", err)
+		return nil, 0, errors.Newf("get user repositories: %v", err)
 	}
 
 	repoCount, err := x.Where("owner_id = ?", org.ID).
@@ -518,7 +517,7 @@ func (org *User) GetUserRepositories(userID int64, page, pageSize int) ([]*Repos
 			builder.In("id", teamRepoIDs))).
 		Count(new(Repository))
 	if err != nil {
-		return nil, 0, fmt.Errorf("count user repositories: %v", err)
+		return nil, 0, errors.Newf("count user repositories: %v", err)
 	}
 
 	return repos, repoCount, nil
@@ -528,7 +527,7 @@ func (org *User) GetUserRepositories(userID int64, page, pageSize int) ([]*Repos
 func (org *User) GetUserMirrorRepositories(userID int64) ([]*Repository, error) {
 	teamIDs, err := org.GetUserTeamIDs(userID)
 	if err != nil {
-		return nil, fmt.Errorf("GetUserTeamIDs: %v", err)
+		return nil, errors.Newf("GetUserTeamIDs: %v", err)
 	}
 	if len(teamIDs) == 0 {
 		teamIDs = []int64{-1}
@@ -537,7 +536,7 @@ func (org *User) GetUserMirrorRepositories(userID int64) ([]*Repository, error)
 	var teamRepoIDs []int64
 	err = x.Table("team_repo").In("team_id", teamIDs).Distinct("repo_id").Find(&teamRepoIDs)
 	if err != nil {
-		return nil, fmt.Errorf("get team repository ids: %v", err)
+		return nil, errors.Newf("get team repository ids: %v", err)
 	}
 	if len(teamRepoIDs) == 0 {
 		// team has no repo but "IN ()" is invalid SQL
@@ -551,7 +550,7 @@ func (org *User) GetUserMirrorRepositories(userID int64) ([]*Repository, error)
 		And("is_mirror = ?", true). // Don't move up because it's an independent condition
 		Desc("updated_unix").
 		Find(&repos); err != nil {
-		return nil, fmt.Errorf("get user repositories: %v", err)
+		return nil, errors.Newf("get user repositories: %v", err)
 	}
 	return repos, nil
 }

+ 13 - 13
internal/database/org_team.go

@@ -2,10 +2,10 @@ package database
 
 import (
 	"context"
-	"errors"
 	"fmt"
 	"strings"
 
+	"github.com/cockroachdb/errors"
 	"xorm.io/xorm"
 
 	"gogs.io/gogs/internal/errutil"
@@ -55,14 +55,14 @@ func (t *Team) IsMember(userID int64) bool {
 func (t *Team) getRepositories(e Engine) (err error) {
 	teamRepos := make([]*TeamRepo, 0, t.NumRepos)
 	if err = x.Where("team_id=?", t.ID).Find(&teamRepos); err != nil {
-		return fmt.Errorf("get team-repos: %v", err)
+		return errors.Newf("get team-repos: %v", err)
 	}
 
 	t.Repos = make([]*Repository, 0, len(teamRepos))
 	for i := range teamRepos {
 		repo, err := getRepositoryByID(e, teamRepos[i].RepoID)
 		if err != nil {
-			return fmt.Errorf("getRepositoryById(%d): %v", teamRepos[i].RepoID, err)
+			return errors.Newf("getRepositoryById(%d): %v", teamRepos[i].RepoID, err)
 		}
 		t.Repos = append(t.Repos, repo)
 	}
@@ -111,19 +111,19 @@ func (t *Team) addRepository(e Engine, repo *Repository) (err error) {
 
 	t.NumRepos++
 	if _, err = e.ID(t.ID).AllCols().Update(t); err != nil {
-		return fmt.Errorf("update team: %v", err)
+		return errors.Newf("update team: %v", err)
 	}
 
 	if err = repo.recalculateTeamAccesses(e, 0); err != nil {
-		return fmt.Errorf("recalculateAccesses: %v", err)
+		return errors.Newf("recalculateAccesses: %v", err)
 	}
 
 	if err = t.getMembers(e); err != nil {
-		return fmt.Errorf("getMembers: %v", err)
+		return errors.Newf("getMembers: %v", err)
 	}
 	for _, u := range t.Members {
 		if err = watchRepo(e, u.ID, repo.ID, true); err != nil {
-			return fmt.Errorf("watchRepo: %v", err)
+			return errors.Newf("watchRepo: %v", err)
 		}
 	}
 	return nil
@@ -168,7 +168,7 @@ func (t *Team) removeRepository(e Engine, repo *Repository, recalculate bool) (e
 	}
 
 	if err = t.getMembers(e); err != nil {
-		return fmt.Errorf("get team members: %v", err)
+		return errors.Newf("get team members: %v", err)
 	}
 
 	// TODO: Delete me when this method is migrated to use GORM.
@@ -387,18 +387,18 @@ func UpdateTeam(t *Team, authChanged bool) (err error) {
 	}
 
 	if _, err = sess.ID(t.ID).AllCols().Update(t); err != nil {
-		return fmt.Errorf("update: %v", err)
+		return errors.Newf("update: %v", err)
 	}
 
 	// Update access for team members if needed.
 	if authChanged {
 		if err = t.getRepositories(sess); err != nil {
-			return fmt.Errorf("getRepositories:%v", err)
+			return errors.Newf("getRepositories:%v", err)
 		}
 
 		for _, repo := range t.Repos {
 			if err = repo.recalculateTeamAccesses(sess, 0); err != nil {
-				return fmt.Errorf("recalculateTeamAccesses: %v", err)
+				return errors.Newf("recalculateTeamAccesses: %v", err)
 			}
 		}
 	}
@@ -478,13 +478,13 @@ func getTeamMembers(e Engine, teamID int64) (_ []*User, err error) {
 	teamUsers := make([]*TeamUser, 0, 10)
 	if err = e.Sql("SELECT `id`, `org_id`, `team_id`, `uid` FROM `team_user` WHERE team_id = ?", teamID).
 		Find(&teamUsers); err != nil {
-		return nil, fmt.Errorf("get team-users: %v", err)
+		return nil, errors.Newf("get team-users: %v", err)
 	}
 	members := make([]*User, 0, len(teamUsers))
 	for i := range teamUsers {
 		member := new(User)
 		if _, err = e.ID(teamUsers[i].UID).Get(member); err != nil {
-			return nil, fmt.Errorf("get user '%d': %v", teamUsers[i].UID, err)
+			return nil, errors.Newf("get user '%d': %v", teamUsers[i].UID, err)
 		}
 		members = append(members, member)
 	}

+ 1 - 1
internal/database/organizations.go

@@ -3,7 +3,7 @@ package database
 import (
 	"context"
 
-	"github.com/pkg/errors"
+	"github.com/cockroachdb/errors"
 	"gorm.io/gorm"
 
 	"gogs.io/gogs/internal/dbutil"

+ 1 - 1
internal/database/permissions.go

@@ -3,7 +3,7 @@ package database
 import (
 	"context"
 
-	"github.com/pkg/errors"
+	"github.com/cockroachdb/errors"
 	"gorm.io/gorm"
 	log "unknwon.dev/clog/v2"
 )

+ 1 - 1
internal/database/public_keys.go

@@ -4,7 +4,7 @@ import (
 	"os"
 	"path/filepath"
 
-	"github.com/pkg/errors"
+	"github.com/cockroachdb/errors"
 	"gorm.io/gorm"
 
 	"gogs.io/gogs/internal/conf"

+ 40 - 39
internal/database/pull.go

@@ -7,6 +7,7 @@ import (
 	"path/filepath"
 	"time"
 
+	"github.com/cockroachdb/errors"
 	"github.com/unknwon/com"
 	log "unknwon.dev/clog/v2"
 	"xorm.io/xorm"
@@ -86,14 +87,14 @@ func (pr *PullRequest) loadAttributes(e Engine) (err error) {
 	if pr.HeadRepo == nil {
 		pr.HeadRepo, err = getRepositoryByID(e, pr.HeadRepoID)
 		if err != nil && !IsErrRepoNotExist(err) {
-			return fmt.Errorf("get head repository by ID: %v", err)
+			return errors.Newf("get head repository by ID: %v", err)
 		}
 	}
 
 	if pr.BaseRepo == nil {
 		pr.BaseRepo, err = getRepositoryByID(e, pr.BaseRepoID)
 		if err != nil {
-			return fmt.Errorf("get base repository by ID: %v", err)
+			return errors.Newf("get base repository by ID: %v", err)
 		}
 	}
 
@@ -103,7 +104,7 @@ func (pr *PullRequest) loadAttributes(e Engine) (err error) {
 			pr.MergerID = -1
 			pr.Merger = NewGhostUser()
 		} else if err != nil {
-			return fmt.Errorf("get merger by ID: %v", err)
+			return errors.Newf("get merger by ID: %v", err)
 		}
 	}
 
@@ -205,13 +206,13 @@ func (pr *PullRequest) Merge(doer *User, baseGitRepo *git.Repository, mergeStyle
 	}
 
 	if err = pr.Issue.changeStatus(sess, doer, pr.Issue.Repo, true); err != nil {
-		return fmt.Errorf("Issue.changeStatus: %v", err)
+		return errors.Newf("Issue.changeStatus: %v", err)
 	}
 
 	headRepoPath := RepoPath(pr.HeadUserName, pr.HeadRepo.Name)
 	headGitRepo, err := git.Open(headRepoPath)
 	if err != nil {
-		return fmt.Errorf("open repository: %v", err)
+		return errors.Newf("open repository: %v", err)
 	}
 
 	// Create temporary directory to store temporary copy of the base repository,
@@ -230,21 +231,21 @@ func (pr *PullRequest) Merge(doer *User, baseGitRepo *git.Repository, mergeStyle
 	if _, stderr, err = process.ExecTimeout(5*time.Minute,
 		fmt.Sprintf("PullRequest.Merge (git clone): %s", tmpBasePath),
 		"git", "clone", "-b", pr.BaseBranch, baseGitRepo.Path(), tmpBasePath); err != nil {
-		return fmt.Errorf("git clone: %s", stderr)
+		return errors.Newf("git clone: %s", stderr)
 	}
 
 	// Add remote which points to the head repository.
 	if _, stderr, err = process.ExecDir(-1, tmpBasePath,
 		fmt.Sprintf("PullRequest.Merge (git remote add): %s", tmpBasePath),
 		"git", "remote", "add", "head_repo", headRepoPath); err != nil {
-		return fmt.Errorf("git remote add [%s -> %s]: %s", headRepoPath, tmpBasePath, stderr)
+		return errors.Newf("git remote add [%s -> %s]: %s", headRepoPath, tmpBasePath, stderr)
 	}
 
 	// Fetch information from head repository to the temporary copy.
 	if _, stderr, err = process.ExecDir(-1, tmpBasePath,
 		fmt.Sprintf("PullRequest.Merge (git fetch): %s", tmpBasePath),
 		"git", "fetch", "head_repo"); err != nil {
-		return fmt.Errorf("git fetch [%s -> %s]: %s", headRepoPath, tmpBasePath, stderr)
+		return errors.Newf("git fetch [%s -> %s]: %s", headRepoPath, tmpBasePath, stderr)
 	}
 
 	remoteHeadBranch := "head_repo/" + pr.HeadBranch
@@ -261,7 +262,7 @@ func (pr *PullRequest) Merge(doer *User, baseGitRepo *git.Repository, mergeStyle
 		if _, stderr, err = process.ExecDir(-1, tmpBasePath,
 			fmt.Sprintf("PullRequest.Merge (git merge --no-ff --no-commit): %s", tmpBasePath),
 			"git", "merge", "--no-ff", "--no-commit", remoteHeadBranch); err != nil {
-			return fmt.Errorf("git merge --no-ff --no-commit [%s]: %v - %s", tmpBasePath, err, stderr)
+			return errors.Newf("git merge --no-ff --no-commit [%s]: %v - %s", tmpBasePath, err, stderr)
 		}
 
 		// Create a merge commit for the base branch.
@@ -270,7 +271,7 @@ func (pr *PullRequest) Merge(doer *User, baseGitRepo *git.Repository, mergeStyle
 			"git", "commit", fmt.Sprintf("--author='%s <%s>'", doer.DisplayName(), doer.Email),
 			"-m", fmt.Sprintf("Merge branch '%s' of %s/%s into %s", pr.HeadBranch, pr.HeadUserName, pr.HeadRepo.Name, pr.BaseBranch),
 			"-m", commitDescription); err != nil {
-			return fmt.Errorf("git commit [%s]: %v - %s", tmpBasePath, err, stderr)
+			return errors.Newf("git commit [%s]: %v - %s", tmpBasePath, err, stderr)
 		}
 
 	case MergeStyleRebase: // Rebase before merging
@@ -279,7 +280,7 @@ func (pr *PullRequest) Merge(doer *User, baseGitRepo *git.Repository, mergeStyle
 		if _, stderr, err = process.ExecDir(-1, tmpBasePath,
 			fmt.Sprintf("PullRequest.Merge (git rebase): %s", tmpBasePath),
 			"git", "rebase", "--quiet", pr.BaseBranch, remoteHeadBranch); err != nil {
-			return fmt.Errorf("git rebase [%s on %s]: %s", remoteHeadBranch, pr.BaseBranch, stderr)
+			return errors.Newf("git rebase [%s on %s]: %s", remoteHeadBranch, pr.BaseBranch, stderr)
 		}
 
 		// Name non-branch commit state to a new temporary branch in order to save changes.
@@ -287,48 +288,48 @@ func (pr *PullRequest) Merge(doer *User, baseGitRepo *git.Repository, mergeStyle
 		if _, stderr, err = process.ExecDir(-1, tmpBasePath,
 			fmt.Sprintf("PullRequest.Merge (git checkout): %s", tmpBasePath),
 			"git", "checkout", "-b", tmpBranch); err != nil {
-			return fmt.Errorf("git checkout '%s': %s", tmpBranch, stderr)
+			return errors.Newf("git checkout '%s': %s", tmpBranch, stderr)
 		}
 
 		// Check out the base branch to be operated on.
 		if _, stderr, err = process.ExecDir(-1, tmpBasePath,
 			fmt.Sprintf("PullRequest.Merge (git checkout): %s", tmpBasePath),
 			"git", "checkout", pr.BaseBranch); err != nil {
-			return fmt.Errorf("git checkout '%s': %s", pr.BaseBranch, stderr)
+			return errors.Newf("git checkout '%s': %s", pr.BaseBranch, stderr)
 		}
 
 		// Merge changes from temporary branch to the base branch.
 		if _, stderr, err = process.ExecDir(-1, tmpBasePath,
 			fmt.Sprintf("PullRequest.Merge (git merge): %s", tmpBasePath),
 			"git", "merge", tmpBranch); err != nil {
-			return fmt.Errorf("git merge [%s]: %v - %s", tmpBasePath, err, stderr)
+			return errors.Newf("git merge [%s]: %v - %s", tmpBasePath, err, stderr)
 		}
 
 	default:
-		return fmt.Errorf("unknown merge style: %s", mergeStyle)
+		return errors.Newf("unknown merge style: %s", mergeStyle)
 	}
 
 	// Push changes on base branch to upstream.
 	if _, stderr, err = process.ExecDir(-1, tmpBasePath,
 		fmt.Sprintf("PullRequest.Merge (git push): %s", tmpBasePath),
 		"git", "push", baseGitRepo.Path(), pr.BaseBranch); err != nil {
-		return fmt.Errorf("git push: %s", stderr)
+		return errors.Newf("git push: %s", stderr)
 	}
 
 	pr.MergedCommitID, err = headGitRepo.BranchCommitID(pr.HeadBranch)
 	if err != nil {
-		return fmt.Errorf("get head branch %q commit ID: %v", pr.HeadBranch, err)
+		return errors.Newf("get head branch %q commit ID: %v", pr.HeadBranch, err)
 	}
 
 	pr.HasMerged = true
 	pr.Merged = time.Now()
 	pr.MergerID = doer.ID
 	if _, err = sess.ID(pr.ID).AllCols().Update(pr); err != nil {
-		return fmt.Errorf("update pull request: %v", err)
+		return errors.Newf("update pull request: %v", err)
 	}
 
 	if err = sess.Commit(); err != nil {
-		return fmt.Errorf("commit: %v", err)
+		return errors.Newf("commit: %v", err)
 	}
 
 	if err = Handle.Actions().MergePullRequest(ctx, doer, pr.Issue.Repo.Owner, pr.Issue.Repo, pr.Issue); err != nil {
@@ -398,13 +399,13 @@ func (pr *PullRequest) testPatch() (err error) {
 	if pr.BaseRepo == nil {
 		pr.BaseRepo, err = GetRepositoryByID(pr.BaseRepoID)
 		if err != nil {
-			return fmt.Errorf("GetRepositoryByID: %v", err)
+			return errors.Newf("GetRepositoryByID: %v", err)
 		}
 	}
 
 	patchPath, err := pr.BaseRepo.PatchPath(pr.Index)
 	if err != nil {
-		return fmt.Errorf("BaseRepo.PatchPath: %v", err)
+		return errors.Newf("BaseRepo.PatchPath: %v", err)
 	}
 
 	// Fast fail if patch does not exist, this assumes data is corrupted.
@@ -419,7 +420,7 @@ func (pr *PullRequest) testPatch() (err error) {
 	log.Trace("PullRequest[%d].testPatch (patchPath): %s", pr.ID, patchPath)
 
 	if err := pr.BaseRepo.UpdateLocalCopyBranch(pr.BaseBranch); err != nil {
-		return fmt.Errorf("UpdateLocalCopy [%d]: %v", pr.BaseRepoID, err)
+		return errors.Newf("UpdateLocalCopy [%d]: %v", pr.BaseRepoID, err)
 	}
 
 	args := []string{"apply", "--check"}
@@ -455,17 +456,17 @@ func NewPullRequest(repo *Repository, pull *Issue, labelIDs []int64, uuids []str
 		Attachments: uuids,
 		IsPull:      true,
 	}); err != nil {
-		return fmt.Errorf("newIssue: %v", err)
+		return errors.Newf("newIssue: %v", err)
 	}
 
 	pr.Index = pull.Index
 	if err = repo.SavePatch(pr.Index, patch); err != nil {
-		return fmt.Errorf("SavePatch: %v", err)
+		return errors.Newf("SavePatch: %v", err)
 	}
 
 	pr.BaseRepo = repo
 	if err = pr.testPatch(); err != nil {
-		return fmt.Errorf("testPatch: %v", err)
+		return errors.Newf("testPatch: %v", err)
 	}
 	// No conflict appears after test means mergeable.
 	if pr.Status == PullRequestStatusChecking {
@@ -474,11 +475,11 @@ func NewPullRequest(repo *Repository, pull *Issue, labelIDs []int64, uuids []str
 
 	pr.IssueID = pull.ID
 	if _, err = sess.Insert(pr); err != nil {
-		return fmt.Errorf("insert pull repo: %v", err)
+		return errors.Newf("insert pull repo: %v", err)
 	}
 
 	if err = sess.Commit(); err != nil {
-		return fmt.Errorf("commit: %v", err)
+		return errors.Newf("commit: %v", err)
 	}
 
 	if err = NotifyWatchers(&Action{
@@ -620,7 +621,7 @@ func (pr *PullRequest) UpdateCols(cols ...string) error {
 func (pr *PullRequest) UpdatePatch() (err error) {
 	headGitRepo, err := git.Open(pr.HeadRepo.RepoPath())
 	if err != nil {
-		return fmt.Errorf("open repository: %v", err)
+		return errors.Newf("open repository: %v", err)
 	}
 
 	// Add a temporary remote.
@@ -628,7 +629,7 @@ func (pr *PullRequest) UpdatePatch() (err error) {
 	baseRepoPath := RepoPath(pr.BaseRepo.MustOwner().Name, pr.BaseRepo.Name)
 	err = headGitRepo.RemoteAdd(tmpRemote, baseRepoPath, git.RemoteAddOptions{Fetch: true})
 	if err != nil {
-		return fmt.Errorf("add remote %q [repo_id: %d]: %v", tmpRemote, pr.HeadRepoID, err)
+		return errors.Newf("add remote %q [repo_id: %d]: %v", tmpRemote, pr.HeadRepoID, err)
 	}
 	defer func() {
 		if err := headGitRepo.RemoteRemove(tmpRemote); err != nil {
@@ -639,18 +640,18 @@ func (pr *PullRequest) UpdatePatch() (err error) {
 	remoteBranch := "remotes/" + tmpRemote + "/" + pr.BaseBranch
 	pr.MergeBase, err = headGitRepo.MergeBase(remoteBranch, pr.HeadBranch)
 	if err != nil {
-		return fmt.Errorf("get merge base: %v", err)
+		return errors.Newf("get merge base: %v", err)
 	} else if err = pr.Update(); err != nil {
-		return fmt.Errorf("update: %v", err)
+		return errors.Newf("update: %v", err)
 	}
 
 	patch, err := headGitRepo.DiffBinary(pr.MergeBase, pr.HeadBranch)
 	if err != nil {
-		return fmt.Errorf("get binary patch: %v", err)
+		return errors.Newf("get binary patch: %v", err)
 	}
 
 	if err = pr.BaseRepo.SavePatch(pr.Index, patch); err != nil {
-		return fmt.Errorf("save patch: %v", err)
+		return errors.Newf("save patch: %v", err)
 	}
 
 	log.Trace("PullRequest[%d].UpdatePatch: patch saved", pr.ID)
@@ -666,12 +667,12 @@ func (pr *PullRequest) PushToBaseRepo() (err error) {
 	headRepoPath := pr.HeadRepo.RepoPath()
 	headGitRepo, err := git.Open(headRepoPath)
 	if err != nil {
-		return fmt.Errorf("open repository: %v", err)
+		return errors.Newf("open repository: %v", err)
 	}
 
 	tmpRemote := fmt.Sprintf("tmp-pull-%d", pr.ID)
 	if err = headGitRepo.RemoteAdd(tmpRemote, pr.BaseRepo.RepoPath()); err != nil {
-		return fmt.Errorf("add remote %q [repo_id: %d]: %v", tmpRemote, pr.HeadRepoID, err)
+		return errors.Newf("add remote %q [repo_id: %d]: %v", tmpRemote, pr.HeadRepoID, err)
 	}
 
 	// Make sure to remove the remote even if the push fails
@@ -686,13 +687,13 @@ func (pr *PullRequest) PushToBaseRepo() (err error) {
 	if osutil.Exist(headFile) {
 		err = os.Remove(headFile)
 		if err != nil {
-			return fmt.Errorf("remove head file [repo_id: %d]: %v", pr.BaseRepoID, err)
+			return errors.Newf("remove head file [repo_id: %d]: %v", pr.BaseRepoID, err)
 		}
 	}
 
 	err = headGitRepo.Push(tmpRemote, fmt.Sprintf("%s:%s", pr.HeadBranch, headRefspec))
 	if err != nil {
-		return fmt.Errorf("push: %v", err)
+		return errors.Newf("push: %v", err)
 	}
 
 	return nil
@@ -726,7 +727,7 @@ func (prs PullRequestList) loadAttributes(e Engine) (err error) {
 	}
 	issues := make([]*Issue, 0, len(issueIDs))
 	if err = e.Where("id > 0").In("id", issueIDs).Find(&issues); err != nil {
-		return fmt.Errorf("find issues: %v", err)
+		return errors.Newf("find issues: %v", err)
 	}
 	for i := range issues {
 		set[issues[i].ID] = issues[i]
@@ -738,7 +739,7 @@ func (prs PullRequestList) loadAttributes(e Engine) (err error) {
 	// Load attributes
 	for i := range prs {
 		if err = prs[i].loadAttributes(e); err != nil {
-			return fmt.Errorf("loadAttributes [%d]: %v", prs[i].ID, err)
+			return errors.Newf("loadAttributes [%d]: %v", prs[i].ID, err)
 		}
 	}
 

+ 21 - 20
internal/database/release.go

@@ -9,6 +9,7 @@ import (
 	log "unknwon.dev/clog/v2"
 	"xorm.io/xorm"
 
+	"github.com/cockroachdb/errors"
 	"github.com/gogs/git-module"
 	api "github.com/gogs/go-gogs-client"
 
@@ -57,7 +58,7 @@ func (r *Release) loadAttributes(e Engine) (err error) {
 	if r.Repo == nil {
 		r.Repo, err = getRepositoryByID(e, r.RepoID)
 		if err != nil {
-			return fmt.Errorf("getRepositoryByID [repo_id: %d]: %v", r.RepoID, err)
+			return errors.Newf("getRepositoryByID [repo_id: %d]: %v", r.RepoID, err)
 		}
 	}
 
@@ -68,7 +69,7 @@ func (r *Release) loadAttributes(e Engine) (err error) {
 				r.PublisherID = -1
 				r.Publisher = NewGhostUser()
 			} else {
-				return fmt.Errorf("getUserByID.(Publisher) [publisher_id: %d]: %v", r.PublisherID, err)
+				return errors.Newf("getUserByID.(Publisher) [publisher_id: %d]: %v", r.PublisherID, err)
 			}
 		}
 	}
@@ -76,7 +77,7 @@ func (r *Release) loadAttributes(e Engine) (err error) {
 	if r.Attachments == nil {
 		r.Attachments, err = getAttachmentsByReleaseID(e, r.ID)
 		if err != nil {
-			return fmt.Errorf("getAttachmentsByReleaseID [%d]: %v", r.ID, err)
+			return errors.Newf("getAttachmentsByReleaseID [%d]: %v", r.ID, err)
 		}
 	}
 
@@ -118,7 +119,7 @@ func createTag(gitRepo *git.Repository, r *Release) error {
 		if !gitRepo.HasTag(r.TagName) {
 			commit, err := gitRepo.BranchCommit(r.Target)
 			if err != nil {
-				return fmt.Errorf("get branch commit: %v", err)
+				return errors.Newf("get branch commit: %v", err)
 			}
 
 			// 🚨 SECURITY: Trim any leading '-' to prevent command line argument injection.
@@ -132,13 +133,13 @@ func createTag(gitRepo *git.Repository, r *Release) error {
 		} else {
 			commit, err := gitRepo.TagCommit(r.TagName)
 			if err != nil {
-				return fmt.Errorf("get tag commit: %v", err)
+				return errors.Newf("get tag commit: %v", err)
 			}
 
 			r.Sha1 = commit.ID.String()
 			r.NumCommits, err = commit.CommitsCount()
 			if err != nil {
-				return fmt.Errorf("count commits: %v", err)
+				return errors.Newf("count commits: %v", err)
 			}
 		}
 	}
@@ -177,17 +178,17 @@ func NewRelease(gitRepo *git.Repository, r *Release, uuids []string) error {
 	}
 
 	if _, err = sess.Insert(r); err != nil {
-		return fmt.Errorf("insert: %v", err)
+		return errors.Newf("insert: %v", err)
 	}
 
 	if len(uuids) > 0 {
 		if _, err = sess.In("uuid", uuids).Cols("release_id").Update(&Attachment{ReleaseID: r.ID}); err != nil {
-			return fmt.Errorf("link attachments: %v", err)
+			return errors.Newf("link attachments: %v", err)
 		}
 	}
 
 	if err = sess.Commit(); err != nil {
-		return fmt.Errorf("commit: %v", err)
+		return errors.Newf("commit: %v", err)
 	}
 
 	// Only send webhook when actually published, skip drafts
@@ -196,7 +197,7 @@ func NewRelease(gitRepo *git.Repository, r *Release, uuids []string) error {
 	}
 	r, err = GetReleaseByID(r.ID)
 	if err != nil {
-		return fmt.Errorf("GetReleaseByID: %v", err)
+		return errors.Newf("GetReleaseByID: %v", err)
 	}
 	r.preparePublishWebhooks()
 	return nil
@@ -232,7 +233,7 @@ func GetRelease(repoID int64, tagName string) (*Release, error) {
 
 	r := &Release{RepoID: repoID, LowerTagName: strings.ToLower(tagName)}
 	if _, err = x.Get(r); err != nil {
-		return nil, fmt.Errorf("get: %v", err)
+		return nil, errors.Newf("get: %v", err)
 	}
 
 	return r, r.LoadAttributes()
@@ -304,7 +305,7 @@ func SortReleases(rels []*Release) {
 // UpdateRelease updates information of a release.
 func UpdateRelease(doer *User, gitRepo *git.Repository, r *Release, isPublish bool, uuids []string) (err error) {
 	if err = createTag(gitRepo, r); err != nil {
-		return fmt.Errorf("createTag: %v", err)
+		return errors.Newf("createTag: %v", err)
 	}
 
 	r.PublisherID = doer.ID
@@ -315,22 +316,22 @@ func UpdateRelease(doer *User, gitRepo *git.Repository, r *Release, isPublish bo
 		return err
 	}
 	if _, err = sess.ID(r.ID).AllCols().Update(r); err != nil {
-		return fmt.Errorf("Update: %v", err)
+		return errors.Newf("Update: %v", err)
 	}
 
 	// Unlink all current attachments and link back later if still valid
 	if _, err = sess.Exec("UPDATE attachment SET release_id = 0 WHERE release_id = ?", r.ID); err != nil {
-		return fmt.Errorf("unlink current attachments: %v", err)
+		return errors.Newf("unlink current attachments: %v", err)
 	}
 
 	if len(uuids) > 0 {
 		if _, err = sess.In("uuid", uuids).Cols("release_id").Update(&Attachment{ReleaseID: r.ID}); err != nil {
-			return fmt.Errorf("link attachments: %v", err)
+			return errors.Newf("link attachments: %v", err)
 		}
 	}
 
 	if err = sess.Commit(); err != nil {
-		return fmt.Errorf("commit: %v", err)
+		return errors.Newf("commit: %v", err)
 	}
 
 	if !isPublish {
@@ -345,7 +346,7 @@ func UpdateRelease(doer *User, gitRepo *git.Repository, r *Release, isPublish bo
 func DeleteReleaseOfRepoByID(repoID, id int64) error {
 	rel, err := GetReleaseByID(id)
 	if err != nil {
-		return fmt.Errorf("GetReleaseByID: %v", err)
+		return errors.Newf("GetReleaseByID: %v", err)
 	}
 
 	// Mark sure the delete operation against same repository.
@@ -355,18 +356,18 @@ func DeleteReleaseOfRepoByID(repoID, id int64) error {
 
 	repo, err := GetRepositoryByID(rel.RepoID)
 	if err != nil {
-		return fmt.Errorf("GetRepositoryByID: %v", err)
+		return errors.Newf("GetRepositoryByID: %v", err)
 	}
 
 	_, stderr, err := process.ExecDir(-1, repo.RepoPath(),
 		fmt.Sprintf("DeleteReleaseByID (git tag -d): %d", rel.ID),
 		"git", "tag", "-d", rel.TagName)
 	if err != nil && !strings.Contains(stderr, "not found") {
-		return fmt.Errorf("git tag -d: %v - %s", err, stderr)
+		return errors.Newf("git tag -d: %v - %s", err, stderr)
 	}
 
 	if _, err = x.Id(rel.ID).Delete(new(Release)); err != nil {
-		return fmt.Errorf("delete: %v", err)
+		return errors.Newf("delete: %v", err)
 	}
 
 	return nil

+ 114 - 114
internal/database/repo.go

@@ -15,8 +15,8 @@ import (
 	"strings"
 	"time"
 
+	"github.com/cockroachdb/errors"
 	"github.com/nfnt/resize"
-	"github.com/pkg/errors"
 	"github.com/unknwon/cae/zip"
 	"github.com/unknwon/com"
 	"gopkg.in/ini.v1"
@@ -256,7 +256,7 @@ func (r *Repository) loadAttributes(e Engine) (err error) {
 	if r.Owner == nil {
 		r.Owner, err = getUserByID(e, r.OwnerID)
 		if err != nil {
-			return fmt.Errorf("getUserByID [%d]: %v", r.OwnerID, err)
+			return errors.Newf("getUserByID [%d]: %v", r.OwnerID, err)
 		}
 	}
 
@@ -267,7 +267,7 @@ func (r *Repository) loadAttributes(e Engine) (err error) {
 				r.IsFork = false
 				r.ForkID = 0
 			} else {
-				return fmt.Errorf("get fork repository by ID: %v", err)
+				return errors.Newf("get fork repository by ID: %v", err)
 			}
 		}
 	}
@@ -337,19 +337,19 @@ func (r *Repository) AvatarLink() string {
 func (r *Repository) UploadAvatar(data []byte) error {
 	img, _, err := image.Decode(bytes.NewReader(data))
 	if err != nil {
-		return fmt.Errorf("decode image: %v", err)
+		return errors.Newf("decode image: %v", err)
 	}
 
 	_ = os.MkdirAll(conf.Picture.RepositoryAvatarUploadPath, os.ModePerm)
 	fw, err := os.Create(r.CustomAvatarPath())
 	if err != nil {
-		return fmt.Errorf("create custom avatar directory: %v", err)
+		return errors.Newf("create custom avatar directory: %v", err)
 	}
 	defer fw.Close()
 
 	m := resize.Resize(avatar.DefaultSize, avatar.DefaultSize, img, resize.NearestNeighbor)
 	if err = png.Encode(fw, m); err != nil {
-		return fmt.Errorf("encode image: %v", err)
+		return errors.Newf("encode image: %v", err)
 	}
 
 	return nil
@@ -446,12 +446,12 @@ func (r *Repository) mustOwner(e Engine) *User {
 func (r *Repository) UpdateSize() error {
 	countObject, err := git.CountObjects(r.RepoPath())
 	if err != nil {
-		return fmt.Errorf("count repository objects: %v", err)
+		return errors.Newf("count repository objects: %v", err)
 	}
 
 	r.Size = countObject.Size + countObject.SizePack
 	if _, err = x.Id(r.ID).Cols("size").Update(r); err != nil {
-		return fmt.Errorf("update size: %v", err)
+		return errors.Newf("update size: %v", err)
 	}
 	return nil
 }
@@ -664,24 +664,24 @@ func UpdateLocalCopyBranch(repoPath, localPath, branch string, isWiki bool) (err
 			Branch:  branch,
 			Timeout: time.Duration(conf.Git.Timeout.Clone) * time.Second,
 		}); err != nil {
-			return fmt.Errorf("git clone [branch: %s]: %v", branch, err)
+			return errors.Newf("git clone [branch: %s]: %v", branch, err)
 		}
 		return nil
 	}
 
 	gitRepo, err := git.Open(localPath)
 	if err != nil {
-		return fmt.Errorf("open repository: %v", err)
+		return errors.Newf("open repository: %v", err)
 	}
 
 	if err = gitRepo.Fetch(git.FetchOptions{
 		Prune: true,
 	}); err != nil {
-		return fmt.Errorf("fetch: %v", err)
+		return errors.Newf("fetch: %v", err)
 	}
 
 	if err = gitRepo.Checkout(branch); err != nil {
-		return fmt.Errorf("checkout [branch: %s]: %v", branch, err)
+		return errors.Newf("checkout [branch: %s]: %v", branch, err)
 	}
 
 	// Reset to align with remote in case of force push.
@@ -689,7 +689,7 @@ func UpdateLocalCopyBranch(repoPath, localPath, branch string, isWiki bool) (err
 	if err = gitRepo.Reset(rev, git.ResetOptions{
 		Hard: true,
 	}); err != nil {
-		return fmt.Errorf("reset [revision: %s]: %v", rev, err)
+		return errors.Newf("reset [revision: %s]: %v", rev, err)
 	}
 	return nil
 }
@@ -712,14 +712,14 @@ func (r *Repository) PatchPath(index int64) (string, error) {
 func (r *Repository) SavePatch(index int64, patch []byte) error {
 	patchPath, err := r.PatchPath(index)
 	if err != nil {
-		return fmt.Errorf("PatchPath: %v", err)
+		return errors.Newf("PatchPath: %v", err)
 	}
 
 	if err = os.MkdirAll(filepath.Dir(patchPath), os.ModePerm); err != nil {
 		return err
 	}
 	if err = os.WriteFile(patchPath, patch, 0o644); err != nil {
-		return fmt.Errorf("WriteFile: %v", err)
+		return errors.Newf("WriteFile: %v", err)
 	}
 
 	return nil
@@ -825,7 +825,7 @@ func MigrateRepository(doer, owner *User, opts MigrateRepoOptions) (*Repository,
 		Quiet:   true,
 		Timeout: migrateTimeout,
 	}); err != nil {
-		return repo, fmt.Errorf("clone: %v", err)
+		return repo, errors.Newf("clone: %v", err)
 	}
 
 	wikiRemotePath := wikiRemoteURL(opts.RemoteAddr)
@@ -847,7 +847,7 @@ func MigrateRepository(doer, owner *User, opts MigrateRepoOptions) (*Repository,
 		if strings.Contains(stderr, "fatal: bad default revision 'HEAD'") {
 			repo.IsBare = true
 		} else {
-			return repo, fmt.Errorf("check bare: %v - %s", err, stderr)
+			return repo, errors.Newf("check bare: %v - %s", err, stderr)
 		}
 	}
 
@@ -855,11 +855,11 @@ func MigrateRepository(doer, owner *User, opts MigrateRepoOptions) (*Repository,
 		// Try to get HEAD branch and set it as default branch.
 		gitRepo, err := git.Open(repoPath)
 		if err != nil {
-			return repo, fmt.Errorf("open repository: %v", err)
+			return repo, errors.Newf("open repository: %v", err)
 		}
 		refspec, err := gitRepo.SymbolicRef()
 		if err != nil {
-			return repo, fmt.Errorf("get HEAD branch: %v", err)
+			return repo, errors.Newf("get HEAD branch: %v", err)
 		}
 		repo.DefaultBranch = git.RefShortName(refspec)
 
@@ -875,7 +875,7 @@ func MigrateRepository(doer, owner *User, opts MigrateRepoOptions) (*Repository,
 			EnablePrune: true,
 			NextSync:    time.Now().Add(time.Duration(conf.Mirror.DefaultInterval) * time.Hour),
 		}); err != nil {
-			return repo, fmt.Errorf("InsertOne: %v", err)
+			return repo, errors.Newf("InsertOne: %v", err)
 		}
 
 		repo.IsMirror = true
@@ -890,11 +890,11 @@ func MigrateRepository(doer, owner *User, opts MigrateRepoOptions) (*Repository,
 func cleanUpMigrateGitConfig(configPath string) error {
 	cfg, err := ini.Load(configPath)
 	if err != nil {
-		return fmt.Errorf("open config file: %v", err)
+		return errors.Newf("open config file: %v", err)
 	}
 	cfg.DeleteSection("remote \"origin\"")
 	if err = cfg.SaveToIndent(configPath, "\t"); err != nil {
-		return fmt.Errorf("save config file: %v", err)
+		return errors.Newf("save config file: %v", err)
 	}
 	return nil
 }
@@ -911,7 +911,7 @@ func createDelegateHooks(repoPath string) (err error) {
 		if err = os.WriteFile(hookPath,
 			[]byte(fmt.Sprintf(hooksTpls[name], conf.Repository.ScriptType, conf.AppPath(), conf.CustomConf)),
 			os.ModePerm); err != nil {
-			return fmt.Errorf("create delegate hook '%s': %v", hookPath, err)
+			return errors.Newf("create delegate hook '%s': %v", hookPath, err)
 		}
 	}
 	return nil
@@ -921,20 +921,20 @@ func createDelegateHooks(repoPath string) (err error) {
 func CleanUpMigrateInfo(repo *Repository) (*Repository, error) {
 	repoPath := repo.RepoPath()
 	if err := createDelegateHooks(repoPath); err != nil {
-		return repo, fmt.Errorf("createDelegateHooks: %v", err)
+		return repo, errors.Newf("createDelegateHooks: %v", err)
 	}
 	if repo.HasWiki() {
 		if err := createDelegateHooks(repo.WikiPath()); err != nil {
-			return repo, fmt.Errorf("createDelegateHooks.(wiki): %v", err)
+			return repo, errors.Newf("createDelegateHooks.(wiki): %v", err)
 		}
 	}
 
 	if err := cleanUpMigrateGitConfig(repo.GitConfigPath()); err != nil {
-		return repo, fmt.Errorf("cleanUpMigrateGitConfig: %v", err)
+		return repo, errors.Newf("cleanUpMigrateGitConfig: %v", err)
 	}
 	if repo.HasWiki() {
 		if err := cleanUpMigrateGitConfig(path.Join(repo.WikiPath(), "config")); err != nil {
-			return repo, fmt.Errorf("cleanUpMigrateGitConfig.(wiki): %v", err)
+			return repo, errors.Newf("cleanUpMigrateGitConfig.(wiki): %v", err)
 		}
 	}
 
@@ -947,20 +947,20 @@ func initRepoCommit(tmpPath string, sig *git.Signature) (err error) {
 	if _, stderr, err = process.ExecDir(-1,
 		tmpPath, fmt.Sprintf("initRepoCommit (git add): %s", tmpPath),
 		"git", "add", "--all"); err != nil {
-		return fmt.Errorf("git add: %s", stderr)
+		return errors.Newf("git add: %s", stderr)
 	}
 
 	if _, stderr, err = process.ExecDir(-1,
 		tmpPath, fmt.Sprintf("initRepoCommit (git commit): %s", tmpPath),
 		"git", "commit", fmt.Sprintf("--author='%s <%s>'", sig.Name, sig.Email),
 		"-m", "Initial commit"); err != nil {
-		return fmt.Errorf("git commit: %s", stderr)
+		return errors.Newf("git commit: %s", stderr)
 	}
 
 	if _, stderr, err = process.ExecDir(-1,
 		tmpPath, fmt.Sprintf("initRepoCommit (git push): %s", tmpPath),
 		"git", "push"); err != nil {
-		return fmt.Errorf("git push: %s", stderr)
+		return errors.Newf("git push: %s", stderr)
 	}
 	return nil
 }
@@ -998,7 +998,7 @@ func prepareRepoCommit(repo *Repository, tmpDir, repoPath string, opts CreateRep
 	// README
 	data, err := getRepoInitFile("readme", opts.Readme)
 	if err != nil {
-		return fmt.Errorf("getRepoInitFile[%s]: %v", opts.Readme, err)
+		return errors.Newf("getRepoInitFile[%s]: %v", opts.Readme, err)
 	}
 
 	cloneLink := repo.CloneLink()
@@ -1010,7 +1010,7 @@ func prepareRepoCommit(repo *Repository, tmpDir, repoPath string, opts CreateRep
 	}
 	if err = os.WriteFile(filepath.Join(tmpDir, "README.md"),
 		[]byte(com.Expand(string(data), match)), 0o644); err != nil {
-		return fmt.Errorf("write README.md: %v", err)
+		return errors.Newf("write README.md: %v", err)
 	}
 
 	// .gitignore
@@ -1020,7 +1020,7 @@ func prepareRepoCommit(repo *Repository, tmpDir, repoPath string, opts CreateRep
 		for _, name := range names {
 			data, err = getRepoInitFile("gitignore", name)
 			if err != nil {
-				return fmt.Errorf("getRepoInitFile[%s]: %v", name, err)
+				return errors.Newf("getRepoInitFile[%s]: %v", name, err)
 			}
 			buf.WriteString("# ---> " + name + "\n")
 			buf.Write(data)
@@ -1029,7 +1029,7 @@ func prepareRepoCommit(repo *Repository, tmpDir, repoPath string, opts CreateRep
 
 		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 errors.Newf("write .gitignore: %v", err)
 			}
 		}
 	}
@@ -1038,11 +1038,11 @@ func prepareRepoCommit(repo *Repository, tmpDir, repoPath string, opts CreateRep
 	if len(opts.License) > 0 {
 		data, err = getRepoInitFile("license", opts.License)
 		if err != nil {
-			return fmt.Errorf("getRepoInitFile[%s]: %v", opts.License, err)
+			return errors.Newf("getRepoInitFile[%s]: %v", opts.License, err)
 		}
 
 		if err = os.WriteFile(filepath.Join(tmpDir, "LICENSE"), data, 0o644); err != nil {
-			return fmt.Errorf("write LICENSE: %v", err)
+			return errors.Newf("write LICENSE: %v", err)
 		}
 	}
 
@@ -1053,9 +1053,9 @@ func prepareRepoCommit(repo *Repository, tmpDir, repoPath string, opts CreateRep
 func initRepository(e Engine, repoPath string, doer *User, repo *Repository, opts CreateRepoOptionsLegacy) (err error) {
 	// Init bare new repository.
 	if err = git.Init(repoPath, git.InitOptions{Bare: true}); err != nil {
-		return fmt.Errorf("init repository: %v", err)
+		return errors.Newf("init repository: %v", err)
 	} else if err = createDelegateHooks(repoPath); err != nil {
-		return fmt.Errorf("createDelegateHooks: %v", err)
+		return errors.Newf("createDelegateHooks: %v", err)
 	}
 
 	// Set default branch
@@ -1080,7 +1080,7 @@ func initRepository(e Engine, repoPath string, doer *User, repo *Repository, opt
 		defer RemoveAllWithNotice("Delete repository for auto-initialization", tmpDir)
 
 		if err = prepareRepoCommit(repo, tmpDir, repoPath, opts); err != nil {
-			return fmt.Errorf("prepareRepoCommit: %v", err)
+			return errors.Newf("prepareRepoCommit: %v", err)
 		}
 
 		// Apply changes and commit.
@@ -1093,14 +1093,14 @@ func initRepository(e Engine, repoPath string, doer *User, repo *Repository, opt
 			},
 		)
 		if err != nil {
-			return fmt.Errorf("initRepoCommit: %v", err)
+			return errors.Newf("initRepoCommit: %v", err)
 		}
 	}
 
 	// Re-fetch the repository from database before updating it (else it would
 	// override changes that were done earlier with sql)
 	if repo, err = getRepositoryByID(e, repo.ID); err != nil {
-		return fmt.Errorf("getRepositoryByID: %v", err)
+		return errors.Newf("getRepositoryByID: %v", err)
 	}
 
 	if !opts.AutoInit {
@@ -1109,7 +1109,7 @@ func initRepository(e Engine, repoPath string, doer *User, repo *Repository, opt
 
 	repo.DefaultBranch = conf.Repository.DefaultBranch
 	if err = updateRepository(e, repo, false); err != nil {
-		return fmt.Errorf("updateRepository: %v", err)
+		return errors.Newf("updateRepository: %v", err)
 	}
 
 	return nil
@@ -1138,7 +1138,7 @@ func createRepository(e *xorm.Session, doer, owner *User, repo *Repository) (err
 
 	has, err := isRepositoryExist(e, owner, repo.Name)
 	if err != nil {
-		return fmt.Errorf("IsRepositoryExist: %v", err)
+		return errors.Newf("IsRepositoryExist: %v", err)
 	} else if has {
 		return ErrRepoAlreadyExist{args: errutil.Args{"ownerID": owner.ID, "name": repo.Name}}
 	}
@@ -1156,19 +1156,19 @@ func createRepository(e *xorm.Session, doer, owner *User, repo *Repository) (err
 	if owner.IsOrganization() {
 		t, err := owner.getOwnerTeam(e)
 		if err != nil {
-			return fmt.Errorf("getOwnerTeam: %v", err)
+			return errors.Newf("getOwnerTeam: %v", err)
 		} else if err = t.addRepository(e, repo); err != nil {
-			return fmt.Errorf("addRepository: %v", err)
+			return errors.Newf("addRepository: %v", err)
 		}
 	} else {
 		// Organization automatically called this in addRepository method.
 		if err = repo.recalculateAccesses(e); err != nil {
-			return fmt.Errorf("recalculateAccesses: %v", err)
+			return errors.Newf("recalculateAccesses: %v", err)
 		}
 	}
 
 	if err = watchRepo(e, owner.ID, repo.ID, true); err != nil {
-		return fmt.Errorf("watchRepo: %v", err)
+		return errors.Newf("watchRepo: %v", err)
 	}
 
 	// FIXME: This is identical to Actions.NewRepo but we are not yet able to wrap
@@ -1192,7 +1192,7 @@ func createRepository(e *xorm.Session, doer, owner *User, repo *Repository) (err
 		})
 	}
 	if err = newRepoAction(e, doer, repo); err != nil {
-		return fmt.Errorf("newRepoAction: %v", err)
+		return errors.Newf("newRepoAction: %v", err)
 	}
 
 	return repo.loadAttributes(e)
@@ -1248,14 +1248,14 @@ func CreateRepository(doer, owner *User, opts CreateRepoOptionsLegacy) (_ *Repos
 	if !opts.IsMirror {
 		if err = initRepository(sess, repoPath, doer, repo, opts); err != nil {
 			RemoveAllWithNotice("Delete repository for initialization failure", repoPath)
-			return nil, fmt.Errorf("initRepository: %v", err)
+			return nil, errors.Newf("initRepository: %v", err)
 		}
 
 		_, stderr, err := process.ExecDir(-1,
 			repoPath, fmt.Sprintf("CreateRepository 'git update-server-info': %s", repoPath),
 			"git", "update-server-info")
 		if err != nil {
-			return nil, fmt.Errorf("CreateRepository 'git update-server-info': %s", stderr)
+			return nil, errors.Newf("CreateRepository 'git update-server-info': %s", stderr)
 		}
 	}
 	if err = sess.Commit(); err != nil {
@@ -1311,7 +1311,7 @@ func Repositories(page, pageSize int) (_ []*Repository, err error) {
 func RepositoriesWithUsers(page, pageSize int) (_ []*Repository, err error) {
 	repos, err := Repositories(page, pageSize)
 	if err != nil {
-		return nil, fmt.Errorf("Repositories: %v", err)
+		return nil, errors.Newf("Repositories: %v", err)
 	}
 
 	for i := range repos {
@@ -1337,7 +1337,7 @@ func FilterRepositoryWithIssues(repoIDs []int64) ([]int64, error) {
 		In("id", repoIDs).
 		Cols("id").
 		Find(&repos); err != nil {
-		return nil, fmt.Errorf("filter valid repositories %v: %v", repoIDs, err)
+		return nil, errors.Newf("filter valid repositories %v: %v", repoIDs, err)
 	}
 
 	if len(repos) == 0 {
@@ -1362,13 +1362,13 @@ func RepoPath(userName, repoName string) string {
 func TransferOwnership(doer *User, newOwnerName string, repo *Repository) error {
 	newOwner, err := Handle.Users().GetByUsername(context.TODO(), newOwnerName)
 	if err != nil {
-		return fmt.Errorf("get new owner '%s': %v", newOwnerName, err)
+		return errors.Newf("get new owner '%s': %v", newOwnerName, err)
 	}
 
 	// Check if new owner has repository with same name.
 	has, err := IsRepositoryExist(newOwner, repo.Name)
 	if err != nil {
-		return fmt.Errorf("IsRepositoryExist: %v", err)
+		return errors.Newf("IsRepositoryExist: %v", err)
 	} else if has {
 		return ErrRepoAlreadyExist{args: errutil.Args{"ownerName": newOwnerName, "name": repo.Name}}
 	}
@@ -1376,7 +1376,7 @@ func TransferOwnership(doer *User, newOwnerName string, repo *Repository) error
 	sess := x.NewSession()
 	defer sess.Close()
 	if err = sess.Begin(); err != nil {
-		return fmt.Errorf("sess.Begin: %v", err)
+		return errors.Newf("sess.Begin: %v", err)
 	}
 
 	owner := repo.Owner
@@ -1388,13 +1388,13 @@ func TransferOwnership(doer *User, newOwnerName string, repo *Repository) error
 
 	// Update repository.
 	if _, err := sess.ID(repo.ID).Update(repo); err != nil {
-		return fmt.Errorf("update owner: %v", err)
+		return errors.Newf("update owner: %v", err)
 	}
 
 	// Remove redundant collaborators.
 	collaborators, err := repo.getCollaborators(sess)
 	if err != nil {
-		return fmt.Errorf("getCollaborators: %v", err)
+		return errors.Newf("getCollaborators: %v", err)
 	}
 
 	// Dummy object.
@@ -1403,7 +1403,7 @@ func TransferOwnership(doer *User, newOwnerName string, repo *Repository) error
 		collaboration.UserID = c.ID
 		if c.ID == newOwner.ID || newOwner.IsOrgMember(c.ID) {
 			if _, err = sess.Delete(collaboration); err != nil {
-				return fmt.Errorf("remove collaborator '%d': %v", c.ID, err)
+				return errors.Newf("remove collaborator '%d': %v", c.ID, err)
 			}
 		}
 	}
@@ -1411,7 +1411,7 @@ func TransferOwnership(doer *User, newOwnerName string, repo *Repository) error
 	// Remove old team-repository relations.
 	if owner.IsOrganization() {
 		if err = owner.getTeams(sess); err != nil {
-			return fmt.Errorf("getTeams: %v", err)
+			return errors.Newf("getTeams: %v", err)
 		}
 		for _, t := range owner.Teams {
 			if !t.hasRepository(sess, repo.ID) {
@@ -1420,34 +1420,34 @@ func TransferOwnership(doer *User, newOwnerName string, repo *Repository) error
 
 			t.NumRepos--
 			if _, err := sess.ID(t.ID).AllCols().Update(t); err != nil {
-				return fmt.Errorf("decrease team repository count '%d': %v", t.ID, err)
+				return errors.Newf("decrease team repository count '%d': %v", t.ID, err)
 			}
 		}
 
 		if err = owner.removeOrgRepo(sess, repo.ID); err != nil {
-			return fmt.Errorf("removeOrgRepo: %v", err)
+			return errors.Newf("removeOrgRepo: %v", err)
 		}
 	}
 
 	if newOwner.IsOrganization() {
 		t, err := newOwner.getOwnerTeam(sess)
 		if err != nil {
-			return fmt.Errorf("getOwnerTeam: %v", err)
+			return errors.Newf("getOwnerTeam: %v", err)
 		} else if err = t.addRepository(sess, repo); err != nil {
-			return fmt.Errorf("add to owner team: %v", err)
+			return errors.Newf("add to owner team: %v", err)
 		}
 	} else {
 		// Organization called this in addRepository method.
 		if err = repo.recalculateAccesses(sess); err != nil {
-			return fmt.Errorf("recalculateAccesses: %v", err)
+			return errors.Newf("recalculateAccesses: %v", 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 errors.Newf("increase new owner repository count: %v", err)
 	} else if _, err = sess.Exec("UPDATE `user` SET num_repos=num_repos-1 WHERE id=?", owner.ID); err != nil {
-		return fmt.Errorf("decrease old owner repository count: %v", err)
+		return errors.Newf("decrease old owner repository count: %v", err)
 	}
 
 	// Remove watch for organization.
@@ -1458,7 +1458,7 @@ func TransferOwnership(doer *User, newOwnerName string, repo *Repository) error
 	}
 
 	if err = watchRepo(sess, newOwner.ID, repo.ID, true); err != nil {
-		return fmt.Errorf("watchRepo: %v", err)
+		return errors.Newf("watchRepo: %v", err)
 	}
 
 	// FIXME: This is identical to Actions.TransferRepo but we are not yet able to
@@ -1478,7 +1478,7 @@ func TransferOwnership(doer *User, newOwnerName string, repo *Repository) error
 		})
 	}
 	if err = transferRepoAction(sess, doer, owner, repo); err != nil {
-		return fmt.Errorf("transferRepoAction: %v", err)
+		return errors.Newf("transferRepoAction: %v", err)
 	}
 
 	// Rename remote repository to new path and delete local copy.
@@ -1486,7 +1486,7 @@ func TransferOwnership(doer *User, newOwnerName string, repo *Repository) error
 		return err
 	}
 	if err = os.Rename(RepoPath(owner.Name, repo.Name), RepoPath(newOwner.Name, repo.Name)); err != nil {
-		return fmt.Errorf("rename repository directory: %v", err)
+		return errors.Newf("rename repository directory: %v", err)
 	}
 
 	deleteRepoLocalCopy(repo.ID)
@@ -1496,7 +1496,7 @@ func TransferOwnership(doer *User, newOwnerName string, repo *Repository) error
 	if com.IsExist(wikiPath) {
 		RemoveAllWithNotice("Delete repository wiki local copy", repo.LocalWikiPath())
 		if err = os.Rename(wikiPath, WikiPath(newOwner.Name, repo.Name)); err != nil {
-			return fmt.Errorf("rename repository wiki: %v", err)
+			return errors.Newf("rename repository wiki: %v", err)
 		}
 	}
 
@@ -1519,25 +1519,25 @@ func ChangeRepositoryName(u *User, oldRepoName, newRepoName string) (err error)
 
 	has, err := IsRepositoryExist(u, newRepoName)
 	if err != nil {
-		return fmt.Errorf("IsRepositoryExist: %v", err)
+		return errors.Newf("IsRepositoryExist: %v", err)
 	} else if has {
 		return ErrRepoAlreadyExist{args: errutil.Args{"ownerID": u.ID, "name": newRepoName}}
 	}
 
 	repo, err := GetRepositoryByName(u.ID, oldRepoName)
 	if err != nil {
-		return fmt.Errorf("GetRepositoryByName: %v", err)
+		return errors.Newf("GetRepositoryByName: %v", err)
 	}
 
 	// Change repository directory name
 	if err = os.Rename(repo.RepoPath(), RepoPath(u.Name, newRepoName)); err != nil {
-		return fmt.Errorf("rename repository directory: %v", err)
+		return errors.Newf("rename repository directory: %v", err)
 	}
 
 	wikiPath := repo.WikiPath()
 	if com.IsExist(wikiPath) {
 		if err = os.Rename(wikiPath, WikiPath(u.Name, newRepoName)); err != nil {
-			return fmt.Errorf("rename repository wiki: %v", err)
+			return errors.Newf("rename repository wiki: %v", err)
 		}
 		RemoveAllWithNotice("Delete repository wiki local copy", repo.LocalWikiPath())
 	}
@@ -1577,17 +1577,17 @@ func updateRepository(e Engine, repo *Repository, visibilityChanged bool) (err e
 	}
 
 	if _, err = e.ID(repo.ID).AllCols().Update(repo); err != nil {
-		return fmt.Errorf("update: %v", err)
+		return errors.Newf("update: %v", err)
 	}
 
 	if visibilityChanged {
 		if err = repo.getOwner(e); err != nil {
-			return fmt.Errorf("getOwner: %v", err)
+			return errors.Newf("getOwner: %v", err)
 		}
 		if repo.Owner.IsOrganization() {
 			// Organization repository need to recalculate access table when visibility is changed
 			if err = repo.recalculateTeamAccesses(e, 0); err != nil {
-				return fmt.Errorf("recalculateTeamAccesses: %v", err)
+				return errors.Newf("recalculateTeamAccesses: %v", err)
 			}
 		}
 
@@ -1607,19 +1607,19 @@ func updateRepository(e Engine, repo *Repository, visibilityChanged bool) (err e
 
 		forkRepos, err := getRepositoriesByForkID(e, repo.ID)
 		if err != nil {
-			return fmt.Errorf("getRepositoriesByForkID: %v", err)
+			return errors.Newf("getRepositoriesByForkID: %v", err)
 		}
 		for i := range forkRepos {
 			forkRepos[i].IsPrivate = repo.IsPrivate
 			forkRepos[i].IsUnlisted = repo.IsUnlisted
 			if err = updateRepository(e, forkRepos[i], true); err != nil {
-				return fmt.Errorf("updateRepository[%d]: %v", forkRepos[i].ID, err)
+				return errors.Newf("updateRepository[%d]: %v", forkRepos[i].ID, err)
 			}
 		}
 
 		// Change visibility of generated actions
 		if _, err = e.Where("repo_id = ?", repo.ID).Cols("is_private").Update(&Action{IsPrivate: repo.IsPrivate || repo.IsUnlisted}); err != nil {
-			return fmt.Errorf("change action visibility of repository: %v", err)
+			return errors.Newf("change action visibility of repository: %v", err)
 		}
 	}
 
@@ -1634,7 +1634,7 @@ func UpdateRepository(repo *Repository, visibilityChanged bool) (err error) {
 	}
 
 	if err = updateRepository(x, repo, visibilityChanged); err != nil {
-		return fmt.Errorf("updateRepository: %v", err)
+		return errors.Newf("updateRepository: %v", err)
 	}
 
 	return sess.Commit()
@@ -1695,7 +1695,7 @@ func DeleteRepository(ownerID, repoID int64) error {
 		&HookTask{RepoID: repoID},
 		&LFSObject{RepoID: repoID},
 	); err != nil {
-		return fmt.Errorf("deleteBeans: %v", err)
+		return errors.Newf("deleteBeans: %v", err)
 	}
 
 	// Delete comments and attachments.
@@ -1728,7 +1728,7 @@ func DeleteRepository(ownerID, repoID int64) error {
 
 	if repo.IsFork {
 		if _, err = sess.Exec("UPDATE `repository` SET num_forks=num_forks-1 WHERE id=?", repo.ForkID); err != nil {
-			return fmt.Errorf("decrease fork count: %v", err)
+			return errors.Newf("decrease fork count: %v", err)
 		}
 	}
 
@@ -1737,7 +1737,7 @@ func DeleteRepository(ownerID, repoID int64) error {
 	}
 
 	if err = sess.Commit(); err != nil {
-		return fmt.Errorf("commit: %v", err)
+		return errors.Newf("commit: %v", err)
 	}
 
 	// Remove repository files.
@@ -1852,12 +1852,12 @@ func GetUserAndCollaborativeRepositories(userID int64) ([]*Repository, error) {
 		Join("INNER", "collaboration", "collaboration.repo_id = repo.id").
 		Where("collaboration.user_id = ?", userID).
 		Find(&repos); err != nil {
-		return nil, fmt.Errorf("select collaborative repositories: %v", err)
+		return nil, errors.Newf("select collaborative repositories: %v", err)
 	}
 
 	ownRepos := make([]*Repository, 0, 10)
 	if err := x.Where("owner_id = ?", userID).Find(&ownRepos); err != nil {
-		return nil, fmt.Errorf("select own repositories: %v", err)
+		return nil, errors.Newf("select own repositories: %v", err)
 	}
 
 	return append(repos, ownRepos...), nil
@@ -1903,7 +1903,7 @@ func SearchRepositoryByName(opts *SearchRepoOptions) (repos []*Repository, count
 	// We need all fields (repo.*) in final list but only ID (repo.id) is good enough for counting.
 	count, err = sess.Clone().Distinct("repo.id").Count(new(Repository))
 	if err != nil {
-		return nil, 0, fmt.Errorf("Count: %v", err)
+		return nil, 0, errors.Newf("Count: %v", err)
 	}
 
 	if len(opts.OrderBy) > 0 {
@@ -1998,7 +1998,7 @@ func gatherMissingRepoRecords() ([]*Repository, error) {
 			return nil
 		}); err != nil {
 		if err2 := Handle.Notices().Create(context.TODO(), NoticeTypeRepository, fmt.Sprintf("gatherMissingRepoRecords: %v", err)); err2 != nil {
-			return nil, fmt.Errorf("CreateRepositoryNotice: %v", err)
+			return nil, errors.Newf("CreateRepositoryNotice: %v", err)
 		}
 	}
 	return repos, nil
@@ -2008,7 +2008,7 @@ func gatherMissingRepoRecords() ([]*Repository, error) {
 func DeleteMissingRepositories() error {
 	repos, err := gatherMissingRepoRecords()
 	if err != nil {
-		return fmt.Errorf("gatherMissingRepoRecords: %v", err)
+		return errors.Newf("gatherMissingRepoRecords: %v", err)
 	}
 
 	if len(repos) == 0 {
@@ -2019,7 +2019,7 @@ func DeleteMissingRepositories() error {
 		log.Trace("Deleting %d/%d...", repo.OwnerID, repo.ID)
 		if err := DeleteRepository(repo.OwnerID, repo.ID); err != nil {
 			if err2 := Handle.Notices().Create(context.TODO(), NoticeTypeRepository, fmt.Sprintf("DeleteRepository [%d]: %v", repo.ID, err)); err2 != nil {
-				return fmt.Errorf("CreateRepositoryNotice: %v", err)
+				return errors.Newf("CreateRepositoryNotice: %v", err)
 			}
 		}
 	}
@@ -2030,7 +2030,7 @@ func DeleteMissingRepositories() error {
 func ReinitMissingRepositories() error {
 	repos, err := gatherMissingRepoRecords()
 	if err != nil {
-		return fmt.Errorf("gatherMissingRepoRecords: %v", err)
+		return errors.Newf("gatherMissingRepoRecords: %v", err)
 	}
 
 	if len(repos) == 0 {
@@ -2041,7 +2041,7 @@ func ReinitMissingRepositories() error {
 		log.Trace("Initializing %d/%d...", repo.OwnerID, repo.ID)
 		if err := git.Init(repo.RepoPath(), git.InitOptions{Bare: true}); err != nil {
 			if err2 := Handle.Notices().Create(context.TODO(), NoticeTypeRepository, fmt.Sprintf("init repository [repo_id: %d]: %v", repo.ID, err)); err2 != nil {
-				return fmt.Errorf("create repository notice: %v", err)
+				return errors.Newf("create repository notice: %v", err)
 			}
 		}
 	}
@@ -2125,7 +2125,7 @@ func GitGcRepos() error {
 				RepoPath(repo.Owner.Name, repo.Name), "Repository garbage collection",
 				"git", args...)
 			if err != nil {
-				return fmt.Errorf("%v: %v", err, stderr)
+				return errors.Newf("%v: %v", err, stderr)
 			}
 			return nil
 		})
@@ -2264,7 +2264,7 @@ func (repos RepositoryList) loadAttributes(e Engine) error {
 	}
 	users := make([]*User, 0, len(userIDs))
 	if err := e.Where("id > 0").In("id", userIDs).Find(&users); err != nil {
-		return fmt.Errorf("find users: %v", err)
+		return errors.Newf("find users: %v", err)
 	}
 	for i := range users {
 		userSet[users[i].ID] = users[i]
@@ -2286,7 +2286,7 @@ func (repos RepositoryList) loadAttributes(e Engine) error {
 	}
 	baseRepos := make([]*Repository, 0, len(baseIDs))
 	if err := e.Where("id > 0").In("id", baseIDs).Find(&baseRepos); err != nil {
-		return fmt.Errorf("find base repositories: %v", err)
+		return errors.Newf("find base repositories: %v", err)
 	}
 	for i := range baseRepos {
 		repoSet[baseRepos[i].ID] = baseRepos[i]
@@ -2322,7 +2322,7 @@ func (repos MirrorRepositoryList) loadAttributes(e Engine) error {
 	}
 	mirrors := make([]*Mirror, 0, len(repoIDs))
 	if err := e.Where("id > 0").In("repo_id", repoIDs).Find(&mirrors); err != nil {
-		return fmt.Errorf("find mirrors: %v", err)
+		return errors.Newf("find mirrors: %v", err)
 	}
 
 	set := make(map[int64]*Mirror)
@@ -2425,7 +2425,7 @@ func notifyWatchers(e Engine, act *Action) error {
 	// Add feeds for user self and all watchers.
 	watchers, err := getWatchers(e, act.RepoID)
 	if err != nil {
-		return fmt.Errorf("getWatchers: %v", err)
+		return errors.Newf("getWatchers: %v", err)
 	}
 
 	// Reset ID to reuse Action object
@@ -2434,7 +2434,7 @@ func notifyWatchers(e Engine, act *Action) error {
 	// Add feed for actioner.
 	act.UserID = act.ActUserID
 	if _, err = e.Insert(act); err != nil {
-		return fmt.Errorf("insert new action: %v", err)
+		return errors.Newf("insert new action: %v", err)
 	}
 
 	for i := range watchers {
@@ -2445,7 +2445,7 @@ func notifyWatchers(e Engine, act *Action) error {
 		act.ID = 0
 		act.UserID = watchers[i].UserID
 		if _, err = e.Insert(act); err != nil {
-			return fmt.Errorf("insert new action: %v", err)
+			return errors.Newf("insert new action: %v", err)
 		}
 	}
 	return nil
@@ -2574,22 +2574,22 @@ func ForkRepository(doer, owner *User, baseRepo *Repository, name, desc string)
 		fmt.Sprintf("ForkRepository 'git clone': %s/%s", owner.Name, repo.Name),
 		"git", "clone", "--bare", baseRepo.RepoPath(), repoPath)
 	if err != nil {
-		return nil, fmt.Errorf("git clone: %v - %s", err, stderr)
+		return nil, errors.Newf("git clone: %v - %s", err, stderr)
 	}
 
 	_, stderr, err = process.ExecDir(-1,
 		repoPath, fmt.Sprintf("ForkRepository 'git update-server-info': %s", repoPath),
 		"git", "update-server-info")
 	if err != nil {
-		return nil, fmt.Errorf("git update-server-info: %v - %s", err, stderr)
+		return nil, errors.Newf("git update-server-info: %v - %s", err, stderr)
 	}
 
 	if err = createDelegateHooks(repoPath); err != nil {
-		return nil, fmt.Errorf("createDelegateHooks: %v", err)
+		return nil, errors.Newf("createDelegateHooks: %v", err)
 	}
 
 	if err = sess.Commit(); err != nil {
-		return nil, fmt.Errorf("commit: %v", err)
+		return nil, errors.Newf("commit: %v", err)
 	}
 
 	// Remember visibility preference
@@ -2638,17 +2638,17 @@ func (r *Repository) CreateNewBranch(oldBranch, newBranch string) (err error) {
 	localPath := r.LocalCopyPath()
 
 	if err = discardLocalRepoBranchChanges(localPath, oldBranch); err != nil {
-		return fmt.Errorf("discard changes in local copy [path: %s, branch: %s]: %v", localPath, oldBranch, err)
+		return errors.Newf("discard changes in local copy [path: %s, branch: %s]: %v", localPath, oldBranch, err)
 	} else if err = r.UpdateLocalCopyBranch(oldBranch); err != nil {
-		return fmt.Errorf("update branch for local copy [path: %s, branch: %s]: %v", localPath, oldBranch, err)
+		return errors.Newf("update branch for local copy [path: %s, branch: %s]: %v", localPath, oldBranch, err)
 	}
 
 	if err = r.CheckoutNewBranch(oldBranch, newBranch); err != nil {
-		return fmt.Errorf("create new branch [base: %s, new: %s]: %v", oldBranch, newBranch, err)
+		return errors.Newf("create new branch [base: %s, new: %s]: %v", oldBranch, newBranch, err)
 	}
 
 	if err = git.Push(localPath, "origin", newBranch); err != nil {
-		return fmt.Errorf("push [branch: %s]: %v", newBranch, err)
+		return errors.Newf("push [branch: %s]: %v", newBranch, err)
 	}
 
 	return nil
@@ -2667,9 +2667,9 @@ func (r *Repository) refreshAccesses(e Engine, accessMap map[int64]AccessMode) (
 
 	// Delete old accesses and insert new ones for repository.
 	if _, err = e.Delete(&Access{RepoID: r.ID}); err != nil {
-		return fmt.Errorf("delete old accesses: %v", err)
+		return errors.Newf("delete old accesses: %v", err)
 	} else if _, err = e.Insert(newAccesses); err != nil {
-		return fmt.Errorf("insert new accesses: %v", err)
+		return errors.Newf("insert new accesses: %v", err)
 	}
 	return nil
 }
@@ -2678,7 +2678,7 @@ func (r *Repository) refreshAccesses(e Engine, accessMap map[int64]AccessMode) (
 func (r *Repository) refreshCollaboratorAccesses(e Engine, accessMap map[int64]AccessMode) error {
 	collaborations, err := r.getCollaborations(e)
 	if err != nil {
-		return fmt.Errorf("getCollaborations: %v", err)
+		return errors.Newf("getCollaborations: %v", err)
 	}
 	for _, c := range collaborations {
 		accessMap[c.UserID] = c.Mode
@@ -2695,11 +2695,11 @@ func (r *Repository) recalculateTeamAccesses(e Engine, ignTeamID int64) (err err
 	if err = r.getOwner(e); err != nil {
 		return err
 	} else if !r.Owner.IsOrganization() {
-		return fmt.Errorf("owner is not an organization: %d", r.OwnerID)
+		return errors.Newf("owner is not an organization: %d", r.OwnerID)
 	}
 
 	if err = r.refreshCollaboratorAccesses(e, accessMap); err != nil {
-		return fmt.Errorf("refreshCollaboratorAccesses: %v", err)
+		return errors.Newf("refreshCollaboratorAccesses: %v", err)
 	}
 
 	if err = r.Owner.getTeams(e); err != nil {
@@ -2730,7 +2730,7 @@ func (r *Repository) recalculateTeamAccesses(e Engine, ignTeamID int64) (err err
 		}
 
 		if err = t.getMembers(e); err != nil {
-			return fmt.Errorf("getMembers '%d': %v", t.ID, err)
+			return errors.Newf("getMembers '%d': %v", t.ID, err)
 		}
 		for _, m := range t.Members {
 			accessMap[m.ID] = maxAccessMode(accessMap[m.ID], t.Authorize)
@@ -2747,7 +2747,7 @@ func (r *Repository) recalculateAccesses(e Engine) error {
 
 	accessMap := make(map[int64]AccessMode, 10)
 	if err := r.refreshCollaboratorAccesses(e, accessMap); err != nil {
-		return fmt.Errorf("refreshCollaboratorAccesses: %v", err)
+		return errors.Newf("refreshCollaboratorAccesses: %v", err)
 	}
 	return r.refreshAccesses(e, accessMap)
 }

+ 14 - 13
internal/database/repo_branch.go

@@ -5,6 +5,7 @@ import (
 	"fmt"
 	"strings"
 
+	"github.com/cockroachdb/errors"
 	"github.com/gogs/git-module"
 	"github.com/unknwon/com"
 
@@ -23,12 +24,12 @@ type Branch struct {
 func GetBranchesByPath(path string) ([]*Branch, error) {
 	gitRepo, err := git.Open(path)
 	if err != nil {
-		return nil, fmt.Errorf("open repository: %v", err)
+		return nil, errors.Newf("open repository: %v", err)
 	}
 
 	names, err := gitRepo.Branches()
 	if err != nil {
-		return nil, fmt.Errorf("list branches")
+		return nil, errors.Newf("list branches")
 	}
 
 	branches := make([]*Branch, len(names))
@@ -77,7 +78,7 @@ func (r *Repository) GetBranches() ([]*Branch, error) {
 func (br *Branch) GetCommit() (*git.Commit, error) {
 	gitRepo, err := git.Open(br.RepoPath)
 	if err != nil {
-		return nil, fmt.Errorf("open repository: %v", err)
+		return nil, errors.Newf("open repository: %v", err)
 	}
 	return gitRepo.BranchCommit(br.Name)
 }
@@ -143,12 +144,12 @@ func UpdateProtectBranch(protectBranch *ProtectBranch) (err error) {
 
 	if protectBranch.ID == 0 {
 		if _, err = sess.Insert(protectBranch); err != nil {
-			return fmt.Errorf("insert: %v", err)
+			return errors.Newf("insert: %v", err)
 		}
 	}
 
 	if _, err = sess.ID(protectBranch.ID).AllCols().Update(protectBranch); err != nil {
-		return fmt.Errorf("update: %v", err)
+		return errors.Newf("update: %v", err)
 	}
 
 	return sess.Commit()
@@ -160,9 +161,9 @@ func UpdateProtectBranch(protectBranch *ProtectBranch) (err error) {
 // to avoid unnecessary whitelist delete and regenerate.
 func UpdateOrgProtectBranch(repo *Repository, protectBranch *ProtectBranch, whitelistUserIDs, whitelistTeamIDs string) (err error) {
 	if err = repo.GetOwner(); err != nil {
-		return fmt.Errorf("GetOwner: %v", err)
+		return errors.Newf("GetOwner: %v", err)
 	} else if !repo.Owner.IsOrganization() {
-		return fmt.Errorf("expect repository owner to be an organization")
+		return errors.Newf("expect repository owner to be an organization")
 	}
 
 	hasUsersChanged := false
@@ -194,7 +195,7 @@ func UpdateOrgProtectBranch(repo *Repository, protectBranch *ProtectBranch, whit
 		teamIDs := tool.StringsToInt64s(strings.Split(whitelistTeamIDs, ","))
 		teams, err := GetTeamsHaveAccessToRepo(repo.OwnerID, repo.ID, AccessModeWrite)
 		if err != nil {
-			return fmt.Errorf("GetTeamsHaveAccessToRepo [org_id: %d, repo_id: %d]: %v", repo.OwnerID, repo.ID, err)
+			return errors.Newf("GetTeamsHaveAccessToRepo [org_id: %d, repo_id: %d]: %v", repo.OwnerID, repo.ID, err)
 		}
 		validTeamIDs = make([]int64, 0, len(teams))
 		for i := range teams {
@@ -209,7 +210,7 @@ func UpdateOrgProtectBranch(repo *Repository, protectBranch *ProtectBranch, whit
 	// Make sure protectBranch.ID is not 0 for whitelists
 	if protectBranch.ID == 0 {
 		if _, err = x.Insert(protectBranch); err != nil {
-			return fmt.Errorf("insert: %v", err)
+			return errors.Newf("insert: %v", err)
 		}
 	}
 
@@ -227,7 +228,7 @@ func UpdateOrgProtectBranch(repo *Repository, protectBranch *ProtectBranch, whit
 		for _, teamID := range validTeamIDs {
 			members, err := GetTeamMembers(teamID)
 			if err != nil {
-				return fmt.Errorf("GetTeamMembers [team_id: %d]: %v", teamID, err)
+				return errors.Newf("GetTeamMembers [team_id: %d]: %v", teamID, err)
 			}
 
 			for i := range members {
@@ -253,15 +254,15 @@ func UpdateOrgProtectBranch(repo *Repository, protectBranch *ProtectBranch, whit
 	}
 
 	if _, err = sess.ID(protectBranch.ID).AllCols().Update(protectBranch); err != nil {
-		return fmt.Errorf("Update: %v", err)
+		return errors.Newf("Update: %v", err)
 	}
 
 	// Refresh whitelists
 	if hasUsersChanged || hasTeamsChanged {
 		if _, err = sess.Delete(&ProtectBranchWhitelist{ProtectBranchID: protectBranch.ID}); err != nil {
-			return fmt.Errorf("delete old protect branch whitelists: %v", err)
+			return errors.Newf("delete old protect branch whitelists: %v", err)
 		} else if _, err = sess.Insert(whitelists); err != nil {
-			return fmt.Errorf("insert new protect branch whitelists: %v", err)
+			return errors.Newf("insert new protect branch whitelists: %v", err)
 		}
 	}
 

+ 8 - 9
internal/database/repo_collaboration.go

@@ -1,10 +1,9 @@
 package database
 
 import (
-	"fmt"
-
 	log "unknwon.dev/clog/v2"
 
+	"github.com/cockroachdb/errors"
 	api "github.com/gogs/go-gogs-client"
 )
 
@@ -71,7 +70,7 @@ func (r *Repository) AddCollaborator(u *User) error {
 	if _, err = sess.Insert(collaboration); err != nil {
 		return err
 	} else if err = r.recalculateAccesses(sess); err != nil {
-		return fmt.Errorf("recalculateAccesses [repo_id: %v]: %v", r.ID, err)
+		return errors.Newf("recalculateAccesses [repo_id: %v]: %v", r.ID, err)
 	}
 
 	return sess.Commit()
@@ -102,7 +101,7 @@ func (c *Collaborator) APIFormat() *api.Collaborator {
 func (r *Repository) getCollaborators(e Engine) ([]*Collaborator, error) {
 	collaborations, err := r.getCollaborations(e)
 	if err != nil {
-		return nil, fmt.Errorf("getCollaborations: %v", err)
+		return nil, errors.Newf("getCollaborations: %v", err)
 	}
 
 	collaborators := make([]*Collaborator, len(collaborations))
@@ -137,7 +136,7 @@ func (r *Repository) ChangeCollaborationAccessMode(userID int64, mode AccessMode
 	}
 	has, err := x.Get(collaboration)
 	if err != nil {
-		return fmt.Errorf("get collaboration: %v", err)
+		return errors.Newf("get collaboration: %v", err)
 	} else if !has {
 		return nil
 	}
@@ -151,7 +150,7 @@ func (r *Repository) ChangeCollaborationAccessMode(userID int64, mode AccessMode
 	if r.Owner.IsOrganization() {
 		teams, err := GetUserTeams(r.OwnerID, userID)
 		if err != nil {
-			return fmt.Errorf("GetUserTeams: [org_id: %d, user_id: %d]: %v", r.OwnerID, userID, err)
+			return errors.Newf("GetUserTeams: [org_id: %d, user_id: %d]: %v", r.OwnerID, userID, err)
 		}
 		for i := range teams {
 			if mode < teams[i].Authorize {
@@ -167,7 +166,7 @@ func (r *Repository) ChangeCollaborationAccessMode(userID int64, mode AccessMode
 	}
 
 	if _, err = sess.ID(collaboration.ID).AllCols().Update(collaboration); err != nil {
-		return fmt.Errorf("update collaboration: %v", err)
+		return errors.Newf("update collaboration: %v", err)
 	}
 
 	access := &Access{
@@ -176,7 +175,7 @@ func (r *Repository) ChangeCollaborationAccessMode(userID int64, mode AccessMode
 	}
 	has, err = sess.Get(access)
 	if err != nil {
-		return fmt.Errorf("get access record: %v", err)
+		return errors.Newf("get access record: %v", err)
 	}
 	if has {
 		_, err = sess.Exec("UPDATE access SET mode = ? WHERE user_id = ? AND repo_id = ?", mode, userID, r.ID)
@@ -185,7 +184,7 @@ func (r *Repository) ChangeCollaborationAccessMode(userID int64, mode AccessMode
 		_, err = sess.Insert(access)
 	}
 	if err != nil {
-		return fmt.Errorf("update/insert access table: %v", err)
+		return errors.Newf("update/insert access table: %v", err)
 	}
 
 	return sess.Commit()

+ 43 - 43
internal/database/repo_editor.go

@@ -11,7 +11,7 @@ import (
 	"strings"
 	"time"
 
-	"github.com/pkg/errors"
+	"github.com/cockroachdb/errors"
 	gouuid "github.com/satori/go.uuid"
 	"github.com/unknwon/com"
 
@@ -97,7 +97,7 @@ func discardLocalRepoBranchChanges(localPath, branch string) error {
 
 	rev := "origin/" + branch
 	if err := git.Reset(localPath, rev, git.ResetOptions{Hard: true}); err != nil {
-		return fmt.Errorf("reset [revision: %s]: %v", rev, err)
+		return errors.Newf("reset [revision: %s]: %v", rev, err)
 	}
 	return nil
 }
@@ -112,7 +112,7 @@ func (r *Repository) CheckoutNewBranch(oldBranch, newBranch string) error {
 		BaseBranch: oldBranch,
 		Timeout:    time.Duration(conf.Git.Timeout.Pull) * time.Second,
 	}); err != nil {
-		return fmt.Errorf("checkout [base: %s, new: %s]: %v", oldBranch, newBranch, err)
+		return errors.Newf("checkout [base: %s, new: %s]: %v", oldBranch, newBranch, err)
 	}
 	return nil
 }
@@ -151,9 +151,9 @@ func (r *Repository) UpdateRepoFile(doer *User, opts UpdateRepoFileOptions) erro
 	defer repoWorkingPool.CheckOut(com.ToStr(r.ID))
 
 	if err := r.DiscardLocalRepoBranchChanges(opts.OldBranch); err != nil {
-		return fmt.Errorf("discard local repo branch[%s] changes: %v", opts.OldBranch, err)
+		return errors.Newf("discard local repo branch[%s] changes: %v", opts.OldBranch, err)
 	} else if err = r.UpdateLocalCopyBranch(opts.OldBranch); err != nil {
-		return fmt.Errorf("update local copy branch[%s]: %v", opts.OldBranch, err)
+		return errors.Newf("update local copy branch[%s]: %v", opts.OldBranch, err)
 	}
 
 	localPath := r.LocalCopyPath()
@@ -176,12 +176,12 @@ func (r *Repository) UpdateRepoFile(doer *User, opts UpdateRepoFileOptions) erro
 			if err := git.DeleteBranch(localPath, opts.NewBranch, git.DeleteBranchOptions{
 				Force: true,
 			}); err != nil {
-				return fmt.Errorf("delete branch %q: %v", opts.NewBranch, err)
+				return errors.Newf("delete branch %q: %v", opts.NewBranch, err)
 			}
 		}
 
 		if err := r.CheckoutNewBranch(opts.OldBranch, opts.NewBranch); err != nil {
-			return fmt.Errorf("checkout new branch[%s] from old branch[%s]: %v", opts.NewBranch, opts.OldBranch, err)
+			return errors.Newf("checkout new branch[%s] from old branch[%s]: %v", opts.NewBranch, opts.OldBranch, err)
 		}
 	}
 
@@ -204,11 +204,11 @@ func (r *Repository) UpdateRepoFile(doer *User, opts UpdateRepoFileOptions) erro
 	}
 
 	if err := os.WriteFile(newFilePath, []byte(opts.Content), 0o600); err != nil {
-		return fmt.Errorf("write file: %v", err)
+		return errors.Newf("write file: %v", err)
 	}
 
 	if err := git.Add(localPath, git.AddOptions{All: true}); err != nil {
-		return fmt.Errorf("git add --all: %v", err)
+		return errors.Newf("git add --all: %v", err)
 	}
 	err := git.CreateCommit(
 		localPath,
@@ -220,7 +220,7 @@ func (r *Repository) UpdateRepoFile(doer *User, opts UpdateRepoFileOptions) erro
 		opts.Message,
 	)
 	if err != nil {
-		return fmt.Errorf("commit changes on %q: %v", localPath, err)
+		return errors.Newf("commit changes on %q: %v", localPath, err)
 	}
 
 	err = git.Push(localPath, "origin", opts.NewBranch,
@@ -238,7 +238,7 @@ func (r *Repository) UpdateRepoFile(doer *User, opts UpdateRepoFileOptions) erro
 		},
 	)
 	if err != nil {
-		return fmt.Errorf("git push origin %s: %v", opts.NewBranch, err)
+		return errors.Newf("git push origin %s: %v", opts.NewBranch, err)
 	}
 	return nil
 }
@@ -254,9 +254,9 @@ func (r *Repository) GetDiffPreview(branch, treePath, content string) (*gitutil.
 	defer repoWorkingPool.CheckOut(com.ToStr(r.ID))
 
 	if err := r.DiscardLocalRepoBranchChanges(branch); err != nil {
-		return nil, fmt.Errorf("discard local repo branch[%s] changes: %v", branch, err)
+		return nil, errors.Newf("discard local repo branch[%s] changes: %v", branch, err)
 	} else if err = r.UpdateLocalCopyBranch(branch); err != nil {
-		return nil, fmt.Errorf("update local copy branch[%s]: %v", branch, err)
+		return nil, errors.Newf("update local copy branch[%s]: %v", branch, err)
 	}
 
 	localPath := r.LocalCopyPath()
@@ -271,7 +271,7 @@ func (r *Repository) GetDiffPreview(branch, treePath, content string) (*gitutil.
 	if err := os.MkdirAll(path.Dir(filePath), os.ModePerm); err != nil {
 		return nil, errors.Wrap(err, "create parent directories")
 	} else if err = os.WriteFile(filePath, []byte(content), 0o600); err != nil {
-		return nil, fmt.Errorf("write file: %v", err)
+		return nil, errors.Newf("write file: %v", err)
 	}
 
 	// 🚨 SECURITY: Prevent including unintended options in the path to the Git command.
@@ -281,11 +281,11 @@ func (r *Repository) GetDiffPreview(branch, treePath, content string) (*gitutil.
 
 	stdout, err := cmd.StdoutPipe()
 	if err != nil {
-		return nil, fmt.Errorf("get stdout pipe: %v", err)
+		return nil, errors.Newf("get stdout pipe: %v", err)
 	}
 
 	if err = cmd.Start(); err != nil {
-		return nil, fmt.Errorf("start: %v", err)
+		return nil, errors.Newf("start: %v", err)
 	}
 
 	pid := process.Add(fmt.Sprintf("GetDiffPreview [repo_path: %s]", r.RepoPath()), cmd)
@@ -293,10 +293,10 @@ func (r *Repository) GetDiffPreview(branch, treePath, content string) (*gitutil.
 
 	diff, err := gitutil.ParseDiff(stdout, conf.Git.MaxDiffFiles, conf.Git.MaxDiffLines, conf.Git.MaxDiffLineChars)
 	if err != nil {
-		return nil, fmt.Errorf("parse diff: %v", err)
+		return nil, errors.Newf("parse diff: %v", err)
 	}
 	if err = cmd.Wait(); err != nil {
-		return nil, fmt.Errorf("wait: %v", err)
+		return nil, errors.Newf("wait: %v", err)
 	}
 	return diff, nil
 }
@@ -327,9 +327,9 @@ func (r *Repository) DeleteRepoFile(doer *User, opts DeleteRepoFileOptions) (err
 	defer repoWorkingPool.CheckOut(com.ToStr(r.ID))
 
 	if err = r.DiscardLocalRepoBranchChanges(opts.OldBranch); err != nil {
-		return fmt.Errorf("discard local r branch[%s] changes: %v", opts.OldBranch, err)
+		return errors.Newf("discard local r branch[%s] changes: %v", opts.OldBranch, err)
 	} else if err = r.UpdateLocalCopyBranch(opts.OldBranch); err != nil {
-		return fmt.Errorf("update local copy branch[%s]: %v", opts.OldBranch, err)
+		return errors.Newf("update local copy branch[%s]: %v", opts.OldBranch, err)
 	}
 
 	localPath := r.LocalCopyPath()
@@ -342,17 +342,17 @@ func (r *Repository) DeleteRepoFile(doer *User, opts DeleteRepoFileOptions) (err
 
 	if opts.OldBranch != opts.NewBranch {
 		if err := r.CheckoutNewBranch(opts.OldBranch, opts.NewBranch); err != nil {
-			return fmt.Errorf("checkout new branch[%s] from old branch[%s]: %v", opts.NewBranch, opts.OldBranch, err)
+			return errors.Newf("checkout new branch[%s] from old branch[%s]: %v", opts.NewBranch, opts.OldBranch, err)
 		}
 	}
 
 	filePath := path.Join(localPath, opts.TreePath)
 	if err = os.Remove(filePath); err != nil {
-		return fmt.Errorf("remove file %q: %v", opts.TreePath, err)
+		return errors.Newf("remove file %q: %v", opts.TreePath, err)
 	}
 
 	if err = git.Add(localPath, git.AddOptions{All: true}); err != nil {
-		return fmt.Errorf("git add --all: %v", err)
+		return errors.Newf("git add --all: %v", err)
 	}
 
 	err = git.CreateCommit(
@@ -365,7 +365,7 @@ func (r *Repository) DeleteRepoFile(doer *User, opts DeleteRepoFileOptions) (err
 		opts.Message,
 	)
 	if err != nil {
-		return fmt.Errorf("commit changes to %q: %v", localPath, err)
+		return errors.Newf("commit changes to %q: %v", localPath, err)
 	}
 
 	err = git.Push(localPath, "origin", opts.NewBranch,
@@ -383,7 +383,7 @@ func (r *Repository) DeleteRepoFile(doer *User, opts DeleteRepoFileOptions) (err
 		},
 	)
 	if err != nil {
-		return fmt.Errorf("git push origin %s: %v", opts.NewBranch, err)
+		return errors.Newf("git push origin %s: %v", opts.NewBranch, err)
 	}
 	return nil
 }
@@ -416,7 +416,7 @@ func (upload *Upload) LocalPath() string {
 // NewUpload creates a new upload object.
 func NewUpload(name string, buf []byte, file multipart.File) (_ *Upload, err error) {
 	if tool.IsMaliciousPath(name) {
-		return nil, fmt.Errorf("malicious path detected: %s", name)
+		return nil, errors.Newf("malicious path detected: %s", name)
 	}
 
 	upload := &Upload{
@@ -426,19 +426,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("mkdir all: %v", err)
+		return nil, errors.Newf("mkdir all: %v", err)
 	}
 
 	fw, err := os.Create(localPath)
 	if err != nil {
-		return nil, fmt.Errorf("create: %v", err)
+		return nil, errors.Newf("create: %v", err)
 	}
 	defer func() { _ = fw.Close() }()
 
 	if _, err = fw.Write(buf); err != nil {
-		return nil, fmt.Errorf("write: %v", err)
+		return nil, errors.Newf("write: %v", err)
 	} else if _, err = io.Copy(fw, file); err != nil {
-		return nil, fmt.Errorf("copy: %v", err)
+		return nil, errors.Newf("copy: %v", err)
 	}
 
 	if _, err := x.Insert(upload); err != nil {
@@ -485,7 +485,7 @@ func DeleteUploads(uploads ...*Upload) (err error) {
 		ids[i] = uploads[i].ID
 	}
 	if _, err = sess.In("id", ids).Delete(new(Upload)); err != nil {
-		return fmt.Errorf("delete uploads: %v", err)
+		return errors.Newf("delete uploads: %v", err)
 	}
 
 	for _, upload := range uploads {
@@ -495,7 +495,7 @@ func DeleteUploads(uploads ...*Upload) (err error) {
 		}
 
 		if err := os.Remove(localPath); err != nil {
-			return fmt.Errorf("remove upload: %v", err)
+			return errors.Newf("remove upload: %v", err)
 		}
 	}
 
@@ -512,11 +512,11 @@ func DeleteUploadByUUID(uuid string) error {
 		if IsErrUploadNotExist(err) {
 			return nil
 		}
-		return fmt.Errorf("get upload by UUID[%s]: %v", uuid, err)
+		return errors.Newf("get upload by UUID[%s]: %v", uuid, err)
 	}
 
 	if err := DeleteUpload(upload); err != nil {
-		return fmt.Errorf("delete upload: %v", err)
+		return errors.Newf("delete upload: %v", err)
 	}
 
 	return nil
@@ -558,21 +558,21 @@ func (r *Repository) UploadRepoFiles(doer *User, opts UploadRepoFileOptions) err
 
 	uploads, err := GetUploadsByUUIDs(opts.Files)
 	if err != nil {
-		return fmt.Errorf("get uploads by UUIDs[%v]: %v", opts.Files, err)
+		return errors.Newf("get uploads by UUIDs[%v]: %v", opts.Files, err)
 	}
 
 	repoWorkingPool.CheckIn(com.ToStr(r.ID))
 	defer repoWorkingPool.CheckOut(com.ToStr(r.ID))
 
 	if err = r.DiscardLocalRepoBranchChanges(opts.OldBranch); err != nil {
-		return fmt.Errorf("discard local r branch[%s] changes: %v", opts.OldBranch, err)
+		return errors.Newf("discard local r branch[%s] changes: %v", opts.OldBranch, err)
 	} else if err = r.UpdateLocalCopyBranch(opts.OldBranch); err != nil {
-		return fmt.Errorf("update local copy branch[%s]: %v", opts.OldBranch, err)
+		return errors.Newf("update local copy branch[%s]: %v", opts.OldBranch, err)
 	}
 
 	if opts.OldBranch != opts.NewBranch {
 		if err = r.CheckoutNewBranch(opts.OldBranch, opts.NewBranch); err != nil {
-			return fmt.Errorf("checkout new branch[%s] from old branch[%s]: %v", opts.NewBranch, opts.OldBranch, err)
+			return errors.Newf("checkout new branch[%s] from old branch[%s]: %v", opts.NewBranch, opts.OldBranch, err)
 		}
 	}
 
@@ -602,16 +602,16 @@ func (r *Repository) UploadRepoFiles(doer *User, opts UploadRepoFileOptions) err
 		// 🚨 SECURITY: Prevent updating files in surprising place, check if the target
 		// is a symlink.
 		if osutil.IsSymlink(targetPath) {
-			return fmt.Errorf("cannot overwrite symbolic link: %s", upload.Name)
+			return errors.Newf("cannot overwrite symbolic link: %s", upload.Name)
 		}
 
 		if err = com.Copy(tmpPath, targetPath); err != nil {
-			return fmt.Errorf("copy: %v", err)
+			return errors.Newf("copy: %v", err)
 		}
 	}
 
 	if err = git.Add(localPath, git.AddOptions{All: true}); err != nil {
-		return fmt.Errorf("git add --all: %v", err)
+		return errors.Newf("git add --all: %v", err)
 	}
 
 	err = git.CreateCommit(
@@ -624,7 +624,7 @@ func (r *Repository) UploadRepoFiles(doer *User, opts UploadRepoFileOptions) err
 		opts.Message,
 	)
 	if err != nil {
-		return fmt.Errorf("commit changes on %q: %v", localPath, err)
+		return errors.Newf("commit changes on %q: %v", localPath, err)
 	}
 
 	err = git.Push(localPath, "origin", opts.NewBranch,
@@ -642,7 +642,7 @@ func (r *Repository) UploadRepoFiles(doer *User, opts UploadRepoFileOptions) err
 		},
 	)
 	if err != nil {
-		return fmt.Errorf("git push origin %s: %v", opts.NewBranch, err)
+		return errors.Newf("git push origin %s: %v", opts.NewBranch, err)
 	}
 
 	return DeleteUploads(uploads...)

+ 4 - 5
internal/database/repo_tag.go

@@ -1,8 +1,7 @@
 package database
 
 import (
-	"fmt"
-
+	"github.com/cockroachdb/errors"
 	"github.com/gogs/git-module"
 )
 
@@ -17,7 +16,7 @@ type Tag struct {
 func (ta *Tag) GetCommit() (*git.Commit, error) {
 	gitRepo, err := git.Open(ta.RepoPath)
 	if err != nil {
-		return nil, fmt.Errorf("open repository: %v", err)
+		return nil, errors.Newf("open repository: %v", err)
 	}
 	return gitRepo.TagCommit(ta.Name)
 }
@@ -25,12 +24,12 @@ func (ta *Tag) GetCommit() (*git.Commit, error) {
 func GetTagsByPath(path string) ([]*Tag, error) {
 	gitRepo, err := git.Open(path)
 	if err != nil {
-		return nil, fmt.Errorf("open repository: %v", err)
+		return nil, errors.Newf("open repository: %v", err)
 	}
 
 	names, err := gitRepo.Tags()
 	if err != nil {
-		return nil, fmt.Errorf("list tags")
+		return nil, errors.Newf("list tags: %v", err)
 	}
 
 	tags := make([]*Tag, len(names))

+ 1 - 1
internal/database/repositories.go

@@ -6,8 +6,8 @@ import (
 	"strings"
 	"time"
 
+	"github.com/cockroachdb/errors"
 	api "github.com/gogs/go-gogs-client"
-	"github.com/pkg/errors"
 	"gorm.io/gorm"
 
 	"gogs.io/gogs/internal/errutil"

+ 1 - 1
internal/database/schemadoc/main.go

@@ -7,8 +7,8 @@ import (
 	"sort"
 	"strings"
 
+	"github.com/cockroachdb/errors"
 	"github.com/olekukonko/tablewriter"
-	"github.com/pkg/errors"
 	"gopkg.in/DATA-DOG/go-sqlmock.v2"
 	"gorm.io/driver/mysql"
 	"gorm.io/driver/postgres"

+ 25 - 25
internal/database/ssh_key.go

@@ -4,7 +4,6 @@ import (
 	"context"
 	"encoding/base64"
 	"encoding/binary"
-	"errors"
 	"fmt"
 	"math/big"
 	"os"
@@ -14,6 +13,7 @@ import (
 	"sync"
 	"time"
 
+	"github.com/cockroachdb/errors"
 	"github.com/unknwon/com"
 	"golang.org/x/crypto/ssh"
 	log "unknwon.dev/clog/v2"
@@ -92,12 +92,12 @@ func (k *PublicKey) IsDeployKey() bool {
 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 "", errors.Newf("invalid key format: %v", err)
 	}
 
 	keyLength := int(binary.BigEndian.Uint32(b))
 	if len(b) < 4+keyLength {
-		return "", fmt.Errorf("invalid key format: not enough length %d", keyLength)
+		return "", errors.Newf("invalid key format: not enough length %d", keyLength)
 	}
 
 	return string(b[4 : 4+keyLength]), nil
@@ -141,12 +141,12 @@ 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 "", errors.Newf("extractTypeFromBase64Key: %v", err)
 		}
 		if keyType == "" {
 			keyType = t
 		} else if keyType != t {
-			return "", fmt.Errorf("key type and content does not match: %s - %s", keyType, t)
+			return "", errors.Newf("key type and content does not match: %s - %s", keyType, t)
 		}
 	} else {
 		// Parse SSH2 file format.
@@ -166,7 +166,7 @@ func parseKeyString(content string) (string, error) {
 
 		t, err := extractTypeFromBase64Key(keyContent)
 		if err != nil {
-			return "", fmt.Errorf("extractTypeFromBase64Key: %v", err)
+			return "", errors.Newf("extractTypeFromBase64Key: %v", err)
 		}
 		keyType = t
 	}
@@ -178,12 +178,12 @@ func parseKeyString(content string) (string, error) {
 func writeTmpKeyFile(content string) (string, error) {
 	tmpFile, err := os.CreateTemp(conf.SSH.KeyTestPath, "gogs_keytest")
 	if err != nil {
-		return "", fmt.Errorf("TempFile: %v", err)
+		return "", errors.Newf("TempFile: %v", err)
 	}
 	defer tmpFile.Close()
 
 	if _, err = tmpFile.WriteString(content); err != nil {
-		return "", fmt.Errorf("WriteString: %v", err)
+		return "", errors.Newf("WriteString: %v", err)
 	}
 	return tmpFile.Name(), nil
 }
@@ -192,13 +192,13 @@ 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, errors.Newf("writeTmpKeyFile: %v", err)
 	}
 	defer os.Remove(tmpName)
 
 	stdout, stderr, err := process.Exec("SSHKeyGenParsePublicKey", conf.SSH.KeygenPath, "-lf", tmpName)
 	if err != nil {
-		return "", 0, fmt.Errorf("fail to parse public key: %s - %s", err, stderr)
+		return "", 0, errors.Newf("fail to parse public key: %s - %s", err, stderr)
 	}
 	if strings.Contains(stdout, "is not a public key file") {
 		return "", 0, ErrKeyUnableVerify{stdout}
@@ -206,7 +206,7 @@ func SSHKeyGenParsePublicKey(key string) (string, int, error) {
 
 	fields := strings.Split(stdout, " ")
 	if len(fields) < 4 {
-		return "", 0, fmt.Errorf("invalid public key line: %s", stdout)
+		return "", 0, errors.Newf("invalid public key line: %s", stdout)
 	}
 
 	keyType := strings.Trim(fields[len(fields)-1], "()\r\n")
@@ -217,7 +217,7 @@ func SSHKeyGenParsePublicKey(key string) (string, int, error) {
 func SSHNativeParsePublicKey(keyLine string) (string, int, error) {
 	fields := strings.Fields(keyLine)
 	if len(fields) < 2 {
-		return "", 0, fmt.Errorf("not enough fields in public key line: %s", keyLine)
+		return "", 0, errors.Newf("not enough fields in public key line: %s", keyLine)
 	}
 
 	raw, err := base64.StdEncoding.DecodeString(fields[1])
@@ -230,7 +230,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, errors.Newf("ParsePublicKey: %v", err)
 	}
 
 	// The ssh library can parse the key, so next we find out what key exactly we have.
@@ -265,7 +265,7 @@ func SSHNativeParsePublicKey(keyLine string) (string, int, error) {
 	case ssh.KeyAlgoED25519:
 		return "ed25519", 256, nil
 	}
-	return "", 0, fmt.Errorf("unsupported key length detection for type: %s", pkey.Type())
+	return "", 0, errors.Newf("unsupported key length detection for type: %s", pkey.Type())
 }
 
 // CheckPublicKeyString checks if the given public key string is recognized by SSH.
@@ -305,16 +305,16 @@ func CheckPublicKeyString(content string) (_ string, err error) {
 		keyType, length, err = SSHKeyGenParsePublicKey(content)
 	}
 	if err != nil {
-		return "", fmt.Errorf("%s: %v", fnName, err)
+		return "", errors.Newf("%s: %v", fnName, err)
 	}
 	log.Trace("Key info [native: %v]: %s-%d", conf.SSH.StartBuiltinServer, keyType, length)
 
 	if minLen, found := conf.SSH.MinimumKeySizes[keyType]; found && length >= minLen {
 		return content, nil
 	} else if found && length < minLen {
-		return "", fmt.Errorf("key length is not enough: got %d, needs %d", length, minLen)
+		return "", errors.Newf("key length is not enough: got %d, needs %d", length, minLen)
 	}
-	return "", fmt.Errorf("key type is not allowed: %s", keyType)
+	return "", errors.Newf("key type is not allowed: %s", keyType)
 }
 
 // appendAuthorizedKeysToFile appends new SSH keys' content to authorized_keys file.
@@ -378,7 +378,7 @@ func addKey(e Engine, key *PublicKey) (err error) {
 
 	stdout, stderr, err := process.Exec("AddPublicKey", conf.SSH.KeygenPath, "-lf", tmpPath)
 	if err != nil {
-		return fmt.Errorf("fail to parse public key: %s - %s", err, stderr)
+		return errors.Newf("fail to parse public key: %s - %s", err, stderr)
 	} else if len(stdout) < 2 {
 		return errors.New("not enough output for calculating fingerprint: " + stdout)
 	}
@@ -425,7 +425,7 @@ func AddPublicKey(ownerID int64, name, content string) (*PublicKey, error) {
 		Type:    KeyTypeUser,
 	}
 	if err = addKey(sess, key); err != nil {
-		return nil, fmt.Errorf("addKey: %v", err)
+		return nil, errors.Newf("addKey: %v", err)
 	}
 
 	return key, sess.Commit()
@@ -486,7 +486,7 @@ func DeletePublicKey(doer *User, id int64) (err error) {
 		if IsErrKeyNotExist(err) {
 			return nil
 		}
-		return fmt.Errorf("GetPublicKeyByID: %v", err)
+		return errors.Newf("GetPublicKeyByID: %v", err)
 	}
 
 	// Check if user has access to delete this key.
@@ -671,13 +671,13 @@ func AddDeployKey(repoID int64, name, content string) (*DeployKey, error) {
 	// First time use this deploy key.
 	if !has {
 		if err = addKey(sess, pkey); err != nil {
-			return nil, fmt.Errorf("addKey: %v", err)
+			return nil, errors.Newf("addKey: %v", err)
 		}
 	}
 
 	key, err := addDeployKey(sess, pkey.ID, repoID, name, pkey.Fingerprint)
 	if err != nil {
-		return nil, fmt.Errorf("addDeployKey: %v", err)
+		return nil, errors.Newf("addDeployKey: %v", err)
 	}
 
 	return key, sess.Commit()
@@ -742,14 +742,14 @@ func DeleteDeployKey(doer *User, id int64) error {
 		if IsErrDeployKeyNotExist(err) {
 			return nil
 		}
-		return fmt.Errorf("GetDeployKeyByID: %v", err)
+		return errors.Newf("GetDeployKeyByID: %v", err)
 	}
 
 	// Check if user has access to delete this key.
 	if !doer.IsAdmin {
 		repo, err := GetRepositoryByID(key.RepoID)
 		if err != nil {
-			return fmt.Errorf("GetRepositoryByID: %v", err)
+			return errors.Newf("GetRepositoryByID: %v", err)
 		}
 		if !Handle.Permissions().Authorize(context.TODO(), doer.ID, repo.ID, AccessModeAdmin,
 			AccessModeOptions{
@@ -768,7 +768,7 @@ func DeleteDeployKey(doer *User, id int64) error {
 	}
 
 	if _, err = sess.ID(key.ID).Delete(new(DeployKey)); err != nil {
-		return fmt.Errorf("delete deploy key [%d]: %v", key.ID, err)
+		return errors.Newf("delete deploy key [%d]: %v", key.ID, err)
 	}
 
 	// Check if this is the last reference to same key content.

+ 10 - 9
internal/database/two_factor.go

@@ -5,6 +5,7 @@ import (
 	"fmt"
 	"time"
 
+	"github.com/cockroachdb/errors"
 	"github.com/pquerna/otp/totp"
 	"github.com/unknwon/com"
 
@@ -26,11 +27,11 @@ type TwoFactor struct {
 func (t *TwoFactor) ValidateTOTP(passcode string) (bool, error) {
 	secret, err := base64.StdEncoding.DecodeString(t.Secret)
 	if err != nil {
-		return false, fmt.Errorf("DecodeString: %v", err)
+		return false, errors.Newf("DecodeString: %v", err)
 	}
 	decryptSecret, err := com.AESGCMDecrypt(cryptoutil.MD5Bytes(conf.Security.SecretKey), secret)
 	if err != nil {
-		return false, fmt.Errorf("AESGCMDecrypt: %v", err)
+		return false, errors.Newf("AESGCMDecrypt: %v", err)
 	}
 	return totp.Validate(passcode, string(decryptSecret)), nil
 }
@@ -44,9 +45,9 @@ func DeleteTwoFactor(userID int64) (err error) {
 	}
 
 	if _, err = sess.Where("user_id = ?", userID).Delete(new(TwoFactor)); err != nil {
-		return fmt.Errorf("delete two-factor: %v", err)
+		return errors.Newf("delete two-factor: %v", err)
 	} else if err = deleteRecoveryCodesByUserID(sess, userID); err != nil {
-		return fmt.Errorf("deleteRecoveryCodesByUserID: %v", err)
+		return errors.Newf("deleteRecoveryCodesByUserID: %v", err)
 	}
 
 	return sess.Commit()
@@ -75,7 +76,7 @@ func deleteRecoveryCodesByUserID(e Engine, userID int64) error {
 func RegenerateRecoveryCodes(userID int64) error {
 	recoveryCodes, err := generateRecoveryCodes(userID, 10)
 	if err != nil {
-		return fmt.Errorf("generateRecoveryCodes: %v", err)
+		return errors.Newf("generateRecoveryCodes: %v", err)
 	}
 
 	sess := x.NewSession()
@@ -85,9 +86,9 @@ func RegenerateRecoveryCodes(userID int64) error {
 	}
 
 	if err = deleteRecoveryCodesByUserID(sess, userID); err != nil {
-		return fmt.Errorf("deleteRecoveryCodesByUserID: %v", err)
+		return errors.Newf("deleteRecoveryCodesByUserID: %v", err)
 	} else if _, err = sess.Insert(recoveryCodes); err != nil {
-		return fmt.Errorf("insert new recovery codes: %v", err)
+		return errors.Newf("insert new recovery codes: %v", err)
 	}
 
 	return sess.Commit()
@@ -111,14 +112,14 @@ func UseRecoveryCode(_ int64, code string) error {
 	recoveryCode := new(TwoFactorRecoveryCode)
 	has, err := x.Where("code = ?", code).And("is_used = ?", false).Get(recoveryCode)
 	if err != nil {
-		return fmt.Errorf("get unused code: %v", err)
+		return errors.Newf("get unused code: %v", err)
 	} else if !has {
 		return ErrTwoFactorRecoveryCodeNotFound{Code: code}
 	}
 
 	recoveryCode.IsUsed = true
 	if _, err = x.Id(recoveryCode.ID).Cols("is_used").Update(recoveryCode); err != nil {
-		return fmt.Errorf("mark code as used: %v", err)
+		return errors.Newf("mark code as used: %v", err)
 	}
 
 	return nil

+ 1 - 1
internal/database/two_factors.go

@@ -7,7 +7,7 @@ import (
 	"strings"
 	"time"
 
-	"github.com/pkg/errors"
+	"github.com/cockroachdb/errors"
 	"gorm.io/gorm"
 	log "unknwon.dev/clog/v2"
 

+ 10 - 11
internal/database/update.go

@@ -2,12 +2,11 @@ package database
 
 import (
 	"context"
-	"fmt"
 	"os/exec"
 	"strings"
 
+	"github.com/cockroachdb/errors"
 	"github.com/gogs/git-module"
-	"github.com/pkg/errors"
 )
 
 // CommitToPushCommit transforms a git.Commit to PushCommit type.
@@ -53,7 +52,7 @@ func PushUpdate(opts PushUpdateOptions) (err error) {
 	isNewRef := strings.HasPrefix(opts.OldCommitID, git.EmptyID)
 	isDelRef := strings.HasPrefix(opts.NewCommitID, git.EmptyID)
 	if isNewRef && isDelRef {
-		return fmt.Errorf("both old and new revisions are %q", git.EmptyID)
+		return errors.Newf("both old and new revisions are %q", git.EmptyID)
 	}
 
 	repoPath := RepoPath(opts.RepoUserName, opts.RepoName)
@@ -61,26 +60,26 @@ func PushUpdate(opts PushUpdateOptions) (err error) {
 	gitUpdate := exec.Command("git", "update-server-info")
 	gitUpdate.Dir = repoPath
 	if err = gitUpdate.Run(); err != nil {
-		return fmt.Errorf("run 'git update-server-info': %v", err)
+		return errors.Newf("run 'git update-server-info': %v", err)
 	}
 
 	gitRepo, err := git.Open(repoPath)
 	if err != nil {
-		return fmt.Errorf("open repository: %v", err)
+		return errors.Newf("open repository: %v", err)
 	}
 
 	owner, err := Handle.Users().GetByUsername(ctx, opts.RepoUserName)
 	if err != nil {
-		return fmt.Errorf("GetUserByName: %v", err)
+		return errors.Newf("GetUserByName: %v", err)
 	}
 
 	repo, err := GetRepositoryByName(owner.ID, opts.RepoName)
 	if err != nil {
-		return fmt.Errorf("GetRepositoryByName: %v", err)
+		return errors.Newf("GetRepositoryByName: %v", err)
 	}
 
 	if err = repo.UpdateSize(); err != nil {
-		return fmt.Errorf("UpdateSize: %v", err)
+		return errors.Newf("UpdateSize: %v", err)
 	}
 
 	// Push tags
@@ -106,19 +105,19 @@ func PushUpdate(opts PushUpdateOptions) (err error) {
 		// Push new branch
 		newCommit, err := gitRepo.CatFileCommit(opts.NewCommitID)
 		if err != nil {
-			return fmt.Errorf("GetCommit [commit_id: %s]: %v", opts.NewCommitID, err)
+			return errors.Newf("GetCommit [commit_id: %s]: %v", opts.NewCommitID, err)
 		}
 
 		if isNewRef {
 			commits, err = newCommit.Ancestors(git.LogOptions{MaxCount: 9})
 			if err != nil {
-				return fmt.Errorf("CommitsBeforeLimit [commit_id: %s]: %v", newCommit.ID, err)
+				return errors.Newf("CommitsBeforeLimit [commit_id: %s]: %v", newCommit.ID, err)
 			}
 			commits = append([]*git.Commit{newCommit}, commits...)
 		} else {
 			commits, err = newCommit.CommitsAfter(opts.OldCommitID)
 			if err != nil {
-				return fmt.Errorf("CommitsBeforeUntil [commit_id: %s]: %v", opts.OldCommitID, err)
+				return errors.Newf("CommitsBeforeUntil [commit_id: %s]: %v", opts.OldCommitID, err)
 			}
 		}
 	}

+ 2 - 2
internal/database/users.go

@@ -9,9 +9,9 @@ import (
 	"time"
 	"unicode/utf8"
 
+	"github.com/cockroachdb/errors"
 	"github.com/go-macaron/binding"
 	api "github.com/gogs/go-gogs-client"
-	"github.com/pkg/errors"
 	"gorm.io/gorm"
 	log "unknwon.dev/clog/v2"
 
@@ -130,7 +130,7 @@ func (s *UsersStore) Authenticate(ctx context.Context, login, password string, l
 
 	// Validate username make sure it satisfies requirement.
 	if binding.AlphaDashDotPattern.MatchString(extAccount.Name) {
-		return nil, fmt.Errorf("invalid pattern for attribute 'username' [%s]: must be valid alpha or numeric or dash(-_) or dot characters", extAccount.Name)
+		return nil, errors.Newf("invalid pattern for attribute 'username' [%s]: must be valid alpha or numeric or dash(-_) or dot characters", extAccount.Name)
 	}
 
 	return s.Create(ctx, extAccount.Name, extAccount.Email,

+ 8 - 7
internal/database/webhook.go

@@ -11,6 +11,7 @@ import (
 	"strings"
 	"time"
 
+	"github.com/cockroachdb/errors"
 	jsoniter "github.com/json-iterator/go"
 	gouuid "github.com/satori/go.uuid"
 	log "unknwon.dev/clog/v2"
@@ -605,17 +606,17 @@ func prepareHookTasks(e Engine, repo *Repository, event HookEventType, p api.Pay
 		case SLACK:
 			payloader, err = GetSlackPayload(p, event, w.Meta)
 			if err != nil {
-				return fmt.Errorf("GetSlackPayload: %v", err)
+				return errors.Newf("GetSlackPayload: %v", err)
 			}
 		case DISCORD:
 			payloader, err = GetDiscordPayload(p, event, w.Meta)
 			if err != nil {
-				return fmt.Errorf("GetDiscordPayload: %v", err)
+				return errors.Newf("GetDiscordPayload: %v", err)
 			}
 		case DINGTALK:
 			payloader, err = GetDingtalkPayload(p, event)
 			if err != nil {
-				return fmt.Errorf("GetDingtalkPayload: %v", err)
+				return errors.Newf("GetDingtalkPayload: %v", err)
 			}
 		default:
 			payloader = p
@@ -643,7 +644,7 @@ func prepareHookTasks(e Engine, repo *Repository, event HookEventType, p api.Pay
 			EventType:   event,
 			IsSSL:       w.IsSSL,
 		}); err != nil {
-			return fmt.Errorf("createHookTask: %v", err)
+			return errors.Newf("createHookTask: %v", err)
 		}
 	}
 
@@ -657,7 +658,7 @@ func prepareHookTasks(e Engine, repo *Repository, event HookEventType, p api.Pay
 func prepareWebhooks(e Engine, repo *Repository, event HookEventType, p api.Payloader) error {
 	webhooks, err := getActiveWebhooksByRepoID(e, repo.ID)
 	if err != nil {
-		return fmt.Errorf("getActiveWebhooksByRepoID [%d]: %v", repo.ID, err)
+		return errors.Newf("getActiveWebhooksByRepoID [%d]: %v", repo.ID, err)
 	}
 
 	// check if repo belongs to org and append additional webhooks
@@ -665,7 +666,7 @@ func prepareWebhooks(e Engine, repo *Repository, event HookEventType, p api.Payl
 		// get hooks for org
 		orgws, err := getActiveWebhooksByOrgID(e, repo.OwnerID)
 		if err != nil {
-			return fmt.Errorf("getActiveWebhooksByOrgID [%d]: %v", repo.OwnerID, err)
+			return errors.Newf("getActiveWebhooksByOrgID [%d]: %v", repo.OwnerID, err)
 		}
 		webhooks = append(webhooks, orgws...)
 	}
@@ -686,7 +687,7 @@ func PrepareWebhooks(repo *Repository, event HookEventType, p api.Payloader) err
 func TestWebhook(repo *Repository, event HookEventType, p api.Payloader, webhookID int64) error {
 	webhook, err := GetWebhookOfRepoByID(repo.ID, webhookID)
 	if err != nil {
-		return fmt.Errorf("GetWebhookOfRepoByID [repo_id: %d, id: %d]: %v", repo.ID, webhookID, err)
+		return errors.Newf("GetWebhookOfRepoByID [repo_id: %d, id: %d]: %v", repo.ID, webhookID, err)
 	}
 	return prepareHookTasks(x, repo, event, p, []*Webhook{webhook})
 }

+ 1 - 1
internal/database/webhook_dingtalk.go

@@ -4,8 +4,8 @@ import (
 	"fmt"
 	"strings"
 
+	"github.com/cockroachdb/errors"
 	jsoniter "github.com/json-iterator/go"
-	"github.com/pkg/errors"
 
 	"github.com/gogs/git-module"
 	api "github.com/gogs/go-gogs-client"

+ 2 - 2
internal/database/webhook_discord.go

@@ -5,8 +5,8 @@ import (
 	"strconv"
 	"strings"
 
+	"github.com/cockroachdb/errors"
 	jsoniter "github.com/json-iterator/go"
-	"github.com/pkg/errors"
 
 	"github.com/gogs/git-module"
 	api "github.com/gogs/go-gogs-client"
@@ -370,7 +370,7 @@ func getDiscordReleasePayload(p *api.ReleasePayload) *DiscordPayload {
 func GetDiscordPayload(p api.Payloader, event HookEventType, meta string) (payload *DiscordPayload, err error) {
 	slack := &SlackMeta{}
 	if err := jsoniter.Unmarshal([]byte(meta), &slack); err != nil {
-		return nil, fmt.Errorf("jsoniter.Unmarshal: %v", err)
+		return nil, errors.Newf("jsoniter.Unmarshal: %v", err)
 	}
 
 	switch event {

+ 2 - 2
internal/database/webhook_slack.go

@@ -4,8 +4,8 @@ import (
 	"fmt"
 	"strings"
 
+	"github.com/cockroachdb/errors"
 	jsoniter "github.com/json-iterator/go"
-	"github.com/pkg/errors"
 
 	"github.com/gogs/git-module"
 	api "github.com/gogs/go-gogs-client"
@@ -287,7 +287,7 @@ func getSlackReleasePayload(p *api.ReleasePayload) *SlackPayload {
 func GetSlackPayload(p api.Payloader, event HookEventType, meta string) (payload *SlackPayload, err error) {
 	slack := &SlackMeta{}
 	if err := jsoniter.Unmarshal([]byte(meta), &slack); err != nil {
-		return nil, fmt.Errorf("unmarshal: %v", err)
+		return nil, errors.Newf("unmarshal: %v", err)
 	}
 
 	switch event {

+ 15 - 15
internal/database/wiki.go

@@ -1,7 +1,6 @@
 package database
 
 import (
-	"fmt"
 	"net/url"
 	"os"
 	"path"
@@ -9,6 +8,7 @@ import (
 	"strings"
 	"time"
 
+	"github.com/cockroachdb/errors"
 	"github.com/unknwon/com"
 
 	"github.com/gogs/git-module"
@@ -71,9 +71,9 @@ func (r *Repository) InitWiki() error {
 	}
 
 	if err := git.Init(r.WikiPath(), git.InitOptions{Bare: true}); err != nil {
-		return fmt.Errorf("init repository: %v", err)
+		return errors.Newf("init repository: %v", err)
 	} else if err = createDelegateHooks(r.WikiPath()); err != nil {
-		return fmt.Errorf("createDelegateHooks: %v", err)
+		return errors.Newf("createDelegateHooks: %v", err)
 	}
 	return nil
 }
@@ -98,14 +98,14 @@ func (r *Repository) updateWikiPage(doer *User, oldTitle, title, content, messag
 	defer wikiWorkingPool.CheckOut(com.ToStr(r.ID))
 
 	if err = r.InitWiki(); err != nil {
-		return fmt.Errorf("InitWiki: %v", err)
+		return errors.Newf("InitWiki: %v", err)
 	}
 
 	localPath := r.LocalWikiPath()
 	if err = discardLocalWikiChanges(localPath); err != nil {
-		return fmt.Errorf("discardLocalWikiChanges: %v", err)
+		return errors.Newf("discardLocalWikiChanges: %v", err)
 	} else if err = r.UpdateLocalWiki(); err != nil {
-		return fmt.Errorf("UpdateLocalWiki: %v", err)
+		return errors.Newf("UpdateLocalWiki: %v", err)
 	}
 
 	title = ToWikiPageName(title)
@@ -128,14 +128,14 @@ func (r *Repository) updateWikiPage(doer *User, oldTitle, title, content, messag
 	os.Remove(filename)
 
 	if err = os.WriteFile(filename, []byte(content), 0o666); err != nil {
-		return fmt.Errorf("WriteFile: %v", err)
+		return errors.Newf("WriteFile: %v", err)
 	}
 
 	if message == "" {
 		message = "Update page '" + title + "'"
 	}
 	if err = git.Add(localPath, git.AddOptions{All: true}); err != nil {
-		return fmt.Errorf("add all changes: %v", err)
+		return errors.Newf("add all changes: %v", err)
 	}
 
 	err = git.CreateCommit(
@@ -148,9 +148,9 @@ func (r *Repository) updateWikiPage(doer *User, oldTitle, title, content, messag
 		message,
 	)
 	if err != nil {
-		return fmt.Errorf("commit changes: %v", err)
+		return errors.Newf("commit changes: %v", err)
 	} else if err = git.Push(localPath, "origin", WikiBranch(localPath)); err != nil {
-		return fmt.Errorf("push: %v", err)
+		return errors.Newf("push: %v", err)
 	}
 
 	return nil
@@ -170,9 +170,9 @@ func (r *Repository) DeleteWikiPage(doer *User, title string) (err error) {
 
 	localPath := r.LocalWikiPath()
 	if err = discardLocalWikiChanges(localPath); err != nil {
-		return fmt.Errorf("discardLocalWikiChanges: %v", err)
+		return errors.Newf("discardLocalWikiChanges: %v", err)
 	} else if err = r.UpdateLocalWiki(); err != nil {
-		return fmt.Errorf("UpdateLocalWiki: %v", err)
+		return errors.Newf("UpdateLocalWiki: %v", err)
 	}
 
 	title = ToWikiPageName(title)
@@ -182,7 +182,7 @@ func (r *Repository) DeleteWikiPage(doer *User, title string) (err error) {
 	message := "Delete page '" + title + "'"
 
 	if err = git.Add(localPath, git.AddOptions{All: true}); err != nil {
-		return fmt.Errorf("add all changes: %v", err)
+		return errors.Newf("add all changes: %v", err)
 	}
 
 	err = git.CreateCommit(
@@ -195,9 +195,9 @@ func (r *Repository) DeleteWikiPage(doer *User, title string) (err error) {
 		message,
 	)
 	if err != nil {
-		return fmt.Errorf("commit changes: %v", err)
+		return errors.Newf("commit changes: %v", err)
 	} else if err = git.Push(localPath, "origin", WikiBranch(localPath)); err != nil {
-		return fmt.Errorf("push: %v", err)
+		return errors.Newf("push: %v", err)
 	}
 
 	return nil

+ 1 - 1
internal/dbutil/dsn.go

@@ -4,7 +4,7 @@ import (
 	"fmt"
 	"strings"
 
-	"github.com/pkg/errors"
+	"github.com/cockroachdb/errors"
 	"gorm.io/driver/mysql"
 	"gorm.io/driver/postgres"
 	"gorm.io/driver/sqlite"

+ 11 - 11
internal/email/message.go

@@ -2,7 +2,6 @@ package email
 
 import (
 	"crypto/tls"
-	"fmt"
 	"io"
 	"net"
 	"net/smtp"
@@ -10,6 +9,7 @@ import (
 	"strings"
 	"time"
 
+	"github.com/cockroachdb/errors"
 	"github.com/jaytaylor/html2text"
 	"gopkg.in/gomail.v2"
 	log "unknwon.dev/clog/v2"
@@ -85,7 +85,7 @@ func (a *loginAuth) Next(fromServer []byte, more bool) ([]byte, error) {
 		case "Password:":
 			return []byte(a.password), nil
 		default:
-			return nil, fmt.Errorf("unknwon fromServer: %s", string(fromServer))
+			return nil, errors.Newf("unknwon fromServer: %s", string(fromServer))
 		}
 	}
 	return nil, nil
@@ -129,7 +129,7 @@ func (*Sender) Send(from string, to []string, msg io.WriterTo) error {
 
 	client, err := smtp.NewClient(conn, host)
 	if err != nil {
-		return fmt.Errorf("NewClient: %v", err)
+		return errors.Newf("NewClient: %v", err)
 	}
 
 	if !opts.DisableHELO {
@@ -142,7 +142,7 @@ func (*Sender) Send(from string, to []string, msg io.WriterTo) error {
 		}
 
 		if err = client.Hello(hostname); err != nil {
-			return fmt.Errorf("hello: %v", err)
+			return errors.Newf("hello: %v", err)
 		}
 	}
 
@@ -150,7 +150,7 @@ func (*Sender) Send(from string, to []string, msg io.WriterTo) error {
 	hasStartTLS, _ := client.Extension("STARTTLS")
 	if !isSecureConn && hasStartTLS {
 		if err = client.StartTLS(tlsconfig); err != nil {
-			return fmt.Errorf("StartTLS: %v", err)
+			return errors.Newf("StartTLS: %v", err)
 		}
 	}
 
@@ -169,28 +169,28 @@ func (*Sender) Send(from string, to []string, msg io.WriterTo) error {
 
 		if auth != nil {
 			if err = client.Auth(auth); err != nil {
-				return fmt.Errorf("auth: %v", err)
+				return errors.Newf("auth: %v", err)
 			}
 		}
 	}
 
 	if err = client.Mail(from); err != nil {
-		return fmt.Errorf("mail: %v", err)
+		return errors.Newf("mail: %v", err)
 	}
 
 	for _, rec := range to {
 		if err = client.Rcpt(rec); err != nil {
-			return fmt.Errorf("rcpt: %v", err)
+			return errors.Newf("rcpt: %v", err)
 		}
 	}
 
 	w, err := client.Data()
 	if err != nil {
-		return fmt.Errorf("data: %v", err)
+		return errors.Newf("data: %v", err)
 	} else if _, err = msg.WriteTo(w); err != nil {
-		return fmt.Errorf("write to: %v", err)
+		return errors.Newf("write to: %v", err)
 	} else if err = w.Close(); err != nil {
-		return fmt.Errorf("close: %v", err)
+		return errors.Newf("close: %v", err)
 	}
 
 	return client.Quit()

+ 1 - 1
internal/errutil/errutil_test.go

@@ -1,9 +1,9 @@
 package errutil
 
 import (
-	"errors"
 	"testing"
 
+	"github.com/cockroachdb/errors"
 	"github.com/stretchr/testify/assert"
 )
 

+ 3 - 3
internal/gitutil/diff.go

@@ -2,12 +2,12 @@ package gitutil
 
 import (
 	"bytes"
-	"fmt"
 	"html"
 	"html/template"
 	"io"
 	"sync"
 
+	"github.com/cockroachdb/errors"
 	"github.com/sergi/go-diff/diffmatchpatch"
 	"golang.org/x/net/html/charset"
 	"golang.org/x/text/transform"
@@ -176,7 +176,7 @@ func ParseDiff(r io.Reader, maxFiles, maxFileLines, maxLineChars int) (*Diff, er
 
 	result := <-done
 	if result.Err != nil {
-		return nil, fmt.Errorf("stream parse diff: %v", result.Err)
+		return nil, errors.Newf("stream parse diff: %v", result.Err)
 	}
 	return NewDiff(result.Diff), nil
 }
@@ -185,7 +185,7 @@ func ParseDiff(r io.Reader, maxFiles, maxFileLines, maxLineChars int) (*Diff, er
 func RepoDiff(repo *git.Repository, rev string, maxFiles, maxFileLines, maxLineChars int, opts ...git.DiffOptions) (*Diff, error) {
 	diff, err := repo.Diff(rev, maxFiles, maxFileLines, maxLineChars, opts...)
 	if err != nil {
-		return nil, fmt.Errorf("get diff: %v", err)
+		return nil, errors.Newf("get diff: %v", err)
 	}
 	return NewDiff(diff), nil
 }

+ 1 - 1
internal/gitutil/error.go

@@ -1,8 +1,8 @@
 package gitutil
 
 import (
+	"github.com/cockroachdb/errors"
 	"github.com/gogs/git-module"
-	"github.com/pkg/errors"
 
 	"gogs.io/gogs/internal/errutil"
 )

+ 2 - 3
internal/gitutil/pull_request.go

@@ -1,12 +1,11 @@
 package gitutil
 
 import (
-	"fmt"
 	"strconv"
 	"time"
 
+	"github.com/cockroachdb/errors"
 	"github.com/gogs/git-module"
-	"github.com/pkg/errors"
 	log "unknwon.dev/clog/v2"
 )
 
@@ -28,7 +27,7 @@ func (module) PullRequestMeta(headPath, basePath, headBranch, baseBranch string)
 		tmpRemote := strconv.FormatInt(time.Now().UnixNano(), 10)
 		err := Module.RemoteAdd(headPath, tmpRemote, basePath, git.RemoteAddOptions{Fetch: true})
 		if err != nil {
-			return nil, fmt.Errorf("add remote: %v", err)
+			return nil, errors.Newf("add remote: %v", err)
 		}
 		defer func() {
 			err := Module.RemoteRemove(headPath, tmpRemote)

+ 12 - 13
internal/gitutil/pull_request_test.go

@@ -1,11 +1,10 @@
 package gitutil
 
 import (
-	"fmt"
 	"testing"
 
+	"github.com/cockroachdb/errors"
 	"github.com/gogs/git-module"
-	"github.com/pkg/errors"
 	"github.com/stretchr/testify/assert"
 )
 
@@ -23,64 +22,64 @@ func TestModuler_PullRequestMeta(t *testing.T) {
 	SetMockModuleStore(t, &MockModuleStore{
 		remoteAdd: func(repoPath, name, url string, opts ...git.RemoteAddOptions) error {
 			if repoPath != headPath {
-				return fmt.Errorf("repoPath: want %q but got %q", headPath, repoPath)
+				return errors.Newf("repoPath: want %q but got %q", headPath, repoPath)
 			} else if name == "" {
 				return errors.New("empty name")
 			} else if url != basePath {
-				return fmt.Errorf("url: want %q but got %q", basePath, url)
+				return errors.Newf("url: want %q but got %q", basePath, url)
 			}
 
 			if len(opts) == 0 {
 				return errors.New("no options")
 			} else if !opts[0].Fetch {
-				return fmt.Errorf("opts.Fetch: want %v but got %v", true, opts[0].Fetch)
+				return errors.Newf("opts.Fetch: want %v but got %v", true, opts[0].Fetch)
 			}
 
 			return nil
 		},
 		mergeBase: func(repoPath, base, head string, opts ...git.MergeBaseOptions) (string, error) {
 			if repoPath != headPath {
-				return "", fmt.Errorf("repoPath: want %q but got %q", headPath, repoPath)
+				return "", errors.Newf("repoPath: want %q but got %q", headPath, repoPath)
 			} else if base == "" {
 				return "", errors.New("empty base")
 			} else if head != headBranch {
-				return "", fmt.Errorf("head: want %q but got %q", headBranch, head)
+				return "", errors.Newf("head: want %q but got %q", headBranch, head)
 			}
 
 			return mergeBase, nil
 		},
 		log: func(repoPath, rev string, opts ...git.LogOptions) ([]*git.Commit, error) {
 			if repoPath != headPath {
-				return nil, fmt.Errorf("repoPath: want %q but got %q", headPath, repoPath)
+				return nil, errors.Newf("repoPath: want %q but got %q", headPath, repoPath)
 			}
 
 			expRev := mergeBase + "..." + headBranch
 			if rev != expRev {
-				return nil, fmt.Errorf("rev: want %q but got %q", expRev, rev)
+				return nil, errors.Newf("rev: want %q but got %q", expRev, rev)
 			}
 
 			return commits, nil
 		},
 		diffNameOnly: func(repoPath, base, head string, opts ...git.DiffNameOnlyOptions) ([]string, error) {
 			if repoPath != headPath {
-				return nil, fmt.Errorf("repoPath: want %q but got %q", headPath, repoPath)
+				return nil, errors.Newf("repoPath: want %q but got %q", headPath, repoPath)
 			} else if base == "" {
 				return nil, errors.New("empty base")
 			} else if head != headBranch {
-				return nil, fmt.Errorf("head: want %q but got %q", headBranch, head)
+				return nil, errors.Newf("head: want %q but got %q", headBranch, head)
 			}
 
 			if len(opts) == 0 {
 				return nil, errors.New("no options")
 			} else if !opts[0].NeedsMergeBase {
-				return nil, fmt.Errorf("opts.NeedsMergeBase: want %v but got %v", true, opts[0].NeedsMergeBase)
+				return nil, errors.Newf("opts.NeedsMergeBase: want %v but got %v", true, opts[0].NeedsMergeBase)
 			}
 
 			return changedFiles, nil
 		},
 		remoteRemove: func(repoPath, name string, opts ...git.RemoteRemoveOptions) error {
 			if repoPath != headPath {
-				return fmt.Errorf("repoPath: want %q but got %q", headPath, repoPath)
+				return errors.Newf("repoPath: want %q but got %q", headPath, repoPath)
 			} else if name == "" {
 				return errors.New("empty name")
 			}

+ 1 - 1
internal/gitutil/tag.go

@@ -1,7 +1,7 @@
 package gitutil
 
 import (
-	"github.com/pkg/errors"
+	"github.com/cockroachdb/errors"
 )
 
 // TagsPage contains a list of tags and pagination information.

+ 1 - 1
internal/lfsutil/oid.go

@@ -1,7 +1,7 @@
 package lfsutil
 
 import (
-	"github.com/pkg/errors"
+	"github.com/cockroachdb/errors"
 
 	"gogs.io/gogs/internal/lazyregexp"
 )

+ 1 - 1
internal/lfsutil/storage.go

@@ -5,7 +5,7 @@ import (
 	"os"
 	"path/filepath"
 
-	"github.com/pkg/errors"
+	"github.com/cockroachdb/errors"
 
 	"gogs.io/gogs/internal/osutil"
 )

+ 2 - 3
internal/process/manager.go

@@ -2,12 +2,11 @@ package process
 
 import (
 	"bytes"
-	"errors"
-	"fmt"
 	"os/exec"
 	"sync"
 	"time"
 
+	"github.com/cockroachdb/errors"
 	log "unknwon.dev/clog/v2"
 )
 
@@ -125,7 +124,7 @@ func Kill(pid int64) error {
 			if proc.Cmd != nil && proc.Cmd.Process != nil &&
 				proc.Cmd.ProcessState != nil && !proc.Cmd.ProcessState.Exited() {
 				if err := proc.Cmd.Process.Kill(); err != nil {
-					return fmt.Errorf("fail to kill process [pid: %d, desc: %s]: %v", proc.PID, proc.Description, err)
+					return errors.Newf("fail to kill process [pid: %d, desc: %s]: %v", proc.PID, proc.Description, err)
 				}
 			}
 			Remove(pid)

+ 1 - 1
internal/route/api/v1/repo/contents.go

@@ -6,8 +6,8 @@ import (
 	"net/http"
 	"path"
 
+	"github.com/cockroachdb/errors"
 	"github.com/gogs/git-module"
-	"github.com/pkg/errors"
 
 	"gogs.io/gogs/internal/context"
 	"gogs.io/gogs/internal/database"

+ 1 - 1
internal/route/api/v1/repo/hook.go

@@ -3,8 +3,8 @@ package repo
 import (
 	"net/http"
 
+	"github.com/cockroachdb/errors"
 	jsoniter "github.com/json-iterator/go"
-	"github.com/pkg/errors"
 	"github.com/unknwon/com"
 
 	api "github.com/gogs/go-gogs-client"

+ 3 - 3
internal/route/api/v1/repo/issue.go

@@ -1,10 +1,10 @@
 package repo
 
 import (
-	"fmt"
 	"net/http"
 	"strings"
 
+	"github.com/cockroachdb/errors"
 	api "github.com/gogs/go-gogs-client"
 
 	"gogs.io/gogs/internal/conf"
@@ -82,7 +82,7 @@ func CreateIssue(c *context.APIContext, form api.CreateIssueOption) {
 			assignee, err := database.Handle.Users().GetByUsername(c.Req.Context(), form.Assignee)
 			if err != nil {
 				if database.IsErrUserNotExist(err) {
-					c.ErrorStatus(http.StatusUnprocessableEntity, fmt.Errorf("assignee does not exist: [name: %s]", form.Assignee))
+					c.ErrorStatus(http.StatusUnprocessableEntity, errors.Newf("assignee does not exist: [name: %s]", form.Assignee))
 				} else {
 					c.Error(err, "get user by name")
 				}
@@ -144,7 +144,7 @@ func EditIssue(c *context.APIContext, form api.EditIssueOption) {
 			assignee, err := database.Handle.Users().GetByUsername(c.Req.Context(), *form.Assignee)
 			if err != nil {
 				if database.IsErrUserNotExist(err) {
-					c.ErrorStatus(http.StatusUnprocessableEntity, fmt.Errorf("assignee does not exist: [name: %s]", *form.Assignee))
+					c.ErrorStatus(http.StatusUnprocessableEntity, errors.Newf("assignee does not exist: [name: %s]", *form.Assignee))
 				} else {
 					c.Error(err, "get user by name")
 				}

+ 1 - 1
internal/route/api/v1/repo/key.go

@@ -3,8 +3,8 @@ package repo
 import (
 	"net/http"
 
+	"github.com/cockroachdb/errors"
 	api "github.com/gogs/go-gogs-client"
-	"github.com/pkg/errors"
 
 	"gogs.io/gogs/internal/conf"
 	"gogs.io/gogs/internal/context"

+ 1 - 1
internal/route/api/v1/repo/repo.go

@@ -4,8 +4,8 @@ import (
 	"net/http"
 	"path"
 
+	"github.com/cockroachdb/errors"
 	api "github.com/gogs/go-gogs-client"
-	"github.com/pkg/errors"
 	log "unknwon.dev/clog/v2"
 
 	"gogs.io/gogs/internal/conf"

+ 1 - 1
internal/route/api/v1/user/email.go

@@ -3,8 +3,8 @@ package user
 import (
 	"net/http"
 
+	"github.com/cockroachdb/errors"
 	api "github.com/gogs/go-gogs-client"
-	"github.com/pkg/errors"
 
 	"gogs.io/gogs/internal/conf"
 	"gogs.io/gogs/internal/context"

+ 1 - 1
internal/route/api/v1/user/key.go

@@ -3,8 +3,8 @@ package user
 import (
 	"net/http"
 
+	"github.com/cockroachdb/errors"
 	api "github.com/gogs/go-gogs-client"
-	"github.com/pkg/errors"
 
 	"gogs.io/gogs/internal/conf"
 	"gogs.io/gogs/internal/context"

+ 1 - 1
internal/route/install.go

@@ -7,8 +7,8 @@ import (
 	"path/filepath"
 	"strings"
 
+	"github.com/cockroachdb/errors"
 	"github.com/gogs/git-module"
-	"github.com/pkg/errors"
 	"github.com/unknwon/com"
 	"gopkg.in/ini.v1"
 	"gopkg.in/macaron.v1"

+ 3 - 3
internal/route/repo/download.go

@@ -1,10 +1,10 @@
 package repo
 
 import (
-	"fmt"
 	"net/http"
 	"path"
 
+	"github.com/cockroachdb/errors"
 	"github.com/gogs/git-module"
 
 	"gogs.io/gogs/internal/conf"
@@ -16,7 +16,7 @@ import (
 func serveData(c *context.Context, name string, data []byte) error {
 	commit, err := c.Repo.Commit.CommitByPath(git.CommitByRevisionOptions{Path: c.Repo.TreePath})
 	if err != nil {
-		return fmt.Errorf("get commit by path %q: %v", c.Repo.TreePath, err)
+		return errors.Newf("get commit by path %q: %v", c.Repo.TreePath, err)
 	}
 	c.Resp.Header().Set("Last-Modified", commit.Committer.When.Format(http.TimeFormat))
 
@@ -30,7 +30,7 @@ func serveData(c *context.Context, name string, data []byte) error {
 	}
 
 	if _, err := c.Resp.Write(data); err != nil {
-		return fmt.Errorf("write buffer to response: %v", err)
+		return errors.Newf("write buffer to response: %v", err)
 	}
 	return nil
 }

+ 1 - 1
internal/route/repo/editor.go

@@ -1,12 +1,12 @@
 package repo
 
 import (
-	"errors"
 	"fmt"
 	"net/http"
 	"path"
 	"strings"
 
+	"github.com/cockroachdb/errors"
 	log "unknwon.dev/clog/v2"
 
 	"gogs.io/gogs/internal/conf"

+ 1 - 1
internal/route/repo/issue.go

@@ -1,13 +1,13 @@
 package repo
 
 import (
-	"errors"
 	"fmt"
 	"net/http"
 	"net/url"
 	"strings"
 	"time"
 
+	"github.com/cockroachdb/errors"
 	"github.com/unknwon/com"
 	"github.com/unknwon/paginater"
 	log "unknwon.dev/clog/v2"

+ 3 - 3
internal/route/repo/release.go

@@ -1,9 +1,9 @@
 package repo
 
 import (
-	"fmt"
 	"strings"
 
+	"github.com/cockroachdb/errors"
 	"github.com/gogs/git-module"
 	log "unknwon.dev/clog/v2"
 
@@ -27,11 +27,11 @@ func calReleaseNumCommitsBehind(repoCtx *context.Repository, release *database.R
 		if repoCtx.GitRepo.HasBranch(release.Target) {
 			commit, err := repoCtx.GitRepo.BranchCommit(release.Target)
 			if err != nil {
-				return fmt.Errorf("get branch commit: %v", err)
+				return errors.Newf("get branch commit: %v", err)
 			}
 			countCache[release.Target], err = commit.CommitsCount()
 			if err != nil {
-				return fmt.Errorf("count commits: %v", err)
+				return errors.Newf("count commits: %v", err)
 			}
 		} else {
 			// Use NumCommits of the newest release on that target

+ 5 - 5
internal/route/repo/setting.go

@@ -1,12 +1,12 @@
 package repo
 
 import (
-	"errors"
 	"fmt"
 	"io"
 	"strings"
 	"time"
 
+	"github.com/cockroachdb/errors"
 	"github.com/gogs/git-module"
 	"github.com/unknwon/com"
 	log "unknwon.dev/clog/v2"
@@ -327,19 +327,19 @@ func UpdateAvatarSetting(c *context.Context, f form.Avatar, ctxRepo *database.Re
 	if f.Avatar != nil {
 		r, err := f.Avatar.Open()
 		if err != nil {
-			return fmt.Errorf("open avatar reader: %v", err)
+			return errors.Newf("open avatar reader: %v", err)
 		}
 		defer r.Close()
 
 		data, err := io.ReadAll(r)
 		if err != nil {
-			return fmt.Errorf("read avatar content: %v", err)
+			return errors.Newf("read avatar content: %v", err)
 		}
 		if !tool.IsImageFile(data) {
 			return errors.New(c.Tr("settings.uploaded_avatar_not_a_image"))
 		}
 		if err = ctxRepo.UploadAvatar(data); err != nil {
-			return fmt.Errorf("upload avatar: %v", err)
+			return errors.Newf("upload avatar: %v", err)
 		}
 	} else {
 		// No avatar is uploaded and reset setting back.
@@ -349,7 +349,7 @@ func UpdateAvatarSetting(c *context.Context, f form.Avatar, ctxRepo *database.Re
 	}
 
 	if err := database.UpdateRepository(ctxRepo, false); err != nil {
-		return fmt.Errorf("update repository: %v", err)
+		return errors.Newf("update repository: %v", err)
 	}
 
 	return nil

+ 1 - 1
internal/route/repo/webhook.go

@@ -1,13 +1,13 @@
 package repo
 
 import (
-	"errors"
 	"fmt"
 	"net/http"
 	"net/url"
 	"strings"
 	"time"
 
+	"github.com/cockroachdb/errors"
 	"github.com/gogs/git-module"
 	api "github.com/gogs/go-gogs-client"
 	jsoniter "github.com/json-iterator/go"

+ 2 - 2
internal/route/user/auth.go

@@ -3,10 +3,10 @@ package user
 import (
 	gocontext "context"
 	"encoding/hex"
-	"fmt"
 	"net/http"
 	"net/url"
 
+	"github.com/cockroachdb/errors"
 	"github.com/go-macaron/captcha"
 	"github.com/unknwon/com"
 	log "unknwon.dev/clog/v2"
@@ -55,7 +55,7 @@ func AutoLogin(c *context.Context) (bool, error) {
 	u, err := database.Handle.Users().GetByUsername(c.Req.Context(), uname)
 	if err != nil {
 		if !database.IsErrUserNotExist(err) {
-			return false, fmt.Errorf("get user by name: %v", err)
+			return false, errors.Newf("get user by name: %v", err)
 		}
 		return false, nil
 	}

+ 3 - 3
internal/route/user/setting.go

@@ -9,7 +9,7 @@ import (
 	"image/png"
 	"io"
 
-	"github.com/pkg/errors"
+	"github.com/cockroachdb/errors"
 	"github.com/pquerna/otp"
 	"github.com/pquerna/otp/totp"
 	"gopkg.in/macaron.v1"
@@ -146,13 +146,13 @@ func UpdateAvatarSetting(c *context.Context, f form.Avatar, ctxUser *database.Us
 	if f.Avatar != nil && f.Avatar.Filename != "" {
 		r, err := f.Avatar.Open()
 		if err != nil {
-			return fmt.Errorf("open avatar reader: %v", err)
+			return errors.Newf("open avatar reader: %v", err)
 		}
 		defer func() { _ = r.Close() }()
 
 		data, err := io.ReadAll(r)
 		if err != nil {
-			return fmt.Errorf("read avatar content: %v", err)
+			return errors.Newf("read avatar content: %v", err)
 		}
 		if !tool.IsImageFile(data) {
 			return errors.New(c.Tr("settings.uploaded_avatar_not_a_image"))

+ 1 - 1
internal/ssh/ssh.go

@@ -10,7 +10,7 @@ import (
 	"strings"
 	"syscall"
 
-	"github.com/pkg/errors"
+	"github.com/cockroachdb/errors"
 	"github.com/sourcegraph/run"
 	"github.com/unknwon/com"
 	"golang.org/x/crypto/ssh"

+ 2 - 1
internal/template/template.go

@@ -9,6 +9,7 @@ import (
 	"sync"
 	"time"
 
+	"github.com/cockroachdb/errors"
 	"github.com/editorconfig/editorconfig-core-go/v2"
 	jsoniter "github.com/json-iterator/go"
 	"github.com/microcosm-cc/bluemonday"
@@ -160,7 +161,7 @@ func ToUTF8WithErr(content []byte) (string, error) {
 
 	encoding, _ := charset.Lookup(charsetLabel)
 	if encoding == nil {
-		return string(content), fmt.Errorf("unknown encoding: %s", charsetLabel)
+		return string(content), errors.Newf("unknown encoding: %s", charsetLabel)
 	}
 
 	// If there is an error, we concatenate the nicely decoded part and the

+ 3 - 3
internal/testutil/exec.go

@@ -1,11 +1,11 @@
 package testutil
 
 import (
-	"errors"
-	"fmt"
 	"os"
 	"os/exec"
 	"strings"
+
+	"github.com/cockroachdb/errors"
 )
 
 // Exec executes "go test" on given helper with supplied environment variables.
@@ -34,7 +34,7 @@ func Exec(helper string, envs ...string) (string, error) {
 	}
 
 	if err != nil {
-		return "", fmt.Errorf("%v - %s", err, str)
+		return "", errors.Newf("%v - %s", err, str)
 	}
 	return "", errors.New(str)
 }

+ 14 - 10
internal/testutil/exec_test.go

@@ -1,7 +1,6 @@
 package testutil
 
 import (
-	"errors"
 	"fmt"
 	"os"
 	"testing"
@@ -24,17 +23,17 @@ func TestExecHelper(_ *testing.T) {
 
 func TestExec(t *testing.T) {
 	tests := []struct {
-		helper string
-		env    string
-		expOut string
-		expErr error
+		helper    string
+		env       string
+		expOut    string
+		expErrMsg string
 	}{
 		{
-			helper: "NoTestsToRun",
-			expErr: errors.New("no tests to run"),
+			helper:    "NoTestsToRun",
+			expErrMsg: "no tests to run",
 		}, {
-			helper: "TestExecHelper",
-			expErr: errors.New("exit status 1 - tests failed\n"),
+			helper:    "TestExecHelper",
+			expErrMsg: "exit status 1 - tests failed\n",
 		}, {
 			helper: "TestExecHelper",
 			env:    "PASS=1",
@@ -44,7 +43,12 @@ func TestExec(t *testing.T) {
 	for _, test := range tests {
 		t.Run("", func(t *testing.T) {
 			out, err := Exec(test.helper, test.env)
-			assert.Equal(t, test.expErr, err)
+			if test.expErrMsg != "" {
+				assert.Error(t, err)
+				assert.Contains(t, err.Error(), test.expErrMsg)
+			} else {
+				assert.NoError(t, err)
+			}
 			assert.Equal(t, test.expOut, out)
 		})
 	}

+ 1 - 1
internal/userutil/userutil.go

@@ -13,8 +13,8 @@ import (
 	"strconv"
 	"strings"
 
+	"github.com/cockroachdb/errors"
 	"github.com/nfnt/resize"
-	"github.com/pkg/errors"
 	"golang.org/x/crypto/pbkdf2"
 
 	"gogs.io/gogs/internal/avatar"

+ 2 - 2
templates/embed.go

@@ -3,13 +3,13 @@ package templates
 import (
 	"bytes"
 	"embed"
-	"fmt"
 	"io"
 	"io/fs"
 	"os"
 	"path"
 	"strings"
 
+	"github.com/cockroachdb/errors"
 	"gopkg.in/macaron.v1"
 
 	"gogs.io/gogs/internal/osutil"
@@ -33,7 +33,7 @@ func (fs *fileSystem) Get(name string) (io.Reader, error) {
 			return bytes.NewReader(fs.files[i].Data()), nil
 		}
 	}
-	return nil, fmt.Errorf("file %q not found", name)
+	return nil, errors.Newf("file %q not found", name)
 }
 
 func mustNames(fsys fs.FS) []string {