mirror of
https://github.com/github/codeql.git
synced 2026-01-29 22:32:58 +01:00
extractor: revamp argument parsing
This commit is contained in:
@@ -20,23 +20,70 @@ func usage() {
|
||||
fmt.Fprintf(os.Stderr, "--help Print this help.\n")
|
||||
}
|
||||
|
||||
func parseFlags(args []string) ([]string, []string) {
|
||||
func parseFlags(args []string, mimic bool) ([]string, []string) {
|
||||
i := 0
|
||||
buildFlags := []string{}
|
||||
for i < len(args) && strings.HasPrefix(args[i], "-") {
|
||||
for ; i < len(args) && strings.HasPrefix(args[i], "-"); i++ {
|
||||
if args[i] == "--" {
|
||||
i++
|
||||
break
|
||||
}
|
||||
|
||||
if args[i] == "--help" {
|
||||
usage()
|
||||
os.Exit(0)
|
||||
} else {
|
||||
buildFlags = append(buildFlags, args[i])
|
||||
if !mimic {
|
||||
// we're not in mimic mode, try to parse our arguments
|
||||
switch args[i] {
|
||||
case "--help":
|
||||
usage()
|
||||
os.Exit(0)
|
||||
case "--mimic":
|
||||
if i+1 < len(args) {
|
||||
i++
|
||||
compiler := args[i]
|
||||
log.Printf("Compiler: %s", compiler)
|
||||
if i+1 < len(args) {
|
||||
i++
|
||||
command := args[i]
|
||||
if command == "build" || command == "install" || command == "run" {
|
||||
log.Printf("Intercepting build")
|
||||
return parseFlags(args[i+1:], true)
|
||||
} else {
|
||||
log.Printf("Non-build command '%s'; skipping", strings.Join(args[1:], " "))
|
||||
os.Exit(0)
|
||||
}
|
||||
} else {
|
||||
log.Printf("Non-build command '%s'; skipping", strings.Join(args[1:], " "))
|
||||
os.Exit(0)
|
||||
}
|
||||
} else {
|
||||
log.Fatalf("Invalid --mimic: no compiler specified")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
i++
|
||||
// parse go build flags
|
||||
switch args[i] {
|
||||
// skip `-o output` and `-i`, if applicable
|
||||
case "-o":
|
||||
if i+1 < len(args) {
|
||||
i++
|
||||
}
|
||||
case "-i":
|
||||
case "-p", "-asmflags", "-buildmode", "-compiler", "-gccgoflags", "-gcflags", "-installsuffix",
|
||||
"-ldflags", "-mod", "-modfile", "-pkgdir", "-tags", "-toolexec":
|
||||
if i+1 < len(args) {
|
||||
buildFlags = append(buildFlags, args[i], args[i+1])
|
||||
i++
|
||||
} else {
|
||||
buildFlags = append(buildFlags, args[i])
|
||||
}
|
||||
default:
|
||||
if strings.HasPrefix(args[i], "-") {
|
||||
buildFlags = append(buildFlags, args[i])
|
||||
} else {
|
||||
// stop parsing if the argument is not a flag (and so is positional)
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
cpuprofile = os.Getenv("CODEQL_EXTRACTOR_GO_CPU_PROFILE")
|
||||
@@ -46,7 +93,7 @@ func parseFlags(args []string) ([]string, []string) {
|
||||
}
|
||||
|
||||
func main() {
|
||||
buildFlags, patterns := parseFlags(os.Args[1:])
|
||||
buildFlags, patterns := parseFlags(os.Args[1:], false)
|
||||
|
||||
if cpuprofile != "" {
|
||||
f, err := os.Create(cpuprofile)
|
||||
@@ -63,9 +110,10 @@ func main() {
|
||||
if len(patterns) == 0 {
|
||||
log.Println("Nothing to extract.")
|
||||
} else {
|
||||
log.Printf("Build flags: '%s'; patterns: '%s'\n", strings.Join(buildFlags, " "), strings.Join(patterns, " "))
|
||||
err := extractor.ExtractWithFlags(buildFlags, patterns)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
log.Fatalf("Error running go tooling: %s\n", err.Error())
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user