From 743ce99315a1bb3a6ee144ac2ba7088ff7fd61c6 Mon Sep 17 00:00:00 2001 From: James Roper Date: Tue, 24 Sep 2013 12:17:46 +1000 Subject: [PATCH] String upper/lower case no longer locale dependent Fixed many instances of the Turkish i bug. Spare a thought for the poor Turks! --- ivy/src/main/scala/sbt/StringUtilities.scala | 4 +++- launch/src/main/scala/xsbt/boot/Create.scala | 4 ++-- launch/src/main/scala/xsbt/boot/Pre.scala | 3 ++- main/src/main/scala/sbt/Main.scala | 3 ++- main/src/main/scala/sbt/Project.scala | 3 ++- main/src/main/scala/sbt/Resolvers.scala | 5 +++-- run/src/main/scala/sbt/Fork.scala | 3 ++- util/collection/src/main/scala/sbt/Util.scala | 6 ++++-- .../src/main/scala/xsbt/datatype/GenerateDatatypes.scala | 3 ++- util/datatype/src/main/scala/xsbt/datatype/Generator.scala | 3 ++- util/log/src/main/scala/sbt/ConsoleLogger.scala | 5 +++-- 11 files changed, 27 insertions(+), 15 deletions(-) diff --git a/ivy/src/main/scala/sbt/StringUtilities.scala b/ivy/src/main/scala/sbt/StringUtilities.scala index b86427449..caf373d3b 100644 --- a/ivy/src/main/scala/sbt/StringUtilities.scala +++ b/ivy/src/main/scala/sbt/StringUtilities.scala @@ -3,10 +3,12 @@ */ package sbt +import java.util.Locale + object StringUtilities { @deprecated("Different use cases require different normalization. Use Project.normalizeModuleID or normalizeProjectID instead.", "0.13.0") - def normalize(s: String) = s.toLowerCase.replaceAll("""\W+""", "-") + def normalize(s: String) = s.toLowerCase(Locale.ENGLISH).replaceAll("""\W+""", "-") def nonEmpty(s: String, label: String) { require(s.trim.length > 0, label + " cannot be empty.") diff --git a/launch/src/main/scala/xsbt/boot/Create.scala b/launch/src/main/scala/xsbt/boot/Create.scala index 384afbd5e..b22cd2324 100644 --- a/launch/src/main/scala/xsbt/boot/Create.scala +++ b/launch/src/main/scala/xsbt/boot/Create.scala @@ -5,7 +5,7 @@ package xsbt.boot import Pre._ import java.io.{File, FileInputStream, FileOutputStream} -import java.util.Properties +import java.util.{Locale, Properties} import scala.collection.immutable.List object Initialize @@ -19,7 +19,7 @@ object Initialize { case None => declined("") case Some(line) => - line.toLowerCase match + line.toLowerCase(Locale.ENGLISH) match { case "y" | "yes" => process(file, spec, selectCreate) case "s" => process(file, spec, selectQuick) diff --git a/launch/src/main/scala/xsbt/boot/Pre.scala b/launch/src/main/scala/xsbt/boot/Pre.scala index 73440d745..05a9585d1 100644 --- a/launch/src/main/scala/xsbt/boot/Pre.scala +++ b/launch/src/main/scala/xsbt/boot/Pre.scala @@ -6,6 +6,7 @@ package xsbt.boot import scala.collection.immutable.List import java.io.{File, FileFilter} import java.net.{URL, URLClassLoader} + import java.util.Locale object Pre { @@ -79,6 +80,6 @@ object Pre } if(f.exists) f.delete() } - final val isWindows: Boolean = System.getProperty("os.name").toLowerCase.contains("windows") + final val isWindows: Boolean = System.getProperty("os.name").toLowerCase(Locale.ENGLISH).contains("windows") final val isCygwin: Boolean = isWindows && java.lang.Boolean.getBoolean("sbt.cygwin") } diff --git a/main/src/main/scala/sbt/Main.scala b/main/src/main/scala/sbt/Main.scala index 7a70a4aef..d1bd323d1 100644 --- a/main/src/main/scala/sbt/Main.scala +++ b/main/src/main/scala/sbt/Main.scala @@ -15,6 +15,7 @@ package sbt import java.io.File import java.net.URI + import java.util.Locale /** This class is the entry point for sbt.*/ final class xMain extends xsbti.AppMain @@ -394,7 +395,7 @@ object BuiltinCommands def loadFailed = Command.command(LoadFailed)(handleLoadFailed) @tailrec def handleLoadFailed(s: State): State = { - val result = (SimpleReader.readLine("Project loading failed: (r)etry, (q)uit, (l)ast, or (i)gnore? ") getOrElse Quit).toLowerCase + val result = (SimpleReader.readLine("Project loading failed: (r)etry, (q)uit, (l)ast, or (i)gnore? ") getOrElse Quit).toLowerCase(Locale.ENGLISH) def matches(s: String) = !result.isEmpty && (s startsWith result) if(result.isEmpty || matches("retry")) diff --git a/main/src/main/scala/sbt/Project.scala b/main/src/main/scala/sbt/Project.scala index 3d9682fa2..9e89a6b16 100755 --- a/main/src/main/scala/sbt/Project.scala +++ b/main/src/main/scala/sbt/Project.scala @@ -5,6 +5,7 @@ package sbt import java.io.File import java.net.URI + import java.util.Locale import Project.{Initialize => _, Setting => _, _} import Keys.{appConfiguration, stateBuildStructure, commands, configuration, historyPath, projectCommand, sessionSettings, shellPrompt, thisProject, thisProjectRef, watch} import Scope.{GlobalScope,ThisScope} @@ -178,7 +179,7 @@ object Project extends ProjectExtra val refined = if(!validProjectIDStart(attempt.substring(0, 1)) ) "root-" + attempt else attempt validProjectID(refined).toLeft(refined) } - private[this] def normalizeBase(s: String) = s.toLowerCase.replaceAll("""\W+""", "-") + private[this] def normalizeBase(s: String) = s.toLowerCase(Locale.ENGLISH).replaceAll("""\W+""", "-") /** Normalize a String so that it is suitable for use as a dependency management module identifier. * This is a best effort implementation, since valid characters are not documented or consistent.*/ diff --git a/main/src/main/scala/sbt/Resolvers.scala b/main/src/main/scala/sbt/Resolvers.scala index c63ea0858..d75997007 100644 --- a/main/src/main/scala/sbt/Resolvers.scala +++ b/main/src/main/scala/sbt/Resolvers.scala @@ -9,6 +9,7 @@ import java.net.URI import BuildLoader.ResolveInfo import RichURI.fromURI +import java.util.Locale object Resolvers { @@ -112,8 +113,8 @@ object Resolvers private lazy val onWindows = { val os = System.getenv("OSTYPE") - val isCygwin = (os != null) && os.toLowerCase.contains("cygwin") - val isWindows = System.getProperty("os.name", "").toLowerCase.contains("windows") + val isCygwin = (os != null) && os.toLowerCase(Locale.ENGLISH).contains("cygwin") + val isWindows = System.getProperty("os.name", "").toLowerCase(Locale.ENGLISH).contains("windows") isWindows && !isCygwin } diff --git a/run/src/main/scala/sbt/Fork.scala b/run/src/main/scala/sbt/Fork.scala index b7e4c8354..761ef075a 100644 --- a/run/src/main/scala/sbt/Fork.scala +++ b/run/src/main/scala/sbt/Fork.scala @@ -4,6 +4,7 @@ package sbt import java.io.{File,OutputStream} +import java.util.Locale @deprecated("Use ForkOptions", "0.13.0") trait ForkJava @@ -131,7 +132,7 @@ object Fork private[this] def optionsTooLong(options: Seq[String]): Boolean = options.mkString(" ").length > MaxConcatenatedOptionLength - private[this] val isWindows: Boolean = System.getProperty("os.name").toLowerCase.contains("windows") + private[this] val isWindows: Boolean = System.getProperty("os.name").toLowerCase(Locale.ENGLISH).contains("windows") private[this] def convertClasspathToEnv(options: Seq[String]): (Option[String], Seq[String]) = { val (preCP, cpAndPost) = options.span(opt => !isClasspathOption(opt)) diff --git a/util/collection/src/main/scala/sbt/Util.scala b/util/collection/src/main/scala/sbt/Util.scala index f4f6fbb50..27b32dd87 100644 --- a/util/collection/src/main/scala/sbt/Util.scala +++ b/util/collection/src/main/scala/sbt/Util.scala @@ -3,6 +3,8 @@ */ package sbt +import java.util.Locale + object Util { def makeList[T](size: Int, value: T): List[T] = List.fill(size)(value) @@ -31,13 +33,13 @@ object Util def hypenToCamel(s: String): String = hyphenToCamel(s) def hyphenToCamel(s: String): String = if(hasHyphen(s)) - Hypen.replaceAllIn(s, _.group(1).toUpperCase) + Hypen.replaceAllIn(s, _.group(1).toUpperCase(Locale.ENGLISH)) else s private[this] lazy val Camel = """(\p{javaLowerCase})(\p{javaUpperCase})""".r def camelToHypen(s: String): String = - Camel.replaceAllIn(s, m => m.group(1) + "-" + m.group(2).toLowerCase) + Camel.replaceAllIn(s, m => m.group(1) + "-" + m.group(2).toLowerCase(Locale.ENGLISH)) def quoteIfKeyword(s: String): String = if(ScalaKeywords.values(s)) '`' + s + '`' else s } diff --git a/util/datatype/src/main/scala/xsbt/datatype/GenerateDatatypes.scala b/util/datatype/src/main/scala/xsbt/datatype/GenerateDatatypes.scala index 1c5dc100a..b41eb18e7 100644 --- a/util/datatype/src/main/scala/xsbt/datatype/GenerateDatatypes.scala +++ b/util/datatype/src/main/scala/xsbt/datatype/GenerateDatatypes.scala @@ -4,6 +4,7 @@ package xsbt.datatype import java.io.File +import java.util.Locale /** Generates a datatype hierarchy from a definition file.*/ object GenerateDatatypes @@ -18,7 +19,7 @@ object GenerateDatatypes } else { - val immutable = args(0).trim.toLowerCase == "immutable" + val immutable = args(0).trim.toLowerCase(Locale.ENGLISH) == "immutable" val packageName = args(1).trim require(!packageName.isEmpty) diff --git a/util/datatype/src/main/scala/xsbt/datatype/Generator.scala b/util/datatype/src/main/scala/xsbt/datatype/Generator.scala index 196ff0a93..52eda5da5 100644 --- a/util/datatype/src/main/scala/xsbt/datatype/Generator.scala +++ b/util/datatype/src/main/scala/xsbt/datatype/Generator.scala @@ -9,6 +9,7 @@ import sbt.Path import sbt.IO.write import Generator._ +import java.util.Locale abstract class GeneratorBase(val basePkgName: String, val baseDirectory: File) extends NotNull { @@ -129,7 +130,7 @@ object Generator def fieldToString(name: String, single: Boolean) = "\"" + name + ": \" + " + fieldString(name + "()", single) def fieldString(arg: String, single: Boolean) = if(single) arg else "Arrays.toString(" + arg + ")" def normalize(m: MemberDef): MemberDef = - m.mapType(tpe => if(primitives(tpe.toLowerCase)) tpe.toLowerCase else tpe) + m.mapType(tpe => if(primitives(tpe.toLowerCase(Locale.ENGLISH))) tpe.toLowerCase(Locale.ENGLISH) else tpe) private val primitives = Set("int", "boolean", "float", "long", "short", "byte", "char", "double") def toStringMethod(c: ClassDef): String = diff --git a/util/log/src/main/scala/sbt/ConsoleLogger.scala b/util/log/src/main/scala/sbt/ConsoleLogger.scala index 6fefc890a..e5c8f040f 100644 --- a/util/log/src/main/scala/sbt/ConsoleLogger.scala +++ b/util/log/src/main/scala/sbt/ConsoleLogger.scala @@ -3,7 +3,8 @@ */ package sbt - import java.io.{BufferedWriter, PrintStream, PrintWriter} +import java.io.{BufferedWriter, PrintStream, PrintWriter} +import java.util.Locale object ConsoleLogger { @@ -99,7 +100,7 @@ object ConsoleLogger val noSuppressedMessage = (_: SuppressedTraceContext) => None private[this] def os = System.getProperty("os.name") - private[this] def isWindows = os.toLowerCase.indexOf("windows") >= 0 + private[this] def isWindows = os.toLowerCase(Locale.ENGLISH).indexOf("windows") >= 0 def apply(out: PrintStream): ConsoleLogger = apply(ConsoleOut.printStreamOut(out)) def apply(out: PrintWriter): ConsoleLogger = apply(ConsoleOut.printWriterOut(out))