github.com/telepresenceio/telepresence/v2@v2.20.0-pro.6.0.20240517030216-236ea954e789/pkg/dos/wdwrapper.go (about)

     1  package dos
     2  
     3  import (
     4  	"errors"
     5  	"io/fs"
     6  	"path/filepath"
     7  )
     8  
     9  type wdWrapper struct {
    10  	base FileSystem
    11  	wd   string
    12  }
    13  
    14  func WorkingDirWrapper(f FileSystem) FileSystem {
    15  	return &wdWrapper{base: f, wd: "/"}
    16  }
    17  
    18  func (w *wdWrapper) basePath(path string) string {
    19  	if filepath.IsAbs(path) {
    20  		return path
    21  	}
    22  	return filepath.Clean(filepath.Join(w.wd, path))
    23  }
    24  
    25  func (w *wdWrapper) Abs(name string) (string, error) {
    26  	return w.basePath(name), nil
    27  }
    28  
    29  func (w *wdWrapper) Chdir(path string) error {
    30  	path = w.basePath(path)
    31  	if s, err := w.base.Stat(path); err != nil {
    32  		return err
    33  	} else if !s.IsDir() {
    34  		return errors.New("not a directory")
    35  	}
    36  	w.wd = path
    37  	return nil
    38  }
    39  
    40  func (w *wdWrapper) Create(name string) (File, error) {
    41  	return w.base.Create(w.basePath(name))
    42  }
    43  
    44  func (w *wdWrapper) Getwd() (string, error) {
    45  	return w.wd, nil
    46  }
    47  
    48  func (w *wdWrapper) Mkdir(name string, perm fs.FileMode) error {
    49  	return w.base.Mkdir(w.basePath(name), perm)
    50  }
    51  
    52  func (w *wdWrapper) MkdirAll(name string, perm fs.FileMode) error {
    53  	return w.base.MkdirAll(w.basePath(name), perm)
    54  }
    55  
    56  func (w *wdWrapper) Open(name string) (File, error) {
    57  	return w.base.Open(w.basePath(name))
    58  }
    59  
    60  func (w *wdWrapper) OpenFile(name string, flag int, perm fs.FileMode) (File, error) {
    61  	return w.base.OpenFile(w.basePath(name), flag, perm)
    62  }
    63  
    64  func (w *wdWrapper) ReadDir(name string) ([]fs.DirEntry, error) {
    65  	return w.base.ReadDir(w.basePath(name))
    66  }
    67  
    68  func (w *wdWrapper) ReadFile(name string) ([]byte, error) {
    69  	return w.base.ReadFile(w.basePath(name))
    70  }
    71  
    72  func (w *wdWrapper) RealPath(name string) (string, error) {
    73  	return w.base.RealPath(w.basePath(name))
    74  }
    75  
    76  func (w *wdWrapper) Remove(name string) error {
    77  	return w.base.Remove(w.basePath(name))
    78  }
    79  
    80  func (w *wdWrapper) RemoveAll(name string) error {
    81  	return w.base.RemoveAll(w.basePath(name))
    82  }
    83  
    84  func (w *wdWrapper) Rename(oldName, newName string) error {
    85  	return w.base.Rename(w.basePath(oldName), w.basePath(newName))
    86  }
    87  
    88  func (w *wdWrapper) Stat(name string) (fs.FileInfo, error) {
    89  	return w.base.Stat(w.basePath(name))
    90  }
    91  
    92  func (w *wdWrapper) Symlink(oldName, newName string) error {
    93  	return w.base.Symlink(w.basePath(oldName), w.basePath(newName))
    94  }
    95  
    96  func (w *wdWrapper) WriteFile(name string, data []byte, perm fs.FileMode) error {
    97  	return w.base.WriteFile(w.basePath(name), data, perm)
    98  }