Created
August 8, 2011 23:45
-
-
Save 4e6/1133059 to your computer and use it in GitHub Desktop.
Scala script to find duplicate resources in android projects
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* to run from console: | |
* $scala DuplicatesFinder.scala /path/to/android/project | |
*/ | |
import java.io.File | |
import scala.xml._ | |
val folder = args(0) | |
val project = new File(folder) | |
if (!project.exists()) { | |
println("Folder not exists.\nExit...") | |
System.exit(0) | |
} | |
// Try to find original strings.xml in 'values' folder | |
val stringsOrig = findStrings(project, "values$") | |
if (stringsOrig.isEmpty) { | |
println("res/values/strings.xml not found\nExit...") | |
System.exit(0) | |
} else { | |
println("Found original " + stringsOrig.head.getName) | |
} | |
//Try to find localized strings.xml in 'values*' folders | |
val stringsLocalized = findStrings(project, "values.") | |
if (stringsLocalized.isEmpty) { | |
println("Localized resources not found\nExit...") | |
System.exit(0) | |
} else { | |
println("\nFound localized:") | |
stringsLocalized.foreach(printNiceName) | |
println | |
} | |
val resourcesOrig = (XML.loadFile(stringsOrig.head) \\ "resources") | |
// Original sets of resource names | |
val stringOrig = mkSet(resourcesOrig, "string") | |
val stringArrayOrig = mkSet(resourcesOrig, "string-array") | |
val pluralsOrig = mkSet(resourcesOrig, "plurals") | |
println("\nFound duplicate resources in") | |
stringsLocalized.foreach(f => { | |
val r = XML.loadFile(f) \\ "resources" | |
val string = mkSet(r, "string") | |
val stringArray = mkSet(r, "string-array") | |
val plurals = mkSet(r, "plurals") | |
printNiceName(f) | |
println("NOT LOCALIZED:") | |
println("strings: " + (stringOrig &~ string)) | |
println("string-arrays: " + (stringArrayOrig &~ stringArray)) | |
println("plurals: " + (pluralsOrig &~ plurals)) | |
println("OBSOLETE: ") | |
println("strings: " + (string &~ stringOrig)) | |
println("string-arrays: " + (stringArray &~ stringArrayOrig)) | |
println("plurals: " + (plurals &~ pluralsOrig)) | |
println | |
}) | |
def findStrings(root: File, regex: String) = | |
root.listFiles | |
.withFilter(_.getName == "res") | |
.flatMap(_.listFiles.filter(f => regex.r.findFirstIn(f.getName).isDefined)) | |
.flatMap(_.listFiles.filter(_.getName == "strings.xml")) | |
def mkSet(ns: NodeSeq, tag: String) = | |
(ns \ tag) map (_ \ "@name" text) toSet | |
def printNiceName(f: File) = println(f.getParentFile.getName + "/" + f.getName) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment