diff options
author | 2021-03-23 14:16:05 -0700 | |
---|---|---|
committer | 2021-03-25 11:06:45 -0700 | |
commit | fd708b5651be777b444406aaae02dff3c7a4a143 (patch) | |
tree | 99c71130963b7536399a6507e44346e379cb38cd /zip | |
parent | 6c968b1f0fc2818f75292820c8146763277973af (diff) |
Move response file handling to a separate package
sbox is going to need to read and write response files, move ReadRspFile
to its own package.
Test: response_test.go
Change-Id: Iecb5486b4aaeb2531828743ad8ef784df675e18e
Diffstat (limited to 'zip')
-rw-r--r-- | zip/Android.bp | 1 | ||||
-rw-r--r-- | zip/cmd/main.go | 12 | ||||
-rw-r--r-- | zip/zip.go | 52 | ||||
-rw-r--r-- | zip/zip_test.go | 72 |
4 files changed, 14 insertions, 123 deletions
diff --git a/zip/Android.bp b/zip/Android.bp index b28adbd51..14541eb1c 100644 --- a/zip/Android.bp +++ b/zip/Android.bp @@ -25,6 +25,7 @@ bootstrap_go_package { "android-archive-zip", "blueprint-pathtools", "soong-jar", + "soong-response", ], srcs: [ "zip.go", diff --git a/zip/cmd/main.go b/zip/cmd/main.go index fc976f689..cbc73eda6 100644 --- a/zip/cmd/main.go +++ b/zip/cmd/main.go @@ -24,7 +24,6 @@ package main import ( "flag" "fmt" - "io/ioutil" "os" "runtime" "runtime/pprof" @@ -32,6 +31,7 @@ import ( "strconv" "strings" + "android/soong/response" "android/soong/zip" ) @@ -125,12 +125,18 @@ func main() { var expandedArgs []string for _, arg := range os.Args { if strings.HasPrefix(arg, "@") { - bytes, err := ioutil.ReadFile(strings.TrimPrefix(arg, "@")) + f, err := os.Open(strings.TrimPrefix(arg, "@")) + if err != nil { + fmt.Fprintln(os.Stderr, err.Error()) + os.Exit(1) + } + + respArgs, err := response.ReadRspFile(f) + f.Close() if err != nil { fmt.Fprintln(os.Stderr, err.Error()) os.Exit(1) } - respArgs := zip.ReadRespFile(bytes) expandedArgs = append(expandedArgs, respArgs...) } else { expandedArgs = append(expandedArgs, arg) diff --git a/zip/zip.go b/zip/zip.go index 088ed0d04..a6490d452 100644 --- a/zip/zip.go +++ b/zip/zip.go @@ -29,7 +29,8 @@ import ( "sync" "syscall" "time" - "unicode" + + "android/soong/response" "github.com/google/blueprint/pathtools" @@ -164,14 +165,12 @@ func (b *FileArgsBuilder) RspFile(name string) *FileArgsBuilder { } defer f.Close() - list, err := ioutil.ReadAll(f) + arg := b.state + arg.SourceFiles, err = response.ReadRspFile(f) if err != nil { b.err = err return b } - - arg := b.state - arg.SourceFiles = ReadRespFile(list) for i := range arg.SourceFiles { arg.SourceFiles[i] = pathtools.MatchEscape(arg.SourceFiles[i]) } @@ -253,49 +252,6 @@ type ZipArgs struct { Filesystem pathtools.FileSystem } -const NOQUOTE = '\x00' - -func ReadRespFile(bytes []byte) []string { - var args []string - var arg []rune - - isEscaping := false - quotingStart := NOQUOTE - for _, c := range string(bytes) { - switch { - case isEscaping: - if quotingStart == '"' { - if !(c == '"' || c == '\\') { - // '\"' or '\\' will be escaped under double quoting. - arg = append(arg, '\\') - } - } - arg = append(arg, c) - isEscaping = false - case c == '\\' && quotingStart != '\'': - isEscaping = true - case quotingStart == NOQUOTE && (c == '\'' || c == '"'): - quotingStart = c - case quotingStart != NOQUOTE && c == quotingStart: - quotingStart = NOQUOTE - case quotingStart == NOQUOTE && unicode.IsSpace(c): - // Current character is a space outside quotes - if len(arg) != 0 { - args = append(args, string(arg)) - } - arg = arg[:0] - default: - arg = append(arg, c) - } - } - - if len(arg) != 0 { - args = append(args, string(arg)) - } - - return args -} - func zipTo(args ZipArgs, w io.Writer) error { if args.EmulateJar { args.AddDirectoryEntriesToZip = true diff --git a/zip/zip_test.go b/zip/zip_test.go index b456ef8f2..a37ae41e4 100644 --- a/zip/zip_test.go +++ b/zip/zip_test.go @@ -535,78 +535,6 @@ func TestZip(t *testing.T) { } } -func TestReadRespFile(t *testing.T) { - testCases := []struct { - name, in string - out []string - }{ - { - name: "single quoting test case 1", - in: `./cmd '"'-C`, - out: []string{"./cmd", `"-C`}, - }, - { - name: "single quoting test case 2", - in: `./cmd '-C`, - out: []string{"./cmd", `-C`}, - }, - { - name: "single quoting test case 3", - in: `./cmd '\"'-C`, - out: []string{"./cmd", `\"-C`}, - }, - { - name: "single quoting test case 4", - in: `./cmd '\\'-C`, - out: []string{"./cmd", `\\-C`}, - }, - { - name: "none quoting test case 1", - in: `./cmd \'-C`, - out: []string{"./cmd", `'-C`}, - }, - { - name: "none quoting test case 2", - in: `./cmd \\-C`, - out: []string{"./cmd", `\-C`}, - }, - { - name: "none quoting test case 3", - in: `./cmd \"-C`, - out: []string{"./cmd", `"-C`}, - }, - { - name: "double quoting test case 1", - in: `./cmd "'"-C`, - out: []string{"./cmd", `'-C`}, - }, - { - name: "double quoting test case 2", - in: `./cmd "\\"-C`, - out: []string{"./cmd", `\-C`}, - }, - { - name: "double quoting test case 3", - in: `./cmd "\""-C`, - out: []string{"./cmd", `"-C`}, - }, - { - name: "ninja rsp file", - in: "'a'\nb\n'@'\n'foo'\\''bar'\n'foo\"bar'", - out: []string{"a", "b", "@", "foo'bar", `foo"bar`}, - }, - } - - for _, testCase := range testCases { - t.Run(testCase.name, func(t *testing.T) { - got := ReadRespFile([]byte(testCase.in)) - if !reflect.DeepEqual(got, testCase.out) { - t.Errorf("expected %q got %q", testCase.out, got) - } - }) - } -} - func TestSrcJar(t *testing.T) { mockFs := pathtools.MockFs(map[string][]byte{ "wrong_package.java": []byte("package foo;"), |