// CopyPackage copies the files from the srcPath to the destPath, destPath // folder and parents are are created if they don't already exist. func (ctx *Context) CopyPackage(destPath, srcPath string, ignoreFiles []string, tree bool) error { if pathos.FileStringEquals(destPath, srcPath) { return fmt.Errorf("Attempting to copy package to same location %q.", destPath) } err := os.MkdirAll(destPath, 0777) if err != nil { return err } // Ensure the dest is empty of files. destDir, err := os.Open(destPath) if err != nil { return err } ignoreTest := false if tree { for _, ignore := range ctx.ignoreTag { if ignore == "test" { ignoreTest = true break } } } fl, err := destDir.Readdir(-1) destDir.Close() if err != nil { return err } for _, fi := range fl { if fi.IsDir() { if tree { err = os.RemoveAll(filepath.Join(destPath, fi.Name())) if err != nil { return err } } continue } err = os.Remove(filepath.Join(destPath, fi.Name())) if err != nil { return err } } // Copy files into dest. srcDir, err := os.Open(srcPath) if err != nil { return err } fl, err = srcDir.Readdir(-1) srcDir.Close() if err != nil { return err } fileLoop: for _, fi := range fl { name := fi.Name() if name[0] == '.' { continue } if fi.IsDir() { if !tree { continue } if name[0] == '_' { continue } if ignoreTest { if strings.HasSuffix(name, "_test") || name == "testdata" { continue } } nextDestPath := filepath.Join(destPath, name) nextSrcPath := filepath.Join(srcPath, name) nextIgnoreFiles, err := ctx.getIngoreFiles(nextSrcPath) if err != nil { return err } err = ctx.CopyPackage(nextDestPath, nextSrcPath, nextIgnoreFiles, true) if err != nil { return err } continue } for _, ignore := range ignoreFiles { if pathos.FileStringEquals(name, ignore) { continue fileLoop } } err = copyFile( filepath.Join(destPath, name), filepath.Join(srcPath, name), ) if err != nil { return err } } return nil }
// RemovePackage removes the specified folder files. If folder is empty when // done (no nested folders, remove the folder and any empty parent folders. func RemovePackage(path, root string, tree bool) error { // Ensure the path is empty of files. dir, err := os.Open(path) if err != nil { return err } // Remove package files. fl, err := dir.Readdir(-1) dir.Close() if err != nil { return err } for _, fi := range fl { fullPath := filepath.Join(path, fi.Name()) if fi.IsDir() { if tree { // If tree == true then remove sub-directories too. err = os.RemoveAll(fullPath) if err != nil { return err } } continue } err = os.Remove(fullPath) if err != nil { return err } } // Remove empty parent folders. // Ignore errors here. for i := 0; i <= looplimit; i++ { if pathos.FileStringEquals(path, root) { return nil } dir, err := os.Open(path) if err != nil { // fmt.Fprintf(os.Stderr, "Failedd to open directory %q: %v\n", path, err) return nil } fl, err := dir.Readdir(1) dir.Close() if err != nil && err != io.EOF { // fmt.Fprintf(os.Stderr, "Failedd to list directory %q: %v\n", path, err) return nil } if len(fl) > 0 { return nil } err = os.Remove(path) if err != nil { // fmt.Fprintf(os.Stderr, "Failedd to remove empty directory %q: %v\n", path, err) return nil } nextPath := filepath.Clean(filepath.Join(path, "..")) // Check for root. if nextPath == path { return nil } path = nextPath } panic("removePackage() remove parent folders") }