diff options
author | Jeff Gaston <jeffrygaston@google.com> | 2017-09-26 16:46:10 -0700 |
---|---|---|
committer | Jeff Gaston <jeffrygaston@google.com> | 2017-12-01 13:21:35 -0800 |
commit | 90cfb09214f16b4ecb13287ec6683cc7e5a65e4b (patch) | |
tree | 2edd9208e399c5ab71e2ed74c6b6106702d48ace | |
parent | 527012af07c15b0db9f5e0b217b8ec5db91a5a06 (diff) | |
download | build_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
-rw-r--r-- | cmd/sbox/sbox.go | 53 |
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 { |