github.com/argoproj/argo-cd/v3@v3.2.1/test/fixture/path/files.go (about)

     1  package path
     2  
     3  import (
     4  	"fmt"
     5  	"io"
     6  	"os"
     7  	"path/filepath"
     8  	"testing"
     9  )
    10  
    11  // CopyDir copies the contents of a directory from 'src' to 'dest'
    12  func CopyDir(src string, dest string) error {
    13  	mode, err := os.Stat(src)
    14  	if err != nil {
    15  		return err
    16  	}
    17  
    18  	if mode.IsDir() {
    19  		dirContents, err := os.ReadDir(src)
    20  		if err != nil {
    21  			return err
    22  		}
    23  
    24  		for _, f := range dirContents {
    25  			srcFileaPath := filepath.Join(src, f.Name())
    26  			destFilePath := filepath.Join(dest, f.Name())
    27  			if err := CopyDir(srcFileaPath, destFilePath); err != nil {
    28  				return err
    29  			}
    30  		}
    31  		return nil
    32  	}
    33  
    34  	if err := os.MkdirAll(filepath.Dir(dest), os.ModePerm); err != nil {
    35  		return err
    36  	}
    37  
    38  	return copySingleFile(src, dest, mode)
    39  }
    40  
    41  func copySingleFile(src string, dest string, mode os.FileInfo) error {
    42  	if src == dest {
    43  		return nil
    44  	}
    45  
    46  	// Ensure the file is not a directory
    47  	file, err := os.Stat(src)
    48  	if err != nil {
    49  		return err
    50  	}
    51  	if file.IsDir() {
    52  		return fmt.Errorf("unable to copy directories: %s", src)
    53  	}
    54  
    55  	srcFile, err := os.Open(src)
    56  	if err != nil {
    57  		return err
    58  	}
    59  	defer srcFile.Close()
    60  
    61  	destFile, err := os.Create(dest)
    62  	if err != nil {
    63  		return err
    64  	}
    65  	defer destFile.Close()
    66  
    67  	err = os.Chmod(destFile.Name(), mode.Mode())
    68  	if err != nil {
    69  		return err
    70  	}
    71  
    72  	_, err = io.Copy(destFile, srcFile)
    73  	if err != nil {
    74  		return err
    75  	}
    76  
    77  	return nil
    78  }
    79  
    80  // CreateSymlink creates a symlink with name linkName to file destName in
    81  // workingDir
    82  func CreateSymlink(t *testing.T, destName, linkName string) error {
    83  	t.Helper()
    84  	return os.Symlink(destName, linkName)
    85  }