Browse Source

log: migrate to unknwon.dev/clog/v2 (#5927)

* Add unknwon.dev/clog/v2

* Update all places
ᴜɴᴋɴᴡᴏɴ 4 years ago
parent
commit
1c09373b4f
71 changed files with 579 additions and 502 deletions
  1. 3 3
      conf/locale/locale_en-US.ini
  2. 4 4
      go.mod
  3. 27 2
      go.sum
  4. 2 2
      gogs.go
  5. 3 3
      internal/assets/conf/conf_gen.go
  6. 1 1
      internal/assets/templates/templates_gen.go
  7. 8 8
      internal/auth/auth.go
  8. 6 6
      internal/auth/ldap/ldap.go
  9. 2 2
      internal/cmd/admin.go
  10. 15 15
      internal/cmd/backup.go
  11. 8 8
      internal/cmd/hook.go
  12. 1 1
      internal/cmd/import.go
  13. 17 17
      internal/cmd/restore.go
  14. 17 12
      internal/cmd/serv.go
  15. 5 5
      internal/cmd/web.go
  16. 2 2
      internal/context/api.go
  17. 2 2
      internal/context/context.go
  18. 4 4
      internal/context/notice.go
  19. 5 5
      internal/cron/cron.go
  20. 2 2
      internal/db/access.go
  21. 5 5
      internal/db/action.go
  22. 2 2
      internal/db/admin.go
  23. 10 10
      internal/db/comment.go
  24. 13 13
      internal/db/issue.go
  25. 2 2
      internal/db/issue_mail.go
  26. 6 6
      internal/db/login_source.go
  27. 2 2
      internal/db/migrations/migrations.go
  28. 1 1
      internal/db/migrations/v15.go
  29. 1 1
      internal/db/migrations/v16.go
  30. 3 3
      internal/db/milestone.go
  31. 30 30
      internal/db/mirror.go
  32. 4 4
      internal/db/models.go
  33. 24 24
      internal/db/pull.go
  34. 2 2
      internal/db/release.go
  35. 32 32
      internal/db/repo.go
  36. 2 2
      internal/db/repo_collaboration.go
  37. 2 2
      internal/db/ssh_key.go
  38. 1 1
      internal/db/ssh_key_test.go
  39. 2 2
      internal/db/two_factor.go
  40. 1 1
      internal/db/update.go
  41. 5 5
      internal/db/user.go
  42. 12 12
      internal/db/webhook.go
  43. 6 6
      internal/mailer/mail.go
  44. 3 3
      internal/mailer/mailer.go
  45. 3 3
      internal/process/manager.go
  46. 1 1
      internal/route/admin/auths.go
  47. 1 1
      internal/route/admin/notice.go
  48. 1 1
      internal/route/admin/repos.go
  49. 1 1
      internal/route/admin/users.go
  50. 6 6
      internal/route/api/v1/admin/user.go
  51. 5 5
      internal/route/api/v1/repo/repo.go
  52. 11 10
      internal/route/install.go
  53. 2 2
      internal/route/org/members.go
  54. 1 1
      internal/route/org/org.go
  55. 3 3
      internal/route/org/setting.go
  56. 3 3
      internal/route/org/teams.go
  57. 4 4
      internal/route/repo/branch.go
  58. 5 5
      internal/route/repo/editor.go
  59. 4 4
      internal/route/repo/http.go
  60. 2 2
      internal/route/repo/issue.go
  61. 3 3
      internal/route/repo/pull.go
  62. 1 1
      internal/route/repo/release.go
  63. 3 3
      internal/route/repo/repo.go
  64. 3 3
      internal/route/repo/setting.go
  65. 3 3
      internal/route/repo/view.go
  66. 5 5
      internal/route/user/auth.go
  67. 3 3
      internal/route/user/setting.go
  68. 182 136
      internal/setting/setting.go
  69. 15 15
      internal/ssh/ssh.go
  70. 2 2
      internal/template/template.go
  71. 1 1
      internal/tool/tool.go

+ 3 - 3
conf/locale/locale_en-US.ini

@@ -113,14 +113,14 @@ admin_password = Password
 confirm_password = Confirm Password
 admin_email = Admin Email
 install_gogs = Install Gogs
-test_git_failed = Fail to test 'git' command: %v
+test_git_failed = Failed to test 'git' command: %v
 sqlite3_not_available = Your release version does not support SQLite3, please download the official binary version from %s, NOT the gobuild version.
 invalid_db_setting = Database setting is not correct: %v
 invalid_repo_path = Repository root path is invalid: %v
 run_user_not_match = Run user isn't the current user: %s -> %s
 smtp_host_missing_port = SMTP Host port missing from address.
 invalid_smtp_from = SMTP From field is invalid: %v
-save_config_failed = Fail to save configuration: %v
+save_config_failed = Failed to save configuration: %v
 invalid_admin_setting = Admin account setting is invalid: %v
 install_success = Welcome! We're glad that you chose Gogs, have fun and take care.
 invalid_log_root_path = Log root path is invalid: %v
@@ -1231,7 +1231,7 @@ config.mailer_subject_prefix = Subject Prefix
 config.mailer_host = Host
 config.mailer_user = User
 config.send_test_mail = Send Test Email
-config.test_mail_failed = Fail to send test email to '%s': %v
+config.test_mail_failed = Failed to send test email to '%s': %v
 config.test_mail_sent = Test email has been sent to '%s'.
 
 config.oauth_config = OAuth Configuration

+ 4 - 4
go.mod

@@ -6,7 +6,7 @@ require (
 	github.com/bgentry/speakeasy v0.1.0 // indirect
 	github.com/denisenkom/go-mssqldb v0.0.0-20191001013358-cfbb681360f0
 	github.com/editorconfig/editorconfig-core-go/v2 v2.2.1
-	github.com/fatih/color v1.7.0 // indirect
+	github.com/fatih/color v1.9.0 // indirect
 	github.com/go-macaron/binding v1.0.1
 	github.com/go-macaron/cache v0.0.0-20190810181446-10f7c57e2196
 	github.com/go-macaron/captcha v0.0.0-20190813234938-24f40749f36d
@@ -30,8 +30,7 @@ require (
 	github.com/klauspost/compress v1.8.6 // indirect
 	github.com/klauspost/cpuid v1.2.1 // indirect
 	github.com/lib/pq v1.2.0
-	github.com/mattn/go-colorable v0.1.4 // indirect
-	github.com/mattn/go-isatty v0.0.10 // indirect
+	github.com/mattn/go-isatty v0.0.12 // indirect
 	github.com/mattn/go-runewidth v0.0.4 // indirect
 	github.com/mattn/go-sqlite3 v1.11.0
 	github.com/mcuadros/go-version v0.0.0-20190830083331-035f6764e8d2
@@ -56,14 +55,15 @@ require (
 	github.com/urfave/cli v1.22.1
 	golang.org/x/crypto v0.0.0-20200214034016-1d94cc7ab1c6
 	golang.org/x/net v0.0.0-20191014212845-da9a3fd4c582
+	golang.org/x/sys v0.0.0-20200219091948-cb0a6d8edb6c // indirect
 	golang.org/x/text v0.3.2
 	gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect
 	gopkg.in/asn1-ber.v1 v1.0.0-20181015200546-f715ec2f112d // indirect
-	gopkg.in/clog.v1 v1.2.0
 	gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df
 	gopkg.in/ini.v1 v1.52.0
 	gopkg.in/ldap.v2 v2.5.1
 	gopkg.in/macaron.v1 v1.3.4
+	unknwon.dev/clog/v2 v2.1.0
 	xorm.io/builder v0.3.6
 	xorm.io/core v0.7.2
 	xorm.io/xorm v0.8.0

+ 27 - 2
go.sum

@@ -13,6 +13,7 @@ github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24
 github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
 github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
 github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
+github.com/bgentry/speakeasy v0.1.0 h1:ByYyxL9InA1OWqxJqqp2A5pYHUrCiAL6K3J+LKSsQkY=
 github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
 github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ=
 github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=
@@ -43,6 +44,8 @@ github.com/editorconfig/editorconfig-core-go/v2 v2.2.1/go.mod h1:6XDmqAZsQu8ikS+
 github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M=
 github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys=
 github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
+github.com/fatih/color v1.9.0 h1:8xPHl4/q1VyqGIPif1F+1V3Y3lSmrq01EabUW3CoW5s=
+github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=
 github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
 github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
 github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
@@ -69,6 +72,7 @@ github.com/go-macaron/toolbox v0.0.0-20190813233741-94defb8383c6/go.mod h1:YFNJ/
 github.com/go-sql-driver/mysql v1.4.1 h1:g24URVg0OFbNUTx9qqY1IRZ9D9z3iPyi5zKhQZpNwpA=
 github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
 github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
+github.com/go-xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a h1:9wScpmSP5A3Bk8V3XHWUcJmYTh+ZnlHVyc+A4oZYS3Y=
 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=
@@ -82,6 +86,7 @@ github.com/gogs/go-gogs-client v0.0.0-20200128182646-c69cb7680fd4 h1:C7NryI/RQhs
 github.com/gogs/go-gogs-client v0.0.0-20200128182646-c69cb7680fd4/go.mod h1:fR6z1Ie6rtF7kl/vBYMfgD5/G5B1blui7z426/sj2DU=
 github.com/gogs/go-libravatar v0.0.0-20191106065024-33a75213d0a0 h1:K02vod+sn3M1OOkdqi2tPxN2+xESK4qyITVQ3JkGEv4=
 github.com/gogs/go-libravatar v0.0.0-20191106065024-33a75213d0a0/go.mod h1:Zas3BtO88pk1cwUfEYlvnl/CRwh0ybDxRWSwRjG8I3w=
+github.com/gogs/minwinsvc v0.0.0-20170301035411-95be6356811a h1:8DZwxETOVWIinYxDK+i6L+rMb7eGATGaakD6ZucfHVk=
 github.com/gogs/minwinsvc v0.0.0-20170301035411-95be6356811a/go.mod h1:TUIZ+29jodWQ8Gk6Pvtg4E09aMsc3C/VLZiVYfUhWQU=
 github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe h1:lXe2qZdvpiX5WZkZR4hgp4KJVfY3nMkvmwbVkpv1rVY=
 github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0=
@@ -96,6 +101,7 @@ github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8l
 github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
 github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
 github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
+github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY=
 github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
 github.com/google/go-github v17.0.0+incompatible h1:N0LgJ1j65A7kfXrZnUDaYCs/Sf4rEjNlfyDHW9dolSY=
 github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ=
@@ -107,11 +113,13 @@ github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OI
 github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
 github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
 github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
+github.com/gopherjs/gopherjs v0.0.0-20190430165422-3e4dfb77656c h1:7lF+Vz0LqiRidnzC1Oq86fpX1q/iEv2KJdrCtttYjT4=
 github.com/gopherjs/gopherjs v0.0.0-20190430165422-3e4dfb77656c/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
 github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
 github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
 github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
 github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
+github.com/issue9/assert v1.3.1 h1:L8pRpbnzMIPFJqrMKR/oG03uWrtVeZyYBpI2U2Jx1JE=
 github.com/issue9/assert v1.3.1/go.mod h1:9Ger+iz8X7r1zMYYwEhh++2wMGWcNN2oVI+zIQXxcio=
 github.com/issue9/identicon v1.0.1 h1:pCDfjMDM6xWK0Chxo8Lif+ST/nOEtmXgMITgV1YA9Og=
 github.com/issue9/identicon v1.0.1/go.mod h1:UKNVkUFI68RPz/RlLhsAr1aX6bBSaYEWRHVfdjrMUmk=
@@ -132,8 +140,10 @@ github.com/klauspost/cpuid v1.2.1 h1:vJi+O/nMdFt0vqm8NZBI6wzALWdA2X+egi0ogNyrC/w
 github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
 github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
 github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
+github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
 github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
 github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
+github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
 github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
 github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
 github.com/lib/pq v1.2.0 h1:LXpIM/LZ5xGFhOpXAQUIMM1HdyqzVYM13zNdjCEEcA0=
@@ -145,9 +155,13 @@ github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVc
 github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
 github.com/mattn/go-isatty v0.0.10 h1:qxFzApOv4WsAL965uUPIsXzAKCZxN2p9UqdhFS4ZW10=
 github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=
+github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=
+github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY=
+github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
 github.com/mattn/go-runewidth v0.0.4 h1:2BvfKmzob6Bmd4YsL0zygOqfdFnK7GR4QL06Do4/p7Y=
 github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
 github.com/mattn/go-sqlite3 v1.10.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
+github.com/mattn/go-sqlite3 v1.11.0 h1:LDdKkqtYlom37fkvqs8rMPFKAMe8+SgjbwZ6ex1/A/Q=
 github.com/mattn/go-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
 github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
 github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
@@ -162,6 +176,7 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJ
 github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
 github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI=
 github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
+github.com/msteinert/pam v0.0.0-20190215180659-f29b9f28d6f9 h1:ZivaaKmjs9q90zi6I4gTLW6tbVGtlBjellr3hMYaly0=
 github.com/msteinert/pam v0.0.0-20190215180659-f29b9f28d6f9/go.mod h1:np1wUFZ6tyoke22qDJZY40URn9Ae51gX7ljIWXN5TJs=
 github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
 github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6Oo2LfFZAehjjQMERAvZLEDnQ=
@@ -208,6 +223,7 @@ github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNue
 github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
 github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q=
 github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
+github.com/saintfish/chardet v0.0.0-20120816061221-3af4cd4741ca h1:NugYot0LIVPxTvN8n+Kvkn6TrbMyxQiuvKdEwFdR9vI=
 github.com/saintfish/chardet v0.0.0-20120816061221-3af4cd4741ca/go.mod h1:uugorj2VCxiV1x+LzaIdVa9b4S4qGAcH6cbhh4qVxOU=
 github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww=
 github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
@@ -249,6 +265,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.1 h1:+mkCCcOFKPnCmVYVcURKps1Xe+3zP90gSYGNfRkjoIY=
 github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
+github.com/ziutek/mymysql v1.5.4 h1:GB0qdRGsTwQSBVYuVShFBKaXSnSnYYC2d9knnE1LHFs=
 github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wKdgO/C0=
 go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
 golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
@@ -297,7 +314,12 @@ golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7w
 golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190804053845-51ab0e2deafa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191010194322-b09406accb47 h1:/XfQ9z7ib8eEJX2hdgFTZJ/ntt0swNk5oYBziWeTCvY=
 golang.org/x/sys v0.0.0-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200219091948-cb0a6d8edb6c h1:jceGD5YNJGgGMkJz79agzOln1K9TaZUjv5ird16qniQ=
+golang.org/x/sys v0.0.0-20200219091948-cb0a6d8edb6c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
@@ -316,6 +338,7 @@ google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMt
 google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
 google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
 google.golang.org/appengine v1.6.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
+google.golang.org/appengine v1.6.1 h1:QzqyMA1tlu6CgqCDUtU9V+ZKhLFT2dkJuANu5QaxI3I=
 google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
 google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
 google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
@@ -323,15 +346,15 @@ google.golang.org/genproto v0.0.0-20190404172233-64821d5d2107/go.mod h1:VzzqZJRn
 google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=
 google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
 gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
+gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc h1:2gGKlE2+asNV9m7xrywl36YYNnBG5ZQ0r/BOOxqPpmk=
 gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc/go.mod h1:m7x9LTH6d71AHyAX77c9yqWCCa3UKHcVEj9y7hAtKDk=
 gopkg.in/asn1-ber.v1 v1.0.0-20181015200546-f715ec2f112d h1:TxyelI5cVkbREznMhfzycHdkp5cLA7DpE+GKjSslYhM=
 gopkg.in/asn1-ber.v1 v1.0.0-20181015200546-f715ec2f112d/go.mod h1:cuepJuh7vyXfUyUwEgHQXw849cJrilpS5NeIjOWESAw=
 gopkg.in/bufio.v1 v1.0.0-20140618132640-567b2bfa514e h1:wGA78yza6bu/mWcc4QfBuIEHEtc06xdiU0X8sY36yUU=
 gopkg.in/bufio.v1 v1.0.0-20140618132640-567b2bfa514e/go.mod h1:xsQCaysVCudhrYTfzYWe577fCe7Ceci+6qjO2Rdc0Z4=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/clog.v1 v1.2.0 h1:BHfwHRNQy497iBNsRBassPixSAxRbn2z5KVkdBFbwxc=
-gopkg.in/clog.v1 v1.2.0/go.mod h1:L6fgdpdhFgKX4eGuDvt+N6X2GwZE160NRrIHzvaF8ZM=
 gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
 gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df h1:n7WqCuqOuCbNr617RXOY0AWRXxgwEyPp2z+p0+hgMuE=
 gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df/go.mod h1:LRQQ+SO6ZHR7tOkpBDuZnXENFzX8qRjMDMyPD6BRkCw=
@@ -352,6 +375,8 @@ gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+unknwon.dev/clog/v2 v2.1.0 h1:4iXteBnL9ESvxoNkiaWx4UTU6yEgEmDxFaMANyiq4b8=
+unknwon.dev/clog/v2 v2.1.0/go.mod h1:zvUlyibDHI4mykYdWyWje2G9nF/nBzfDOqRo2my4mWc=
 xorm.io/builder v0.3.6 h1:ha28mQ2M+TFx96Hxo+iq6tQgnkC9IZkM6D8w9sKHHF8=
 xorm.io/builder v0.3.6/go.mod h1:LEFAPISnRzG+zxaxj2vPicRwz67BdhFreKg8yv8/TgU=
 xorm.io/core v0.7.2 h1:mEO22A2Z7a3fPaZMk6gKL/jMD80iiyNwRrX5HOv3XLw=

+ 2 - 2
gogs.go

@@ -11,7 +11,7 @@ import (
 	"os"
 
 	"github.com/urfave/cli"
-	log "gopkg.in/clog.v1"
+	log "unknwon.dev/clog/v2"
 
 	"gogs.io/gogs/internal/cmd"
 	"gogs.io/gogs/internal/setting"
@@ -39,6 +39,6 @@ func main() {
 		cmd.Restore,
 	}
 	if err := app.Run(os.Args); err != nil {
-		log.Fatal(2, "Failed to run: %v", err)
+		log.Fatal("Failed to start application: %v", err)
 	}
 }

File diff suppressed because it is too large
+ 3 - 3
internal/assets/conf/conf_gen.go


+ 1 - 1
internal/assets/templates/templates_gen.go

@@ -2432,7 +2432,7 @@ func repoView_fileTmpl() (*asset, error) {
 		return nil, err
 	}
 
-	info := bindataFileInfo{name: "repo/view_file.tmpl", size: 4983, mode: os.FileMode(0644), modTime: time.Unix(1571173927, 0)}
+	info := bindataFileInfo{name: "repo/view_file.tmpl", size: 4983, mode: os.FileMode(0644), modTime: time.Unix(1582133193, 0)}
 	a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xa2, 0x6f, 0xd7, 0xaa, 0xde, 0x42, 0x19, 0xb3, 0x6e, 0xe6, 0x56, 0xa5, 0x78, 0x70, 0xda, 0x65, 0x6, 0xf7, 0x52, 0xa7, 0x53, 0x56, 0xec, 0xcb, 0x8e, 0x59, 0x94, 0x0, 0x44, 0x4b, 0xb5, 0x23}}
 	return a, nil
 }

+ 8 - 8
internal/auth/auth.go

@@ -10,8 +10,8 @@ import (
 
 	"github.com/go-macaron/session"
 	gouuid "github.com/satori/go.uuid"
-	log "gopkg.in/clog.v1"
 	"gopkg.in/macaron.v1"
+	log "unknwon.dev/clog/v2"
 
 	"gogs.io/gogs/internal/db"
 	"gogs.io/gogs/internal/db/errors"
@@ -52,13 +52,13 @@ func SignedInID(c *macaron.Context, sess session.Store) (_ int64, isTokenAuth bo
 			t, err := db.GetAccessTokenBySHA(tokenSHA)
 			if err != nil {
 				if !db.IsErrAccessTokenNotExist(err) && !db.IsErrAccessTokenEmpty(err) {
-					log.Error(2, "GetAccessTokenBySHA: %v", err)
+					log.Error("GetAccessTokenBySHA: %v", err)
 				}
 				return 0, false
 			}
 			t.Updated = time.Now()
 			if err = db.UpdateAccessToken(t); err != nil {
-				log.Error(2, "UpdateAccessToken: %v", err)
+				log.Error("UpdateAccessToken: %v", err)
 			}
 			return t.UID, true
 		}
@@ -71,7 +71,7 @@ func SignedInID(c *macaron.Context, sess session.Store) (_ int64, isTokenAuth bo
 	if id, ok := uid.(int64); ok {
 		if _, err := db.GetUserByID(id); err != nil {
 			if !errors.IsUserNotExist(err) {
-				log.Error(2, "GetUserByID: %v", err)
+				log.Error("GetUserByID: %v", err)
 			}
 			return 0, false
 		}
@@ -96,7 +96,7 @@ func SignedInUser(ctx *macaron.Context, sess session.Store) (_ *db.User, isBasic
 				u, err := db.GetUserByName(webAuthUser)
 				if err != nil {
 					if !errors.IsUserNotExist(err) {
-						log.Error(2, "GetUserByName: %v", err)
+						log.Error("GetUserByName: %v", err)
 						return nil, false, false
 					}
 
@@ -110,7 +110,7 @@ func SignedInUser(ctx *macaron.Context, sess session.Store) (_ *db.User, isBasic
 						}
 						if err = db.CreateUser(u); err != nil {
 							// FIXME: should I create a system notice?
-							log.Error(2, "CreateUser: %v", err)
+							log.Error("CreateUser: %v", err)
 							return nil, false, false
 						} else {
 							return u, false, false
@@ -131,7 +131,7 @@ func SignedInUser(ctx *macaron.Context, sess session.Store) (_ *db.User, isBasic
 				u, err := db.UserLogin(uname, passwd, -1)
 				if err != nil {
 					if !errors.IsUserNotExist(err) {
-						log.Error(2, "UserLogin: %v", err)
+						log.Error("UserLogin: %v", err)
 					}
 					return nil, false, false
 				}
@@ -144,7 +144,7 @@ func SignedInUser(ctx *macaron.Context, sess session.Store) (_ *db.User, isBasic
 
 	u, err := db.GetUserByID(uid)
 	if err != nil {
-		log.Error(2, "GetUserByID: %v", err)
+		log.Error("GetUserByID: %v", err)
 		return nil, false, false
 	}
 	return u, false, isTokenAuth

+ 6 - 6
internal/auth/ldap/ldap.go

@@ -11,8 +11,8 @@ import (
 	"fmt"
 	"strings"
 
-	log "gopkg.in/clog.v1"
 	"gopkg.in/ldap.v2"
+	log "unknwon.dev/clog/v2"
 )
 
 type SecurityProtocol int
@@ -130,7 +130,7 @@ func (ls *Source) findUserDN(l *ldap.Conn, name string) (string, bool) {
 
 	userDN := sr.Entries[0].DN
 	if userDN == "" {
-		log.Error(2, "LDAP: Search was successful, but found no DN!")
+		log.Error("LDAP: Search was successful, but found no DN!")
 		return "", false
 	}
 
@@ -183,7 +183,7 @@ func (ls *Source) SearchEntry(name, passwd string, directBind bool) (string, str
 	}
 	l, err := dial(ls)
 	if err != nil {
-		log.Error(2, "LDAP connect failed for '%s': %v", ls.Host, err)
+		log.Error("LDAP connect failed for '%s': %v", ls.Host, err)
 		return "", "", "", "", false, false
 	}
 	defer l.Close()
@@ -229,7 +229,7 @@ func (ls *Source) SearchEntry(name, passwd string, directBind bool) (string, str
 
 	sr, err := l.Search(search)
 	if err != nil {
-		log.Error(2, "LDAP: User search failed: %v", err)
+		log.Error("LDAP: User search failed: %v", err)
 		return "", "", "", "", false, false
 	} else if len(sr.Entries) < 1 {
 		if directBind {
@@ -266,7 +266,7 @@ func (ls *Source) SearchEntry(name, passwd string, directBind bool) (string, str
 
 		srg, err := l.Search(groupSearch)
 		if err != nil {
-			log.Error(2, "LDAP: Group search failed: %v", err)
+			log.Error("LDAP: Group search failed: %v", err)
 			return "", "", "", "", false, false
 		} else if len(srg.Entries) < 1 {
 			log.Trace("LDAP: Group search returned no entries")
@@ -308,7 +308,7 @@ func (ls *Source) SearchEntry(name, passwd string, directBind bool) (string, str
 
 		sr, err = l.Search(search)
 		if err != nil {
-			log.Error(2, "LDAP: Admin search failed: %v", err)
+			log.Error("LDAP: Admin search failed: %v", err)
 		} else if len(sr.Entries) < 1 {
 			log.Trace("LDAP: Admin search returned no entries")
 		} else {

+ 2 - 2
internal/cmd/admin.go

@@ -144,7 +144,7 @@ func runCreateUser(c *cli.Context) error {
 		setting.CustomConf = c.String("config")
 	}
 
-	setting.NewContext()
+	setting.Init()
 	db.LoadConfigs()
 	db.SetEngine()
 
@@ -168,7 +168,7 @@ func adminDashboardOperation(operation func() error, successMessage string) func
 			setting.CustomConf = c.String("config")
 		}
 
-		setting.NewContext()
+		setting.Init()
 		db.LoadConfigs()
 		db.SetEngine()
 

+ 15 - 15
internal/cmd/backup.go

@@ -14,8 +14,8 @@ import (
 	"github.com/unknwon/cae/zip"
 	"github.com/unknwon/com"
 	"github.com/urfave/cli"
-	log "gopkg.in/clog.v1"
 	"gopkg.in/ini.v1"
+	log "unknwon.dev/clog/v2"
 
 	"gogs.io/gogs/internal/db"
 	"gogs.io/gogs/internal/setting"
@@ -47,17 +47,17 @@ func runBackup(c *cli.Context) error {
 	if c.IsSet("config") {
 		setting.CustomConf = c.String("config")
 	}
-	setting.NewContext()
+	setting.Init()
 	db.LoadConfigs()
 	db.SetEngine()
 
 	tmpDir := c.String("tempdir")
 	if !com.IsExist(tmpDir) {
-		log.Fatal(0, "'--tempdir' does not exist: %s", tmpDir)
+		log.Fatal("'--tempdir' does not exist: %s", tmpDir)
 	}
 	rootDir, err := ioutil.TempDir(tmpDir, "gogs-backup-")
 	if err != nil {
-		log.Fatal(0, "Fail to create backup root directory '%s': %v", rootDir, err)
+		log.Fatal("Failed to create backup root directory '%s': %v", rootDir, err)
 	}
 	log.Info("Backup root directory: %s", rootDir)
 
@@ -68,7 +68,7 @@ func runBackup(c *cli.Context) error {
 	metadata.Section("").Key("DATE_TIME").SetValue(time.Now().String())
 	metadata.Section("").Key("GOGS_VERSION").SetValue(setting.AppVersion)
 	if err = metadata.SaveTo(metaFile); err != nil {
-		log.Fatal(0, "Fail to save metadata '%s': %v", metaFile, err)
+		log.Fatal("Failed to save metadata '%s': %v", metaFile, err)
 	}
 
 	archiveName := path.Join(c.String("target"), c.String("archive-name"))
@@ -76,25 +76,25 @@ func runBackup(c *cli.Context) error {
 
 	z, err := zip.Create(archiveName)
 	if err != nil {
-		log.Fatal(0, "Fail to create backup archive '%s': %v", archiveName, err)
+		log.Fatal("Failed to create backup archive '%s': %v", archiveName, err)
 	}
 	if err = z.AddFile(_ARCHIVE_ROOT_DIR+"/metadata.ini", metaFile); err != nil {
-		log.Fatal(0, "Fail to include 'metadata.ini': %v", err)
+		log.Fatal("Failed to include 'metadata.ini': %v", err)
 	}
 
 	// Database
 	dbDir := path.Join(rootDir, "db")
 	if err = db.DumpDatabase(dbDir); err != nil {
-		log.Fatal(0, "Fail to dump database: %v", err)
+		log.Fatal("Failed to dump database: %v", err)
 	}
 	if err = z.AddDir(_ARCHIVE_ROOT_DIR+"/db", dbDir); err != nil {
-		log.Fatal(0, "Fail to include 'db': %v", err)
+		log.Fatal("Failed to include 'db': %v", err)
 	}
 
 	// Custom files
 	if !c.Bool("database-only") {
 		if err = z.AddDir(_ARCHIVE_ROOT_DIR+"/custom", setting.CustomPath); err != nil {
-			log.Fatal(0, "Fail to include 'custom': %v", err)
+			log.Fatal("Failed to include 'custom': %v", err)
 		}
 	}
 
@@ -107,7 +107,7 @@ func runBackup(c *cli.Context) error {
 			}
 
 			if err = z.AddDir(path.Join(_ARCHIVE_ROOT_DIR+"/data", dir), dirPath); err != nil {
-				log.Fatal(0, "Fail to include 'data': %v", err)
+				log.Fatal("Failed to include 'data': %v", err)
 			}
 		}
 	}
@@ -117,21 +117,21 @@ func runBackup(c *cli.Context) error {
 		reposDump := path.Join(rootDir, "repositories.zip")
 		log.Info("Dumping repositories in '%s'", setting.RepoRootPath)
 		if err = zip.PackTo(setting.RepoRootPath, reposDump, true); err != nil {
-			log.Fatal(0, "Fail to dump repositories: %v", err)
+			log.Fatal("Failed to dump repositories: %v", err)
 		}
 		log.Info("Repositories dumped to: %s", reposDump)
 
 		if err = z.AddFile(_ARCHIVE_ROOT_DIR+"/repositories.zip", reposDump); err != nil {
-			log.Fatal(0, "Fail to include 'repositories.zip': %v", err)
+			log.Fatal("Failed to include 'repositories.zip': %v", err)
 		}
 	}
 
 	if err = z.Close(); err != nil {
-		log.Fatal(0, "Fail to save backup archive '%s': %v", archiveName, err)
+		log.Fatal("Failed to save backup archive '%s': %v", archiveName, err)
 	}
 
 	os.RemoveAll(rootDir)
 	log.Info("Backup succeed! Archive is located at: %s", archiveName)
-	log.Shutdown()
+	log.Stop()
 	return nil
 }

+ 8 - 8
internal/cmd/hook.go

@@ -16,7 +16,7 @@ import (
 
 	"github.com/unknwon/com"
 	"github.com/urfave/cli"
-	log "gopkg.in/clog.v1"
+	log "unknwon.dev/clog/v2"
 
 	"github.com/gogs/git-module"
 
@@ -129,7 +129,7 @@ func runHookPreReceive(c *cli.Context) error {
 		output, err := git.NewCommand("rev-list", "--max-count=1", oldCommitID, "^"+newCommitID).
 			RunInDir(db.RepoPath(os.Getenv(db.ENV_REPO_OWNER_NAME), os.Getenv(db.ENV_REPO_NAME)))
 		if err != nil {
-			fail("Internal error", "Fail to detect force push: %v", err)
+			fail("Internal error", "Failed to detect force push: %v", err)
 		} else if len(output) > 0 {
 			fail(fmt.Sprintf("Branch '%s' is protected from force push", branchName), "")
 		}
@@ -151,7 +151,7 @@ func runHookPreReceive(c *cli.Context) error {
 	hookCmd.Stdin = buf
 	hookCmd.Stderr = os.Stderr
 	if err := hookCmd.Run(); err != nil {
-		fail("Internal error", "Fail to execute custom pre-receive hook: %v", err)
+		fail("Internal error", "Failed to execute custom pre-receive hook: %v", err)
 	}
 	return nil
 }
@@ -185,7 +185,7 @@ func runHookUpdate(c *cli.Context) error {
 	hookCmd.Stdin = os.Stdin
 	hookCmd.Stderr = os.Stderr
 	if err := hookCmd.Run(); err != nil {
-		fail("Internal error", "Fail to execute custom pre-receive hook: %v", err)
+		fail("Internal error", "Failed to execute custom pre-receive hook: %v", err)
 	}
 	return nil
 }
@@ -229,7 +229,7 @@ func runHookPostReceive(c *cli.Context) error {
 			RepoName:     os.Getenv(db.ENV_REPO_NAME),
 		}
 		if err := db.PushUpdate(options); err != nil {
-			log.Error(2, "PushUpdate: %v", err)
+			log.Error("PushUpdate: %v", err)
 		}
 
 		// Ask for running deliver hook and test pull request tasks
@@ -245,10 +245,10 @@ func runHookPostReceive(c *cli.Context) error {
 		if err == nil {
 			resp.Body.Close()
 			if resp.StatusCode/100 != 2 {
-				log.Error(2, "Fail to trigger task: not 2xx response code")
+				log.Error("Failed to trigger task: not 2xx response code")
 			}
 		} else {
-			log.Error(2, "Fail to trigger task: %v", err)
+			log.Error("Failed to trigger task: %v", err)
 		}
 	}
 
@@ -268,7 +268,7 @@ func runHookPostReceive(c *cli.Context) error {
 	hookCmd.Stdin = buf
 	hookCmd.Stderr = os.Stderr
 	if err := hookCmd.Run(); err != nil {
-		fail("Internal error", "Fail to execute custom post-receive hook: %v", err)
+		fail("Internal error", "Failed to execute custom post-receive hook: %v", err)
 	}
 	return nil
 }

+ 1 - 1
internal/cmd/import.go

@@ -58,7 +58,7 @@ func runImportLocale(c *cli.Context) error {
 		setting.CustomConf = c.String("config")
 	}
 
-	setting.NewContext()
+	setting.Init()
 
 	now := time.Now()
 

+ 17 - 17
internal/cmd/restore.go

@@ -12,8 +12,8 @@ import (
 	"github.com/unknwon/cae/zip"
 	"github.com/unknwon/com"
 	"github.com/urfave/cli"
-	log "gopkg.in/clog.v1"
 	"gopkg.in/ini.v1"
+	log "unknwon.dev/clog/v2"
 
 	"gogs.io/gogs/internal/db"
 	"gogs.io/gogs/internal/setting"
@@ -48,12 +48,12 @@ func runRestore(c *cli.Context) error {
 
 	tmpDir := c.String("tempdir")
 	if !com.IsExist(tmpDir) {
-		log.Fatal(0, "'--tempdir' does not exist: %s", tmpDir)
+		log.Fatal("'--tempdir' does not exist: %s", tmpDir)
 	}
 
 	log.Info("Restore backup from: %s", c.String("from"))
 	if err := zip.ExtractTo(c.String("from"), tmpDir); err != nil {
-		log.Fatal(0, "Failed to extract backup archive: %v", err)
+		log.Fatal("Failed to extract backup archive: %v", err)
 	}
 	archivePath := path.Join(tmpDir, _ARCHIVE_ROOT_DIR)
 	defer os.RemoveAll(archivePath)
@@ -61,22 +61,22 @@ func runRestore(c *cli.Context) error {
 	// Check backup version
 	metaFile := path.Join(archivePath, "metadata.ini")
 	if !com.IsExist(metaFile) {
-		log.Fatal(0, "File 'metadata.ini' is missing")
+		log.Fatal("File 'metadata.ini' is missing")
 	}
 	metadata, err := ini.Load(metaFile)
 	if err != nil {
-		log.Fatal(0, "Failed to load metadata '%s': %v", metaFile, err)
+		log.Fatal("Failed to load metadata '%s': %v", metaFile, err)
 	}
 	backupVersion := metadata.Section("").Key("GOGS_VERSION").MustString("999.0")
 	if version.Compare(setting.AppVersion, backupVersion, "<") {
-		log.Fatal(0, "Current Gogs version is lower than backup version: %s < %s", setting.AppVersion, backupVersion)
+		log.Fatal("Current Gogs version is lower than backup version: %s < %s", setting.AppVersion, backupVersion)
 	}
 	formatVersion := metadata.Section("").Key("VERSION").MustInt()
 	if formatVersion == 0 {
-		log.Fatal(0, "Failed to determine the backup format version from metadata '%s': %s", metaFile, "VERSION is not presented")
+		log.Fatal("Failed to determine the backup format version from metadata '%s': %s", metaFile, "VERSION is not presented")
 	}
 	if formatVersion != _CURRENT_BACKUP_FORMAT_VERSION {
-		log.Fatal(0, "Backup format version found is %d but this binary only supports %d\nThe last known version that is able to import your backup is %s",
+		log.Fatal("Backup format version found is %d but this binary only supports %d\nThe last known version that is able to import your backup is %s",
 			formatVersion, _CURRENT_BACKUP_FORMAT_VERSION, lastSupportedVersionOfFormat[formatVersion])
 	}
 
@@ -86,29 +86,29 @@ func runRestore(c *cli.Context) error {
 	if c.IsSet("config") {
 		setting.CustomConf = c.String("config")
 	} else if !com.IsExist(configFile) {
-		log.Fatal(0, "'--config' is not specified and custom config file is not found in backup")
+		log.Fatal("'--config' is not specified and custom config file is not found in backup")
 	} else {
 		setting.CustomConf = configFile
 	}
-	setting.NewContext()
+	setting.Init()
 	db.LoadConfigs()
 	db.SetEngine()
 
 	// Database
 	dbDir := path.Join(archivePath, "db")
 	if err = db.ImportDatabase(dbDir, c.Bool("verbose")); err != nil {
-		log.Fatal(0, "Failed to import database: %v", err)
+		log.Fatal("Failed to import database: %v", err)
 	}
 
 	// Custom files
 	if !c.Bool("database-only") {
 		if com.IsExist(setting.CustomPath) {
 			if err = os.Rename(setting.CustomPath, setting.CustomPath+".bak"); err != nil {
-				log.Fatal(0, "Failed to backup current 'custom': %v", err)
+				log.Fatal("Failed to backup current 'custom': %v", err)
 			}
 		}
 		if err = os.Rename(path.Join(archivePath, "custom"), setting.CustomPath); err != nil {
-			log.Fatal(0, "Failed to import 'custom': %v", err)
+			log.Fatal("Failed to import 'custom': %v", err)
 		}
 	}
 
@@ -125,11 +125,11 @@ func runRestore(c *cli.Context) error {
 			dirPath := path.Join(setting.AppDataPath, dir)
 			if com.IsExist(dirPath) {
 				if err = os.Rename(dirPath, dirPath+".bak"); err != nil {
-					log.Fatal(0, "Failed to backup current 'data': %v", err)
+					log.Fatal("Failed to backup current 'data': %v", err)
 				}
 			}
 			if err = os.Rename(srcPath, dirPath); err != nil {
-				log.Fatal(0, "Failed to import 'data': %v", err)
+				log.Fatal("Failed to import 'data': %v", err)
 			}
 		}
 	}
@@ -138,11 +138,11 @@ func runRestore(c *cli.Context) error {
 	reposPath := path.Join(archivePath, "repositories.zip")
 	if !c.Bool("exclude-repos") && !c.Bool("database-only") && com.IsExist(reposPath) {
 		if err := zip.ExtractTo(reposPath, path.Dir(setting.RepoRootPath)); err != nil {
-			log.Fatal(0, "Failed to extract 'repositories.zip': %v", err)
+			log.Fatal("Failed to extract 'repositories.zip': %v", err)
 		}
 	}
 
 	log.Info("Restore succeed!")
-	log.Shutdown()
+	log.Stop()
 	return nil
 }

+ 17 - 12
internal/cmd/serv.go

@@ -14,7 +14,7 @@ import (
 
 	"github.com/unknwon/com"
 	"github.com/urfave/cli"
-	log "gopkg.in/clog.v1"
+	log "unknwon.dev/clog/v2"
 
 	"gogs.io/gogs/internal/db"
 	"gogs.io/gogs/internal/db/errors"
@@ -42,7 +42,7 @@ func fail(userMessage, logMessage string, args ...interface{}) {
 		if !setting.ProdMode {
 			fmt.Fprintf(os.Stderr, logMessage+"\n", args...)
 		}
-		log.Fatal(3, logMessage, args...)
+		log.Fatal(logMessage, args...)
 	}
 
 	os.Exit(1)
@@ -55,13 +55,14 @@ func setup(c *cli.Context, logPath string, connectDB bool) {
 		setting.CustomConf = c.GlobalString("config")
 	}
 
-	setting.NewContext()
+	setting.Init()
 
-	level := log.TRACE
+	level := log.LevelTrace
 	if setting.ProdMode {
-		level = log.ERROR
+		level = log.LevelError
 	}
-	log.New(log.FILE, log.FileConfig{
+
+	err := log.NewFile(log.FileConfig{
 		Level:    level,
 		Filename: filepath.Join(setting.LogRootPath, logPath),
 		FileRotationConfig: log.FileRotationConfig{
@@ -70,7 +71,11 @@ func setup(c *cli.Context, logPath string, connectDB bool) {
 			MaxDays: 3,
 		},
 	})
-	log.Delete(log.CONSOLE) // Remove primary logger
+	if err != nil {
+		log.Fatal("Failed to init file logger: %v", err)
+		return
+	}
+	log.Remove(log.DefaultConsoleName) // Remove the primary logger
 
 	if !connectDB {
 		return
@@ -156,7 +161,7 @@ func runServ(c *cli.Context) error {
 		if errors.IsUserNotExist(err) {
 			fail("Repository owner does not exist", "Unregistered owner: %s", ownerName)
 		}
-		fail("Internal error", "Fail to get repository owner '%s': %v", ownerName, err)
+		fail("Internal error", "Failed to get repository owner '%s': %v", ownerName, err)
 	}
 
 	repo, err := db.GetRepositoryByName(owner.ID, repoName)
@@ -164,7 +169,7 @@ func runServ(c *cli.Context) error {
 		if errors.IsRepoNotExist(err) {
 			fail(_ACCESS_DENIED_MESSAGE, "Repository does not exist: %s/%s", owner.Name, repoName)
 		}
-		fail("Internal error", "Fail to get repository: %v", err)
+		fail("Internal error", "Failed to get repository: %v", err)
 	}
 	repo.Owner = owner
 
@@ -196,12 +201,12 @@ func runServ(c *cli.Context) error {
 		} else {
 			user, err = db.GetUserByKeyID(key.ID)
 			if err != nil {
-				fail("Internal error", "Fail to get user by key ID '%d': %v", key.ID, err)
+				fail("Internal error", "Failed to get user by key ID '%d': %v", key.ID, err)
 			}
 
 			mode, err := db.UserAccessMode(user.ID, repo)
 			if err != nil {
-				fail("Internal error", "Fail to check access: %v", err)
+				fail("Internal error", "Failed to check access: %v", err)
 			}
 
 			if mode < requestMode {
@@ -265,7 +270,7 @@ func runServ(c *cli.Context) error {
 	gitCmd.Stdin = os.Stdin
 	gitCmd.Stderr = os.Stderr
 	if err = gitCmd.Run(); err != nil {
-		fail("Internal error", "Fail to execute git command: %v", err)
+		fail("Internal error", "Failed to execute git command: %v", err)
 	}
 
 	return nil

+ 5 - 5
internal/cmd/web.go

@@ -26,8 +26,8 @@ import (
 	"github.com/prometheus/client_golang/prometheus/promhttp"
 	"github.com/unknwon/com"
 	"github.com/urfave/cli"
-	log "gopkg.in/clog.v1"
 	"gopkg.in/macaron.v1"
+	log "unknwon.dev/clog/v2"
 
 	"gogs.io/gogs/internal/assets/conf"
 	"gogs.io/gogs/internal/assets/public"
@@ -119,7 +119,7 @@ func newMacaron() *macaron.Macaron {
 
 	localeNames, err := conf.AssetDir("conf/locale")
 	if err != nil {
-		log.Fatal(4, "Fail to list locale files: %v", err)
+		log.Fatal("Failed to list locale files: %v", err)
 	}
 	localFiles := make(map[string][]byte)
 	for _, name := range localeNames {
@@ -741,15 +741,15 @@ func runWeb(c *cli.Context) error {
 		// FIXME: add proper implementation of signal capture on all protocols
 		// execute this on SIGTERM or SIGINT: listener.Close()
 		if err = os.Chmod(listenAddr, os.FileMode(setting.UnixSocketPermission)); err != nil {
-			log.Fatal(4, "Failed to set permission of unix socket: %v", err)
+			log.Fatal("Failed to set permission of unix socket: %v", err)
 		}
 		err = http.Serve(listener, m)
 	default:
-		log.Fatal(4, "Invalid protocol: %s", setting.Protocol)
+		log.Fatal("Invalid protocol: %s", setting.Protocol)
 	}
 
 	if err != nil {
-		log.Fatal(4, "Failed to start server: %v", err)
+		log.Fatal("Failed to start server: %v", err)
 	}
 
 	return nil

+ 2 - 2
internal/context/api.go

@@ -10,8 +10,8 @@ import (
 	"strings"
 
 	"github.com/unknwon/paginater"
-	log "gopkg.in/clog.v1"
 	"gopkg.in/macaron.v1"
+	log "unknwon.dev/clog/v2"
 
 	"gogs.io/gogs/internal/setting"
 )
@@ -39,7 +39,7 @@ func (c *APIContext) Error(status int, title string, obj interface{}) {
 	}
 
 	if status == http.StatusInternalServerError {
-		log.Error(3, "%s: %s", title, message)
+		log.Error("%s: %s", title, message)
 	}
 
 	c.JSON(status, map[string]string{

+ 2 - 2
internal/context/context.go

@@ -17,8 +17,8 @@ import (
 	"github.com/go-macaron/i18n"
 	"github.com/go-macaron/session"
 	"github.com/unknwon/com"
-	log "gopkg.in/clog.v1"
 	"gopkg.in/macaron.v1"
+	log "unknwon.dev/clog/v2"
 
 	"gogs.io/gogs/internal/auth"
 	"gogs.io/gogs/internal/db"
@@ -173,7 +173,7 @@ func (c *Context) Handle(status int, msg string, err error) {
 		c.Data["Title"] = "Page Not Found"
 	case http.StatusInternalServerError:
 		c.Data["Title"] = "Internal Server Error"
-		log.Error(3, "%s: %v", msg, err)
+		log.Error("%s: %v", msg, err)
 		if !setting.ProdMode || (c.IsLogged && c.User.IsAdmin) {
 			c.Data["ErrorMsg"] = err
 		}

+ 4 - 4
internal/context/notice.go

@@ -9,7 +9,7 @@ import (
 	"path"
 
 	"github.com/unknwon/com"
-	log "gopkg.in/clog.v1"
+	log "unknwon.dev/clog/v2"
 
 	"gogs.io/gogs/internal/markup"
 	"gogs.io/gogs/internal/setting"
@@ -26,14 +26,14 @@ func (c *Context) renderNoticeBanner() {
 
 	f, err := os.Open(fpath)
 	if err != nil {
-		log.Error(2, "Failed to open file %q: %v", fpath, err)
+		log.Error("Failed to open file %q: %v", fpath, err)
 		return
 	}
 	defer f.Close()
 
 	fi, err := f.Stat()
 	if err != nil {
-		log.Error(2, "Failed to stat file %q: %v", fpath, err)
+		log.Error("Failed to stat file %q: %v", fpath, err)
 		return
 	}
 
@@ -48,7 +48,7 @@ func (c *Context) renderNoticeBanner() {
 	buf := make([]byte, maxSize)
 	n, err := f.Read(buf)
 	if err != nil {
-		log.Error(2, "Failed to read file %q: %v", fpath, err)
+		log.Error("Failed to read file %q: %v", fpath, err)
 		return
 	}
 	buf = buf[:n]

+ 5 - 5
internal/cron/cron.go

@@ -7,7 +7,7 @@ package cron
 import (
 	"time"
 
-	log "gopkg.in/clog.v1"
+	log "unknwon.dev/clog/v2"
 
 	"github.com/gogs/cron"
 
@@ -25,7 +25,7 @@ func NewContext() {
 	if setting.Cron.UpdateMirror.Enabled {
 		entry, err = c.AddFunc("Update mirrors", setting.Cron.UpdateMirror.Schedule, db.MirrorUpdate)
 		if err != nil {
-			log.Fatal(2, "Cron.(update mirrors): %v", err)
+			log.Fatal("Cron.(update mirrors): %v", err)
 		}
 		if setting.Cron.UpdateMirror.RunAtStart {
 			entry.Prev = time.Now()
@@ -36,7 +36,7 @@ func NewContext() {
 	if setting.Cron.RepoHealthCheck.Enabled {
 		entry, err = c.AddFunc("Repository health check", setting.Cron.RepoHealthCheck.Schedule, db.GitFsck)
 		if err != nil {
-			log.Fatal(2, "Cron.(repository health check): %v", err)
+			log.Fatal("Cron.(repository health check): %v", err)
 		}
 		if setting.Cron.RepoHealthCheck.RunAtStart {
 			entry.Prev = time.Now()
@@ -47,7 +47,7 @@ func NewContext() {
 	if setting.Cron.CheckRepoStats.Enabled {
 		entry, err = c.AddFunc("Check repository statistics", setting.Cron.CheckRepoStats.Schedule, db.CheckRepoStats)
 		if err != nil {
-			log.Fatal(2, "Cron.(check repository statistics): %v", err)
+			log.Fatal("Cron.(check repository statistics): %v", err)
 		}
 		if setting.Cron.CheckRepoStats.RunAtStart {
 			entry.Prev = time.Now()
@@ -58,7 +58,7 @@ func NewContext() {
 	if setting.Cron.RepoArchiveCleanup.Enabled {
 		entry, err = c.AddFunc("Repository archive cleanup", setting.Cron.RepoArchiveCleanup.Schedule, db.DeleteOldRepositoryArchives)
 		if err != nil {
-			log.Fatal(2, "Cron.(repository archive cleanup): %v", err)
+			log.Fatal("Cron.(repository archive cleanup): %v", err)
 		}
 		if setting.Cron.RepoArchiveCleanup.RunAtStart {
 			entry.Prev = time.Now()

+ 2 - 2
internal/db/access.go

@@ -7,7 +7,7 @@ package db
 import (
 	"fmt"
 
-	log "gopkg.in/clog.v1"
+	log "unknwon.dev/clog/v2"
 
 	"gogs.io/gogs/internal/db/errors"
 )
@@ -111,7 +111,7 @@ func (u *User) GetRepositoryAccesses() (map[*Repository]AccessMode, error) {
 		repo, err := GetRepositoryByID(access.RepoID)
 		if err != nil {
 			if errors.IsRepoNotExist(err) {
-				log.Error(2, "GetRepositoryByID: %v", err)
+				log.Error("GetRepositoryByID: %v", err)
 				continue
 			}
 			return nil, err

+ 5 - 5
internal/db/action.go

@@ -13,7 +13,7 @@ import (
 
 	"github.com/json-iterator/go"
 	"github.com/unknwon/com"
-	log "gopkg.in/clog.v1"
+	log "unknwon.dev/clog/v2"
 	"xorm.io/xorm"
 
 	"github.com/gogs/git-module"
@@ -160,7 +160,7 @@ func (a *Action) GetIssueTitle() string {
 	index := com.StrTo(a.GetIssueInfos()[0]).MustInt64()
 	issue, err := GetIssueByIndex(a.RepoID, index)
 	if err != nil {
-		log.Error(4, "GetIssueByIndex: %v", err)
+		log.Error("GetIssueByIndex: %v", err)
 		return "500 when get issue"
 	}
 	return issue.Title
@@ -170,7 +170,7 @@ func (a *Action) GetIssueContent() string {
 	index := com.StrTo(a.GetIssueInfos()[0]).MustInt64()
 	issue, err := GetIssueByIndex(a.RepoID, index)
 	if err != nil {
-		log.Error(4, "GetIssueByIndex: %v", err)
+		log.Error("GetIssueByIndex: %v", err)
 		return "500 when get issue"
 	}
 	return issue.Content
@@ -305,7 +305,7 @@ func (push *PushCommits) AvatarLink(email string) string {
 		if err != nil {
 			push.avatars[email] = tool.AvatarLink(email)
 			if !errors.IsUserNotExist(err) {
-				log.Error(4, "GetUserByEmail: %v", err)
+				log.Error("GetUserByEmail: %v", err)
 			}
 		} else {
 			push.avatars[email] = u.RelAvatarLink()
@@ -490,7 +490,7 @@ func CommitRepoAction(opts CommitRepoActionOptions) error {
 		// Only update issues via commits when internal issue tracker is enabled
 		if repo.EnableIssues && !repo.EnableExternalTracker {
 			if err = UpdateIssuesCommit(pusher, repo, opts.Commits.Commits); err != nil {
-				log.Error(2, "UpdateIssuesCommit: %v", err)
+				log.Error("UpdateIssuesCommit: %v", err)
 			}
 		}
 	}

+ 2 - 2
internal/db/admin.go

@@ -11,7 +11,7 @@ import (
 	"time"
 
 	"github.com/unknwon/com"
-	log "gopkg.in/clog.v1"
+	log "unknwon.dev/clog/v2"
 	"xorm.io/xorm"
 
 	"gogs.io/gogs/internal/tool"
@@ -75,7 +75,7 @@ func RemoveAllWithNotice(title, path string) {
 		desc := fmt.Sprintf("%s [%s]: %v", title, path, err)
 		log.Warn(desc)
 		if err = CreateRepositoryNotice(desc); err != nil {
-			log.Error(2, "CreateRepositoryNotice: %v", err)
+			log.Error("CreateRepositoryNotice: %v", err)
 		}
 	}
 }

+ 10 - 10
internal/db/comment.go

@@ -10,7 +10,7 @@ import (
 	"time"
 
 	"github.com/unknwon/com"
-	log "gopkg.in/clog.v1"
+	log "unknwon.dev/clog/v2"
 	"xorm.io/xorm"
 
 	api "github.com/gogs/go-gogs-client"
@@ -180,7 +180,7 @@ func (cmt *Comment) mailParticipants(e Engine, opType ActionType, issue *Issue)
 		issue.Content = fmt.Sprintf("Reopened #%d", issue.Index)
 	}
 	if err = mailIssueCommentToParticipants(issue, cmt.Poster, mentions); err != nil {
-		log.Error(2, "mailIssueCommentToParticipants: %v", err)
+		log.Error("mailIssueCommentToParticipants: %v", err)
 	}
 
 	return nil
@@ -282,10 +282,10 @@ func createComment(e *xorm.Session, opts *CreateCommentOptions) (_ *Comment, err
 	// Notify watchers for whatever action comes in, ignore if no action type.
 	if act.OpType > 0 {
 		if err = notifyWatchers(e, act); err != nil {
-			log.Error(2, "notifyWatchers: %v", err)
+			log.Error("notifyWatchers: %v", err)
 		}
 		if err = comment.mailParticipants(e, act.OpType, opts.Issue); err != nil {
-			log.Error(2, "MailParticipants: %v", err)
+			log.Error("MailParticipants: %v", err)
 		}
 	}
 
@@ -356,7 +356,7 @@ func CreateIssueComment(doer *User, repo *Repository, issue *Issue, content stri
 		Repository: repo.APIFormat(nil),
 		Sender:     doer.APIFormat(),
 	}); err != nil {
-		log.Error(2, "PrepareWebhooks [comment_id: %d]: %v", comment.ID, err)
+		log.Error("PrepareWebhooks [comment_id: %d]: %v", comment.ID, err)
 	}
 
 	return comment, nil
@@ -465,7 +465,7 @@ func UpdateComment(doer *User, c *Comment, oldContent string) (err error) {
 	}
 
 	if err = c.Issue.LoadAttributes(); err != nil {
-		log.Error(2, "Issue.LoadAttributes [issue_id: %d]: %v", c.IssueID, err)
+		log.Error("Issue.LoadAttributes [issue_id: %d]: %v", c.IssueID, err)
 	} else if err = PrepareWebhooks(c.Issue.Repo, HOOK_EVENT_ISSUE_COMMENT, &api.IssueCommentPayload{
 		Action:  api.HOOK_ISSUE_COMMENT_EDITED,
 		Issue:   c.Issue.APIFormat(),
@@ -478,7 +478,7 @@ func UpdateComment(doer *User, c *Comment, oldContent string) (err error) {
 		Repository: c.Issue.Repo.APIFormat(nil),
 		Sender:     doer.APIFormat(),
 	}); err != nil {
-		log.Error(2, "PrepareWebhooks [comment_id: %d]: %v", c.ID, err)
+		log.Error("PrepareWebhooks [comment_id: %d]: %v", c.ID, err)
 	}
 
 	return nil
@@ -516,11 +516,11 @@ func DeleteCommentByID(doer *User, id int64) error {
 
 	_, err = DeleteAttachmentsByComment(comment.ID, true)
 	if err != nil {
-		log.Error(2, "Failed to delete attachments by comment[%d]: %v", comment.ID, err)
+		log.Error("Failed to delete attachments by comment[%d]: %v", comment.ID, err)
 	}
 
 	if err = comment.Issue.LoadAttributes(); err != nil {
-		log.Error(2, "Issue.LoadAttributes [issue_id: %d]: %v", comment.IssueID, err)
+		log.Error("Issue.LoadAttributes [issue_id: %d]: %v", comment.IssueID, err)
 	} else if err = PrepareWebhooks(comment.Issue.Repo, HOOK_EVENT_ISSUE_COMMENT, &api.IssueCommentPayload{
 		Action:     api.HOOK_ISSUE_COMMENT_DELETED,
 		Issue:      comment.Issue.APIFormat(),
@@ -528,7 +528,7 @@ func DeleteCommentByID(doer *User, id int64) error {
 		Repository: comment.Issue.Repo.APIFormat(nil),
 		Sender:     doer.APIFormat(),
 	}); err != nil {
-		log.Error(2, "PrepareWebhooks [comment_id: %d]: %v", comment.ID, err)
+		log.Error("PrepareWebhooks [comment_id: %d]: %v", comment.ID, err)
 	}
 	return nil
 }

+ 13 - 13
internal/db/issue.go

@@ -10,7 +10,7 @@ import (
 	"time"
 
 	"github.com/unknwon/com"
-	log "gopkg.in/clog.v1"
+	log "unknwon.dev/clog/v2"
 	"xorm.io/xorm"
 
 	api "github.com/gogs/go-gogs-client"
@@ -231,7 +231,7 @@ func (issue *Issue) sendLabelUpdatedWebhook(doer *User) {
 	if issue.IsPull {
 		err = issue.PullRequest.LoadIssue()
 		if err != nil {
-			log.Error(2, "LoadIssue: %v", err)
+			log.Error("LoadIssue: %v", err)
 			return
 		}
 		err = PrepareWebhooks(issue.Repo, HOOK_EVENT_PULL_REQUEST, &api.PullRequestPayload{
@@ -251,7 +251,7 @@ func (issue *Issue) sendLabelUpdatedWebhook(doer *User) {
 		})
 	}
 	if err != nil {
-		log.Error(2, "PrepareWebhooks [is_pull: %v]: %v", issue.IsPull, err)
+		log.Error("PrepareWebhooks [is_pull: %v]: %v", issue.IsPull, err)
 	}
 }
 
@@ -346,7 +346,7 @@ func (issue *Issue) ClearLabels(doer *User) (err error) {
 	if issue.IsPull {
 		err = issue.PullRequest.LoadIssue()
 		if err != nil {
-			log.Error(2, "LoadIssue: %v", err)
+			log.Error("LoadIssue: %v", err)
 			return
 		}
 		err = PrepareWebhooks(issue.Repo, HOOK_EVENT_PULL_REQUEST, &api.PullRequestPayload{
@@ -366,7 +366,7 @@ func (issue *Issue) ClearLabels(doer *User) (err error) {
 		})
 	}
 	if err != nil {
-		log.Error(2, "PrepareWebhooks [is_pull: %v]: %v", issue.IsPull, err)
+		log.Error("PrepareWebhooks [is_pull: %v]: %v", issue.IsPull, err)
 	}
 
 	return nil
@@ -503,7 +503,7 @@ func (issue *Issue) ChangeStatus(doer *User, repo *Repository, isClosed bool) (e
 		err = PrepareWebhooks(repo, HOOK_EVENT_ISSUES, apiIssues)
 	}
 	if err != nil {
-		log.Error(2, "PrepareWebhooks [is_pull: %v, is_closed: %v]: %v", issue.IsPull, isClosed, err)
+		log.Error("PrepareWebhooks [is_pull: %v, is_closed: %v]: %v", issue.IsPull, isClosed, err)
 	}
 
 	return nil
@@ -545,7 +545,7 @@ func (issue *Issue) ChangeTitle(doer *User, title string) (err error) {
 		})
 	}
 	if err != nil {
-		log.Error(2, "PrepareWebhooks [is_pull: %v]: %v", issue.IsPull, err)
+		log.Error("PrepareWebhooks [is_pull: %v]: %v", issue.IsPull, err)
 	}
 
 	return nil
@@ -587,7 +587,7 @@ func (issue *Issue) ChangeContent(doer *User, content string) (err error) {
 		})
 	}
 	if err != nil {
-		log.Error(2, "PrepareWebhooks [is_pull: %v]: %v", issue.IsPull, err)
+		log.Error("PrepareWebhooks [is_pull: %v]: %v", issue.IsPull, err)
 	}
 
 	return nil
@@ -601,7 +601,7 @@ func (issue *Issue) ChangeAssignee(doer *User, assigneeID int64) (err error) {
 
 	issue.Assignee, err = GetUserByID(issue.AssigneeID)
 	if err != nil && !errors.IsUserNotExist(err) {
-		log.Error(4, "GetUserByID [assignee_id: %v]: %v", issue.AssigneeID, err)
+		log.Error("GetUserByID [assignee_id: %v]: %v", issue.AssigneeID, err)
 		return nil
 	}
 
@@ -636,7 +636,7 @@ func (issue *Issue) ChangeAssignee(doer *User, assigneeID int64) (err error) {
 		err = PrepareWebhooks(issue.Repo, HOOK_EVENT_ISSUES, apiIssues)
 	}
 	if err != nil {
-		log.Error(4, "PrepareWebhooks [is_pull: %v, remove_assignee: %v]: %v", issue.IsPull, isRemoveAssignee, err)
+		log.Error("PrepareWebhooks [is_pull: %v, remove_assignee: %v]: %v", issue.IsPull, isRemoveAssignee, err)
 	}
 
 	return nil
@@ -777,10 +777,10 @@ func NewIssue(repo *Repository, issue *Issue, labelIDs []int64, uuids []string)
 		RepoName:     repo.Name,
 		IsPrivate:    repo.IsPrivate,
 	}); err != nil {
-		log.Error(2, "NotifyWatchers: %v", err)
+		log.Error("NotifyWatchers: %v", err)
 	}
 	if err = issue.MailParticipants(); err != nil {
-		log.Error(2, "MailParticipants: %v", err)
+		log.Error("MailParticipants: %v", err)
 	}
 
 	if err = PrepareWebhooks(repo, HOOK_EVENT_ISSUES, &api.IssuesPayload{
@@ -790,7 +790,7 @@ func NewIssue(repo *Repository, issue *Issue, labelIDs []int64, uuids []string)
 		Repository: repo.APIFormat(nil),
 		Sender:     issue.Poster.APIFormat(),
 	}); err != nil {
-		log.Error(2, "PrepareWebhooks: %v", err)
+		log.Error("PrepareWebhooks: %v", err)
 	}
 
 	return nil

+ 2 - 2
internal/db/issue_mail.go

@@ -8,7 +8,7 @@ import (
 	"fmt"
 
 	"github.com/unknwon/com"
-	log "gopkg.in/clog.v1"
+	log "unknwon.dev/clog/v2"
 
 	"gogs.io/gogs/internal/mailer"
 	"gogs.io/gogs/internal/markup"
@@ -173,7 +173,7 @@ func (issue *Issue) MailParticipants() (err error) {
 	}
 
 	if err = mailIssueCommentToParticipants(issue, issue.Poster, mentions); err != nil {
-		log.Error(2, "mailIssueCommentToParticipants: %v", err)
+		log.Error("mailIssueCommentToParticipants: %v", err)
 	}
 
 	return nil

+ 6 - 6
internal/db/login_source.go

@@ -19,8 +19,8 @@ import (
 	"github.com/go-macaron/binding"
 	"github.com/json-iterator/go"
 	"github.com/unknwon/com"
-	log "gopkg.in/clog.v1"
 	"gopkg.in/ini.v1"
+	log "unknwon.dev/clog/v2"
 	"xorm.io/core"
 	"xorm.io/xorm"
 
@@ -469,7 +469,7 @@ func LoadAuthSources() {
 
 	paths, err := com.GetFileListBySuffix(authdPath, ".conf")
 	if err != nil {
-		log.Fatal(2, "Failed to list authentication sources: %v", err)
+		log.Fatal("Failed to list authentication sources: %v", err)
 	}
 
 	localLoginSources.sources = make([]*LoginSource, 0, len(paths))
@@ -477,7 +477,7 @@ func LoadAuthSources() {
 	for _, fpath := range paths {
 		authSource, err := ini.Load(fpath)
 		if err != nil {
-			log.Fatal(2, "Failed to load authentication source: %v", err)
+			log.Fatal("Failed to load authentication source: %v", err)
 		}
 		authSource.NameMapper = ini.TitleUnderscore
 
@@ -496,7 +496,7 @@ func LoadAuthSources() {
 
 		fi, err := os.Stat(fpath)
 		if err != nil {
-			log.Fatal(2, "Failed to load authentication source: %v", err)
+			log.Fatal("Failed to load authentication source: %v", err)
 		}
 		loginSource.Updated = fi.ModTime()
 
@@ -519,11 +519,11 @@ func LoadAuthSources() {
 			loginSource.Type = LOGIN_GITHUB
 			loginSource.Cfg = &GitHubConfig{}
 		default:
-			log.Fatal(2, "Failed to load authentication source: unknown type '%s'", authType)
+			log.Fatal("Failed to load authentication source: unknown type '%s'", authType)
 		}
 
 		if err = authSource.Section("config").MapTo(loginSource.Cfg); err != nil {
-			log.Fatal(2, "Failed to parse authentication source 'config': %v", err)
+			log.Fatal("Failed to parse authentication source 'config': %v", err)
 		}
 
 		localLoginSources.sources = append(localLoginSources.sources, loginSource)

+ 2 - 2
internal/db/migrations/migrations.go

@@ -10,7 +10,7 @@ import (
 	"time"
 
 	"github.com/unknwon/com"
-	log "gopkg.in/clog.v1"
+	log "unknwon.dev/clog/v2"
 	"xorm.io/xorm"
 
 	"gogs.io/gogs/internal/tool"
@@ -93,7 +93,7 @@ func Migrate(x *xorm.Engine) error {
 
 	v := currentVersion.Version
 	if _MIN_DB_VER > v {
-		log.Fatal(0, `
+		log.Fatal(`
 Hi there, thank you for using Gogs for so long!
 However, Gogs has stopped supporting auto-migration from your previously installed version.
 But the good news is, it's very easy to fix this problem!

+ 1 - 1
internal/db/migrations/v15.go

@@ -12,7 +12,7 @@ import (
 	"strings"
 
 	"github.com/unknwon/com"
-	log "gopkg.in/clog.v1"
+	log "unknwon.dev/clog/v2"
 	"xorm.io/xorm"
 
 	"gogs.io/gogs/internal/osutil"

+ 1 - 1
internal/db/migrations/v16.go

@@ -9,8 +9,8 @@ import (
 	"path/filepath"
 	"strings"
 
+	log "unknwon.dev/clog/v2"
 	"xorm.io/xorm"
-	log "gopkg.in/clog.v1"
 
 	"github.com/gogs/git-module"
 

+ 3 - 3
internal/db/milestone.go

@@ -8,7 +8,7 @@ import (
 	"fmt"
 	"time"
 
-	log "gopkg.in/clog.v1"
+	log "unknwon.dev/clog/v2"
 	"xorm.io/xorm"
 
 	api "github.com/gogs/go-gogs-client"
@@ -336,7 +336,7 @@ func ChangeMilestoneAssign(doer *User, issue *Issue, oldMilestoneID int64) (err
 	if issue.IsPull {
 		err = issue.PullRequest.LoadIssue()
 		if err != nil {
-			log.Error(2, "LoadIssue: %v", err)
+			log.Error("LoadIssue: %v", err)
 			return
 		}
 		err = PrepareWebhooks(issue.Repo, HOOK_EVENT_PULL_REQUEST, &api.PullRequestPayload{
@@ -356,7 +356,7 @@ func ChangeMilestoneAssign(doer *User, issue *Issue, oldMilestoneID int64) (err
 		})
 	}
 	if err != nil {
-		log.Error(2, "PrepareWebhooks [is_pull: %v]: %v", issue.IsPull, err)
+		log.Error("PrepareWebhooks [is_pull: %v]: %v", issue.IsPull, err)
 	}
 
 	return nil

+ 30 - 30
internal/db/mirror.go

@@ -12,8 +12,8 @@ import (
 	"time"
 
 	"github.com/unknwon/com"
-	log "gopkg.in/clog.v1"
 	"gopkg.in/ini.v1"
+	log "unknwon.dev/clog/v2"
 	"xorm.io/xorm"
 
 	"github.com/gogs/git-module"
@@ -58,7 +58,7 @@ func (m *Mirror) AfterSet(colName string, _ xorm.Cell) {
 	case "repo_id":
 		m.Repo, err = GetRepositoryByID(m.RepoID)
 		if err != nil {
-			log.Error(3, "GetRepositoryByID [%d]: %v", m.ID, err)
+			log.Error("GetRepositoryByID [%d]: %v", m.ID, err)
 		}
 	case "updated_unix":
 		m.LastSync = time.Unix(m.LastSyncUnix, 0).Local()
@@ -119,7 +119,7 @@ func (m *Mirror) readAddress() {
 
 	cfg, err := ini.Load(m.Repo.GitConfigPath())
 	if err != nil {
-		log.Error(2, "Load: %v", err)
+		log.Error("Load: %v", err)
 		return
 	}
 	m.address = cfg.Section("remote \"origin\"").Key("url").Value()
@@ -233,12 +233,12 @@ func parseRemoteUpdateOutput(output string) []*mirrorSyncResult {
 		case strings.HasPrefix(lines[i], "   "): // New commits of a reference
 			delimIdx := strings.Index(lines[i][3:], " ")
 			if delimIdx == -1 {
-				log.Error(2, "SHA delimiter not found: %q", lines[i])
+				log.Error("SHA delimiter not found: %q", lines[i])
 				continue
 			}
 			shas := strings.Split(lines[i][3:delimIdx+3], "..")
 			if len(shas) != 2 {
-				log.Error(2, "Expect two SHAs but not what found: %q", lines[i])
+				log.Error("Expect two SHAs but not what found: %q", lines[i])
 				continue
 			}
 			results = append(results, &mirrorSyncResult{
@@ -268,7 +268,7 @@ func (m *Mirror) runSync() ([]*mirrorSyncResult, bool) {
 	}) {
 		desc := fmt.Sprintf("Source URL of mirror repository '%s' is not accessible: %s", m.Repo.FullName(), m.MosaicsAddress())
 		if err := CreateRepositoryNotice(desc); err != nil {
-			log.Error(2, "CreateRepositoryNotice: %v", err)
+			log.Error("CreateRepositoryNotice: %v", err)
 		}
 		return nil, false
 	}
@@ -281,17 +281,17 @@ func (m *Mirror) runSync() ([]*mirrorSyncResult, bool) {
 		timeout, repoPath, fmt.Sprintf("Mirror.runSync: %s", repoPath),
 		"git", gitArgs...)
 	if err != nil {
-		desc := fmt.Sprintf("Fail to update mirror repository '%s': %s", repoPath, stderr)
-		log.Error(2, desc)
+		desc := fmt.Sprintf("Failed to update mirror repository '%s': %s", repoPath, stderr)
+		log.Error(desc)
 		if err = CreateRepositoryNotice(desc); err != nil {
-			log.Error(2, "CreateRepositoryNotice: %v", err)
+			log.Error("CreateRepositoryNotice: %v", err)
 		}
 		return nil, false
 	}
 	output := stderr
 
 	if err := m.Repo.UpdateSize(); err != nil {
-		log.Error(2, "UpdateSize [repo_id: %d]: %v", m.Repo.ID, err)
+		log.Error("UpdateSize [repo_id: %d]: %v", m.Repo.ID, err)
 	}
 
 	if m.Repo.HasWiki() {
@@ -299,10 +299,10 @@ func (m *Mirror) runSync() ([]*mirrorSyncResult, bool) {
 		if _, stderr, err := process.ExecDir(
 			timeout, wikiPath, fmt.Sprintf("Mirror.runSync: %s", wikiPath),
 			"git", "remote", "update", "--prune"); err != nil {
-			desc := fmt.Sprintf("Fail to update mirror wiki repository '%s': %s", wikiPath, stderr)
-			log.Error(2, desc)
+			desc := fmt.Sprintf("Failed to update mirror wiki repository '%s': %s", wikiPath, stderr)
+			log.Error(desc)
 			if err = CreateRepositoryNotice(desc); err != nil {
-				log.Error(2, "CreateRepositoryNotice: %v", err)
+				log.Error("CreateRepositoryNotice: %v", err)
 			}
 		}
 	}
@@ -353,14 +353,14 @@ func MirrorUpdate() {
 	if err := x.Where("next_update_unix<=?", time.Now().Unix()).Iterate(new(Mirror), func(idx int, bean interface{}) error {
 		m := bean.(*Mirror)
 		if m.Repo == nil {
-			log.Error(2, "Disconnected mirror repository found: %d", m.ID)
+			log.Error("Disconnected mirror repository found: %d", m.ID)
 			return nil
 		}
 
 		MirrorQueue.Add(m.RepoID)
 		return nil
 	}); err != nil {
-		log.Error(2, "MirrorUpdate: %v", err)
+		log.Error("MirrorUpdate: %v", err)
 	}
 }
 
@@ -374,7 +374,7 @@ func SyncMirrors() {
 
 		m, err := GetMirrorByRepoID(com.StrTo(repoID).MustInt64())
 		if err != nil {
-			log.Error(2, "GetMirrorByRepoID [%d]: %v", m.RepoID, err)
+			log.Error("GetMirrorByRepoID [%d]: %v", m.RepoID, err)
 			continue
 		}
 
@@ -385,7 +385,7 @@ func SyncMirrors() {
 
 		m.ScheduleNextSync()
 		if err = UpdateMirror(m); err != nil {
-			log.Error(2, "UpdateMirror [%d]: %v", m.RepoID, err)
+			log.Error("UpdateMirror [%d]: %v", m.RepoID, err)
 			continue
 		}
 
@@ -399,7 +399,7 @@ func SyncMirrors() {
 		} else {
 			gitRepo, err = git.OpenRepository(m.Repo.RepoPath())
 			if err != nil {
-				log.Error(2, "OpenRepository [%d]: %v", m.RepoID, err)
+				log.Error("OpenRepository [%d]: %v", m.RepoID, err)
 				continue
 			}
 		}
@@ -413,7 +413,7 @@ func SyncMirrors() {
 			// Delete reference
 			if result.newCommitID == GIT_SHORT_EMPTY_SHA {
 				if err = MirrorSyncDeleteAction(m.Repo, result.refName); err != nil {
-					log.Error(2, "MirrorSyncDeleteAction [repo_id: %d]: %v", m.RepoID, err)
+					log.Error("MirrorSyncDeleteAction [repo_id: %d]: %v", m.RepoID, err)
 				}
 				continue
 			}
@@ -422,7 +422,7 @@ func SyncMirrors() {
 			isNewRef := false
 			if result.oldCommitID == GIT_SHORT_EMPTY_SHA {
 				if err = MirrorSyncCreateAction(m.Repo, result.refName); err != nil {
-					log.Error(2, "MirrorSyncCreateAction [repo_id: %d]: %v", m.RepoID, err)
+					log.Error("MirrorSyncCreateAction [repo_id: %d]: %v", m.RepoID, err)
 					continue
 				}
 				isNewRef = true
@@ -435,33 +435,33 @@ func SyncMirrors() {
 			if !isNewRef {
 				oldCommitID, err = git.GetFullCommitID(gitRepo.Path, result.oldCommitID)
 				if err != nil {
-					log.Error(2, "GetFullCommitID [%d]: %v", m.RepoID, err)
+					log.Error("GetFullCommitID [%d]: %v", m.RepoID, err)
 					continue
 				}
 				newCommitID, err = git.GetFullCommitID(gitRepo.Path, result.newCommitID)
 				if err != nil {
-					log.Error(2, "GetFullCommitID [%d]: %v", m.RepoID, err)
+					log.Error("GetFullCommitID [%d]: %v", m.RepoID, err)
 					continue
 				}
 				commits, err = gitRepo.CommitsBetweenIDs(newCommitID, oldCommitID)
 				if err != nil {
-					log.Error(2, "CommitsBetweenIDs [repo_id: %d, new_commit_id: %s, old_commit_id: %s]: %v", m.RepoID, newCommitID, oldCommitID, err)
+					log.Error("CommitsBetweenIDs [repo_id: %d, new_commit_id: %s, old_commit_id: %s]: %v", m.RepoID, newCommitID, oldCommitID, err)
 					continue
 				}
 			} else {
 				refNewCommitID, err := gitRepo.GetBranchCommitID(result.refName)
 				if err != nil {
-					log.Error(2, "GetFullCommitID [%d]: %v", m.RepoID, err)
+					log.Error("GetFullCommitID [%d]: %v", m.RepoID, err)
 					continue
 				}
 				if newCommit, err := gitRepo.GetCommit(refNewCommitID); err != nil {
-					log.Error(2, "GetCommit [repo_id: %d, commit_id: %s]: %v", m.RepoID, refNewCommitID, err)
+					log.Error("GetCommit [repo_id: %d, commit_id: %s]: %v", m.RepoID, refNewCommitID, err)
 					continue
 				} else {
 					// TODO: Get the commits for the new ref until the closest ancestor branch like Github does
 					commits, err = newCommit.CommitsBeforeLimit(10)
 					if err != nil {
-						log.Error(2, "CommitsBeforeLimit [repo_id: %d, commit_id: %s]: %v", m.RepoID, refNewCommitID, err)
+						log.Error("CommitsBeforeLimit [repo_id: %d, commit_id: %s]: %v", m.RepoID, refNewCommitID, err)
 					}
 					oldCommitID = git.EMPTY_SHA
 					newCommitID = refNewCommitID
@@ -473,13 +473,13 @@ func SyncMirrors() {
 				NewCommitID: newCommitID,
 				Commits:     ListToPushCommits(commits),
 			}); err != nil {
-				log.Error(2, "MirrorSyncPushAction [repo_id: %d]: %v", m.RepoID, err)
+				log.Error("MirrorSyncPushAction [repo_id: %d]: %v", m.RepoID, err)
 				continue
 			}
 		}
 
 		if _, err = x.Exec("UPDATE mirror SET updated_unix = ? WHERE repo_id = ?", time.Now().Unix(), m.RepoID); err != nil {
-			log.Error(2, "Update 'mirror.updated_unix' [%d]: %v", m.RepoID, err)
+			log.Error("Update 'mirror.updated_unix' [%d]: %v", m.RepoID, err)
 			continue
 		}
 
@@ -487,14 +487,14 @@ func SyncMirrors() {
 		// update if latest commit date is newer.
 		commitDate, err := git.GetLatestCommitDate(m.Repo.RepoPath(), "")
 		if err != nil {
-			log.Error(2, "GetLatestCommitDate [%d]: %v", m.RepoID, err)
+			log.Error("GetLatestCommitDate [%d]: %v", m.RepoID, err)
 			continue
 		} else if commitDate.Before(m.Repo.Updated) {
 			continue
 		}
 
 		if _, err = x.Exec("UPDATE repository SET updated_unix = ? WHERE id = ?", commitDate.Unix(), m.RepoID); err != nil {
-			log.Error(2, "Update 'repository.updated_unix' [%d]: %v", m.RepoID, err)
+			log.Error("Update 'repository.updated_unix' [%d]: %v", m.RepoID, err)
 			continue
 		}
 	}

+ 4 - 4
internal/db/models.go

@@ -20,7 +20,7 @@ import (
 	"github.com/json-iterator/go"
 	_ "github.com/lib/pq"
 	"github.com/unknwon/com"
-	log "gopkg.in/clog.v1"
+	log "unknwon.dev/clog/v2"
 	"xorm.io/core"
 	"xorm.io/xorm"
 
@@ -370,20 +370,20 @@ func ImportDatabase(dirPath string, verbose bool) (err error) {
 
 			meta := make(map[string]interface{})
 			if err = jsoniter.Unmarshal(scanner.Bytes(), &meta); err != nil {
-				log.Error(2, "Failed to unmarshal to map: %v", err)
+				log.Error("Failed to unmarshal to map: %v", err)
 			}
 
 			// Reset created_unix back to the date save in archive because Insert method updates its value
 			if isInsertProcessor && !skipInsertProcessors[rawTableName] {
 				if _, err = x.Exec("UPDATE "+rawTableName+" SET created_unix=? WHERE id=?", meta["CreatedUnix"], meta["ID"]); err != nil {
-					log.Error(2, "Failed to reset 'created_unix': %v", err)
+					log.Error("Failed to reset 'created_unix': %v", err)
 				}
 			}
 
 			switch rawTableName {
 			case "milestone":
 				if _, err = x.Exec("UPDATE "+rawTableName+" SET deadline_unix=?, closed_date_unix=? WHERE id=?", meta["DeadlineUnix"], meta["ClosedDateUnix"], meta["ID"]); err != nil {
-					log.Error(2, "Failed to reset 'milestone.deadline_unix', 'milestone.closed_date_unix': %v", err)
+					log.Error("Failed to reset 'milestone.deadline_unix', 'milestone.closed_date_unix': %v", err)
 				}
 			}
 		}

+ 24 - 24
internal/db/pull.go

@@ -12,7 +12,7 @@ import (
 	"time"
 
 	"github.com/unknwon/com"
-	log "gopkg.in/clog.v1"
+	log "unknwon.dev/clog/v2"
 	"xorm.io/xorm"
 
 	"github.com/gogs/git-module"
@@ -331,12 +331,12 @@ func (pr *PullRequest) Merge(doer *User, baseGitRepo *git.Repository, mergeStyle
 	}
 
 	if err = MergePullRequestAction(doer, pr.Issue.Repo, pr.Issue); err != nil {
-		log.Error(2, "MergePullRequestAction [%d]: %v", pr.ID, err)
+		log.Error("MergePullRequestAction [%d]: %v", pr.ID, err)
 	}
 
 	// Reload pull request information.
 	if err = pr.LoadAttributes(); err != nil {
-		log.Error(2, "LoadAttributes: %v", err)
+		log.Error("LoadAttributes: %v", err)
 		return nil
 	}
 	if err = PrepareWebhooks(pr.Issue.Repo, HOOK_EVENT_PULL_REQUEST, &api.PullRequestPayload{
@@ -346,13 +346,13 @@ func (pr *PullRequest) Merge(doer *User, baseGitRepo *git.Repository, mergeStyle
 		Repository:  pr.Issue.Repo.APIFormat(nil),
 		Sender:      doer.APIFormat(),
 	}); err != nil {
-		log.Error(2, "PrepareWebhooks: %v", err)
+		log.Error("PrepareWebhooks: %v", err)
 		return nil
 	}
 
 	l, err := headGitRepo.CommitsBetweenIDs(pr.MergedCommitID, pr.MergeBase)
 	if err != nil {
-		log.Error(2, "CommitsBetweenIDs: %v", err)
+		log.Error("CommitsBetweenIDs: %v", err)
 		return nil
 	}
 
@@ -361,7 +361,7 @@ func (pr *PullRequest) Merge(doer *User, baseGitRepo *git.Repository, mergeStyle
 	// to avoid strange diff commits produced.
 	mergeCommit, err := baseGitRepo.GetBranchCommit(pr.BaseBranch)
 	if err != nil {
-		log.Error(2, "GetBranchCommit: %v", err)
+		log.Error("GetBranchCommit: %v", err)
 		return nil
 	}
 	if mergeStyle == MERGE_STYLE_REGULAR {
@@ -370,7 +370,7 @@ func (pr *PullRequest) Merge(doer *User, baseGitRepo *git.Repository, mergeStyle
 
 	commits, err := ListToPushCommits(l).ToApiPayloadCommits(pr.BaseRepo.RepoPath(), pr.BaseRepo.HTMLURL())
 	if err != nil {
-		log.Error(2, "ToApiPayloadCommits: %v", err)
+		log.Error("ToApiPayloadCommits: %v", err)
 		return nil
 	}
 
@@ -385,7 +385,7 @@ func (pr *PullRequest) Merge(doer *User, baseGitRepo *git.Repository, mergeStyle
 		Sender:     doer.APIFormat(),
 	}
 	if err = PrepareWebhooks(pr.BaseRepo, HOOK_EVENT_PUSH, p); err != nil {
-		log.Error(2, "PrepareWebhooks: %v", err)
+		log.Error("PrepareWebhooks: %v", err)
 		return nil
 	}
 	return nil
@@ -490,10 +490,10 @@ func NewPullRequest(repo *Repository, pull *Issue, labelIDs []int64, uuids []str
 		RepoName:     repo.Name,
 		IsPrivate:    repo.IsPrivate,
 	}); err != nil {
-		log.Error(2, "NotifyWatchers: %v", err)
+		log.Error("NotifyWatchers: %v", err)
 	}
 	if err = pull.MailParticipants(); err != nil {
-		log.Error(2, "MailParticipants: %v", err)
+		log.Error("MailParticipants: %v", err)
 	}
 
 	pr.Issue = pull
@@ -505,7 +505,7 @@ func NewPullRequest(repo *Repository, pull *Issue, labelIDs []int64, uuids []str
 		Repository:  repo.APIFormat(nil),
 		Sender:      pull.Poster.APIFormat(),
 	}); err != nil {
-		log.Error(2, "PrepareWebhooks: %v", err)
+		log.Error("PrepareWebhooks: %v", err)
 	}
 
 	return nil
@@ -667,7 +667,7 @@ func (pr *PullRequest) AddToTaskQueue() {
 	go PullRequestQueue.AddFunc(pr.ID, func() {
 		pr.Status = PULL_REQUEST_STATUS_CHECKING
 		if err := pr.UpdateCols("status"); err != nil {
-			log.Error(3, "AddToTaskQueue.UpdateCols[%d].(add to queue): %v", pr.ID, err)
+			log.Error("AddToTaskQueue.UpdateCols[%d].(add to queue): %v", pr.ID, err)
 		}
 	})
 }
@@ -717,10 +717,10 @@ func addHeadRepoTasks(prs []*PullRequest) {
 	for _, pr := range prs {
 		log.Trace("addHeadRepoTasks[%d]: composing new test task", pr.ID)
 		if err := pr.UpdatePatch(); err != nil {
-			log.Error(4, "UpdatePatch: %v", err)
+			log.Error("UpdatePatch: %v", err)
 			continue
 		} else if err := pr.PushToBaseRepo(); err != nil {
-			log.Error(4, "PushToBaseRepo: %v", err)
+			log.Error("PushToBaseRepo: %v", err)
 			continue
 		}
 
@@ -734,20 +734,20 @@ func AddTestPullRequestTask(doer *User, repoID int64, branch string, isSync bool
 	log.Trace("AddTestPullRequestTask [head_repo_id: %d, head_branch: %s]: finding pull requests", repoID, branch)
 	prs, err := GetUnmergedPullRequestsByHeadInfo(repoID, branch)
 	if err != nil {
-		log.Error(2, "Find pull requests [head_repo_id: %d, head_branch: %s]: %v", repoID, branch, err)
+		log.Error("Find pull requests [head_repo_id: %d, head_branch: %s]: %v", repoID, branch, err)
 		return
 	}
 
 	if isSync {
 		if err = PullRequestList(prs).LoadAttributes(); err != nil {
-			log.Error(2, "PullRequestList.LoadAttributes: %v", err)
+			log.Error("PullRequestList.LoadAttributes: %v", err)
 		}
 
 		if err == nil {
 			for _, pr := range prs {
 				pr.Issue.PullRequest = pr
 				if err = pr.Issue.LoadAttributes(); err != nil {
-					log.Error(2, "LoadAttributes: %v", err)
+					log.Error("LoadAttributes: %v", err)
 					continue
 				}
 				if err = PrepareWebhooks(pr.Issue.Repo, HOOK_EVENT_PULL_REQUEST, &api.PullRequestPayload{
@@ -757,7 +757,7 @@ func AddTestPullRequestTask(doer *User, repoID int64, branch string, isSync bool
 					Repository:  pr.Issue.Repo.APIFormat(nil),
 					Sender:      doer.APIFormat(),
 				}); err != nil {
-					log.Error(2, "PrepareWebhooks [pull_id: %v]: %v", pr.ID, err)
+					log.Error("PrepareWebhooks [pull_id: %v]: %v", pr.ID, err)
 					continue
 				}
 			}
@@ -769,7 +769,7 @@ func AddTestPullRequestTask(doer *User, repoID int64, branch string, isSync bool
 	log.Trace("AddTestPullRequestTask [base_repo_id: %d, base_branch: %s]: finding pull requests", repoID, branch)
 	prs, err = GetUnmergedPullRequestsByBaseInfo(repoID, branch)
 	if err != nil {
-		log.Error(2, "Find pull requests [base_repo_id: %d, base_branch: %s]: %v", repoID, branch, err)
+		log.Error("Find pull requests [base_repo_id: %d, base_branch: %s]: %v", repoID, branch, err)
 		return
 	}
 	for _, pr := range prs {
@@ -796,7 +796,7 @@ func (pr *PullRequest) checkAndUpdateStatus() {
 	// Make sure there is no waiting test to process before levaing the checking status.
 	if !PullRequestQueue.Exist(pr.ID) {
 		if err := pr.UpdateCols("status"); err != nil {
-			log.Error(4, "Update[%d]: %v", pr.ID, err)
+			log.Error("Update[%d]: %v", pr.ID, err)
 		}
 	}
 }
@@ -812,12 +812,12 @@ func TestPullRequests() {
 			pr := bean.(*PullRequest)
 
 			if err := pr.LoadAttributes(); err != nil {
-				log.Error(3, "LoadAttributes: %v", err)
+				log.Error("LoadAttributes: %v", err)
 				return nil
 			}
 
 			if err := pr.testPatch(); err != nil {
-				log.Error(3, "testPatch: %v", err)
+				log.Error("testPatch: %v", err)
 				return nil
 			}
 			prs = append(prs, pr)
@@ -836,10 +836,10 @@ func TestPullRequests() {
 
 		pr, err := GetPullRequestByID(com.StrTo(prID).MustInt64())
 		if err != nil {
-			log.Error(4, "GetPullRequestByID[%s]: %v", prID, err)
+			log.Error("GetPullRequestByID[%s]: %v", prID, err)
 			continue
 		} else if err = pr.testPatch(); err != nil {
-			log.Error(4, "testPatch[%d]: %v", pr.ID, err)
+			log.Error("testPatch[%d]: %v", pr.ID, err)
 			continue
 		}
 

+ 2 - 2
internal/db/release.go

@@ -10,7 +10,7 @@ import (
 	"strings"
 	"time"
 
-	log "gopkg.in/clog.v1"
+	log "unknwon.dev/clog/v2"
 	"xorm.io/xorm"
 
 	"github.com/gogs/git-module"
@@ -156,7 +156,7 @@ func (r *Release) preparePublishWebhooks() {
 		Repository: r.Repo.APIFormat(nil),
 		Sender:     r.Publisher.APIFormat(),
 	}); err != nil {
-		log.Error(2, "PrepareWebhooks: %v", err)
+		log.Error("PrepareWebhooks: %v", err)
 	}
 }
 

+ 32 - 32
internal/db/repo.go

@@ -23,8 +23,8 @@ import (
 	"github.com/nfnt/resize"
 	"github.com/unknwon/cae/zip"
 	"github.com/unknwon/com"
-	log "gopkg.in/clog.v1"
 	"gopkg.in/ini.v1"
+	log "unknwon.dev/clog/v2"
 	"xorm.io/xorm"
 
 	"github.com/gogs/git-module"
@@ -59,13 +59,13 @@ func LoadRepoConfig() {
 	for i, t := range types {
 		files, err := conf.AssetDir("conf/" + t)
 		if err != nil {
-			log.Fatal(4, "Fail to get %s files: %v", t, err)
+			log.Fatal("Failed to get %s files: %v", t, err)
 		}
 		customPath := path.Join(setting.CustomPath, "conf", t)
 		if com.IsDir(customPath) {
 			customFiles, err := com.StatDir(customPath)
 			if err != nil {
-				log.Fatal(4, "Fail to get custom %s files: %v", t, err)
+				log.Fatal("Failed to get custom %s files: %v", t, err)
 			}
 
 			for _, f := range customFiles {
@@ -106,19 +106,19 @@ func NewRepoContext() {
 
 	// Check Git installation.
 	if _, err := exec.LookPath("git"); err != nil {
-		log.Fatal(2, "Failed to test 'git' command: %v (forgotten install?)", err)
+		log.Fatal("Failed to test 'git' command: %v (forgotten install?)", err)
 	}
 
 	// Check Git version.
 	var err error
 	setting.Git.Version, err = git.BinVersion()
 	if err != nil {
-		log.Fatal(2, "Failed to get Git version: %v", err)
+		log.Fatal("Failed to get Git version: %v", err)
 	}
 
 	log.Trace("Git version: %s", setting.Git.Version)
 	if version.Compare("1.8.3", setting.Git.Version, ">") {
-		log.Fatal(2, "Gogs requires Git version greater or equal to 1.8.3")
+		log.Fatal("Gogs requires Git version greater or equal to 1.8.3")
 	}
 	git.HookDir = "custom_hooks"
 	git.HookSampleDir = "hooks"
@@ -130,11 +130,11 @@ func NewRepoContext() {
 			// ExitError indicates this config is not set
 			if _, ok := err.(*exec.ExitError); ok || strings.TrimSpace(stdout) == "" {
 				if _, stderr, gerr := process.Exec("NewRepoContext(set "+configKey+")", "git", "config", "--global", configKey, defaultValue); gerr != nil {
-					log.Fatal(4, "Fail to set git %s(%s): %s", configKey, gerr, stderr)
+					log.Fatal("Failed to set git %s(%s): %s", configKey, gerr, stderr)
 				}
 				log.Info("Git config %s set to %s", configKey, defaultValue)
 			} else {
-				log.Fatal(4, "Fail to get git %s(%s): %s", configKey, err, stderr)
+				log.Fatal("Failed to get git %s(%s): %s", configKey, err, stderr)
 			}
 		}
 	}
@@ -142,7 +142,7 @@ func NewRepoContext() {
 	// Set git some configurations.
 	if _, stderr, err := process.Exec("NewRepoContext(git config --global core.quotepath false)",
 		"git", "config", "--global", "core.quotepath", "false"); err != nil {
-		log.Fatal(2, "Fail to execute 'git config --global core.quotepath false': %v - %s", err, stderr)
+		log.Fatal("Failed to execute 'git config --global core.quotepath false': %v - %s", err, stderr)
 	}
 
 	RemoveAllWithNotice("Clean up repository temporary data", filepath.Join(setting.AppDataPath, "tmp"))
@@ -783,7 +783,7 @@ func MigrateRepository(doer, owner *User, opts MigrateRepoOptions) (*Repository,
 			Quiet:   true,
 			Timeout: migrateTimeout,
 		}); err != nil {
-			log.Trace("Fail to clone wiki: %v", err)
+			log.Trace("Failed to clone wiki: %v", err)
 			RemoveAllWithNotice("Delete repository wiki for initialization failure", wikiPath)
 		}
 	}
@@ -813,7 +813,7 @@ func MigrateRepository(doer, owner *User, opts MigrateRepoOptions) (*Repository,
 		}
 
 		if err = repo.UpdateSize(); err != nil {
-			log.Error(2, "UpdateSize [repo_id: %d]: %v", repo.ID, err)
+			log.Error("UpdateSize [repo_id: %d]: %v", repo.ID, err)
 		}
 	}
 
@@ -1163,7 +1163,7 @@ func countRepositories(userID int64, private bool) int64 {
 
 	count, err := sess.Count(new(Repository))
 	if err != nil {
-		log.Error(4, "countRepositories: %v", err)
+		log.Error("countRepositories: %v", err)
 	}
 	return count
 }
@@ -1436,11 +1436,11 @@ func updateRepository(e Engine, repo *Repository, visibilityChanged bool) (err e
 		daemonExportFile := path.Join(repo.RepoPath(), "git-daemon-export-ok")
 		if repo.IsPrivate && com.IsExist(daemonExportFile) {
 			if err = os.Remove(daemonExportFile); err != nil {
-				log.Error(4, "Failed to remove %s: %v", daemonExportFile, err)
+				log.Error("Failed to remove %s: %v", daemonExportFile, err)
 			}
 		} else if !repo.IsPrivate && !com.IsExist(daemonExportFile) {
 			if f, err := os.Create(daemonExportFile); err != nil {
-				log.Error(4, "Failed to create %s: %v", daemonExportFile, err)
+				log.Error("Failed to create %s: %v", daemonExportFile, err)
 			} else {
 				f.Close()
 			}
@@ -1592,7 +1592,7 @@ func DeleteRepository(uid, repoID int64) error {
 
 	if repo.NumForks > 0 {
 		if _, err = x.Exec("UPDATE `repository` SET fork_id=0,is_fork=? WHERE fork_id=?", false, repo.ID); err != nil {
-			log.Error(4, "reset 'fork_id' and 'is_fork': %v", err)
+			log.Error("reset 'fork_id' and 'is_fork': %v", err)
 		}
 	}
 
@@ -1781,14 +1781,14 @@ func DeleteOldRepositoryArchives() {
 
 				dir, err := os.Open(dirPath)
 				if err != nil {
-					log.Error(3, "Fail to open directory '%s': %v", dirPath, err)
+					log.Error("Failed to open directory '%s': %v", dirPath, err)
 					continue
 				}
 
 				fis, err := dir.Readdir(0)
 				dir.Close()
 				if err != nil {
-					log.Error(3, "Fail to read directory '%s': %v", dirPath, err)
+					log.Error("Failed to read directory '%s': %v", dirPath, err)
 					continue
 				}
 
@@ -1799,10 +1799,10 @@ func DeleteOldRepositoryArchives() {
 
 					archivePath := filepath.Join(dirPath, fi.Name())
 					if err = os.Remove(archivePath); err != nil {
-						desc := fmt.Sprintf("Fail to health delete archive '%s': %v", archivePath, err)
+						desc := fmt.Sprintf("Failed to health delete archive '%s': %v", archivePath, err)
 						log.Warn(desc)
 						if err = CreateRepositoryNotice(desc); err != nil {
-							log.Error(3, "CreateRepositoryNotice: %v", err)
+							log.Error("CreateRepositoryNotice: %v", err)
 						}
 					}
 				}
@@ -1810,7 +1810,7 @@ func DeleteOldRepositoryArchives() {
 
 			return nil
 		}); err != nil {
-		log.Error(2, "DeleteOldRepositoryArchives: %v", err)
+		log.Error("DeleteOldRepositoryArchives: %v", err)
 	}
 }
 
@@ -1935,12 +1935,12 @@ func GitFsck() {
 				desc := fmt.Sprintf("Failed to perform health check on repository '%s': %v", repoPath, err)
 				log.Warn(desc)
 				if err = CreateRepositoryNotice(desc); err != nil {
-					log.Error(3, "CreateRepositoryNotice: %v", err)
+					log.Error("CreateRepositoryNotice: %v", err)
 				}
 			}
 			return nil
 		}); err != nil {
-		log.Error(2, "GitFsck: %v", err)
+		log.Error("GitFsck: %v", err)
 	}
 }
 
@@ -1971,7 +1971,7 @@ type repoChecker struct {
 func repoStatsCheck(checker *repoChecker) {
 	results, err := x.Query(checker.querySQL)
 	if err != nil {
-		log.Error(2, "Select %s: %v", checker.desc, err)
+		log.Error("Select %s: %v", checker.desc, err)
 		return
 	}
 	for _, result := range results {
@@ -1979,7 +1979,7 @@ func repoStatsCheck(checker *repoChecker) {
 		log.Trace("Updating %s: %d", checker.desc, id)
 		_, err = x.Exec(checker.correctSQL, id, id)
 		if err != nil {
-			log.Error(2, "Update %s[%d]: %v", checker.desc, id, err)
+			log.Error("Update %s[%d]: %v", checker.desc, id, err)
 		}
 	}
 }
@@ -2033,14 +2033,14 @@ func CheckRepoStats() {
 	desc := "repository count 'num_closed_issues'"
 	results, err := x.Query("SELECT repo.id FROM `repository` repo WHERE repo.num_closed_issues!=(SELECT COUNT(*) FROM `issue` WHERE repo_id=repo.id AND is_closed=? AND is_pull=?)", true, false)
 	if err != nil {
-		log.Error(2, "Select %s: %v", desc, err)
+		log.Error("Select %s: %v", desc, err)
 	} else {
 		for _, result := range results {
 			id := com.StrTo(result["id"]).MustInt64()
 			log.Trace("Updating %s: %d", desc, id)
 			_, err = x.Exec("UPDATE `repository` SET num_closed_issues=(SELECT COUNT(*) FROM `issue` WHERE repo_id=? AND is_closed=? AND is_pull=?) WHERE id=?", id, true, false, id)
 			if err != nil {
-				log.Error(2, "Update %s[%d]: %v", desc, id, err)
+				log.Error("Update %s[%d]: %v", desc, id, err)
 			}
 		}
 	}
@@ -2050,7 +2050,7 @@ func CheckRepoStats() {
 	// ***** START: Repository.NumForks *****
 	results, err = x.Query("SELECT repo.id FROM `repository` repo WHERE repo.num_forks!=(SELECT COUNT(*) FROM `repository` WHERE fork_id=repo.id)")
 	if err != nil {
-		log.Error(2, "Select repository count 'num_forks': %v", err)
+		log.Error("Select repository count 'num_forks': %v", err)
 	} else {
 		for _, result := range results {
 			id := com.StrTo(result["id"]).MustInt64()
@@ -2058,19 +2058,19 @@ func CheckRepoStats() {
 
 			repo, err := GetRepositoryByID(id)
 			if err != nil {
-				log.Error(2, "GetRepositoryByID[%d]: %v", id, err)
+				log.Error("GetRepositoryByID[%d]: %v", id, err)
 				continue
 			}
 
 			rawResult, err := x.Query("SELECT COUNT(*) FROM `repository` WHERE fork_id=?", repo.ID)
 			if err != nil {
-				log.Error(2, "Select count of forks[%d]: %v", repo.ID, err)
+				log.Error("Select count of forks[%d]: %v", repo.ID, err)
 				continue
 			}
 			repo.NumForks = int(parseCountResult(rawResult))
 
 			if err = UpdateRepository(repo, false); err != nil {
-				log.Error(2, "UpdateRepository[%d]: %v", id, err)
+				log.Error("UpdateRepository[%d]: %v", id, err)
 				continue
 			}
 		}
@@ -2410,14 +2410,14 @@ func ForkRepository(doer, owner *User, baseRepo *Repository, name, desc string)
 	}
 
 	if err = repo.UpdateSize(); err != nil {
-		log.Error(2, "UpdateSize [repo_id: %d]: %v", repo.ID, err)
+		log.Error("UpdateSize [repo_id: %d]: %v", repo.ID, err)
 	}
 	if err = PrepareWebhooks(baseRepo, HOOK_EVENT_FORK, &api.ForkPayload{
 		Forkee: repo.APIFormat(nil),
 		Repo:   baseRepo.APIFormat(nil),
 		Sender: doer.APIFormat(),
 	}); err != nil {
-		log.Error(2, "PrepareWebhooks [repo_id: %d]: %v", baseRepo.ID, err)
+		log.Error("PrepareWebhooks [repo_id: %d]: %v", baseRepo.ID, err)
 	}
 	return repo, nil
 }

+ 2 - 2
internal/db/repo_collaboration.go

@@ -7,7 +7,7 @@ package db
 import (
 	"fmt"
 
-	log "gopkg.in/clog.v1"
+	log "unknwon.dev/clog/v2"
 
 	api "github.com/gogs/go-gogs-client"
 )
@@ -41,7 +41,7 @@ func IsCollaborator(repoID, userID int64) bool {
 	}
 	has, err := x.Get(collaboration)
 	if err != nil {
-		log.Error(2, "get collaboration [repo_id: %d, user_id: %d]: %v", repoID, userID, err)
+		log.Error("get collaboration [repo_id: %d, user_id: %d]: %v", repoID, userID, err)
 		return false
 	}
 	return has

+ 2 - 2
internal/db/ssh_key.go

@@ -20,7 +20,7 @@ import (
 
 	"github.com/unknwon/com"
 	"golang.org/x/crypto/ssh"
-	log "gopkg.in/clog.v1"
+	log "unknwon.dev/clog/v2"
 	"xorm.io/xorm"
 
 	"gogs.io/gogs/internal/process"
@@ -341,7 +341,7 @@ func appendAuthorizedKeysToFile(keys ...*PublicKey) error {
 
 		// .ssh directory should have mode 700, and authorized_keys file should have mode 600.
 		if fi.Mode().Perm() > 0600 {
-			log.Error(4, "authorized_keys file has unusual permission flags: %s - setting to -rw-------", fi.Mode().Perm().String())
+			log.Error("authorized_keys file has unusual permission flags: %s - setting to -rw-------", fi.Mode().Perm().String())
 			if err = f.Chmod(0600); err != nil {
 				return err
 			}

+ 1 - 1
internal/db/ssh_key_test.go

@@ -15,7 +15,7 @@ import (
 )
 
 func init() {
-	setting.NewContext()
+	setting.Init()
 }
 
 func Test_SSHParsePublicKey(t *testing.T) {

+ 2 - 2
internal/db/two_factor.go

@@ -12,7 +12,7 @@ import (
 
 	"github.com/pquerna/otp/totp"
 	"github.com/unknwon/com"
-	log "gopkg.in/clog.v1"
+	log "unknwon.dev/clog/v2"
 	"xorm.io/xorm"
 
 	"gogs.io/gogs/internal/db/errors"
@@ -58,7 +58,7 @@ func (t *TwoFactor) ValidateTOTP(passcode string) (bool, error) {
 func IsUserEnabledTwoFactor(userID int64) bool {
 	has, err := x.Where("user_id = ?", userID).Get(new(TwoFactor))
 	if err != nil {
-		log.Error(2, "IsUserEnabledTwoFactor [user_id: %d]: %v", userID, err)
+		log.Error("IsUserEnabledTwoFactor [user_id: %d]: %v", userID, err)
 	}
 	return has
 }

+ 1 - 1
internal/db/update.go

@@ -67,7 +67,7 @@ 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("Fail to call 'git update-server-info': %v", err)
+		return fmt.Errorf("run 'git update-server-info': %v", err)
 	}
 
 	gitRepo, err := git.OpenRepository(repoPath)

+ 5 - 5
internal/db/user.go

@@ -23,7 +23,7 @@ import (
 	"github.com/nfnt/resize"
 	"github.com/unknwon/com"
 	"golang.org/x/crypto/pbkdf2"
-	log "gopkg.in/clog.v1"
+	log "unknwon.dev/clog/v2"
 	"xorm.io/xorm"
 
 	"github.com/gogs/git-module"
@@ -265,7 +265,7 @@ func (u *User) RelAvatarLink() string {
 	case setting.DisableGravatar, setting.OfflineMode:
 		if !com.IsExist(u.CustomAvatarPath()) {
 			if err := u.GenerateRandomAvatar(); err != nil {
-				log.Error(3, "GenerateRandomAvatar: %v", err)
+				log.Error("GenerateRandomAvatar: %v", err)
 			}
 		}
 
@@ -371,7 +371,7 @@ func (u *User) DeleteAvatar() error {
 func (u *User) IsAdminOfRepo(repo *Repository) bool {
 	has, err := HasAccess(u.ID, repo, ACCESS_MODE_ADMIN)
 	if err != nil {
-		log.Error(2, "HasAccess: %v", err)
+		log.Error("HasAccess: %v", err)
 	}
 	return has
 }
@@ -380,7 +380,7 @@ func (u *User) IsAdminOfRepo(repo *Repository) bool {
 func (u *User) IsWriterOfRepo(repo *Repository) bool {
 	has, err := HasAccess(u.ID, repo, ACCESS_MODE_WRITE)
 	if err != nil {
-		log.Error(2, "HasAccess: %v", err)
+		log.Error("HasAccess: %v", err)
 	}
 	return has
 }
@@ -608,7 +608,7 @@ func parseUserFromCode(code string) (user *User) {
 		if user, err = GetUserByName(string(b)); user != nil {
 			return user
 		} else if !errors.IsUserNotExist(err) {
-			log.Error(2, "GetUserByName: %v", err)
+			log.Error("GetUserByName: %v", err)
 		}
 	}
 

+ 12 - 12
internal/db/webhook.go

@@ -16,7 +16,7 @@ import (
 
 	"github.com/json-iterator/go"
 	gouuid "github.com/satori/go.uuid"
-	log "gopkg.in/clog.v1"
+	log "unknwon.dev/clog/v2"
 	"xorm.io/xorm"
 
 	api "github.com/gogs/go-gogs-client"
@@ -127,7 +127,7 @@ func (w *Webhook) AfterSet(colName string, _ xorm.Cell) {
 	case "events":
 		w.HookEvent = &HookEvent{}
 		if err = jsoniter.Unmarshal([]byte(w.Events), w.HookEvent); err != nil {
-			log.Error(3, "Unmarshal [%d]: %v", w.ID, err)
+			log.Error("Unmarshal [%d]: %v", w.ID, err)
 		}
 	case "created_unix":
 		w.Created = time.Unix(w.CreatedUnix, 0).Local()
@@ -139,7 +139,7 @@ func (w *Webhook) AfterSet(colName string, _ xorm.Cell) {
 func (w *Webhook) GetSlackHook() *SlackMeta {
 	s := &SlackMeta{}
 	if err := jsoniter.Unmarshal([]byte(w.Meta), s); err != nil {
-		log.Error(2, "GetSlackHook [%d]: %v", w.ID, err)
+		log.Error("GetSlackHook [%d]: %v", w.ID, err)
 	}
 	return s
 }
@@ -457,7 +457,7 @@ func (t *HookTask) AfterSet(colName string, _ xorm.Cell) {
 
 		t.RequestInfo = &HookRequest{}
 		if err = jsoniter.Unmarshal([]byte(t.RequestContent), t.RequestInfo); err != nil {
-			log.Error(3, "Unmarshal[%d]: %v", t.ID, err)
+			log.Error("Unmarshal[%d]: %v", t.ID, err)
 		}
 
 	case "response_content":
@@ -467,7 +467,7 @@ func (t *HookTask) AfterSet(colName string, _ xorm.Cell) {
 
 		t.ResponseInfo = &HookResponse{}
 		if err = jsoniter.Unmarshal([]byte(t.ResponseContent), t.ResponseInfo); err != nil {
-			log.Error(3, "Unmarshal [%d]: %v", t.ID, err)
+			log.Error("Unmarshal [%d]: %v", t.ID, err)
 		}
 	}
 }
@@ -475,7 +475,7 @@ func (t *HookTask) AfterSet(colName string, _ xorm.Cell) {
 func (t *HookTask) MarshalJSON(v interface{}) string {
 	p, err := jsoniter.Marshal(v)
 	if err != nil {
-		log.Error(3, "Marshal [%d]: %v", t.ID, err)
+		log.Error("Marshal [%d]: %v", t.ID, err)
 	}
 	return string(p)
 }
@@ -588,7 +588,7 @@ func prepareHookTasks(e Engine, repo *Repository, event HookEventType, p api.Pay
 		if len(w.Secret) > 0 {
 			data, err := payloader.JSONPayload()
 			if err != nil {
-				log.Error(2, "prepareWebhooks.JSONPayload: %v", err)
+				log.Error("prepareWebhooks.JSONPayload: %v", err)
 			}
 			sig := hmac.New(sha256.New, []byte(w.Secret))
 			sig.Write(data)
@@ -691,7 +691,7 @@ func (t *HookTask) deliver() {
 		// Update webhook last delivery status.
 		w, err := GetWebhookByID(t.HookID)
 		if err != nil {
-			log.Error(3, "GetWebhookByID: %v", err)
+			log.Error("GetWebhookByID: %v", err)
 			return
 		}
 		if t.IsSucceed {
@@ -700,7 +700,7 @@ func (t *HookTask) deliver() {
 			w.LastStatus = HOOK_STATUS_FAILED
 		}
 		if err = UpdateWebhook(w); err != nil {
-			log.Error(3, "UpdateWebhook: %v", err)
+			log.Error("UpdateWebhook: %v", err)
 			return
 		}
 	}()
@@ -742,7 +742,7 @@ func DeliverHooks() {
 	// Update hook task status.
 	for _, t := range tasks {
 		if err := UpdateHookTask(t); err != nil {
-			log.Error(4, "UpdateHookTask [%d]: %v", t.ID, err)
+			log.Error("UpdateHookTask [%d]: %v", t.ID, err)
 		}
 	}
 
@@ -753,13 +753,13 @@ func DeliverHooks() {
 
 		tasks = make([]*HookTask, 0, 5)
 		if err := x.Where("repo_id = ?", repoID).And("is_delivered = ?", false).Find(&tasks); err != nil {
-			log.Error(4, "Get repository [%s] hook tasks: %v", repoID, err)
+			log.Error("Get repository [%s] hook tasks: %v", repoID, err)
 			continue
 		}
 		for _, t := range tasks {
 			t.deliver()
 			if err := UpdateHookTask(t); err != nil {
-				log.Error(4, "UpdateHookTask [%d]: %v", t.ID, err)
+				log.Error("UpdateHookTask [%d]: %v", t.ID, err)
 				continue
 			}
 		}

+ 6 - 6
internal/mailer/mail.go

@@ -11,9 +11,9 @@ import (
 	"sync"
 	"time"
 
-	log "gopkg.in/clog.v1"
 	"gopkg.in/gomail.v2"
 	"gopkg.in/macaron.v1"
+	log "unknwon.dev/clog/v2"
 
 	"gogs.io/gogs/internal/assets/templates"
 	"gogs.io/gogs/internal/markup"
@@ -111,7 +111,7 @@ func SendUserMail(c *macaron.Context, u User, tpl, code, subject, info string) {
 	}
 	body, err := render(tpl, data)
 	if err != nil {
-		log.Error(2, "render: %v", err)
+		log.Error("render: %v", err)
 		return
 	}
 
@@ -139,7 +139,7 @@ func SendActivateEmailMail(c *macaron.Context, u User, email string) {
 	}
 	body, err := render(MAIL_AUTH_ACTIVATE_EMAIL, data)
 	if err != nil {
-		log.Error(3, "HTMLString: %v", err)
+		log.Error("HTMLString: %v", err)
 		return
 	}
 
@@ -156,7 +156,7 @@ func SendRegisterNotifyMail(c *macaron.Context, u User) {
 	}
 	body, err := render(MAIL_AUTH_REGISTER_NOTIFY, data)
 	if err != nil {
-		log.Error(3, "HTMLString: %v", err)
+		log.Error("HTMLString: %v", err)
 		return
 	}
 
@@ -177,7 +177,7 @@ func SendCollaboratorMail(u, doer User, repo Repository) {
 	}
 	body, err := render(MAIL_NOTIFY_COLLABORATOR, data)
 	if err != nil {
-		log.Error(3, "HTMLString: %v", err)
+		log.Error("HTMLString: %v", err)
 		return
 	}
 
@@ -202,7 +202,7 @@ func composeIssueMessage(issue Issue, repo Repository, doer User, tplName string
 	data["Doer"] = doer
 	content, err := render(tplName, data)
 	if err != nil {
-		log.Error(3, "HTMLString (%s): %v", tplName, err)
+		log.Error("HTMLString (%s): %v", tplName, err)
 	}
 	from := gomail.NewMessage().FormatAddress(setting.MailService.FromEmail, doer.DisplayName())
 	msg := NewMessageFrom(tos, from, subject, content)

+ 3 - 3
internal/mailer/mailer.go

@@ -15,8 +15,8 @@ import (
 	"time"
 
 	"github.com/jaytaylor/html2text"
-	log "gopkg.in/clog.v1"
 	"gopkg.in/gomail.v2"
+	log "unknwon.dev/clog/v2"
 
 	"gogs.io/gogs/internal/setting"
 )
@@ -43,7 +43,7 @@ func NewMessageFrom(to []string, from, subject, htmlBody string) *Message {
 	if setting.MailService.UsePlainText || setting.MailService.AddPlainTextAlt {
 		plainBody, err := html2text.FromString(htmlBody)
 		if err != nil {
-			log.Error(2, "html2text.FromString: %v", err)
+			log.Error("html2text.FromString: %v", err)
 		} else {
 			contentType = "text/plain"
 			body = plainBody
@@ -209,7 +209,7 @@ func processMailQueue() {
 		case msg := <-mailQueue:
 			log.Trace("New e-mail sending request %s: %s", msg.GetHeader("To"), msg.Info)
 			if err := gomail.Send(sender, msg.Message); err != nil {
-				log.Error(3, "Fail to send emails %s: %s - %v", msg.GetHeader("To"), msg.Info, err)
+				log.Error("Failed to send emails %s: %s - %v", msg.GetHeader("To"), msg.Info, err)
 			} else {
 				log.Trace("E-mails sent %s: %s", msg.GetHeader("To"), msg.Info)
 			}

+ 3 - 3
internal/process/manager.go

@@ -12,11 +12,11 @@ import (
 	"sync"
 	"time"
 
-	log "gopkg.in/clog.v1"
+	log "unknwon.dev/clog/v2"
 )
 
 var (
-	ErrExecTimeout = errors.New("Process execution timeout")
+	ErrExecTimeout = errors.New("process execution timeout")
 )
 
 const DEFAULT_TIMEOUT = 60 * time.Second
@@ -101,7 +101,7 @@ func ExecDir(timeout time.Duration, dir, desc, cmdName string, args ...string) (
 	select {
 	case <-time.After(timeout):
 		if errKill := Kill(pid); errKill != nil {
-			log.Error(2, "Fail to kill timeout process [pid: %d, desc: %s]: %v", pid, desc, errKill)
+			log.Error("Failed to kill timeout process [pid: %d, desc: %s]: %v", pid, desc, errKill)
 		}
 		<-done
 		return "", ErrExecTimeout.Error(), ErrExecTimeout

+ 1 - 1
internal/route/admin/auths.go

@@ -10,7 +10,7 @@ import (
 	"strings"
 
 	"github.com/unknwon/com"
-	log "gopkg.in/clog.v1"
+	log "unknwon.dev/clog/v2"
 	"xorm.io/core"
 
 	"gogs.io/gogs/internal/auth/ldap"

+ 1 - 1
internal/route/admin/notice.go

@@ -7,7 +7,7 @@ package admin
 import (
 	"github.com/unknwon/com"
 	"github.com/unknwon/paginater"
-	log "gopkg.in/clog.v1"
+	log "unknwon.dev/clog/v2"
 
 	"gogs.io/gogs/internal/context"
 	"gogs.io/gogs/internal/db"

+ 1 - 1
internal/route/admin/repos.go

@@ -6,7 +6,7 @@ package admin
 
 import (
 	"github.com/unknwon/paginater"
-	log "gopkg.in/clog.v1"
+	log "unknwon.dev/clog/v2"
 
 	"gogs.io/gogs/internal/context"
 	"gogs.io/gogs/internal/db"

+ 1 - 1
internal/route/admin/users.go

@@ -8,7 +8,7 @@ import (
 	"strings"
 
 	"github.com/unknwon/com"
-	log "gopkg.in/clog.v1"
+	log "unknwon.dev/clog/v2"
 
 	"gogs.io/gogs/internal/context"
 	"gogs.io/gogs/internal/db"

+ 6 - 6
internal/route/api/v1/admin/user.go

@@ -5,10 +5,9 @@
 package admin
 
 import (
-	user2 "gogs.io/gogs/internal/route/api/v1/user"
 	"net/http"
 
-	log "gopkg.in/clog.v1"
+	log "unknwon.dev/clog/v2"
 
 	api "github.com/gogs/go-gogs-client"
 
@@ -16,6 +15,7 @@ import (
 	"gogs.io/gogs/internal/db"
 	"gogs.io/gogs/internal/db/errors"
 	"gogs.io/gogs/internal/mailer"
+	"gogs.io/gogs/internal/route/api/v1/user"
 	"gogs.io/gogs/internal/setting"
 )
 
@@ -76,7 +76,7 @@ func CreateUser(c *context.APIContext, form api.CreateUserOption) {
 }
 
 func EditUser(c *context.APIContext, form api.EditUserOption) {
-	u := user2.GetUserByParams(c)
+	u := user.GetUserByParams(c)
 	if c.Written() {
 		return
 	}
@@ -131,7 +131,7 @@ func EditUser(c *context.APIContext, form api.EditUserOption) {
 }
 
 func DeleteUser(c *context.APIContext) {
-	u := user2.GetUserByParams(c)
+	u := user.GetUserByParams(c)
 	if c.Written() {
 		return
 	}
@@ -151,9 +151,9 @@ func DeleteUser(c *context.APIContext) {
 }
 
 func CreatePublicKey(c *context.APIContext, form api.CreateKeyOption) {
-	u := user2.GetUserByParams(c)
+	u := user.GetUserByParams(c)
 	if c.Written() {
 		return
 	}
-	user2.CreateUserPublicKey(c, form, u.ID)
+	user.CreateUserPublicKey(c, form, u.ID)
 }

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

@@ -6,11 +6,10 @@ package repo
 
 import (
 	"fmt"
-	convert2 "gogs.io/gogs/internal/route/api/v1/convert"
 	"net/http"
 	"path"
 
-	log "gopkg.in/clog.v1"
+	log "unknwon.dev/clog/v2"
 
 	api "github.com/gogs/go-gogs-client"
 
@@ -18,6 +17,7 @@ import (
 	"gogs.io/gogs/internal/db"
 	"gogs.io/gogs/internal/db/errors"
 	"gogs.io/gogs/internal/form"
+	"gogs.io/gogs/internal/route/api/v1/convert"
 	"gogs.io/gogs/internal/setting"
 )
 
@@ -25,7 +25,7 @@ func Search(c *context.APIContext) {
 	opts := &db.SearchRepoOptions{
 		Keyword:  path.Base(c.Query("q")),
 		OwnerID:  c.QueryInt64("uid"),
-		PageSize: convert2.ToCorrectPageSize(c.QueryInt("limit")),
+		PageSize: convert.ToCorrectPageSize(c.QueryInt("limit")),
 		Page:     c.QueryInt("page"),
 	}
 
@@ -173,7 +173,7 @@ func CreateUserRepo(c *context.APIContext, owner *db.User, opt api.CreateRepoOpt
 		} else {
 			if repo != nil {
 				if err = db.DeleteRepository(c.User.ID, repo.ID); err != nil {
-					log.Error(2, "DeleteRepository: %v", err)
+					log.Error("DeleteRepository: %v", err)
 				}
 			}
 			c.ServerError("CreateRepository", err)
@@ -270,7 +270,7 @@ func Migrate(c *context.APIContext, f form.MigrateRepo) {
 	if err != nil {
 		if repo != nil {
 			if errDelete := db.DeleteRepository(ctxUser.ID, repo.ID); errDelete != nil {
-				log.Error(2, "DeleteRepository: %v", errDelete)
+				log.Error("DeleteRepository: %v", errDelete)
 			}
 		}
 

+ 11 - 10
internal/route/install.go

@@ -12,9 +12,9 @@ import (
 	"strings"
 
 	"github.com/unknwon/com"
-	log "gopkg.in/clog.v1"
 	"gopkg.in/ini.v1"
 	"gopkg.in/macaron.v1"
+	log "unknwon.dev/clog/v2"
 	"xorm.io/xorm"
 
 	"github.com/gogs/git-module"
@@ -46,24 +46,25 @@ func checkRunMode() {
 	log.Info("Run mode: %s", strings.Title(macaron.Env))
 }
 
-func NewServices() {
-	setting.NewServices()
-	mailer.NewContext()
-}
-
 // GlobalInit is for global configuration reload-able.
 func GlobalInit() {
-	setting.NewContext()
+	setting.Init()
+	setting.InitLogging()
+	log.Info("%s %s", setting.AppName, setting.AppVersion)
 	log.Trace("Custom path: %s", setting.CustomPath)
 	log.Trace("Log path: %s", setting.LogRootPath)
+	log.Trace("Build time: %s", setting.BuildTime)
+	log.Trace("Build commit: %s", setting.BuildCommit)
+
 	db.LoadConfigs()
-	NewServices()
+	setting.NewServices()
+	mailer.NewContext()
 
 	if setting.InstallLock {
 		highlight.NewContext()
 		markup.NewSanitizer()
 		if err := db.NewEngine(); err != nil {
-			log.Fatal(2, "Fail to initialize ORM engine: %v", err)
+			log.Fatal("Failed to initialize ORM engine: %v", err)
 		}
 		db.HasEngine = true
 
@@ -302,7 +303,7 @@ func InstallPost(c *context.Context, f form.Install) {
 	if com.IsFile(setting.CustomConf) {
 		// Keeps custom settings if there is already something.
 		if err := cfg.Append(setting.CustomConf); err != nil {
-			log.Error(2, "Fail to load custom conf '%s': %v", setting.CustomConf, err)
+			log.Error("Failed to load custom conf '%s': %v", setting.CustomConf, err)
 		}
 	}
 	cfg.Section("database").Key("DB_TYPE").SetValue(db.DbCfg.Type)

+ 2 - 2
internal/route/org/members.go

@@ -6,7 +6,7 @@ package org
 
 import (
 	"github.com/unknwon/com"
-	log "gopkg.in/clog.v1"
+	log "unknwon.dev/clog/v2"
 
 	"gogs.io/gogs/internal/context"
 	"gogs.io/gogs/internal/db"
@@ -76,7 +76,7 @@ func MembersAction(c *context.Context) {
 	}
 
 	if err != nil {
-		log.Error(4, "Action(%s): %v", c.Params(":action"), err)
+		log.Error("Action(%s): %v", c.Params(":action"), err)
 		c.JSON(200, map[string]interface{}{
 			"ok":  false,
 			"err": err.Error(),

+ 1 - 1
internal/route/org/org.go

@@ -5,7 +5,7 @@
 package org
 
 import (
-	log "gopkg.in/clog.v1"
+	log "unknwon.dev/clog/v2"
 
 	"gogs.io/gogs/internal/context"
 	"gogs.io/gogs/internal/db"

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

@@ -5,15 +5,15 @@
 package org
 
 import (
-	user2 "gogs.io/gogs/internal/route/user"
 	"strings"
 
-	log "gopkg.in/clog.v1"
+	log "unknwon.dev/clog/v2"
 
 	"gogs.io/gogs/internal/context"
 	"gogs.io/gogs/internal/db"
 	"gogs.io/gogs/internal/db/errors"
 	"gogs.io/gogs/internal/form"
+	"gogs.io/gogs/internal/route/user"
 	"gogs.io/gogs/internal/setting"
 )
 
@@ -89,7 +89,7 @@ func SettingsPost(c *context.Context, f form.UpdateOrgSetting) {
 
 func SettingsAvatar(c *context.Context, f form.Avatar) {
 	f.Source = form.AVATAR_LOCAL
-	if err := user2.UpdateAvatarSetting(c, f, c.Org.Organization); err != nil {
+	if err := user.UpdateAvatarSetting(c, f, c.Org.Organization); err != nil {
 		c.Flash.Error(err.Error())
 	} else {
 		c.Flash.Success(c.Tr("org.settings.update_avatar_success"))

+ 3 - 3
internal/route/org/teams.go

@@ -8,7 +8,7 @@ import (
 	"path"
 
 	"github.com/unknwon/com"
-	log "gopkg.in/clog.v1"
+	log "unknwon.dev/clog/v2"
 
 	"gogs.io/gogs/internal/context"
 	"gogs.io/gogs/internal/db"
@@ -90,7 +90,7 @@ func TeamsAction(c *context.Context) {
 		if db.IsErrLastOrgOwner(err) {
 			c.Flash.Error(c.Tr("form.last_org_owner"))
 		} else {
-			log.Error(3, "Action(%s): %v", c.Params(":action"), err)
+			log.Error("Action(%s): %v", c.Params(":action"), err)
 			c.JSON(200, map[string]interface{}{
 				"ok":  false,
 				"err": err.Error(),
@@ -134,7 +134,7 @@ func TeamsRepoAction(c *context.Context) {
 	}
 
 	if err != nil {
-		log.Error(3, "Action(%s): '%s' %v", c.Params(":action"), c.Org.Team.Name, err)
+		log.Error("Action(%s): '%s' %v", c.Params(":action"), c.Org.Team.Name, err)
 		c.Handle(500, "TeamsRepoAction", err)
 		return
 	}

+ 4 - 4
internal/route/repo/branch.go

@@ -7,7 +7,7 @@ package repo
 import (
 	"time"
 
-	log "gopkg.in/clog.v1"
+	log "unknwon.dev/clog/v2"
 
 	"github.com/gogs/git-module"
 	api "github.com/gogs/go-gogs-client"
@@ -125,7 +125,7 @@ func DeleteBranchPost(c *context.Context) {
 	if len(commitID) > 0 {
 		branchCommitID, err := c.Repo.GitRepo.GetBranchCommitID(branchName)
 		if err != nil {
-			log.Error(2, "Failed to get commit ID of branch %q: %v", branchName, err)
+			log.Error("Failed to get commit ID of branch %q: %v", branchName, err)
 			return
 		}
 
@@ -138,7 +138,7 @@ func DeleteBranchPost(c *context.Context) {
 	if err := c.Repo.GitRepo.DeleteBranch(branchName, git.DeleteBranchOptions{
 		Force: true,
 	}); err != nil {
-		log.Error(2, "Failed to delete branch %q: %v", branchName, err)
+		log.Error("Failed to delete branch %q: %v", branchName, err)
 		return
 	}
 
@@ -149,7 +149,7 @@ func DeleteBranchPost(c *context.Context) {
 		Repo:       c.Repo.Repository.APIFormat(nil),
 		Sender:     c.User.APIFormat(),
 	}); err != nil {
-		log.Error(2, "Failed to prepare webhooks for %q: %v", db.HOOK_EVENT_DELETE, err)
+		log.Error("Failed to prepare webhooks for %q: %v", db.HOOK_EVENT_DELETE, err)
 		return
 	}
 }

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

@@ -11,7 +11,7 @@ import (
 	"path"
 	"strings"
 
-	log "gopkg.in/clog.v1"
+	log "unknwon.dev/clog/v2"
 
 	"github.com/gogs/git-module"
 	"gogs.io/gogs/internal/context"
@@ -91,7 +91,7 @@ func editFile(c *context.Context, isNewFile bool) {
 		buf = append(buf, d...)
 		if err, content := template.ToUTF8WithErr(buf); err != nil {
 			if err != nil {
-				log.Error(2, "Failed to convert encoding to UTF-8: %v", err)
+				log.Error("Failed to convert encoding to UTF-8: %v", err)
 			}
 			c.Data["FileContent"] = string(buf)
 		} else {
@@ -278,7 +278,7 @@ func editFilePost(c *context.Context, f form.EditRepoFile, isNewFile bool) {
 		Content:      strings.Replace(f.Content, "\r", "", -1),
 		IsNewFile:    isNewFile,
 	}); err != nil {
-		log.Error(2, "Failed to update repo file: %v", err)
+		log.Error("Failed to update repo file: %v", err)
 		c.FormErr("TreePath")
 		c.RenderWithErr(c.Tr("repo.editor.fail_to_update_file", f.TreePath, errors.InternalServerError), EDIT_FILE, &f)
 		return
@@ -385,7 +385,7 @@ func DeleteFilePost(c *context.Context, f form.DeleteRepoFile) {
 		TreePath:     c.Repo.TreePath,
 		Message:      message,
 	}); err != nil {
-		log.Error(2, "Failed to delete repo file: %v", err)
+		log.Error("Failed to delete repo file: %v", err)
 		c.RenderWithErr(c.Tr("repo.editor.fail_to_delete_file", c.Repo.TreePath, errors.InternalServerError), DELETE_FILE, &f)
 		return
 	}
@@ -505,7 +505,7 @@ func UploadFilePost(c *context.Context, f form.UploadRepoFile) {
 		Message:      message,
 		Files:        f.Files,
 	}); err != nil {
-		log.Error(2, "Failed to upload files: %v", err)
+		log.Error("Failed to upload files: %v", err)
 		c.FormErr("TreePath")
 		c.RenderWithErr(c.Tr("repo.editor.unable_to_upload_files", f.TreePath, errors.InternalServerError), UPLOAD_FILE, &f)
 		return

+ 4 - 4
internal/route/repo/http.go

@@ -16,8 +16,8 @@ import (
 	"strings"
 	"time"
 
-	log "gopkg.in/clog.v1"
 	"gopkg.in/macaron.v1"
+	log "unknwon.dev/clog/v2"
 
 	"gogs.io/gogs/internal/context"
 	"gogs.io/gogs/internal/db"
@@ -235,7 +235,7 @@ func serviceRPC(h serviceHandler, service string) {
 	if h.r.Header.Get("Content-Encoding") == "gzip" {
 		reqBody, err = gzip.NewReader(reqBody)
 		if err != nil {
-			log.Error(2, "HTTP.Get: fail to create gzip reader: %v", err)
+			log.Error("HTTP.Get: fail to create gzip reader: %v", err)
 			h.w.WriteHeader(http.StatusInternalServerError)
 			return
 		}
@@ -258,7 +258,7 @@ func serviceRPC(h serviceHandler, service string) {
 	cmd.Stderr = &stderr
 	cmd.Stdin = reqBody
 	if err = cmd.Run(); err != nil {
-		log.Error(2, "HTTP.serviceRPC: fail to serve RPC '%s': %v - %s", service, err, stderr.String())
+		log.Error("HTTP.serviceRPC: fail to serve RPC '%s': %v - %s", service, err, stderr.String())
 		h.w.WriteHeader(http.StatusInternalServerError)
 		return
 	}
@@ -286,7 +286,7 @@ func gitCommand(dir string, args ...string) []byte {
 	cmd.Dir = dir
 	out, err := cmd.Output()
 	if err != nil {
-		log.Error(2, fmt.Sprintf("Git: %v - %s", err, out))
+		log.Error(fmt.Sprintf("Git: %v - %s", err, out))
 	}
 	return out
 }

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

@@ -15,7 +15,7 @@ import (
 
 	"github.com/unknwon/com"
 	"github.com/unknwon/paginater"
-	log "gopkg.in/clog.v1"
+	log "unknwon.dev/clog/v2"
 
 	"gogs.io/gogs/internal/context"
 	"gogs.io/gogs/internal/db"
@@ -891,7 +891,7 @@ func NewComment(c *context.Context, f form.CreateComment) {
 				c.Flash.Info(c.Tr("repo.pulls.open_unmerged_pull_exists", pr.Index))
 			} else {
 				if err = issue.ChangeStatus(c.User, c.Repo.Repository, f.Status == "close"); err != nil {
-					log.Error(2, "ChangeStatus: %v", err)
+					log.Error("ChangeStatus: %v", err)
 				} else {
 					log.Trace("Issue [%d] status changed to closed: %v", issue.ID, issue.IsClosed)
 				}

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

@@ -10,7 +10,7 @@ import (
 	"strings"
 
 	"github.com/unknwon/com"
-	log "gopkg.in/clog.v1"
+	log "unknwon.dev/clog/v2"
 
 	"github.com/gogs/git-module"
 
@@ -28,7 +28,7 @@ const (
 	PULL_COMMITS = "repo/pulls/commits"
 	PULL_FILES   = "repo/pulls/files"
 
-	PULL_REQUEST_TEMPLATE_KEY = "PullRequestTemplate"
+	PULL_REQUEST_TEMPLATE_KEY       = "PullRequestTemplate"
 	PULL_REQUEST_TITLE_TEMPLATE_KEY = "PullRequestTitleTemplate"
 )
 
@@ -648,7 +648,7 @@ func CompareAndPullRequest(c *context.Context) {
 
 	if c.Data[PULL_REQUEST_TITLE_TEMPLATE_KEY] != nil {
 		customTitle := c.Data[PULL_REQUEST_TITLE_TEMPLATE_KEY].(string)
-		r := strings.NewReplacer("{{headBranch}}", headBranch,"{{baseBranch}}", baseBranch)
+		r := strings.NewReplacer("{{headBranch}}", headBranch, "{{baseBranch}}", baseBranch)
 		c.Data["title"] = r.Replace(customTitle)
 	}
 

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

@@ -8,7 +8,7 @@ import (
 	"fmt"
 	"strings"
 
-	log "gopkg.in/clog.v1"
+	log "unknwon.dev/clog/v2"
 
 	"gogs.io/gogs/internal/context"
 	"gogs.io/gogs/internal/db"

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

@@ -11,7 +11,7 @@ import (
 	"strings"
 
 	"github.com/unknwon/com"
-	log "gopkg.in/clog.v1"
+	log "unknwon.dev/clog/v2"
 
 	"github.com/gogs/git-module"
 
@@ -139,7 +139,7 @@ func CreatePost(c *context.Context, f form.CreateRepo) {
 
 	if repo != nil {
 		if errDelete := db.DeleteRepository(ctxUser.ID, repo.ID); errDelete != nil {
-			log.Error(4, "DeleteRepository: %v", errDelete)
+			log.Error("DeleteRepository: %v", errDelete)
 		}
 	}
 
@@ -211,7 +211,7 @@ func MigratePost(c *context.Context, f form.MigrateRepo) {
 
 	if repo != nil {
 		if errDelete := db.DeleteRepository(ctxUser.ID, repo.ID); errDelete != nil {
-			log.Error(4, "DeleteRepository: %v", errDelete)
+			log.Error("DeleteRepository: %v", errDelete)
 		}
 	}
 

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

@@ -12,7 +12,7 @@ import (
 
 	"github.com/gogs/git-module"
 	"github.com/unknwon/com"
-	log "gopkg.in/clog.v1"
+	log "unknwon.dev/clog/v2"
 
 	"gogs.io/gogs/internal/context"
 	"gogs.io/gogs/internal/db"
@@ -100,7 +100,7 @@ func SettingsPost(c *context.Context, f form.RepoSetting) {
 
 		if isNameChanged {
 			if err := db.RenameRepoAction(c.User, oldRepoName, repo); err != nil {
-				log.Error(2, "RenameRepoAction: %v", err)
+				log.Error("RenameRepoAction: %v", err)
 			}
 		}
 
@@ -410,7 +410,7 @@ func ChangeCollaborationAccessMode(c *context.Context) {
 	if err := c.Repo.Repository.ChangeCollaborationAccessMode(
 		c.QueryInt64("uid"),
 		db.AccessMode(c.QueryInt("mode"))); err != nil {
-		log.Error(2, "ChangeCollaborationAccessMode: %v", err)
+		log.Error("ChangeCollaborationAccessMode: %v", err)
 		return
 	}
 

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

@@ -13,7 +13,7 @@ import (
 	"strings"
 
 	"github.com/unknwon/paginater"
-	log "gopkg.in/clog.v1"
+	log "unknwon.dev/clog/v2"
 
 	"github.com/gogs/git-module"
 
@@ -176,7 +176,7 @@ func renderFile(c *context.Context, entry *git.TreeEntry, treeLink, rawLink stri
 			var fileContent string
 			if err, content := template.ToUTF8WithErr(buf); err != nil {
 				if err != nil {
-					log.Error(4, "ToUTF8WithErr: %s", err)
+					log.Error("ToUTF8WithErr: %s", err)
 				}
 				fileContent = string(buf)
 			} else {
@@ -186,7 +186,7 @@ func renderFile(c *context.Context, entry *git.TreeEntry, treeLink, rawLink stri
 			var output bytes.Buffer
 			lines := strings.Split(fileContent, "\n")
 			// Remove blank line at the end of file
-			if len(lines) > 0 && len(lines[len(lines)-1])==0 {
+			if len(lines) > 0 && len(lines[len(lines)-1]) == 0 {
 				lines = lines[:len(lines)-1]
 			}
 			for index, line := range lines {

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

@@ -9,7 +9,7 @@ import (
 	"net/url"
 
 	"github.com/go-macaron/captcha"
-	log "gopkg.in/clog.v1"
+	log "unknwon.dev/clog/v2"
 
 	"gogs.io/gogs/internal/context"
 	"gogs.io/gogs/internal/db"
@@ -239,7 +239,7 @@ func LoginTwoFactorPost(c *context.Context) {
 		return
 	}
 	if err = c.Cache.Put(u.TwoFactorCacheKey(passcode), 1, 60); err != nil {
-		log.Error(2, "Failed to put cache 'two factor passcode': %v", err)
+		log.Error("Failed to put cache 'two factor passcode': %v", err)
 	}
 
 	afterLogin(c, u, c.Session.Get("twoFactorRemember").(bool))
@@ -376,7 +376,7 @@ func SignUpPost(c *context.Context, cpt *captcha.Captcha, f form.Register) {
 		c.Success(ACTIVATE)
 
 		if err := c.Cache.Put(u.MailResendCacheKey(), 1, 180); err != nil {
-			log.Error(2, "Failed to put cache key 'mail resend': %v", err)
+			log.Error("Failed to put cache key 'mail resend': %v", err)
 		}
 		return
 	}
@@ -401,7 +401,7 @@ func Activate(c *context.Context) {
 				mailer.SendActivateAccountMail(c.Context, db.NewMailerUser(c.User))
 
 				if err := c.Cache.Put(c.User.MailResendCacheKey(), 1, 180); err != nil {
-					log.Error(2, "Failed to put cache key 'mail resend': %v", err)
+					log.Error("Failed to put cache key 'mail resend': %v", err)
 				}
 			}
 		} else {
@@ -506,7 +506,7 @@ func ForgotPasswdPost(c *context.Context) {
 
 	mailer.SendResetPasswordMail(c.Context, db.NewMailerUser(u))
 	if err = c.Cache.Put(u.MailResendCacheKey(), 1, 180); err != nil {
-		log.Error(2, "Failed to put cache key 'mail resend': %v", err)
+		log.Error("Failed to put cache key 'mail resend': %v", err)
 	}
 
 	c.Data["Hours"] = setting.Service.ActiveCodeLives / 60

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

@@ -16,7 +16,7 @@ import (
 	"github.com/pquerna/otp"
 	"github.com/pquerna/otp/totp"
 	"github.com/unknwon/com"
-	log "gopkg.in/clog.v1"
+	log "unknwon.dev/clog/v2"
 
 	"gogs.io/gogs/internal/context"
 	"gogs.io/gogs/internal/db"
@@ -144,7 +144,7 @@ func UpdateAvatarSetting(c *context.Context, f form.Avatar, ctxUser *db.User) er
 		// generate a random one when needed.
 		if ctxUser.UseCustomAvatar && !com.IsFile(ctxUser.CustomAvatarPath()) {
 			if err := ctxUser.GenerateRandomAvatar(); err != nil {
-				log.Error(2, "generate random avatar [%d]: %v", ctxUser.ID, err)
+				log.Error("generate random avatar [%d]: %v", ctxUser.ID, err)
 			}
 		}
 	}
@@ -278,7 +278,7 @@ func SettingsEmailPost(c *context.Context, f form.AddEmail) {
 		mailer.SendActivateEmailMail(c.Context, db.NewMailerUser(c.User), email.Email)
 
 		if err := c.Cache.Put("MailResendLimit_"+c.User.LowerName, c.User.LowerName, 180); err != nil {
-			log.Error(2, "Set cache 'MailResendLimit' failed: %v", err)
+			log.Error("Set cache 'MailResendLimit' failed: %v", err)
 		}
 		c.Flash.Info(c.Tr("settings.add_email_confirmation_sent", email.Email, setting.Service.ActiveCodeLives/60))
 	} else {

+ 182 - 136
internal/setting/setting.go

@@ -22,8 +22,8 @@ import (
 	_ "github.com/go-macaron/session/redis"
 	"github.com/mcuadros/go-version"
 	"github.com/unknwon/com"
-	log "gopkg.in/clog.v1"
 	"gopkg.in/ini.v1"
+	log "unknwon.dev/clog/v2"
 
 	"github.com/gogs/go-libravatar"
 
@@ -346,15 +346,19 @@ func execPath() (string, error) {
 
 func init() {
 	IsWindows = runtime.GOOS == "windows"
-	log.New(log.CONSOLE, log.ConsoleConfig{})
 
-	var err error
-	if AppPath, err = execPath(); err != nil {
-		log.Fatal(2, "Fail to get app path: %v\n", err)
+	err := log.NewConsole()
+	if err != nil {
+		panic("init console logger: " + err.Error())
+	}
+
+	AppPath, err = execPath()
+	if err != nil {
+		log.Fatal("Failed to get executable path: %v", err)
 	}
 
-	// Note: we don't use path.Dir here because it does not handle case
-	//	which path starts with two "/" in Windows: "//psf/Home/..."
+	// NOTE: we don't use path.Dir here because it does not handle case
+	// which path starts with two "/" in Windows: "//psf/Home/..."
 	AppPath = strings.Replace(AppPath, "\\", "/", -1)
 }
 
@@ -374,7 +378,7 @@ func WorkDir() (string, error) {
 
 func forcePathSeparator(path string) {
 	if strings.Contains(path, "\\") {
-		log.Fatal(2, "Do not use '\\' or '\\\\' in paths, instead, please use '/' in all places")
+		log.Fatal("Do not use '\\' or '\\\\' in paths, please use '/' in all places")
 	}
 }
 
@@ -394,31 +398,33 @@ func IsRunUserMatchCurrentUser(runUser string) (string, bool) {
 // getOpenSSHVersion parses and returns string representation of OpenSSH version
 // returned by command "ssh -V".
 func getOpenSSHVersion() string {
-	// Note: somehow version is printed to stderr
-	_, stderr, err := process.Exec("getOpenSSHVersion", "ssh", "-V")
+	// NOTE: Somehow the version is printed to stderr.
+	_, stderr, err := process.Exec("setting.getOpenSSHVersion", "ssh", "-V")
 	if err != nil {
-		log.Fatal(2, "Fail to get OpenSSH version: %v - %s", err, stderr)
+		log.Fatal("Failed to get OpenSSH version: %v - %s", err, stderr)
 	}
 
-	// Trim unused information: https://gogs.io/gogs/issues/4507#issuecomment-305150441
+	// Trim unused information: https://github.com/gogs/gogs/issues/4507#issuecomment-305150441
 	version := strings.TrimRight(strings.Fields(stderr)[0], ",1234567890")
 	version = strings.TrimSuffix(strings.TrimPrefix(version, "OpenSSH_"), "p")
 	return version
 }
 
-// NewContext initializes configuration context.
-// NOTE: do not print any log except error.
-func NewContext() {
+// Init initializes configuration by loading from sources.
+// ⚠️ WARNING: Do not print anything in this function other than wanrings or errors.
+func Init() {
 	workDir, err := WorkDir()
 	if err != nil {
-		log.Fatal(2, "Fail to get work directory: %v", err)
+		log.Fatal("Failed to get work directory: %v", err)
+		return
 	}
 
 	Cfg, err = ini.LoadSources(ini.LoadOptions{
 		IgnoreInlineComment: true,
 	}, conf.MustAsset("conf/app.ini"))
 	if err != nil {
-		log.Fatal(2, "Fail to parse 'conf/app.ini': %v", err)
+		log.Fatal("Failed to parse 'conf/app.ini': %v", err)
+		return
 	}
 
 	CustomPath = os.Getenv("GOGS_CUSTOM")
@@ -432,16 +438,18 @@ func NewContext() {
 
 	if com.IsFile(CustomConf) {
 		if err = Cfg.Append(CustomConf); err != nil {
-			log.Fatal(2, "Fail to load custom conf '%s': %v", CustomConf, err)
+			log.Fatal("Failed to load custom conf %q: %v", CustomConf, err)
+			return
 		}
 	} else {
-		log.Warn("Custom config '%s' not found, ignore this if you're running first time", CustomConf)
+		log.Warn("Custom config '%s' not found, ignore this warning if you're running the first time", CustomConf)
 	}
-	Cfg.NameMapper = ini.AllCapsUnderscore
+	Cfg.NameMapper = ini.SnackCase
 
 	homeDir, err := com.HomeDir()
 	if err != nil {
-		log.Fatal(2, "Fail to get home directory: %v", err)
+		log.Fatal("Failed to get home directory: %v", err)
+		return
 	}
 	homeDir = strings.Replace(homeDir, "\\", "/", -1)
 
@@ -458,7 +466,8 @@ func NewContext() {
 	// Check if has app suburl.
 	url, err := url.Parse(AppURL)
 	if err != nil {
-		log.Fatal(2, "Invalid ROOT_URL '%s': %s", AppURL, err)
+		log.Fatal("Failed to parse ROOT_URL %q: %s", AppURL, err)
+		return
 	}
 	// Suburl should start with '/' and end without '/', such as '/{subpath}'.
 	// This value is empty if site does not have sub-url.
@@ -479,7 +488,8 @@ func NewContext() {
 		UnixSocketPermissionRaw := sec.Key("UNIX_SOCKET_PERMISSION").MustString("666")
 		UnixSocketPermissionParsed, err := strconv.ParseUint(UnixSocketPermissionRaw, 8, 32)
 		if err != nil || UnixSocketPermissionParsed > 0777 {
-			log.Fatal(2, "Fail to parse unixSocketPermission: %s", UnixSocketPermissionRaw)
+			log.Fatal("Failed to parse unixSocketPermission %q: %v", UnixSocketPermissionRaw, err)
+			return
 		}
 		UnixSocketPermission = uint32(UnixSocketPermissionParsed)
 	}
@@ -506,7 +516,8 @@ func NewContext() {
 	SSH.ServerCiphers = sec.Key("SSH_SERVER_CIPHERS").Strings(",")
 	SSH.KeyTestPath = os.TempDir()
 	if err = Cfg.Section("server").MapTo(&SSH); err != nil {
-		log.Fatal(2, "Fail to map SSH settings: %v", err)
+		log.Fatal("Failed to map SSH settings: %v", err)
+		return
 	}
 	if SSH.Disabled {
 		SSH.StartBuiltinServer = false
@@ -515,9 +526,11 @@ func NewContext() {
 
 	if !SSH.Disabled && !SSH.StartBuiltinServer {
 		if err := os.MkdirAll(SSH.RootPath, 0700); err != nil {
-			log.Fatal(2, "Fail to create '%s': %v", SSH.RootPath, err)
+			log.Fatal("Failed to create '%s': %v", SSH.RootPath, err)
+			return
 		} else if err = os.MkdirAll(SSH.KeyTestPath, 0644); err != nil {
-			log.Fatal(2, "Fail to create '%s': %v", SSH.KeyTestPath, err)
+			log.Fatal("Failed to create '%s': %v", SSH.KeyTestPath, err)
+			return
 		}
 	}
 
@@ -589,7 +602,8 @@ func NewContext() {
 	if InstallLock {
 		currentUser, match := IsRunUserMatchCurrentUser(RunUser)
 		if !match {
-			log.Fatal(2, "Expect user '%s' but current user is: %s", RunUser, currentUser)
+			log.Fatal("The user configured to run Gogs is %q, but the current user is %q", RunUser, currentUser)
+			return
 		}
 	}
 
@@ -606,11 +620,14 @@ func NewContext() {
 	}
 	ScriptType = sec.Key("SCRIPT_TYPE").MustString("bash")
 	if err = Cfg.Section("repository").MapTo(&Repository); err != nil {
-		log.Fatal(2, "Fail to map Repository settings: %v", err)
+		log.Fatal("Failed to map Repository settings: %v", err)
+		return
 	} else if err = Cfg.Section("repository.editor").MapTo(&Repository.Editor); err != nil {
-		log.Fatal(2, "Fail to map Repository.Editor settings: %v", err)
+		log.Fatal("Failed to map Repository.Editor settings: %v", err)
+		return
 	} else if err = Cfg.Section("repository.upload").MapTo(&Repository.Upload); err != nil {
-		log.Fatal(2, "Fail to map Repository.Upload settings: %v", err)
+		log.Fatal("Failed to map Repository.Upload settings: %v", err)
+		return
 	}
 
 	if !filepath.IsAbs(Repository.Upload.TempPath) {
@@ -663,29 +680,41 @@ func NewContext() {
 	}
 
 	if err = Cfg.Section("http").MapTo(&HTTP); err != nil {
-		log.Fatal(2, "Failed to map HTTP settings: %v", err)
+		log.Fatal("Failed to map HTTP settings: %v", err)
+		return
 	} else if err = Cfg.Section("webhook").MapTo(&Webhook); err != nil {
-		log.Fatal(2, "Failed to map Webhook settings: %v", err)
+		log.Fatal("Failed to map Webhook settings: %v", err)
+		return
 	} else if err = Cfg.Section("release.attachment").MapTo(&Release.Attachment); err != nil {
-		log.Fatal(2, "Failed to map Release.Attachment settings: %v", err)
+		log.Fatal("Failed to map Release.Attachment settings: %v", err)
+		return
 	} else if err = Cfg.Section("markdown").MapTo(&Markdown); err != nil {
-		log.Fatal(2, "Failed to map Markdown settings: %v", err)
+		log.Fatal("Failed to map Markdown settings: %v", err)
+		return
 	} else if err = Cfg.Section("smartypants").MapTo(&Smartypants); err != nil {
-		log.Fatal(2, "Failed to map Smartypants settings: %v", err)
+		log.Fatal("Failed to map Smartypants settings: %v", err)
+		return
 	} else if err = Cfg.Section("admin").MapTo(&Admin); err != nil {
-		log.Fatal(2, "Failed to map Admin settings: %v", err)
+		log.Fatal("Failed to map Admin settings: %v", err)
+		return
 	} else if err = Cfg.Section("cron").MapTo(&Cron); err != nil {
-		log.Fatal(2, "Failed to map Cron settings: %v", err)
+		log.Fatal("Failed to map Cron settings: %v", err)
+		return
 	} else if err = Cfg.Section("git").MapTo(&Git); err != nil {
-		log.Fatal(2, "Failed to map Git settings: %v", err)
+		log.Fatal("Failed to map Git settings: %v", err)
+		return
 	} else if err = Cfg.Section("mirror").MapTo(&Mirror); err != nil {
-		log.Fatal(2, "Failed to map Mirror settings: %v", err)
+		log.Fatal("Failed to map Mirror settings: %v", err)
+		return
 	} else if err = Cfg.Section("api").MapTo(&API); err != nil {
-		log.Fatal(2, "Failed to map API settings: %v", err)
+		log.Fatal("Failed to map API settings: %v", err)
+		return
 	} else if err = Cfg.Section("ui").MapTo(&UI); err != nil {
-		log.Fatal(2, "Failed to map UI settings: %v", err)
+		log.Fatal("Failed to map UI settings: %v", err)
+		return
 	} else if err = Cfg.Section("prometheus").MapTo(&Prometheus); err != nil {
-		log.Fatal(2, "Failed to map Prometheus settings: %v", err)
+		log.Fatal("Failed to map Prometheus settings: %v", err)
+		return
 	}
 
 	if Mirror.DefaultInterval <= 0 {
@@ -702,123 +731,139 @@ func NewContext() {
 	HasRobotsTxt = com.IsFile(path.Join(CustomPath, "robots.txt"))
 }
 
-var Service struct {
-	ActiveCodeLives                int
-	ResetPwdCodeLives              int
-	RegisterEmailConfirm           bool
-	DisableRegistration            bool
-	ShowRegistrationButton         bool
-	RequireSignInView              bool
-	EnableNotifyMail               bool
-	EnableReverseProxyAuth         bool
-	EnableReverseProxyAutoRegister bool
-	EnableCaptcha                  bool
-}
-
-func newService() {
-	sec := Cfg.Section("service")
-	Service.ActiveCodeLives = sec.Key("ACTIVE_CODE_LIVE_MINUTES").MustInt(180)
-	Service.ResetPwdCodeLives = sec.Key("RESET_PASSWD_CODE_LIVE_MINUTES").MustInt(180)
-	Service.DisableRegistration = sec.Key("DISABLE_REGISTRATION").MustBool()
-	Service.ShowRegistrationButton = sec.Key("SHOW_REGISTRATION_BUTTON").MustBool(!Service.DisableRegistration)
-	Service.RequireSignInView = sec.Key("REQUIRE_SIGNIN_VIEW").MustBool()
-	Service.EnableReverseProxyAuth = sec.Key("ENABLE_REVERSE_PROXY_AUTHENTICATION").MustBool()
-	Service.EnableReverseProxyAutoRegister = sec.Key("ENABLE_REVERSE_PROXY_AUTO_REGISTRATION").MustBool()
-	Service.EnableCaptcha = sec.Key("ENABLE_CAPTCHA").MustBool()
-}
-
-func newLogService() {
-	if len(BuildTime) > 0 {
-		log.Trace("Build time: %s", BuildTime)
-		log.Trace("Build commit: %s", BuildCommit)
-	}
-
-	// Because we always create a console logger as primary logger before all settings are loaded,
-	// thus if user doesn't set console logger, we should remove it after other loggers are created.
+// InitLogging initializes the logging infrastructure of the application.
+func InitLogging() {
+	// Because we always create a console logger as the primary logger at init time,
+	// we need to remove it in case the user doesn't configure to use it after the
+	// logging infrastructure is initalized.
 	hasConsole := false
 
-	// Get and check log modes.
+	// Iterate over [log.*] sections to initialize individual logger.
 	LogModes = strings.Split(Cfg.Section("log").Key("MODE").MustString("console"), ",")
 	LogConfigs = make([]interface{}, len(LogModes))
-	levelNames := map[string]log.LEVEL{
-		"trace": log.TRACE,
-		"info":  log.INFO,
-		"warn":  log.WARN,
-		"error": log.ERROR,
-		"fatal": log.FATAL,
+	levelMappings := map[string]log.Level{
+		"trace": log.LevelTrace,
+		"info":  log.LevelInfo,
+		"warn":  log.LevelWarn,
+		"error": log.LevelError,
+		"fatal": log.LevelFatal,
+	}
+
+	type config struct {
+		Buffer int64
+		Config interface{}
 	}
 	for i, mode := range LogModes {
 		mode = strings.ToLower(strings.TrimSpace(mode))
-		sec, err := Cfg.GetSection("log." + mode)
+		secName := "log." + mode
+		sec, err := Cfg.GetSection(secName)
 		if err != nil {
-			log.Fatal(2, "Unknown logger mode: %s", mode)
+			log.Fatal("Missing configuration section [%s] for %q logger", secName, mode)
+			return
 		}
 
-		validLevels := []string{"trace", "info", "warn", "error", "fatal"}
-		name := Cfg.Section("log." + mode).Key("LEVEL").Validate(func(v string) string {
-			v = strings.ToLower(v)
-			if com.IsSliceContainsStr(validLevels, v) {
-				return v
-			}
-			return "trace"
-		})
-		level := levelNames[name]
-
-		// Generate log configuration.
-		switch log.MODE(mode) {
-		case log.CONSOLE:
+		level := levelMappings[sec.Key("LEVEL").MustString("trace")]
+		buffer := sec.Key("BUFFER_LEN").MustInt64(100)
+		c := new(config)
+		switch mode {
+		case log.DefaultConsoleName:
 			hasConsole = true
-			LogConfigs[i] = log.ConsoleConfig{
-				Level:      level,
-				BufferSize: Cfg.Section("log").Key("BUFFER_LEN").MustInt64(100),
+			c = &config{
+				Buffer: buffer,
+				Config: log.ConsoleConfig{
+					Level: level,
+				},
 			}
-
-		case log.FILE:
-			logPath := path.Join(LogRootPath, "gogs.log")
-			if err = os.MkdirAll(path.Dir(logPath), os.ModePerm); err != nil {
-				log.Fatal(2, "Fail to create log directory '%s': %v", path.Dir(logPath), err)
+			err = log.NewConsole(c.Buffer, c.Config)
+
+		case log.DefaultFileName:
+			logPath := filepath.Join(LogRootPath, "gogs.log")
+			logDir := filepath.Dir(logPath)
+			err = os.MkdirAll(logDir, os.ModePerm)
+			if err != nil {
+				log.Fatal("Failed to create log directory %q: %v", logDir, err)
+				return
 			}
 
-			LogConfigs[i] = log.FileConfig{
-				Level:      level,
-				BufferSize: Cfg.Section("log").Key("BUFFER_LEN").MustInt64(100),
-				Filename:   logPath,
-				FileRotationConfig: log.FileRotationConfig{
-					Rotate:   sec.Key("LOG_ROTATE").MustBool(true),
-					Daily:    sec.Key("DAILY_ROTATE").MustBool(true),
-					MaxSize:  1 << uint(sec.Key("MAX_SIZE_SHIFT").MustInt(28)),
-					MaxLines: sec.Key("MAX_LINES").MustInt64(1000000),
-					MaxDays:  sec.Key("MAX_DAYS").MustInt64(7),
+			c = &config{
+				Buffer: buffer,
+				Config: log.FileConfig{
+					Level:    level,
+					Filename: logPath,
+					FileRotationConfig: log.FileRotationConfig{
+						Rotate:   sec.Key("LOG_ROTATE").MustBool(true),
+						Daily:    sec.Key("DAILY_ROTATE").MustBool(true),
+						MaxSize:  1 << uint(sec.Key("MAX_SIZE_SHIFT").MustInt(28)),
+						MaxLines: sec.Key("MAX_LINES").MustInt64(1000000),
+						MaxDays:  sec.Key("MAX_DAYS").MustInt64(7),
+					},
 				},
 			}
-
-		case log.SLACK:
-			LogConfigs[i] = log.SlackConfig{
-				Level:      level,
-				BufferSize: Cfg.Section("log").Key("BUFFER_LEN").MustInt64(100),
-				URL:        sec.Key("URL").String(),
+			err = log.NewFile(c.Buffer, c.Config)
+
+		case log.DefaultSlackName:
+			c = &config{
+				Buffer: buffer,
+				Config: log.SlackConfig{
+					Level: level,
+					URL:   sec.Key("URL").String(),
+				},
 			}
-
-		case log.DISCORD:
-			LogConfigs[i] = log.DiscordConfig{
-				Level:      level,
-				BufferSize: Cfg.Section("log").Key("BUFFER_LEN").MustInt64(100),
-				URL:        sec.Key("URL").String(),
-				Username:   sec.Key("USERNAME").String(),
+			err = log.NewSlack(c.Buffer, c.Config)
+
+		case log.DefaultDiscordName:
+			c = &config{
+				Buffer: buffer,
+				Config: log.DiscordConfig{
+					Level:    level,
+					URL:      sec.Key("URL").String(),
+					Username: sec.Key("USERNAME").String(),
+				},
 			}
+
+		default:
+			continue
 		}
 
-		log.New(log.MODE(mode), LogConfigs[i])
-		log.Trace("Log mode: %s (%s)", strings.Title(mode), strings.Title(name))
+		if err != nil {
+			log.Fatal("Failed to init %s logger: %v", mode, err)
+			return
+		}
+		LogConfigs[i] = c
+
+		log.Trace("Log mode: %s (%s)", strings.Title(mode), strings.Title(strings.ToLower(level.String())))
 	}
 
-	// Make sure everyone gets version info printed.
-	log.Info("%s %s", AppName, AppVersion)
 	if !hasConsole {
-		log.Delete(log.CONSOLE)
+		log.Remove(log.DefaultConsoleName)
 	}
 }
 
+var Service struct {
+	ActiveCodeLives                int
+	ResetPwdCodeLives              int
+	RegisterEmailConfirm           bool
+	DisableRegistration            bool
+	ShowRegistrationButton         bool
+	RequireSignInView              bool
+	EnableNotifyMail               bool
+	EnableReverseProxyAuth         bool
+	EnableReverseProxyAutoRegister bool
+	EnableCaptcha                  bool
+}
+
+func newService() {
+	sec := Cfg.Section("service")
+	Service.ActiveCodeLives = sec.Key("ACTIVE_CODE_LIVE_MINUTES").MustInt(180)
+	Service.ResetPwdCodeLives = sec.Key("RESET_PASSWD_CODE_LIVE_MINUTES").MustInt(180)
+	Service.DisableRegistration = sec.Key("DISABLE_REGISTRATION").MustBool()
+	Service.ShowRegistrationButton = sec.Key("SHOW_REGISTRATION_BUTTON").MustBool(!Service.DisableRegistration)
+	Service.RequireSignInView = sec.Key("REQUIRE_SIGNIN_VIEW").MustBool()
+	Service.EnableReverseProxyAuth = sec.Key("ENABLE_REVERSE_PROXY_AUTHENTICATION").MustBool()
+	Service.EnableReverseProxyAutoRegister = sec.Key("ENABLE_REVERSE_PROXY_AUTO_REGISTRATION").MustBool()
+	Service.EnableCaptcha = sec.Key("ENABLE_CAPTCHA").MustBool()
+}
+
 func newCacheService() {
 	CacheAdapter = Cfg.Section("cache").Key("ADAPTER").In("memory", []string{"memory", "redis", "memcache"})
 	switch CacheAdapter {
@@ -827,7 +872,8 @@ func newCacheService() {
 	case "redis", "memcache":
 		CacheConn = strings.Trim(Cfg.Section("cache").Key("HOST").String(), "\" ")
 	default:
-		log.Fatal(2, "Unknown cache adapter: %s", CacheAdapter)
+		log.Fatal("Unrecognized cache adapter %q", CacheAdapter)
+		return
 	}
 
 	log.Trace("Cache service is enabled")
@@ -896,7 +942,8 @@ func newMailService() {
 	if len(MailService.From) > 0 {
 		parsed, err := mail.ParseAddress(MailService.From)
 		if err != nil {
-			log.Fatal(2, "Invalid mailer.FROM (%s): %v", MailService.From, err)
+			log.Fatal("Failed to parse value %q for '[mailer] FROM': %v", MailService.From, err)
+			return
 		}
 		MailService.FromEmail = parsed.Address
 	}
@@ -941,7 +988,6 @@ func NewService() {
 
 func NewServices() {
 	newService()
-	newLogService()
 	newCacheService()
 	newSessionService()
 	newMailService()

+ 15 - 15
internal/ssh/ssh.go

@@ -16,7 +16,7 @@ import (
 
 	"github.com/unknwon/com"
 	"golang.org/x/crypto/ssh"
-	log "gopkg.in/clog.v1"
+	log "unknwon.dev/clog/v2"
 
 	"gogs.io/gogs/internal/db"
 	"gogs.io/gogs/internal/setting"
@@ -39,7 +39,7 @@ func handleServerConn(keyID string, chans <-chan ssh.NewChannel) {
 
 		ch, reqs, err := newChan.Accept()
 		if err != nil {
-			log.Error(3, "Error accepting channel: %v", err)
+			log.Error("Error accepting channel: %v", err)
 			continue
 		}
 
@@ -57,7 +57,7 @@ func handleServerConn(keyID string, chans <-chan ssh.NewChannel) {
 					args[0] = strings.TrimLeft(args[0], "\x04")
 					_, _, err := com.ExecCmdBytes("env", args[0]+"="+args[1])
 					if err != nil {
-						log.Error(3, "env: %v", err)
+						log.Error("env: %v", err)
 						return
 					}
 				case "exec":
@@ -71,23 +71,23 @@ func handleServerConn(keyID string, chans <-chan ssh.NewChannel) {
 
 					stdout, err := cmd.StdoutPipe()
 					if err != nil {
-						log.Error(3, "SSH: StdoutPipe: %v", err)
+						log.Error("SSH: StdoutPipe: %v", err)
 						return
 					}
 					stderr, err := cmd.StderrPipe()
 					if err != nil {
-						log.Error(3, "SSH: StderrPipe: %v", err)
+						log.Error("SSH: StderrPipe: %v", err)
 						return
 					}
 					input, err := cmd.StdinPipe()
 					if err != nil {
-						log.Error(3, "SSH: StdinPipe: %v", err)
+						log.Error("SSH: StdinPipe: %v", err)
 						return
 					}
 
 					// FIXME: check timeout
 					if err = cmd.Start(); err != nil {
-						log.Error(3, "SSH: Start: %v", err)
+						log.Error("SSH: Start: %v", err)
 						return
 					}
 
@@ -97,7 +97,7 @@ func handleServerConn(keyID string, chans <-chan ssh.NewChannel) {
 					io.Copy(ch.Stderr(), stderr)
 
 					if err = cmd.Wait(); err != nil {
-						log.Error(3, "SSH: Wait: %v", err)
+						log.Error("SSH: Wait: %v", err)
 						return
 					}
 
@@ -113,13 +113,13 @@ func handleServerConn(keyID string, chans <-chan ssh.NewChannel) {
 func listen(config *ssh.ServerConfig, host string, port int) {
 	listener, err := net.Listen("tcp", host+":"+com.ToStr(port))
 	if err != nil {
-		log.Fatal(4, "Fail to start SSH server: %v", err)
+		log.Fatal("Failed to start SSH server: %v", err)
 	}
 	for {
 		// Once a ServerConfig has been configured, connections can be accepted.
 		conn, err := listener.Accept()
 		if err != nil {
-			log.Error(3, "SSH: Error accepting incoming connection: %v", err)
+			log.Error("SSH: Error accepting incoming connection: %v", err)
 			continue
 		}
 
@@ -134,7 +134,7 @@ func listen(config *ssh.ServerConfig, host string, port int) {
 				if err == io.EOF {
 					log.Warn("SSH: Handshaking was terminated: %v", err)
 				} else {
-					log.Error(3, "SSH: Error on handshaking: %v", err)
+					log.Error("SSH: Error on handshaking: %v", err)
 				}
 				return
 			}
@@ -156,7 +156,7 @@ func Listen(host string, port int, ciphers []string) {
 		PublicKeyCallback: func(conn ssh.ConnMetadata, key ssh.PublicKey) (*ssh.Permissions, error) {
 			pkey, err := db.SearchPublicKeyByContent(strings.TrimSpace(string(ssh.MarshalAuthorizedKey(key))))
 			if err != nil {
-				log.Error(3, "SearchPublicKeyByContent: %v", err)
+				log.Error("SearchPublicKeyByContent: %v", err)
 				return nil, err
 			}
 			return &ssh.Permissions{Extensions: map[string]string{"key-id": com.ToStr(pkey.ID)}}, nil
@@ -168,18 +168,18 @@ func Listen(host string, port int, ciphers []string) {
 		os.MkdirAll(filepath.Dir(keyPath), os.ModePerm)
 		_, stderr, err := com.ExecCmd(setting.SSH.KeygenPath, "-f", keyPath, "-t", "rsa", "-m", "PEM", "-N", "")
 		if err != nil {
-			panic(fmt.Sprintf("Fail to generate private key: %v - %s", err, stderr))
+			panic(fmt.Sprintf("Failed to generate private key: %v - %s", err, stderr))
 		}
 		log.Trace("SSH: New private key is generateed: %s", keyPath)
 	}
 
 	privateBytes, err := ioutil.ReadFile(keyPath)
 	if err != nil {
-		panic("SSH: Fail to load private key: " + err.Error())
+		panic("SSH: Failed to load private key: " + err.Error())
 	}
 	private, err := ssh.ParsePrivateKey(privateBytes)
 	if err != nil {
-		panic("SSH: Fail to parse private key: " + err.Error())
+		panic("SSH: Failed to parse private key: " + err.Error())
 	}
 	config.AddHostKey(private)
 

+ 2 - 2
internal/template/template.go

@@ -19,7 +19,7 @@ import (
 	"github.com/microcosm-cc/bluemonday"
 	"golang.org/x/net/html/charset"
 	"golang.org/x/text/transform"
-	log "gopkg.in/clog.v1"
+	log "unknwon.dev/clog/v2"
 
 	"gogs.io/gogs/internal/db"
 	"gogs.io/gogs/internal/markup"
@@ -292,7 +292,7 @@ func ActionIcon(opType int) string {
 func ActionContent2Commits(act Actioner) *db.PushCommits {
 	push := db.NewPushCommits()
 	if err := jsoniter.Unmarshal([]byte(act.GetContent()), push); err != nil {
-		log.Error(4, "Unmarshal:\n%s\nERROR: %v", act.GetContent(), err)
+		log.Error("Unmarshal:\n%s\nERROR: %v", act.GetContent(), err)
 	}
 	return push
 }

+ 1 - 1
internal/tool/tool.go

@@ -20,7 +20,7 @@ import (
 
 	"github.com/unknwon/com"
 	"github.com/unknwon/i18n"
-	log "gopkg.in/clog.v1"
+	log "unknwon.dev/clog/v2"
 
 	"github.com/gogs/chardet"
 

Some files were not shown because too many files changed in this diff