From 4becd53e240651fd114a07171c5c7e2fe053ffa2 Mon Sep 17 00:00:00 2001 From: "vladimir.popov" Date: Wed, 10 Apr 2019 14:48:07 +0300 Subject: [PATCH 1/3] add configuration for the README file and regex pattern --- src/main/scala/ReleaseExtra.scala | 61 ++++++++++--------- src/main/scala/ReleasePlugin.scala | 12 ++++ .../sbt-release/update-readme/build.sbt | 15 ++--- 3 files changed, 48 insertions(+), 40 deletions(-) diff --git a/src/main/scala/ReleaseExtra.scala b/src/main/scala/ReleaseExtra.scala index da05ea3b..5ad31ccd 100644 --- a/src/main/scala/ReleaseExtra.scala +++ b/src/main/scala/ReleaseExtra.scala @@ -214,41 +214,44 @@ object ReleaseStateTransformations { lazy val updateReadme: ReleaseStep = ReleaseStep(updateReadmeStep) private def updateReadmeStep(state: State): State = { val extracted = Project.extract(state) - val releaseVersion = extracted.get(version) - val base = extracted.get(baseDirectory) - val readmeFile = base / "README.md" - - val versionRegex = """(\d{1,2}\.\d{1,2}\.\d{1,2})""".r - val updatedReadmeContent = versionRegex.replaceAllIn( - IO.read(readmeFile), - releaseVersion - ) - - IO.write(readmeFile, updatedReadmeContent) + extracted.get(releaseReadmeFile) match { + case Some(readmeFile) ⇒ + val releaseVersion = extracted.get(version) + val versionRegex = extracted.get(releaseReadmeVersionRegex) + val updatedReadmeContent = versionRegex.replaceAllIn( + IO.read(readmeFile), + releaseVersion + ) + IO.write(readmeFile, updatedReadmeContent) + case None ⇒ + } state } lazy val commitReadme: ReleaseStep = ReleaseStep(commitReadmeStep) private def commitReadmeStep(state: State): State = { - val log = toProcessLogger(state) - val base = vcs(state).baseDir - val sign = Project.extract(state).get(releaseVcsSign) - val readmeFile = base / "README.md" - - val relativePath = IO - .relativize(base, readmeFile) - .getOrElse( - "Version file [%s] is outside of this VCS repository with base directory [%s]!" format (readmeFile, base) - ) - - vcs(state).add(relativePath) !! log - val vcsAddOutput = (vcs(state).status !!).trim - if (vcsAddOutput.isEmpty) { - state.log.info("README.md hasn't been changed.") - } else { - vcs(state).commit("Update release version in readme", sign) ! log + val extracted = Project.extract(state) + extracted.get(releaseReadmeFile) match { + case Some(readmeFile) ⇒ + val log = toProcessLogger(state) + val base = vcs(state).baseDir + val sign = extracted.get(releaseVcsSign) + + val relativePath = IO + .relativize(base, readmeFile) + .getOrElse( + "Version file [%s] is outside of this VCS repository with base directory [%s]!" format(readmeFile, base) + ) + + vcs(state).add(relativePath) !! log + val vcsAddOutput = (vcs(state).status !!).trim + if (vcsAddOutput.isEmpty) { + state.log.info("README.md hasn't been changed.") + } else { + vcs(state).commit("Update release version in readme", sign) ! log + } + case None ⇒ } - state } diff --git a/src/main/scala/ReleasePlugin.scala b/src/main/scala/ReleasePlugin.scala index 19f675de..e80574d8 100644 --- a/src/main/scala/ReleasePlugin.scala +++ b/src/main/scala/ReleasePlugin.scala @@ -1,12 +1,15 @@ package sbtrelease import java.io.Serializable +import java.nio.file.Path import sbt._ import Keys._ import sbt.complete.DefaultParsers._ import sbt.complete.Parser +import scala.util.matching.Regex + object ReleasePlugin extends AutoPlugin { object autoImport { @@ -27,6 +30,9 @@ object ReleasePlugin extends AutoPlugin { val releaseVcs = settingKey[Option[Vcs]]("The VCS to use") val releasePublishArtifactsAction = taskKey[Unit]("The action that should be performed to publish artifacts") + val releaseReadmeFile = settingKey[Option[File]]("The path to the README file") + val releaseReadmeVersionRegex = settingKey[Regex]("Regex pattern to find version in the README file") + lazy val ReleaseTransformations = sbtrelease.ReleaseStateTransformations case class ReleaseStep(action: State => State, check: State => State = identity, enableCrossBuild: Boolean = false) @@ -236,6 +242,10 @@ object ReleasePlugin extends AutoPlugin { releaseIgnoreUntrackedFiles := false, + releaseReadmeFile := None, + + releaseReadmeVersionRegex := """(\d{1,2}\.\d{1,2}\.\d{1,2})""".r, + releaseProcess := Seq[ReleaseStep]( checkSnapshotDependencies, inquireVersions, @@ -243,6 +253,8 @@ object ReleasePlugin extends AutoPlugin { runTest, setReleaseVersion, commitReleaseVersion, + updateReadme, + commitReadme, tagRelease, publishArtifacts, setNextVersion, diff --git a/src/sbt-test/sbt-release/update-readme/build.sbt b/src/sbt-test/sbt-release/update-readme/build.sbt index b13572dc..a5272cdc 100644 --- a/src/sbt-test/sbt-release/update-readme/build.sbt +++ b/src/sbt-test/sbt-release/update-readme/build.sbt @@ -1,22 +1,15 @@ import sbtrelease.ReleaseStateTransformations._ +releaseReadmeFile := Some(baseDirectory.value / "README.md") + releaseProcess := Seq( - checkSnapshotDependencies, - inquireVersions, - runClean, - runTest, - setReleaseVersion, - commitReleaseVersion, - tagRelease, updateReadme, - commitReadme, - setNextVersion, - commitNextVersion + commitReadme ) TaskKey[Unit]("checkReadme") := { - val readmeFile = baseDirectory.value / "README.md" + val readmeFile = releaseReadmeFile.value.get val content = IO.read(readmeFile) assert(content == From bbe7dc3031c06eb9a939b7a5868feadd695cf39c Mon Sep 17 00:00:00 2001 From: "vladimir.popov" Date: Wed, 10 Apr 2019 16:51:37 +0300 Subject: [PATCH 2/3] revert release process for tests --- .../sbt-release/update-readme/build.sbt | 23 ++++++++++++++----- 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/src/sbt-test/sbt-release/update-readme/build.sbt b/src/sbt-test/sbt-release/update-readme/build.sbt index a5272cdc..3d9af267 100644 --- a/src/sbt-test/sbt-release/update-readme/build.sbt +++ b/src/sbt-test/sbt-release/update-readme/build.sbt @@ -1,25 +1,36 @@ import sbtrelease.ReleaseStateTransformations._ - releaseReadmeFile := Some(baseDirectory.value / "README.md") releaseProcess := Seq( + checkSnapshotDependencies, + inquireVersions, + runClean, + runTest, + setReleaseVersion, + commitReleaseVersion, updateReadme, - commitReadme + commitReadme, + tagRelease, + setNextVersion, + commitNextVersion ) TaskKey[Unit]("checkReadme") := { val readmeFile = releaseReadmeFile.value.get val content = IO.read(readmeFile) - assert(content == - """|# A project + assert( + content == + """|# A project | |Add library in your `build.sbt` | |```scala |libraryDependencies += "com.example" %% "lib" % "2.3.4" |``` - |""".stripMargin, s"Readme wasn't updated correctly\n\n$content") + |""".stripMargin, + s"Readme wasn't updated correctly\n\n$content" + ) -} \ No newline at end of file +} From 2adcb427d733982fd354272cce2278d656908360 Mon Sep 17 00:00:00 2001 From: Vladimir Popov Date: Tue, 7 May 2019 13:23:13 +0300 Subject: [PATCH 3/3] improve updateReadme step and add more tests --- build.sbt | 2 + src/main/scala/ReleaseExtra.scala | 29 ++++++++++--- src/main/scala/ReleasePlugin.scala | 2 +- .../update-readme-with-regex/.gitignore | 1 + .../update-readme-with-regex/README.md | 5 +++ .../update-readme-with-regex/build.sbt | 36 ++++++++++++++++ .../project/build.sbt | 7 ++++ .../sbt-release/update-readme-with-regex/test | 9 ++++ .../update-readme-with-regex/version.sbt | 1 + .../sbt-release/update-readme/.gitignore | 3 +- .../sbt-release/update-readme/README.md | 8 ++-- .../sbt-release/update-readme/build.sbt | 41 ++++++++++--------- src/sbt-test/sbt-release/update-readme/test | 5 +-- .../sbt-release/update-readme/version.sbt | 2 +- 14 files changed, 114 insertions(+), 37 deletions(-) create mode 100644 src/sbt-test/sbt-release/update-readme-with-regex/.gitignore create mode 100644 src/sbt-test/sbt-release/update-readme-with-regex/README.md create mode 100644 src/sbt-test/sbt-release/update-readme-with-regex/build.sbt create mode 100644 src/sbt-test/sbt-release/update-readme-with-regex/project/build.sbt create mode 100644 src/sbt-test/sbt-release/update-readme-with-regex/test create mode 100644 src/sbt-test/sbt-release/update-readme-with-regex/version.sbt diff --git a/build.sbt b/build.sbt index 2dbc14ef..a8df8c66 100644 --- a/build.sbt +++ b/build.sbt @@ -66,6 +66,8 @@ releaseProcess := Seq[ReleaseStep]( releaseStepCommandAndRemaining("^ scripted"), setReleaseVersion, commitReleaseVersion, + updateReadme, + commitReadme, tagRelease, releaseStepCommandAndRemaining("^ publishSigned"), releaseStepTask(bintrayRelease in `sbt-release`), diff --git a/src/main/scala/ReleaseExtra.scala b/src/main/scala/ReleaseExtra.scala index 5ad31ccd..59d5768b 100644 --- a/src/main/scala/ReleaseExtra.scala +++ b/src/main/scala/ReleaseExtra.scala @@ -1,12 +1,20 @@ package sbtrelease +import java.nio.charset.StandardCharsets +import java.nio.file.Files + import sbt._ import sbt.Keys._ import sbt.Package.ManifestAttributes + import annotation.tailrec import ReleasePlugin.autoImport._ import ReleaseKeys._ +import sbtrelease.ReleasePlugin.autoImport +import scala.io.Source +import scala.util.matching.Regex +import scala.util.matching.Regex.{ Groups, Match } import sys.process.ProcessLogger object ReleaseStateTransformations { @@ -213,16 +221,25 @@ object ReleaseStateTransformations { lazy val updateReadme: ReleaseStep = ReleaseStep(updateReadmeStep) private def updateReadmeStep(state: State): State = { + def replacer(newVersion: String)(m: Regex.Match): String = m match { + case Groups(oldVersion) ⇒ + m.toString().replace(oldVersion, newVersion) + case Match(_) ⇒ + newVersion + case _ ⇒ + m.toString() + } val extracted = Project.extract(state) - extracted.get(releaseReadmeFile) match { + extracted.get(autoImport.releaseReadmeFile) match { case Some(readmeFile) ⇒ val releaseVersion = extracted.get(version) - val versionRegex = extracted.get(releaseReadmeVersionRegex) - val updatedReadmeContent = versionRegex.replaceAllIn( - IO.read(readmeFile), - releaseVersion + val versionRegex = extracted.get(autoImport.releaseReadmeVersionRegex) + val readme = Source.fromFile(readmeFile).mkString + Files.write( + readmeFile.toPath, + versionRegex.replaceAllIn(readme, replacer(releaseVersion)(_)).getBytes(StandardCharsets.UTF_8) ) - IO.write(readmeFile, updatedReadmeContent) + vcs(state).add() case None ⇒ } state diff --git a/src/main/scala/ReleasePlugin.scala b/src/main/scala/ReleasePlugin.scala index e80574d8..8322d865 100644 --- a/src/main/scala/ReleasePlugin.scala +++ b/src/main/scala/ReleasePlugin.scala @@ -244,7 +244,7 @@ object ReleasePlugin extends AutoPlugin { releaseReadmeFile := None, - releaseReadmeVersionRegex := """(\d{1,2}\.\d{1,2}\.\d{1,2})""".r, + releaseReadmeVersionRegex := """\%\s+\"(\d{1,2}\.\d{1,2}\.\d{1,2})\"""".r, releaseProcess := Seq[ReleaseStep]( checkSnapshotDependencies, diff --git a/src/sbt-test/sbt-release/update-readme-with-regex/.gitignore b/src/sbt-test/sbt-release/update-readme-with-regex/.gitignore new file mode 100644 index 00000000..9f970225 --- /dev/null +++ b/src/sbt-test/sbt-release/update-readme-with-regex/.gitignore @@ -0,0 +1 @@ +target/ \ No newline at end of file diff --git a/src/sbt-test/sbt-release/update-readme-with-regex/README.md b/src/sbt-test/sbt-release/update-readme-with-regex/README.md new file mode 100644 index 00000000..85a6ad34 --- /dev/null +++ b/src/sbt-test/sbt-release/update-readme-with-regex/README.md @@ -0,0 +1,5 @@ +# Update README test + +```scala +libraryDependencies += "com.example" %% "test" % "0.0.1" +``` \ No newline at end of file diff --git a/src/sbt-test/sbt-release/update-readme-with-regex/build.sbt b/src/sbt-test/sbt-release/update-readme-with-regex/build.sbt new file mode 100644 index 00000000..ee198ac2 --- /dev/null +++ b/src/sbt-test/sbt-release/update-readme-with-regex/build.sbt @@ -0,0 +1,36 @@ +import scala.io.Source +import sbtrelease.ReleaseStateTransformations._ + +releaseReadmeFile := Some(baseDirectory.value / "README.md") +releaseReadmeVersionRegex := """\d{1,2}\.\d{1,2}\.\d{1,2}""".r + +releaseProcess := Seq( + inquireVersions, + runClean, + setReleaseVersion, + updateReadme, + commitReadme +) + +TaskKey[Unit]("runTest") := { + val readmeFile = releaseReadmeFile.value.get + val expected = + """# Update README test + | + |```scala + |libraryDependencies += "com.example" %% "test" % "1.0.0" + |```""".stripMargin + val actual = Source.fromFile(readmeFile).mkString + + val delimeter = "=" * 10 + + assert( + actual == expected, + s"""Unexpected README content after release: + |$delimeter expected $delimeter + |$expected + |$delimeter actual $delimeter + |$actual + |${delimeter * 2}""".stripMargin + ) +} diff --git a/src/sbt-test/sbt-release/update-readme-with-regex/project/build.sbt b/src/sbt-test/sbt-release/update-readme-with-regex/project/build.sbt new file mode 100644 index 00000000..ebda5784 --- /dev/null +++ b/src/sbt-test/sbt-release/update-readme-with-regex/project/build.sbt @@ -0,0 +1,7 @@ +{ + val pluginVersion = System.getProperty("plugin.version") + if(pluginVersion == null) + throw new RuntimeException("""|The system property 'plugin.version' is not defined. + |Specify this property using the scriptedLaunchOpts -D.""".stripMargin) + else addSbtPlugin("com.github.gseitz" % "sbt-release" % pluginVersion) +} diff --git a/src/sbt-test/sbt-release/update-readme-with-regex/test b/src/sbt-test/sbt-release/update-readme-with-regex/test new file mode 100644 index 00000000..c610cb4e --- /dev/null +++ b/src/sbt-test/sbt-release/update-readme-with-regex/test @@ -0,0 +1,9 @@ +$ exec git init . + +> update + +$ exec git add . +$ exec git commit -m init + +> release release-version 1.0.0 next-version 1.0.1-SNAPSHOT +> runTest \ No newline at end of file diff --git a/src/sbt-test/sbt-release/update-readme-with-regex/version.sbt b/src/sbt-test/sbt-release/update-readme-with-regex/version.sbt new file mode 100644 index 00000000..eeb64de5 --- /dev/null +++ b/src/sbt-test/sbt-release/update-readme-with-regex/version.sbt @@ -0,0 +1 @@ +version in ThisBuild := "1.9.0" diff --git a/src/sbt-test/sbt-release/update-readme/.gitignore b/src/sbt-test/sbt-release/update-readme/.gitignore index 3a3aee2e..9f970225 100644 --- a/src/sbt-test/sbt-release/update-readme/.gitignore +++ b/src/sbt-test/sbt-release/update-readme/.gitignore @@ -1,2 +1 @@ -target -global/ +target/ \ No newline at end of file diff --git a/src/sbt-test/sbt-release/update-readme/README.md b/src/sbt-test/sbt-release/update-readme/README.md index f5932942..89d39098 100644 --- a/src/sbt-test/sbt-release/update-readme/README.md +++ b/src/sbt-test/sbt-release/update-readme/README.md @@ -1,7 +1,7 @@ -# A project +# Update README test -Add library in your `build.sbt` +Casual version mentioning 0.0.1 ```scala -libraryDependencies += "com.example" %% "lib" % "1.0.0" -``` +libraryDependencies += "com.example" %% "test" % "0.0.1" +``` \ No newline at end of file diff --git a/src/sbt-test/sbt-release/update-readme/build.sbt b/src/sbt-test/sbt-release/update-readme/build.sbt index 3d9af267..51cebbf3 100644 --- a/src/sbt-test/sbt-release/update-readme/build.sbt +++ b/src/sbt-test/sbt-release/update-readme/build.sbt @@ -1,36 +1,37 @@ +import scala.io.Source import sbtrelease.ReleaseStateTransformations._ releaseReadmeFile := Some(baseDirectory.value / "README.md") releaseProcess := Seq( - checkSnapshotDependencies, inquireVersions, runClean, - runTest, setReleaseVersion, - commitReleaseVersion, updateReadme, - commitReadme, - tagRelease, - setNextVersion, - commitNextVersion + commitReadme ) -TaskKey[Unit]("checkReadme") := { +TaskKey[Unit]("runTest") := { val readmeFile = releaseReadmeFile.value.get - val content = IO.read(readmeFile) + val expected = + """# Update README test + | + |Casual version mentioning 0.0.1 + | + |```scala + |libraryDependencies += "com.example" %% "test" % "1.0.0" + |```""".stripMargin + val actual = Source.fromFile(readmeFile).mkString + + val delimeter = "=" * 10 assert( - content == - """|# A project - | - |Add library in your `build.sbt` - | - |```scala - |libraryDependencies += "com.example" %% "lib" % "2.3.4" - |``` - |""".stripMargin, - s"Readme wasn't updated correctly\n\n$content" + actual == expected, + s"""Unexpected README content after release: + |$delimeter expected $delimeter + |$expected + |$delimeter actual $delimeter + |$actual + |${delimeter * 2}""".stripMargin ) - } diff --git a/src/sbt-test/sbt-release/update-readme/test b/src/sbt-test/sbt-release/update-readme/test index 09d80de9..c610cb4e 100644 --- a/src/sbt-test/sbt-release/update-readme/test +++ b/src/sbt-test/sbt-release/update-readme/test @@ -5,6 +5,5 @@ $ exec git init . $ exec git add . $ exec git commit -m init -> release release-version 2.3.4 next-version 2.3.5-SNAPSHOT - -> checkReadme \ No newline at end of file +> release release-version 1.0.0 next-version 1.0.1-SNAPSHOT +> runTest \ No newline at end of file diff --git a/src/sbt-test/sbt-release/update-readme/version.sbt b/src/sbt-test/sbt-release/update-readme/version.sbt index 32658449..eeb64de5 100644 --- a/src/sbt-test/sbt-release/update-readme/version.sbt +++ b/src/sbt-test/sbt-release/update-readme/version.sbt @@ -1 +1 @@ -version in ThisBuild := "1.0.0" +version in ThisBuild := "1.9.0"