package os_test
import (
+ "bytes"
"errors"
"fmt"
"io/fs"
"log"
"os"
"path/filepath"
+ "sync"
"time"
)
// Output:
// hello.link links to hello.txt
}
+
+func ExampleUserCacheDir() {
+ dir, dirErr := os.UserCacheDir()
+ if dirErr == nil {
+ dir = filepath.Join(dir, "ExampleUserCacheDir")
+ }
+
+ getCache := func(name string) ([]byte, error) {
+ if dirErr != nil {
+ return nil, &os.PathError{Op: "getCache", Path: name, Err: os.ErrNotExist}
+ }
+ return os.ReadFile(filepath.Join(dir, name))
+ }
+
+ var mkdirOnce sync.Once
+ putCache := func(name string, b []byte) error {
+ if dirErr != nil {
+ return &os.PathError{Op: "putCache", Path: name, Err: dirErr}
+ }
+ mkdirOnce.Do(func() {
+ if err := os.MkdirAll(dir, 0700); err != nil {
+ log.Printf("can't create user cache dir: %v", err)
+ }
+ })
+ return os.WriteFile(filepath.Join(dir, name), b, 0600)
+ }
+
+ // Read and store cached data.
+ // …
+ _ = getCache
+ _ = putCache
+
+ // Output:
+}
+
+func ExampleUserConfigDir() {
+ dir, dirErr := os.UserConfigDir()
+
+ var (
+ configPath string
+ origConfig []byte
+ )
+ if dirErr == nil {
+ configPath = filepath.Join(dir, "ExampleUserConfigDir", "example.conf")
+ var err error
+ origConfig, err = os.ReadFile(configPath)
+ if err != nil && !os.IsNotExist(err) {
+ // The user has a config file but we couldn't read it.
+ // Report the error instead of ignoring their configuration.
+ log.Fatal(err)
+ }
+ }
+
+ // Use and perhaps make changes to the config.
+ config := bytes.Clone(origConfig)
+ // …
+
+ // Save changes.
+ if !bytes.Equal(config, origConfig) {
+ if configPath == "" {
+ log.Printf("not saving config changes: %v", dirErr)
+ } else {
+ err := os.MkdirAll(filepath.Dir(configPath), 0700)
+ if err == nil {
+ err = os.WriteFile(configPath, config, 0600)
+ }
+ if err != nil {
+ log.Printf("error saving config changes: %v", err)
+ }
+ }
+ }
+
+ // Output:
+}
"internal/testenv"
"io"
"io/fs"
+ "log"
. "os"
"os/exec"
"path/filepath"
Exit(0)
}
+ log.SetFlags(log.LstdFlags | log.Lshortfile)
+
Exit(m.Run())
}
t.Fatalf("UserCacheDir returned %q; want non-empty path or error", dir)
}
- if err := MkdirAll(dir, 0777); err != nil {
- t.Fatalf("could not create UserCacheDir: %v", err)
- }
- d, err := MkdirTemp(dir, "TestUserCacheDir")
+ fi, err := Stat(dir)
if err != nil {
- t.Fatalf("could not create a directory in UserCacheDir: %v", err)
- }
- if err := Remove(d); err != nil {
+ if IsNotExist(err) {
+ t.Log(err)
+ return
+ }
t.Fatal(err)
}
+ if !fi.IsDir() {
+ t.Fatalf("dir %s is not directory; type = %v", dir, fi.Mode())
+ }
}
func TestUserConfigDir(t *testing.T) {
t.Fatalf("UserConfigDir returned %q; want non-empty path or error", dir)
}
- if err := MkdirAll(dir, 0777); err != nil {
- t.Fatalf("could not create UserConfigDir: %v", err)
- }
-
- d, err := MkdirTemp(dir, "TestUserConfigDir")
+ fi, err := Stat(dir)
if err != nil {
- t.Fatalf("could not create a directory in UserConfigDir: %v", err)
- }
- if err := Remove(d); err != nil {
+ if IsNotExist(err) {
+ t.Log(err)
+ return
+ }
t.Fatal(err)
}
+ if !fi.IsDir() {
+ t.Fatalf("dir %s is not directory; type = %v", dir, fi.Mode())
+ }
}
func TestUserHomeDir(t *testing.T) {