github.com/git-ogawa/go-dbyml@v1.2.1/dbyml/context.go (about)

     1  package dbyml
     2  
     3  import (
     4  	"archive/tar"
     5  	"bytes"
     6  	"io/ioutil"
     7  	"log"
     8  	"os"
     9  	"path/filepath"
    10  	"regexp"
    11  
    12  	"github.com/moby/moby/pkg/fileutils"
    13  )
    14  
    15  // GetBuildContext makes tar archive of files and directories in a given directory, and returns
    16  // byte.Buffer of the archive. The buffer is used for build context to build an image.
    17  func GetBuildContext(dir string) (buf *bytes.Buffer) {
    18  	buf = new(bytes.Buffer)
    19  	tw := tar.NewWriter(buf)
    20  	defer tw.Close()
    21  
    22  	excludes, err := ReadDockerignore(dir)
    23  	if err != nil {
    24  		panic(err)
    25  	}
    26  
    27  	if err := filepath.Walk(dir, func(path string, info os.FileInfo, err error) error {
    28  		// Check exclude
    29  		if rm, _ := IsExclude(path, excludes); rm {
    30  			return nil
    31  		}
    32  
    33  		if info.IsDir() {
    34  			return nil
    35  		}
    36  
    37  		f, err := os.Open(path)
    38  		if err != nil {
    39  			return err
    40  		}
    41  		defer f.Close()
    42  
    43  		b, err := ioutil.ReadAll(f)
    44  		if err != nil {
    45  			return err
    46  		}
    47  
    48  		// Write header
    49  		if err := tw.WriteHeader(&tar.Header{
    50  			Name:    path,
    51  			Mode:    int64(info.Mode()),
    52  			ModTime: info.ModTime(),
    53  			Size:    info.Size(),
    54  		}); err != nil {
    55  			return err
    56  		}
    57  
    58  		// Write body
    59  		_, err = tw.Write(b)
    60  		if err != nil {
    61  			log.Fatal(err, " :unable to write tar body")
    62  		}
    63  		return nil
    64  	}); err != nil {
    65  		panic(err)
    66  	}
    67  	return buf
    68  }
    69  
    70  // IsExclude returns true if file matches any of the patterns and isn't excluded by any of the subsequent patterns.
    71  func IsExclude(file string, exclude []string) (bool, error) {
    72  	return fileutils.Matches(file, exclude)
    73  }
    74  
    75  // GetBuildContext makes tar archive of files and directories in a given directory, and returns
    76  // byte.Buffer of the archive. The buffer is used for build context to build an image in bubildkitd container.
    77  func GetBuildkitContext(dir string) (buf *bytes.Buffer) {
    78  	buf = new(bytes.Buffer)
    79  	tw := tar.NewWriter(buf)
    80  	defer tw.Close()
    81  
    82  	excludes, err := ReadDockerignore(dir)
    83  	if err != nil {
    84  		panic(err)
    85  	}
    86  
    87  	if err := filepath.Walk(dir, func(path string, info os.FileInfo, err error) error {
    88  		// Check exclude
    89  		if rm, _ := IsExclude(path, excludes); rm {
    90  			return nil
    91  		}
    92  
    93  		if info.IsDir() {
    94  			return nil
    95  		}
    96  
    97  		f, err := os.Open(path)
    98  		if err != nil {
    99  			return err
   100  		}
   101  		defer f.Close()
   102  
   103  		b, err := ioutil.ReadAll(f)
   104  		if err != nil {
   105  			return err
   106  		}
   107  
   108  		// Replace directory
   109  		str := regexp.MustCompile(dir)
   110  		path = str.ReplaceAllString(path, ".")
   111  
   112  		// Write header
   113  		if err := tw.WriteHeader(&tar.Header{
   114  			Name:    path,
   115  			Mode:    int64(info.Mode()),
   116  			ModTime: info.ModTime(),
   117  			Size:    info.Size(),
   118  		}); err != nil {
   119  			return err
   120  		}
   121  
   122  		// Write body
   123  		_, err = tw.Write(b)
   124  		if err != nil {
   125  			log.Fatal(err, " :unable to write tar body")
   126  		}
   127  		return nil
   128  	}); err != nil {
   129  		panic(err)
   130  	}
   131  	return buf
   132  }