Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 135b4289 authored by Lukács T. Berki's avatar Lukács T. Berki Committed by Gerrit Code Review
Browse files

Merge "Write logs.zip + logs to the correct place."

parents a36ffdea bf5bdb2f
Loading
Loading
Loading
Loading
+73 −13
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ import (
	"flag"
	"fmt"
	"io"
	"io/ioutil"
	"log"
	"os"
	"os/exec"
@@ -76,6 +77,36 @@ func (m *multipleStringArg) Set(s string) error {
	return nil
}

const errorLeadingLines = 20
const errorTrailingLines = 20

func errMsgFromLog(filename string) string {
	if filename == "" {
		return ""
	}

	data, err := ioutil.ReadFile(filename)
	if err != nil {
		return ""
	}

	lines := strings.Split(strings.TrimSpace(string(data)), "\n")
	if len(lines) > errorLeadingLines+errorTrailingLines+1 {
		lines[errorLeadingLines] = fmt.Sprintf("... skipping %d lines ...",
			len(lines)-errorLeadingLines-errorTrailingLines)

		lines = append(lines[:errorLeadingLines+1],
			lines[len(lines)-errorTrailingLines:]...)
	}
	var buf strings.Builder
	for _, line := range lines {
		buf.WriteString("> ")
		buf.WriteString(line)
		buf.WriteString("\n")
	}
	return buf.String()
}

// TODO(b/70370883): This tool uses a lot of open files -- over the default
// soft limit of 1024 on some systems. So bump up to the hard limit until I fix
// the algorithm.
@@ -170,6 +201,23 @@ func ensureEmptyFileExists(file string, log logger.Logger) {
	}
}

func outDirBase() string {
	outDirBase := os.Getenv("OUT_DIR")
	if outDirBase == "" {
		return "out"
	} else {
		return outDirBase
	}
}

func distDir(outDir string) string {
	if distDir := os.Getenv("DIST_DIR"); distDir != "" {
		return filepath.Clean(distDir)
	} else {
		return filepath.Join(outDir, "dist")
	}
}

func main() {
	stdio := terminal.StdioImpl{}

@@ -177,6 +225,12 @@ func main() {
	log := logger.New(output)
	defer log.Cleanup()

	for _, v := range os.Environ() {
		log.Println("Environment: " + v)
	}

	log.Printf("Argv: %v\n", os.Args)

	flag.Parse()

	_, cancel := context.WithCancel(context.Background())
@@ -208,13 +262,7 @@ func main() {
		if !*incremental {
			name += "-" + time.Now().Format("20060102150405")
		}

		outDirBase := os.Getenv("OUT_DIR")
		if outDirBase == "" {
			outDirBase = "out"
		}

		outputDir = filepath.Join(outDirBase, name)
		outputDir = filepath.Join(outDirBase(), name)
	}

	log.Println("Output directory:", outputDir)
@@ -231,11 +279,13 @@ func main() {

	var configLogsDir string
	if *alternateResultDir {
		configLogsDir = filepath.Join(outputDir, "dist/logs")
		configLogsDir = filepath.Join(distDir(outDirBase()), "logs")
	} else {
		configLogsDir = outputDir
	}

	log.Println("Logs dir: " + configLogsDir)

	os.MkdirAll(configLogsDir, 0777)
	log.SetOutput(filepath.Join(configLogsDir, "soong.log"))
	trace.SetOutput(filepath.Join(configLogsDir, "build.trace"))
@@ -348,10 +398,11 @@ func main() {
			FileArgs: []zip.FileArg{
				{GlobDir: logsDir, SourcePrefixToStrip: logsDir},
			},
			OutputFilePath:   filepath.Join(outputDir, "dist/logs.zip"),
			OutputFilePath:   filepath.Join(distDir(outDirBase()), "logs.zip"),
			NumParallelJobs:  runtime.NumCPU(),
			CompressionLevel: 5,
		}
		log.Printf("Logs zip: %v\n", args.OutputFilePath)
		if err := zip.Zip(args); err != nil {
			log.Fatalf("Error zipping logs: %v", err)
		}
@@ -424,10 +475,6 @@ func runSoongUiForProduct(mpctx *mpContext, product string) {
		args = append(args, "--soong-only")
	}

	if *alternateResultDir {
		args = append(args, "dist")
	}

	cmd := exec.Command(mpctx.SoongUi, args...)
	cmd.Stdout = consoleLogWriter
	cmd.Stderr = consoleLogWriter
@@ -439,6 +486,11 @@ func runSoongUiForProduct(mpctx *mpContext, product string) {
		"TARGET_BUILD_APPS=",
		"TARGET_BUILD_UNBUNDLED=")

	if *alternateResultDir {
		cmd.Env = append(cmd.Env,
			"DIST_DIR="+filepath.Join(distDir(outDirBase()), "products/"+product))
	}

	action := &status.Action{
		Description: product,
		Outputs:     []string{product},
@@ -459,9 +511,17 @@ func runSoongUiForProduct(mpctx *mpContext, product string) {
			}
		}
	}
	var errOutput string
	if err == nil {
		errOutput = ""
	} else {
		errOutput = errMsgFromLog(consoleLogPath)
	}

	mpctx.Status.FinishAction(status.ActionResult{
		Action: action,
		Error:  err,
		Output: errOutput,
	})
}