Initial release of GitLab File Scanner, a CLI tool for scanning GitLab repositories and exporting file lists.
Added
- Clean Architecture with domain/usecase/infrastructure layers
- GitHub Actions CI/CD pipelines (ci, release, docker workflows)
- GoReleaser configuration for cross-platform releases
- Pull request template
- Unit tests with thread-safe mocks for usecase layer
- Edge case tests for strutil, filefilter, filesystem, consolelog, and usecase
- Dockerfile with tini for proper signal handling
- Graceful shutdown via
SIGINT/SIGTERM - Conventional Commits validation
- Documentation guides (
docs/CI-CD.md,docs/DEVELOPMENT.md) - Logger level constants (
LevelDebug,LevelInfo,LevelWarn,LevelError) Debug()method to logger interface- License header check in CI (
HEADERfile,make license-check)
Changed
- Migrated from
github.com/xanzy/go-gitlabtogitlab.com/gitlab-org/api/client-go - Upgraded to Go 1.26 (1.26.2 required for CVE fixes)
- Renamed
tests/totest/(Go standard) - Renamed
internal/text/tointernal/strutil/ - CLI flag methods:
GetValue()→Value(),GetValueInt()→Int() - Renamed
GitlabFilePathsStructtoFileList - Simplified README with links to detailed docs
Fixed
- Goroutine leak in
scanRepository(semaphore acquired before defer) - Duplicate files in filter results when masks overlap
- Pluralization for Russian numbers 11–14, 111–114
- Format string panic when log message contains
%without args - Regex injection via unescaped
[,],\,+,?,{,},^,$ - Race conditions in mock implementations (added
sync.RWMutex) sort.StringSlice→sort.Strings(was not sorting)- Ignored error from
GetProjects()in app.go - Potential nil dereference in
scanDirresponse handling - Closure capture bug in concurrent directory scanning
- CRLF line endings in
go.sumbreaking CI - Duration output:
[1d 2h]→1d 2h(fmt.Sprintf→strings.Join)