add diffs to RSS feed

Sun, 10 Oct 2021 14:46:10 +0200

author
Mike Becker <universe@uap-core.de>
date
Sun, 10 Oct 2021 14:46:10 +0200
changeset 236
819c5178b6fe
parent 235
4258b9e010ae
child 237
84e42725bf8e

add diffs to RSS feed

build.gradle.kts file | annotate | diff | comparison | revisions
src/main/kotlin/de/uapcore/lightpit/servlet/FeedServlet.kt file | annotate | diff | comparison | revisions
     1.1 --- a/build.gradle.kts	Sat Oct 09 20:05:39 2021 +0200
     1.2 +++ b/build.gradle.kts	Sun Oct 10 14:46:10 2021 +0200
     1.3 @@ -43,6 +43,7 @@
     1.4                  implementation("com.vladsch.flexmark:flexmark-util-data:${flexmarkVersion}")
     1.5                  implementation("com.vladsch.flexmark:flexmark-ext-tables:${flexmarkVersion}")
     1.6                  implementation("com.vladsch.flexmark:flexmark-ext-gfm-strikethrough:${flexmarkVersion}")
     1.7 +                implementation("io.github.java-diff-utils:java-diff-utils:4.5")
     1.8              }
     1.9          }
    1.10      }
     2.1 --- a/src/main/kotlin/de/uapcore/lightpit/servlet/FeedServlet.kt	Sat Oct 09 20:05:39 2021 +0200
     2.2 +++ b/src/main/kotlin/de/uapcore/lightpit/servlet/FeedServlet.kt	Sun Oct 10 14:46:10 2021 +0200
     2.3 @@ -25,6 +25,8 @@
     2.4  
     2.5  package de.uapcore.lightpit.servlet
     2.6  
     2.7 +import com.github.difflib.text.DiffRow
     2.8 +import com.github.difflib.text.DiffRowGenerator
     2.9  import de.uapcore.lightpit.AbstractServlet
    2.10  import de.uapcore.lightpit.HttpRequest
    2.11  import de.uapcore.lightpit.dao.DataAccessObject
    2.12 @@ -36,6 +38,7 @@
    2.13  import java.text.SimpleDateFormat
    2.14  import javax.servlet.annotation.WebServlet
    2.15  
    2.16 +
    2.17  @WebServlet(urlPatterns = ["/feed/*"])
    2.18  class FeedServlet : AbstractServlet() {
    2.19  
    2.20 @@ -43,8 +46,6 @@
    2.21          get("/%project/issues.rss", this::issues)
    2.22      }
    2.23  
    2.24 -    private fun String.convertLF() = replace("\r", "").replace("\n", "<br>")
    2.25 -
    2.26      private fun fullContent(issue: IssueHistoryData) = IssueDiff(
    2.27          issue.id,
    2.28          issue.subject,
    2.29 @@ -52,7 +53,7 @@
    2.30          issue.status.name,
    2.31          issue.category.name,
    2.32          issue.subject,
    2.33 -        issue.description.convertLF(),
    2.34 +        issue.description.replace("\r", ""),
    2.35          issue.assignee,
    2.36          issue.eta?.let { SimpleDateFormat("dd.MM.yyyy").format(it) } ?: "",
    2.37          issue.affected,
    2.38 @@ -60,9 +61,38 @@
    2.39      )
    2.40  
    2.41      private fun diffContent(cur: IssueHistoryData, next: IssueHistoryData): IssueDiff {
    2.42 +        val generator = DiffRowGenerator.create()
    2.43 +            .showInlineDiffs(true)
    2.44 +            .mergeOriginalRevised(true)
    2.45 +            .inlineDiffByWord(true)
    2.46 +            .oldTag { start -> if (start) "<strike style=\"color:red\">" else "</strike>" }
    2.47 +            .newTag { start -> if (start) "<i style=\"color: green\">" else "</i>" }
    2.48 +            .build()
    2.49 +
    2.50          val prev = fullContent(next)
    2.51          val diff = fullContent(cur)
    2.52 -        // TODO: compute and apply diff
    2.53 +
    2.54 +        val result = generator.generateDiffRows(
    2.55 +            listOf(prev.subject, prev.component, prev.status,
    2.56 +                prev.category, prev.assignee, prev.eta, prev.affected, prev.resolved),
    2.57 +            listOf(diff.subject, diff.component, diff.status,
    2.58 +                diff.category, diff.assignee, diff.eta, diff.affected, diff.resolved)
    2.59 +        )
    2.60 +
    2.61 +        diff.subject = result[0].oldLine
    2.62 +        diff.component = result[1].oldLine
    2.63 +        diff.status = result[2].oldLine
    2.64 +        diff.category = result[3].oldLine
    2.65 +        diff.assignee = result[4].oldLine
    2.66 +        diff.eta = result[5].oldLine
    2.67 +        diff.affected = result[6].oldLine
    2.68 +        diff.resolved = result[7].oldLine
    2.69 +
    2.70 +        diff.description = generator.generateDiffRows(
    2.71 +            prev.description.split('\n'),
    2.72 +            diff.description.split('\n')
    2.73 +        ).joinToString("<br>", transform = DiffRow::getOldLine)
    2.74 +
    2.75          return diff
    2.76      }
    2.77  

mercurial