builder/parse.go (60 lines of code) (raw):

// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. package builder import ( "regexp" "strings" "github.com/Azure/acr-builder/util" ) var httpPrefix = regexp.MustCompile("^https?://") var gitURLWithSuffix = regexp.MustCompile(`\.git(?:#.+)?$`) const ( azureDevOpsHost = "dev.azure.com" vstsHost = ".visualstudio.com" ) // parseDockerBuildCmd parses a docker build command and extracts the // context, target and Dockerfile from it. func parseDockerBuildCmd(cmd string) (dockerfile string, target string, context string) { fields := strings.Fields(cmd) prev := "" dockerfile = "" context = "." target = "" for i := 0; i < len(fields); i++ { v := fields[i] // trim quotes on all docker build command args if prev == "-f" || prev == "--file" { dockerfile = util.TrimQuotes(v) } else if prev == "--target" { target = util.TrimQuotes(v) } else if !strings.HasPrefix(prev, "-") && !strings.HasPrefix(v, "-") { context = util.TrimQuotes(v) } prev = v } return dockerfile, target, context } // replacePositionalContext parses the specified command for its positional context // and replaces it if one's found. Returns the modified command after replacement. func replacePositionalContext(runCmd string, replacement string) string { fields := strings.Fields(runCmd) prev := "" for i := 0; i < len(fields); i++ { if !strings.HasPrefix(prev, "-") && !strings.HasPrefix(fields[i], "-") { fields[i] = replacement return strings.Join(fields, " ") } prev = fields[i] } return runCmd } func getContextFromGitURL(gitURL string) string { lower := strings.ToLower(gitURL) if httpPrefix.MatchString(gitURL) && (strings.Contains(lower, vstsHost) || gitURLWithSuffix.MatchString(gitURL) || strings.Contains(lower, azureDevOpsHost)) { pos := strings.LastIndex(gitURL, "#") if pos >= 0 { frag := gitURL[pos+1:] splits := strings.Split(frag, ":") if len(splits) >= 2 { return splits[1] } } } return "." }