Remove ConfigRemoveAbandonedFilesUnder.

It was not implemented by anyone.

Test: Presubmits.
Change-Id: I8b98620c0ef9c1f242fe7fc0a7d810f2af15d042
This commit is contained in:
Lukacs T. Berki 2021-09-02 10:03:11 +02:00
parent 5e56efb7c8
commit f99e89c147
4 changed files with 0 additions and 196 deletions

View file

@ -113,7 +113,6 @@ bootstrap_go_package {
pkgPath: "github.com/google/blueprint/bootstrap",
srcs: [
"bootstrap/bootstrap.go",
"bootstrap/cleanup.go",
"bootstrap/command.go",
"bootstrap/config.go",
"bootstrap/glob.go",

View file

@ -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
}

View file

@ -120,8 +120,6 @@ func RunBlueprint(args Args, ctx *blueprint.Context, config interface{}) []strin
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 @@ func RunBlueprint(args Args, ctx *blueprint.Context, config interface{}) []strin
}
}
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 {

View file

@ -99,14 +99,6 @@ type BootstrapConfig interface {
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 (