in kinder/hack/orderimports/orderimports.go [87:160]
func processFile(filename string, in io.Reader, out io.Writer, stdin bool) error {
fileSet := token.NewFileSet() // per file FileSet
var perm fs.FileMode = 0644
if in == nil {
f, err := os.Open(filename)
if err != nil {
return err
}
defer f.Close()
fi, err := f.Stat()
if err != nil {
return err
}
in = f
perm = fi.Mode().Perm()
}
src, err := io.ReadAll(in)
if err != nil {
return err
}
astFile, err := parser.ParseFile(fileSet, filename, src, parserMode)
if err != nil {
return err
}
sortImports(fileSet, astFile)
var buf bytes.Buffer
cfg := printer.Config{Mode: printerMode, Tabwidth: tabWidth}
err = cfg.Fprint(&buf, fileSet, astFile)
if err != nil {
return err
}
res := buf.Bytes()
if !bytes.Equal(src, res) {
// formatting has changed
if *list {
fmt.Fprintln(out, filename)
}
if *write {
// make a temporary backup before overwriting original
bakname, err := backupFile(filename+".", src, perm)
if err != nil {
return err
}
err = os.WriteFile(filename, res, perm)
if err != nil {
os.Rename(bakname, filename)
return err
}
err = os.Remove(bakname)
if err != nil {
return err
}
}
if *doDiff {
data, err := diffWithReplaceTempFile(src, res, filename)
if err != nil {
return fmt.Errorf("computing diff: %s", err)
}
fmt.Printf("diff -u %s %s\n", filepath.ToSlash(filename+".orig"), filepath.ToSlash(filename))
out.Write(data)
}
}
if !*list && !*write && !*doDiff {
_, err = out.Write(res)
}
return err
}