Fix all linter errors

- Add explicit error ignoring with _ = for Close/Remove calls
- Rename WriteTo to Write to avoid io.WriterTo interface conflict
- Fix errcheck warnings in fetch, freshen, gen, mfer, checker,
  deserialize, serialize, and output files
This commit is contained in:
Jeffrey Paul 2025-12-17 14:37:52 -08:00
parent 531f460f87
commit 92bd13efde
9 changed files with 35 additions and 35 deletions

View File

@ -218,7 +218,7 @@ func (c *Checker) checkFile(entry *mfer.MFFilePath, checkedBytes *int64) Result
if err != nil { if err != nil {
return Result{Path: entry.Path, Status: StatusError, Message: err.Error()} return Result{Path: entry.Path, Status: StatusError, Message: err.Error()}
} }
defer f.Close() defer func() { _ = f.Close() }()
h := sha256.New() h := sha256.New()
n, err := io.Copy(h, f) n, err := io.Copy(h, f)

View File

@ -48,7 +48,7 @@ func (mfa *CLIApp) fetchManifestOperation(ctx *cli.Context) error {
if err != nil { if err != nil {
return fmt.Errorf("failed to fetch manifest: %w", err) return fmt.Errorf("failed to fetch manifest: %w", err)
} }
defer resp.Body.Close() defer func() { _ = resp.Body.Close() }()
if resp.StatusCode != http.StatusOK { if resp.StatusCode != http.StatusOK {
return fmt.Errorf("failed to fetch manifest: HTTP %d", resp.StatusCode) return fmt.Errorf("failed to fetch manifest: HTTP %d", resp.StatusCode)
@ -283,7 +283,7 @@ func downloadFile(fileURL, localPath string, entry *mfer.MFFilePath, progress ch
if err != nil { if err != nil {
return err return err
} }
defer resp.Body.Close() defer func() { _ = resp.Body.Close() }()
if resp.StatusCode != http.StatusOK { if resp.StatusCode != http.StatusOK {
return fmt.Errorf("HTTP %d", resp.StatusCode) return fmt.Errorf("HTTP %d", resp.StatusCode)
@ -322,24 +322,24 @@ func downloadFile(fileURL, localPath string, entry *mfer.MFFilePath, progress ch
// If copy failed, clean up temp file and return error // If copy failed, clean up temp file and return error
if copyErr != nil { if copyErr != nil {
os.Remove(tmpPath) _ = os.Remove(tmpPath)
return copyErr return copyErr
} }
if closeErr != nil { if closeErr != nil {
os.Remove(tmpPath) _ = os.Remove(tmpPath)
return closeErr return closeErr
} }
// Verify size // Verify size
if written != expectedSize { if written != expectedSize {
os.Remove(tmpPath) _ = os.Remove(tmpPath)
return fmt.Errorf("size mismatch: expected %d bytes, got %d", expectedSize, written) return fmt.Errorf("size mismatch: expected %d bytes, got %d", expectedSize, written)
} }
// Encode computed hash as multihash // Encode computed hash as multihash
computed, err := multihash.Encode(h.Sum(nil), multihash.SHA2_256) computed, err := multihash.Encode(h.Sum(nil), multihash.SHA2_256)
if err != nil { if err != nil {
os.Remove(tmpPath) _ = os.Remove(tmpPath)
return fmt.Errorf("failed to encode hash: %w", err) return fmt.Errorf("failed to encode hash: %w", err)
} }
@ -352,13 +352,13 @@ func downloadFile(fileURL, localPath string, entry *mfer.MFFilePath, progress ch
} }
} }
if !hashMatch { if !hashMatch {
os.Remove(tmpPath) _ = os.Remove(tmpPath)
return fmt.Errorf("hash mismatch") return fmt.Errorf("hash mismatch")
} }
// Rename temp file to final path // Rename temp file to final path
if err := os.Rename(tmpPath, localPath); err != nil { if err := os.Rename(tmpPath, localPath); err != nil {
os.Remove(tmpPath) _ = os.Remove(tmpPath)
return fmt.Errorf("failed to rename temp file: %w", err) return fmt.Errorf("failed to rename temp file: %w", err)
} }

View File

@ -127,7 +127,7 @@ func TestFetchFromHTTP(t *testing.T) {
path := r.URL.Path path := r.URL.Path
if path == "/index.mf" { if path == "/index.mf" {
w.Header().Set("Content-Type", "application/octet-stream") w.Header().Set("Content-Type", "application/octet-stream")
w.Write(manifestData) _, _ = w.Write(manifestData)
return return
} }
@ -143,20 +143,20 @@ func TestFetchFromHTTP(t *testing.T) {
} }
w.Header().Set("Content-Type", "application/octet-stream") w.Header().Set("Content-Type", "application/octet-stream")
w.Write(content) _, _ = w.Write(content)
})) }))
defer server.Close() defer server.Close()
// Create destination directory // Create destination directory
destDir, err := os.MkdirTemp("", "mfer-fetch-test-*") destDir, err := os.MkdirTemp("", "mfer-fetch-test-*")
require.NoError(t, err) require.NoError(t, err)
defer os.RemoveAll(destDir) defer func() { _ = os.RemoveAll(destDir) }()
// Change to dest directory for the test // Change to dest directory for the test
origDir, err := os.Getwd() origDir, err := os.Getwd()
require.NoError(t, err) require.NoError(t, err)
require.NoError(t, os.Chdir(destDir)) require.NoError(t, os.Chdir(destDir))
defer os.Chdir(origDir) defer func() { _ = os.Chdir(origDir) }()
// Parse the manifest to get file entries // Parse the manifest to get file entries
manifest, err := mfer.NewManifestFromReader(bytes.NewReader(manifestData)) manifest, err := mfer.NewManifestFromReader(bytes.NewReader(manifestData))
@ -217,19 +217,19 @@ func TestFetchHashMismatch(t *testing.T) {
tamperedContent := []byte("Tampered content!") tamperedContent := []byte("Tampered content!")
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/octet-stream") w.Header().Set("Content-Type", "application/octet-stream")
w.Write(tamperedContent) _, _ = w.Write(tamperedContent)
})) }))
defer server.Close() defer server.Close()
// Create temp directory // Create temp directory
destDir, err := os.MkdirTemp("", "mfer-fetch-hash-test-*") destDir, err := os.MkdirTemp("", "mfer-fetch-hash-test-*")
require.NoError(t, err) require.NoError(t, err)
defer os.RemoveAll(destDir) defer func() { _ = os.RemoveAll(destDir) }()
origDir, err := os.Getwd() origDir, err := os.Getwd()
require.NoError(t, err) require.NoError(t, err)
require.NoError(t, os.Chdir(destDir)) require.NoError(t, os.Chdir(destDir))
defer os.Chdir(origDir) defer func() { _ = os.Chdir(origDir) }()
// Try to download - should fail with hash mismatch // Try to download - should fail with hash mismatch
err = downloadFile(server.URL+"/file.txt", "file.txt", files[0], nil) err = downloadFile(server.URL+"/file.txt", "file.txt", files[0], nil)
@ -269,19 +269,19 @@ func TestFetchSizeMismatch(t *testing.T) {
wrongSizeContent := []byte("Short") wrongSizeContent := []byte("Short")
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/octet-stream") w.Header().Set("Content-Type", "application/octet-stream")
w.Write(wrongSizeContent) _, _ = w.Write(wrongSizeContent)
})) }))
defer server.Close() defer server.Close()
// Create temp directory // Create temp directory
destDir, err := os.MkdirTemp("", "mfer-fetch-size-test-*") destDir, err := os.MkdirTemp("", "mfer-fetch-size-test-*")
require.NoError(t, err) require.NoError(t, err)
defer os.RemoveAll(destDir) defer func() { _ = os.RemoveAll(destDir) }()
origDir, err := os.Getwd() origDir, err := os.Getwd()
require.NoError(t, err) require.NoError(t, err)
require.NoError(t, os.Chdir(destDir)) require.NoError(t, os.Chdir(destDir))
defer os.Chdir(origDir) defer func() { _ = os.Chdir(origDir) }()
// Try to download - should fail with size mismatch // Try to download - should fail with size mismatch
err = downloadFile(server.URL+"/file.txt", "file.txt", files[0], nil) err = downloadFile(server.URL+"/file.txt", "file.txt", files[0], nil)
@ -320,19 +320,19 @@ func TestFetchProgress(t *testing.T) {
w.Header().Set("Content-Length", "102400") w.Header().Set("Content-Length", "102400")
// Write in chunks to allow progress reporting // Write in chunks to allow progress reporting
reader := bytes.NewReader(content) reader := bytes.NewReader(content)
io.Copy(w, reader) _, _ = io.Copy(w, reader)
})) }))
defer server.Close() defer server.Close()
// Create temp directory // Create temp directory
destDir, err := os.MkdirTemp("", "mfer-fetch-progress-test-*") destDir, err := os.MkdirTemp("", "mfer-fetch-progress-test-*")
require.NoError(t, err) require.NoError(t, err)
defer os.RemoveAll(destDir) defer func() { _ = os.RemoveAll(destDir) }()
origDir, err := os.Getwd() origDir, err := os.Getwd()
require.NoError(t, err) require.NoError(t, err)
require.NoError(t, os.Chdir(destDir)) require.NoError(t, os.Chdir(destDir))
defer os.Chdir(origDir) defer func() { _ = os.Chdir(origDir) }()
// Set up progress channel and collect updates // Set up progress channel and collect updates
progress := make(chan DownloadProgress, 100) progress := make(chan DownloadProgress, 100)

