From 853a17292b87b8f386abb921ac2bdbec129968f9 Mon Sep 17 00:00:00 2001 From: andreasjansson Date: Thu, 22 Apr 2021 17:01:58 -0700 Subject: [PATCH] Support .cogignore file Signed-off-by: andreasjansson --- go.mod | 1 + go.sum | 2 ++ pkg/zip/write.go | 31 +++++++++++++++++++++++++++++++ 3 files changed, 34 insertions(+) diff --git a/go.mod b/go.mod index 490769e1dc..5bbe0e3c18 100644 --- a/go.mod +++ b/go.mod @@ -28,6 +28,7 @@ require ( github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.0.1 // indirect + github.com/sabhiram/go-gitignore v0.0.0-20201211210132-54b8a0bf510f github.com/schollz/progressbar/v3 v3.7.6 github.com/sirupsen/logrus v1.7.0 // indirect github.com/spf13/cobra v1.1.3 diff --git a/go.sum b/go.sum index 9093c6253f..bb95560902 100644 --- a/go.sum +++ b/go.sum @@ -251,6 +251,8 @@ github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6So github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/sabhiram/go-gitignore v0.0.0-20201211210132-54b8a0bf510f h1:8P2MkG70G76gnZBOPGwmMIgwBb/rESQuwsJ7K8ds4NE= +github.com/sabhiram/go-gitignore v0.0.0-20201211210132-54b8a0bf510f/go.mod h1:+ePHsJ1keEjQtpvf9HHw0f4ZeJ0TLRsxhunSI2hYJSs= github.com/schollz/progressbar/v3 v3.7.6 h1:akAvVpTy2IAcePWYndctoBaY9bLE3z4LE1Hn91BJ9g4= github.com/schollz/progressbar/v3 v3.7.6/go.mod h1:Y9mmL2knZj3LUaBDyBEzFdPrymIr08hnlFMZmfxwbx4= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= diff --git a/pkg/zip/write.go b/pkg/zip/write.go index 6a0c6a2bdb..167a9cda34 100644 --- a/pkg/zip/write.go +++ b/pkg/zip/write.go @@ -9,10 +9,14 @@ import ( "path/filepath" "github.com/mholt/archiver/v3" + gitignore "github.com/sabhiram/go-gitignore" "github.com/replicate/cog/pkg/console" + "github.com/replicate/cog/pkg/files" ) +var defaultIgnore = []string{".cog", ".git", ".mypy_cache"} + func (z *CachingZip) WriterArchive(source string, destination io.Writer, cachedHashes []string) error { cachedHashSet := map[string]bool{} for _, hash := range cachedHashes { @@ -29,6 +33,11 @@ func (z *CachingZip) WriterArchive(source string, destination io.Writer, cachedH return fmt.Errorf("%s: stat: %v", source, err) } + ignore, err := loadIgnoreFile(source) + if err != nil { + return err + } + return filepath.Walk(source, func(fpath string, info os.FileInfo, err error) error { handleErr := func(err error) error { if z.zip.ContinueOnError { @@ -44,6 +53,10 @@ func (z *CachingZip) WriterArchive(source string, destination io.Writer, cachedH return handleErr(fmt.Errorf("%s: no file info", fpath)) } + if ignore.MatchesPath(fpath) { + return nil + } + // build the name to be used within the archive nameInArchive, err := makeNameInArchive(sourceInfo, source, "", fpath) if err != nil { @@ -101,3 +114,21 @@ func makeNameInArchive(sourceInfo os.FileInfo, source, baseDir, fpath string) (s } return path.Join(baseDir, name), nil // prepend the base directory } + +func loadIgnoreFile(dir string) (*gitignore.GitIgnore, error) { + var ignore *gitignore.GitIgnore + ignoreFilePath := filepath.Join(dir, ".cogignore") + exists, err := files.Exists(ignoreFilePath) + if err != nil { + return nil, err + } + if exists { + ignore, err = gitignore.CompileIgnoreFileAndLines(ignoreFilePath, defaultIgnore...) + if err != nil { + return nil, err + } + } else { + ignore = gitignore.CompileIgnoreLines(defaultIgnore...) + } + return ignore, nil +}