Add support to extend commands bpfix and androidmk
Allows our partners to maintain partner-specific fixes in their repos. Converts most of androidmk into a library similar to bpfix. Makes some methods and types public for use by extended versions.
Bug:140727544
Test: Ran unit test cases &&
ran test conversions with sample
Change-Id: I7e1fbf3a6a7a8bd47334f43fe3eb68cbbd3426c1
diff --git a/bpfix/Android.bp b/bpfix/Android.bp
index 90a453d..aec9ff9 100644
--- a/bpfix/Android.bp
+++ b/bpfix/Android.bp
@@ -19,7 +19,18 @@
blueprint_go_binary {
name: "bpfix",
srcs: [
- "cmd/bpfix.go",
+ "cmd/main.go",
+ ],
+ deps: [
+ "bpfix-cmd",
+ ],
+}
+
+bootstrap_go_package {
+ name: "bpfix-cmd",
+ pkgPath: "android/soong/bpfix/bpfix/cmd",
+ srcs: [
+ "cmd-lib/bpfix.go",
],
deps: [
"bpfix-lib",
diff --git a/bpfix/bpfix/bpfix.go b/bpfix/bpfix/bpfix.go
index 5f1cce8..9cba80a 100644
--- a/bpfix/bpfix/bpfix.go
+++ b/bpfix/bpfix/bpfix.go
@@ -45,66 +45,76 @@
// A FixRequest specifies the details of which fixes to apply to an individual file
// A FixRequest doesn't specify whether to do a dry run or where to write the results; that's in cmd/bpfix.go
type FixRequest struct {
- steps []fixStep
+ steps []FixStep
+}
+type FixStepsExtension struct {
+ Name string
+ Steps []FixStep
}
-type fixStep struct {
- name string
- fix func(f *Fixer) error
+type FixStep struct {
+ Name string
+ Fix func(f *Fixer) error
}
-var fixSteps = []fixStep{
+var fixStepsExtensions = []*FixStepsExtension(nil)
+
+func RegisterFixStepExtension(extension *FixStepsExtension) {
+ fixStepsExtensions = append(fixStepsExtensions, extension)
+}
+
+var fixSteps = []FixStep{
{
- name: "simplifyKnownRedundantVariables",
- fix: runPatchListMod(simplifyKnownPropertiesDuplicatingEachOther),
+ Name: "simplifyKnownRedundantVariables",
+ Fix: runPatchListMod(simplifyKnownPropertiesDuplicatingEachOther),
},
{
- name: "rewriteIncorrectAndroidmkPrebuilts",
- fix: rewriteIncorrectAndroidmkPrebuilts,
+ Name: "rewriteIncorrectAndroidmkPrebuilts",
+ Fix: rewriteIncorrectAndroidmkPrebuilts,
},
{
- name: "rewriteCtsModuleTypes",
- fix: rewriteCtsModuleTypes,
+ Name: "rewriteCtsModuleTypes",
+ Fix: rewriteCtsModuleTypes,
},
{
- name: "rewriteIncorrectAndroidmkAndroidLibraries",
- fix: rewriteIncorrectAndroidmkAndroidLibraries,
+ Name: "rewriteIncorrectAndroidmkAndroidLibraries",
+ Fix: rewriteIncorrectAndroidmkAndroidLibraries,
},
{
- name: "rewriteTestModuleTypes",
- fix: rewriteTestModuleTypes,
+ Name: "rewriteTestModuleTypes",
+ Fix: rewriteTestModuleTypes,
},
{
- name: "rewriteAndroidmkJavaLibs",
- fix: rewriteAndroidmkJavaLibs,
+ Name: "rewriteAndroidmkJavaLibs",
+ Fix: rewriteAndroidmkJavaLibs,
},
{
- name: "rewriteJavaStaticLibs",
- fix: rewriteJavaStaticLibs,
+ Name: "rewriteJavaStaticLibs",
+ Fix: rewriteJavaStaticLibs,
},
{
- name: "rewritePrebuiltEtc",
- fix: rewriteAndroidmkPrebuiltEtc,
+ Name: "rewritePrebuiltEtc",
+ Fix: rewriteAndroidmkPrebuiltEtc,
},
{
- name: "mergeMatchingModuleProperties",
- fix: runPatchListMod(mergeMatchingModuleProperties),
+ Name: "mergeMatchingModuleProperties",
+ Fix: runPatchListMod(mergeMatchingModuleProperties),
},
{
- name: "reorderCommonProperties",
- fix: runPatchListMod(reorderCommonProperties),
+ Name: "reorderCommonProperties",
+ Fix: runPatchListMod(reorderCommonProperties),
},
{
- name: "removeTags",
- fix: runPatchListMod(removeTags),
+ Name: "removeTags",
+ Fix: runPatchListMod(removeTags),
},
{
- name: "rewriteAndroidTest",
- fix: rewriteAndroidTest,
+ Name: "rewriteAndroidTest",
+ Fix: rewriteAndroidTest,
},
{
- name: "rewriteAndroidAppImport",
- fix: rewriteAndroidAppImport,
+ Name: "rewriteAndroidAppImport",
+ Fix: rewriteAndroidAppImport,
},
}
@@ -113,8 +123,27 @@
}
func (r FixRequest) AddAll() (result FixRequest) {
- result.steps = append([]fixStep(nil), r.steps...)
+ result.steps = append([]FixStep(nil), r.steps...)
result.steps = append(result.steps, fixSteps...)
+ for _, extension := range fixStepsExtensions {
+ result.steps = append(result.steps, extension.Steps...)
+ }
+ return result
+}
+
+func (r FixRequest) AddBase() (result FixRequest) {
+ result.steps = append([]FixStep(nil), r.steps...)
+ result.steps = append(result.steps, fixSteps...)
+ return result
+}
+
+func (r FixRequest) AddMatchingExtensions(pattern string) (result FixRequest) {
+ result.steps = append([]FixStep(nil), r.steps...)
+ for _, extension := range fixStepsExtensions {
+ if match, _ := filepath.Match(pattern, extension.Name); match {
+ result.steps = append(result.steps, extension.Steps...)
+ }
+ }
return result
}
@@ -122,6 +151,10 @@
tree *parser.File
}
+func (f Fixer) Tree() *parser.File {
+ return f.tree
+}
+
func NewFixer(tree *parser.File) *Fixer {
fixer := &Fixer{tree}
@@ -198,7 +231,7 @@
func (f *Fixer) fixTreeOnce(config FixRequest) error {
for _, fix := range config.steps {
- err := fix.fix(f)
+ err := fix.Fix(f)
if err != nil {
return err
}
diff --git a/bpfix/cmd/bpfix.go b/bpfix/cmd-lib/bpfix.go
similarity index 97%
rename from bpfix/cmd/bpfix.go
rename to bpfix/cmd-lib/bpfix.go
index ccdae16..98122f2 100644
--- a/bpfix/cmd/bpfix.go
+++ b/bpfix/cmd-lib/bpfix.go
@@ -12,11 +12,11 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-// This file provides a command-line interface to bpfix
+// This file provides a bpfix command-line library
// TODO(jeffrygaston) should this file be consolidated with bpfmt.go?
-package main
+package cmd
import (
"bytes"
@@ -128,7 +128,7 @@
filepath.Walk(path, makeFileVisitor(fixRequest))
}
-func main() {
+func Run() {
flag.Parse()
fixRequest := bpfix.NewFixRequest().AddAll()
diff --git a/bpfix/cmd/main.go b/bpfix/cmd/main.go
new file mode 100644
index 0000000..8ca16b4
--- /dev/null
+++ b/bpfix/cmd/main.go
@@ -0,0 +1,25 @@
+// Copyright 2017 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.
+
+// This file provides a wrapper to the bpfix command-line library
+
+package main
+
+import (
+ "android/soong/bpfix/bpfix/cmd"
+)
+
+func main() {
+ cmd.Run()
+}