123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- /*
- Copyright 2018 The Kubernetes Authors.
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
- http://www.apache.org/licenses/LICENSE-2.0
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- */
- package fs
- import (
- "fmt"
- "io/ioutil"
- "log"
- "os"
- "path/filepath"
- )
- var _ FileSystem = realFS{}
- // realFS implements FileSystem using the local filesystem.
- type realFS struct{}
- // MakeRealFS makes an instance of realFS.
- func MakeRealFS() FileSystem {
- return realFS{}
- }
- // Create delegates to os.Create.
- func (realFS) Create(name string) (File, error) { return os.Create(name) }
- // Mkdir delegates to os.Mkdir.
- func (realFS) Mkdir(name string) error {
- return os.Mkdir(name, 0777|os.ModeDir)
- }
- // MkdirAll delegates to os.MkdirAll.
- func (realFS) MkdirAll(name string) error {
- return os.MkdirAll(name, 0777|os.ModeDir)
- }
- // RemoveAll delegates to os.RemoveAll.
- func (realFS) RemoveAll(name string) error {
- return os.RemoveAll(name)
- }
- // Open delegates to os.Open.
- func (realFS) Open(name string) (File, error) { return os.Open(name) }
- // CleanedAbs returns a cleaned, absolute path
- // with no symbolic links split into directory
- // and file components. If the entire path is
- // a directory, the file component is an empty
- // string.
- func (x realFS) CleanedAbs(
- path string) (ConfirmedDir, string, error) {
- absRoot, err := filepath.Abs(path)
- if err != nil {
- return "", "", fmt.Errorf(
- "abs path error on '%s' : %v", path, err)
- }
- deLinked, err := filepath.EvalSymlinks(absRoot)
- if err != nil {
- return "", "", fmt.Errorf(
- "evalsymlink failure on '%s' : %v", path, err)
- }
- if x.IsDir(deLinked) {
- return ConfirmedDir(deLinked), "", nil
- }
- d := filepath.Dir(deLinked)
- if !x.IsDir(d) {
- // Programmer/assumption error.
- log.Fatalf("first part of '%s' not a directory", deLinked)
- }
- if d == deLinked {
- // Programmer/assumption error.
- log.Fatalf("d '%s' should be a subset of deLinked", d)
- }
- f := filepath.Base(deLinked)
- if filepath.Join(d, f) != deLinked {
- // Programmer/assumption error.
- log.Fatalf("these should be equal: '%s', '%s'",
- filepath.Join(d, f), deLinked)
- }
- return ConfirmedDir(d), f, nil
- }
- // Exists returns true if os.Stat succeeds.
- func (realFS) Exists(name string) bool {
- _, err := os.Stat(name)
- return err == nil
- }
- // Glob returns the list of matching files
- func (realFS) Glob(pattern string) ([]string, error) {
- return filepath.Glob(pattern)
- }
- // IsDir delegates to os.Stat and FileInfo.IsDir
- func (realFS) IsDir(name string) bool {
- info, err := os.Stat(name)
- if err != nil {
- return false
- }
- return info.IsDir()
- }
- // ReadFile delegates to ioutil.ReadFile.
- func (realFS) ReadFile(name string) ([]byte, error) { return ioutil.ReadFile(name) }
- // WriteFile delegates to ioutil.WriteFile with read/write permissions.
- func (realFS) WriteFile(name string, c []byte) error {
- return ioutil.WriteFile(name, c, 0666)
- }
|