Extract jar-sorting to be accessible to soong_zip

Bug: 64536066
Test: m -j # which runs unit tests
Change-Id: I4830bd331c9dab0b1d300a18aefaf25a6af4cfdc
This commit is contained in:
Jeff Gaston
2017-08-21 20:13:28 -07:00
parent c5eb66d16b
commit 01547b23d2
5 changed files with 84 additions and 32 deletions

View File

@@ -4,6 +4,7 @@ subdirs = [
"cmd/*", "cmd/*",
"fs", "fs",
"finder", "finder",
"jar",
"third_party/zip", "third_party/zip",
"ui/*", "ui/*",
] ]

View File

@@ -14,7 +14,10 @@
blueprint_go_binary { blueprint_go_binary {
name: "zip2zip", name: "zip2zip",
deps: ["android-archive-zip"], deps: [
"android-archive-zip",
"soong-jar",
],
srcs: [ srcs: [
"zip2zip.go", "zip2zip.go",
], ],

View File

@@ -24,6 +24,7 @@ import (
"strings" "strings"
"time" "time"
"android/soong/jar"
"android/soong/third_party/zip" "android/soong/third_party/zip"
) )
@@ -178,37 +179,7 @@ func zip2zip(reader *zip.Reader, writer *zip.Writer, sortGlobs, sortJava, setTim
} }
func jarSort(files []pair) { func jarSort(files []pair) {
// Treats trailing * as a prefix match
match := func(pattern, name string) bool {
if strings.HasSuffix(pattern, "*") {
return strings.HasPrefix(name, strings.TrimSuffix(pattern, "*"))
} else {
return name == pattern
}
}
var jarOrder = []string{
"META-INF/",
"META-INF/MANIFEST.MF",
"META-INF/*",
"*",
}
index := func(name string) int {
for i, pattern := range jarOrder {
if match(pattern, name) {
return i
}
}
panic(fmt.Errorf("file %q did not match any pattern", name))
}
sort.SliceStable(files, func(i, j int) bool { sort.SliceStable(files, func(i, j int) bool {
diff := index(files[i].newName) - index(files[j].newName) return jar.EntryNamesLess(files[i].newName, files[j].newName)
if diff == 0 {
return files[i].newName < files[j].newName
} else {
return diff < 0
}
}) })
} }

22
jar/Android.bp Normal file
View File

@@ -0,0 +1,22 @@
// 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.
bootstrap_go_package {
name: "soong-jar",
pkgPath: "android/soong/jar",
srcs: [
"jar.go",
],
}

55
jar/jar.go Normal file
View File

@@ -0,0 +1,55 @@
// 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.
package jar
import (
"fmt"
"strings"
)
// EntryNamesLess tells whether <filepathA> should precede <filepathB> in
// the order of files with a .jar
func EntryNamesLess(filepathA string, filepathB string) (less bool) {
diff := index(filepathA) - index(filepathB)
if diff == 0 {
return filepathA < filepathB
}
return diff < 0
}
// Treats trailing * as a prefix match
func patternMatch(pattern, name string) bool {
if strings.HasSuffix(pattern, "*") {
return strings.HasPrefix(name, strings.TrimSuffix(pattern, "*"))
} else {
return name == pattern
}
}
var jarOrder = []string{
"META-INF/",
"META-INF/MANIFEST.MF",
"META-INF/*",
"*",
}
func index(name string) int {
for i, pattern := range jarOrder {
if patternMatch(pattern, name) {
return i
}
}
panic(fmt.Errorf("file %q did not match any pattern", name))
}