Remove ConfigRemoveAbandonedFilesUnder. am: f99e89c147

Original change: https://android-review.googlesource.com/c/platform/build/blueprint/+/1817977

Change-Id: I78ad77bcf99c77e372c3e2cf6c3b207df9965daa
diff --git a/Android.bp b/Android.bp
index ef46002..669eb49 100644
--- a/Android.bp
+++ b/Android.bp
@@ -113,7 +113,6 @@
     pkgPath: "github.com/google/blueprint/bootstrap",
     srcs: [
         "bootstrap/bootstrap.go",
-        "bootstrap/cleanup.go",
         "bootstrap/command.go",
         "bootstrap/config.go",
         "bootstrap/glob.go",
diff --git a/bootstrap/cleanup.go b/bootstrap/cleanup.go
deleted file mode 100644
index ed3c630..0000000
--- a/bootstrap/cleanup.go
+++ /dev/null
@@ -1,177 +0,0 @@
-// Copyright 2014 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 bootstrap
-
-import (
-	"bufio"
-	"errors"
-	"fmt"
-	"os"
-	"path/filepath"
-	"strings"
-	"syscall"
-
-	"github.com/google/blueprint"
-)
-
-const logFileName = ".ninja_log"
-
-// removeAbandonedFilesUnder removes any files that appear in the Ninja log, and
-// are prefixed with one of the `under` entries, but that are not currently
-// build targets, or in `exempt`
-func removeAbandonedFilesUnder(ctx *blueprint.Context,
-	srcDir, buildDir string, under, exempt []string) error {
-
-	if len(under) == 0 {
-		return nil
-	}
-
-	outDir, err := ctx.OutDir()
-	if err != nil {
-		return err
-	}
-
-	targetRules, err := ctx.AllTargets()
-	if err != nil {
-		return fmt.Errorf("error determining target list: %s", err)
-	}
-
-	replacer := strings.NewReplacer(
-		"@@SrcDir@@", srcDir,
-		"@@BuildDir@@", buildDir)
-	outDir = replacer.Replace(outDir)
-	targets := make(map[string]bool)
-	for target := range targetRules {
-		replacedTarget := replacer.Replace(target)
-		targets[filepath.Clean(replacedTarget)] = true
-	}
-	for _, target := range exempt {
-		replacedTarget := replacer.Replace(target)
-		targets[filepath.Clean(replacedTarget)] = true
-	}
-
-	filePaths, err := parseNinjaLog(outDir, under)
-	if err != nil {
-		return err
-	}
-
-	for _, filePath := range filePaths {
-		isTarget := targets[filePath]
-		if !isTarget {
-			err = removeFileAndEmptyDirs(joinPath(ctx.SrcDir(), filePath))
-			if err != nil {
-				return err
-			}
-		}
-	}
-
-	return nil
-}
-
-func parseNinjaLog(outDir string, under []string) ([]string, error) {
-	logFilePath := filepath.Join(outDir, logFileName)
-	logFile, err := os.Open(logFilePath)
-	if err != nil {
-		if os.IsNotExist(err) {
-			return nil, nil
-		}
-		return nil, err
-	}
-	defer logFile.Close()
-
-	scanner := bufio.NewScanner(logFile)
-
-	// Check that the first line indicates that this is a Ninja log version 5
-	const expectedFirstLine = "# ninja log v5"
-	if !scanner.Scan() || scanner.Text() != expectedFirstLine {
-		return nil, errors.New("unrecognized ninja log format")
-	}
-
-	var filePaths []string
-	for scanner.Scan() {
-		line := scanner.Text()
-		if strings.HasPrefix(line, "#") {
-			continue
-		}
-
-		const fieldSeperator = "\t"
-		fields := strings.Split(line, fieldSeperator)
-
-		const precedingFields = 3
-		const followingFields = 1
-
-		if len(fields) < precedingFields+followingFields+1 {
-			return nil, fmt.Errorf("log entry has too few fields: %q", line)
-		}
-
-		start := precedingFields
-		end := len(fields) - followingFields
-		filePath := strings.Join(fields[start:end], fieldSeperator)
-
-		for _, dir := range under {
-			if strings.HasPrefix(filePath, dir) {
-				filePaths = append(filePaths, filePath)
-				break
-			}
-		}
-	}
-	if err := scanner.Err(); err != nil {
-		return nil, err
-	}
-
-	return filePaths, nil
-}
-
-func removeFileAndEmptyDirs(path string) error {
-	err := os.Remove(path)
-	if err != nil {
-		if os.IsNotExist(err) {
-			return nil
-		}
-		pathErr := err.(*os.PathError)
-		switch pathErr.Err {
-		case syscall.ENOTEMPTY, syscall.EEXIST, syscall.ENOTDIR:
-			return nil
-		}
-		return err
-	}
-	fmt.Printf("removed old ninja-created file %s because it has no rule to generate it\n", path)
-
-	path, err = filepath.Abs(path)
-	if err != nil {
-		return err
-	}
-
-	cwd, err := os.Getwd()
-	if err != nil {
-		return err
-	}
-
-	for dir := filepath.Dir(path); dir != cwd; dir = filepath.Dir(dir) {
-		err = os.Remove(dir)
-		if err != nil {
-			pathErr := err.(*os.PathError)
-			switch pathErr.Err {
-			case syscall.ENOTEMPTY, syscall.EEXIST:
-				// We've come to a nonempty directory, so we're done.
-				return nil
-			default:
-				return err
-			}
-		}
-	}
-
-	return nil
-}
diff --git a/bootstrap/command.go b/bootstrap/command.go
index 010f28f..319fd6f 100644
--- a/bootstrap/command.go
+++ b/bootstrap/command.go
@@ -120,8 +120,6 @@
 		fatalf("could not enumerate files: %v\n", err.Error())
 	}
 
-	soongOutDir := config.(BootstrapConfig).SoongOutDir()
-
 	ctx.RegisterBottomUpMutator("bootstrap_plugin_deps", pluginDeps)
 	ctx.RegisterModuleType("bootstrap_go_package", newGoPackageModuleFactory())
 	ctx.RegisterModuleType("blueprint_go_binary", newGoBinaryModuleFactory())
@@ -200,14 +198,6 @@
 		}
 	}
 
-	if c, ok := config.(ConfigRemoveAbandonedFilesUnder); ok {
-		under, except := c.RemoveAbandonedFilesUnder(soongOutDir)
-		err := removeAbandonedFilesUnder(ctx, srcDir, soongOutDir, under, except)
-		if err != nil {
-			fatalf("error removing abandoned files: %s", err)
-		}
-	}
-
 	if args.Memprofile != "" {
 		f, err := os.Create(joinPath(ctx.SrcDir(), args.Memprofile))
 		if err != nil {
diff --git a/bootstrap/config.go b/bootstrap/config.go
index 6d37eb5..bcfdcf9 100644
--- a/bootstrap/config.go
+++ b/bootstrap/config.go
@@ -99,14 +99,6 @@
 	PrimaryBuilderInvocations() []PrimaryBuilderInvocation
 }
 
-type ConfigRemoveAbandonedFilesUnder interface {
-	// RemoveAbandonedFilesUnder should return two slices:
-	// - a slice of path prefixes that will be cleaned of files that are no
-	//   longer active targets, but are listed in the .ninja_log.
-	// - a slice of paths that are exempt from cleaning
-	RemoveAbandonedFilesUnder(buildDir string) (under, except []string)
-}
-
 type StopBefore int
 
 const (