Finish the lint remediation: script/cibuild exits 0 (closes #61) #77
@@ -16,6 +16,7 @@ func main() {
|
||||
if err != nil {
|
||||
panic("could not create CPU profile: " + err.Error())
|
||||
}
|
||||
|
||||
defer func() { _ = f.Close() }()
|
||||
|
||||
err = pprof.StartCPUProfile(f)
|
||||
@@ -33,6 +34,7 @@ func main() {
|
||||
if err != nil {
|
||||
panic("could not create memory profile: " + err.Error())
|
||||
}
|
||||
|
||||
defer func() { _ = f.Close() }()
|
||||
|
||||
runtime.GC() // get up-to-date statistics
|
||||
|
||||
@@ -64,6 +64,7 @@ func CompressStream(
|
||||
}
|
||||
|
||||
closed := false
|
||||
|
||||
defer func() {
|
||||
if !closed {
|
||||
_ = w.Close()
|
||||
|
||||
@@ -163,6 +163,7 @@ func (c *Chunker) ChunkFile(path string) ([]Chunk, error) {
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("opening file: %w", err)
|
||||
}
|
||||
|
||||
defer func() {
|
||||
err := file.Close()
|
||||
if err != nil && err.Error() != "invalid argument" {
|
||||
|
||||
@@ -157,6 +157,7 @@ func RunApp(ctx context.Context, app *fx.App) error {
|
||||
|
||||
// Handle shutdown
|
||||
shutdownComplete := make(chan struct{})
|
||||
|
||||
go func() {
|
||||
defer close(shutdownComplete)
|
||||
|
||||
|
||||
@@ -19,6 +19,7 @@ func TestDatabase(t *testing.T) {
|
||||
if err != nil {
|
||||
t.Fatalf("failed to create database: %v", err)
|
||||
}
|
||||
|
||||
defer func() {
|
||||
err := db.Close()
|
||||
if err != nil {
|
||||
@@ -73,6 +74,7 @@ func TestDatabaseConcurrentAccess(t *testing.T) {
|
||||
if err != nil {
|
||||
t.Fatalf("failed to create database: %v", err)
|
||||
}
|
||||
|
||||
defer func() {
|
||||
err := db.Close()
|
||||
if err != nil {
|
||||
@@ -182,6 +184,7 @@ func TestApplyMigrations_Idempotent(t *testing.T) {
|
||||
if err != nil {
|
||||
t.Fatalf("failed to open database: %v", err)
|
||||
}
|
||||
|
||||
defer func() {
|
||||
err := conn.Close()
|
||||
if err != nil {
|
||||
@@ -239,6 +242,7 @@ func TestBootstrapMigrationsTable_FreshDatabase(t *testing.T) {
|
||||
if err != nil {
|
||||
t.Fatalf("failed to open database: %v", err)
|
||||
}
|
||||
|
||||
defer func() {
|
||||
err := conn.Close()
|
||||
if err != nil {
|
||||
|
||||
@@ -17,6 +17,7 @@ func logSnapshotFileIDs(t *testing.T, db *DB) {
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
defer func() {
|
||||
err := rows.Close()
|
||||
if err != nil {
|
||||
|
||||
@@ -96,6 +96,7 @@ func (r *UploadRepository) GetRecentUploads(
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
defer func() {
|
||||
err := rows.Close()
|
||||
if err != nil {
|
||||
|
||||
@@ -48,6 +48,7 @@ func TestAcquireBlocksSecondInstance(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
|
||||
require.NotNil(t, lock1)
|
||||
|
||||
defer func() { _ = lock1.Release() }()
|
||||
|
||||
// Try to acquire second lock - should fail
|
||||
@@ -72,6 +73,7 @@ func TestAcquireWithStaleLock(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
|
||||
require.NotNil(t, lock)
|
||||
|
||||
defer func() { _ = lock.Release() }()
|
||||
|
||||
// Verify our PID is now in the file
|
||||
@@ -117,6 +119,7 @@ func TestAcquireCreatesDirectory(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
|
||||
require.NotNil(t, lock)
|
||||
|
||||
defer func() { _ = lock.Release() }()
|
||||
|
||||
// Verify directory was created
|
||||
|
||||
@@ -12,6 +12,7 @@ import (
|
||||
//nolint:paralleltest // test servers share a fixed localhost port
|
||||
func TestClient(t *testing.T) {
|
||||
ts := NewTestServer(t)
|
||||
|
||||
defer func() {
|
||||
err := ts.Cleanup()
|
||||
if err != nil {
|
||||
@@ -58,6 +59,7 @@ func verifyPutGetHead(
|
||||
if err != nil {
|
||||
t.Fatalf("failed to get object: %v", err)
|
||||
}
|
||||
|
||||
defer func() {
|
||||
err := reader.Close()
|
||||
if err != nil {
|
||||
|
||||
@@ -147,6 +147,7 @@ func (ts *TestServer) Client() *s3.Client {
|
||||
//nolint:paralleltest // test servers share a fixed localhost port
|
||||
func TestBasicS3Operations(t *testing.T) {
|
||||
ts := NewTestServer(t)
|
||||
|
||||
defer func() {
|
||||
err := ts.Cleanup()
|
||||
if err != nil {
|
||||
@@ -179,6 +180,7 @@ func TestBasicS3Operations(t *testing.T) {
|
||||
if err != nil {
|
||||
t.Fatalf("failed to get object: %v", err)
|
||||
}
|
||||
|
||||
defer func() {
|
||||
err := result.Body.Close()
|
||||
if err != nil {
|
||||
@@ -202,6 +204,7 @@ func TestBasicS3Operations(t *testing.T) {
|
||||
//nolint:paralleltest // test servers share a fixed localhost port
|
||||
func TestBlobOperations(t *testing.T) {
|
||||
ts := NewTestServer(t)
|
||||
|
||||
defer func() {
|
||||
err := ts.Cleanup()
|
||||
if err != nil {
|
||||
@@ -268,6 +271,7 @@ func TestBlobOperations(t *testing.T) {
|
||||
//nolint:paralleltest // test servers share a fixed localhost port
|
||||
func TestMetadataOperations(t *testing.T) {
|
||||
ts := NewTestServer(t)
|
||||
|
||||
defer func() {
|
||||
err := ts.Cleanup()
|
||||
if err != nil {
|
||||
|
||||
@@ -461,6 +461,7 @@ func (b *BackupEngine) backupOneFile(
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
defer func() {
|
||||
err := f.Close()
|
||||
if err != nil {
|
||||
|
||||
@@ -75,6 +75,7 @@ func TestFileContentChange(t *testing.T) {
|
||||
db, err := database.NewTestDB()
|
||||
|
||||
require.NoError(t, err)
|
||||
|
||||
defer func() {
|
||||
err := db.Close()
|
||||
if err != nil {
|
||||
@@ -165,6 +166,7 @@ func TestMultipleFileChanges(t *testing.T) {
|
||||
db, err := database.NewTestDB()
|
||||
|
||||
require.NoError(t, err)
|
||||
|
||||
defer func() {
|
||||
err := db.Close()
|
||||
if err != nil {
|
||||
|
||||
@@ -127,6 +127,7 @@ func NewProgressReporter() *ProgressReporter {
|
||||
// Start begins the progress reporting
|
||||
func (pr *ProgressReporter) Start() {
|
||||
pr.wg.Add(1)
|
||||
|
||||
go pr.run()
|
||||
|
||||
// Print initial multi-line status
|
||||
|
||||
@@ -1673,6 +1673,7 @@ func (s *Scanner) processFileStreaming(
|
||||
if err != nil {
|
||||
return fmt.Errorf("opening file: %w", wrapPermissionError(fileToProcess.Path, err))
|
||||
}
|
||||
|
||||
defer func() { _ = file.Close() }()
|
||||
|
||||
var chunks []streamingChunkInfo
|
||||
|
||||
@@ -164,6 +164,7 @@ func TestScannerSimpleDirectory(t *testing.T) {
|
||||
if err != nil {
|
||||
t.Fatalf("failed to create test database: %v", err)
|
||||
}
|
||||
|
||||
defer func() {
|
||||
err := db.Close()
|
||||
if err != nil {
|
||||
@@ -241,6 +242,7 @@ func TestScannerLargeFile(t *testing.T) {
|
||||
if err != nil {
|
||||
t.Fatalf("failed to create test database: %v", err)
|
||||
}
|
||||
|
||||
defer func() {
|
||||
err := db.Close()
|
||||
if err != nil {
|
||||
|
||||
@@ -259,6 +259,7 @@ func (sm *SnapshotManager) ExportSnapshotMetadata(
|
||||
}
|
||||
|
||||
log.Debug("Created temporary directory", "path", tempDir)
|
||||
|
||||
defer func() {
|
||||
log.Debug("Cleaning up temporary directory", "path", tempDir)
|
||||
|
||||
@@ -555,6 +556,7 @@ func (sm *SnapshotManager) cleanSnapshotDB(
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("opening temp database: %w", err)
|
||||
}
|
||||
|
||||
defer func() {
|
||||
err := db.Close()
|
||||
if err != nil {
|
||||
@@ -567,6 +569,7 @@ func (sm *SnapshotManager) cleanSnapshotDB(
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("beginning transaction: %w", err)
|
||||
}
|
||||
|
||||
defer func() {
|
||||
rbErr := tx.Rollback()
|
||||
if rbErr != nil && !errors.Is(rbErr, sql.ErrTxDone) {
|
||||
@@ -685,6 +688,7 @@ func (sm *SnapshotManager) compressFile(inputPath, outputPath string) error {
|
||||
if err != nil {
|
||||
return fmt.Errorf("opening input file: %w", err)
|
||||
}
|
||||
|
||||
defer func() {
|
||||
err := input.Close()
|
||||
if err != nil {
|
||||
@@ -696,6 +700,7 @@ func (sm *SnapshotManager) compressFile(inputPath, outputPath string) error {
|
||||
if err != nil {
|
||||
return fmt.Errorf("creating output file: %w", err)
|
||||
}
|
||||
|
||||
defer func() {
|
||||
err := output.Close()
|
||||
if err != nil {
|
||||
@@ -714,6 +719,7 @@ func (sm *SnapshotManager) compressFile(inputPath, outputPath string) error {
|
||||
|
||||
// Track if writer has been closed to avoid double-close
|
||||
writerClosed := false
|
||||
|
||||
defer func() {
|
||||
if !writerClosed {
|
||||
err := writer.Close()
|
||||
@@ -749,6 +755,7 @@ func (sm *SnapshotManager) copyFile(src, dst string) error {
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
defer func() {
|
||||
log.Debug("Closing source file", "path", src)
|
||||
|
||||
@@ -764,6 +771,7 @@ func (sm *SnapshotManager) copyFile(src, dst string) error {
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
defer func() {
|
||||
log.Debug("Closing destination file", "path", dst)
|
||||
|
||||
@@ -794,6 +802,7 @@ func (sm *SnapshotManager) generateBlobManifest(
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("opening database: %w", err)
|
||||
}
|
||||
|
||||
defer func() { _ = db.Close() }()
|
||||
|
||||
// Create repositories to access the data
|
||||
|
||||
@@ -25,12 +25,14 @@ func copyFile(fs afero.Fs, src, dst string) error {
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
defer func() { _ = sourceFile.Close() }()
|
||||
|
||||
destFile, err := fs.Create(dst)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
defer func() { _ = destFile.Close() }()
|
||||
|
||||
_, err = io.Copy(destFile, sourceFile)
|
||||
@@ -53,6 +55,7 @@ func verifyCleanedDB(
|
||||
if err != nil {
|
||||
t.Fatalf("failed to open cleaned database: %v", err)
|
||||
}
|
||||
|
||||
defer func() {
|
||||
err := cleanedDB.Close()
|
||||
if err != nil {
|
||||
|
||||
@@ -62,6 +62,7 @@ func (f *FileStorer) Put(_ context.Context, key string, data io.Reader) error {
|
||||
if err != nil {
|
||||
return fmt.Errorf("creating file: %w", err)
|
||||
}
|
||||
|
||||
defer func() { _ = file.Close() }()
|
||||
|
||||
_, err = io.Copy(file, data)
|
||||
@@ -91,6 +92,7 @@ func (f *FileStorer) PutWithProgress(
|
||||
if err != nil {
|
||||
return fmt.Errorf("creating file: %w", err)
|
||||
}
|
||||
|
||||
defer func() { _ = file.Close() }()
|
||||
|
||||
// Wrap with progress tracking
|
||||
@@ -209,6 +211,7 @@ func (f *FileStorer) List(ctx context.Context, prefix string) ([]string, error)
|
||||
// ListStream returns a channel of ObjectInfo for large result sets.
|
||||
func (f *FileStorer) ListStream(ctx context.Context, prefix string) <-chan ObjectInfo {
|
||||
ch := make(chan ObjectInfo)
|
||||
|
||||
go func() {
|
||||
defer close(ch)
|
||||
|
||||
|
||||
@@ -68,6 +68,7 @@ func (s *S3Storer) List(ctx context.Context, prefix string) ([]string, error) {
|
||||
// ListStream returns a channel of ObjectInfo for large result sets.
|
||||
func (s *S3Storer) ListStream(ctx context.Context, prefix string) <-chan ObjectInfo {
|
||||
ch := make(chan ObjectInfo)
|
||||
|
||||
go func() {
|
||||
defer close(ch)
|
||||
|
||||
|
||||
@@ -238,6 +238,7 @@ func (c *blobDiskCache) ReadAt(key string, offset, length int64) ([]byte, error)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
defer func() { _ = f.Close() }()
|
||||
|
||||
buf := make([]byte, length)
|
||||
|
||||
@@ -14,6 +14,7 @@ func TestBlobDiskCache_BasicGetPut(t *testing.T) {
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
defer func() { _ = cache.Close() }()
|
||||
|
||||
data := []byte("hello world")
|
||||
@@ -79,6 +80,7 @@ func TestBlobDiskCache_OversizedEntryRejected(t *testing.T) {
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
defer func() { _ = cache.Close() }()
|
||||
|
||||
data := make([]byte, 200)
|
||||
@@ -100,6 +102,7 @@ func TestBlobDiskCache_UpdateInPlace(t *testing.T) {
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
defer func() { _ = cache.Close() }()
|
||||
|
||||
err = cache.Put("key1", []byte("v1"))
|
||||
@@ -137,6 +140,7 @@ func TestBlobDiskCache_ReadAt(t *testing.T) {
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
defer func() { _ = cache.Close() }()
|
||||
|
||||
data := make([]byte, 1024)
|
||||
@@ -197,6 +201,7 @@ func TestBlobDiskCache_LRUOrder(t *testing.T) {
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
defer func() { _ = cache.Close() }()
|
||||
|
||||
d := make([]byte, 100)
|
||||
|
||||
@@ -134,6 +134,7 @@ func (m *MockStorer) ListStream(
|
||||
_ context.Context, prefix string,
|
||||
) <-chan storage.ObjectInfo {
|
||||
ch := make(chan storage.ObjectInfo)
|
||||
|
||||
go func() {
|
||||
defer close(ch)
|
||||
|
||||
@@ -326,6 +327,7 @@ func TestEndToEndBackup(t *testing.T) {
|
||||
db, err := database.New(ctx, ":memory:")
|
||||
|
||||
require.NoError(t, err)
|
||||
|
||||
defer func() {
|
||||
err := db.Close()
|
||||
if err != nil {
|
||||
@@ -411,6 +413,7 @@ func TestBackupAndVerify(t *testing.T) {
|
||||
db, err := database.New(ctx, ":memory:")
|
||||
|
||||
require.NoError(t, err)
|
||||
|
||||
defer func() {
|
||||
err := db.Close()
|
||||
if err != nil {
|
||||
@@ -968,6 +971,7 @@ func TestDedupOnlySnapshotRestores(t *testing.T) {
|
||||
|
||||
env := setupDedupBackupEnv(
|
||||
ctx, t, fs, storeDir, dbPath, chunkSize, maxBlobSize)
|
||||
|
||||
defer func() { _ = env.db.Close() }()
|
||||
|
||||
cfg, storer, repos, sm := env.cfg, env.storer, env.repos, env.sm
|
||||
|
||||
@@ -590,6 +590,7 @@ func (v *Vaultik) downloadSnapshotDB(
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("downloading %s: %w", dbKey, err)
|
||||
}
|
||||
|
||||
defer func() { _ = reader.Close() }()
|
||||
|
||||
// Read all data
|
||||
@@ -606,6 +607,7 @@ func (v *Vaultik) downloadSnapshotDB(
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("creating decryption reader: %w", err)
|
||||
}
|
||||
|
||||
defer func() { _ = blobReader.Close() }()
|
||||
|
||||
// Read the binary SQLite database
|
||||
@@ -1115,6 +1117,7 @@ func (v *Vaultik) verifyFile(
|
||||
if err != nil {
|
||||
return 0, fmt.Errorf("opening file: %w", err)
|
||||
}
|
||||
|
||||
defer func() { _ = f.Close() }()
|
||||
|
||||
// Verify each chunk
|
||||
|
||||
@@ -110,6 +110,7 @@ func (s *restoreSweeper) blobStillNeeded(blobHash string) (bool, error) {
|
||||
if err != nil {
|
||||
return true, fmt.Errorf("querying referencing files: %w", err)
|
||||
}
|
||||
|
||||
defer func() { _ = rows.Close() }()
|
||||
|
||||
for rows.Next() {
|
||||
|
||||
@@ -1130,6 +1130,7 @@ func (v *Vaultik) downloadManifestByKey(remoteKey string) (*snapshot.Manifest, e
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
defer func() { _ = reader.Close() }()
|
||||
|
||||
manifest, err := snapshot.DecodeManifest(reader)
|
||||
|
||||
@@ -96,6 +96,7 @@ func (v *Vaultik) RunDeepVerify(snapshotID string, opts *VerifyOptions) error {
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
defer func() {
|
||||
if tempDB != nil {
|
||||
_ = tempDB.Close()
|
||||
@@ -343,6 +344,7 @@ func (v *Vaultik) verifyBlob(blobInfo snapshot.BlobInfo, db *sql.DB) error {
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to download: %w", err)
|
||||
}
|
||||
|
||||
defer func() { _ = reader.Close() }()
|
||||
|
||||
// Get decryptor
|
||||
|
||||
Reference in New Issue
Block a user