diff --git a/src/main/scala/ssh/GitCommand.scala b/src/main/scala/ssh/GitCommand.scala index 7ec5842..46a5566 100644 --- a/src/main/scala/ssh/GitCommand.scala +++ b/src/main/scala/ssh/GitCommand.scala @@ -13,18 +13,8 @@ import org.eclipse.jgit.errors.RepositoryNotFoundException -class GitCommandFactory extends CommandFactory { - private val logger = LoggerFactory.getLogger(classOf[GitCommandFactory]) - - override def createCommand(command: String): Command = { - logger.debug(s"command: $command") - command match { - // TODO MUST use regular expression and UnitTest - case s if s.startsWith("git-upload-pack") => new GitUploadPack(command) - case s if s.startsWith("git-receive-pack") => new GitReceivePack(command) - case _ => new UnknownCommand(command) - } - } +object GitCommand { + val CommandRegex = """\Agit-(upload|receive)-pack '/([a-zA-Z0-9\-_.]+)/([a-zA-Z0-9\-_.]+).git'\Z""".r } abstract class GitCommand(val command: String) extends Command { @@ -47,7 +37,7 @@ logger.info(e.getMessage) callback.onExit(1, "Repository Not Found") case e: Throwable => - logger.info(e.getMessage, e) + logger.error(e.getMessage, e) callback.onExit(1) } } @@ -121,3 +111,16 @@ } } + +class GitCommandFactory extends CommandFactory { + private val logger = LoggerFactory.getLogger(classOf[GitCommandFactory]) + + override def createCommand(command: String): Command = { + logger.debug(s"command: $command") + command match { + case GitCommand.CommandRegex("upload", owner, repoName) => new GitUploadPack(command) + case GitCommand.CommandRegex("receive", owner, repoName) => new GitReceivePack(command) + case _ => new UnknownCommand(command) + } + } +} \ No newline at end of file diff --git a/src/test/scala/ssh/GitCommandSpec.scala b/src/test/scala/ssh/GitCommandSpec.scala new file mode 100644 index 0000000..877cffc --- /dev/null +++ b/src/test/scala/ssh/GitCommandSpec.scala @@ -0,0 +1,39 @@ +package ssh + +import org.specs2.mutable._ +import org.apache.sshd.server.command.UnknownCommand + + +class GitCommandFactorySpec extends Specification { + + val factory = new GitCommandFactory + + "createCommand" should { + "returns GitRecievePack when command is git-receive-pack" in { + factory.createCommand("git-receive-pack '/owner/repo.git'").isInstanceOf[GitReceivePack] must beTrue + factory.createCommand("git-receive-pack '/owner/repo.wiki.git'").isInstanceOf[GitReceivePack] must beTrue + + } + "returns GitUploadPack when command is git-upload-pack" in { + factory.createCommand("git-upload-pack '/owner/repo.git'").isInstanceOf[GitUploadPack] must beTrue + factory.createCommand("git-upload-pack '/owner/repo.wiki.git'").isInstanceOf[GitUploadPack] must beTrue + + } + "returns UnknownCommand when command is not git-(upload|receive)-pack" in { + factory.createCommand("git- '/owner/repo.git'").isInstanceOf[UnknownCommand] must beTrue + factory.createCommand("git-pack '/owner/repo.git'").isInstanceOf[UnknownCommand] must beTrue + factory.createCommand("git-a-pack '/owner/repo.git'").isInstanceOf[UnknownCommand] must beTrue + factory.createCommand("git-up-pack '/owner/repo.git'").isInstanceOf[UnknownCommand] must beTrue + factory.createCommand("\ngit-upload-pack '/owner/repo.git'").isInstanceOf[UnknownCommand] must beTrue + } + "returns UnknownCommand when git command has no valid arguments" in { + // must be: git-upload-pack '/owner/repository_name.git' + factory.createCommand("git-upload-pack").isInstanceOf[UnknownCommand] must beTrue + factory.createCommand("git-upload-pack /owner/repo.git").isInstanceOf[UnknownCommand] must beTrue + factory.createCommand("git-upload-pack 'owner/repo.git'").isInstanceOf[UnknownCommand] must beTrue + factory.createCommand("git-upload-pack '/ownerrepo.git'").isInstanceOf[UnknownCommand] must beTrue + factory.createCommand("git-upload-pack '/owner/repo.wiki'").isInstanceOf[UnknownCommand] must beTrue + } + } + +}