Function to create symlinks atomically

This commit is contained in:
Kovid Goyal
2023-02-21 15:35:41 +05:30
parent fa45324d39
commit fbaaca1be9
5 changed files with 102 additions and 18 deletions

View File

@@ -12,6 +12,30 @@ import (
var _ = fmt.Print
func AtomicCreateSymlink(oldname, newname string) (err error) {
err = os.Symlink(oldname, newname)
if err == nil {
return nil
}
if !errors.Is(err, fs.ErrExist) {
return err
}
for {
tempname := newname + RandomFilename()
err = os.Symlink(oldname, tempname)
if err == nil {
err = os.Rename(tempname, newname)
if err != nil {
os.Remove(tempname)
}
return err
}
if !errors.Is(err, fs.ErrExist) {
return err
}
}
}
func AtomicWriteFile(path string, data []byte, perm os.FileMode) (err error) {
npath, err := filepath.EvalSymlinks(path)
if errors.Is(err, fs.ErrNotExist) {