#1763 fix by removing one but all artificial callers

This commit is contained in:
Eugene Yokota 2015-07-10 00:10:23 -04:00
parent 98d81a62f9
commit 22c743cf8a
2 changed files with 16 additions and 56 deletions

View File

@ -8,7 +8,8 @@ import sbt.serialization._
import java.net.{ URLEncoder, URLDecoder } import java.net.{ URLEncoder, URLDecoder }
private[sbt] object JsonUtil { private[sbt] object JsonUtil {
val fakeCallerOrganization = "org.scala-sbt.temp-callers" def sbtOrgTemp = "org.scala-sbt.temp"
def fakeCallerOrganization = "org.scala-sbt.temp-callers"
def parseUpdateReport(md: ModuleDescriptor, path: File, cachedDescriptor: File, log: Logger): UpdateReport = def parseUpdateReport(md: ModuleDescriptor, path: File, cachedDescriptor: File, log: Logger): UpdateReport =
{ {
@ -36,55 +37,23 @@ private[sbt] object JsonUtil {
mr.evicted, mr.evictedData, mr.evictedReason, mr.evicted, mr.evictedData, mr.evictedReason,
mr.problem, mr.homepage, mr.extraAttributes, mr.problem, mr.homepage, mr.extraAttributes,
mr.isDefault, mr.branch, mr.configurations, mr.licenses, mr.isDefault, mr.branch, mr.configurations, mr.licenses,
summarizeCallers(mr.callers)) filterOutArtificialCallers(mr.callers))
}) })
}) })
}) })
// #1763/#2030. Caller takes up 97% of space, so we need to shrink it down, // #1763/#2030. Caller takes up 97% of space, so we need to shrink it down,
// but there are semantics associated with some of them. // but there are semantics associated with some of them.
def summarizeCallers(callers: Seq[Caller]): Seq[Caller] = def filterOutArtificialCallers(callers: Seq[Caller]): Seq[Caller] =
if (callers.isEmpty) callers if (callers.isEmpty) callers
else { else {
// Use the first element to represent all callers val nonArtificial = callers filter { c =>
val head = callers.head (c.caller.organization != sbtOrgTemp) &&
val name = (c.caller.organization != fakeCallerOrganization)
URLEncoder.encode(
(for {
caller <- callers
m = caller.caller
} yield s"${m.organization}:${m.name}:${m.revision}").mkString(";"), "UTF-8")
val version = head.caller.revision
val fakeCaller = ModuleID(fakeCallerOrganization, name, version)
val caller = new Caller(
fakeCaller, head.callerConfigurations, head.callerExtraAttributes,
callers exists { _.isForceDependency },
callers exists { _.isChangingDependency },
callers exists { _.isTransitiveDependency },
callers exists { _.isDirectlyForceDependency })
Seq(caller)
}
def unsummarizeCallers(callers: Seq[Caller]): Seq[Caller] =
if (callers.isEmpty) callers
else {
val head = callers.head
val m = head.caller
if (m.organization != fakeCallerOrganization) callers
else {
// likely the caller is generated using the above summarizeCallers
val s = URLDecoder.decode(m.name, "UTF-8")
s.split(";").toList map { x =>
x.split(":").toList match {
case List(organization, name, revision) =>
val caller = ModuleID(organization, name, revision)
new Caller(
caller, head.callerConfigurations, head.callerExtraAttributes,
head.isForceDependency, head.isChangingDependency,
head.isTransitiveDependency, head.isDirectlyForceDependency
)
case xs => sys.error(s"Unexpected caller $xs")
}
}
} }
val interProj = (callers filter { c =>
(c.caller.organization == sbtOrgTemp)
}).headOption.toList
interProj ::: nonArtificial.toList
} }
def fromLite(lite: UpdateReportLite, cachedDescriptor: File): UpdateReport = def fromLite(lite: UpdateReportLite, cachedDescriptor: File): UpdateReport =

View File

@ -26,7 +26,7 @@ import scala.concurrent.duration._
private[sbt] object CachedResolutionResolveCache { private[sbt] object CachedResolutionResolveCache {
def createID(organization: String, name: String, revision: String) = def createID(organization: String, name: String, revision: String) =
ModuleRevisionId.newInstance(organization, name, revision) ModuleRevisionId.newInstance(organization, name, revision)
def sbtOrgTemp = "org.scala-sbt.temp" def sbtOrgTemp = JsonUtil.sbtOrgTemp
def graphVersion = "0.13.9B" def graphVersion = "0.13.9B"
val buildStartup: Long = System.currentTimeMillis val buildStartup: Long = System.currentTimeMillis
lazy val todayStr: String = toYyyymmdd(buildStartup) lazy val todayStr: String = toYyyymmdd(buildStartup)
@ -398,7 +398,7 @@ private[sbt] trait CachedResolutionResolveEngine extends ResolveEngine {
// group by takes up too much memory. trading space with time. // group by takes up too much memory. trading space with time.
val orgNamePairs = (reports0 map { oar => (oar.organization, oar.name) }).distinct val orgNamePairs = (reports0 map { oar => (oar.organization, oar.name) }).distinct
// this might take up some memory, but it's limited to a single // this might take up some memory, but it's limited to a single
val reports1 = reports0 map { recoverCallers } val reports1 = reports0 map { filterOutCallers }
val allModules: ListMap[(String, String), Vector[OrganizationArtifactReport]] = val allModules: ListMap[(String, String), Vector[OrganizationArtifactReport]] =
ListMap(orgNamePairs map { ListMap(orgNamePairs map {
case (organization, name) => case (organization, name) =>
@ -447,26 +447,17 @@ private[sbt] trait CachedResolutionResolveEngine extends ResolveEngine {
}) })
} }
val sorted = sortModules(allModules, 0) val sorted = sortModules(allModules, 0)
val result = resolveConflicts(sorted.toList) map { summarizeCallers } val result = resolveConflicts(sorted.toList)
result.toVector result.toVector
} }
def recoverCallers(report0: OrganizationArtifactReport): OrganizationArtifactReport = def filterOutCallers(report0: OrganizationArtifactReport): OrganizationArtifactReport =
OrganizationArtifactReport( OrganizationArtifactReport(
report0.organization, report0.organization,
report0.name, report0.name,
report0.modules map { mr => report0.modules map { mr =>
val original = JsonUtil.unsummarizeCallers(mr.callers)
// https://github.com/sbt/sbt/issues/1763 // https://github.com/sbt/sbt/issues/1763
mr.copy(callers = original filter { c => mr.copy(callers = JsonUtil.filterOutArtificialCallers(mr.callers))
(c.caller.organization != sbtOrgTemp) &&
(c.caller.organization != JsonUtil.fakeCallerOrganization)
})
}) })
def summarizeCallers(report0: OrganizationArtifactReport): OrganizationArtifactReport =
OrganizationArtifactReport(
report0.organization,
report0.name,
report0.modules map { mr => mr.copy(callers = JsonUtil.summarizeCallers(mr.callers)) })
/** /**
* Merges ModuleReports, which represents orgnization, name, and version. * Merges ModuleReports, which represents orgnization, name, and version.
* Returns a touple of (surviving modules ++ non-conflicting modules, newly evicted modules). * Returns a touple of (surviving modules ++ non-conflicting modules, newly evicted modules).