Check ignore matches before Bucket item downloads
Signed-off-by: Hidde Beydals <hello@hidde.co>
This commit is contained in:
parent
069328990c
commit
cca2c4a362
|
@ -17,6 +17,7 @@ limitations under the License.
|
||||||
package controllers
|
package controllers
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
"context"
|
"context"
|
||||||
"crypto/sha1"
|
"crypto/sha1"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
@ -49,6 +50,7 @@ import (
|
||||||
"github.com/fluxcd/pkg/runtime/predicates"
|
"github.com/fluxcd/pkg/runtime/predicates"
|
||||||
|
|
||||||
sourcev1 "github.com/fluxcd/source-controller/api/v1beta1"
|
sourcev1 "github.com/fluxcd/source-controller/api/v1beta1"
|
||||||
|
"github.com/fluxcd/source-controller/pkg/sourceignore"
|
||||||
)
|
)
|
||||||
|
|
||||||
// +kubebuilder:rbac:groups=source.toolkit.fluxcd.io,resources=buckets,verbs=get;list;watch;create;update;patch;delete
|
// +kubebuilder:rbac:groups=source.toolkit.fluxcd.io,resources=buckets,verbs=get;list;watch;create;update;patch;delete
|
||||||
|
@ -202,6 +204,9 @@ func (r *BucketReconciler) reconcile(ctx context.Context, bucket sourcev1.Bucket
|
||||||
return sourcev1.BucketNotReady(bucket, sourcev1.BucketOperationFailedReason, err.Error()), err
|
return sourcev1.BucketNotReady(bucket, sourcev1.BucketOperationFailedReason, err.Error()), err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ps := sourceignore.GetPatterns(bytes.NewBufferString(*bucket.Spec.Ignore), nil)
|
||||||
|
matcher := sourceignore.NewMatcher(ps)
|
||||||
|
|
||||||
// download bucket content
|
// download bucket content
|
||||||
for object := range s3Client.ListObjects(ctxTimeout, bucket.Spec.BucketName, minio.ListObjectsOptions{
|
for object := range s3Client.ListObjects(ctxTimeout, bucket.Spec.BucketName, minio.ListObjectsOptions{
|
||||||
Recursive: true,
|
Recursive: true,
|
||||||
|
@ -216,6 +221,10 @@ func (r *BucketReconciler) reconcile(ctx context.Context, bucket sourcev1.Bucket
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if matcher.Match([]string{object.Key}, false) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
localPath := filepath.Join(tempDir, object.Key)
|
localPath := filepath.Join(tempDir, object.Key)
|
||||||
err := s3Client.FGetObject(ctxTimeout, bucket.Spec.BucketName, object.Key, localPath, minio.GetObjectOptions{})
|
err := s3Client.FGetObject(ctxTimeout, bucket.Spec.BucketName, object.Key, localPath, minio.GetObjectOptions{})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -18,8 +18,6 @@ package controllers
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"archive/tar"
|
"archive/tar"
|
||||||
"bufio"
|
|
||||||
"bytes"
|
|
||||||
"compress/gzip"
|
"compress/gzip"
|
||||||
"crypto/sha1"
|
"crypto/sha1"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
@ -39,6 +37,7 @@ import (
|
||||||
|
|
||||||
sourcev1 "github.com/fluxcd/source-controller/api/v1beta1"
|
sourcev1 "github.com/fluxcd/source-controller/api/v1beta1"
|
||||||
"github.com/fluxcd/source-controller/internal/fs"
|
"github.com/fluxcd/source-controller/internal/fs"
|
||||||
|
"github.com/fluxcd/source-controller/pkg/sourceignore"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
@ -159,11 +158,11 @@ func (s *Storage) Archive(artifact *sourcev1.Artifact, dir string, ignore *strin
|
||||||
return fmt.Errorf("invalid dir path: %s", dir)
|
return fmt.Errorf("invalid dir path: %s", dir)
|
||||||
}
|
}
|
||||||
|
|
||||||
ps, err := loadExcludePatterns(dir, ignore)
|
ps, err := sourceignore.LoadExcludePatterns(dir, ignore)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
matcher := gitignore.NewMatcher(ps)
|
matcher := sourceignore.NewMatcher(ps)
|
||||||
|
|
||||||
localPath := s.LocalPath(*artifact)
|
localPath := s.LocalPath(*artifact)
|
||||||
tf, err := ioutil.TempFile(filepath.Split(localPath))
|
tf, err := ioutil.TempFile(filepath.Split(localPath))
|
||||||
|
@ -400,51 +399,6 @@ func (s *Storage) LocalPath(artifact sourcev1.Artifact) string {
|
||||||
return filepath.Join(s.BasePath, artifact.Path)
|
return filepath.Join(s.BasePath, artifact.Path)
|
||||||
}
|
}
|
||||||
|
|
||||||
// getPatterns collects ignore patterns from the given reader and returns them
|
|
||||||
// as a gitignore.Pattern slice.
|
|
||||||
func getPatterns(reader io.Reader, path []string) []gitignore.Pattern {
|
|
||||||
var ps []gitignore.Pattern
|
|
||||||
scanner := bufio.NewScanner(reader)
|
|
||||||
|
|
||||||
for scanner.Scan() {
|
|
||||||
s := scanner.Text()
|
|
||||||
if !strings.HasPrefix(s, "#") && len(strings.TrimSpace(s)) > 0 {
|
|
||||||
ps = append(ps, gitignore.ParsePattern(s, path))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return ps
|
|
||||||
}
|
|
||||||
|
|
||||||
// loadExcludePatterns loads the excluded patterns from sourceignore or other
|
|
||||||
// sources.
|
|
||||||
func loadExcludePatterns(dir string, ignore *string) ([]gitignore.Pattern, error) {
|
|
||||||
path := strings.Split(dir, "/")
|
|
||||||
|
|
||||||
var ps []gitignore.Pattern
|
|
||||||
for _, p := range strings.Split(excludeVCS, ",") {
|
|
||||||
ps = append(ps, gitignore.ParsePattern(p, path))
|
|
||||||
}
|
|
||||||
|
|
||||||
if ignore == nil {
|
|
||||||
all := strings.Join([]string{excludeExt, excludeCI, excludeExtra}, ",")
|
|
||||||
for _, p := range strings.Split(all, ",") {
|
|
||||||
ps = append(ps, gitignore.ParsePattern(p, path))
|
|
||||||
}
|
|
||||||
|
|
||||||
if f, err := os.Open(filepath.Join(dir, excludeFile)); err == nil {
|
|
||||||
defer f.Close()
|
|
||||||
ps = append(ps, getPatterns(f, path)...)
|
|
||||||
} else if !os.IsNotExist(err) {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
ps = append(ps, getPatterns(bytes.NewBufferString(*ignore), path)...)
|
|
||||||
}
|
|
||||||
|
|
||||||
return ps, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// newHash returns a new SHA1 hash.
|
// newHash returns a new SHA1 hash.
|
||||||
func newHash() hash.Hash {
|
func newHash() hash.Hash {
|
||||||
return sha1.New()
|
return sha1.New()
|
||||||
|
|
|
@ -0,0 +1,87 @@
|
||||||
|
/*
|
||||||
|
Copyright 2021 The Flux authors
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package sourceignore
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bufio"
|
||||||
|
"bytes"
|
||||||
|
"io"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"github.com/go-git/go-git/v5/plumbing/format/gitignore"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
ExcludeFile = ".sourceignore"
|
||||||
|
ExcludeVCS = ".git/,.gitignore,.gitmodules,.gitattributes"
|
||||||
|
ExcludeExt = "*.jpg,*.jpeg,*.gif,*.png,*.wmv,*.flv,*.tar.gz,*.zip"
|
||||||
|
ExcludeCI = ".github/,.circleci/,.travis.yml,.gitlab-ci.yml,appveyor.yml,.drone.yml,cloudbuild.yaml,codeship-services.yml,codeship-steps.yml"
|
||||||
|
ExcludeExtra = "**/.goreleaser.yml,**/.sops.yaml,**/.flux.yaml"
|
||||||
|
)
|
||||||
|
|
||||||
|
// NewMatcher returns a gitignore.Matcher for the given gitignore.Pattern
|
||||||
|
// slice. It mainly exists to compliment the API.
|
||||||
|
func NewMatcher(ps []gitignore.Pattern) gitignore.Matcher {
|
||||||
|
return gitignore.NewMatcher(ps)
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetPatterns collects ignore patterns from the given reader and
|
||||||
|
// returns them as a gitignore.Pattern slice.
|
||||||
|
func GetPatterns(reader io.Reader, path []string) []gitignore.Pattern {
|
||||||
|
var ps []gitignore.Pattern
|
||||||
|
scanner := bufio.NewScanner(reader)
|
||||||
|
|
||||||
|
for scanner.Scan() {
|
||||||
|
s := scanner.Text()
|
||||||
|
if !strings.HasPrefix(s, "#") && len(strings.TrimSpace(s)) > 0 {
|
||||||
|
ps = append(ps, gitignore.ParsePattern(s, path))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ps
|
||||||
|
}
|
||||||
|
|
||||||
|
// LoadExcludePatterns loads the excluded patterns from .sourceignore or other
|
||||||
|
// sources and returns the gitignore.Pattern slice.
|
||||||
|
func LoadExcludePatterns(dir string, ignore *string) ([]gitignore.Pattern, error) {
|
||||||
|
path := strings.Split(dir, "/")
|
||||||
|
|
||||||
|
var ps []gitignore.Pattern
|
||||||
|
for _, p := range strings.Split(ExcludeVCS, ",") {
|
||||||
|
ps = append(ps, gitignore.ParsePattern(p, path))
|
||||||
|
}
|
||||||
|
|
||||||
|
if ignore == nil {
|
||||||
|
all := strings.Join([]string{ExcludeExt, ExcludeCI, ExcludeExtra}, ",")
|
||||||
|
for _, p := range strings.Split(all, ",") {
|
||||||
|
ps = append(ps, gitignore.ParsePattern(p, path))
|
||||||
|
}
|
||||||
|
|
||||||
|
if f, err := os.Open(filepath.Join(dir, ExcludeFile)); err == nil {
|
||||||
|
defer f.Close()
|
||||||
|
ps = append(ps, GetPatterns(f, path)...)
|
||||||
|
} else if !os.IsNotExist(err) {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
ps = append(ps, GetPatterns(bytes.NewBufferString(*ignore), path)...)
|
||||||
|
}
|
||||||
|
|
||||||
|
return ps, nil
|
||||||
|
}
|
Loading…
Reference in New Issue