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

Commit 873691ae authored by Treehugger Robot's avatar Treehugger Robot Committed by Gerrit Code Review
Browse files

Merge "simplify `m clean`"

parents cd4e6a60 6e1aa783
Loading
Loading
Loading
Loading
+2 −6
Original line number Diff line number Diff line
@@ -9,12 +9,8 @@ source "$(dirname "$0")/lib.sh"
function test_m_clean_works {
  setup

  # Create a directory with files that cannot be removed
  mkdir -p out/bad_directory_permissions
  touch out/bad_directory_permissions/unremovable_file
  # File permissions are fine but directory permissions are bad
  chmod a+rwx out/bad_directory_permissions/unremovable_file
  chmod a-rwx out/bad_directory_permissions
  mkdir -p out/some_directory
  touch out/some_directory/some_file

  run_soong clean
}
+0 −29
Original line number Diff line number Diff line
@@ -17,7 +17,6 @@ package build
import (
	"bytes"
	"fmt"
	"io/fs"
	"io/ioutil"
	"os"
	"path/filepath"
@@ -59,37 +58,9 @@ const (
	FILEMODE_USER_EXECUTE = FILEMODE_EXECUTE << FILEMODE_USER_SHIFT
)

// Ensures that files and directories in the out dir can be deleted.
// For example, Bazen can generate output directories where the write bit isn't set, causing 'm' clean' to fail.
func ensureOutDirRemovable(ctx Context, config Config) {
	err := filepath.WalkDir(config.OutDir(), func(path string, d fs.DirEntry, err error) error {
		if err != nil {
			return err
		}
		if d.IsDir() {
			info, err := d.Info()
			if err != nil {
				return err
			}
			// Equivalent to running chmod u+rwx on each directory
			newMode := info.Mode() | FILEMODE_USER_READ | FILEMODE_USER_WRITE | FILEMODE_USER_EXECUTE
			if err := os.Chmod(path, newMode); err != nil {
				return err
			}
		}
		// Continue walking the out dir...
		return nil
	})
	if err != nil && !os.IsNotExist(err) {
		// Display the error, but don't crash.
		ctx.Println(err.Error())
	}
}

// Remove everything under the out directory. Don't remove the out directory
// itself in case it's a symlink.
func clean(ctx Context, config Config) {
	ensureOutDirRemovable(ctx, config)
	removeGlobs(ctx, filepath.Join(config.OutDir(), "*"))
	ctx.Println("Entire build directory removed.")
}