This is an automated email from the ASF dual-hosted git repository.
linkinstar pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/answer.git
The following commit(s) were added to refs/heads/dev by this push:
new b83d0214 feat(ci): add lint action
b83d0214 is described below
commit b83d0214c70126bbb6c97db38e9c239480eb2df7
Author: ferhat elmas <[email protected]>
AuthorDate: Fri Jan 23 21:43:40 2026 +0100
feat(ci): add lint action
related to #1432
Signed-off-by: ferhat elmas <[email protected]>
---
.github/workflows/lint.yml | 62 ++++++++++++++++++++++++++++++++++++
cmd/wire_gen.go | 48 ++++++++++++++--------------
go.mod | 2 +-
internal/base/translator/provider.go | 4 +--
script/check-asf-header.sh | 2 +-
5 files changed, 90 insertions(+), 28 deletions(-)
diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml
new file mode 100644
index 00000000..53463b39
--- /dev/null
+++ b/.github/workflows/lint.yml
@@ -0,0 +1,62 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+name: Lint
+
+on:
+ push:
+ pull_request:
+
+concurrency:
+ group: ${{ github.workflow }}-${{ github.event_name }}-${{
github.event.number || github.run_id }}
+ cancel-in-progress: true
+
+jobs:
+ lint:
+ name: Lint (${{ matrix.os }})
+ runs-on: ${{ matrix.os }}
+ timeout-minutes: 15
+ strategy:
+ fail-fast: false
+ matrix:
+ os: [ubuntu-latest]
+
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+
+ - name: Setup Go
+ uses: actions/setup-go@v5
+ with:
+ go-version: "1.23"
+ cache: true
+
+ - name: Run go mod tidy
+ run: go mod tidy
+
+ - name: Run golangci-lint
+ run: make lint
+
+ - name: Check for uncommitted changes
+ shell: bash
+ run: |
+ if [ -n "$(git status --porcelain)" ]; then
+ echo "::error::Uncommitted changes detected"
+ git status
+ git diff
+ exit 1
+ fi
diff --git a/cmd/wire_gen.go b/cmd/wire_gen.go
index 22a70f29..5b999021 100644
--- a/cmd/wire_gen.go
+++ b/cmd/wire_gen.go
@@ -172,29 +172,29 @@ func initApplication(debug bool, serverConf *conf.Server,
dbConf *data.Database,
tagRepo := tag.NewTagRepo(dataData, uniqueIDRepo)
revisionRepo := revision.NewRevisionRepo(dataData, uniqueIDRepo)
revisionService := revision_common.NewRevisionService(revisionRepo,
userRepo)
- v := activityqueue.NewService()
- tagCommonService := tag_common2.NewTagCommonService(tagCommonRepo,
tagRelRepo, tagRepo, revisionService, siteInfoCommonService, v)
+ service := activityqueue.NewService()
+ tagCommonService := tag_common2.NewTagCommonService(tagCommonRepo,
tagRelRepo, tagRepo, revisionService, siteInfoCommonService, service)
collectionRepo := collection.NewCollectionRepo(dataData, uniqueIDRepo)
collectionCommon := collectioncommon.NewCollectionCommon(collectionRepo)
answerCommon := answercommon.NewAnswerCommon(answerRepo)
metaRepo := meta.NewMetaRepo(dataData)
metaCommonService := metacommon.NewMetaCommonService(metaRepo)
- questionCommon := questioncommon.NewQuestionCommon(questionRepo,
answerRepo, voteRepo, followRepo, tagCommonService, userCommon,
collectionCommon, answerCommon, metaCommonService, configService, v,
revisionRepo, siteInfoCommonService, dataData)
- v2 := eventqueue.NewService()
+ questionCommon := questioncommon.NewQuestionCommon(questionRepo,
answerRepo, voteRepo, followRepo, tagCommonService, userCommon,
collectionCommon, answerCommon, metaCommonService, configService, service,
revisionRepo, siteInfoCommonService, dataData)
+ eventqueueService := eventqueue.NewService()
fileRecordRepo := file_record.NewFileRecordRepo(dataData)
fileRecordService := file_record2.NewFileRecordService(fileRecordRepo,
revisionRepo, serviceConf, siteInfoCommonService, userCommon)
- userService := content.NewUserService(userRepo, userActiveActivityRepo,
activityRepo, emailService, authService, siteInfoCommonService,
userRoleRelService, userCommon, userExternalLoginService,
userNotificationConfigRepo, userNotificationConfigService, questionCommon, v2,
fileRecordService)
+ userService := content.NewUserService(userRepo, userActiveActivityRepo,
activityRepo, emailService, authService, siteInfoCommonService,
userRoleRelService, userCommon, userExternalLoginService,
userNotificationConfigRepo, userNotificationConfigService, questionCommon,
eventqueueService, fileRecordService)
captchaRepo := captcha.NewCaptchaRepo(dataData)
captchaService := action.NewCaptchaService(captchaRepo)
userController := controller.NewUserController(authService,
userService, captchaService, emailService, siteInfoCommonService,
userNotificationConfigService)
commentRepo := comment.NewCommentRepo(dataData, uniqueIDRepo)
commentCommonRepo := comment.NewCommentCommonRepo(dataData,
uniqueIDRepo)
objService := object_info.NewObjService(answerRepo, questionRepo,
commentCommonRepo, tagCommonRepo, tagCommonService)
- v3 := noticequeue.NewService()
- v4 := noticequeue.NewExternalService()
+ noticequeueService := noticequeue.NewService()
+ externalService := noticequeue.NewExternalService()
reviewRepo := review.NewReviewRepo(dataData)
- reviewService := review2.NewReviewService(reviewRepo, objService,
userCommon, userRepo, questionRepo, answerRepo, userRoleRelService, v4,
tagCommonService, questionCommon, v3, siteInfoCommonService, commentCommonRepo)
- commentService := comment2.NewCommentService(commentRepo,
commentCommonRepo, userCommon, objService, voteRepo, emailService, userRepo,
v3, v4, v, v2, reviewService)
+ reviewService := review2.NewReviewService(reviewRepo, objService,
userCommon, userRepo, questionRepo, answerRepo, userRoleRelService,
externalService, tagCommonService, questionCommon, noticequeueService,
siteInfoCommonService, commentCommonRepo)
+ commentService := comment2.NewCommentService(commentRepo,
commentCommonRepo, userCommon, objService, voteRepo, emailService, userRepo,
noticequeueService, externalService, service, eventqueueService, reviewService)
rolePowerRelRepo := role.NewRolePowerRelRepo(dataData)
rolePowerRelService := role2.NewRolePowerRelService(rolePowerRelRepo,
userRoleRelService)
rankService := rank2.NewRankService(userCommon, userRankRepo,
objService, userRoleRelService, rolePowerRelService, configService)
@@ -202,17 +202,17 @@ func initApplication(debug bool, serverConf *conf.Server,
dbConf *data.Database,
rateLimitMiddleware := middleware.NewRateLimitMiddleware(limitRepo)
commentController := controller.NewCommentController(commentService,
rankService, captchaService, rateLimitMiddleware)
reportRepo := report.NewReportRepo(dataData, uniqueIDRepo)
- tagService := tag2.NewTagService(tagRepo, tagCommonService,
revisionService, followRepo, siteInfoCommonService, v)
- answerActivityRepo := activity.NewAnswerActivityRepo(dataData,
activityRepo, userRankRepo, v3)
+ tagService := tag2.NewTagService(tagRepo, tagCommonService,
revisionService, followRepo, siteInfoCommonService, service)
+ answerActivityRepo := activity.NewAnswerActivityRepo(dataData,
activityRepo, userRankRepo, noticequeueService)
answerActivityService :=
activity2.NewAnswerActivityService(answerActivityRepo, configService)
- externalNotificationService :=
notification.NewExternalNotificationService(dataData,
userNotificationConfigRepo, followRepo, emailService, userRepo, v4,
userExternalLoginRepo, siteInfoCommonService)
- questionService := content.NewQuestionService(activityRepo,
questionRepo, answerRepo, tagCommonService, tagService, questionCommon,
userCommon, userRepo, userRoleRelService, revisionService, metaCommonService,
collectionCommon, answerActivityService, emailService, v3, v4, v,
siteInfoCommonService, externalNotificationService, reviewService,
configService, v2, reviewRepo)
- answerService := content.NewAnswerService(answerRepo, questionRepo,
questionCommon, userCommon, collectionCommon, userRepo, revisionService,
answerActivityService, answerCommon, voteRepo, emailService,
userRoleRelService, v3, v4, v, reviewService, v2)
+ externalNotificationService :=
notification.NewExternalNotificationService(dataData,
userNotificationConfigRepo, followRepo, emailService, userRepo,
externalService, userExternalLoginRepo, siteInfoCommonService)
+ questionService := content.NewQuestionService(activityRepo,
questionRepo, answerRepo, tagCommonService, tagService, questionCommon,
userCommon, userRepo, userRoleRelService, revisionService, metaCommonService,
collectionCommon, answerActivityService, emailService, noticequeueService,
externalService, service, siteInfoCommonService, externalNotificationService,
reviewService, configService, eventqueueService, reviewRepo)
+ answerService := content.NewAnswerService(answerRepo, questionRepo,
questionCommon, userCommon, collectionCommon, userRepo, revisionService,
answerActivityService, answerCommon, voteRepo, emailService,
userRoleRelService, noticequeueService, externalService, service,
reviewService, eventqueueService)
reportHandle := report_handle.NewReportHandle(questionService,
answerService, commentService)
- reportService := report2.NewReportService(reportRepo, objService,
userCommon, answerRepo, questionRepo, commentCommonRepo, reportHandle,
configService, v2)
+ reportService := report2.NewReportService(reportRepo, objService,
userCommon, answerRepo, questionRepo, commentCommonRepo, reportHandle,
configService, eventqueueService)
reportController := controller.NewReportController(reportService,
rankService, captchaService)
- contentVoteRepo := activity.NewVoteRepo(dataData, activityRepo,
userRankRepo, v3)
- voteService := content.NewVoteService(contentVoteRepo, configService,
questionRepo, answerRepo, commentCommonRepo, objService, v2)
+ contentVoteRepo := activity.NewVoteRepo(dataData, activityRepo,
userRankRepo, noticequeueService)
+ voteService := content.NewVoteService(contentVoteRepo, configService,
questionRepo, answerRepo, commentCommonRepo, objService, eventqueueService)
voteController := controller.NewVoteController(voteService,
rankService, captchaService)
tagController := controller.NewTagController(tagService,
tagCommonService, rankService)
followFollowRepo := activity.NewFollowRepo(dataData, uniqueIDRepo,
activityRepo)
@@ -228,7 +228,7 @@ func initApplication(debug bool, serverConf *conf.Server,
dbConf *data.Database,
searchService := content.NewSearchService(searchParser, searchRepo)
searchController := controller.NewSearchController(searchService,
captchaService)
reviewActivityRepo := activity.NewReviewActivityRepo(dataData,
activityRepo, userRankRepo, configService)
- contentRevisionService := content.NewRevisionService(revisionRepo,
userCommon, questionCommon, answerService, objService, questionRepo,
answerRepo, tagRepo, tagCommonService, v3, v, reportRepo, reviewService,
reviewActivityRepo)
+ contentRevisionService := content.NewRevisionService(revisionRepo,
userCommon, questionCommon, answerService, objService, questionRepo,
answerRepo, tagRepo, tagCommonService, noticequeueService, service, reportRepo,
reviewService, reviewActivityRepo)
revisionController :=
controller.NewRevisionController(contentRevisionService, rankService)
rankController := controller.NewRankController(rankService)
userAdminRepo := user.NewUserAdminRepo(dataData, authRepo)
@@ -244,7 +244,7 @@ func initApplication(debug bool, serverConf *conf.Server,
dbConf *data.Database,
siteInfoService := siteinfo.NewSiteInfoService(siteInfoRepo,
siteInfoCommonService, emailService, tagCommonService, configService,
questionCommon, fileRecordService)
siteInfoController :=
controller_admin.NewSiteInfoController(siteInfoService)
controllerSiteInfoController :=
controller.NewSiteInfoController(siteInfoCommonService)
- notificationCommon :=
notificationcommon.NewNotificationCommon(dataData, notificationRepo,
userCommon, activityRepo, followRepo, objService, v3, userExternalLoginRepo,
siteInfoCommonService)
+ notificationCommon :=
notificationcommon.NewNotificationCommon(dataData, notificationRepo,
userCommon, activityRepo, followRepo, objService, noticequeueService,
userExternalLoginRepo, siteInfoCommonService)
badgeRepo := badge.NewBadgeRepo(dataData, uniqueIDRepo)
notificationService := notification.NewNotificationService(dataData,
notificationRepo, notificationCommon, revisionService, userRepo, reportRepo,
reviewService, badgeRepo)
notificationController :=
controller.NewNotificationController(notificationService, rankService)
@@ -253,7 +253,7 @@ func initApplication(debug bool, serverConf *conf.Server,
dbConf *data.Database,
uploaderService := uploader.NewUploaderService(serviceConf,
siteInfoCommonService, fileRecordService)
uploadController := controller.NewUploadController(uploaderService)
activityActivityRepo := activity.NewActivityRepo(dataData,
configService)
- activityCommon := activity_common2.NewActivityCommon(activityRepo, v)
+ activityCommon := activity_common2.NewActivityCommon(activityRepo,
service)
commentCommonService :=
comment_common.NewCommentCommonService(commentCommonRepo)
activityService := activity2.NewActivityService(activityActivityRepo,
userCommon, activityCommon, tagCommonService, objService, commentCommonService,
revisionService, metaCommonService, configService)
activityController := controller.NewActivityController(activityService)
@@ -265,12 +265,12 @@ func initApplication(debug bool, serverConf *conf.Server,
dbConf *data.Database,
permissionController := controller.NewPermissionController(rankService)
userPluginController :=
controller.NewUserPluginController(pluginCommonService)
reviewController := controller.NewReviewController(reviewService,
rankService, captchaService)
- metaService := meta2.NewMetaService(metaCommonService, userCommon,
answerRepo, questionRepo, v2)
+ metaService := meta2.NewMetaService(metaCommonService, userCommon,
answerRepo, questionRepo, eventqueueService)
metaController := controller.NewMetaController(metaService)
badgeGroupRepo := badge_group.NewBadgeGroupRepo(dataData, uniqueIDRepo)
eventRuleRepo := badge.NewEventRuleRepo(dataData)
- badgeAwardService := badge2.NewBadgeAwardService(badgeAwardRepo,
badgeRepo, userCommon, objService, v3)
- badgeEventService := badge2.NewBadgeEventService(dataData, v2,
badgeRepo, eventRuleRepo, badgeAwardService)
+ badgeAwardService := badge2.NewBadgeAwardService(badgeAwardRepo,
badgeRepo, userCommon, objService, noticequeueService)
+ badgeEventService := badge2.NewBadgeEventService(dataData,
eventqueueService, badgeRepo, eventRuleRepo, badgeAwardService)
badgeService := badge2.NewBadgeService(badgeRepo, badgeGroupRepo,
badgeAwardRepo, badgeEventService, siteInfoCommonService)
badgeController := controller.NewBadgeController(badgeService,
badgeAwardService)
controller_adminBadgeController :=
controller_admin.NewBadgeController(badgeService)
@@ -281,7 +281,7 @@ func initApplication(debug bool, serverConf *conf.Server,
dbConf *data.Database,
avatarMiddleware := middleware.NewAvatarMiddleware(serviceConf,
uploaderService)
shortIDMiddleware :=
middleware.NewShortIDMiddleware(siteInfoCommonService)
templateRenderController :=
templaterender.NewTemplateRenderController(questionService, userService,
tagService, answerService, commentService, siteInfoCommonService, questionRepo)
- templateController :=
controller.NewTemplateController(templateRenderController,
siteInfoCommonService, v2, userService, questionService)
+ templateController :=
controller.NewTemplateController(templateRenderController,
siteInfoCommonService, eventqueueService, userService, questionService)
templateRouter := router.NewTemplateRouter(templateController,
templateRenderController, siteInfoController, authUserMiddleware)
connectorController :=
controller.NewConnectorController(siteInfoCommonService, emailService,
userExternalLoginService)
userCenterLoginService :=
user_external_login2.NewUserCenterLoginService(userRepo, userCommon,
userExternalLoginRepo, userActiveActivityRepo, siteInfoCommonService)
diff --git a/go.mod b/go.mod
index 52d64c73..d2430295 100644
--- a/go.mod
+++ b/go.mod
@@ -37,6 +37,7 @@ require (
github.com/grokify/html-strip-tags-go v0.1.0
github.com/jinzhu/copier v0.4.0
github.com/jinzhu/now v1.1.5
+ github.com/joho/godotenv v1.5.1
github.com/lib/pq v1.10.9
github.com/microcosm-cc/bluemonday v1.0.27
github.com/mozillazg/go-pinyin v0.20.0
@@ -117,7 +118,6 @@ require (
github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect
github.com/hashicorp/hcl v1.0.0 // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect
- github.com/joho/godotenv v1.5.1 // indirect
github.com/josharian/intern v1.0.0 // indirect
github.com/json-iterator/go v1.1.12 // indirect
github.com/klauspost/cpuid/v2 v2.2.8 // indirect
diff --git a/internal/base/translator/provider.go
b/internal/base/translator/provider.go
index 1a465b1e..982dbd03 100644
--- a/internal/base/translator/provider.go
+++ b/internal/base/translator/provider.go
@@ -242,7 +242,7 @@ func inspectTranslatorNode(node any, path []string, isRoot
bool) error {
return nil
case []any:
for idx, child := range data {
- nextPath := append(path, fmt.Sprintf("[%d]", idx))
+ nextPath := append(path, fmt.Sprintf("[%d]", idx))
//nolint: gocritic
if err := inspectTranslatorNode(child, nextPath,
false); err != nil {
return err
}
@@ -250,7 +250,7 @@ func inspectTranslatorNode(node any, path []string, isRoot
bool) error {
return nil
case []map[string]any:
for idx, child := range data {
- nextPath := append(path, fmt.Sprintf("[%d]", idx))
+ nextPath := append(path, fmt.Sprintf("[%d]", idx))
//nolint: gocritic
if err := inspectTranslatorNode(child, nextPath,
false); err != nil {
return err
}
diff --git a/script/check-asf-header.sh b/script/check-asf-header.sh
index 808efa10..05e52314 100755
--- a/script/check-asf-header.sh
+++ b/script/check-asf-header.sh
@@ -26,6 +26,6 @@ else
exit 1
fi
-$CONTAINER_RUNTIME run -it --rm -v "$(pwd)":/github/workspace
ghcr.io/korandoru/hawkeye-native format
+$CONTAINER_RUNTIME run --rm -v "$(pwd)":/github/workspace
ghcr.io/korandoru/hawkeye-native format
gofmt -w -l .