chore: modernize workflows, security scanning, and linting configuration (#50)

* build: update Go 1.25, CI workflows, and build tooling

- Upgrade to Go 1.25
- Add benchmark targets to Makefile
- Implement parallel gosec execution
- Lock tool versions for reproducibility
- Add shellcheck directives to scripts
- Update CI workflows with improved caching

* refactor: migrate from golangci-lint to revive

- Replace golangci-lint with revive for linting
- Configure comprehensive revive rules
- Fix all EditorConfig violations
- Add yamllint and yamlfmt support
- Remove deprecated .golangci.yml

* refactor: rename utils to shared and deduplicate code

- Rename utils package to shared
- Add shared constants package
- Deduplicate constants across packages
- Address CodeRabbit review feedback

* fix: resolve SonarQube issues and add safety guards

- Fix all 73 SonarQube OPEN issues
- Add nil guards for resourceMonitor, backpressure, metricsCollector
- Implement io.Closer for headerFileReader
- Propagate errors from processing helpers
- Add metrics and templates packages
- Improve error handling across codebase

* test: improve test infrastructure and coverage

- Add benchmarks for cli, fileproc, metrics
- Improve test coverage for cli, fileproc, config
- Refactor tests with helper functions
- Add shared test constants
- Fix test function naming conventions
- Reduce cognitive complexity in benchmark tests

* docs: update documentation and configuration examples

- Update CLAUDE.md with current project state
- Refresh README with new features
- Add usage and configuration examples
- Add SonarQube project configuration
- Consolidate config.example.yaml

* fix: resolve shellcheck warnings in scripts

- Use ./*.go instead of *.go to prevent dash-prefixed filenames
  from being interpreted as options (SC2035)
- Remove unreachable return statement after exit (SC2317)
- Remove obsolete gibidiutils/ directory reference

* chore(deps): upgrade go dependencies

* chore(lint): megalinter fixes

* fix: improve test coverage and fix file descriptor leaks

- Add defer r.Close() to fix pipe file descriptor leaks in benchmark tests
- Refactor TestProcessorConfigureFileTypes with helper functions and assertions
- Refactor TestProcessorLogFinalStats with output capture and keyword verification
- Use shared constants instead of literal strings (TestFilePNG, FormatMarkdown, etc.)
- Reduce cognitive complexity by extracting helper functions

* fix: align test comments with function names

Remove underscores from test comments to match actual function names:
- benchmark/benchmark_test.go (2 fixes)
- fileproc/filetypes_config_test.go (4 fixes)
- fileproc/filetypes_registry_test.go (6 fixes)
- fileproc/processor_test.go (6 fixes)
- fileproc/resource_monitor_types_test.go (4 fixes)
- fileproc/writer_test.go (3 fixes)

* fix: various test improvements and bug fixes

- Remove duplicate maxCacheSize check in filetypes_registry_test.go
- Shorten long comment in processor_test.go to stay under 120 chars
- Remove flaky time.Sleep in collector_test.go, use >= 0 assertion
- Close pipe reader in benchmark_test.go to fix file descriptor leak
- Use ContinueOnError in flags_test.go to match ResetFlags behavior
- Add nil check for p.ui in processor_workers.go before UpdateProgress
- Fix resource_monitor_validation_test.go by setting hardMemoryLimitBytes directly

* chore(yaml): add missing document start markers

Add --- document start to YAML files to satisfy yamllint:
- .github/workflows/codeql.yml
- .github/workflows/build-test-publish.yml
- .github/workflows/security.yml
- .github/actions/setup/action.yml

* fix: guard nil resourceMonitor and fix test deadlock

- Guard resourceMonitor before CreateFileProcessingContext call
- Add ui.UpdateProgress on emergency stop and path error returns
- Fix potential deadlock in TestProcessFile using wg.Go with defer close
This commit is contained in:
2025-12-10 19:07:11 +02:00
committed by GitHub
parent ea4a39a360
commit 95b7ef6dd3
149 changed files with 22990 additions and 8976 deletions

View File

@@ -1,58 +1,194 @@
# revive configuration for gibidify
# See https://revive.run/ for more information
# Revive configuration for gibidify project
# https://revive.run/
# Migrated from golangci-lint v2.4.0 configuration
# NOTE: For comprehensive security scanning, also run: gosec ./...
# Global settings
ignoreGeneratedHeader = false
severity = "warning"
# Global configuration
ignoreGeneratedHeader = true
severity = "error"
confidence = 0.8
errorCode = 1
warningCode = 0
warningCode = 2
# Enable all rules initially then selectively disable/configure
enableAllRules = true
# ============================================================================
# ESSENTIAL ERROR DETECTION (from errcheck, govet, ineffassign, staticcheck, unused)
# ============================================================================
# Error handling rules (from errcheck)
[rule.unhandled-error]
# Enable all rules by default, then selectively disable or configure
[rule.blank-imports]
[rule.context-as-argument]
[rule.context-keys-type]
[rule.dot-imports]
[rule.error-return]
[rule.error-strings]
[rule.error-naming]
[rule.exported]
[rule.if-return]
[rule.increment-decrement]
[rule.var-naming]
[rule.var-declaration]
[rule.package-comments]
[rule.errorf]
# Code correctness rules (from govet)
[rule.atomic]
[rule.bool-literal-in-expr]
[rule.context-as-argument]
[rule.context-keys-type]
[rule.dot-imports]
[rule.range]
[rule.receiver-naming]
[rule.time-naming]
[rule.unexported-return]
[rule.indent-error-flow]
[rule.errorf]
[rule.empty-block]
[rule.superfluous-else]
[rule.unused-parameter]
[rule.unreachable-code]
[rule.redefines-builtin-id]
[rule.struct-tag]
[rule.modifies-value-receiver]
[rule.constant-logical-expr]
[rule.unconditional-recursion]
[rule.identical-branches]
[rule.defer]
arguments = [["call-chain", "loop", "method-call", "recover", "immediate-recover", "return"]]
# Configure specific rules
[rule.line-length-limit]
arguments = [120]
Exclude = ["**/*_test.go"]
# Unused code detection (from unused, ineffassign)
[rule.unused-parameter]
[rule.unused-receiver]
disabled = true # Too strict for interface methods
[rule.blank-imports]
[rule.function-length]
arguments = [50, 100]
Exclude = ["**/*_test.go"]
# ============================================================================
# BUG PREVENTION (from bodyclose, dupl, gochecknoinits, goconst, gocritic, gosec, misspell, unparam, usestdlibvars)
# ============================================================================
[rule.max-public-structs]
arguments = [10]
# Security rules (from gosec and additional security checks)
[rule.file-header]
[rule.datarace]
[rule.unchecked-type-assertion]
# Code duplication (from dupl - threshold: 150)
[rule.duplicated-imports]
# Constants (from goconst - min-len: 3, min-occurrences: 3)
[rule.add-constant]
disabled = true # Complex configuration, use goconst separately if needed
# Init functions (from gochecknoinits)
# Note: main.go and config package are excluded in original
# Comprehensive analysis (from gocritic)
[rule.if-return]
[rule.early-return]
[rule.indent-error-flow]
[rule.superfluous-else]
[rule.confusing-naming]
[rule.get-return]
[rule.modifies-parameter]
[rule.confusing-results]
[rule.deep-exit]
[rule.flag-parameter]
disabled = true # Too strict for CLI applications
[rule.unnecessary-stmt]
[rule.empty-block]
[rule.empty-lines]
# Standard library usage (from usestdlibvars)
[rule.use-any]
# ============================================================================
# PERFORMANCE (from prealloc, perfsprint)
# ============================================================================
[rule.optimize-operands-order]
[rule.string-format]
[rule.string-of-int]
[rule.range-val-in-closure]
[rule.range-val-address]
[rule.waitgroup-by-value]
# ============================================================================
# CODE COMPLEXITY (from gocognit: 15, gocyclo: 15, nestif: 5)
# ============================================================================
[rule.cognitive-complexity]
arguments = [15]
Exclude = ["**/*_test.go"]
arguments = [20] # Increased for test files which can be more complex
[rule.cyclomatic]
arguments = [15]
Exclude = ["**/*_test.go"]
arguments = [15]
[rule.max-control-nesting]
arguments = [5]
[rule.function-length]
arguments = [100, 0] # statements, lines
[rule.function-result-limit]
arguments = [10]
[rule.argument-limit]
arguments = [5]
arguments = [8]
# ============================================================================
# TESTING (from thelper, errorlint)
# ============================================================================
# Testing rules are covered by error handling and naming convention rules above
# ============================================================================
# NAMING CONVENTIONS (from predeclared, varnamelen)
# ============================================================================
[rule.var-naming]
arguments = [["ID", "URL", "API", "HTTP", "JSON", "XML", "UI", "URI", "SQL", "SSH", "EOF", "LHS", "RHS", "TTL", "OK", "UUID", "VM"]]
[rule.exported]
[rule.package-comments]
severity = "error"
# Variable name length (from varnamelen)
# Original config: min-length: 3, with specific ignored names
# This is partially covered by var-naming rule
# ============================================================================
# IMPORT MANAGEMENT (from depguard, importas)
# ============================================================================
[rule.imports-blacklist]
arguments = [
"io/ioutil", # Use os and io packages instead
"github.com/pkg/errors", # Use standard errors package
"github.com/golang/protobuf" # Use google.golang.org/protobuf
]
[rule.import-alias-naming]
arguments = ["^[a-z][a-z0-9]*$"]
[rule.import-shadowing]
# ============================================================================
# FORMAT (from nlreturn, lll: 120, godot, tagalign, whitespace)
# ============================================================================
[rule.line-length-limit]
arguments = [120]
[rule.comment-spacings]
arguments = ["godot"]
# Note: nlreturn, tagalign, whitespace don't have direct revive equivalents
# ============================================================================
# ADDITIONAL REVIVE-SPECIFIC RULES
# ============================================================================
[rule.increment-decrement]
[rule.var-declaration]
[rule.useless-break]
[rule.call-to-gc]
disabled = true
[rule.max-public-structs]
disabled = true # Too restrictive for this project
# ============================================================================
# EXCLUSIONS (from original golangci-lint config)
# ============================================================================
# Note: Exclusions in revive are handled differently
# - main.go: gochecknoinits excluded
# - _test.go: varnamelen excluded for variable names
# - internal/config/: gochecknoinits excluded
# These will need to be handled via file-specific ignores or code comments