directives.go 723 B

1234567891011121314151617181920212223242526272829303132333435363738
  1. package dockerfile2llb
  2. import (
  3. "bufio"
  4. "io"
  5. "regexp"
  6. "strings"
  7. )
  8. const keySyntax = "syntax"
  9. var reDirective = regexp.MustCompile(`^#\s*([a-zA-Z][a-zA-Z0-9]*)\s*=\s*(.+?)\s*$`)
  10. func DetectSyntax(r io.Reader) (string, string, bool) {
  11. directives := ParseDirectives(r)
  12. if len(directives) == 0 {
  13. return "", "", false
  14. }
  15. v, ok := directives[keySyntax]
  16. if !ok {
  17. return "", "", false
  18. }
  19. p := strings.SplitN(v, " ", 2)
  20. return p[0], v, true
  21. }
  22. func ParseDirectives(r io.Reader) map[string]string {
  23. m := map[string]string{}
  24. s := bufio.NewScanner(r)
  25. for s.Scan() {
  26. match := reDirective.FindStringSubmatch(s.Text())
  27. if len(match) == 0 {
  28. return m
  29. }
  30. m[strings.ToLower(match[1])] = match[2]
  31. }
  32. return m
  33. }