cli/cli · error

failed to close file: %w

Error message

failed to close file: %w

What it means

The deferred close in extractFile found that out.Close() failed while the copy itself succeeded (the guard only fires when err == nil). Closing a written file can fail when buffered data cannot be flushed, so the file on disk may be incomplete even though no earlier error was reported.

Source

Thrown at pkg/cmd/copilot/copilot.go:461

				return fmt.Errorf("failed to create parent directory: %w", err)
			}
			if err := extractFile(target, os.FileMode(header.Mode)&0777, tr); err != nil {
				return err
			}
		}
	}
	return nil
}

// extractFile creates a file at target with the given mode and copies content from r.
func extractFile(target string, mode os.FileMode, r io.Reader) (err error) {
	out, err := os.OpenFile(target, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, mode)
	if err != nil {
		return fmt.Errorf("failed to create file: %w", err)
	}
	defer func() {
		if cerr := out.Close(); err == nil && cerr != nil {
			err = fmt.Errorf("failed to close file: %w", cerr)
		}
	}()
	if _, err := io.Copy(out, r); err != nil {
		return fmt.Errorf("failed to write file: %w", err)
	}
	return nil
}

func removeCopilot(installDir string) error {
	if _, err := os.Stat(installDir); os.IsNotExist(err) {
		return fmt.Errorf("failed to remove Copilot CLI: Copilot CLI not installed through `gh`")
	}

	if err := os.RemoveAll(installDir); err != nil {
		return fmt.Errorf("failed to remove Copilot CLI: %w", err)
	}

	return nil

View on GitHub (pinned to 0eeec0b92e)

Solutions

  1. Check disk space on the destination volume (df -h) and free space
  2. Retry the install after freeing space - treat a close failure as a possibly-corrupt file
  3. If on NFS/network storage, verify mount health and retry
  4. Consider a local install directory
Defensive patterns

Strategy: try-catch

Try / catch

if err := extractFile(target, mode, r); err != nil {
    if strings.Contains(err.Error(), "failed to close file") {
        // close failure after successful copy usually means disk-full flush failure;
        // the file may be corrupt, so remove it
        _ = os.Remove(target)
        return fmt.Errorf("possible incomplete write (disk full?): %w", err)
    }
    return err
}

Prevention

When it happens

Trigger: os.File.Close returning an error after io.Copy succeeded: typically ENOSPC (disk filled between copy buffering and flush) or an NFS/network filesystem failing to commit dirty pages.

Common situations: Disk-full during copilot agent installation; flaky network-mounted home directories; container overlay filesystems under space pressure.

Related errors


AI-assisted analysis of cli/cli@0eeec0b92e (2026-08-15). Data as JSON: /api/errors/c6cd936939a7d44e. Report an issue: GitHub.