b01fe1524a
--- type: change description: |- Completely refactor naming of everything, in light of new SPEC Writing the SPEC shed some light on just how weakly a lot of concepts, like "commit", had been defined, and prompted the delineation of a lot of things along specific lines (commit vs payload, repo vs project). This commit makes the code reflect the SPEC much better in quite a few ways: * Repo is now Project * Commit is now Payload * GitCommit is now just Commit * Hash is now Fingerprint * A lot of minor fields got renamed * All the XXXInterface types are now just XXX, and their old XXX type is now XXXUnion. More than likely there's still some comments and variable names that have slipped passed, but overall I feel like I got most of the changes. fingerprint: AKkDC5BKhKbfXzZQ/F4KquHeMgVvcNxgLmkZFz/nP/tY credentials: - type: pgp_signature pub_key_id: 95C46FA6A41148AC body: iQIzBAABAgAdFiEEJ6tQKp6olvZKJ0lwlcRvpqQRSKwFAl6l7aYACgkQlcRvpqQRSKxFrA//VQ+f8B6pwGS3ORB4VVBnHvvJTGZvAYTvB0fHuHJx2EreR4FwjhaNakk5ClkwbO7WFMq++2OV4xIkvzwswLdbXZF0IHx3wScQM59v4vIkR4V9Lj5p1aGGhQna52uIKugF2gTqKdU4tqYzmBjDND/c2XDwCN5CwTwwnAHXUSSsHxviiPUYPWV5wzFP7uyRW0ZeK8Isv7QECKRXlsDjcSJa+g+jc091FG/jG9Dkai8fbDbW8YXj7W3ALaXgXWEBJMrgQxZcJJRjgCvLY72FIIrUBquu3FepiyzMtZ0yaIvi4NmGCsYqIv00NcMvMtD7iwhOCZn10Sku4wvaKJ8YBMRduhqC99fnr/ZDW0/HvTNcL7GKx11GjwtmzkJgwsHFPy3zX+kMdF4m3WgtoeI0GwEsBXXZE2C49yAk3Mb/3puegl3a1PPMvOabTzo7Xm6xpWkI6gISChI7My71H3EuKZWhkb+IubPmMvJJXIdVxHnsHPz2dl/BZXLgpfVdEgQa2qWeXtYI4NNm37pLl3gv92V4kka+Kr4gfdoq8mJ7aqvc9was35baJbHg4+fEVJG2Wj+2AQU+ncx3nAFzgYyMxwo9K8VuC4QdfRF4ImyxTnWkuokEn9H6JRrbkBDKIELj6vzdPmsjOUEQ4nsYX66/zSibFD7UvhQmdXFs8Gp8/Qq6g4M= account: mediocregopher
93 lines
2.5 KiB
Go
93 lines
2.5 KiB
Go
package accessctl
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
|
|
"github.com/bmatcuk/doublestar"
|
|
)
|
|
|
|
// StringMatcher is used to match against a string. It can use one of several
|
|
// methods to match. Only one field should be filled at a time.
|
|
type StringMatcher struct {
|
|
// Pattern, if set, indicates that the Match method should succeed if this
|
|
// doublestar pattern matches against the string.
|
|
Pattern string `yaml:"pattern,omitempty"`
|
|
|
|
// Patterns, if set, indicates that the Match method should succeed if at
|
|
// least one of these doublestar patterns matches against the string.
|
|
Patterns []string `yaml:"patterns,omitempty"`
|
|
}
|
|
|
|
func doublestarMatch(pattern, str string) (bool, error) {
|
|
ok, err := doublestar.Match(pattern, str)
|
|
if err != nil {
|
|
return false, fmt.Errorf("matching %q on pattern %q: %w",
|
|
str, pattern, err)
|
|
}
|
|
return ok, nil
|
|
}
|
|
|
|
// Match operates similarly to the Match method of the FilterInterface, except
|
|
// it only takes in strings.
|
|
func (m StringMatcher) Match(str string) error {
|
|
switch {
|
|
case m.Pattern != "":
|
|
if ok, err := doublestarMatch(m.Pattern, str); err != nil {
|
|
return err
|
|
} else if !ok {
|
|
return ErrFilterNoMatch{
|
|
Err: fmt.Errorf("pattern %q does not match %q", m.Pattern, str),
|
|
}
|
|
}
|
|
return nil
|
|
|
|
case len(m.Patterns) > 0:
|
|
for _, pattern := range m.Patterns {
|
|
if ok, err := doublestarMatch(pattern, str); err != nil {
|
|
return err
|
|
} else if ok {
|
|
return nil
|
|
}
|
|
}
|
|
return ErrFilterNoMatch{
|
|
Err: fmt.Errorf("no patterns in %+v match %q", m.Patterns, str),
|
|
}
|
|
|
|
default:
|
|
return errors.New(`one of the following fields must be set: "pattern", "patterns"`)
|
|
}
|
|
}
|
|
|
|
// FilterBranch matches a CommitRequest's Branch field using a double-star
|
|
// pattern.
|
|
type FilterBranch struct {
|
|
StringMatcher StringMatcher `yaml:",inline"`
|
|
}
|
|
|
|
var _ Filter = FilterBranch{}
|
|
|
|
// MatchCommit implements the method for FilterInterface.
|
|
func (f FilterBranch) MatchCommit(req CommitRequest) error {
|
|
return f.StringMatcher.Match(req.Branch)
|
|
}
|
|
|
|
// FilterFilesChanged matches a CommitRequest's FilesChanged field using a
|
|
// double-star pattern. It only matches if all of the CommitRequest's
|
|
// FilesChanged match.
|
|
type FilterFilesChanged struct {
|
|
StringMatcher StringMatcher `yaml:",inline"`
|
|
}
|
|
|
|
var _ Filter = FilterFilesChanged{}
|
|
|
|
// MatchCommit implements the method for FilterInterface.
|
|
func (f FilterFilesChanged) MatchCommit(req CommitRequest) error {
|
|
for _, path := range req.FilesChanged {
|
|
if err := f.StringMatcher.Match(path); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
return nil
|
|
}
|