From f813256ced1015769377b83576be8e55a6b8c011 Mon Sep 17 00:00:00 2001 From: Mark Harrah Date: Sat, 19 Nov 2011 23:56:30 -0500 Subject: [PATCH] detect invalid project IDs --- main/Command.scala | 12 ++++++++---- main/Project.scala | 8 ++++++-- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/main/Command.scala b/main/Command.scala index 2576ef158..1b3cb3c26 100644 --- a/main/Command.scala +++ b/main/Command.scala @@ -87,16 +87,20 @@ object Command def process(command: String, state: State): State = { val parser = combine(state.definedCommands) - Parser.result(parser(state), command) match + parse(command, parser(state)) match { case Right(s) => s() // apply command. command side effects happen here - case Left(failures) => - val (msgs,pos) = failures() - val errMsg = commandError(command, msgs, pos) + case Left(errMsg) => state.log.error(errMsg) state.fail } } + def parse[T](str: String, parser: Parser[T]): Either[String, T] = + Parser.result(parser, str).left.map { failures => + val (msgs,pos) = failures() + commandError(str, msgs, pos) + } + def commandError(command: String, msgs: Seq[String], index: Int): String = { val (line, modIndex) = extractLine(command, index) diff --git a/main/Project.scala b/main/Project.scala index 634dd8a1c..4122c9cfd 100644 --- a/main/Project.scala +++ b/main/Project.scala @@ -10,6 +10,7 @@ package sbt import Scope.{GlobalScope,ThisScope} import Load.BuildStructure import Types.{idFun, Id} + import complete.DefaultParsers sealed trait ProjectDefinition[PR <: ProjectReference] { @@ -136,7 +137,10 @@ object Project extends Init[Scope] with ProjectExtra def apply(id: String, base: File, aggregate: => Seq[ProjectReference] = Nil, dependencies: => Seq[ClasspathDep[ProjectReference]] = Nil, delegates: => Seq[ProjectReference] = Nil, settings: => Seq[Setting[_]] = defaultSettings, configurations: Seq[Configuration] = Configurations.default): Project = - new ProjectDef[ProjectReference](id, base, aggregate, dependencies, delegates, settings, configurations) with Project + { + Command.parse(id, DefaultParsers.ID).left.foreach(errMsg => error("Invalid project ID: " + errMsg)) + new ProjectDef[ProjectReference](id, base, aggregate, dependencies, delegates, settings, configurations) with Project + } def resolved(id: String, base: File, aggregate: => Seq[ProjectRef], dependencies: => Seq[ResolvedClasspathDependency], delegates: => Seq[ProjectRef], settings: Seq[Setting[_]], configurations: Seq[Configuration]): ResolvedProject = @@ -314,7 +318,7 @@ object Project extends Init[Scope] with ProjectExtra val Return, Current, Plugins = Value } import LoadAction._ - import complete.DefaultParsers._ + import DefaultParsers._ val loadActionParser = token(Space ~> ("plugins" ^^^ Plugins | "return" ^^^ Return)) ?? Current