mirror of
https://github.com/SAP/jenkins-library.git
synced 2024-12-14 11:03:09 +02:00
94 lines
2.2 KiB
Go
94 lines
2.2 KiB
Go
|
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
|
||
|
}
|