From 1e433760e5c0e532a7aaa17ca5bb8556b64ccd24 Mon Sep 17 00:00:00 2001 From: Damien Bailly Date: Fri, 2 Feb 2018 11:38:24 +0000 Subject: [PATCH 1/9] Fix release-notes plugin - Fix git log command (tags need to start with 'v') - Add regex setting to specify Jira number pattern --- .../cakesolutions/ReleaseNotesPlugin.scala | 24 +++++++++++++++---- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/src/main/scala/net/cakesolutions/ReleaseNotesPlugin.scala b/src/main/scala/net/cakesolutions/ReleaseNotesPlugin.scala index df13ee3..12507cc 100644 --- a/src/main/scala/net/cakesolutions/ReleaseNotesPlugin.scala +++ b/src/main/scala/net/cakesolutions/ReleaseNotesPlugin.scala @@ -7,12 +7,13 @@ import java.time.{Clock, ZonedDateTime} import java.time.format.DateTimeFormatter import scala.util.{Failure, Success, Try} - import com.google.common.base.Charsets import com.google.common.io.BaseEncoding import sbt._ import sbt.Keys._ +import scala.util.matching.Regex + /** * Plugin for automatically generating release notes in issue management * software (e.g. Jira). In order for this to function correctly, we follow the @@ -42,6 +43,7 @@ object ReleaseNotesPlugin extends AutoPlugin { override val projectSettings: Seq[Setting[_]] = Seq( issueManagementUrl := None, issueManagementProject := None, + issuePattern := """(\w+-\d+)""".r, CakeBuildInfoKeys.externalBuildTools += ( "curl --version", "`curl` command should be installed and PATH accessible" @@ -122,10 +124,10 @@ object ReleaseNotesPlugin extends AutoPlugin { s"Version tag of $currentTag does not match the current " + s"version of $currentVersion" ) - s"$lastTag...$currentTag" + s"v$lastTag...v$currentTag" case _: List[String] => throw new AssertionError( - "Impossible scenarion: multiple version tags found " + + "Impossible scenario: multiple version tags found " + "- unable to generate release version notes!" ) } @@ -137,8 +139,13 @@ object ReleaseNotesPlugin extends AutoPlugin { Try { issueListCommand.!!.split("\n").toList .map(_.trim.replaceAll("\"", "")) - .filter(_.matches("^\\w+-\\d+:.*$")) - .map(_.split(":").head) + .flatMap(message => + issuePattern + .value + .findAllIn(message) + .matchData + .map(_.group(1)) + ) } assume( @@ -364,6 +371,13 @@ object ReleaseNotesPluginKeys { "the publishing of release notes" ) + + val issuePattern: SettingKey[Regex] = + settingKey( + "Regex pattern identifying issue numbers (e.g. in Jira: PRJ-123) " + + """defaults to "(\w+-\d+)"""" + ) + /** * Task that ensures all preconditions for using this plugin are satisfied. */ From 058d090ae52a02e8a59ec4c04b6c4f1cde2d70b4 Mon Sep 17 00:00:00 2001 From: Damien Bailly Date: Fri, 2 Feb 2018 11:48:30 +0000 Subject: [PATCH 2/9] Linting --- src/main/scala/net/cakesolutions/ReleaseNotesPlugin.scala | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/scala/net/cakesolutions/ReleaseNotesPlugin.scala b/src/main/scala/net/cakesolutions/ReleaseNotesPlugin.scala index 12507cc..70e3043 100644 --- a/src/main/scala/net/cakesolutions/ReleaseNotesPlugin.scala +++ b/src/main/scala/net/cakesolutions/ReleaseNotesPlugin.scala @@ -7,12 +7,12 @@ import java.time.{Clock, ZonedDateTime} import java.time.format.DateTimeFormatter import scala.util.{Failure, Success, Try} +import scala.util.matching.Regex + import com.google.common.base.Charsets import com.google.common.io.BaseEncoding -import sbt._ import sbt.Keys._ - -import scala.util.matching.Regex +import sbt._ /** * Plugin for automatically generating release notes in issue management From 099d2e1d1cb90fadca2ad0fd916214b9b5557521 Mon Sep 17 00:00:00 2001 From: Damien Bailly Date: Fri, 2 Feb 2018 11:59:07 +0000 Subject: [PATCH 3/9] Formatting --- .../net/cakesolutions/ReleaseNotesPlugin.scala | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/main/scala/net/cakesolutions/ReleaseNotesPlugin.scala b/src/main/scala/net/cakesolutions/ReleaseNotesPlugin.scala index 70e3043..9822403 100644 --- a/src/main/scala/net/cakesolutions/ReleaseNotesPlugin.scala +++ b/src/main/scala/net/cakesolutions/ReleaseNotesPlugin.scala @@ -11,8 +11,8 @@ import scala.util.matching.Regex import com.google.common.base.Charsets import com.google.common.io.BaseEncoding -import sbt.Keys._ import sbt._ +import sbt.Keys._ /** * Plugin for automatically generating release notes in issue management @@ -139,12 +139,12 @@ object ReleaseNotesPlugin extends AutoPlugin { Try { issueListCommand.!!.split("\n").toList .map(_.trim.replaceAll("\"", "")) - .flatMap(message => - issuePattern - .value - .findAllIn(message) - .matchData - .map(_.group(1)) + .flatMap( + message => + issuePattern.value + .findAllIn(message) + .matchData + .map(_.group(1)) ) } @@ -371,7 +371,6 @@ object ReleaseNotesPluginKeys { "the publishing of release notes" ) - val issuePattern: SettingKey[Regex] = settingKey( "Regex pattern identifying issue numbers (e.g. in Jira: PRJ-123) " + From b1b6ac777b4dffba0740ef2d0e996ab22972529d Mon Sep 17 00:00:00 2001 From: Damien Bailly Date: Tue, 13 Feb 2018 15:38:46 +0000 Subject: [PATCH 4/9] Create github release during release-notes process --- .../cakesolutions/ReleaseNotesPlugin.scala | 235 ++++++++++++------ src/sbt-test/sbt-cake/release-notes/build.sbt | 2 + .../scala/MockIssueManagementServer.scala | 9 + src/sbt-test/sbt-cake/release-notes/test | 2 +- 4 files changed, 173 insertions(+), 75 deletions(-) diff --git a/src/main/scala/net/cakesolutions/ReleaseNotesPlugin.scala b/src/main/scala/net/cakesolutions/ReleaseNotesPlugin.scala index 9822403..ce72dee 100644 --- a/src/main/scala/net/cakesolutions/ReleaseNotesPlugin.scala +++ b/src/main/scala/net/cakesolutions/ReleaseNotesPlugin.scala @@ -41,6 +41,7 @@ object ReleaseNotesPlugin extends AutoPlugin { /** @see http://www.scala-sbt.org/0.13/api/index.html#sbt.package */ override val projectSettings: Seq[Setting[_]] = Seq( + versionControlUrl := None, issueManagementUrl := None, issueManagementProject := None, issuePattern := """(\w+-\d+)""".r, @@ -55,16 +56,25 @@ object ReleaseNotesPlugin extends AutoPlugin { private object Defaults { val checkReleaseNoteSettings: Def.Initialize[Task[Unit]] = Def.taskDyn { - require( - issueManagementUrl.value.nonEmpty, - "Need to define an issue management URL (e.g. to Jira) before we can " + - "publish release notes!" - ) - require( - issueManagementProject.value.nonEmpty, - "Need to define an issue management (e.g. Jira) project before we " + - "can publish release notes!" - ) + val logger = Keys.streams.value.log + if (issueManagementUrl.value.isEmpty) { + logger.info( + "No issue management (e.g. Jira) URL defined: " + + "skip publishing release notes to issue management system" + ) + } + if (issueManagementProject.value.isEmpty) { + logger.info( + "No issue management (e.g. to Jira) project defined: " + + "skip publishing release notes to issue management system" + ) + } + if (versionControlUrl.value.isEmpty) { + logger.info( + "No version control (e.g. Github) URL defined: " + + "skip publishing release notes to version control system" + ) + } Def.task(()) } @@ -73,15 +83,12 @@ object ReleaseNotesPlugin extends AutoPlugin { val logger = Keys.streams.value.log if (isDynVerSnapshot.value) { logger.info( - "Skipping publishing of SNAPSHOT project " + - s"${issueManagementProject.value} release notes " + - s"for project ${name.value} to ${issueManagementUrl.value}" + s"Skipping publishing release notes of SNAPSHOT project ${name.value}" ) Def.task(()) } else { logger.info( - s"Publishing project ${issueManagementProject.value} release notes " + - s"for ${name.value} to ${issueManagementUrl.value}" + s"Publishing release notes of project ${name.value} ${version.value}" ) val project = issueManagementProject.value.getOrElse("") val currentVersion = version.value @@ -132,81 +139,131 @@ object ReleaseNotesPlugin extends AutoPlugin { ) } } - val issues = { + val (issueNumbers, issues) = { val issueListCommand = s"""git log --pretty=oneline --pretty=format:"%s" $gitChanges""" val issueList = Try { issueListCommand.!!.split("\n").toList .map(_.trim.replaceAll("\"", "")) - .flatMap( - message => - issuePattern.value - .findAllIn(message) - .matchData - .map(_.group(1)) - ) } - + val issueNumberList = issueList.flatMap( messages => + Try { + messages + .flatMap { message => + logger.info(s"- $message") + issuePattern.value + .findAllIn(message) + .matchData + .map(_.group(1)) + } + } + ) assume( - issueList.isSuccess, + issueNumberList.isSuccess, "Failed to extract version tag information for this release from " + "the git repository!" ) assume( - issueList.get.nonEmpty, + issueNumberList.get.nonEmpty, "At least one version tag should exist in the git repository!" ) - - issueList.get + (issueNumberList.get, issueList.get) } - val result = for { - releaseId <- createJiraRelease( - version.value, - project, - issueManagementUrl.value + if (issueManagementUrl.value.isEmpty || + issueManagementProject.value.isEmpty) { + logger.info( + "Skip publishing release notes to issue management system" ) - _ = logger.info(s"Created release $releaseId") - _ <- associateIssuesWithJiraRelease( - version.value, - issues, - issueManagementUrl.value - ) - _ = logger.info(s"Associating issues with release $releaseId") - _ <- closeJiraRelease(releaseId, project, issueManagementUrl.value) - _ = logger.info(s"Closed the release $releaseId") - } yield () + } else { + val result = for { + releaseId <- createJiraRelease( + version.value, + project, + issueManagementUrl.value + ) + _ = logger.info(s"Created release $releaseId") + _ <- associateIssuesWithJiraRelease( + version.value, + issueNumbers, + issueManagementUrl.value + ) + _ = logger.info(s"Associating issues with release $releaseId") + _ <- closeJiraRelease(releaseId, project, issueManagementUrl.value) + _ = logger.info(s"Closed the release $releaseId") + } yield () + + if (result.isFailure) { + throw new AssertionError( + "Failed to publish release notes to " + + issueManagementUrl.value.getOrElse(""), + result.failed.get + ) + } - if (result.isFailure) { - throw new AssertionError(s"Failed to publish release notes: $result") + logger.info( + "Completed publishing release notes to " + + issueManagementUrl.value.getOrElse("") + ) } + if (versionControlUrl.value.isEmpty) { + logger.info( + "Skip publishing release notes to version control system" + ) + } else { + val result = for { + _ <- createGithubRelease( + version.value, + issues, + versionControlUrl.value + ) + _ = logger.info(s"Created release ${version.value}") + } yield () + + if (result.isFailure) { + throw new AssertionError( + "Failed to publish release notes to " + + versionControlUrl.value.getOrElse(""), + result.failed.get + ) + } - logger.info( - s"Completed publishing release notes to ${issueManagementUrl.value}" - ) - + logger.info( + "Completed publishing release notes to " + + versionControlUrl.value.getOrElse("") + ) + } Def.task(()) } } + private def jiraAuthHeader: Seq[String] = { + val jiraAuth = sys.env.get("JIRA_AUTH_TOKEN").map { token => + BaseEncoding.base64().encode(token.getBytes(Charsets.UTF_8)) + } + if (jiraAuth.isDefined) { + Seq("-H", s"Authorization: Basic ${jiraAuth.get}") + } else { + Seq.empty + } + } + + private def githubAuthHeader: Seq[String] = { + val oAuth = sys.env.get("GITHUB_AUTH_TOKEN") + oAuth.toSeq.flatMap(token => Seq("-H", s"Authorization: token $token")) + } + // scalastyle:off magic.number private def httpClient( method: String, path: String, json: String, - jiraUrl: Option[URL], + targetUrl: Option[URL], + authHeader: Seq[String], timeout: Int = 60 ): Try[String] = { - val jiraUrlStr = jiraUrl.fold("")(_.toString) - val jiraAuth = sys.env.get("JIRA_AUTH_TOKEN").map { token => - BaseEncoding.base64().encode(token.getBytes(Charsets.UTF_8)) - } - val authenticationHeader = - if (jiraAuth.isDefined) { - Seq("-H", s"Authorization: Basic ${jiraAuth.get}") - } else { - Seq.empty - } + val targetUrlStr = targetUrl.fold("")(_.toString) + val jsonData = json.replaceAll("\n", "") val requestCmd = Seq( "curl", @@ -218,13 +275,13 @@ object ReleaseNotesPlugin extends AutoPlugin { "-d", jsonData ) ++ - authenticationHeader ++ + authHeader ++ Seq( "-H", "Content-Type: application/json", "--max-time", timeout.toString, - s"$jiraUrlStr$path" + s"$targetUrlStr$path" ) Try(requestCmd.!!.trim).flatMap { response => @@ -247,14 +304,14 @@ object ReleaseNotesPlugin extends AutoPlugin { } else if (statusCode.isFailure) { Failure( new RuntimeException( - s"$jiraUrlStr returned an unparsable status code of " + + s"$targetUrlStr returned an unparsable status code of " + s"'$statusCodeStr': $responseBody" ) ) } else { Failure( new RuntimeException( - s"$jiraUrlStr returned an invalid status code of " + + s"$targetUrlStr returned an invalid status code of " + s"$statusCode (expected 2XX): $responseBody" ) ) @@ -267,17 +324,19 @@ object ReleaseNotesPlugin extends AutoPlugin { private def post( path: String, json: String, - jiraUrl: Option[URL] + targetUrl: Option[URL], + authHeader: Seq[String] ): Try[String] = { - httpClient("POST", path, json, jiraUrl) + httpClient("POST", path, json, targetUrl, authHeader) } private def put( path: String, json: String, - jiraUrl: Option[URL] + targetUrl: Option[URL], + authHeader: Seq[String] ): Try[String] = { - httpClient("PUT", path, json, jiraUrl) + httpClient("PUT", path, json, targetUrl, authHeader) } private def createJiraRelease( @@ -301,7 +360,7 @@ object ReleaseNotesPlugin extends AutoPlugin { |} """.stripMargin - post("/version", data, jiraUrl) + post("/version", data, jiraUrl, jiraAuthHeader) } private def associateIssuesWithJiraRelease( @@ -320,7 +379,7 @@ object ReleaseNotesPlugin extends AutoPlugin { |} """.stripMargin - put(s"/issue/$issue", data, jiraUrl).map(_ => ()) + put(s"/issue/$issue", data, jiraUrl, jiraAuthHeader).map(_ => ()) case (_, error) => error } @@ -340,7 +399,27 @@ object ReleaseNotesPlugin extends AutoPlugin { |} """.stripMargin - put(s"/version/$releaseId", data, jiraUrl).map(_ => ()) + put(s"/version/$releaseId", data, jiraUrl, jiraAuthHeader).map(_ => ()) + } + + private def createGithubRelease( + version: String, + commits: List[String], + githubUrl: Option[URL] + ): Try[Unit] = { + val data = + s""" + |{ + | "tag_name": "v$version", + | "target_commitish": "master", + | "name": "v$version", + | "body": "${commits.mkString("\\n")}", + | "draft": false, + | "prerelease": false + |} + """.stripMargin + + post("/releases", data, githubUrl, githubAuthHeader).map(_ => ()) } } } @@ -352,8 +431,16 @@ object ReleaseNotesPlugin extends AutoPlugin { object ReleaseNotesPluginKeys { /** - * Optional URL pointing to the issue management REST APIs. This needs to be - * defined in order to use this plugin. + * Optional URL pointing to the version control REST APIs. + */ + val versionControlUrl: SettingKey[Option[URL]] = + settingKey( + "Optional URL pointing to the issue management system (e.g. Jira) for " + + "the publishing of release notes" + ) + + /** + * Optional URL pointing to the issue management REST APIs. */ val issueManagementUrl: SettingKey[Option[URL]] = settingKey( @@ -363,7 +450,7 @@ object ReleaseNotesPluginKeys { /** * Optional project name. This is the name of the project within the issue - * management server. This needs to be defined in order to use this plugin. + * management server. */ val issueManagementProject: SettingKey[Option[String]] = settingKey( diff --git a/src/sbt-test/sbt-cake/release-notes/build.sbt b/src/sbt-test/sbt-cake/release-notes/build.sbt index 08681e3..357dc99 100644 --- a/src/sbt-test/sbt-cake/release-notes/build.sbt +++ b/src/sbt-test/sbt-cake/release-notes/build.sbt @@ -21,6 +21,8 @@ issueManagementUrl := Some(new URL("http://localhost:8080")) issueManagementProject := Some("SBTTesting") +versionControlUrl := Some(new URL("http://localhost:8080")) + libraryDependencies ++= Seq( Akka.Http.base, Akka.Http.core, diff --git a/src/sbt-test/sbt-cake/release-notes/src/main/scala/MockIssueManagementServer.scala b/src/sbt-test/sbt-cake/release-notes/src/main/scala/MockIssueManagementServer.scala index 48fb320..354c2ee 100644 --- a/src/sbt-test/sbt-cake/release-notes/src/main/scala/MockIssueManagementServer.scala +++ b/src/sbt-test/sbt-cake/release-notes/src/main/scala/MockIssueManagementServer.scala @@ -52,6 +52,15 @@ object MockIssueManagementServer extends App { } } } ~ + path("releases") { + post { + extractDataBytes { bytes => + bytes + .runWith(FileIO.toPath(new File("post-release.json").toPath)) + complete(OK) + } + } + } ~ { ctx => println(s"Rejected: ${ctx.request}") ctx.complete(Forbidden) diff --git a/src/sbt-test/sbt-cake/release-notes/test b/src/sbt-test/sbt-cake/release-notes/test index b809f9c..9558871 100644 --- a/src/sbt-test/sbt-cake/release-notes/test +++ b/src/sbt-test/sbt-cake/release-notes/test @@ -2,7 +2,7 @@ > stage $ exec chmod a+x start-server.sh $ exec chmod a+x stop-server.sh -> startServer +> show startServer $ exec echo "TEST: work without a git project repository" $ exec echo "- expect SNAPSHOT release note publishing to be skipped" From 0c6167e0d61fca3fd1bfffc97c593383284ec698 Mon Sep 17 00:00:00 2001 From: Damien Bailly Date: Wed, 14 Feb 2018 12:17:52 +0000 Subject: [PATCH 5/9] Allow release-notes process to go on when no issues found A release may not contain any Jira ticket but it's still ok to continue --- src/main/scala/net/cakesolutions/ReleaseNotesPlugin.scala | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/scala/net/cakesolutions/ReleaseNotesPlugin.scala b/src/main/scala/net/cakesolutions/ReleaseNotesPlugin.scala index ce72dee..528bfb0 100644 --- a/src/main/scala/net/cakesolutions/ReleaseNotesPlugin.scala +++ b/src/main/scala/net/cakesolutions/ReleaseNotesPlugin.scala @@ -164,9 +164,8 @@ object ReleaseNotesPlugin extends AutoPlugin { "Failed to extract version tag information for this release from " + "the git repository!" ) - assume( - issueNumberList.get.nonEmpty, - "At least one version tag should exist in the git repository!" + if (issueNumberList.get.isEmpty)( + logger.info("No traked issues found in this release") ) (issueNumberList.get, issueList.get) } From 8d9048703ed82132712601c3de6634eb563bb5a6 Mon Sep 17 00:00:00 2001 From: Damien Bailly Date: Wed, 14 Feb 2018 16:28:42 +0000 Subject: [PATCH 6/9] Release content formatting --- src/main/scala/net/cakesolutions/ReleaseNotesPlugin.scala | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/scala/net/cakesolutions/ReleaseNotesPlugin.scala b/src/main/scala/net/cakesolutions/ReleaseNotesPlugin.scala index 528bfb0..2e10474 100644 --- a/src/main/scala/net/cakesolutions/ReleaseNotesPlugin.scala +++ b/src/main/scala/net/cakesolutions/ReleaseNotesPlugin.scala @@ -406,13 +406,14 @@ object ReleaseNotesPlugin extends AutoPlugin { commits: List[String], githubUrl: Option[URL] ): Try[Unit] = { + val content = commits.map(m => s"- $m") val data = s""" |{ | "tag_name": "v$version", | "target_commitish": "master", - | "name": "v$version", - | "body": "${commits.mkString("\\n")}", + | "name": "$version", + | "body": "${content.mkString("\\n")}", | "draft": false, | "prerelease": false |} From 1cc426c35fb2c30194a1b50c3563ea32ef8192e9 Mon Sep 17 00:00:00 2001 From: Damien Bailly Date: Wed, 14 Feb 2018 17:25:48 +0000 Subject: [PATCH 7/9] clean test file --- src/sbt-test/sbt-cake/release-notes/test | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sbt-test/sbt-cake/release-notes/test b/src/sbt-test/sbt-cake/release-notes/test index 9558871..b809f9c 100644 --- a/src/sbt-test/sbt-cake/release-notes/test +++ b/src/sbt-test/sbt-cake/release-notes/test @@ -2,7 +2,7 @@ > stage $ exec chmod a+x start-server.sh $ exec chmod a+x stop-server.sh -> show startServer +> startServer $ exec echo "TEST: work without a git project repository" $ exec echo "- expect SNAPSHOT release note publishing to be skipped" From c1dd98876468306f47fd1876ddb941b63658a306 Mon Sep 17 00:00:00 2001 From: Damien Bailly Date: Wed, 14 Feb 2018 17:28:10 +0000 Subject: [PATCH 8/9] Typo in log message --- src/main/scala/net/cakesolutions/ReleaseNotesPlugin.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/scala/net/cakesolutions/ReleaseNotesPlugin.scala b/src/main/scala/net/cakesolutions/ReleaseNotesPlugin.scala index 2e10474..d31b593 100644 --- a/src/main/scala/net/cakesolutions/ReleaseNotesPlugin.scala +++ b/src/main/scala/net/cakesolutions/ReleaseNotesPlugin.scala @@ -165,7 +165,7 @@ object ReleaseNotesPlugin extends AutoPlugin { "the git repository!" ) if (issueNumberList.get.isEmpty)( - logger.info("No traked issues found in this release") + logger.info("No tracked issues found in this release") ) (issueNumberList.get, issueList.get) } From eaf05bdfcb92eebcbabe4a653b23ee78934ed6d5 Mon Sep 17 00:00:00 2001 From: Damien Bailly Date: Wed, 14 Feb 2018 20:47:39 +0000 Subject: [PATCH 9/9] Formatting --- .../net/cakesolutions/CakeDynVerPlugin.scala | 9 +++++++ .../cakesolutions/ReleaseNotesPlugin.scala | 24 ++++++++++--------- 2 files changed, 22 insertions(+), 11 deletions(-) diff --git a/src/main/scala/net/cakesolutions/CakeDynVerPlugin.scala b/src/main/scala/net/cakesolutions/CakeDynVerPlugin.scala index 93c360d..c81df3f 100644 --- a/src/main/scala/net/cakesolutions/CakeDynVerPlugin.scala +++ b/src/main/scala/net/cakesolutions/CakeDynVerPlugin.scala @@ -30,22 +30,30 @@ object CakeDynVerPlugin extends AutoPlugin { * set, eval, and .sbt files. */ object autoImport { + val dynVerPlugin: SettingKey[DynVerPluginData] = settingKey[DynVerPluginData]("") + val dynVerPattern: SettingKey[DynVerPattern] = settingKey[DynVerPattern]("Dynamic versioning pattern configuration") + val dynver: SettingKey[String] = settingKey[String]("The version of your project, from git") + val dynverCurrentDate: SettingKey[Instant] = settingKey[Instant]("The current UTC time instant, for dynver purposes") + val dynverGitDescribeOutput: SettingKey[Option[GitDescribeOutput]] = settingKey[Option[GitDescribeOutput]]("The output from git describe") + val mkVersion: SettingKey[Option[GitDescribeOutput] => String] = settingKey[Option[GitDescribeOutput] => String]( "Setting defining how to map git describe output to a version string" ) + val dynverCheckVersion: TaskKey[Boolean] = taskKey[Boolean]("Checks if version and dynver match") + val dynverAssertVersion: TaskKey[Unit] = taskKey[Unit]("Asserts if version and dynver match") } @@ -115,6 +123,7 @@ final case class DynVerPattern( * Default settings for dynamic versioning plugin's tag prefixing. */ object DynVerPattern { + val defaults: DynVerPattern = { val tagPrefix: String = "v" val Tag: Regex = s"""($tagPrefix[0-9][^+]*)""".r diff --git a/src/main/scala/net/cakesolutions/ReleaseNotesPlugin.scala b/src/main/scala/net/cakesolutions/ReleaseNotesPlugin.scala index d31b593..c2566e6 100644 --- a/src/main/scala/net/cakesolutions/ReleaseNotesPlugin.scala +++ b/src/main/scala/net/cakesolutions/ReleaseNotesPlugin.scala @@ -55,6 +55,7 @@ object ReleaseNotesPlugin extends AutoPlugin { ) private object Defaults { + val checkReleaseNoteSettings: Def.Initialize[Task[Unit]] = Def.taskDyn { val logger = Keys.streams.value.log if (issueManagementUrl.value.isEmpty) { @@ -147,16 +148,17 @@ object ReleaseNotesPlugin extends AutoPlugin { issueListCommand.!!.split("\n").toList .map(_.trim.replaceAll("\"", "")) } - val issueNumberList = issueList.flatMap( messages => - Try { - messages - .flatMap { message => - logger.info(s"- $message") - issuePattern.value - .findAllIn(message) - .matchData - .map(_.group(1)) - } + val issueNumberList = issueList.flatMap( + messages => + Try { + messages + .flatMap { message => + logger.info(s"- $message") + issuePattern.value + .findAllIn(message) + .matchData + .map(_.group(1)) + } } ) assume( @@ -170,7 +172,7 @@ object ReleaseNotesPlugin extends AutoPlugin { (issueNumberList.get, issueList.get) } if (issueManagementUrl.value.isEmpty || - issueManagementProject.value.isEmpty) { + issueManagementProject.value.isEmpty) { logger.info( "Skip publishing release notes to issue management system" )