40 lines
		
	
	
		
			636 B
		
	
	
	
		
			Go
		
	
	
	
		
		
			
		
	
	
			40 lines
		
	
	
		
			636 B
		
	
	
	
		
			Go
		
	
	
	
| 
								 | 
							
								package fileutils
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import (
							 | 
						||
| 
								 | 
							
									"os"
							 | 
						||
| 
								 | 
							
									"path"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									"github.com/spf13/afero"
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// Copy copies a file or folder from one place to another.
							 | 
						||
| 
								 | 
							
								func Copy(fs afero.Fs, src, dst string) error {
							 | 
						||
| 
								 | 
							
									if src = path.Clean("/" + src); src == "" {
							 | 
						||
| 
								 | 
							
										return os.ErrNotExist
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									if dst = path.Clean("/" + dst); dst == "" {
							 | 
						||
| 
								 | 
							
										return os.ErrNotExist
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									if src == "/" || dst == "/" {
							 | 
						||
| 
								 | 
							
										// Prohibit copying from or to the virtual root directory.
							 | 
						||
| 
								 | 
							
										return os.ErrInvalid
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									if dst == src {
							 | 
						||
| 
								 | 
							
										return os.ErrInvalid
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									info, err := fs.Stat(src)
							 | 
						||
| 
								 | 
							
									if err != nil {
							 | 
						||
| 
								 | 
							
										return err
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									if info.IsDir() {
							 | 
						||
| 
								 | 
							
										return CopyDir(fs, src, dst)
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									return CopyFile(fs, src, dst)
							 | 
						||
| 
								 | 
							
								}
							 |