Skip to content

Commit

Permalink
Merge pull request #319 from priyawadhwa/bug
Browse files Browse the repository at this point in the history
Snapshot only specific files for COPY
  • Loading branch information
priyawadhwa authored Aug 27, 2018
2 parents a740b53 + 7080a8d commit f1c6803
Show file tree
Hide file tree
Showing 4 changed files with 30 additions and 48 deletions.
10 changes: 3 additions & 7 deletions pkg/commands/add.go
Original file line number Diff line number Diff line change
Expand Up @@ -79,16 +79,12 @@ func (a *AddCommand) ExecuteCommand(config *v1.Config, buildArgs *dockerfile.Bui
a.snapshotFiles = append(a.snapshotFiles, urlDest)
} else if util.IsFileLocalTarArchive(fullPath) {
logrus.Infof("Unpacking local tar archive %s to %s", src, dest)
if err := util.UnpackLocalTarArchive(fullPath, dest); err != nil {
return err
}
// Add the unpacked files to the snapshotter
filesAdded, err := util.Files(dest)
extractedFiles, err := util.UnpackLocalTarArchive(fullPath, dest)
if err != nil {
return err
}
logrus.Debugf("Added %v from local tar archive %s", filesAdded, src)
a.snapshotFiles = append(a.snapshotFiles, filesAdded...)
logrus.Debugf("Added %v from local tar archive %s", extractedFiles, src)
a.snapshotFiles = append(a.snapshotFiles, extractedFiles...)
} else {
unresolvedSrcs = append(unresolvedSrcs, src)
}
Expand Down
5 changes: 1 addition & 4 deletions pkg/commands/copy.go
Original file line number Diff line number Diff line change
Expand Up @@ -79,10 +79,7 @@ func (c *CopyCommand) ExecuteCommand(config *v1.Config, buildArgs *dockerfile.Bu
// we need to add '/' to the end to indicate the destination is a directory
dest = filepath.Join(cwd, dest) + "/"
}
if err := util.CopyDir(fullPath, dest); err != nil {
return err
}
copiedFiles, err := util.Files(dest)
copiedFiles, err := util.CopyDir(fullPath, dest)
if err != nil {
return err
}
Expand Down
48 changes: 18 additions & 30 deletions pkg/util/fs_util.go
Original file line number Diff line number Diff line change
Expand Up @@ -155,21 +155,24 @@ func ChildDirInWhitelist(path, directory string) bool {
return false
}

func unTar(r io.Reader, dest string) error {
// unTar returns a list of files that have been extracted from the tar archive at r to the path at dest
func unTar(r io.Reader, dest string) ([]string, error) {
var extractedFiles []string
tr := tar.NewReader(r)
for {
hdr, err := tr.Next()
if err == io.EOF {
break
}
if err != nil {
return err
return nil, err
}
if err := extractFile(dest, hdr, tr); err != nil {
return err
return nil, err
}
extractedFiles = append(extractedFiles, dest)
}
return nil
return extractedFiles, nil
}

func extractFile(dest string, hdr *tar.Header, tr io.Reader) error {
Expand Down Expand Up @@ -349,24 +352,6 @@ func RelativeFiles(fp string, root string) ([]string, error) {
return files, err
}

// Files returns a list of all files rooted at root
func Files(root string) ([]string, error) {
var files []string
logrus.Debugf("Getting files and contents at root %s", root)
err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error {
whitelisted, err := CheckWhitelist(path)
if err != nil {
return err
}
if whitelisted {
return nil
}
files = append(files, path)
return err
})
return files, err
}

// ParentDirectories returns a list of paths to all parent directories
// Ex. /some/temp/dir -> [/, /some, /some/temp, /some/temp/dir]
func ParentDirectories(path string) []string {
Expand Down Expand Up @@ -459,16 +444,18 @@ func DownloadFileToDest(rawurl, dest string) error {
}

// CopyDir copies the file or directory at src to dest
func CopyDir(src, dest string) error {
// It returns a list of files it copied over
func CopyDir(src, dest string) ([]string, error) {
files, err := RelativeFiles("", src)
if err != nil {
return err
return nil, err
}
var copiedFiles []string
for _, file := range files {
fullPath := filepath.Join(src, file)
fi, err := os.Lstat(fullPath)
if err != nil {
return err
return nil, err
}
destPath := filepath.Join(dest, file)
if fi.IsDir() {
Expand All @@ -478,24 +465,25 @@ func CopyDir(src, dest string) error {
gid := int(fi.Sys().(*syscall.Stat_t).Gid)

if err := os.MkdirAll(destPath, fi.Mode()); err != nil {
return err
return nil, err
}
if err := os.Chown(destPath, uid, gid); err != nil {
return err
return nil, err
}
} else if fi.Mode()&os.ModeSymlink != 0 {
// If file is a symlink, we want to create the same relative symlink
if err := CopySymlink(fullPath, destPath); err != nil {
return err
return nil, err
}
} else {
// ... Else, we want to copy over a file
if err := CopyFile(fullPath, destPath); err != nil {
return err
return nil, err
}
}
copiedFiles = append(copiedFiles, destPath)
}
return nil
return copiedFiles, nil
}

// CopySymlink copies the symlink at src to dest
Expand Down
15 changes: 8 additions & 7 deletions pkg/util/tar_util.go
Original file line number Diff line number Diff line change
Expand Up @@ -137,17 +137,17 @@ func (t *Tar) checkHardlink(p string, i os.FileInfo) (bool, string) {
}

// UnpackLocalTarArchive unpacks the tar archive at path to the directory dest
// Returns true if the path was actually unpacked
func UnpackLocalTarArchive(path, dest string) error {
// Returns the files extracted from the tar archive
func UnpackLocalTarArchive(path, dest string) ([]string, error) {
// First, we need to check if the path is a local tar archive
if compressed, compressionLevel := fileIsCompressedTar(path); compressed {
file, err := os.Open(path)
if err != nil {
return err
return nil, err
}
defer file.Close()
if compressionLevel == archive.Gzip {
return UnpackCompressedTar(path, dest)
return nil, UnpackCompressedTar(path, dest)
} else if compressionLevel == archive.Bzip2 {
bzr := bzip2.NewReader(file)
return unTar(bzr, dest)
Expand All @@ -156,12 +156,12 @@ func UnpackLocalTarArchive(path, dest string) error {
if fileIsUncompressedTar(path) {
file, err := os.Open(path)
if err != nil {
return err
return nil, err
}
defer file.Close()
return unTar(file, dest)
}
return errors.New("path does not lead to local tar archive")
return nil, errors.New("path does not lead to local tar archive")
}

//IsFileLocalTarArchive returns true if the file is a local tar archive
Expand Down Expand Up @@ -223,5 +223,6 @@ func UnpackCompressedTar(path, dir string) error {
return err
}
defer gzr.Close()
return unTar(gzr, dir)
_, err = unTar(gzr, dir)
return err
}

0 comments on commit f1c6803

Please sign in to comment.