mirror of
https://gitea.com/gitea/act_runner.git
synced 2026-04-25 21:30:23 +08:00
Use `golangci-lint fmt` to format code, upgrading `.golangci.yml` to v2 and mirroring the linter configuration used by https://github.com/go-gitea/gitea. `gci` now handles import ordering into standard, project-local, blank, and default groups. Mirrors https://github.com/go-gitea/gitea/pull/37194. Changes: - Upgrade `.golangci.yml` to v2 format with the same linter set as gitea (minus `prealloc`, `unparam`, `testifylint`, `nilnil` which produced too many pre-existing issues) - Add path-based exclusions (`bodyclose`, `gosec` in tests; `gosec:G115`/`G117` globally) - Run lint via `make lint-go` in CI instead of `golangci/golangci-lint-action`, matching the pattern used by other Gitea repos - Apply safe auto-fixes (`modernize`, `perfsprint`, `usetesting`, etc.) - Add explanations to existing `//nolint` directives - Remove dead code (unused `newRemoteReusableWorkflow` and `networkName`), duplicate imports, and shadowed `max` builtins - Replace deprecated `docker/distribution/reference` with `distribution/reference` - Fix `Deprecated:` comment casing and simplify nil/len checks --- This PR was written with the help of Claude Opus 4.7 Reviewed-on: https://gitea.com/gitea/act/pulls/163 Reviewed-by: Lunny Xiao <xiaolunwen@gmail.com> Co-authored-by: silverwind <me@silverwind.io> Co-committed-by: silverwind <me@silverwind.io>
141 lines
2.8 KiB
Go
141 lines
2.8 KiB
Go
package cmd
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"net/http"
|
|
"net/url"
|
|
"os"
|
|
"path/filepath"
|
|
"runtime"
|
|
"strings"
|
|
"time"
|
|
|
|
log "github.com/sirupsen/logrus"
|
|
)
|
|
|
|
type Notice struct {
|
|
Level string `json:"level"`
|
|
Message string `json:"message"`
|
|
}
|
|
|
|
func displayNotices(input *Input) {
|
|
select {
|
|
case notices := <-noticesLoaded:
|
|
if len(notices) > 0 {
|
|
noticeLogger := log.New()
|
|
if input.jsonLogger {
|
|
noticeLogger.SetFormatter(&log.JSONFormatter{})
|
|
} else {
|
|
noticeLogger.SetFormatter(&log.TextFormatter{
|
|
DisableQuote: true,
|
|
DisableTimestamp: true,
|
|
PadLevelText: true,
|
|
})
|
|
}
|
|
|
|
fmt.Printf("\n")
|
|
for _, notice := range notices {
|
|
level, err := log.ParseLevel(notice.Level)
|
|
if err != nil {
|
|
level = log.InfoLevel
|
|
}
|
|
noticeLogger.Log(level, notice.Message)
|
|
}
|
|
}
|
|
case <-time.After(time.Second * 1):
|
|
log.Debugf("Timeout waiting for notices")
|
|
}
|
|
}
|
|
|
|
var noticesLoaded = make(chan []Notice)
|
|
|
|
func loadVersionNotices(version string) {
|
|
go func() {
|
|
noticesLoaded <- getVersionNotices(version)
|
|
}()
|
|
}
|
|
|
|
const NoticeURL = "https://api.nektosact.com/notices"
|
|
|
|
func getVersionNotices(version string) []Notice {
|
|
if os.Getenv("ACT_DISABLE_VERSION_CHECK") == "1" {
|
|
return nil
|
|
}
|
|
|
|
noticeURL, err := url.Parse(NoticeURL)
|
|
if err != nil {
|
|
log.Error(err)
|
|
return nil
|
|
}
|
|
query := noticeURL.Query()
|
|
query.Add("os", runtime.GOOS)
|
|
query.Add("arch", runtime.GOARCH)
|
|
query.Add("version", version)
|
|
|
|
noticeURL.RawQuery = query.Encode()
|
|
|
|
client := &http.Client{}
|
|
req, err := http.NewRequest(http.MethodGet, noticeURL.String(), nil)
|
|
if err != nil {
|
|
log.Debug(err)
|
|
return nil
|
|
}
|
|
|
|
etag := loadNoticesEtag()
|
|
if etag != "" {
|
|
log.Debugf("Conditional GET for notices etag=%s", etag)
|
|
req.Header.Set("If-None-Match", etag)
|
|
}
|
|
|
|
resp, err := client.Do(req)
|
|
if err != nil {
|
|
log.Debug(err)
|
|
return nil
|
|
}
|
|
|
|
newEtag := resp.Header.Get("Etag")
|
|
if newEtag != "" {
|
|
log.Debugf("Saving notices etag=%s", newEtag)
|
|
saveNoticesEtag(newEtag)
|
|
}
|
|
|
|
defer resp.Body.Close()
|
|
notices := []Notice{}
|
|
if resp.StatusCode == http.StatusNotModified {
|
|
log.Debug("No new notices")
|
|
return nil
|
|
}
|
|
if err := json.NewDecoder(resp.Body).Decode(¬ices); err != nil {
|
|
log.Debug(err)
|
|
return nil
|
|
}
|
|
|
|
return notices
|
|
}
|
|
|
|
func loadNoticesEtag() string {
|
|
p := etagPath()
|
|
content, err := os.ReadFile(p)
|
|
if err != nil {
|
|
log.Debugf("Unable to load etag from %s: %e", p, err)
|
|
}
|
|
return strings.TrimSuffix(string(content), "\n")
|
|
}
|
|
|
|
func saveNoticesEtag(etag string) {
|
|
p := etagPath()
|
|
err := os.WriteFile(p, []byte(strings.TrimSuffix(etag, "\n")), 0o600)
|
|
if err != nil {
|
|
log.Debugf("Unable to save etag to %s: %e", p, err)
|
|
}
|
|
}
|
|
|
|
func etagPath() string {
|
|
dir := filepath.Join(CacheHomeDir, "act")
|
|
if err := os.MkdirAll(dir, 0o777); err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
return filepath.Join(dir, ".notices.etag")
|
|
}
|