Support programming excluded patterns in gitrepository spec
-- More coming in this commit message soon Signed-off-by: Erik Hollensbe <github@hollensbe.org>
This commit is contained in:
parent
9a92164f17
commit
b1b1dbcec5
|
@ -54,6 +54,13 @@ type GitRepositorySpec struct {
|
||||||
// Verify OpenPGP signature for the commit that HEAD points to.
|
// Verify OpenPGP signature for the commit that HEAD points to.
|
||||||
// +optional
|
// +optional
|
||||||
Verification *GitRepositoryVerification `json:"verify,omitempty"`
|
Verification *GitRepositoryVerification `json:"verify,omitempty"`
|
||||||
|
|
||||||
|
// SourceIgnore overrides the set of excluded patterns in the .sourceignore
|
||||||
|
// format (which is the same as .gitignore). If not provided, a default will
|
||||||
|
// be used, consult the documentation for your version to find out what those
|
||||||
|
// are.
|
||||||
|
// +optional
|
||||||
|
SourceIgnore *string `json:"sourceIgnore,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// GitRepositoryRef defines the git ref used for pull and checkout operations.
|
// GitRepositoryRef defines the git ref used for pull and checkout operations.
|
||||||
|
|
|
@ -140,6 +140,11 @@ func (in *GitRepositorySpec) DeepCopyInto(out *GitRepositorySpec) {
|
||||||
*out = new(GitRepositoryVerification)
|
*out = new(GitRepositoryVerification)
|
||||||
**out = **in
|
**out = **in
|
||||||
}
|
}
|
||||||
|
if in.SourceIgnore != nil {
|
||||||
|
in, out := &in.SourceIgnore, &out.SourceIgnore
|
||||||
|
*out = new(string)
|
||||||
|
**out = **in
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new GitRepositorySpec.
|
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new GitRepositorySpec.
|
||||||
|
|
|
@ -82,6 +82,12 @@ spec:
|
||||||
TODO: Add other useful fields. apiVersion, kind, uid?'
|
TODO: Add other useful fields. apiVersion, kind, uid?'
|
||||||
type: string
|
type: string
|
||||||
type: object
|
type: object
|
||||||
|
sourceIgnore:
|
||||||
|
description: SourceIgnore overrides the set of excluded patterns in
|
||||||
|
the .sourceignore format (which is the same as .gitignore). If not
|
||||||
|
provided, a default will be used, consult the documentation for your
|
||||||
|
version to find out what those are.
|
||||||
|
type: string
|
||||||
timeout:
|
timeout:
|
||||||
description: The timeout for remote git operations like cloning, default
|
description: The timeout for remote git operations like cloning, default
|
||||||
to 20s.
|
to 20s.
|
||||||
|
|
|
@ -198,8 +198,7 @@ func (r *GitRepositoryReconciler) sync(ctx context.Context, repository sourcev1.
|
||||||
defer unlock()
|
defer unlock()
|
||||||
|
|
||||||
// archive artifact and check integrity
|
// archive artifact and check integrity
|
||||||
err = r.Storage.Archive(artifact, tmpGit)
|
if err := r.Storage.Archive(artifact, tmpGit, repository.Spec); err != nil {
|
||||||
if err != nil {
|
|
||||||
err = fmt.Errorf("storage archive error: %w", err)
|
err = fmt.Errorf("storage archive error: %w", err)
|
||||||
return sourcev1.GitRepositoryNotReady(repository, sourcev1.StorageOperationFailedReason, err.Error()), err
|
return sourcev1.GitRepositoryNotReady(repository, sourcev1.StorageOperationFailedReason, err.Error()), err
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,6 +19,7 @@ package controllers
|
||||||
import (
|
import (
|
||||||
"archive/tar"
|
"archive/tar"
|
||||||
"bufio"
|
"bufio"
|
||||||
|
"bytes"
|
||||||
"compress/gzip"
|
"compress/gzip"
|
||||||
"crypto/sha1"
|
"crypto/sha1"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
@ -108,7 +109,7 @@ func (s *Storage) RemoveAllButCurrent(artifact sourcev1.Artifact) error {
|
||||||
})
|
})
|
||||||
|
|
||||||
if len(errors) > 0 {
|
if len(errors) > 0 {
|
||||||
return fmt.Errorf("faild to remove files: %s", strings.Join(errors, " "))
|
return fmt.Errorf("failed to remove files: %s", strings.Join(errors, " "))
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -123,15 +124,17 @@ func (s *Storage) ArtifactExist(artifact sourcev1.Artifact) bool {
|
||||||
|
|
||||||
// Archive creates a tar.gz to the artifact path from the given dir excluding any VCS specific
|
// Archive creates a tar.gz to the artifact path from the given dir excluding any VCS specific
|
||||||
// files and directories, or any of the excludes defined in the excludeFiles.
|
// files and directories, or any of the excludes defined in the excludeFiles.
|
||||||
func (s *Storage) Archive(artifact sourcev1.Artifact, dir string) error {
|
// Returns a modified sourcev1.Artifact and any error.
|
||||||
|
func (s *Storage) Archive(artifact sourcev1.Artifact, dir string, spec sourcev1.GitRepositorySpec) error {
|
||||||
if _, err := os.Stat(dir); err != nil {
|
if _, err := os.Stat(dir); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
ps, err := loadExcludePatterns(dir)
|
ps, err := loadExcludePatterns(dir, spec)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
matcher := gitignore.NewMatcher(ps)
|
matcher := gitignore.NewMatcher(ps)
|
||||||
|
|
||||||
gzFile, err := os.Create(artifact.Path)
|
gzFile, err := os.Create(artifact.Path)
|
||||||
|
@ -241,27 +244,44 @@ func (s *Storage) Lock(artifact sourcev1.Artifact) (unlock func(), err error) {
|
||||||
return mutex.Lock()
|
return mutex.Lock()
|
||||||
}
|
}
|
||||||
|
|
||||||
func loadExcludePatterns(dir string) ([]gitignore.Pattern, error) {
|
func getPatterns(reader io.Reader, path []string) []gitignore.Pattern {
|
||||||
|
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, spec sourcev1.GitRepositorySpec) ([]gitignore.Pattern, error) {
|
||||||
path := strings.Split(dir, "/")
|
path := strings.Split(dir, "/")
|
||||||
|
|
||||||
var ps []gitignore.Pattern
|
var ps []gitignore.Pattern
|
||||||
for _, p := range strings.Split(excludeVCS, ",") {
|
for _, p := range strings.Split(excludeVCS, ",") {
|
||||||
ps = append(ps, gitignore.ParsePattern(p, path))
|
ps = append(ps, gitignore.ParsePattern(p, path))
|
||||||
}
|
}
|
||||||
for _, p := range strings.Split(excludeExt, ",") {
|
|
||||||
ps = append(ps, gitignore.ParsePattern(p, path))
|
|
||||||
}
|
|
||||||
if f, err := os.Open(filepath.Join(dir, excludeFile)); err == nil {
|
|
||||||
defer f.Close()
|
|
||||||
|
|
||||||
scanner := bufio.NewScanner(f)
|
if spec.SourceIgnore == nil {
|
||||||
for scanner.Scan() {
|
for _, p := range strings.Split(excludeExt, ",") {
|
||||||
s := scanner.Text()
|
ps = append(ps, gitignore.ParsePattern(p, path))
|
||||||
if !strings.HasPrefix(s, "#") && len(strings.TrimSpace(s)) > 0 {
|
|
||||||
ps = append(ps, gitignore.ParsePattern(s, path))
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} else if !os.IsNotExist(err) {
|
|
||||||
return nil, err
|
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(*spec.SourceIgnore), path)...)
|
||||||
}
|
}
|
||||||
|
|
||||||
return ps, nil
|
return ps, nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -157,6 +157,21 @@ GitRepositoryVerification
|
||||||
<p>Verify OpenPGP signature for the commit that HEAD points to.</p>
|
<p>Verify OpenPGP signature for the commit that HEAD points to.</p>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<code>sourceIgnore</code><br>
|
||||||
|
<em>
|
||||||
|
string
|
||||||
|
</em>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<em>(Optional)</em>
|
||||||
|
<p>SourceIgnore overrides the set of excluded patterns in the .sourceignore
|
||||||
|
format (which is the same as .gitignore). If not provided, a default will
|
||||||
|
be used, consult the documentation for your version to find out what those
|
||||||
|
are.</p>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
@ -666,6 +681,21 @@ GitRepositoryVerification
|
||||||
<p>Verify OpenPGP signature for the commit that HEAD points to.</p>
|
<p>Verify OpenPGP signature for the commit that HEAD points to.</p>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<code>sourceIgnore</code><br>
|
||||||
|
<em>
|
||||||
|
string
|
||||||
|
</em>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<em>(Optional)</em>
|
||||||
|
<p>SourceIgnore overrides the set of excluded patterns in the .sourceignore
|
||||||
|
format (which is the same as .gitignore). If not provided, a default will
|
||||||
|
be used, consult the documentation for your version to find out what those
|
||||||
|
are.</p>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
|
|
Loading…
Reference in New Issue