View File

@ -258,7 +258,7 @@ func (mfa *CLIApp) freshenManifestOperation(ctx *cli.Context) error {
} }
} }
}) })
f.Close() _ = f.Close()
if err != nil { if err != nil {
return fmt.Errorf("failed to hash %s: %w", e.path, err) return fmt.Errorf("failed to hash %s: %w", e.path, err)
@ -287,15 +287,15 @@ func (mfa *CLIApp) freshenManifestOperation(ctx *cli.Context) error {
} }
err = builder.Build(outFile) err = builder.Build(outFile)
outFile.Close() _ = outFile.Close()
if err != nil { if err != nil {
mfa.Fs.Remove(tmpPath) _ = mfa.Fs.Remove(tmpPath)
return fmt.Errorf("failed to write manifest: %w", err) return fmt.Errorf("failed to write manifest: %w", err)
} }
// Rename temp to final // Rename temp to final
if err := mfa.Fs.Rename(tmpPath, manifestPath); err != nil { if err := mfa.Fs.Rename(tmpPath, manifestPath); err != nil {
mfa.Fs.Remove(tmpPath) _ = mfa.Fs.Remove(tmpPath)
return fmt.Errorf("failed to rename manifest: %w", err) return fmt.Errorf("failed to rename manifest: %w", err)
} }

View File

@ -76,7 +76,7 @@ func (mfa *CLIApp) generateManifestOperation(ctx *cli.Context) error {
if err != nil { if err != nil {
return fmt.Errorf("failed to create output file: %w", err) return fmt.Errorf("failed to create output file: %w", err)
} }
defer outFile.Close() defer func() { _ = outFile.Close() }()
// Phase 2: Scan - read file contents and generate manifest // Phase 2: Scan - read file contents and generate manifest
var scanProgress chan scanner.ScanStatus var scanProgress chan scanner.ScanStatus

View File

@ -41,7 +41,7 @@ const banner = `
\__\/ \__\/ \__\/ \__\/` \__\/ \__\/ \__\/ \__\/`
func (mfa *CLIApp) printBanner() { func (mfa *CLIApp) printBanner() {
fmt.Fprintln(mfa.Stdout, banner) _, _ = fmt.Fprintln(mfa.Stdout, banner)
} }
// VersionString returns the version and git revision formatted for display. // VersionString returns the version and git revision formatted for display.
@ -201,7 +201,7 @@ func (mfa *CLIApp) run(args []string) {
Name: "version", Name: "version",
Usage: "Show version", Usage: "Show version",
Action: func(c *cli.Context) error { Action: func(c *cli.Context) error {
fmt.Fprintln(mfa.Stdout, mfa.VersionString()) _, _ = fmt.Fprintln(mfa.Stdout, mfa.VersionString())
return nil return nil
}, },
}, },

View File

@ -26,7 +26,7 @@ func (m *manifest) deserializeInner() error {
if err != nil { if err != nil {
return err return err
} }
defer gzr.Close() defer func() { _ = gzr.Close() }()
dat, err := io.ReadAll(gzr) dat, err := io.ReadAll(gzr)
if err != nil { if err != nil {
@ -99,7 +99,7 @@ func NewManifestFromFile(fs afero.Fs, path string) (*manifest, error) {
if err != nil { if err != nil {
return nil, err return nil, err
} }
defer f.Close() defer func() { _ = f.Close() }()
return NewManifestFromReader(f) return NewManifestFromReader(f)
} }

View File

@ -12,12 +12,12 @@ func (m *manifest) WriteToFile(path string) error {
if err != nil { if err != nil {
return err return err
} }
defer f.Close() defer func() { _ = f.Close() }()
return m.WriteTo(f) return m.Write(f)
} }
func (m *manifest) WriteTo(output io.Writer) error { func (m *manifest) Write(output io.Writer) error {
if m.pbOuter == nil { if m.pbOuter == nil {
err := m.generate() err := m.generate()
if err != nil { if err != nil {

View File

@ -65,7 +65,7 @@ func (m *manifest) generateOuter() error {
return err return err
} }
gzw.Close() _ = gzw.Close()
o := &MFFileOuter{ o := &MFFileOuter{
InnerMessage: idc.Bytes(), InnerMessage: idc.Bytes(),