Skip to content

Commit 7bd2350

Browse files
committed
More grouping
1 parent 88f9e06 commit 7bd2350

3 files changed

Lines changed: 37 additions & 10 deletions

File tree

modules/core/src/main/scala/org/scalasteward/core/data/Update.scala

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import org.scalasteward.core.repoconfig.PullRequestGroup
2323
import org.scalasteward.core.util
2424
import org.scalasteward.core.util.Nel
2525
import org.scalasteward.core.coursier.VersionsCache.VersionWithFirstSeen
26+
import org.scalasteward.core.nurture.ApplicableUpdateSet
2627

2728
case class ArtifactForUpdate(
2829
crossDependency: CrossDependency,
@@ -243,12 +244,20 @@ object Update {
243244
groups1.toList.distinct.sortBy(u => u: Update.Single)
244245
}
245246

246-
def groupByGroupId(updates: List[ForArtifactId]): List[Single] = {
247+
/**
248+
* If a set of ApplicableUpdateSet all have the same GroupId, then they could be a Update.ForGroupId()
249+
*
250+
* If there is only one artifact within a ApplicableUpdateSet for a given group id, just create a
251+
* Update.ForArtifactId
252+
*
253+
* Otherwise, create a Grouped()?
254+
*/
255+
def groupByGroupId(updates: List[ApplicableUpdateSet]): List[Single] = {
247256
val groups0 =
248-
updates.groupByNel(s => (s.groupId, s.versionUpdate))
249-
val groups1 = groups0.map { case ((_, versionUpdate), group) =>
257+
updates.groupByNel(s => (s.commonGroupId, s.commonVersionUpdate))
258+
val groups1 = groups0.map { case ((Some(_), Some(versionUpdate)), group) =>
250259
if (group.tail.isEmpty) group.head
251-
else ForGroupId(group.map(_.artifactForUpdate), versionUpdate.nextVersion)
260+
else ForGroupId(group.flatMap(_.artifactUpdates), versionUpdate.nextVersion)
252261
}
253262
groups1.toList.distinct.sorted
254263
}
@@ -260,12 +269,12 @@ object Update {
260269
*/
261270
def groupByPullRequestGroup(
262271
groups: List[PullRequestGroup],
263-
updates: List[Update.ForArtifactId]
264-
): (List[Grouped], List[Update.ForArtifactId]) =
272+
updates: List[ApplicableUpdateSet]
273+
): (List[Grouped], List[ApplicableUpdateSet]) =
265274
groups.foldLeft((List.empty[Grouped], updates)) { case ((grouped, notGrouped), group) =>
266275
notGrouped.partition(group.matches) match {
267276
case (Nil, rest) => (grouped, rest)
268-
case (matched, rest) => (grouped :+ Grouped(group.name, group.title, matched), rest)
277+
case (matched, rest) => (grouped :+ Grouped(group.name, group.title, matched.flatMap(_.artifactUpdates)), rest)
269278
}
270279
}
271280

modules/core/src/main/scala/org/scalasteward/core/nurture/NurtureAlg.scala

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import org.scalasteward.core.application.Config.ForgeCfg
2323
import org.scalasteward.core.coursier.CoursierAlg
2424
import org.scalasteward.core.data.*
2525
import org.scalasteward.core.data.ProcessResult.{Created, Ignored, Updated}
26+
import org.scalasteward.core.edit.update.data.Substring
2627
import org.scalasteward.core.edit.{EditAlg, EditAttempt}
2728
import org.scalasteward.core.forge.ForgeType.GitHub
2829
import org.scalasteward.core.forge.data.*
@@ -35,6 +36,18 @@ import org.scalasteward.core.util.{Nel, UrlChecker}
3536
import org.scalasteward.core.{git, util}
3637
import org.typelevel.log4cats.Logger
3738

39+
case class ApplicableUpdateSet(edits: List[Substring.Replacement], artifactUpdates: List[Update.ForArtifactId]) {
40+
val commonGroupId: Option[GroupId] = {
41+
val updatesByGroupId = artifactUpdates.groupBy(_.groupId)
42+
Option.when(updatesByGroupId.size == 1)(updatesByGroupId.keys.head)
43+
}
44+
45+
val commonVersionUpdate: Option[Version.Update] = {
46+
val updatesByVersionUpdate = artifactUpdates.groupBy(_.versionUpdate)
47+
Option.when(updatesByVersionUpdate.size == 1)(updatesByVersionUpdate.keys.head)
48+
}
49+
}
50+
3851
final class NurtureAlg[F[_]](config: ForgeCfg)(implicit
3952
coursierAlg: CoursierAlg[F],
4053
editAlg: EditAlg[F],
@@ -53,13 +66,15 @@ final class NurtureAlg[F[_]](config: ForgeCfg)(implicit
5366
for {
5467
_ <- logger.info(s"Nurture ${data.repo.show}")
5568
baseBranch <- cloneAndSync(data.repo, fork)
56-
updatesGroupedByReplacements <- updates.traverse(update => editAlg.findUpdateReplacements(fork.repo, data.config, update).map(update -> _)).map {
57-
_.toList.groupMap(_._2)(_._1)
69+
applicableUpdateSets <- updates.traverse(update => editAlg.findUpdateReplacements(fork.repo, data.config, update).map(update -> _)).map {
70+
x => x.toList.groupMap(_._2)(_._1).map {
71+
case (r, a) => ApplicableUpdateSet(r, a)
72+
}
5873
}
5974

6075
(grouped, notGrouped) = Update.groupByPullRequestGroup(
6176
data.config.pullRequestsOrDefault.groupingOrDefault,
62-
updates.toList
77+
applicableUpdateSets.toList
6378
)
6479
finalUpdates = Update.groupByGroupId(notGrouped) ++ grouped
6580
_ <- updateDependencies(data, fork.repo, baseBranch, finalUpdates)

modules/core/src/main/scala/org/scalasteward/core/repoconfig/PullRequestGroup.scala

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import cats.data.NonEmptyList
2121
import io.circe.generic.semiauto.*
2222
import io.circe.{Decoder, Encoder}
2323
import org.scalasteward.core.data.Update
24+
import org.scalasteward.core.nurture.ApplicableUpdateSet
2425

2526
case class PullRequestGroup(
2627
name: String,
@@ -32,6 +33,8 @@ case class PullRequestGroup(
3233
*/
3334
def matches(update: Update.ForArtifactId): Boolean = filter.exists(_.matches(update))
3435

36+
def matches(updates: ApplicableUpdateSet): Boolean =
37+
filter.exists(f => updates.artifactUpdates.exists(update => f.matches(update)))
3538
}
3639

3740
object PullRequestGroup {

0 commit comments

Comments
 (0)