├── .gitattributes ├── .gitignore ├── Build.cmd ├── Chocolatey ├── GitReleaseNotes.nuspec └── tools │ └── chocolateyInstall.ps1 ├── GitReleaseNotes.nuspec ├── GitReleaseNotes.proj ├── LICENSE ├── NextVersion.txt ├── README.md ├── ReleaseNotes.md ├── src ├── .nuget │ └── NuGet.exe ├── GitReleaseNotes.Tests │ ├── ArgumentTests.cs │ ├── CommitGrouperTests.cs │ ├── CommitGrouperTestsMultipleTagsPerCommit.cs │ ├── GitReleaseNotes.Tests.csproj │ ├── GitRemoteRepositoryTests.cs │ ├── IssueTrackers │ │ ├── GitHub │ │ │ ├── GitHubIssueTrackerTests.cs │ │ │ ├── NetworkEx.cs │ │ │ ├── RemoteCollectionEx.cs │ │ │ ├── RemoteEx.cs │ │ │ └── TestUser.cs │ │ ├── IssueNumberExtractor.cs │ │ └── Jira │ │ │ └── JiraIssueTrackerTests.cs │ ├── Properties │ │ └── AssemblyInfo.cs │ ├── ReleaseFileWriterTests.cs │ ├── ReleaseNotesGeneratorTests.AllTags.approved.txt │ ├── ReleaseNotesGeneratorTests.AllTagsWithNoCommitsOrIssuesAfterLastRelease.approved.txt │ ├── ReleaseNotesGeneratorTests.AppendOnlyNewItems.approved.txt │ ├── ReleaseNotesGeneratorTests.KeepsCustomisations.approved.txt │ ├── ReleaseNotesGeneratorTests.cs │ ├── SemanticReleaseNotesTests.AdditionalCategoriesCanBeSpecifiedOnCommandLine.approved.txt │ ├── SemanticReleaseNotesTests.ApproveSimpleTests.approved.txt │ ├── SemanticReleaseNotesTests.ApproveSimpleUpdateTests.approved.txt │ ├── SemanticReleaseNotesTests.ItemIsCategorised.approved.txt │ ├── SemanticReleaseNotesTests.ItemIsCategorisedWithMultipleCategoriesIfAllLabelsIsTrue.approved.txt │ ├── SemanticReleaseNotesTests.ItemIsNotCategorisedWithMultipleCategoriesIfAllLabelsIsFalse.approved.txt │ ├── SemanticReleaseNotesTests.LabelOfBugIsCategorisedAsFix.approved.txt │ ├── SemanticReleaseNotesTests.MultipleReleases.approved.txt │ ├── SemanticReleaseNotesTests.cs │ ├── TestDataCreator.cs │ ├── TestGitRepoUtils.cs │ └── packages.config ├── GitReleaseNotes.Website │ ├── App_Start │ │ ├── Startup.BundleConfig.cs │ │ ├── Startup.FilterConfig.cs │ │ ├── Startup.Json.cs │ │ ├── Startup.RouteConfig.cs │ │ ├── Startup.WebApi.cs │ │ └── Startup.cs │ ├── ContentTypes │ │ └── JsonContent.cs │ ├── Controllers │ │ ├── Api │ │ │ ├── ApiControllerBase.cs │ │ │ └── ReleaseNotesController.cs │ │ ├── ControllerBase.cs │ │ └── HomeController.cs │ ├── Filters │ │ └── Api │ │ │ ├── ApiResponseFilterAttribute.cs │ │ │ └── ExceptionFilterAttribute.cs │ ├── FodyWeavers.xml │ ├── Formatting │ │ └── PlainTextFormatter.cs │ ├── GitReleaseNotes.Website.csproj │ ├── Global.asax │ ├── Global.asax.cs │ ├── IoC │ │ └── CatelWebApiDependencyResolver.cs │ ├── Models │ │ └── Api │ │ │ ├── Extensions │ │ │ └── ReleaseNotesRequestExtensions.cs │ │ │ ├── ReleaseNotesRequest.cs │ │ │ └── Response.cs │ ├── ModuleInitializer.cs │ ├── Properties │ │ └── AssemblyInfo.cs │ ├── Services │ │ ├── FileSystem.cs │ │ ├── Interfaces │ │ │ └── IReleaseNotesService.cs │ │ └── ReleaseNotesService.cs │ ├── Views │ │ ├── Home │ │ │ └── Index.cshtml │ │ ├── Shared │ │ │ ├── Error.cshtml │ │ │ └── _MainLayout.cshtml │ │ ├── _ViewStart.cshtml │ │ └── web.config │ ├── Web.Debug.config │ ├── Web.Release.config │ ├── Web.config │ ├── content │ │ ├── angular │ │ │ ├── app.js │ │ │ ├── components │ │ │ │ └── home │ │ │ │ │ └── controllers │ │ │ │ │ └── HomeController.js │ │ │ └── services │ │ │ │ ├── BusyIndicatorService.js │ │ │ │ └── ReleaseNotesService.js │ │ ├── fonts │ │ │ ├── FontAwesome.otf │ │ │ ├── fontawesome-webfont.eot │ │ │ ├── fontawesome-webfont.svg │ │ │ ├── fontawesome-webfont.ttf │ │ │ ├── fontawesome-webfont.woff │ │ │ ├── glyphicons-halflings-regular.eot │ │ │ ├── glyphicons-halflings-regular.svg │ │ │ ├── glyphicons-halflings-regular.ttf │ │ │ ├── glyphicons-halflings-regular.woff │ │ │ └── glyphicons-halflings-regular.woff2 │ │ ├── scripts │ │ │ ├── _references.js │ │ │ ├── bootstrap-datepicker.js │ │ │ ├── bootstrap.js │ │ │ ├── bootstrap.min.js │ │ │ ├── jquery-2.1.1.intellisense.js │ │ │ ├── jquery-2.1.1.js │ │ │ ├── jquery-2.1.1.min.js │ │ │ ├── jquery-2.1.1.min.map │ │ │ ├── jquery.signalR-2.1.2.js │ │ │ ├── jquery.signalR-2.1.2.min.js │ │ │ ├── jquery.validate-vsdoc.js │ │ │ ├── jquery.validate.js │ │ │ ├── jquery.validate.min.js │ │ │ ├── jquery.validate.unobtrusive.js │ │ │ ├── jquery.validate.unobtrusive.min.js │ │ │ ├── modernizr-2.8.3.js │ │ │ └── npm.js │ │ └── styles │ │ │ ├── bootstrap-theme.css │ │ │ ├── bootstrap-theme.css.map │ │ │ ├── bootstrap-theme.min.css │ │ │ ├── bootstrap.css │ │ │ ├── bootstrap.css.map │ │ │ ├── bootstrap.min.css │ │ │ ├── font-awesome.css │ │ │ ├── font-awesome.min.css │ │ │ └── site.css │ └── packages.config ├── GitReleaseNotes.sln ├── GitReleaseNotes.sln.DotSettings └── GitReleaseNotes │ ├── App.config │ ├── ArgumentVerifier.cs │ ├── BlankLine.cs │ ├── Categories.cs │ ├── Context │ ├── AuthenticationContext.cs │ ├── BitBucketContext.cs │ ├── Context.cs │ ├── Extensions │ │ └── ContextExtensions.cs │ ├── GitHubContext.cs │ ├── JiraContext.cs │ ├── RepositoryContext.cs │ └── YouTrackContext.cs │ ├── Contributor.cs │ ├── Exceptions │ └── GitReleaseNotesException.cs │ ├── Extensions │ ├── GitReleaseNotesArgumentsExtensions.cs │ └── ILogExtensions.cs │ ├── FileSystem │ ├── FileSystem.cs │ ├── IFileSystem.cs │ ├── ReleaseFileWriter.cs │ └── ReleaseNotesFileReader.cs │ ├── FodyWeavers.xml │ ├── Git │ ├── GitBranchNameInfo.cs │ ├── GitDirFinder.cs │ ├── GitLocalRepositoryContextFactory.cs │ ├── GitRemoteRepositoryContextFactory.cs │ ├── GitRepositoryContext.cs │ ├── GitRepositoryInfoFinder.cs │ ├── IGitRepositoryContextFactory.cs │ └── TaggedCommit.cs │ ├── GitReleaseNotes.csproj │ ├── GitReleaseNotesArguments.cs │ ├── GitReleaseNotesEnvironment.cs │ ├── IReleaseNoteLine.cs │ ├── IssueTrackers │ ├── BitBucket │ │ ├── BitBucketApi.cs │ │ ├── BitBucketIssueTracker.cs │ │ ├── IBitBucketApi.cs │ │ └── OAuthBase.cs │ ├── GitHub │ │ └── GitHubIssueTracker.cs │ ├── IIssueNumberExtractor.cs │ ├── IIssueTracker.cs │ ├── IssueNumberExtractor.cs │ ├── IssueTracker.cs │ ├── IssueType.cs │ ├── Jira │ │ ├── IJiraApi.cs │ │ ├── JiraApi.cs │ │ ├── JiraIssue.cs │ │ └── JiraIssueTracker.cs │ ├── OnlineIssue.cs │ └── YouTrack │ │ ├── IYouTrackApi.cs │ │ ├── YouTrackApi.cs │ │ └── YouTrackIssueTracker.cs │ ├── Logging │ ├── ConsoleLog.cs │ ├── CustomLog.cs │ └── ILog.cs │ ├── Program.cs │ ├── Properties │ └── AssemblyInfo.cs │ ├── ReleaseDiffInfo.cs │ ├── ReleaseFinder.cs │ ├── ReleaseInfo.cs │ ├── ReleaseNoteItem.cs │ ├── ReleaseNoteLine.cs │ ├── ReleaseNotesGenerator.cs │ ├── SemanticRelease.cs │ ├── SemanticReleaseNotes.cs │ └── packages.config └── tools ├── GitHubFlowVersion ├── Args.dll ├── GitHubFlowVersion.exe ├── LibGit2Sharp.dll ├── NativeBinaries │ ├── amd64 │ │ └── git2-65e9dc6.dll │ └── x86 │ │ └── git2-65e9dc6.dll └── install.ps1 ├── MSBuildCommunityTasks ├── MSBuild.Community.Tasks.Targets ├── MSBuild.Community.Tasks.dll ├── MSBuild.Community.Tasks.xml └── MSBuild.Community.Tasks.xsd └── xUnit.net ├── HTML.xslt ├── NUnitXml.xslt ├── xunit.console.clr4.exe ├── xunit.console.clr4.exe.config ├── xunit.console.clr4.x86.exe ├── xunit.console.clr4.x86.exe.config ├── xunit.console.exe ├── xunit.console.exe.config ├── xunit.console.x86.exe ├── xunit.console.x86.exe.config ├── xunit.dll ├── xunit.dll.tdnet ├── xunit.extensions.dll ├── xunit.extensions.xml ├── xunit.gui.clr4.exe ├── xunit.gui.clr4.x86.exe ├── xunit.gui.exe ├── xunit.gui.x86.exe ├── xunit.installer.exe ├── xunit.runner.msbuild.dll ├── xunit.runner.tdnet.dll ├── xunit.runner.utility.dll ├── xunit.runner.utility.xml └── xunit.xml /.gitattributes: -------------------------------------------------------------------------------- 1 | ############################################################################### 2 | # Set default behavior to automatically normalize line endings. 3 | ############################################################################### 4 | * text=auto 5 | 6 | ############################################################################### 7 | # Set default behavior for command prompt diff. 8 | # 9 | # This is need for earlier builds of msysgit that does not have it on by 10 | # default for csharp files. 11 | # Note: This is only used by command line 12 | ############################################################################### 13 | #*.cs diff=csharp 14 | 15 | ############################################################################### 16 | # Set the merge driver for project and solution files 17 | # 18 | # Merging from the command prompt will add diff markers to the files if there 19 | # are conflicts (Merging from VS is not affected by the settings below, in VS 20 | # the diff markers are never inserted). Diff markers may cause the following 21 | # file extensions to fail to load in VS. An alternative would be to treat 22 | # these files as binary and thus will always conflict and require user 23 | # intervention with every merge. To do so, just uncomment the entries below 24 | ############################################################################### 25 | #*.sln merge=binary 26 | #*.csproj merge=binary 27 | #*.vbproj merge=binary 28 | #*.vcxproj merge=binary 29 | #*.vcproj merge=binary 30 | #*.dbproj merge=binary 31 | #*.fsproj merge=binary 32 | #*.lsproj merge=binary 33 | #*.wixproj merge=binary 34 | #*.modelproj merge=binary 35 | #*.sqlproj merge=binary 36 | #*.wwaproj merge=binary 37 | 38 | ############################################################################### 39 | # behavior for image files 40 | # 41 | # image files are treated as binary by default. 42 | ############################################################################### 43 | #*.jpg binary 44 | #*.png binary 45 | #*.gif binary 46 | *.approved.txt binary 47 | 48 | ############################################################################### 49 | # diff behavior for common document formats 50 | # 51 | # Convert binary document formats to text before diffing them. This feature 52 | # is only available from the command line. Turn it on by uncommenting the 53 | # entries below. 54 | ############################################################################### 55 | #*.doc diff=astextplain 56 | #*.DOC diff=astextplain 57 | #*.docx diff=astextplain 58 | #*.DOCX diff=astextplain 59 | #*.dot diff=astextplain 60 | #*.DOT diff=astextplain 61 | #*.pdf diff=astextplain 62 | #*.PDF diff=astextplain 63 | #*.rtf diff=astextplain 64 | #*.RTF diff=astextplain 65 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Build Folders (you can keep bin if you'd like, to store dlls and pdbs) 2 | [Bb]in/ 3 | [Oo]bj/ 4 | 5 | # mstest test results 6 | TestResults 7 | 8 | ## Ignore Visual Studio temporary files, build results, and 9 | ## files generated by popular Visual Studio add-ons. 10 | 11 | # User-specific files 12 | *.suo 13 | *.user 14 | *.sln.docstates 15 | 16 | # Build results 17 | [Dd]ebug/ 18 | [Rr]elease/ 19 | x64/ 20 | *_i.c 21 | *_p.c 22 | *.ilk 23 | *.meta 24 | *.obj 25 | *.pch 26 | *.pdb 27 | *.pgc 28 | *.pgd 29 | *.rsp 30 | *.sbr 31 | *.tlb 32 | *.tli 33 | *.tlh 34 | *.tmp 35 | *.log 36 | *.vspscc 37 | *.vssscc 38 | .builds 39 | 40 | # Visual C++ cache files 41 | ipch/ 42 | *.aps 43 | *.ncb 44 | *.opensdf 45 | *.sdf 46 | 47 | # Visual Studio profiler 48 | *.psess 49 | *.vsp 50 | *.vspx 51 | 52 | # Guidance Automation Toolkit 53 | *.gpState 54 | 55 | # ReSharper is a .NET coding add-in 56 | _ReSharper* 57 | 58 | # NCrunch 59 | *.ncrunch* 60 | .*crunch*.local.xml 61 | 62 | # Installshield output folder 63 | [Ee]xpress 64 | 65 | # DocProject is a documentation generator add-in 66 | DocProject/buildhelp/ 67 | DocProject/Help/*.HxT 68 | DocProject/Help/*.HxC 69 | DocProject/Help/*.hhc 70 | DocProject/Help/*.hhk 71 | DocProject/Help/*.hhp 72 | DocProject/Help/Html2 73 | DocProject/Help/html 74 | 75 | # Click-Once directory 76 | publish 77 | 78 | # Publish Web Output 79 | *.Publish.xml 80 | 81 | # NuGet Packages Directory 82 | packages 83 | 84 | # Windows Azure Build Output 85 | csx 86 | *.build.csdef 87 | 88 | # Windows Store app package directory 89 | AppPackages/ 90 | 91 | # Others 92 | [Bb]in 93 | [Oo]bj 94 | sql 95 | TestResults 96 | [Tt]est[Rr]esult* 97 | *.Cache 98 | ClientBin 99 | [Ss]tyle[Cc]op.* 100 | ~$* 101 | *.dbmdl 102 | Generated_Code #added for RIA/Silverlight projects 103 | 104 | # Backup & report files from converting an old project file to a newer 105 | # Visual Studio version. Backup files are not needed, because we have git ;-) 106 | _UpgradeReport_Files/ 107 | Backup*/ 108 | UpgradeLog*.XML 109 | build/ 110 | src/GitReleaseNotes.sln.ide/graph 111 | *.orig 112 | src/_NCrunch_GitReleaseNotes 113 | *.received.txt 114 | src/GitReleaseNotes.sln.ide/ 115 | *.GhostDoc.xml 116 | -------------------------------------------------------------------------------- /Build.cmd: -------------------------------------------------------------------------------- 1 | @ECHO OFF 2 | 3 | %~dp0src\.nuget\nuget.exe restore %~dp0src\GitReleaseNotes.sln 4 | 5 | 6 | %~dp0tools\GitHubFlowVersion\GitHubFlowVersion.exe /ProjectFile %~dp0GitReleaseNotes.proj /Targets Build;Package 7 | 8 | IF NOT ERRORLEVEL 0 EXIT /B %ERRORLEVEL% 9 | 10 | pause -------------------------------------------------------------------------------- /Chocolatey/GitReleaseNotes.nuspec: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | GitReleaseNotes 5 | GitReleaseNotes 6 | __version__ 7 | Jake Ginnivan 8 | Jake Ginnivan 9 | GitReleaseNotes 10 | GitReleaseNotes generates release notes for any Git repository 11 | https://github.com/JakeGinnivan/GitReleaseNotes 12 | GitReleaseNotes, Release Notes, Jira, GitHub, YouTrack, Git 13 | https://github.com/JakeGinnivan/GitReleaseNotes/blob/master/LICENSE 14 | false 15 | https://github.com/JakeGinnivan/GitReleaseNotes/releases 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /Chocolatey/tools/chocolateyInstall.ps1: -------------------------------------------------------------------------------- 1 | $packageName = 'GitReleaseNotes' 2 | $version = '__version__' 3 | $url = 'https://github.com/JakeGinnivan/GitReleaseNotes/releases/download/__version__/GitReleaseNotes.__version__.zip' 4 | $validExitCodes = @(0) 5 | 6 | Install-ChocolateyZipPackage "$packageName" "$url" "$(Split-Path -parent $MyInvocation.MyCommand.Definition)" -------------------------------------------------------------------------------- /GitReleaseNotes.nuspec: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | GitReleaseNotes 5 | $version$ 6 | JakeGinnivan 7 | JakeGinnivan 8 | https://github.com/JakeGinnivan/GitReleaseNotes/blob/master/LICENSE 9 | https://github.com/JakeGinnivan/GitReleaseNotes 10 | false 11 | The easy way to generate release notes for your Git projects 12 | Initial release 13 | Copyright Jake Ginnivan 2015 14 | Release notes generate github git 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /GitReleaseNotes.proj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | $(MSBuildProjectDirectory)\ 5 | Any CPU 6 | Debug 7 | $(Root)tools\MSBuildCommunityTasks\ 8 | $(Root)src\GitReleaseNotes\bin\$(Configuration)\ 9 | $(Root)build\Artifacts\ 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 78 | 79 | 80 | 82 | 84 | 85 | 89 | 90 | 94 | 95 | 96 | 97 | 99 | 101 | 102 | 103 | 104 | 105 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2013 Jake Ginnivan 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | this software and associated documentation files (the "Software"), to deal in 7 | the Software without restriction, including without limitation the rights to 8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software is furnished to do so, 10 | subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 17 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 18 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | -------------------------------------------------------------------------------- /NextVersion.txt: -------------------------------------------------------------------------------- 1 | 0.6.0 -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | GitReleaseNotes 2 | ============== 3 | 4 | [![Join the chat at https://gitter.im/GitTools/GitReleaseNotes](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/GitTools/GitReleaseNotes?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) 5 | 6 | Utility which makes it really easy to generate release notes for your Git project. Works with GitHub, Jira and YouTrack. TFS Support coming soon 7 | 8 | Have a look at the release notes in this Repo for a sample of what is generated by GitReleaseNotes 9 | 10 | ## Install 11 | 12 | cinst GitReleaseNotes 13 | 14 | This will use [Chocolatey](http://chocolatey.org) to install GitReleaseNotes into your %path%, ready to be used for any project 15 | 16 | ## Usage 17 | GitReleaseNotes must be run inside a git repository. 18 | 19 | GitReleaseNotes.exe /OutputFile ReleaseNotes.md 20 | 21 | This will write `ReleaseNotes.md` into the root of your repo, the release notes are generated by: 22 | 23 | - Use the git remote to connect to your issue tracker (if possible, i.e issue tracker is GitHub) 24 | - Otherwise specify the issue tracker on the command line (`/IssueTracker Jira /JiraServer MyJiraServer` as well as project name, check `/?` for more info) 25 | - Find closed issues since the last release and generate your release notes 26 | - Use /allTags to generate complete release notes for all releases 27 | - If the release notes are already generated, GitReleaseNotes will *append* **new** closed issues to your release notes, meaning all custom edits will be retained 28 | - Writes out the release notes following [SemanticReleaseNotes.org](http://www.semanticreleasenotes.org/) 29 | 30 | You can also use GitReleaseNotes to create a GitHub release, and generate the release notes automatically allowing fully automated releases including release notes generation. 31 | 32 | If you use GitHub milestones to manage your releases [GitHubReleaseNotes](https://github.com/Particular/GitHubReleaseNotes) is a similar project. 33 | 34 | ## Versioning a release 35 | [GitVersion](https://github.com/Particular/GitVersion) is another project which can help you generate version numbers and make following Semantic Versions easily 36 | 37 | ## Publishing a release 38 | Initial versions of this tool allowed publishing to GitHub. This has been removed. 39 | 40 | To easily create and publish releases, use one of the following alternatives: 41 | 42 | - GitHub => [GithubReleaseCreator](https://github.com/dazinator/GithubReleaseCreator) or [On NuGet](https://www.nuget.org/packages/GithubReleaseCreator/) 43 | - Jira => [JiraCli](https://github.com/CatenaLogic/JiraCli) 44 | 45 | To use this workflow you should track the current releases release notes in the repo, then on publish just take the file contents as the description with the above tool. -------------------------------------------------------------------------------- /ReleaseNotes.md: -------------------------------------------------------------------------------- 1 | # vNext 2 | 3 | - [#60](https://github.com/JakeGinnivan/GitReleaseNotes/pull/60) - Multiple tags per sha contributed by Marijn van der Zee ([serra](https://github.com/serra)) 4 | - [#59](https://github.com/JakeGinnivan/GitReleaseNotes/issues/59) - When a commit is tagged more than once, we get an unhandled exception 5 | - [#58](https://github.com/JakeGinnivan/GitReleaseNotes/issues/58) - System.AggregateException when trying to /Publish 6 | - [#57](https://github.com/JakeGinnivan/GitReleaseNotes/pull/57) - Initial BitBucket implementation. contributed by Mitja Bezenšek ([MitjaBezensek](https://github.com/MitjaBezensek)) 7 | - [#56](https://github.com/JakeGinnivan/GitReleaseNotes/pull/56) - Improved logging in JiraIssueTracker and YouTrackIssueTracker. contributed by Mitja Bezenšek ([MitjaBezensek](https://github.com/MitjaBezensek)) 8 | - [#52](https://github.com/JakeGinnivan/GitReleaseNotes/issues/52) - Use Costura 9 | - [#51](https://github.com/JakeGinnivan/GitReleaseNotes/issues/51) - FieldAccessException when parsing JIRA results 10 | - [#50](https://github.com/JakeGinnivan/GitReleaseNotes/issues/50) - Default JQL will not work on default JIRA instances +fix 11 | - [#49](https://github.com/JakeGinnivan/GitReleaseNotes/issues/49) - Readme is outdated for Jira setup 12 | - [#46](https://github.com/JakeGinnivan/GitReleaseNotes/issues/46) - Not able to install 13 | - [#16](https://github.com/JakeGinnivan/GitReleaseNotes/issues/16) - BitBucket Support 14 | 15 | Commits: [eddb6c086d...e325f92485](https://github.com/JakeGinnivan/GitReleaseNotes/compare/eddb6c086d...e325f92485) 16 | 17 | 18 | # 0.4.0 (25 May 2014) 19 | 20 | - [#35](https://github.com/JakeGinnivan/GitReleaseNotes/pull/35) - When specifying 'FromTag all' the issues closed for the first tag aren't included contributed by Petrik van der Velde ([pvandervelde](https://github.com/pvandervelde)) 21 | - [#34](https://github.com/JakeGinnivan/GitReleaseNotes/issues/34) - When FromTag is not specified, everything is included +fix 22 | 23 | Commits: 3cb3104f89...ae4bda5b0b 24 | 25 | 26 | # 0.3.2 (14 May 2014) 27 | 28 | - [#32](https://github.com/JakeGinnivan/GitReleaseNotes/issues/32) - Create chocolatey package +enhancement 29 | 30 | Commits: ede074b3f5...ede074b3f5 31 | 32 | 33 | # 0.3.1 (12 May 2014) 34 | 35 | - [#31](https://github.com/JakeGinnivan/GitReleaseNotes/issues/31) - Put issue number at the start of issue 36 | 37 | Commits: ca625a6a6d...a2a26ab1fa 38 | 39 | 40 | # 0.3.0 (11 May 2014) 41 | 42 | - [#30](https://github.com/JakeGinnivan/GitReleaseNotes/pull/30) - Fixed issues noted in #29 contributed by Petrik van der Velde ([pvandervelde](https://github.com/pvandervelde)) 43 | - [#29](https://github.com/JakeGinnivan/GitReleaseNotes/pull/29) - Add YouTrack support contributed by Petrik van der Velde ([pvandervelde](https://github.com/pvandervelde)) 44 | - [#27](https://github.com/JakeGinnivan/GitReleaseNotes/pull/27) - Fixing typo in the description for the FromTag command line argument. contributed by Petrik van der Velde ([pvandervelde](https://github.com/pvandervelde)) 45 | - [#26](https://github.com/JakeGinnivan/GitReleaseNotes/issues/26) - Add shoutouts 46 | - [#25](https://github.com/JakeGinnivan/GitReleaseNotes/pull/25) - Allow providing version for vNext contributed by Petrik van der Velde ([pvandervelde](https://github.com/pvandervelde)) 47 | - [#23](https://github.com/JakeGinnivan/GitReleaseNotes/issues/23) - Release note for multiple tags has earliest at the top instead of bottom 48 | - [#22](https://github.com/JakeGinnivan/GitReleaseNotes/issues/22) - Search Pull Requests for issues numbers +enhancement 49 | - [#21](https://github.com/JakeGinnivan/GitReleaseNotes/issues/21) - Error finding OctoKit when downloading via NuGet +fix 50 | - [#20](https://github.com/JakeGinnivan/GitReleaseNotes/issues/20) - Pull Request issues should not be included +fix 51 | 52 | Commits: 53b8cbadf8...c6acc9ed6f 53 | 54 | 55 | # 0.2.0 (17 December 2013) 56 | 57 | - [#18](https://github.com/JakeGinnivan/GitReleaseNotes/pull/18) - Added support for Jira fixing #14 58 | - [#11](https://github.com/JakeGinnivan/GitReleaseNotes/pull/11) - Publish contributed 59 | - [#8](https://github.com/JakeGinnivan/GitReleaseNotes/issues/8) - Release headings +enhancement 60 | - [#5](https://github.com/JakeGinnivan/GitReleaseNotes/issues/5) - Create release on GitHub +enhancement 61 | 62 | Commits: 65bb541b38...d53d68f4c9 63 | 64 | 65 | # 0.1.0 (09 December 2013) 66 | 67 | - [#7](https://github.com/JakeGinnivan/GitReleaseNotes/issues/7) - Test issue 68 | - [#4](https://github.com/JakeGinnivan/GitReleaseNotes/issues/4) - Push Tag to remote +enhancement 69 | - [#3](https://github.com/JakeGinnivan/GitReleaseNotes/issues/3) - Tag HEAD with version +enhancement 70 | - [#2](https://github.com/JakeGinnivan/GitReleaseNotes/issues/2) - How to authenticate with GitHub? 71 | - [#1](https://github.com/JakeGinnivan/GitReleaseNotes/issues/1) - Generate Release Notes +enhancement 72 | 73 | Commits: acc16e7af5...8ffca6d042 74 | -------------------------------------------------------------------------------- /src/.nuget/NuGet.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JakeGinnivan/GitReleaseNotes/403e79cd20ec079df0e74ee5e12aa1dae8f88721/src/.nuget/NuGet.exe -------------------------------------------------------------------------------- /src/GitReleaseNotes.Tests/ArgumentTests.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.ComponentModel; 3 | using System.Reflection; 4 | using GitReleaseNotes.IssueTrackers; 5 | using Shouldly; 6 | using Xunit; 7 | 8 | namespace GitReleaseNotes.Tests 9 | { 10 | public class ArgumentTests 11 | { 12 | [Fact] 13 | public void VerifyProviderDescriptions() 14 | { 15 | var propertyInfo = typeof (GitReleaseNotesArguments).GetProperty("IssueTracker"); 16 | var description = propertyInfo.GetCustomAttribute(); 17 | 18 | foreach (IssueTracker issueTracker in Enum.GetValues(typeof(IssueTracker))) 19 | { 20 | description.Description.ShouldContain(issueTracker.ToString()); 21 | } 22 | } 23 | } 24 | } -------------------------------------------------------------------------------- /src/GitReleaseNotes.Tests/CommitGrouperTests.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Globalization; 4 | using System.Linq; 5 | using System.Security.Cryptography; 6 | using System.Text; 7 | using GitReleaseNotes.Git; 8 | using LibGit2Sharp; 9 | using NSubstitute; 10 | using Shouldly; 11 | using Xunit; 12 | 13 | namespace GitReleaseNotes.Tests 14 | { 15 | public class CommitGrouperTests 16 | { 17 | private readonly Dictionary tags; 18 | private readonly IRepository repository; 19 | private readonly Random random; 20 | private DateTimeOffset nextCommitDate; 21 | 22 | public CommitGrouperTests() 23 | { 24 | nextCommitDate = DateTimeOffset.Now; 25 | repository = Substitute.For(); 26 | tags = new Dictionary(); 27 | var tagCollection = Substitute.For(); 28 | tagCollection.GetEnumerator().Returns(c => tags.Select(p => 29 | { 30 | var tag = Substitute.For(); 31 | tag.Target.Returns(p.Key); 32 | tag.Name.Returns(p.Value); 33 | return tag; 34 | }).GetEnumerator()); 35 | repository.Tags.Returns(tagCollection); 36 | random = new Random(); 37 | } 38 | 39 | [Fact] 40 | public void DoesNotIncludeCommitsOlderThanTag() 41 | { 42 | var commit1 = CreateCommit(); 43 | var startTagCommit = CreateCommit(); 44 | var commit3 = CreateCommit(); 45 | SubstituteCommitLog(commit1, startTagCommit, commit3); 46 | var startTag = new TaggedCommit(startTagCommit, "1.0.0"); 47 | 48 | var results = ReleaseFinder.FindReleases(repository, startTag, new ReleaseInfo 49 | { 50 | PreviousReleaseDate = startTagCommit.Author.When 51 | }); 52 | 53 | var firstRelease = results.First(); 54 | firstRelease.PreviousReleaseDate.ShouldBe(startTagCommit.Author.When); 55 | } 56 | 57 | [Fact] 58 | public void GroupsTagsByReleases() 59 | { 60 | var commit1 = CreateCommit(); 61 | var commit2 = CreateCommit(); 62 | var commit3 = CreateCommit(); 63 | var startTagCommit = CreateCommit(); 64 | SubstituteCommitLog(commit1, commit2, commit3, startTagCommit); 65 | tags.Add(commit2, "1.1.0"); 66 | var startTag = new TaggedCommit(startTagCommit, "1.0.0"); 67 | 68 | var results = ReleaseFinder.FindReleases(repository, startTag, new ReleaseInfo()); 69 | 70 | results.Count.ShouldBe(2); 71 | results.ElementAt(0).Name.ShouldBe(null); 72 | results.ElementAt(0).PreviousReleaseDate.ShouldBe(commit2.Author.When); 73 | results.ElementAt(1).Name.ShouldBe("1.1.0"); 74 | results.ElementAt(1).PreviousReleaseDate.ShouldBe(null); 75 | } 76 | 77 | [Fact] 78 | public void GroupsTagsByReleasesIncludesEndDateOfRelease() 79 | { 80 | var commit1 = CreateCommit(); 81 | var commit2 = CreateCommit(); 82 | var commit3 = CreateCommit(); 83 | var startTagCommit = CreateCommit(); 84 | var firstCommit = CreateCommit(); 85 | SubstituteCommitLog(commit1, commit2, commit3, startTagCommit, firstCommit); 86 | tags.Add(commit2, "1.1.0"); 87 | tags.Add(startTagCommit, "1.0.0"); 88 | 89 | var results = ReleaseFinder.FindReleases(repository, null, new ReleaseInfo()); 90 | 91 | results.Count.ShouldBe(3); 92 | results.ElementAt(0).Name.ShouldBe(null); 93 | results.ElementAt(0).When.ShouldBe(null); 94 | results.ElementAt(0).PreviousReleaseDate.ShouldBe(commit2.Author.When); 95 | results.ElementAt(1).When.ShouldBe(commit2.Author.When); 96 | results.ElementAt(1).PreviousReleaseDate.ShouldBe(startTagCommit.Author.When); 97 | results.ElementAt(2).Name.ShouldBe("1.0.0"); 98 | results.ElementAt(2).When.ShouldBe(startTagCommit.Author.When); 99 | results.ElementAt(2).PreviousReleaseDate.ShouldBe(null); 100 | } 101 | 102 | private Commit CreateCommit() 103 | { 104 | var commit = Substitute.For(); 105 | commit.Author.Returns(new Signature("Some Dude", "some@dude.com", nextCommitDate)); 106 | nextCommitDate = nextCommitDate.AddHours(-1); 107 | var randomString = this.random.Next().ToString(CultureInfo.InvariantCulture); 108 | var randomSha1 = SHA1.Create().ComputeHash(Encoding.ASCII.GetBytes(randomString)); 109 | commit.Id.Returns(new ObjectId(randomSha1)); 110 | commit.Sha.Returns(BitConverter.ToString(randomSha1).Replace("-", string.Empty)); 111 | return commit; 112 | } 113 | 114 | private void SubstituteCommitLog(params Commit[] commits) 115 | { 116 | var commitLog = Substitute.For(); 117 | var returnThis = commits.AsEnumerable().GetEnumerator(); 118 | commitLog.GetEnumerator().Returns(returnThis); 119 | repository.Commits.Returns(commitLog); 120 | } 121 | 122 | } 123 | } -------------------------------------------------------------------------------- /src/GitReleaseNotes.Tests/CommitGrouperTestsMultipleTagsPerCommit.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Globalization; 4 | using System.Linq; 5 | using System.Security.Cryptography; 6 | using System.Text; 7 | using LibGit2Sharp; 8 | using NSubstitute; 9 | using Xunit; 10 | 11 | namespace GitReleaseNotes.Tests 12 | { 13 | public class CommitGrouperTestsMultipleTagsPerCommit 14 | { 15 | private readonly List> _tags; 16 | private readonly IRepository _repository; 17 | private readonly Random _random; 18 | private DateTimeOffset _nextCommitDate; 19 | 20 | public CommitGrouperTestsMultipleTagsPerCommit() 21 | { 22 | _nextCommitDate = DateTimeOffset.Now; 23 | _repository = Substitute.For(); 24 | _tags = new List>(); 25 | var tagCollection = Substitute.For(); 26 | tagCollection.GetEnumerator().Returns(c => _tags.Select(p => 27 | { 28 | var tag = Substitute.For(); 29 | tag.Target.Returns(p.Item1); 30 | tag.Name.Returns(p.Item2); 31 | return tag; 32 | }).GetEnumerator()); 33 | _repository.Tags.Returns(tagCollection); 34 | _random = new Random(); 35 | } 36 | 37 | 38 | [Fact] 39 | public void SupportCommitsWithMoreThanOneTag() 40 | { 41 | var commit1 = CreateCommit(); 42 | var commit2 = CreateCommit(); 43 | var commit3 = CreateCommit(); 44 | var startTagCommit = CreateCommit(); 45 | var firstCommit = CreateCommit(); 46 | SubstituteCommitLog(commit1, commit2, commit3, startTagCommit, firstCommit); 47 | _tags.Add(Tuple.Create(commit2, "1.1.0")); 48 | _tags.Add(Tuple.Create(commit2, "second_tag_for_commit2")); 49 | 50 | var results = ReleaseFinder.FindReleases(_repository, null, new ReleaseInfo()); 51 | } 52 | 53 | private Commit CreateCommit() 54 | { 55 | var commit = Substitute.For(); 56 | commit.Author.Returns(new Signature("Some Dude", "some@dude.com", _nextCommitDate)); 57 | _nextCommitDate = _nextCommitDate.AddHours(-1); 58 | var random = _random.Next().ToString(CultureInfo.InvariantCulture); 59 | var randomSha1 = SHA1.Create().ComputeHash(Encoding.ASCII.GetBytes(random)); 60 | commit.Id.Returns(new ObjectId(randomSha1)); 61 | commit.Sha.Returns(BitConverter.ToString(randomSha1).Replace("-", string.Empty)); 62 | return commit; 63 | } 64 | 65 | private void SubstituteCommitLog(params Commit[] commits) 66 | { 67 | var commitLog = Substitute.For(); 68 | var returnThis = commits.AsEnumerable().GetEnumerator(); 69 | commitLog.GetEnumerator().Returns(returnThis); 70 | _repository.Commits.Returns(commitLog); 71 | } 72 | } 73 | } -------------------------------------------------------------------------------- /src/GitReleaseNotes.Tests/IssueTrackers/GitHub/GitHubIssueTrackerTests.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Collections.ObjectModel; 4 | using System.Linq; 5 | using System.Threading.Tasks; 6 | using GitReleaseNotes.IssueTrackers.GitHub; 7 | using LibGit2Sharp; 8 | using NSubstitute; 9 | using Octokit; 10 | using Shouldly; 11 | using Xunit; 12 | 13 | namespace GitReleaseNotes.Tests.IssueTrackers.GitHub 14 | { 15 | public class GitHubIssueTrackerTests 16 | { 17 | private readonly GitReleaseNotesArguments arguments; 18 | private readonly IGitHubClient gitHubClient; 19 | private readonly IIssuesClient issuesClient; 20 | private readonly GitHubIssueTracker sut; 21 | private readonly IRepository repo; 22 | 23 | public GitHubIssueTrackerTests() 24 | { 25 | gitHubClient = Substitute.For(); 26 | issuesClient = Substitute.For(); 27 | gitHubClient.Issue.Returns(issuesClient); 28 | arguments = new GitReleaseNotesArguments 29 | { 30 | Repo = "Org/Repo", 31 | Token = "213" 32 | }; 33 | 34 | var context = arguments.ToContext(); 35 | 36 | repo = Substitute.For(); 37 | repo.Network.Returns(new NetworkEx()); 38 | 39 | sut = new GitHubIssueTracker(repo, () => gitHubClient, context); 40 | } 41 | 42 | [Fact] 43 | public void CreatesReleaseNotesForClosedGitHubIssues() 44 | { 45 | issuesClient 46 | .GetForRepository("Org", "Repo", Arg.Any()) 47 | .Returns(Task.FromResult>(new List 48 | { 49 | new Issue(null, null, 1, ItemState.Closed, "Issue Title", string.Empty, new TestUser("User", "Foo", "http://github.com/name"), 50 | new Collection