Defer \n quoting generatedContents until creating the ninja rule

Previously, when writing to generatedContents \n characters were
quoted (replaced with \\n) so as to allow them to be preserved through
ninja/rsp/bash and were unquoted (replaced \\n with \n) just before
redirecting to the output file. That meant that any code which wanted
to access the contents for other purposes, e.g. testing had to unquote
\\n.

This change moves the quoting to be part of the code that generates the
ninja rule which simplifies any other code that has to access the
contents.

Without quoting the generated Android.bp files are not formatted
properly, are all on one line and completely unreadable.

Bug: 156286550
Test: m art-module-sdk and check generated Android.bp file to make sure
      it is properly formatted.
Change-Id: I768c3b96ed08a3daf251730e2a10d9d72338c49a
This commit is contained in:
Paul Duffin 2020-05-11 22:59:25 +01:00
parent 9f10bbf4cf
commit 1110827b3f
3 changed files with 14 additions and 9 deletions

View File

@ -57,7 +57,7 @@ func TestTransformRemoveProperty(t *testing.T) {
contents := &generatedContents{} contents := &generatedContents{}
outputPropertySet(contents, set) outputPropertySet(contents, set)
helper.AssertTrimmedStringEquals("removing property failed", "name: \"name\",\\n", contents.content.String()) helper.AssertTrimmedStringEquals("removing property failed", "name: \"name\",\n", contents.content.String())
} }
func TestTransformRemovePropertySet(t *testing.T) { func TestTransformRemovePropertySet(t *testing.T) {
@ -72,5 +72,5 @@ func TestTransformRemovePropertySet(t *testing.T) {
contents := &generatedContents{} contents := &generatedContents{}
outputPropertySet(contents, set) outputPropertySet(contents, set)
helper.AssertTrimmedStringEquals("removing property set failed", "name: \"name\",\\n", contents.content.String()) helper.AssertTrimmedStringEquals("removing property set failed", "name: \"name\",\n", contents.content.String())
} }

View File

@ -207,7 +207,7 @@ type testSdkResult struct {
// e.g. find the src/dest pairs from each cp command, the various zip files // e.g. find the src/dest pairs from each cp command, the various zip files
// generated, etc. // generated, etc.
func (r *testSdkResult) getSdkSnapshotBuildInfo(sdk *sdk) *snapshotBuildInfo { func (r *testSdkResult) getSdkSnapshotBuildInfo(sdk *sdk) *snapshotBuildInfo {
androidBpContents := strings.NewReplacer("\\n", "\n").Replace(sdk.GetAndroidBpContentsForTests()) androidBpContents := sdk.GetAndroidBpContentsForTests()
info := &snapshotBuildInfo{ info := &snapshotBuildInfo{
r: r, r: r,

View File

@ -87,18 +87,23 @@ func (gc *generatedContents) Dedent() {
} }
func (gc *generatedContents) Printfln(format string, args ...interface{}) { func (gc *generatedContents) Printfln(format string, args ...interface{}) {
// ninja consumes newline characters in rspfile_content. Prevent it by fmt.Fprintf(&(gc.content), strings.Repeat(" ", gc.indentLevel)+format+"\n", args...)
// escaping the backslash in the newline character. The extra backslash
// is removed when the rspfile is written to the actual script file
fmt.Fprintf(&(gc.content), strings.Repeat(" ", gc.indentLevel)+format+"\\n", args...)
} }
func (gf *generatedFile) build(pctx android.PackageContext, ctx android.BuilderContext, implicits android.Paths) { func (gf *generatedFile) build(pctx android.PackageContext, ctx android.BuilderContext, implicits android.Paths) {
rb := android.NewRuleBuilder() rb := android.NewRuleBuilder()
// convert \\n to \n
content := gf.content.String()
// ninja consumes newline characters in rspfile_content. Prevent it by
// escaping the backslash in the newline character. The extra backslash
// is removed when the rspfile is written to the actual script file
content = strings.ReplaceAll(content, "\n", "\\n")
rb.Command(). rb.Command().
Implicits(implicits). Implicits(implicits).
Text("echo").Text(proptools.ShellEscape(gf.content.String())). Text("echo").Text(proptools.ShellEscape(content)).
// convert \\n to \n
Text("| sed 's/\\\\n/\\n/g' >").Output(gf.path) Text("| sed 's/\\\\n/\\n/g' >").Output(gf.path)
rb.Command(). rb.Command().
Text("chmod a+x").Output(gf.path) Text("chmod a+x").Output(gf.path)