executors/docker/internal/volumes/parser/linux_parser.go (37 lines of code) (raw):
package parser
import (
"regexp"
"gitlab.com/gitlab-org/gitlab-runner/helpers/path"
)
const (
linuxDir = `/(?:[^\\/:*?"<>|\r\n ]+/?)*`
linuxVolumeName = `[^\\/:*?"<>|\r\n]+`
linuxSource = `((?P<source>((` + linuxDir + `)|(` + linuxVolumeName + `))):)?`
linuxDestination = `(?P<destination>(?:` + linuxDir + `))`
linuxMode = `(:(?P<mode>(?i)(ro|rw|O)))?`
linuxLabel = `((:|,)(?P<label>(?i)z))?`
linuxBindPropagation = `((:|,)(?P<bindPropagation>(?i)shared|slave|private|rshared|rslave|rprivate))?`
)
var (
specExp = regexp.MustCompile(`^` + linuxSource + linuxDestination + linuxMode +
linuxLabel + linuxBindPropagation + `$`)
)
type linuxParser struct {
baseParser
}
func NewLinuxParser(varExpander func(string) string) Parser {
return &linuxParser{
baseParser: baseParser{
path: path.NewUnixPath(),
varExpander: varExpander,
},
}
}
func (p *linuxParser) ParseVolume(spec string) (*Volume, error) {
parts, err := p.matchesToVolumeSpecParts(spec, specExp)
if err != nil {
return nil, err
}
v := newVolume(parts["source"], parts["destination"], parts["mode"], parts["label"], parts["bindPropagation"])
return v, nil
}