aboutsummaryrefslogtreecommitdiffstats
path: root/cmd
diff options
context:
space:
mode:
authorJeff Gaston <jeffrygaston@google.com>2017-09-26 16:46:10 -0700
committerJeff Gaston <jeffrygaston@google.com>2017-12-01 13:21:35 -0800
commit90cfb09214f16b4ecb13287ec6683cc7e5a65e4b (patch)
tree2edd9208e399c5ab71e2ed74c6b6106702d48ace /cmd
parent527012af07c15b0db9f5e0b217b8ec5db91a5a06 (diff)
downloadbuild_soong-90cfb09214f16b4ecb13287ec6683cc7e5a65e4b.tar.gz
build_soong-90cfb09214f16b4ecb13287ec6683cc7e5a65e4b.tar.bz2
build_soong-90cfb09214f16b4ecb13287ec6683cc7e5a65e4b.zip
sbox error message now lists the files that were created
which should make debugging faster. Bug: 66921582 Test: ./out/soong/host/linux-x86/bin/sbox --output-root outs --sandbox-path out/.temp/sbox-work -c "cd __SBOX_OUT_DIR__ && mkdir asubdir && mkdir b && touch asubdir/child a b c d e f g h i j k l m n o p" outs/a outs/b outs/z # and observe the below output: mismatch between declared and actual outputs in sbox command(cd out/.temp/sbox-work/sbox343858828 && mkdir asubdir && mkdir b && touch asubdir/child a b c d e f g h i j k l m n o p) in sandbox out/.temp/sbox-work/sbox343858828, failed to create 2 files: b: not a file z: does not exist did create 16 files: a asubdir/child c d e f g h i j ...6 more Change-Id: I75e37834c44d4279dec874701d67ce8bb01b872c
Diffstat (limited to 'cmd')
-rw-r--r--cmd/sbox/sbox.go53
1 files changed, 48 insertions, 5 deletions
diff --git a/cmd/sbox/sbox.go b/cmd/sbox/sbox.go
index 558bc3fb..3b41c908 100644
--- a/cmd/sbox/sbox.go
+++ b/cmd/sbox/sbox.go
@@ -15,6 +15,7 @@
package main
import (
+ "errors"
"flag"
"fmt"
"io/ioutil"
@@ -78,6 +79,22 @@ func main() {
}
}
+func findAllFilesUnder(root string) (paths []string) {
+ paths = []string{}
+ filepath.Walk(root, func(path string, info os.FileInfo, err error) error {
+ if !info.IsDir() {
+ relPath, err := filepath.Rel(root, path)
+ if err != nil {
+ // couldn't find relative path from ancestor?
+ panic(err)
+ }
+ paths = append(paths, relPath)
+ }
+ return nil
+ })
+ return paths
+}
+
func run() error {
if rawCommand == "" {
usageViolation("-c <commandToRun> is required and must be non-empty")
@@ -196,23 +213,49 @@ func run() error {
}
// validate that all files are created properly
- var outputErrors []error
+ var missingOutputErrors []string
for _, filePath := range allOutputs {
tempPath := filepath.Join(tempDir, filePath)
fileInfo, err := os.Stat(tempPath)
if err != nil {
- outputErrors = append(outputErrors, fmt.Errorf("failed to create expected output file: %s\n", tempPath))
+ missingOutputErrors = append(missingOutputErrors, fmt.Sprintf("%s: does not exist", filePath))
continue
}
if fileInfo.IsDir() {
- outputErrors = append(outputErrors, fmt.Errorf("Output path %s refers to a directory, not a file. This is not permitted because it prevents robust up-to-date checks\n", filePath))
+ missingOutputErrors = append(missingOutputErrors, fmt.Sprintf("%s: not a file", filePath))
}
}
- if len(outputErrors) > 0 {
+ if len(missingOutputErrors) > 0 {
+ // find all created files for making a more informative error message
+ createdFiles := findAllFilesUnder(tempDir)
+
+ // build error message
+ errorMessage := "mismatch between declared and actual outputs\n"
+ errorMessage += "in sbox command(" + commandDescription + ")\n\n"
+ errorMessage += "in sandbox " + tempDir + ",\n"
+ errorMessage += fmt.Sprintf("failed to create %v files:\n", len(missingOutputErrors))
+ for _, missingOutputError := range missingOutputErrors {
+ errorMessage += " " + missingOutputError + "\n"
+ }
+ if len(createdFiles) < 1 {
+ errorMessage += "created 0 files."
+ } else {
+ errorMessage += fmt.Sprintf("did create %v files:\n", len(createdFiles))
+ creationMessages := createdFiles
+ maxNumCreationLines := 10
+ if len(creationMessages) > maxNumCreationLines {
+ creationMessages = creationMessages[:maxNumCreationLines]
+ creationMessages = append(creationMessages, fmt.Sprintf("...%v more", len(createdFiles)-maxNumCreationLines))
+ }
+ for _, creationMessage := range creationMessages {
+ errorMessage += " " + creationMessage + "\n"
+ }
+ }
+
// Keep the temporary output directory around in case a user wants to inspect it for debugging purposes.
// Soong will delete it later anyway.
keepOutDir = true
- return fmt.Errorf("mismatch between declared and actual outputs in sbox command (%s):\n%v", commandDescription, outputErrors)
+ return errors.New(errorMessage)
}
// the created files match the declared files; now move them
for _, filePath := range allOutputs {