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 nilView on GitHub (pinned to 0eeec0b92e)
Solutions
- Check disk space on the destination volume (df -h) and free space
- Retry the install after freeing space - treat a close failure as a possibly-corrupt file
- If on NFS/network storage, verify mount health and retry
- 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
- Check free disk space before starting large extractions
- Treat close errors as write failures, never as success
- Use the same deferred-close-and-propagate pattern extractFile uses in your own code
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
- failed to create parent directory: %w
- failed to create file: %w
- failed to write file: %w
- failed to write config after migration: %s
- failed to close file while handling write error: %v
AI-assisted analysis of cli/cli@0eeec0b92e (2026-08-15).
Data as JSON: /api/errors/c6cd936939a7d44e.
Report an issue: GitHub.