From 22ccbbaae82ca62d7b25f2c5e4f2fd280d255801 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Tue, 3 May 2022 14:57:13 +0100 Subject: [PATCH] Run `go mod tidy -e` if go.mod exists --- .../cli/go-autobuilder/go-autobuilder.go | 74 ++++++++++++++++++- 1 file changed, 73 insertions(+), 1 deletion(-) diff --git a/extractor/cli/go-autobuilder/go-autobuilder.go b/extractor/cli/go-autobuilder/go-autobuilder.go index daaf733f88a..d37e1293a91 100644 --- a/extractor/cli/go-autobuilder/go-autobuilder.go +++ b/extractor/cli/go-autobuilder/go-autobuilder.go @@ -2,7 +2,6 @@ package main import ( "fmt" - "golang.org/x/mod/semver" "io/ioutil" "log" "net/url" @@ -13,6 +12,8 @@ import ( "runtime" "strings" + "golang.org/x/mod/semver" + "github.com/github/codeql-go/extractor/autobuilder" "github.com/github/codeql-go/extractor/util" ) @@ -289,6 +290,77 @@ func main() { } } + if depMode == GoGetWithModules { + // stat go.mod and go.sum + var beforeGoModFileInfo, beforeGoSumFileInfo os.FileInfo + + beforeGoMod, beforeGoModerr := os.Open("go.mod") + if beforeGoModerr == nil { + var beforeGoModStatErr error + beforeGoModFileInfo, beforeGoModStatErr = beforeGoMod.Stat() + if beforeGoModStatErr != nil { + log.Println("Failed to stat go.mod before running `go mod tidy -e`") + } + } else { + log.Println("Failed to read go.mod before running `go mod tidy -e`") + } + beforeGoMod.Close() + + beforeGoSum, beforeGoSumErr := os.Open("go.sum") + if beforeGoSumErr == nil { + var beforeGoSumStatErr error + beforeGoSumFileInfo, beforeGoSumStatErr = beforeGoSum.Stat() + if beforeGoSumStatErr != nil { + log.Println("Failed to stat go.sum before running `go mod tidy -e`") + } + } + // don't print a warning if beforeGoSumErr != nil as it may be that the + // file doesn't exist + beforeGoSum.Close() + + // run `go mod tidy -e` + res := util.RunCmd(exec.Command("go", "mod", "tidy", "-e")) + + if !res { + log.Println("Failed to run `go mod tidy -e`") + } else { + if beforeGoModFileInfo != nil { + afterGoMod, afterGoModErr := os.Open("go.mod") + if afterGoModErr != nil { + log.Println("Failed to read go.mod after running `go mod tidy -e`") + } else { + afterGoModFileInfo, afterGoModStatErr := afterGoMod.Stat() + if afterGoModStatErr != nil { + log.Println("Failed to stat go.mod after running `go mod tidy -e`") + } else { + if afterGoModFileInfo.ModTime().After(beforeGoModFileInfo.ModTime()) { + // if go.mod has been changed then notify the user + log.Println("We have run `go mod tidy -e` and it altered go.mod. You may wish to check these changes into version control. ") + } + } + } + afterGoMod.Close() + } + + afterGoSum, afterGoSumErr := os.Open("go.sum") + if afterGoSumErr != nil { + log.Println("Failed to read go.sum after running `go mod tidy -e`") + } else { + afterGoSumFileInfo, afterGoSumStatErr := afterGoSum.Stat() + if afterGoSumStatErr != nil { + log.Println("Failed to stat go.sum after running `go mod tidy -e`") + } else { + if beforeGoSumErr != nil || afterGoSumFileInfo.ModTime().After(beforeGoSumFileInfo.ModTime()) { + // if go.sum has been changed then notify the user + log.Println("We have run `go mod tidy -e` and it altered go.sum. You may wish to check these changes into version control. ") + } + } + } + afterGoSum.Close() + + } + } + // if `LGTM_INDEX_NEED_GOPATH` is set, it overrides the value for `needGopath` inferred above if needGopathOverride := os.Getenv("LGTM_INDEX_NEED_GOPATH"); needGopathOverride != "" { inLGTM = true