Skip to content
This repository has been archived by the owner on Dec 5, 2024. It is now read-only.

Commit

Permalink
Add paket dependencies to release notes (#17)
Browse files Browse the repository at this point in the history
* Add Paket dependencies to release note output

* Fix all tests

* Add TestContent Class

* Add integration test for release notes with paket dependencies

* Apply code formmating
  • Loading branch information
marcolink authored Aug 31, 2017
1 parent 7d9b21f commit d3bea6b
Show file tree
Hide file tree
Showing 10 changed files with 365 additions and 55 deletions.
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
.gradle
build/
out/**
.idea/**

# Ignore Gradle GUI config
gradle-app.setting
Expand All @@ -13,3 +15,4 @@ gradle-app.setting
# # Work around https://youtrack.jetbrains.com/issue/IDEA-116898
# gradle/wrapper/gradle-wrapper.properties
userHome/

Original file line number Diff line number Diff line change
Expand Up @@ -55,8 +55,8 @@ abstract class GithubIntegration extends IntegrationSpec {
testRepo = builder.create()
}

def createRelease(String name) {
def releaseBuilder = testRepo.createRelease(name)
def createRelease(String name, String tagName = null) {
def releaseBuilder = testRepo.createRelease(tagName ? tagName : name)
releaseBuilder.name(name)
releaseBuilder.draft(false)
releaseBuilder.prerelease(false)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package wooga.gradle.release

import org.ajoberstar.grgit.Grgit
import wooga.gradle.release.utils.TestContent

class ReleaseNotesGenerationIntegrationSpec extends GithubIntegrationWithDefaultAuth {

Expand Down Expand Up @@ -225,4 +226,39 @@ class ReleaseNotesGenerationIntegrationSpec extends GithubIntegrationWithDefault
then:
releaseNotes.text.normalize().denormalize() == releaseNotes.text
}

def "generate releases with different paket.template files"(){

given: "a remote paket.template file"
def createResult = testRepo.createContent(TestContent.PAKET_TEMPLATE_V1, "initial commit", "paket.template")
def updateResult = createResult.content.update(TestContent.PAKET_TEMPLATE_V2, "update paket.template")

and: "empty release notes file"
def releaseNotes = createFile("RELEASE_NOTES.md")

and: "remote tags"
testRepo.createRef("refs/tags/v1.0.0", createResult.commit.getSHA1())
testRepo.createRef("refs/tags/v1.1.0", updateResult.commit.getSHA1())

and: "logs"
git.commit(message: "a change")
git.tag.add(name: "v1.0.0")
git.commit(message: 'a change')
git.tag.add(name: "v1.1.0")

and: "some releases"
createRelease("1.0.0", "v1.0.0")
createRelease("1.1.0", "v1.1.0")

when:
def result = runTasksSuccessfully("generateReleaseNotes")




then:
releaseNotes.text.contains("Wooga.TestDependency1 ~> 0.1.0")
releaseNotes.text.contains("Wooga.TestDependency1 ~> 0.2.0")

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -91,11 +91,13 @@ class ReleaseNoteBody {
String packageId
GHRepository repo

List<PacketDependency> dependencies

ChangeNote initialChange = new ChangeNote("NEW", "Initial Release")

boolean hasPreviousVersion

ReleaseNoteBody(ReleaseVersion version, Date releaseDate, String packageId, GHRepository repo, List<Commit> logs, List<GHPullRequest> prs, List<GHAsset> releaseAssets) {
ReleaseNoteBody(ReleaseVersion version, Date releaseDate, String packageId, GHRepository repo, List<Commit> logs, List<GHPullRequest> prs, List<GHAsset> releaseAssets, List<PacketDependency> dependencies) {
this.logs = logs
this.repo = repo
this.hasPreviousVersion = version.previousVersion != null
Expand All @@ -107,6 +109,7 @@ class ReleaseNoteBody {
new PullRequest(it)
}
this.releaseAssets = releaseAssets.toSorted({ a, b -> a.name <=> b.name })
this.dependencies = dependencies
}

Callable<List<PullRequest>> additionalChanges() {
Expand Down Expand Up @@ -162,4 +165,13 @@ class ReleaseNoteBody {
}
}
}

Callable<Boolean> hasDependencies(){
new Callable<Boolean>() {
@Override
Boolean call() throws Exception {
!dependencies.empty
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,16 +22,12 @@ import com.github.mustachejava.MustacheFactory
import org.ajoberstar.gradle.git.release.base.ReleaseVersion
import org.ajoberstar.grgit.Commit
import org.ajoberstar.grgit.Grgit
import org.ajoberstar.grgit.Tag
import org.gradle.api.logging.Logger
import org.gradle.api.logging.Logging
import org.kohsuke.github.GHAsset
import org.kohsuke.github.GHCommitQueryBuilder
import org.kohsuke.github.GHPullRequest
import org.kohsuke.github.GHQueryBuilder
import org.kohsuke.github.GHRelease
import org.kohsuke.github.GHRepository
import org.kohsuke.github.GHTag

/**
* A generator class to create release notes from git log and pull request bodies.
Expand Down Expand Up @@ -108,11 +104,13 @@ class ReleaseNotesGenerator {
}
}

List<PacketDependency> dependencies = fetchTemplateDependencies(hub, packageId, version)

List<Commit> logs = git.log(includes: includes, excludes: excludes)
List<GHPullRequest> pullRequests = fetchPullRequestsFromLog(logs)
List<GHAsset> releaseAssets = (release == null) ? new ArrayList<GHAsset>() : release.assets

ReleaseNoteBody noteBodyModel = new ReleaseNoteBody(version, releaseDate, packageId, hub, logs, pullRequests, releaseAssets)
ReleaseNoteBody noteBodyModel = new ReleaseNoteBody(version, releaseDate, packageId, hub, logs, pullRequests, releaseAssets, dependencies)
noteBodyModel
}

Expand Down Expand Up @@ -171,4 +169,83 @@ class ReleaseNotesGenerator {
return false
}
}

private List<PacketDependency> fetchTemplateDependencies(GHRepository hub, String packageId, ReleaseVersion version) {

List<String> paths = ["$packageId/paket.template", "paket.template"]
String content

paths.each {
if (!content) {
content = GetTemplateContent(hub, it, version)
}
}

if (!content) {
return []
}

PaketTemplateReader templateReader = new PaketTemplateReader(content)
return templateReader.getDependencies()

}

private String GetTemplateContent(GHRepository hub, String path, ReleaseVersion version) {
try {
return hub.getFileContent(path, "v$version.version").read().text
}
catch (IOException exception) {
logger.info("could not find paket template file at $path $exception.message")
return null
}
}
}

class PacketDependency {
String packageId
String version

PacketDependency(String packageId, String version) {
this.packageId = packageId
this.version = version
}

String toString() {
"$packageId $version"
}
}

class PaketTemplateReader {

private def content

PaketTemplateReader(String input) {
content = [:]

def regex = /(?m)^(\w+)( |\n[ ]{4})(((\n[ ]{4})?.*)+)/
def r = input.findAll(regex)

r.each {
def matcher
matcher = it =~ regex
content[matcher[0][1]] = matcher[0][3]
}
}

List<PacketDependency> getDependencies() {
List<PacketDependency> result = []

if (content['dependencies'] != null || content['dependencies'] == "") {
content['dependencies'].eachLine { line ->
String[] segments = line.trim().split(" ", 2)
result << new PacketDependency(segments[0], segments.length > 1 ? segments[1] : null)
}
}

result
}

String getPackageId() {
content['id']
}
}
1 change: 1 addition & 0 deletions src/main/resources/dependency.mustache
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{{packageId}} {{&version}}
9 changes: 9 additions & 0 deletions src/main/resources/releaseNote.mustache
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,15 @@
* [{{name}}]({{browserDownloadUrl}})
{{/releaseAssets}}
{{/hasReleaseAssets}}
{{#hasDependencies}}

## Dependencies ##

```bash
{{#dependencies}}{{>dependency}}
{{/dependencies}}
```
{{/hasDependencies}}

## How to install ##

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,10 @@ package wooga.gradle.release.utils

import org.ajoberstar.gradle.git.release.base.ReleaseVersion
import org.ajoberstar.grgit.Grgit
import org.apache.tools.ant.filters.StringInputStream
import org.kohsuke.github.GHContent
import org.kohsuke.github.GHPullRequest
import org.kohsuke.github.GHRef
import org.kohsuke.github.GHRepository
import spock.lang.Specification

Expand Down Expand Up @@ -51,6 +54,13 @@ class ReleaseBodyStrategySpec extends Specification {
version = new ReleaseVersion("1.1.0", "1.0.0", false)

releaseBodyStrategy = new ReleaseBodyStrategy(version, git)

GHContent ghContent = Mock()
ghContent.read() >> {new StringInputStream(TestContent.PAKET_TEMPLATE_V1)}

GHRef ref = Mock()
repository.getRef(_) >> ref
repository.getFileContent(_, _) >> ghContent
}

def "verify calls ReleaseNotesGenerator to generate release notes body"() {
Expand Down Expand Up @@ -80,6 +90,6 @@ class ReleaseBodyStrategySpec extends Specification {
* ![ADD] some stuff [#2]
* ![REMOVE] some stuff [#2]
* ![FIX] some stuff [#2]
""".stripIndent().stripMargin() + ReleaseNotesGeneratorTest.ICON_IDS).trim()
""".stripIndent().stripMargin() + TestContent.ICON_IDS).trim()
}
}
Loading

0 comments on commit d3bea6b

Please sign in to comment.