Remove ConfigRemoveAbandonedFilesUnder. am: f99e89c147
Original change: https://android-review.googlesource.com/c/platform/build/blueprint/+/1817977 Change-Id: I78ad77bcf99c77e372c3e2cf6c3b207df9965daa
This commit is contained in:
commit
6a48d308a6
4 changed files with 0 additions and 196 deletions
|
@ -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",
|
||||
|
|
|
@ -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
|
||||
}
|
|
@ -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 {
|
||||
|
|
|
@ -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 (
|
||||
|
|
Loading…
Reference in a new issue