From 7690c099539884c8c4a94429eed54573586321be Mon Sep 17 00:00:00 2001 From: "Lukacs T. Berki" Date: Fri, 26 Feb 2021 14:27:36 +0100 Subject: cd to / before running soong_build . This lets one avoid any decisions as to when to chdir there during its execution and leads to better sandboxing because the pwd doesn't leak to init() functions anymore. Test: Manual. Change-Id: I1560da8ed3a621249426f9e8908aa890c21e13ba --- shared/Android.bp | 4 ++++ shared/debug.go | 17 +++++++++++++++++ shared/env.go | 22 ++++++++++++++++++++++ shared/paths.go | 15 +++++++++++++++ shared/paths_test.go | 32 ++++++++++++++++++++++++++++++++ 5 files changed, 90 insertions(+) create mode 100644 shared/debug.go create mode 100644 shared/paths_test.go (limited to 'shared') diff --git a/shared/Android.bp b/shared/Android.bp index c79bc2b39..deb17f8f6 100644 --- a/shared/Android.bp +++ b/shared/Android.bp @@ -8,6 +8,10 @@ bootstrap_go_package { srcs: [ "env.go", "paths.go", + "debug.go", + ], + testSrcs: [ + "paths_test.go", ], deps: [ "soong-bazel", diff --git a/shared/debug.go b/shared/debug.go new file mode 100644 index 000000000..0c9ba4f95 --- /dev/null +++ b/shared/debug.go @@ -0,0 +1,17 @@ +package shared + +import ( + "os" + "os/exec" +) + +// Finds the Delve binary to use. Either uses the SOONG_DELVE_PATH environment +// variable or if that is unset, looks at $PATH. +func ResolveDelveBinary() string { + result := os.Getenv("SOONG_DELVE_PATH") + if result == "" { + result, _ = exec.LookPath("dlv") + } + + return result +} diff --git a/shared/env.go b/shared/env.go index 7900daa88..152729ba0 100644 --- a/shared/env.go +++ b/shared/env.go @@ -91,6 +91,28 @@ func StaleEnvFile(filepath string, getenv func(string) string) (bool, error) { return false, nil } +// Deserializes and environment serialized by EnvFileContents() and returns it +// as a map[string]string. +func EnvFromFile(envFile string) (map[string]string, error) { + result := make(map[string]string) + data, err := ioutil.ReadFile(envFile) + if err != nil { + return result, err + } + + var contents envFileData + err = json.Unmarshal(data, &contents) + if err != nil { + return result, err + } + + for _, entry := range contents { + result[entry.Key] = entry.Value + } + + return result, nil +} + // Implements sort.Interface so that we can use sort.Sort on envFileData arrays. func (e envFileData) Len() int { return len(e) diff --git a/shared/paths.go b/shared/paths.go index 1b9ff6098..fca8b4c15 100644 --- a/shared/paths.go +++ b/shared/paths.go @@ -30,6 +30,21 @@ type SharedPaths interface { BazelMetricsDir() string } +// Joins the path strings in the argument list, taking absolute paths into +// account. That is, if one of the strings is an absolute path, the ones before +// are ignored. +func JoinPath(base string, rest ...string) string { + result := base + for _, next := range rest { + if filepath.IsAbs(next) { + result = next + } else { + result = filepath.Join(result, next) + } + } + return result +} + // Given the out directory, returns the root of the temp directory (to be cleared at the start of each execution of Soong) func TempDirForOutDir(outDir string) (tempPath string) { return filepath.Join(outDir, ".temp") diff --git a/shared/paths_test.go b/shared/paths_test.go new file mode 100644 index 000000000..018d55f34 --- /dev/null +++ b/shared/paths_test.go @@ -0,0 +1,32 @@ +// Copyright 2021 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package shared + +import ( + "testing" +) + +func assertEqual(t *testing.T, expected, actual string) { + t.Helper() + if expected != actual { + t.Errorf("expected %q != got %q", expected, actual) + } +} + +func TestJoinPath(t *testing.T) { + assertEqual(t, "/a/b", JoinPath("c/d", "/a/b")) + assertEqual(t, "a/b", JoinPath("a", "b")) + assertEqual(t, "/a/b", JoinPath("x", "/a", "b")) +} -- cgit v1.2.3-59-g8ed1b