From 2d1c80f916a999e7c401f41da164d788f5fa2018 Mon Sep 17 00:00:00 2001 From: Ethan Atkins Date: Wed, 17 Apr 2019 18:00:24 -0700 Subject: [PATCH] Remove duped system in I had some ideas for allowing the user to get a copy of system in during a continuous build but I can't really see a good use case now so I'm going to remove it before 1.3.0. --- .../main/scala/sbt/internal/Continuous.scala | 23 ------ .../scala/sbt/internal/DupedInputStream.scala | 73 ------------------- 2 files changed, 96 deletions(-) delete mode 100644 main/src/main/scala/sbt/internal/DupedInputStream.scala diff --git a/main/src/main/scala/sbt/internal/Continuous.scala b/main/src/main/scala/sbt/internal/Continuous.scala index b4b863ccf..0d6855d7b 100644 --- a/main/src/main/scala/sbt/internal/Continuous.scala +++ b/main/src/main/scala/sbt/internal/Continuous.scala @@ -79,21 +79,6 @@ private[sbt] object Continuous extends DeprecatedContinuous { val inputs: Seq[DynamicInput] ) - /** - * Provides a copy of System.in that can be scanned independently from System.in itself. This task - * will only be valid during a continuous build started via `~` or the `watch` task. The - * motivation is that a plugin may want to completely override the parsing of System.in which - * is not straightforward since the default implementation is hard-wired to read from and - * parse System.in. If an invalid parser is provided by [[Keys.watchInputParser]] and - * [[Keys.watchInputStream]] is set to this task, then a custom parser can be provided via - * [[Keys.watchInputHandler]] and the default System.in processing will not occur. - * - * @return the duplicated System.in - */ - def dupedSystemIn: Def.Initialize[Task[InputStream]] = Def.task { - Keys.state.value.get(DupedSystemIn).map(_.duped).getOrElse(System.in) - } - /** * Create a function from InputStream => [[Watch.Action]] from a [[Parser]]. This is intended * to be used to set the watchInputHandler setting for a task. @@ -136,12 +121,6 @@ private[sbt] object Continuous extends DeprecatedContinuous { ) } - private[this] val DupedSystemIn = - AttributeKey[DupedInputStream]( - "duped-system-in", - "Receives a copy of all of the bytes from System.in.", - 10000 - ) private[sbt] val dynamicInputs = taskKey[Option[mutable.Set[DynamicInput]]]( "The input globs found during task evaluation that are used in watch." ) @@ -298,7 +277,6 @@ private[sbt] object Continuous extends DeprecatedContinuous { count: Int, isCommand: Boolean ): State = withCharBufferedStdIn { in => - val duped = new DupedInputStream(in) implicit val extracted: Extracted = Project.extract(state) val repo = if ("polling" == System.getProperty("sbt.watch.mode")) { val service = @@ -311,7 +289,6 @@ private[sbt] object Continuous extends DeprecatedContinuous { val stateWithRepo = state .put(Keys.globalFileTreeRepository, repo) .put(sbt.nio.Keys.persistentFileAttributeMap, new sbt.nio.Keys.FileAttributeMap) - .put(DupedSystemIn, duped) setup(stateWithRepo, command) { (commands, s, valid, invalid) => EvaluateTask.withStreams(extracted.structure, s)(_.use(Keys.streams in Global) { streams => implicit val logger: Logger = streams.log diff --git a/main/src/main/scala/sbt/internal/DupedInputStream.scala b/main/src/main/scala/sbt/internal/DupedInputStream.scala deleted file mode 100644 index 6334d5cbd..000000000 --- a/main/src/main/scala/sbt/internal/DupedInputStream.scala +++ /dev/null @@ -1,73 +0,0 @@ -/* - * sbt - * Copyright 2011 - 2018, Lightbend, Inc. - * Copyright 2008 - 2010, Mark Harrah - * Licensed under Apache License 2.0 (see LICENSE) - */ - -package sbt.internal - -import java.io.{ InputStream, PipedInputStream, PipedOutputStream } -import java.util.concurrent.LinkedBlockingQueue - -import scala.annotation.tailrec -import scala.collection.JavaConverters._ - -/** - * Creates a copy of the provided [[InputStream]] that forwards its contents to an arbitrary - * number of connected [[InputStream]] instances via pipe. - * @param in the [[InputStream]] to wrap. - */ -private[internal] class DupedInputStream(val in: InputStream) - extends InputStream - with AutoCloseable { - - /** - * Returns a copied [[InputStream]] that will receive the same bytes as System.in. - * @return - */ - def duped: InputStream = { - val pipedOutputStream = new PipedOutputStream() - pipes += pipedOutputStream - val res = new PollingInputStream(new PipedInputStream(pipedOutputStream)) - buffer.forEach(pipedOutputStream.write(_)) - res - } - - private[this] val pipes = new java.util.Vector[PipedOutputStream].asScala - private[this] val buffer = new LinkedBlockingQueue[Int] - private class PollingInputStream(val pipedInputStream: PipedInputStream) extends InputStream { - override def available(): Int = { - fillBuffer() - pipedInputStream.available() - } - override def read(): Int = { - fillBuffer() - pipedInputStream.read - } - } - override def available(): Int = { - fillBuffer() - buffer.size - } - override def read(): Int = { - fillBuffer() - buffer.take() - } - - private[this] def fillBuffer(): Unit = synchronized { - @tailrec - def impl(): Unit = in.available match { - case i if i > 0 => - val res = in.read() - buffer.add(res) - pipes.foreach { p => - p.write(res) - p.flush() - } - impl() - case _ => - } - impl() - } -}