package cnbutils import ( "os" "path" "path/filepath" "strings" "github.com/SAP/jenkins-library/pkg/log" "github.com/pkg/errors" ignore "github.com/sabhiram/go-gitignore" ) func CopyProject(source, target string, include, exclude *ignore.GitIgnore, utils BuildUtils) error { sourceFiles, _ := utils.Glob(path.Join(source, "**")) for _, sourceFile := range sourceFiles { relPath, err := filepath.Rel(source, sourceFile) if err != nil { log.SetErrorCategory(log.ErrorBuild) return errors.Wrapf(err, "Calculating relative path for '%s' failed", sourceFile) } if !isIgnored(relPath, include, exclude) { target := path.Join(target, strings.ReplaceAll(sourceFile, source, "")) dir, err := utils.DirExists(sourceFile) if err != nil { log.SetErrorCategory(log.ErrorBuild) return errors.Wrapf(err, "Checking file info '%s' failed", target) } if dir { err = utils.MkdirAll(target, os.ModePerm) if err != nil { log.SetErrorCategory(log.ErrorBuild) return errors.Wrapf(err, "Creating directory '%s' failed", target) } } else { log.Entry().Debugf("Copying '%s' to '%s'", sourceFile, target) err = copyFile(sourceFile, target, utils) if err != nil { log.SetErrorCategory(log.ErrorBuild) return errors.Wrapf(err, "Copying '%s' to '%s' failed", sourceFile, target) } } } } return nil } func copyFile(source, target string, utils BuildUtils) error { targetDir := filepath.Dir(target) exists, err := utils.DirExists(targetDir) if err != nil { return err } if !exists { log.Entry().Debugf("Creating directory %s", targetDir) err = utils.MkdirAll(targetDir, os.ModePerm) if err != nil { return err } } _, err = utils.Copy(source, target) return err } func isIgnored(find string, include, exclude *ignore.GitIgnore) bool { if exclude != nil { filtered := exclude.MatchesPath(find) if filtered { log.Entry().Debugf("%s matches exclude pattern, ignoring", find) return true } } if include != nil { filtered := !include.MatchesPath(find) if filtered { log.Entry().Debugf("%s doesn't match include pattern, ignoring", find) return true } else { log.Entry().Debugf("%s matches include pattern", find) return false } } return false }