@@ -23,6 +23,12 @@ goreleaser release --snapshot --clean # Build cross-platform binaries
2323golangci-lint run --verbose ./... # Run linter (configured via mise.toml)
2424```
2525
26+ ### Coverage
27+ ``` bash
28+ go test -cover ./... # Run tests with coverage
29+ go test -coverprofile=coverage.out ./... && go tool cover -html=coverage.out # Generate HTML coverage report
30+ ```
31+
2632### Running
2733``` bash
2834go run . [file]... # Run from source
@@ -92,9 +98,219 @@ The project uses:
9298- ** goreleaser** : Cross-platform building and release automation
9399- ** GitHub Actions** : CI with test/build/lint jobs
94100
101+ ## Technical Challenges & Improvements
102+
103+ ### π¨ Critical Issues (Fix Immediately)
104+
105+ #### 1. Resource Leak in File Handling
106+ ** File** : ` cmd/root.go:54-63 `
107+ ** Issue** : Files are deferred to close at function end, not loop iteration end
108+ ``` go
109+ for _ , filename := range args {
110+ f , err := os.Open (filename)
111+ if err != nil {
112+ return err
113+ }
114+ defer func () { _ = f.Close () }() // BUG: All files close at function end
115+ // ...
116+ }
117+ ```
118+ ** Fix** : Close files immediately after processing each one:
119+ ``` go
120+ for _ , filename := range args {
121+ f , err := os.Open (filename)
122+ if err != nil {
123+ return err
124+ }
125+ err = g.Print (os.Stdout , f, gat.WithPretty (flagPretty), gat.WithFilename (filename))
126+ f.Close () // Close immediately
127+ if err != nil {
128+ return err
129+ }
130+ }
131+ ```
132+
133+ #### 2. Extremely Low Test Coverage (4.7%)
134+ ** Missing Coverage** :
135+ - Core functionality (` internal/gat/gat.go ` )
136+ - CLI layer (` cmd/ ` )
137+ - Essential modules (` internal/lexers/ ` , ` internal/formatters/ ` , ` internal/styles/ ` )
138+
139+ ** Needed Tests** :
140+ - Integration tests for end-to-end workflows
141+ - Table-driven tests for binary detection edge cases
142+ - Error injection tests for file I/O operations
143+ - Tests for different image formats and sizes
144+
145+ #### 3. Memory Safety Issues
146+ ** File** : ` internal/gat/gat.go:142-146, 202-236 `
147+ ** Issues** :
148+ - No size limits when loading files/images into memory
149+ - Potential DoS via large file attacks
150+ - Image processing lacks memory bounds
151+
152+ ** Recommendations** :
153+ - Add configurable size limits
154+ - Implement streaming processing for large files
155+ - Add timeout controls for I/O operations
156+
157+ ### β οΈ High Priority Issues
158+
159+ #### 4. Silent Error Suppression
160+ ** Files** : ` cmd/root.go:59 ` , ` internal/gat/gat.go:166, 244 `
161+ ``` go
162+ defer func () { _ = f.Close () }() // Ignoring close errors
163+ ```
164+ ** Fix** : Log errors or return them appropriately:
165+ ``` go
166+ defer func () {
167+ if err := f.Close (); err != nil {
168+ // Log error or handle appropriately
169+ }
170+ }()
171+ ```
172+
173+ #### 5. Performance Bottlenecks
174+ ** String Concatenation** : ` internal/gat/gat.go:142-146 `
175+ ``` go
176+ buf := new (bytes.Buffer )
177+ if _ , err := io.Copy (buf, br); err != nil {
178+ return err
179+ }
180+ src = buf.String () // Unnecessary copy
181+ ```
182+ ** Fix** : Use ` buf.Bytes() ` and work with byte slices where possible.
183+
184+ ** Image Processing** : ` internal/gat/gat.go:202-236 `
185+ - Creates new RGBA image in memory for resizing without size limits
186+ - No memory pool for frequent image operations
187+ - Loads entire image into memory before size checking
188+
189+ #### 6. Hard-coded Magic Values
190+ ** File** : ` internal/gat/gat.go:103-135 `
191+ - Binary message string is hard-coded and very long (line 135)
192+ - Magic number 1024 for peek size and binary detection (lines 104, 254-257)
193+ - Magic number 1800 for image resize (line 203)
194+
195+ ** Fix** : Extract as constants:
196+ ``` go
197+ const (
198+ DefaultPeekSize = 1024
199+ MaxImageEdge = 1800
200+ BinaryFileMessage = " +----------------------------------------------------------------------------+\n | NOTE: This is a binary file. To force output, use the --force-binary flag. |\n +----------------------------------------------------------------------------+\n "
201+ )
202+ ```
203+
204+ ### π§ Medium Priority Issues
205+
206+ #### 7. Global State in Prettier Registry
207+ ** File** : ` internal/prettier/registry.go:3 `
208+ ``` go
209+ var Registry = map [string ]Prettier{} // Global mutable state
210+ ```
211+ ** Fix** : Use dependency injection or constructor pattern:
212+ ``` go
213+ type Registry struct {
214+ prettiers map [string ]Prettier
215+ }
216+
217+ func NewRegistry () *Registry {
218+ return &Registry{prettiers: make (map [string ]Prettier)}
219+ }
220+ ```
221+
222+ #### 8. Tight Coupling
223+ ** File** : ` internal/gat/gat.go:44-75 `
224+ The ` New() ` function directly couples to multiple internal packages, making it hard to test in isolation.
225+
226+ #### 9. Security Concerns
227+ ** Dependency Vulnerabilities** :
228+ - Several dependencies at v0.x versions
229+ - ` github.com/yosssi/gohtml ` (last updated 2020)
230+ - Various packages with commit hashes instead of proper versions
231+
232+ ** Potential DoS** :
233+ - No size limits when reading files into memory
234+ - Could cause OOM with very large files
235+ - No timeout for file operations
236+
237+ #### 10. Documentation Issues
238+ ** Missing Godoc Comments** :
239+ - ` type Config struct ` - no documentation for fields
240+ - ` func New() ` - no documentation for error conditions
241+ - ` func (g *Gat) Print() ` - no documentation for complex behavior
242+
243+ ** Missing Architecture Documentation** :
244+ - How lexer selection works
245+ - Image processing pipeline
246+ - Error handling strategy
247+
248+ #### 11. Dependency Management
249+ ** Outdated Dependencies** :
250+ - ` github.com/alecthomas/chroma/v2 ` v2.17.2 β v2.18.0
251+ - ` github.com/bmatcuk/doublestar/v4 ` v4.7.1 β v4.8.1
252+
253+ ** Inconsistent Versioning** :
254+ - Some dependencies use commit hashes instead of semantic versions
255+
256+ ### π Action Plan
257+
258+ #### Phase 1 (Week 1) - Critical Fixes
259+ - [ ] Fix file handle leak in ` cmd/root.go:54-63 `
260+ - [ ] Add basic integration tests to achieve >50% coverage
261+ - [ ] Add size limits for file and image processing
262+ - [ ] Fix error handling - don't silently ignore errors
263+
264+ #### Phase 2 (Week 2) - High Priority
265+ - [ ] Extract magic numbers to constants
266+ - [ ] Add comprehensive error context
267+ - [ ] Improve string concatenation performance
268+ - [ ] Update critical dependencies
269+
270+ #### Phase 3 (Month 2) - Medium Priority
271+ - [ ] Refactor global prettier registry
272+ - [ ] Add comprehensive test suite (target 70% coverage)
273+ - [ ] Optimize image processing with streaming
274+ - [ ] Add performance benchmarks
275+
276+ #### Phase 4 (Future) - Enhancements
277+ - [ ] Improve documentation coverage
278+ - [ ] Consider adding configuration file support
279+ - [ ] Add memory profiling and optimization
280+ - [ ] Implement progressive image loading
281+
95282## Testing Strategy
96283
284+ ** Current Coverage** : 4.7% (critically low)
285+
97286Tests focus on:
98287- Format and language listing functionality
99288- Code prettification for each supported language
100- - Error handling and edge cases in prettier modules
289+ - Error handling and edge cases in prettier modules
290+
291+ ### Current Coverage Issues
292+ - ** Core functionality** : 0% coverage for binary detection, image processing, gzip handling
293+ - ** CLI layer** : 0% coverage for flag parsing, terminal detection
294+ - ** Essential modules** : 0% coverage for lexers, formatters, styles
295+
296+ ### Recommended Test Structure
297+ ```
298+ tests/
299+ βββ integration/
300+ β βββ cli_test.go # End-to-end CLI testing
301+ β βββ formats_test.go # Output format testing
302+ β βββ images_test.go # Image processing workflows
303+ βββ unit/
304+ β βββ binary_test.go # Binary detection edge cases
305+ β βββ lexers_test.go # Language detection
306+ β βββ prettier_test.go # Code formatting
307+ βββ fixtures/
308+ βββ samples/ # Test files for each format
309+ βββ images/ # Test images of various sizes
310+ ```
311+
312+ ### Performance Testing
313+ - [ ] Add benchmarks for large file processing
314+ - [ ] Add memory usage tests
315+ - [ ] Add concurrent access tests
316+ - [ ] Add stress tests for resource limits
0 commit comments