├── .gitignore ├── Chocolatey └── GitHubReleaseNotes │ ├── GitHubReleaseNotes.nuspec │ ├── HowTo.md │ ├── ReadMe.md │ ├── _TODO.txt │ ├── generate.linq │ └── tools │ ├── LICENSE.txt │ ├── VERIFICATION.txt │ ├── chocolateyinstall.ps1 │ └── chocolateyuninstall.ps1 ├── Directory.Build.props ├── GenerateReleaseNotes.cmd ├── LICENSE ├── README.md ├── ReleaseNotes.md ├── Wix ├── 1.0.10.0 │ ├── StefHeyenrath.GitHubReleaseNotes.installer.yaml │ ├── StefHeyenrath.GitHubReleaseNotes.locale.en-US.yaml │ └── StefHeyenrath.GitHubReleaseNotes.yaml ├── 1.0.10.1 │ ├── StefHeyenrath.GitHubReleaseNotes.installer.yaml │ ├── StefHeyenrath.GitHubReleaseNotes.locale.en-US.yaml │ └── StefHeyenrath.GitHubReleaseNotes.yaml ├── 1.0.9.0 │ ├── StefHeyenrath.GitHubReleaseNotes.installer.yaml │ ├── StefHeyenrath.GitHubReleaseNotes.locale.en-US.yaml │ └── StefHeyenrath.GitHubReleaseNotes.yaml ├── HowTo.md ├── Setup │ ├── Product.wxs │ └── Setup.wixproj ├── generate files.linq ├── generate guid.linq ├── productGuid.txt └── upgradeGuid.txt ├── examples ├── RamlToOpenApiConverter.md ├── RestEase-Client-Generator.md ├── System.Linq.Dynamic.Core.md ├── System.Linq.Dynamic.Core.txt ├── WireMock.Net.md └── WireMock.Net.txt ├── icon.png └── src ├── GitHubReleaseNotes.Logic ├── Configuration.cs ├── Extensions │ └── RepositoryExtensions.cs ├── Generator.cs ├── GitHubClientFactory.cs ├── GitHubReleaseNotes.Logic.csproj ├── HandleBarsHelper.cs ├── IConfiguration.cs ├── Models │ ├── IssueInfo.cs │ ├── IssuesAndPullRequestsModel.cs │ ├── ReleaseInfo.cs │ └── RepositorySettings.cs ├── RepositoryHelper.cs └── Template.txt ├── GitHubReleaseNotes.NET48 ├── FodyWeavers.xml ├── FodyWeavers.xsd ├── GitHubReleaseNotes.NET48.csproj └── Program.cs ├── GitHubReleaseNotes.sln ├── GitHubReleaseNotes.sln.DotSettings ├── GitHubReleaseNotes ├── ConfigurationParser.cs ├── GitHubReleaseNotes.csproj ├── Program.cs └── SimpleCommandLineParser.cs └── dotnet-githubreleasenotes ├── GitHubReleaseNotes.Tool.csproj ├── Program.cs └── Properties └── launchSettings.json /.gitignore: -------------------------------------------------------------------------------- 1 | ## Ignore Visual Studio temporary files, build results, and 2 | ## files generated by popular Visual Studio add-ons. 3 | ## 4 | ## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore 5 | 6 | # User-specific files 7 | *.suo 8 | *.user 9 | *.userosscache 10 | *.sln.docstates 11 | 12 | # User-specific files (MonoDevelop/Xamarin Studio) 13 | *.userprefs 14 | 15 | # Build results 16 | [Dd]ebug/ 17 | [Dd]ebugPublic/ 18 | [Rr]elease/ 19 | [Rr]eleases/ 20 | x64/ 21 | x86/ 22 | bld/ 23 | [Bb]in/ 24 | [Oo]bj/ 25 | [Ll]og/ 26 | 27 | # Visual Studio 2015/2017 cache/options directory 28 | .vs/ 29 | # Uncomment if you have tasks that create the project's static files in wwwroot 30 | #wwwroot/ 31 | 32 | # Visual Studio 2017 auto generated files 33 | Generated\ Files/ 34 | 35 | # MSTest test Results 36 | [Tt]est[Rr]esult*/ 37 | [Bb]uild[Ll]og.* 38 | 39 | # NUNIT 40 | *.VisualState.xml 41 | TestResult.xml 42 | 43 | # Build Results of an ATL Project 44 | [Dd]ebugPS/ 45 | [Rr]eleasePS/ 46 | dlldata.c 47 | 48 | # Benchmark Results 49 | BenchmarkDotNet.Artifacts/ 50 | 51 | # .NET Core 52 | project.lock.json 53 | project.fragment.lock.json 54 | artifacts/ 55 | **/Properties/launchSettings.json 56 | 57 | # StyleCop 58 | StyleCopReport.xml 59 | 60 | # Files built by Visual Studio 61 | *_i.c 62 | *_p.c 63 | *_i.h 64 | *.ilk 65 | *.meta 66 | *.obj 67 | *.iobj 68 | *.pch 69 | *.pdb 70 | *.ipdb 71 | *.pgc 72 | *.pgd 73 | *.rsp 74 | *.sbr 75 | *.tlb 76 | *.tli 77 | *.tlh 78 | *.tmp 79 | *.tmp_proj 80 | *.log 81 | *.vspscc 82 | *.vssscc 83 | .builds 84 | *.pidb 85 | *.svclog 86 | *.scc 87 | 88 | # Chutzpah Test files 89 | _Chutzpah* 90 | 91 | # Visual C++ cache files 92 | ipch/ 93 | *.aps 94 | *.ncb 95 | *.opendb 96 | *.opensdf 97 | *.sdf 98 | *.cachefile 99 | *.VC.db 100 | *.VC.VC.opendb 101 | 102 | # Visual Studio profiler 103 | *.psess 104 | *.vsp 105 | *.vspx 106 | *.sap 107 | 108 | # Visual Studio Trace Files 109 | *.e2e 110 | 111 | # TFS 2012 Local Workspace 112 | $tf/ 113 | 114 | # Guidance Automation Toolkit 115 | *.gpState 116 | 117 | # ReSharper is a .NET coding add-in 118 | _ReSharper*/ 119 | *.[Rr]e[Ss]harper 120 | *.DotSettings.user 121 | 122 | # JustCode is a .NET coding add-in 123 | .JustCode 124 | 125 | # TeamCity is a build add-in 126 | _TeamCity* 127 | 128 | # DotCover is a Code Coverage Tool 129 | *.dotCover 130 | 131 | # AxoCover is a Code Coverage Tool 132 | .axoCover/* 133 | !.axoCover/settings.json 134 | 135 | # Visual Studio code coverage results 136 | *.coverage 137 | *.coveragexml 138 | 139 | # NCrunch 140 | _NCrunch_* 141 | .*crunch*.local.xml 142 | nCrunchTemp_* 143 | 144 | # MightyMoose 145 | *.mm.* 146 | AutoTest.Net/ 147 | 148 | # Web workbench (sass) 149 | .sass-cache/ 150 | 151 | # Installshield output folder 152 | [Ee]xpress/ 153 | 154 | # DocProject is a documentation generator add-in 155 | DocProject/buildhelp/ 156 | DocProject/Help/*.HxT 157 | DocProject/Help/*.HxC 158 | DocProject/Help/*.hhc 159 | DocProject/Help/*.hhk 160 | DocProject/Help/*.hhp 161 | DocProject/Help/Html2 162 | DocProject/Help/html 163 | 164 | # Click-Once directory 165 | publish/ 166 | 167 | # Publish Web Output 168 | *.[Pp]ublish.xml 169 | *.azurePubxml 170 | # Note: Comment the next line if you want to checkin your web deploy settings, 171 | # but database connection strings (with potential passwords) will be unencrypted 172 | *.pubxml 173 | *.publishproj 174 | 175 | # Microsoft Azure Web App publish settings. Comment the next line if you want to 176 | # checkin your Azure Web App publish settings, but sensitive information contained 177 | # in these scripts will be unencrypted 178 | PublishScripts/ 179 | 180 | # NuGet Packages 181 | *.nupkg 182 | # The packages folder can be ignored because of Package Restore 183 | **/[Pp]ackages/* 184 | # except build/, which is used as an MSBuild target. 185 | !**/[Pp]ackages/build/ 186 | # Uncomment if necessary however generally it will be regenerated when needed 187 | #!**/[Pp]ackages/repositories.config 188 | # NuGet v3's project.json files produces more ignorable files 189 | *.nuget.props 190 | *.nuget.targets 191 | 192 | # Microsoft Azure Build Output 193 | csx/ 194 | *.build.csdef 195 | 196 | # Microsoft Azure Emulator 197 | ecf/ 198 | rcf/ 199 | 200 | # Windows Store app package directories and files 201 | AppPackages/ 202 | BundleArtifacts/ 203 | Package.StoreAssociation.xml 204 | _pkginfo.txt 205 | *.appx 206 | 207 | # Visual Studio cache files 208 | # files ending in .cache can be ignored 209 | *.[Cc]ache 210 | # but keep track of directories ending in .cache 211 | !*.[Cc]ache/ 212 | 213 | # Others 214 | ClientBin/ 215 | ~$* 216 | *~ 217 | *.dbmdl 218 | *.dbproj.schemaview 219 | *.jfm 220 | *.pfx 221 | *.publishsettings 222 | orleans.codegen.cs 223 | 224 | # Including strong name files can present a security risk 225 | # (https://github.com/github/gitignore/pull/2483#issue-259490424) 226 | #*.snk 227 | 228 | # Since there are multiple workflows, uncomment next line to ignore bower_components 229 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) 230 | #bower_components/ 231 | 232 | # RIA/Silverlight projects 233 | Generated_Code/ 234 | 235 | # Backup & report files from converting an old project file 236 | # to a newer Visual Studio version. Backup files are not needed, 237 | # because we have git ;-) 238 | _UpgradeReport_Files/ 239 | Backup*/ 240 | UpgradeLog*.XML 241 | UpgradeLog*.htm 242 | ServiceFabricBackup/ 243 | *.rptproj.bak 244 | 245 | # SQL Server files 246 | *.mdf 247 | *.ldf 248 | *.ndf 249 | 250 | # Business Intelligence projects 251 | *.rdl.data 252 | *.bim.layout 253 | *.bim_*.settings 254 | *.rptproj.rsuser 255 | 256 | # Microsoft Fakes 257 | FakesAssemblies/ 258 | 259 | # GhostDoc plugin setting file 260 | *.GhostDoc.xml 261 | 262 | # Node.js Tools for Visual Studio 263 | .ntvs_analysis.dat 264 | node_modules/ 265 | 266 | # Visual Studio 6 build log 267 | *.plg 268 | 269 | # Visual Studio 6 workspace options file 270 | *.opt 271 | 272 | # Visual Studio 6 auto-generated workspace file (contains which files were open etc.) 273 | *.vbw 274 | 275 | # Visual Studio LightSwitch build output 276 | **/*.HTMLClient/GeneratedArtifacts 277 | **/*.DesktopClient/GeneratedArtifacts 278 | **/*.DesktopClient/ModelManifest.xml 279 | **/*.Server/GeneratedArtifacts 280 | **/*.Server/ModelManifest.xml 281 | _Pvt_Extensions 282 | 283 | # Paket dependency manager 284 | .paket/paket.exe 285 | paket-files/ 286 | 287 | # FAKE - F# Make 288 | .fake/ 289 | 290 | # JetBrains Rider 291 | .idea/ 292 | *.sln.iml 293 | 294 | # CodeRush 295 | .cr/ 296 | 297 | # Python Tools for Visual Studio (PTVS) 298 | __pycache__/ 299 | *.pyc 300 | 301 | # Cake - Uncomment if you are using it 302 | # tools/** 303 | # !tools/packages.config 304 | 305 | # Tabs Studio 306 | *.tss 307 | 308 | # Telerik's JustMock configuration file 309 | *.jmconfig 310 | 311 | # BizTalk build output 312 | *.btp.cs 313 | *.btm.cs 314 | *.odx.cs 315 | *.xsd.cs 316 | 317 | # OpenCover UI analysis results 318 | OpenCover/ 319 | 320 | # Azure Stream Analytics local run output 321 | ASALocalRun/ 322 | 323 | # MSBuild Binary and Structured Log 324 | *.binlog 325 | 326 | # NVidia Nsight GPU debugger configuration file 327 | *.nvuser 328 | 329 | # MFractors (Xamarin productivity tool) working folder 330 | .mfractor/ 331 | -------------------------------------------------------------------------------- /Chocolatey/GitHubReleaseNotes/GitHubReleaseNotes.nuspec: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | githubreleasenotes 26 | 27 | 28 | 29 | 1.0.11.0 30 | 31 | 32 | Stef Heyenrath 33 | 34 | 35 | 36 | 37 | GitHubReleaseNotes 38 | Stef Heyenrath 39 | 40 | https://github.com/StefH/GitHubReleaseNotes 41 | https://raw.githubusercontent.com/StefH/GitHubReleaseNotes/master/icon.png 42 | 2018 - 2024 Stef Heyenrath 43 | 44 | https://raw.githubusercontent.com/StefH/GitHubReleaseNotes/master/LICENSE 45 | 46 | https://github.com/StefH/GitHubReleaseNotes 47 | 48 | 49 | https://github.com/StefH/GitHubReleaseNotes/issues 50 | GitHubReleaseNotes Release ReleaseNotes Notes GitHub Generate Octokit libgit2sharp MarkDown Project 51 | Generate Release Notes from a GitHub project. 52 | Generate Release Notes from a GitHub project. 53 | See ReleaseNotes.md 54 | 55 | 56 | 57 | 65 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | -------------------------------------------------------------------------------- /Chocolatey/GitHubReleaseNotes/HowTo.md: -------------------------------------------------------------------------------- 1 | # HowTo 2 | 3 | ## Update release 4 | - Update Version in `Directory.Build.props` 5 | - Update version in `GitHubReleaseNotes.nuspec` 6 | - Update Version in this file 7 | 8 | ## Build 9 | Build in release mode 10 | 11 | ## Generate VERIFICATION 12 | Use LinqPad on `.\Chocolatey\generate.linq` to generate VERIFICATION.txt 13 | 14 | ## Generate the release-notes 15 | - Update the version in 'GenerateReleaseNotes.cmd' 16 | - Run GenerateReleaseNotes.cmd 17 | 18 | ## Pack 19 | Run as **Administrator**: 20 | ``` cmd 21 | cd .\Chocolatey\GitHubReleaseNotes 22 | choco pack 23 | ``` 24 | 25 | ## Push 26 | Set the api-key (only done once) 27 | ``` cmd 28 | choco apikey --key {KEY} --source https://push.chocolatey.org/ 29 | ``` 30 | 31 | Then push: 32 | ``` cmd 33 | choco push githubreleasenotes.1.0.11.nupkg --source https://push.chocolatey.org/ 34 | ``` -------------------------------------------------------------------------------- /Chocolatey/GitHubReleaseNotes/ReadMe.md: -------------------------------------------------------------------------------- 1 | ## Summary 2 | How do I create packages? See https://chocolatey.org/docs/create-packages 3 | 4 | If you are submitting packages to the community feed (https://chocolatey.org) 5 | always try to ensure you have read, understood and adhere to the create 6 | packages wiki link above. 7 | 8 | ## Automatic Packaging Updates? 9 | Consider making this package an automatic package, for the best 10 | maintainability over time. Read up at https://chocolatey.org/docs/automatic-packages 11 | 12 | ## Shim Generation 13 | Any executables you include in the package or download (but don't call 14 | install against using the built-in functions) will be automatically shimmed. 15 | 16 | This means those executables will automatically be included on the path. 17 | Shim generation runs whether the package is self-contained or uses automation 18 | scripts. 19 | 20 | By default, these are considered console applications. 21 | 22 | If the application is a GUI, you should create an empty file next to the exe 23 | named 'name.exe.gui' e.g. 'bob.exe' would need a file named 'bob.exe.gui'. 24 | See https://chocolatey.org/docs/create-packages#how-do-i-set-up-shims-for-applications-that-have-a-gui 25 | 26 | If you want to ignore the executable, create an empty file next to the exe 27 | named 'name.exe.ignore' e.g. 'bob.exe' would need a file named 28 | 'bob.exe.ignore'. 29 | See https://chocolatey.org/docs/create-packages#how-do-i-exclude-executables-from-getting-shims 30 | 31 | ## Self-Contained? 32 | If you have a self-contained package, you can remove the automation scripts 33 | entirely and just include the executables, they will automatically get shimmed, 34 | which puts them on the path. Ensure you have the legal right to distribute 35 | the application though. See https://chocolatey.org/docs/legal. 36 | 37 | You should read up on the Shim Generation section to familiarize yourself 38 | on what to do with GUI applications and/or ignoring shims. 39 | 40 | ## Automation Scripts 41 | You have a powerful use of Chocolatey, as you are using PowerShell. So you 42 | can do just about anything you need. Choco has some very handy built-in 43 | functions that you can use, these are sometimes called the helpers. 44 | 45 | ### Built-In Functions 46 | https://chocolatey.org/docs/helpers-reference 47 | 48 | A note about a couple: 49 | * Get-BinRoot - this is a horribly named function that doesn't do what new folks think it does. It gets you the 'tools' root, which by default is set to 'c:\tools', not the chocolateyInstall bin folder - see https://chocolatey.org/docs/helpers-get-tools-location 50 | * Install-BinFile - used for non-exe files - executables are automatically shimmed... - see https://chocolatey.org/docs/helpers-install-bin-file 51 | * Uninstall-BinFile - used for non-exe files - executables are automatically shimmed - see https://chocolatey.org/docs/helpers-uninstall-bin-file 52 | 53 | ### Getting package specific information 54 | Use the package parameters pattern - see https://chocolatey.org/docs/how-to-parse-package-parameters-argument 55 | 56 | ### Need to mount an ISO? 57 | https://chocolatey.org/docs/how-to-mount-an-iso-in-chocolatey-package 58 | 59 | ### Environment Variables 60 | Chocolatey makes a number of environment variables available (You can access any of these with $env:TheVariableNameBelow): 61 | 62 | * TEMP/TMP - Overridden to the CacheLocation, but may be the same as the original TEMP folder 63 | * ChocolateyInstall - Top level folder where Chocolatey is installed 64 | * ChocolateyPackageName - The name of the package, equivalent to the `` field in the nuspec (0.9.9+) 65 | * ChocolateyPackageTitle - The title of the package, equivalent to the `` field in the nuspec (0.10.1+) 66 | * ChocolateyPackageVersion - The version of the package, equivalent to the `<version />` field in the nuspec (0.9.9+) 67 | * ChocolateyPackageFolder - The top level location of the package folder - the folder where Chocolatey has downloaded and extracted the NuGet package, typically `C:\ProgramData\chocolatey\lib\packageName`. 68 | 69 | #### Advanced Environment Variables 70 | The following are more advanced settings: 71 | 72 | * ChocolateyPackageParameters - Parameters to use with packaging, not the same as install arguments (which are passed directly to the native installer). Based on `--package-parameters`. (0.9.8.22+) 73 | * CHOCOLATEY_VERSION - The version of Choco you normally see. Use if you are 'lighting' things up based on choco version. (0.9.9+) - Otherwise take a dependency on the specific version you need. 74 | * ChocolateyForceX86 = If available and set to 'true', then user has requested 32bit version. (0.9.9+) - Automatically handled in built in Choco functions. 75 | * OS_PLATFORM - Like Windows, OSX, Linux. (0.9.9+) 76 | * OS_VERSION - The version of OS, like 6.1 something something for Windows. (0.9.9+) 77 | * OS_NAME - The reported name of the OS. (0.9.9+) 78 | * USER_NAME = The user name (0.10.6+) 79 | * USER_DOMAIN = The user domain name (could also be local computer name) (0.10.6+) 80 | * IS_PROCESSELEVATED = Is the process elevated? (0.9.9+) 81 | * IS_SYSTEM = Is the user the system account? (0.10.6+) 82 | * IS_REMOTEDESKTOP = Is the user in a terminal services session? (0.10.6+) 83 | * ChocolateyToolsLocation - formerly 'ChocolateyBinRoot' ('ChocolateyBinRoot' will be removed with Chocolatey v2.0.0), this is where tools being installed outside of Chocolatey packaging will go. (0.9.10+) 84 | 85 | #### Set By Options and Configuration 86 | Some environment variables are set based on options that are passed, configuration and/or features that are turned on: 87 | 88 | * ChocolateyEnvironmentDebug - Was `--debug` passed? If using the built-in PowerShell host, this is always true (but only logs debug messages to console if `--debug` was passed) (0.9.10+) 89 | * ChocolateyEnvironmentVerbose - Was `--verbose` passed? If using the built-in PowerShell host, this is always true (but only logs verbose messages to console if `--verbose` was passed). (0.9.10+) 90 | * ChocolateyForce - Was `--force` passed? (0.9.10+) 91 | * ChocolateyForceX86 - Was `-x86` passed? (CHECK) 92 | * ChocolateyRequestTimeout - How long before a web request will time out. Set by config `webRequestTimeoutSeconds` (CHECK) 93 | * ChocolateyResponseTimeout - How long to wait for a download to complete? Set by config `commandExecutionTimeoutSeconds` (CHECK) 94 | * ChocolateyPowerShellHost - Are we using the built-in PowerShell host? Set by `--use-system-powershell` or the feature `powershellHost` (0.9.10+) 95 | 96 | #### Business Edition Variables 97 | 98 | * ChocolateyInstallArgumentsSensitive - Encrypted arguments passed from command line `--install-arguments-sensitive` that are not logged anywhere. (0.10.1+ and licensed editions 1.6.0+) 99 | * ChocolateyPackageParametersSensitive - Package parameters passed from command line `--package-parameters-senstivite` that are not logged anywhere. (0.10.1+ and licensed editions 1.6.0+) 100 | * ChocolateyLicensedVersion - What version is the licensed edition on? 101 | * ChocolateyLicenseType - What edition / type of the licensed edition is installed? 102 | * USER_CONTEXT - The original user context - different when self-service is used (Licensed v1.10.0+) 103 | 104 | #### Experimental Environment Variables 105 | The following are experimental or use not recommended: 106 | 107 | * OS_IS64BIT = This may not return correctly - it may depend on the process the app is running under (0.9.9+) 108 | * CHOCOLATEY_VERSION_PRODUCT = the version of Choco that may match CHOCOLATEY_VERSION but may be different (0.9.9+) - based on git describe 109 | * IS_ADMIN = Is the user an administrator? But doesn't tell you if the process is elevated. (0.9.9+) 110 | * IS_REMOTE = Is the user in a remote session? (0.10.6+) 111 | 112 | #### Not Useful Or Anti-Pattern If Used 113 | 114 | * ChocolateyInstallOverride = Not for use in package automation scripts. Based on `--override-arguments` being passed. (0.9.9+) 115 | * ChocolateyInstallArguments = The installer arguments meant for the native installer. You should use chocolateyPackageParameters intead. Based on `--install-arguments` being passed. (0.9.9+) 116 | * ChocolateyIgnoreChecksums - Was `--ignore-checksums` passed or the feature `checksumFiles` turned off? (0.9.9.9+) 117 | * ChocolateyAllowEmptyChecksums - Was `--allow-empty-checksums` passed or the feature `allowEmptyChecksums` turned on? (0.10.0+) 118 | * ChocolateyAllowEmptyChecksumsSecure - Was `--allow-empty-checksums-secure` passed or the feature `allowEmptyChecksumsSecure` turned on? (0.10.0+) 119 | * ChocolateyCheckLastExitCode - Should Chocolatey check LASTEXITCODE? Is the feature `scriptsCheckLastExitCode` turned on? (0.10.3+) 120 | * ChocolateyChecksum32 - Was `--download-checksum` passed? (0.10.0+) 121 | * ChocolateyChecksumType32 - Was `--download-checksum-type` passed? (0.10.0+) 122 | * ChocolateyChecksum64 - Was `--download-checksum-x64` passed? (0.10.0)+ 123 | * ChocolateyChecksumType64 - Was `--download-checksum-type-x64` passed? (0.10.0)+ 124 | * ChocolateyPackageExitCode - The exit code of the script that just ran - usually set by `Set-PowerShellExitCode` (CHECK) 125 | * ChocolateyLastPathUpdate - Set by Chocolatey as part of install, but not used for anything in particular in packaging. 126 | * ChocolateyProxyLocation - The explicit proxy location as set in the configuration `proxy` (0.9.9.9+) 127 | * ChocolateyDownloadCache - Use available download cache? Set by `--skip-download-cache`, `--use-download-cache`, or feature `downloadCache` (0.9.10+ and licensed editions 1.1.0+) 128 | * ChocolateyProxyBypassList - Explicitly set locations to ignore in configuration `proxyBypassList` (0.10.4+) 129 | * ChocolateyProxyBypassOnLocal - Should the proxy bypass on local connections? Set based on configuration `proxyBypassOnLocal` (0.10.4+) 130 | * http_proxy - Set by original `http_proxy` passthrough, or same as `ChocolateyProxyLocation` if explicitly set. (0.10.4+) 131 | * https_proxy - Set by original `https_proxy` passthrough, or same as `ChocolateyProxyLocation` if explicitly set. (0.10.4+) 132 | * no_proxy- Set by original `no_proxy` passthrough, or same as `ChocolateyProxyBypassList` if explicitly set. (0.10.4+) 133 | 134 | -------------------------------------------------------------------------------- /Chocolatey/GitHubReleaseNotes/_TODO.txt: -------------------------------------------------------------------------------- 1 | TODO 2 | 3 | 1. Determine Package Use: 4 | 5 | Organization? Internal Use? - You are not subject to distribution 6 | rights when you keep everything internal. Put the binaries directly 7 | into the tools directory (as long as total nupkg size is under 1GB). 8 | When bigger, look to use from a share or download binaries from an 9 | internal location. Embedded binaries makes for the most reliable use 10 | of Chocolatey. Use `$fileLocation` (`$file`/`$file64`) and 11 | `Install-ChocolateyInstallPackage`/`Get-ChocolateyUnzip` in 12 | tools\chocolateyInstall.ps1. 13 | 14 | You can also choose to download from internal urls, see the next 15 | section, but ignore whether you have distribution rights or not, it 16 | doesn't apply. Under no circumstances should download from the 17 | internet, it is completely unreliable. See 18 | https://chocolatey.org/docs/community-packages-disclaimer#organizations 19 | to understand the limitations of a publicly available repository. 20 | 21 | Community Repository? 22 | Have Distribution Rights? 23 | If you are the software vendor OR the software EXPLICITLY allows 24 | redistribution and the total nupkg size will be under 200MB, you 25 | have the option to embed the binaries directly into the package to 26 | provide the most reliable install experience. Put the binaries 27 | directly into the tools folder, use `$fileLocation` (`$file`/ 28 | `$file64`) and `Install-ChocolateyInstallPackage`/ 29 | `Get-ChocolateyUnzip` in tools\chocolateyInstall.ps1. Additionally, 30 | fill out the LICENSE and VERIFICATION file (see 3 below and those 31 | files for specifics). 32 | 33 | NOTE: You can choose to download binaries at runtime, but be sure 34 | the download location will remain stable. See the next section. 35 | 36 | Do Not Have Distribution Rights? 37 | - Note: Packages built this way cannot be 100% reliable, but it's a 38 | constraint of publicly available packages and there is little 39 | that can be done to change that. See 40 | https://chocolatey.org/docs/community-packages-disclaimer#organizations 41 | to better understand the limitations of a publicly available 42 | repository. 43 | Download Location is Publicly Available? 44 | You will need to download the runtime files from their official 45 | location at runtime. Use `$url`/`$url64` and 46 | `Install-ChocolateyPackage`/`Install-ChocolateyZipPackage` in 47 | tools\chocolateyInstall.ps1. 48 | Download Location is Not Publicly Available? 49 | Stop here, you can't push this to the community repository. You 50 | can ask the vendor for permission to embed, then include a PDF of 51 | that signed permission directly in the package. Otherwise you 52 | will need to seek alternate locations to non-publicly host the 53 | package. 54 | Download Location Is Same For All Versions? 55 | You still need to point to those urls, but you may wish to set up 56 | something like Automatic Updater (AU) so that when a new version 57 | of the software becomes available, the new package version 58 | automatically gets pushed up to the community repository. See 59 | https://chocolatey.org/docs/automatic-packages#automatic-updater-au 60 | 61 | 2. Determine Package Type: 62 | 63 | - Installer Package - contains an installer (everything in template is 64 | geared towards this type of package) 65 | - Zip Package - downloads or embeds and unpacks archives, may unpack 66 | and run an installer using `Install-ChocolateyInstallPackage` as a 67 | secondary step. 68 | - Portable Package - Contains runtime binaries (or unpacks them as a 69 | zip package) - cannot require administrative permissions to install 70 | or use 71 | - Config Package - sets config like files, registry keys, etc 72 | - Extension Package - Packages that add PowerShell functions to 73 | Chocolatey - https://chocolatey.org/docs/how-to-create-extensions 74 | - Template Package - Packages that add templates like this for `choco 75 | new -t=name` - https://chocolatey.org/docs/how-to-create-custom-package-templates 76 | - Other - there are other types of packages as well, these are the main 77 | package types seen in the wild 78 | 79 | 3. Fill out the package contents: 80 | 81 | - tools\chocolateyBeforeModify.ps1 - remove if you have no processes 82 | or services to shut down before upgrade/uninstall 83 | - tools\LICENSE.txt / tools\VERIFICATION.txt - Remove if you are not 84 | embedding binaries. Keep and fill out if you are embedding binaries 85 | in the package AND pushing to the community repository, even if you 86 | are the author of software. The file becomes easier to fill out 87 | (does not require changes each version) if you are the software 88 | vendor. If you are building packages for internal use (organization, 89 | etc), you don't need these files as you are not subject to 90 | distribution rights internally. 91 | - tools\chocolateyUninstall.ps1 - remove if autouninstaller can 92 | automatically uninstall and you have nothing additional to do during 93 | uninstall 94 | - Readme.txt - delete this file once you have read over and used 95 | anything you've needed from here 96 | - nuspec - fill this out, then clean out all the comments (you may wish 97 | to leave the headers for the package vs software metadata) 98 | - tools\chocolateyInstall.ps1 - instructions in next section. 99 | 100 | 4. ChocolateyInstall.ps1: 101 | 102 | - For embedded binaries - use `$fileLocation` (`$file`/`$file64`) and 103 | `Install-ChocolateyInstallPackage`/ `Get-ChocolateyUnzip`. 104 | - Downloading binaries at runtime - use `$url`/`$url64` and 105 | `Install-ChocolateyPackage` / `Install-ChocolateyZipPackage`. 106 | - Other needs (creating files, setting registry keys), use regular 107 | PowerShell to do so or see if there is a function already defined: 108 | https://chocolatey.org/docs/helpers-reference 109 | - There may also be functions available in extension packages, see 110 | https://chocolatey.org/packages?q=id%3A.extension for examples and 111 | availability. 112 | - Clean out the comments and sections you are not using. 113 | 114 | 5. Test the package to ensure install/uninstall work appropriately. 115 | There is a test environment you can use for this - 116 | https://github.com/chocolatey/chocolatey-test-environment 117 | 118 | 6. Learn more about Chocolatey packaging - go through the workshop at 119 | https://github.com/ferventcoder/chocolatey-workshop 120 | You will learn about 121 | - General packaging 122 | - Customizing package behavior at runtime (package parameters) 123 | - Extension packages 124 | - Custom packaging templates 125 | - Setting up an internal Chocolatey.Server repository 126 | - Adding and using internal repositories 127 | - Reporting 128 | - Advanced packaging techniques when installers are not friendly to 129 | automation 130 | 131 | 7. Delete this file. 132 | -------------------------------------------------------------------------------- /Chocolatey/GitHubReleaseNotes/generate.linq: -------------------------------------------------------------------------------- 1 | <Query Kind="Statements" /> 2 | 3 | // LinqPad script to generate the `VERIFICATION.txt` file 4 | 5 | // Get the folder where this LinqPad script is located (https://stackoverflow.com/questions/3802779/linqpad-script-directory) 6 | string chocolateyFolder = Path.GetDirectoryName(Util.CurrentQueryPath); 7 | string projectFolder = Path.Combine(chocolateyFolder, "../", "../"); 8 | 9 | var doc = new XmlDocument(); doc.Load(Path.Combine(chocolateyFolder, "GitHubReleaseNotes.nuspec")); 10 | string version = doc["package"]["metadata"]["version"].FirstChild.Value; 11 | string exe = Path.Combine(projectFolder, "src", "GitHubReleaseNotes", "bin", "release", "net8.0", "win-x64", "publish", "GitHubReleaseNotes.exe"); 12 | 13 | string CreateSHA256() 14 | { 15 | var crypt = new System.Security.Cryptography.SHA256Managed(); 16 | var hash = new System.Text.StringBuilder(); 17 | byte[] crypto = crypt.ComputeHash(File.ReadAllBytes(exe)); 18 | foreach (byte theByte in crypto) 19 | { 20 | hash.Append(theByte.ToString("x2")); 21 | } 22 | return hash.ToString().ToUpperInvariant(); 23 | } 24 | 25 | var fi = new FileInfo(exe); 26 | long length = fi.Length; 27 | double lengthInMb = Math.Floor(100.0 * length / (1024 * 1024)) / 100; 28 | string dateModified = fi.LastWriteTime.ToString("yyyy-MM-dd HH:mm"); 29 | 30 | string text = 31 | $@"VERIFICATION 32 | 33 | To verify this package, follow these steps: 34 | 35 | 1] Right click the GitHubReleaseNotes.exe in Windows file explorer and go to the ""Details"" tab and check the following properties: 36 | - File description GitHubReleaseNotes 37 | - Type Application 38 | - File version {version} 39 | - Product name GitHubReleaseNotes 40 | - Product version {version} 41 | - Copyright Stef Heyenrath 42 | - Size {lengthInMb} MB 43 | - Date modified {dateModified} 44 | - Language Language Neutral 45 | - Original filename GitHubReleaseNotes.exe 46 | 47 | 2] Verify the SHA256 from the GitHubReleaseNotes.exe file (7zip can be used for this) 48 | - SHA256 {CreateSHA256()} 49 | 50 | 3] For the changes in this release, see ReleaseNotes.md 51 | 52 | Note that this application is build as a selfcontained .NET 8 executable."; 53 | 54 | File.WriteAllText(Path.Combine(chocolateyFolder, "tools", "VERIFICATION.txt"), text, Encoding.UTF8); 55 | 56 | $"'VERIFICATION.txt' is generated for {version}".Dump(); -------------------------------------------------------------------------------- /Chocolatey/GitHubReleaseNotes/tools/LICENSE.txt: -------------------------------------------------------------------------------- 1 | From: https://raw.githubusercontent.com/StefH/GitHubReleaseNotes/master/LICENSE 2 | 3 | LICENSE 4 | 5 | MIT License 6 | 7 | Copyright (c) 2018-2020 Stef Heyenrath 8 | 9 | Permission is hereby granted, free of charge, to any person obtaining a copy 10 | of this software and associated documentation files (the "Software"), to deal 11 | in the Software without restriction, including without limitation the rights 12 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 13 | copies of the Software, and to permit persons to whom the Software is 14 | furnished to do so, subject to the following conditions: 15 | 16 | The above copyright notice and this permission notice shall be included in all 17 | copies or substantial portions of the Software. 18 | 19 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 20 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 21 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 22 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 23 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 24 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 25 | SOFTWARE. 26 | -------------------------------------------------------------------------------- /Chocolatey/GitHubReleaseNotes/tools/VERIFICATION.txt: -------------------------------------------------------------------------------- 1 | VERIFICATION 2 | 3 | To verify this package, follow these steps: 4 | 5 | 1] Right click the GitHubReleaseNotes.exe in Windows file explorer and go to the "Details" tab and check the following properties: 6 | - File description GitHubReleaseNotes 7 | - Type Application 8 | - File version 1.0.11.0 9 | - Product name GitHubReleaseNotes 10 | - Product version 1.0.11.0 11 | - Copyright Stef Heyenrath 12 | - Size 66,2 MB 13 | - Date modified 2024-03-06 11:56 14 | - Language Language Neutral 15 | - Original filename GitHubReleaseNotes.exe 16 | 17 | 2] Verify the SHA256 from the GitHubReleaseNotes.exe file (7zip can be used for this) 18 | - SHA256 A3E7148CFAAC7ADAEDBDAE3A2EC345038EE3B3B5DF1177B08E8D52BFC30B7447 19 | 20 | 3] For the changes in this release, see ReleaseNotes.md 21 | 22 | Note that this application is build as a selfcontained .NET 8 executable. -------------------------------------------------------------------------------- /Chocolatey/GitHubReleaseNotes/tools/chocolateyinstall.ps1: -------------------------------------------------------------------------------- 1 | Generate-BinFile "ghrn" "$packageFolder\Tools\GitHubReleaseNotes.exe" -------------------------------------------------------------------------------- /Chocolatey/GitHubReleaseNotes/tools/chocolateyuninstall.ps1: -------------------------------------------------------------------------------- 1 | Remove-BinFile "ghrn" "$packageFolder\Tools\GitHubReleaseNotes.exe" -------------------------------------------------------------------------------- /Directory.Build.props: -------------------------------------------------------------------------------- 1 | <Project> 2 | <PropertyGroup> 3 | <MsBuildAllProjects>$(MsBuildAllProjects);$(MsBuildThisFileFullPath)</MsBuildAllProjects> 4 | </PropertyGroup> 5 | 6 | <PropertyGroup> 7 | <Version>1.0.12.0</Version> 8 | <Description>Generate Release Notes from a GitHub project.</Description> 9 | <Summary>Generate Release Notes from a GitHub project.</Summary> 10 | <Authors>Stef Heyenrath</Authors> 11 | <Owners>Stef Heyenrath</Owners> 12 | <Copyright>Stef Heyenrath</Copyright> 13 | <PackageIconUrl>https://raw.githubusercontent.com/StefH/GitHubReleaseNotes/master/icon.png</PackageIconUrl> 14 | <PackageTags>GitHubReleaseNotes;Release;ReleaseNotes;Notes;GitHub;Generate;Octokit;libgit2sharp;MarkDown;Project</PackageTags> 15 | <PackageReleaseNotes>See ReleaseNotes.md</PackageReleaseNotes> 16 | <PackageProjectUrl>https://github.com/StefH/GitHubReleaseNotes</PackageProjectUrl> 17 | <PackageLicenseExpression>MIT</PackageLicenseExpression> 18 | <RepositoryType>git</RepositoryType> 19 | <RepositoryUrl>https://github.com/StefH/GitHubReleaseNotes</RepositoryUrl> 20 | <LangVersion>latest</LangVersion> 21 | <Nullable>enable</Nullable> 22 | </PropertyGroup> 23 | </Project> -------------------------------------------------------------------------------- /GenerateReleaseNotes.cmd: -------------------------------------------------------------------------------- 1 | GitHubReleaseNotes --output ReleaseNotes.md --skip-empty-releases --exclude-labels invalid question doc tip --version 1.0.11.0 -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Stef Heyenrath 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, 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, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # GitHubReleaseNotes 2 | Generate Release Notes from GitHub. 3 | 4 | ## dotnet tool 5 | [![NuGet Badge GitHubReleaseNotes](https://img.shields.io/nuget/v/GitHubReleaseNotes)](https://www.nuget.org/packages/GitHubReleaseNotes) 6 | 7 | ### Installation 8 | ``` cmd 9 | dotnet tool install --global GitHubReleaseNotes 10 | ``` 11 | 12 | ## WinGet 13 | ``` cmd 14 | winget install -e --id StefHeyenrath.GitHubReleaseNotes 15 | ``` 16 | 17 | ## Chocolatey 18 | [![Chocolatey downloads](https://img.shields.io/chocolatey/dt/githubreleasenotes.svg)](https://chocolatey.org/packages/GitHubReleaseNotes) 19 | [![Chocolatey](https://img.shields.io/chocolatey/v/githubreleasenotes.svg)](https://chocolatey.org/packages/GitHubReleaseNotes) 20 | 21 | ### Installation 22 | ``` 23 | choco install GitHubReleaseNotes 24 | ``` 25 | 26 | ## Usage 27 | GitHubReleaseNotes can be run inside a git repository. 28 | ``` 29 | GitHubReleaseNotes --path . --output ReleaseNotes.md --version 1.0.4.17 --language en --skip-empty-releases --exclude-labels question 30 | ``` 31 | 32 | Arguments: 33 | - `--path`: The path from the git repository. If not supplied, the current folder is used. 34 | - `--output`: The location from the generated Release Notes. If not supplied, the output is written to the console. 35 | - `--version`: Define a custom version name for the latest release instead of the value "next". 36 | - `--language`: Provide the language (two letter according to [ISO-639-1](https://en.wikipedia.org/wiki/ISO_639-1)) which is used to format the dates. If not provided, "en" is used. It's also possible to use a value like "system", which takes the current system ui language. 37 | - `--skip-empty-releases`: Define this optional argument to skip writing releases which have no associated Issues or Pull Requests. 38 | - `--template`: Provide a custom Handlebars template instead of the default template to generate the Release Notes. 39 | - `--exclude-labels`: Exclude Issues and Pull Requests which have these labels set. 40 | - `--exclude-labels`: To exclude issues from the generated output, provide a space separated string list from label-names you want to exclude. 41 | - `--token`: Provide the GitHub API token as authentication for connecting to private repositories. **@** 42 | - `--login` and `--password`: Provide the GitHub API login and password as authentication for connecting to private repositories. **@** 43 | 44 | **@** you only can use one authentication method 45 | 46 | ## Output 47 | The generated Release Notes ([Markdown](https://en.wikipedia.org/wiki/Markdown) formatted) will look like: 48 | ``` 49 | # 1.0.4.16 (11 September 2018) 50 | 51 | - [#202](https://github.com/StefH/GitHubReleaseNotes/pull/202) - Update logic PR contributed by [StefH](https://github.com/StefH) 52 | - [#201](https://github.com/StefH/GitHubReleaseNotes/issues/201) - Fix issue abc 53 | ``` 54 | 55 | ## Copyright 56 | 57 | ### Notes 58 | This project is based on [GitTools/GitReleaseNotes](https://github.com/GitTools/GitReleaseNotes). 59 | 60 | ### Dependencies 61 | - [Oktokit](https://github.com/octokit/octokit.net) 62 | - [LibGit2Sharp](https://github.com/aarnott/libgit2sharp) 63 | - [Handlebars.Net](https://github.com/rexm/Handlebars.Net) 64 | - [Fody](https://github.com/Fody/Fody) 65 | - [Fody.Costura](https://github.com/Fody/Costura) 66 | 67 | -------------------------------------------------------------------------------- /ReleaseNotes.md: -------------------------------------------------------------------------------- 1 | # 1.0.10.1 (21 February 2024) 2 | - [#29](https://github.com/StefH/GitHubReleaseNotes/pull/29) - Replace LibGit2Sharp by GitReader [feature] contributed by [StefH](https://github.com/StefH) 3 | 4 | # 1.0.10.0 (15 February 2024) 5 | - [#28](https://github.com/StefH/GitHubReleaseNotes/pull/28) - Convert GitHubReleaseNotes to a .NET 8 self contained executable [feature] contributed by [StefH](https://github.com/StefH) 6 | 7 | # 1.0.9.0 (01 February 2024) 8 | - [#27](https://github.com/StefH/GitHubReleaseNotes/pull/27) - Update method GetAllIssuesAndPullRequestsAsync [feature] contributed by [StefH](https://github.com/StefH) 9 | 10 | # 1.0.8.0 (25 March 2023) 11 | - [#26](https://github.com/StefH/GitHubReleaseNotes/pull/26) - Upgrade to .NET 6 [feature] contributed by [StefH](https://github.com/StefH) 12 | 13 | # 1.0.7.1 (23 June 2021) 14 | - [#20](https://github.com/StefH/GitHubReleaseNotes/pull/20) - Fix version from setup.exe [bug] contributed by [StefH](https://github.com/StefH) 15 | - [#21](https://github.com/StefH/GitHubReleaseNotes/pull/21) - Replace LibGit2Sharp.Portable with latest LibGit2Sharp [bug] contributed by [StefH](https://github.com/StefH) 16 | - [#22](https://github.com/StefH/GitHubReleaseNotes/pull/22) - Update generator for winpkg manifest [bug] contributed by [StefH](https://github.com/StefH) 17 | - [#23](https://github.com/StefH/GitHubReleaseNotes/pull/23) - Fix ManifestVersion [bug] contributed by [StefH](https://github.com/StefH) 18 | - [#18](https://github.com/StefH/GitHubReleaseNotes/issues/18) - Wrong Display Version in Windows [bug] 19 | - [#19](https://github.com/StefH/GitHubReleaseNotes/issues/19) - LibGit2Sharp.Portable is deprecated and has issues running on Linux. [bug] 20 | 21 | # 1.0.7 (20 February 2021) 22 | - [#17](https://github.com/StefH/GitHubReleaseNotes/pull/17) - Fix issue where ssh remote urls don't work [bug] contributed by [jpann](https://github.com/jpann) 23 | - [#16](https://github.com/StefH/GitHubReleaseNotes/issues/16) - String cannot be empty [bug] 24 | 25 | # 1.0.6 (15 November 2020) 26 | - [#14](https://github.com/StefH/GitHubReleaseNotes/pull/14) - Support tag prefix and create dotnet tool contributed by [StefH](https://github.com/StefH) 27 | - [#15](https://github.com/StefH/GitHubReleaseNotes/pull/15) - Add WinGet project contributed by [StefH](https://github.com/StefH) 28 | 29 | # 1.0.5.3 (27 March 2020) 30 | - [#13](https://github.com/StefH/GitHubReleaseNotes/pull/13) - Fixed: "System.InvalidOperationException: Sequence contains no matching element" [bug] contributed by [StefH](https://github.com/StefH) 31 | - [#12](https://github.com/StefH/GitHubReleaseNotes/issues/12) - System.InvalidOperationException: Sequence contains no matching element [bug] 32 | 33 | # 1.0.5.2 (25 December 2019) 34 | - [#11](https://github.com/StefH/GitHubReleaseNotes/pull/11) - Fix file load exception [bug] contributed by [StefH](https://github.com/StefH) 35 | 36 | # 1.0.5.0 (25 December 2019) 37 | - [#8](https://github.com/StefH/GitHubReleaseNotes/pull/8) - Add token and login+password authentication [feature] contributed by [StefH](https://github.com/StefH) 38 | - [#9](https://github.com/StefH/GitHubReleaseNotes/pull/9) - Exclude tags [feature] contributed by [StefH](https://github.com/StefH) 39 | - [#10](https://github.com/StefH/GitHubReleaseNotes/pull/10) - Fix for `-` in project name. [bug] contributed by [StefH](https://github.com/StefH) 40 | 41 | # 1.0.4.0 (21 January 2019) 42 | - [#8](https://github.com/StefH/GitHubReleaseNotes/pull/8) - Add token and login+password authentication [feature] contributed by [StefH](https://github.com/StefH) 43 | 44 | # 1.0.3.0 (18 November 2018) 45 | - [#7](https://github.com/StefH/GitHubReleaseNotes/pull/7) - Add Labels and command-line option to provide your own template [feature] contributed by [StefH](https://github.com/StefH) 46 | - [#6](https://github.com/StefH/GitHubReleaseNotes/issues/6) - Group issues by label 47 | 48 | # 1.0.2.0 (30 October 2018) 49 | - [#5](https://github.com/StefH/GitHubReleaseNotes/pull/5) - Added additional commandline options --version, --language and --skip-empty-releases contributed by [StefH](https://github.com/StefH) 50 | - [#2](https://github.com/StefH/GitHubReleaseNotes/issues/2) - Release notes seems to leave the last merged PR out of the version 51 | 52 | # 1.0.1.0 (29 October 2018) 53 | - [#1](https://github.com/StefH/GitHubReleaseNotes/pull/1) - Chocolatey contributed by [StefH](https://github.com/StefH) 54 | - [#3](https://github.com/StefH/GitHubReleaseNotes/pull/3) - Chocolatey contributed by [StefH](https://github.com/StefH) 55 | - [#4](https://github.com/StefH/GitHubReleaseNotes/pull/4) - Fix for Release Notes seems to leave the last merged PR out of the version contributed by [StefH](https://github.com/StefH) 56 | 57 | -------------------------------------------------------------------------------- /Wix/1.0.10.0/StefHeyenrath.GitHubReleaseNotes.installer.yaml: -------------------------------------------------------------------------------- 1 | # yaml-language-server: $schema=https://aka.ms/winget-manifest.installer.1.6.0.schema.json 2 | 3 | PackageIdentifier: StefHeyenrath.GitHubReleaseNotes 4 | PackageVersion: 1.0.10.0 5 | InstallerType: zip 6 | NestedInstallerType: portable 7 | NestedInstallerFiles: 8 | - RelativeFilePath: GitHubReleaseNotes.exe 9 | ProductCode: '{32249977-C6C1-40ED-B6A8-7084E69A0E7A}' 10 | ReleaseDate: 2024-02-15 11 | AppsAndFeaturesEntries: 12 | - UpgradeCode: '{4E0EDF71-49CA-4113-8EF5-E1518AADE1E1}' 13 | Installers: 14 | - Architecture: x64 15 | InstallerUrl: https://github.com/StefH/GitHubReleaseNotes/releases/download/1.0.10.0/GitHubReleaseNotes.zip 16 | InstallerSha256: FEECBC4839EE530435D6807AA3FE498D51646039CB4C6B433C9FAA41865578B0 17 | ManifestType: installer 18 | ManifestVersion: 1.6.0 -------------------------------------------------------------------------------- /Wix/1.0.10.0/StefHeyenrath.GitHubReleaseNotes.locale.en-US.yaml: -------------------------------------------------------------------------------- 1 | # yaml-language-server: $schema=https://aka.ms/winget-manifest.defaultLocale.1.6.0.schema.json 2 | 3 | PackageIdentifier: StefHeyenrath.GitHubReleaseNotes 4 | PackageVersion: 1.0.10.0 5 | PackageLocale: en-US 6 | Publisher: Stef Heyenrath 7 | PublisherUrl: https://github.com/StefH 8 | PublisherSupportUrl: https://github.com/StefH/GitHubReleaseNotes 9 | PackageName: GitHubReleaseNotes 10 | PackageUrl: https://github.com/StefH/GitHubReleaseNotes 11 | License: MIT 12 | LicenseUrl: https://github.com/StefH/GitHubReleaseNotes/blob/master/LICENSE 13 | ShortDescription: Generate Release Notes in MarkDown format from a GitHub project. 14 | Moniker: githubreleasenotes 15 | Tags: 16 | - changelog 17 | - generate 18 | - github 19 | - markdown 20 | - md 21 | - releasenotes 22 | - tags 23 | ReleaseNotesUrl: https://github.com/StefH/GitHubReleaseNotes/blob/master/ReleaseNotes.md 24 | ManifestType: defaultLocale 25 | ManifestVersion: 1.6.0 -------------------------------------------------------------------------------- /Wix/1.0.10.0/StefHeyenrath.GitHubReleaseNotes.yaml: -------------------------------------------------------------------------------- 1 | # yaml-language-server: $schema=https://aka.ms/winget-manifest.version.1.6.0.schema.json 2 | 3 | PackageIdentifier: StefHeyenrath.GitHubReleaseNotes 4 | PackageVersion: 1.0.10.0 5 | DefaultLocale: en-US 6 | ManifestType: version 7 | ManifestVersion: 1.6.0 -------------------------------------------------------------------------------- /Wix/1.0.10.1/StefHeyenrath.GitHubReleaseNotes.installer.yaml: -------------------------------------------------------------------------------- 1 | # yaml-language-server: $schema=https://aka.ms/winget-manifest.installer.1.6.0.schema.json 2 | 3 | PackageIdentifier: StefHeyenrath.GitHubReleaseNotes 4 | PackageVersion: 1.0.10.1 5 | InstallerType: zip 6 | NestedInstallerType: portable 7 | NestedInstallerFiles: 8 | - RelativeFilePath: GitHubReleaseNotes.exe 9 | ProductCode: '{32249977-C6C1-40ED-B6A8-7084E69A0E7A}' 10 | ReleaseDate: 2024-02-21 11 | AppsAndFeaturesEntries: 12 | - UpgradeCode: '{54DA3D9F-E8A2-401F-A6BE-8133C2E04398}' 13 | Installers: 14 | - Architecture: x64 15 | InstallerUrl: https://github.com/StefH/GitHubReleaseNotes/releases/download/1.0.10.1/GitHubReleaseNotes.zip 16 | InstallerSha256: CE869FBA29CC31E46D9FD87924466B2167F41624F7AA3A6722ECEEDE47D28A7A 17 | ManifestType: installer 18 | ManifestVersion: 1.6.0 -------------------------------------------------------------------------------- /Wix/1.0.10.1/StefHeyenrath.GitHubReleaseNotes.locale.en-US.yaml: -------------------------------------------------------------------------------- 1 | # yaml-language-server: $schema=https://aka.ms/winget-manifest.defaultLocale.1.6.0.schema.json 2 | 3 | PackageIdentifier: StefHeyenrath.GitHubReleaseNotes 4 | PackageVersion: 1.0.10.1 5 | PackageLocale: en-US 6 | Publisher: Stef Heyenrath 7 | PublisherUrl: https://github.com/StefH 8 | PublisherSupportUrl: https://github.com/StefH/GitHubReleaseNotes 9 | PackageName: GitHubReleaseNotes 10 | PackageUrl: https://github.com/StefH/GitHubReleaseNotes 11 | License: MIT 12 | LicenseUrl: https://github.com/StefH/GitHubReleaseNotes/blob/master/LICENSE 13 | ShortDescription: Generate Release Notes in MarkDown format from a GitHub project. 14 | Moniker: githubreleasenotes 15 | Tags: 16 | - changelog 17 | - generate 18 | - github 19 | - markdown 20 | - md 21 | - releasenotes 22 | - tags 23 | ReleaseNotesUrl: https://github.com/StefH/GitHubReleaseNotes/blob/master/ReleaseNotes.md 24 | ManifestType: defaultLocale 25 | ManifestVersion: 1.6.0 -------------------------------------------------------------------------------- /Wix/1.0.10.1/StefHeyenrath.GitHubReleaseNotes.yaml: -------------------------------------------------------------------------------- 1 | # yaml-language-server: $schema=https://aka.ms/winget-manifest.version.1.6.0.schema.json 2 | 3 | PackageIdentifier: StefHeyenrath.GitHubReleaseNotes 4 | PackageVersion: 1.0.10.1 5 | DefaultLocale: en-US 6 | ManifestType: version 7 | ManifestVersion: 1.6.0 -------------------------------------------------------------------------------- /Wix/1.0.9.0/StefHeyenrath.GitHubReleaseNotes.installer.yaml: -------------------------------------------------------------------------------- 1 | # yaml-language-server: $schema=https://aka.ms/winget-manifest.installer.1.5.0.schema.json 2 | 3 | PackageIdentifier: StefHeyenrath.GitHubReleaseNotes 4 | PackageVersion: 1.0.9.0 5 | InstallerType: zip 6 | NestedInstallerType: portable 7 | NestedInstallerFiles: 8 | - RelativeFilePath: GitHubReleaseNotes.exe 9 | ProductCode: '{32249977-C6C1-40ED-B6A8-7084E69A0E7A}' 10 | ReleaseDate: 2024-02-07 11 | AppsAndFeaturesEntries: 12 | - UpgradeCode: '{C6C9F090-5E9F-4E30-B9D1-43238271456F}' 13 | Installers: 14 | - Architecture: x64 15 | InstallerUrl: https://github.com/StefH/GitHubReleaseNotes/releases/download/1.0.9.0/GitHubReleaseNotes.zip 16 | InstallerSha256: 26C3558610A7FBAB818C70560B28DF11636057D8DDFEEF0D11D0001A8729F619 17 | ManifestType: installer 18 | ManifestVersion: 1.5.0 -------------------------------------------------------------------------------- /Wix/1.0.9.0/StefHeyenrath.GitHubReleaseNotes.locale.en-US.yaml: -------------------------------------------------------------------------------- 1 | # yaml-language-server: $schema=https://aka.ms/winget-manifest.defaultLocale.1.5.0.schema.json 2 | 3 | PackageIdentifier: StefHeyenrath.GitHubReleaseNotes 4 | PackageVersion: 1.0.9.0 5 | PackageLocale: en-US 6 | Publisher: Stef Heyenrath 7 | PublisherUrl: https://github.com/StefH 8 | PublisherSupportUrl: https://github.com/StefH/GitHubReleaseNotes 9 | PackageName: GitHubReleaseNotes 10 | PackageUrl: https://github.com/StefH/GitHubReleaseNotes 11 | License: MIT 12 | LicenseUrl: https://github.com/StefH/GitHubReleaseNotes/blob/master/LICENSE 13 | ShortDescription: Generate Release Notes in MarkDown format from a GitHub project. 14 | Moniker: githubreleasenotes 15 | Tags: 16 | - changelog 17 | - generate 18 | - github 19 | - markdown 20 | - md 21 | - releasenotes 22 | - tags 23 | ReleaseNotesUrl: https://github.com/StefH/GitHubReleaseNotes/blob/master/ReleaseNotes.md 24 | ManifestType: defaultLocale 25 | ManifestVersion: 1.5.0 -------------------------------------------------------------------------------- /Wix/1.0.9.0/StefHeyenrath.GitHubReleaseNotes.yaml: -------------------------------------------------------------------------------- 1 | # yaml-language-server: $schema=https://aka.ms/winget-manifest.version.1.5.0.schema.json 2 | 3 | PackageIdentifier: StefHeyenrath.GitHubReleaseNotes 4 | PackageVersion: 1.0.9.0 5 | DefaultLocale: en-US 6 | ManifestType: version 7 | ManifestVersion: 1.5.0 -------------------------------------------------------------------------------- /Wix/HowTo.md: -------------------------------------------------------------------------------- 1 | # HowTo - WinGet 2 | 3 | ## Update release 4 | Do Chocolatey first 5 | 6 | ## Update version 7 | Use LinqPad on `generate guid.linq` to generate the product guid and + update the upgrade guid. 8 | 9 | ## Generate yaml 10 | Use LinqPad on `generate files.linq` to generate the 3 yaml files. 11 | 12 | ## Add yaml 13 | Add the 3 new yaml files to the soluton in the "winget-pkgs" folder 14 | 15 | ## Verify : Validate 16 | Do a `winget validate --manifest <path>` 17 | 18 | ## Upload 19 | Create the new version (tag) and upload 'zip' to https://github.com/StefH/GitHubReleaseNotes/releases 20 | 21 | ## Verify Install + Uninstall 22 | Do a `winget install --manifest <path>` 23 | 24 | Do a `winget uninstall --manifest <path>` 25 | 26 | ## winget-pkgs 27 | Create a PR with the new {version}.yaml in https://github.com/StefH/winget-pkgs 28 | 29 | Use the "." key on GitHub StefH/winget-pkgs to start VS Code and create a folder + add 3 yamls. 30 | 31 | 32 | :memo: `<path>` is the name of the directory containing the manifest you're submitting. 33 | 34 | -------------------------------------------------------------------------------------------------------------------------------- 35 | 36 | # HowTo - WinGet 37 | 38 | ## Build setup 39 | Build setup project 40 | 41 | ## Upload 42 | Upload the wix setup to https://github.com/StefH/GitHubReleaseNotes/releases -------------------------------------------------------------------------------- /Wix/Setup/Product.wxs: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> 3 | <Product Id="32249977-C6C1-40ED-B6A8-7084E69A0E7A" Name="GitHubReleaseNotes" Language="1033" Manufacturer="Stef Heyenrath" Version="1.0.10.1" UpgradeCode="54DA3D9F-E8A2-401F-A6BE-8133C2E04398"> 4 | <Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" /> 5 | <MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." /> 6 | <MediaTemplate EmbedCab="yes" /> 7 | <Feature Id="ProductFeature" Title="GitHubReleaseNotes" Level="1"> 8 | <ComponentGroupRef Id="ProductComponents" /> 9 | </Feature> 10 | </Product> 11 | <Fragment> 12 | <Directory Id="TARGETDIR" Name="SourceDir"> 13 | <Directory Id="ProgramFilesFolder"> 14 | <Directory Id="INSTALLFOLDER" Name="GitHubReleaseNotes" /> 15 | </Directory> 16 | </Directory> 17 | </Fragment> 18 | <Fragment> 19 | <ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER"> 20 | <Component Id="ProductComponent"> 21 | <File Source="$(var.GitHubReleaseNotes.TargetPath)" /> 22 | <Environment Id="PATH" Name="PATH" Value="[INSTALLFOLDER]" Permanent="no" Part="last" Action="set" System="yes" /> 23 | </Component> 24 | </ComponentGroup> 25 | </Fragment> 26 | </Wix> -------------------------------------------------------------------------------- /Wix/Setup/Setup.wixproj: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <Project ToolsVersion="4.0" DefaultTargets="Build" InitialTargets="EnsureWixToolsetInstalled" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 3 | <PropertyGroup> 4 | <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> 5 | <Platform Condition=" '$(Platform)' == '' ">x86</Platform> 6 | <ProductVersion>3.10</ProductVersion> 7 | <ProjectGuid>9456d153-cbdd-470b-9bff-17c145ed9c24</ProjectGuid> 8 | <SchemaVersion>2.0</SchemaVersion> 9 | <OutputName>Setup</OutputName> 10 | <OutputType>Package</OutputType> 11 | <Name>Setup</Name> 12 | </PropertyGroup> 13 | <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' "> 14 | <OutputPath>bin\$(Configuration)\</OutputPath> 15 | <IntermediateOutputPath>obj\$(Configuration)\</IntermediateOutputPath> 16 | <DefineConstants>Debug</DefineConstants> 17 | </PropertyGroup> 18 | <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' "> 19 | <OutputPath>bin\$(Configuration)\</OutputPath> 20 | <IntermediateOutputPath>obj\$(Configuration)\</IntermediateOutputPath> 21 | </PropertyGroup> 22 | <ItemGroup> 23 | <Compile Include="Product.wxs" /> 24 | </ItemGroup> 25 | <ItemGroup> 26 | <ProjectReference Include="..\..\src\GitHubReleaseNotes.NET48\GitHubReleaseNotes.NET48.csproj"> 27 | <Name>GitHubReleaseNotes.NET48</Name> 28 | <Project>{b6269aac-170a-43d0-8b9b-579ded3d9a00}</Project> 29 | <Private>True</Private> 30 | <DoNotHarvest>True</DoNotHarvest> 31 | <RefProjectOutputGroups>Binaries;Content;Satellites</RefProjectOutputGroups> 32 | <RefTargetDir>INSTALLFOLDER</RefTargetDir> 33 | </ProjectReference> 34 | </ItemGroup> 35 | <Import Project="$(WixTargetsPath)" Condition=" '$(WixTargetsPath)' != '' " /> 36 | <Import Project="$(MSBuildExtensionsPath32)\Microsoft\WiX\v3.x\Wix.targets" Condition=" '$(WixTargetsPath)' == '' AND Exists('$(MSBuildExtensionsPath32)\Microsoft\WiX\v3.x\Wix.targets') " /> 37 | <Target Name="EnsureWixToolsetInstalled" Condition=" '$(WixTargetsImported)' != 'true' "> 38 | <Error Text="The WiX Toolset v3.11 (or newer) build tools must be installed to build this project. To download the WiX Toolset, see http://wixtoolset.org/releases/" /> 39 | </Target> 40 | <!-- 41 | To modify your build process, add your task inside one of the targets below and uncomment it. 42 | Other similar extension points exist, see Wix.targets. 43 | <Target Name="BeforeBuild"> 44 | </Target> 45 | <Target Name="AfterBuild"> 46 | </Target> 47 | --> 48 | </Project> -------------------------------------------------------------------------------- /Wix/generate files.linq: -------------------------------------------------------------------------------- 1 | <Query Kind="Statements" /> 2 | 3 | // LINQPad script to generate the `manifest.yaml` files. 4 | 5 | // Get the folder where this LinqPad script is located (https://stackoverflow.com/questions/3802779/linqpad-script-directory) 6 | string folder = Path.GetDirectoryName(Util.CurrentQueryPath); 7 | string chocolateyFolder = Path.Combine(folder, "../", "Chocolatey", "GithubReleaseNotes"); 8 | string projectFolder = Path.Combine(chocolateyFolder, "../", "../"); 9 | 10 | string outputFolder = Path.Combine(projectFolder, "src", "GitHubReleaseNotes", "bin", "release", "net8.0", "win-x64", "publish"); 11 | string exe = Path.Combine(outputFolder, "GitHubReleaseNotes.exe"); 12 | string zip = Path.Combine(outputFolder, "GitHubReleaseNotes.zip"); 13 | 14 | var doc = new XmlDocument(); 15 | doc.Load(Path.Combine(chocolateyFolder, "GitHubReleaseNotes.nuspec")); 16 | 17 | string version = doc["package"]["metadata"]["version"].FirstChild.Value; 18 | // string msi = Path.Combine(folder, "Setup", "bin", "release", "Setup.msi"); 19 | 20 | var fi = new FileInfo(exe); 21 | string dateModified = fi.LastWriteTime.ToString("yyyy-MM-dd"); 22 | 23 | string CreateSHA256() 24 | { 25 | var crypt = new System.Security.Cryptography.SHA256Managed(); 26 | var hash = new System.Text.StringBuilder(); 27 | byte[] crypto = crypt.ComputeHash(File.ReadAllBytes(zip)); 28 | foreach (byte theByte in crypto) 29 | { 30 | hash.Append(theByte.ToString("x2")); 31 | } 32 | return hash.ToString().ToUpperInvariant(); 33 | } 34 | 35 | string productCode = $"{{{File.ReadAllText(Path.Combine(folder, "productGuid.txt"))}}}"; 36 | string upgradeCode = $"{{{File.ReadAllText(Path.Combine(folder, "upgradeGuid.txt"))}}}"; 37 | 38 | // StefHeyenrath.GitHubReleaseNotes.installer.yaml 39 | string installerText = 40 | $@"# yaml-language-server: $schema=https://aka.ms/winget-manifest.installer.1.6.0.schema.json 41 | 42 | PackageIdentifier: StefHeyenrath.GitHubReleaseNotes 43 | PackageVersion: {version} 44 | InstallerType: zip 45 | NestedInstallerType: portable 46 | NestedInstallerFiles: 47 | - RelativeFilePath: GitHubReleaseNotes.exe 48 | ProductCode: '{productCode}' 49 | ReleaseDate: {dateModified} 50 | AppsAndFeaturesEntries: 51 | - UpgradeCode: '{upgradeCode}' 52 | Installers: 53 | - Architecture: x64 54 | InstallerUrl: https://github.com/StefH/GitHubReleaseNotes/releases/download/{version}/GitHubReleaseNotes.zip 55 | InstallerSha256: {CreateSHA256()} 56 | ManifestType: installer 57 | ManifestVersion: 1.6.0"; 58 | 59 | 60 | // StefHeyenrath.GitHubReleaseNotes.locale.en-US.yaml 61 | string defaultLocaleText = 62 | $@"# yaml-language-server: $schema=https://aka.ms/winget-manifest.defaultLocale.1.6.0.schema.json 63 | 64 | PackageIdentifier: StefHeyenrath.GitHubReleaseNotes 65 | PackageVersion: {version} 66 | PackageLocale: en-US 67 | Publisher: Stef Heyenrath 68 | PublisherUrl: https://github.com/StefH 69 | PublisherSupportUrl: https://github.com/StefH/GitHubReleaseNotes 70 | PackageName: GitHubReleaseNotes 71 | PackageUrl: https://github.com/StefH/GitHubReleaseNotes 72 | License: MIT 73 | LicenseUrl: https://github.com/StefH/GitHubReleaseNotes/blob/master/LICENSE 74 | ShortDescription: Generate Release Notes in MarkDown format from a GitHub project. 75 | Moniker: githubreleasenotes 76 | Tags: 77 | - changelog 78 | - generate 79 | - github 80 | - markdown 81 | - md 82 | - releasenotes 83 | - tags 84 | ReleaseNotesUrl: https://github.com/StefH/GitHubReleaseNotes/blob/master/ReleaseNotes.md 85 | ManifestType: defaultLocale 86 | ManifestVersion: 1.6.0"; 87 | 88 | 89 | // StefHeyenrath.GitHubReleaseNotes 90 | string versionText = 91 | $@"# yaml-language-server: $schema=https://aka.ms/winget-manifest.version.1.6.0.schema.json 92 | 93 | PackageIdentifier: StefHeyenrath.GitHubReleaseNotes 94 | PackageVersion: {version} 95 | DefaultLocale: en-US 96 | ManifestType: version 97 | ManifestVersion: 1.6.0"; 98 | 99 | var versionFolder = Path.Combine(folder, version); 100 | Directory.CreateDirectory(versionFolder); 101 | 102 | File.WriteAllText(Path.Combine(versionFolder, @"StefHeyenrath.GitHubReleaseNotes.installer.yaml"), installerText, Encoding.UTF8); 103 | File.WriteAllText(Path.Combine(versionFolder, @"StefHeyenrath.GitHubReleaseNotes.locale.en-US.yaml"), defaultLocaleText, Encoding.UTF8); 104 | File.WriteAllText(Path.Combine(versionFolder, @"StefHeyenrath.GitHubReleaseNotes.yaml"), versionText, Encoding.UTF8); 105 | 106 | $"Manifest yamls are generated for {version}".Dump(); -------------------------------------------------------------------------------- /Wix/generate guid.linq: -------------------------------------------------------------------------------- 1 | <Query Kind="Statements" /> 2 | 3 | // LINQPad script to generate the `product guid`. 4 | 5 | // Get the folder where this LinqPad script is located (https://stackoverflow.com/questions/3802779/linqpad-script-directory) 6 | string wixFolder = Path.GetDirectoryName(Util.CurrentQueryPath); 7 | string setupFolder = Path.Combine(wixFolder, "Setup"); 8 | string productWxsFile = Path.Combine(setupFolder, "Product.wxs"); 9 | 10 | string productCode = "32249977-C6C1-40ED-B6A8-7084E69A0E7A"; 11 | string upgradeCode = Guid.NewGuid().ToString().ToUpperInvariant(); 12 | // string productCode = $"{{{productGuid}}}"; 13 | 14 | // Get version 15 | string chocolateyFolder = Path.Combine(wixFolder, "../", "Chocolatey", "GithubReleaseNotes"); 16 | var specDoc = new XmlDocument(); 17 | specDoc.Load(Path.Combine(chocolateyFolder, "GitHubReleaseNotes.nuspec")); 18 | string version = specDoc["package"]["metadata"]["version"].FirstChild.Value; 19 | 20 | // Define the Wix namespace 21 | XNamespace wixNamespace = "http://schemas.microsoft.com/wix/2006/wi"; 22 | 23 | // Load the XML file 24 | var doc = XDocument.Load(productWxsFile); 25 | 26 | // Find the Product element 27 | var productElement = doc.Descendants(wixNamespace + "Product").Single(); 28 | productElement.Attribute("Id").Value = productCode; 29 | productElement.Attribute("Version").Value = version; 30 | productElement.Attribute("UpgradeCode").Value = upgradeCode; 31 | 32 | // Save the modified XML file 33 | doc.Save(productWxsFile); 34 | 35 | File.WriteAllText(Path.Combine(wixFolder, "productGuid.txt"), productCode); 36 | File.WriteAllText(Path.Combine(wixFolder, "upgradeGuid.txt"), upgradeCode); 37 | 38 | $"ProductGuid and UpgradeGuid generated and saved to folder".Dump(); -------------------------------------------------------------------------------- /Wix/productGuid.txt: -------------------------------------------------------------------------------- 1 | 32249977-C6C1-40ED-B6A8-7084E69A0E7A -------------------------------------------------------------------------------- /Wix/upgradeGuid.txt: -------------------------------------------------------------------------------- 1 | 54DA3D9F-E8A2-401F-A6BE-8133C2E04398 -------------------------------------------------------------------------------- /examples/RamlToOpenApiConverter.md: -------------------------------------------------------------------------------- 1 | # 0.7.0 (15 April 2025) 2 | - [#22](https://github.com/StefH/RamlToOpenApiConverter/pull/22) - Update Microsoft.OpenApi.YamlReader to 2.0.0-preview.16 to support spec version 3.1 [enhancement] contributed by [StefH](https://github.com/StefH) 3 | 4 | # 0.6.1 (04 February 2022) 5 | - [#18](https://github.com/StefH/RamlToOpenApiConverter/pull/18) - Uses statement contributed by [AndresGMD](https://github.com/AndresGMD) 6 | - [#19](https://github.com/StefH/RamlToOpenApiConverter/pull/19) - Fixes contributed by [StefH](https://github.com/StefH) 7 | 8 | # 0.6.0 (11 December 2021) 9 | - [#17](https://github.com/StefH/RamlToOpenApiConverter/pull/17) - Sign Assembly [enhancement] contributed by [StefH](https://github.com/StefH) 10 | 11 | # 0.5.0 (26 November 2021) 12 | - [#16](https://github.com/StefH/RamlToOpenApiConverter/pull/16) - Handling Simple Inherited DataTypes contributed by [mcheguini](https://github.com/mcheguini) 13 | 14 | # 0.4.2 (09 November 2021) 15 | - [#15](https://github.com/StefH/RamlToOpenApiConverter/pull/15) - Add support for !include example.json [enhancement] contributed by [StefH](https://github.com/StefH) 16 | - [#13](https://github.com/StefH/RamlToOpenApiConverter/issues/13) - Problem with including example files using "!include" 17 | 18 | # 0.4.1 (04 November 2021) 19 | - [#11](https://github.com/StefH/RamlToOpenApiConverter/pull/11) - Add handling of "type": "array" [enhancement] contributed by [StefH](https://github.com/StefH) 20 | 21 | # 0.4.0 (03 November 2021) 22 | - [#10](https://github.com/StefH/RamlToOpenApiConverter/pull/10) - Add support for referenced type (e.g. array) [enhancement] contributed by [StefH](https://github.com/StefH) 23 | 24 | # 0.3.0 (03 November 2021) 25 | - [#9](https://github.com/StefH/RamlToOpenApiConverter/pull/9) - Add support for nested !include [enhancement] contributed by [StefH](https://github.com/StefH) 26 | 27 | # 0.2.0 (14 July 2021) 28 | - [#7](https://github.com/StefH/RamlToOpenApiConverter/pull/7) - Upgrade Microsoft.OpenApi.Readers to 1.2.3 [enhancement] contributed by [StefH](https://github.com/StefH) 29 | 30 | # 0.1.1 (16 June 2020) 31 | - [#6](https://github.com/StefH/RamlToOpenApiConverter/pull/6) - Support .NET Framework 4.6 [enhancement] contributed by [StefH](https://github.com/StefH) 32 | 33 | # 0.1.0 (16 June 2020) 34 | - [#5](https://github.com/StefH/RamlToOpenApiConverter/pull/5) - New OpenApiReader (1.2.0) [enhancement] contributed by [StefH](https://github.com/StefH) 35 | 36 | # 0.0.4 (28 February 2020) 37 | - [#4](https://github.com/StefH/RamlToOpenApiConverter/pull/4) - Remove direct dependency to SharpYaml [enhancement] contributed by [StefH](https://github.com/StefH) 38 | 39 | # 0.0.3 (08 February 2020) 40 | - [#3](https://github.com/StefH/RamlToOpenApiConverter/pull/3) - Better Enum support + added Unit-Tests [enhancement] contributed by [StefH](https://github.com/StefH) 41 | 42 | # 0.0.2 (05 February 2020) 43 | - [#1](https://github.com/StefH/RamlToOpenApiConverter/pull/1) - Initial support for tag '!include' [enhancement] contributed by [StefH](https://github.com/StefH) 44 | - [#2](https://github.com/StefH/RamlToOpenApiConverter/pull/2) - Support enums [enhancement] contributed by [StefH](https://github.com/StefH) 45 | 46 | -------------------------------------------------------------------------------- /examples/System.Linq.Dynamic.Core.md: -------------------------------------------------------------------------------- 1 | # v1.2.8 (20 February 2021) 2 | - [#455](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/455) - Ensure action delegate allows call to void methods contributed by [glopesdev](https://github.com/glopesdev) 3 | - [#480](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/480) - Fix DynamicIndex implementation [bug] contributed by [StefH](https://github.com/StefH) 4 | - [#481](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/481) - Xamarin fix Enum [bug] contributed by [StefH](https://github.com/StefH) 5 | - [#484](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/484) - Implement support for anonymous types as dynamic objects [bug] contributed by [hazzik](https://github.com/hazzik) 6 | - [#448](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/448) - Dynamic.DynamicIndex is exposed in the expression [bug] 7 | - [#457](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/457) - Allow use of `as` and `is` on arbitrary expressions, not just the parameter [wontfix] 8 | - [#458](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/458) - Documentation: `Is` and `As` should be documented with the rest of the expression language [documentation] 9 | - [#479](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/479) - Xamarin.Forms - DynamicExpressionParser.ParseLambda fails when comparing enum properties by their int value [bug] 10 | 11 | # v1.2.7 (26 December 2020) 12 | - [#462](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/462) - Add PatchVersion [feature] contributed by [StefH](https://github.com/StefH) 13 | - [#463](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/463) - Add extension method Where<TSource>(...) with LambdaExpression [feature] contributed by [StefH](https://github.com/StefH) 14 | - [#464](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/464) - NullPropagation operator: support nullable DateTime contributed by [StefH](https://github.com/StefH) 15 | - [#466](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/466) - Fix Android issue (Could not load the file 'System.Private.Corelib') [bug] contributed by [StefH](https://github.com/StefH) 16 | - [#467](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/467) - Support 'System.Type' in As, Is, Cast and OfType [feature] contributed by [StefH](https://github.com/StefH) 17 | - [#470](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/470) - Add EF 5 NuGet package [feature] contributed by [StefH](https://github.com/StefH) 18 | - [#424](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/424) - How to GroupBy Nullable DateTime Year? [bug] 19 | - [#459](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/459) - Allow `as` and `is` to use instances of `System.Type` [feature] 20 | - [#465](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/465) - Crash on Android (regression in 1.2.6) [bug] 21 | - [#468](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/468) - net5.0 OrderBy problem [bug] 22 | - [#473](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/473) - Exception in System.Linq.Dynamic.Core.Parser.EnumerationsFromMscorlib after update to 1.2.6 [bug] 23 | 24 | # v1.2.6 (22 November 2020) 25 | - [#443](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/443) - Fix MethodCallExpression when using NullPropagating (np) contributed by [StefH](https://github.com/StefH) 26 | - [#445](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/445) - Add GitHub action for ci build + unit tests contributed by [StefH](https://github.com/StefH) 27 | - [#446](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/446) - Remove MyGet links from Readme.md contributed by [StefH](https://github.com/StefH) 28 | - [#447](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/447) - Fix Unit tests for net452 and net461 contributed by [StefH](https://github.com/StefH) 29 | - [#449](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/449) - Fix DateTime constructor using ticks [bug] contributed by [StefH](https://github.com/StefH) 30 | - [#450](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/450) - Support the enum UriKind [feature] contributed by [StefH](https://github.com/StefH) 31 | - [#284](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/284) - String(Null) raises Ambiguous error [bug] 32 | - [#432](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/432) - Clarify error message when using np with instance methods [bug] 33 | - [#439](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/439) - Question: DateTime constructor using ticks [bug] 34 | - [#442](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/442) - UriKind is not recognized in Uri constructor [bug] 35 | 36 | # v1.2.5 (24 October 2020) 37 | - [#430](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/430) - Documentation: internal links are broken [documentation] 38 | 39 | # v1.2.4 (19 October 2020) 40 | - [#429](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/429) - save contributed by [Lempireqc](https://github.com/Lempireqc) 41 | 42 | # v1.2.3 (11 October 2020) 43 | - [#428](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/428) - Add support for IQueryable.Min and .Max contributed by [gregfullman](https://github.com/gregfullman) 44 | - [#230](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/230) - Request for contribution 45 | - [#403](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/403) - Expression is missing an 'as' clause [bug] 46 | - [#406](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/406) - Expression parameter should be case sensitive 47 | - [#410](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/410) - Methods on type 'JsonElement' are not accessible'. [wontfix] 48 | - [#411](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/411) - Can't apply the library while using reflection emit with dynamic linq 49 | - [#414](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/414) - Contains search in an Enum 50 | - [#416](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/416) - "Target object is not an ExpandoObject" exception being thrown when using GroupBy 51 | - [#417](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/417) - Expression is missing an 'as' clause 52 | - [#418](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/418) - Dynamic is not playing nice with EF+ 53 | - [#420](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/420) - How to set global date format conversion?not used utc 54 | - [#423](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/423) - Produce Dynamic LINQ strings from expression trees 55 | 56 | # v1.2.2 (19 August 2020) 57 | - [#409](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/409) - save contributed by [Lempireqc](https://github.com/Lempireqc) 58 | 59 | # v1.2.1 (08 August 2020) 60 | - [#399](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/399) - Use parameterized names in dynamic query contributed by [ascott18](https://github.com/ascott18) 61 | - [#391](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/391) - SumAsync and CountAsync (maybe more) do not work with EF Core 3.1 62 | - [#404](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/404) - Add support to Max and Min functions 63 | 64 | # v1.2.0 (27 July 2020) 65 | - [#402](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/402) - Ef core 3x support contributed by [JonathanMagnan](https://github.com/JonathanMagnan) 66 | - [#386](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/386) - Question: Generic and Param based Custom Type Methods Support 67 | - [#397](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/397) - Dictionary parameter issue 68 | - [#400](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/400) - [Question] OrderBy does not work with nullable navigation properties 69 | 70 | # v1.1.8 (12 July 2020) 71 | - [#398](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/398) - Just add simple test contributed by [Lempireqc](https://github.com/Lempireqc) 72 | - [#393](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/393) - Generate SQL Server Select Statement from a dynamically created table. 73 | - [#394](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/394) - OrderByDynamic: Value cannot be null. (Parameter 'type') 74 | - [#395](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/395) - SQL between and query 75 | - [#396](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/396) - No property or field 'DynamicFunctions' exists in type 'Log' 76 | 77 | # v1.1.6 (05 July 2020) 78 | - [#384](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/384) - Request: Please implement ContainsKey for dictionary type 79 | 80 | # v1.1.5 (15 June 2020) 81 | - [#390](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/390) - Fixed loading "Microsoft.EntityFrameworkCore.DynamicLinq.DynamicFunctions" [bug] contributed by [StefH](https://github.com/StefH) 82 | - [#388](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/388) - Version from the dll is 0.0.0.0 (microsoft.entityframeworkcore.dynamiclinq) [bug] 83 | 84 | # v1.1.3 (15 June 2020) 85 | - [#315](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/315) - Update Documentation [documentation] 86 | - [#351](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/351) - Case insensitive GroupBy() [feature] 87 | - [#363](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/363) - OrderBy with non-english letters give different ordering result on string vs key selector [feature] 88 | - [#382](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/382) - Call nullable method [bug] 89 | - [#385](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/385) - Select Issue in EFCore 3 Update 90 | 91 | # v1.1.2 (31 May 2020) 92 | - [#380](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/380) - save contributed by [Lempireqc](https://github.com/Lempireqc) 93 | - [#381](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/381) - save contributed by [Lempireqc](https://github.com/Lempireqc) 94 | - [#383](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/383) - Fixed : calling methods which return a nullable [bug] contributed by [StefH](https://github.com/StefH) 95 | - [#378](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/378) - Versioning Issue in Latest NUGET packages [bug] 96 | 97 | # v1.1.1 (14 May 2020) 98 | - [#54](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/54) - Documentation for expression syntax [documentation] 99 | - [#110](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/110) - Complex query, like in ParseLambda_Complex_2, internal could only be used once [wontfix] 100 | 101 | # 1.1.0.0 (25 April 2020) 102 | - [#326](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/326) - Fixes for parsing escaped / quoted strings [bug] contributed by [StefH](https://github.com/StefH) 103 | - [#307](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/307) - Found problem with backslashes parsing [bug] 104 | 105 | # 1.0.24.0 (16 April 2020) 106 | - [#367](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/367) - Azure Pipelines: fix Build (coverlet), use new vmImage and update NuGet dependencies for UnitTests [bug] contributed by [StefH](https://github.com/StefH) 107 | - [#368](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/368) - Support MethodCalls in NullPropagation function : np(...) [feature] contributed by [StefH](https://github.com/StefH) 108 | - [#370](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/370) - Add ValidatedNotNullAttribute (for SonarQube) [refactor] contributed by [StefH](https://github.com/StefH) 109 | - [#366](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/366) - Null propagation cannot be used for primitive type lists (string) [feature] 110 | 111 | # 1.0.23.0 (26 March 2020) 112 | - [#357](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/357) - Prioritize property or field over the type / Fix find for static property or field contributed by [konzen](https://github.com/konzen) 113 | - [#360](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/360) - Support for Blazor webassembly [feature] contributed by [julienGrd](https://github.com/julienGrd) 114 | - [#355](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/355) - Parser issue - NullReferenceException [bug] 115 | - [#358](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/358) - [Blazor webassembly] library not working with linker disabled [feature] 116 | 117 | # 1.0.22.0 (18 March 2020) 118 | - [#352](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/352) - Nested Cosmos Db compatibility contributed by [countincognito](https://github.com/countincognito) 119 | - [#354](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/354) - Fix correctly type cast of nulls (and other constants) contributed by [rockResolve](https://github.com/rockResolve) 120 | - [#339](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/339) - Error creating Null string [bug] 121 | 122 | # 1.0.21.0 (29 February 2020) 123 | - [#340](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/340) - Better error message in case property or field is not present in new() [feature] contributed by [StefH](https://github.com/StefH) 124 | - [#342](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/342) - Fix np(...) logic when default value is supplied [bug] contributed by [StefH](https://github.com/StefH) 125 | - [#343](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/343) - DocFx [feature] contributed by [StefH](https://github.com/StefH) 126 | - [#349](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/349) - Update PagedResult logic [feature] contributed by [StefH](https://github.com/StefH) 127 | - [#353](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/353) - Remove option for 'UseDynamicObjectClassForAnonymousTypes' [bug] contributed by [StefH](https://github.com/StefH) 128 | - [#164](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/164) - Issue: The option `UseDynamicObjectClassForAnonymousTypes` does not work correctly [bug] 129 | - [#337](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/337) - np (NullPropagation) throws NullReferenceException with property on .NET Core 3.1 [bug] 130 | 131 | # 1.0.20.0 (11 January 2020) 132 | - [#262](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/262) - Z.EntityFramework.Classic contributed by [StefH](https://github.com/StefH) 133 | - [#286](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/286) - Do not generate IIF(...) when np(...) is used for a single expression [feature] contributed by [StefH](https://github.com/StefH) 134 | - [#309](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/309) - Null propagation for methods [bug] contributed by [StefH](https://github.com/StefH) 135 | - [#321](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/321) - LongCount contributed by [StefH](https://github.com/StefH) 136 | - [#323](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/323) - ParseNumber using CultureInfo from configuration [feature] contributed by [StefH](https://github.com/StefH) 137 | - [#329](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/329) - Fixed ToDynamicArrayAsync + ToDynamicListAsync (add type) [bug] contributed by [StefH](https://github.com/StefH) 138 | - [#336](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/336) - Add EF3.1 example [feature] contributed by [StefH](https://github.com/StefH) 139 | - [#338](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/338) - Fix np(...) [bug] contributed by [StefH](https://github.com/StefH) 140 | - [#302](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/302) - np (NullPropagation) throws NullReferenceException with methods [bug] 141 | - [#311](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/311) - Please support LongCount() [feature] 142 | - [#320](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/320) - TypeHelper#ParseNumber TryParse does not use InvariantCulture [bug] 143 | - [#327](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/327) - Incorrect ToDynamicListAsync(this IEnumerable source, Type type) and ToDynamicArrayAsync(this IEnumerable source, Type type) behavior [bug] 144 | 145 | # 1.0.19.0 (29 August 2019) 146 | - [#277](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/277) - DateTimeIsParsedAsUTC [feature] contributed by [StefH](https://github.com/StefH) 147 | - [#281](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/281) - Support for AndAlso and OrElse [feature] contributed by [StefH](https://github.com/StefH) 148 | - [#285](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/285) - Fix certain cases where implicit conversions aren't correctly detected when parsing comparison operators [bug] contributed by [alexweav](https://github.com/alexweav) 149 | - [#287](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/287) - Ensure that one-way implicit conversions also work for value types contributed by [alexweav](https://github.com/alexweav) 150 | - [#290](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/290) - Added SumAsync contributed by [wertzui](https://github.com/wertzui) 151 | - [#292](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/292) - Add ConsoleApp using EF6 Effort contributed by [StefH](https://github.com/StefH) 152 | - [#297](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/297) - Fix for #294 contributed by [david-garcia-garcia](https://github.com/david-garcia-garcia) 153 | - [#298](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/298) - Add 'All', 'Average', 'AverageAsync' and update 'Sum' [feature] contributed by [StefH](https://github.com/StefH) 154 | - [#299](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/299) - Add more PredefinedOperatorAliases [feature] contributed by [StefH](https://github.com/StefH) 155 | - [#268](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/268) - Timezone conversion [feature] 156 | - [#279](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/279) - Support .NET Expression string operators (AndAlso & OrElse) [feature] 157 | - [#294](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/294) - Context lost in object initializer [bug] 158 | 159 | # 1.0.18.0 (02 July 2019) 160 | - [#278](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/278) - Nuget System.Linq.Dynamic.Core 1.0.17 - Incorrect version [bug] 161 | 162 | # 1.0.17.0 (14 June 2019) 163 | - [#276](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/276) - op_Compare also for single "equals" token [bug] contributed by [nothrow](https://github.com/nothrow) 164 | 165 | # 1.0.16.0 (06 June 2019) 166 | - [#275](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/275) - Support Enumerations from System Namespace (e.g. StringComparison) [feature] contributed by [StefH](https://github.com/StefH) 167 | 168 | # 1.0.15.0 (20 May 2019) 169 | - [#273](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/273) - Adding support for overloaded op_Equality contributed by [nothrow](https://github.com/nothrow) 170 | - [#272](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/272) - Allow comparing via overloaded equality operator [feature] 171 | 172 | # 1.0.14.0 (14 May 2019) 173 | - [#270](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/270) - Fix for np() opererator for Nullable (e.g. DateTime) contributed by [StefH](https://github.com/StefH) 174 | - [#105](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/105) - Feature: Support for EF Core 2.0's EF.Functions.Like() [feature] 175 | - [#269](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/269) - np() opererator fails for (Nullable) DateTime [bug] 176 | 177 | # 1.0.13.0 (03 May 2019) 178 | - [#264](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/264) - Fix escape characters parsing [bug] contributed by [StefH](https://github.com/StefH) 179 | - [#266](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/266) - Make ExpressionPromoter public + Fix issue with null constant expression compare [bug] contributed by [david-garcia-garcia](https://github.com/david-garcia-garcia) 180 | - [#154](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/154) - Remark: Semantic Versioning... [wontfix] 181 | - [#163](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/163) - Issue: Using escaped strings is not working correctly [bug] 182 | - [#240](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/240) - Question: What is the proper way to construct a dynamic query for EF Core using DateTime or Nullable DateTime? 183 | - [#244](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/244) - Possible to add 'Compare' Extension method [wontfix] 184 | 185 | # 1.0.12.0 (26 March 2019) 186 | - [#260](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/260) - Fix for Nullable Enum filter contributed by [StefH](https://github.com/StefH) 187 | - [#258](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/258) - Filter by enum column with parameters throws exception [bug] 188 | 189 | # 1.0.11.0 (28 February 2019) 190 | - [#249](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/249) - Add support for OfType, Is, As and Cast [feature] contributed by [StefH](https://github.com/StefH) 191 | - [#250](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/250) - Wrap all constant expressions to fix Parameterized SQL (#247) [bug, feature] contributed by [StefH](https://github.com/StefH) 192 | - [#251](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/251) - Add NetCoreApp target & include DefaultDynamicLinqCustomTypeProvider [feature] contributed by [StefH](https://github.com/StefH) 193 | - [#253](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/253) - OfType Function contributed by [StefH](https://github.com/StefH) 194 | - [#254](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/254) - Resolve types by simple name #252 [feature] contributed by [StefH](https://github.com/StefH) 195 | - [#255](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/255) - Fix SonarScanner in build [bug] contributed by [StefH](https://github.com/StefH) 196 | - [#247](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/247) - Parameterized SQL doesn't work for Contains, StartsWith, and EndsWith 197 | - [#248](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/248) - Add IQueryable.OfType support to ExpressionParser. 198 | - [#252](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/252) - Implement ResolveTypesBySimpleName [feature] 199 | 200 | # 1.0.10.1 (05 February 2019) 201 | - [#223](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/223) - Add 'np(...)' Null Propagating function [feature] contributed by [StefH](https://github.com/StefH) 202 | - [#98](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/98) - Feature: Add the "?." operator (null-conditional operator) to support navigation properties with null values [feature] 203 | - [#182](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/182) - Error when navigation property which named "Parent" 204 | - [#243](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/243) - EF Core 2.2 - cannot use Where operator 205 | 206 | # 1.0.9.2 (10 January 2019) 207 | - [#239](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/239) - SingleOrDefaultAsync [feature] contributed by [StefH](https://github.com/StefH) 208 | - [#238](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/238) - Missing SingleOrDefaultAsync for EntityFrameworkCore [feature] 209 | 210 | # 1.0.10.1 (07 January 2019) 211 | - [#210](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/210) - Set up CI with Azure Pipelines contributed by [azure-pipelines[bot]](https://github.com/apps/azure-pipelines) 212 | - [#211](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/211) - ParameterExpressionRenamer contributed by [StefH](https://github.com/StefH) 213 | - [#212](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/212) - Make ExpressionPromoter plugable contributed by [david-garcia-garcia](https://github.com/david-garcia-garcia) 214 | - [#213](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/213) - Generating Parameterized SQL (by sspekinc) contributed by [StefH](https://github.com/StefH) 215 | - [#214](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/214) - UseParameterizedNamesInDynamicQuery=false contributed by [StefH](https://github.com/StefH) 216 | - [#216](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/216) - Add sourcelink contributed by [StefH](https://github.com/StefH) 217 | - [#217](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/217) - Use GitHubReleaseNotes contributed by [StefH](https://github.com/StefH) 218 | - [#218](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/218) - Codecov integration contributed by [StefH](https://github.com/StefH) 219 | - [#221](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/221) - Add docs folder for hosting documentation pages on github. [feature] contributed by [StefH](https://github.com/StefH) 220 | - [#222](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/222) - GenerateConditional will cast to nullable valuetype if needed [feature] contributed by [StefH](https://github.com/StefH) 221 | - [#228](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/228) - Issue215 [bug, feature] contributed by [david-garcia-garcia](https://github.com/david-garcia-garcia) 222 | - [#229](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/229) - Override is linq to objects [feature] contributed by [david-garcia-garcia](https://github.com/david-garcia-garcia) 223 | - [#231](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/231) - Make ParsingConfig mandatory contributed by [StefH](https://github.com/StefH) 224 | - [#237](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/237) - Performance Fix [bug] contributed by [StefH](https://github.com/StefH) 225 | - [#71](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/71) - Issue: Increase code-coverage [feature] 226 | - [#119](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/119) - Feature: How to keep parameter input name of query [feature] 227 | - [#145](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/145) - Question : Performance and 'System.IO.FileNotFoundException' in System.Private.CoreLib.dll 228 | - [#152](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/152) - Multiple assemblies with equivalent identity have been imported 229 | - [#179](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/179) - Feature: Implement SourceLink 230 | - [#184](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/184) - Feature: Generate Parameterized SQL [feature] 231 | - [#204](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/204) - Cannot GroupJoin when source is Linq-To-Entities 232 | - [#209](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/209) - Feature: use Azure Pipelines for building 233 | - [#215](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/215) - Issue: DynamicClassFactory fails to create dynamic type without properties [bug] 234 | - [#234](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/234) - Does this support Json data 235 | - [#236](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/236) - Massive performance hit when upgrading from 1.0.8.18 to 1.0.9 236 | 237 | # 1.0.9.0 (19 October 2018) 238 | - [#208](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/208) - Fix New() support for Type + Fix GroupJoin() not working when using Linq-To-Entities (2) contributed by [StefH](https://github.com/StefH) 239 | - [#136](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/136) - Expressions on dynamic objects 240 | - [#147](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/147) - Question: Making some queries dynamic possible 241 | - [#173](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/173) - Error when trying to access an object declared on another lambda 242 | - [#181](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/181) - Question: QueryValidator 243 | - [#199](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/199) - Feature: Add EvaluateGroupByAtDatabase logic to Join and GroupJoin 244 | - [#203](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/203) - How to query complex entities 245 | - [#205](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/205) - Documentation of supported operations 246 | - [#206](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/206) - Issue: new() expression cannot handle complex types 247 | 248 | # 1.0.8.18 (04 September 2018) 249 | - [#201](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/201) - Fix Parsing Config not passed down to expression parser in JOIN contributed by [david-garcia-garcia](https://github.com/david-garcia-garcia) 250 | - [#165](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/165) - Consider fit the rule of AnonymousTypes for EFCore2.1? [feature] 251 | - [#202](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/202) - Feature: support Explicit cast Operator [feature] 252 | 253 | # 1.0.8.17 (27 August 2018) 254 | - [#200](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/200) - Fix for parsing Guid and string in the same condition contributed by [OlegNadymov](https://github.com/OlegNadymov) 255 | - [#191](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/191) - Feature: re-enable support for uap10 256 | 257 | # 1.0.8.16 (19 August 2018) 258 | - [#198](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/198) - re-enable UAP10 support contributed by [StefH](https://github.com/StefH) 259 | 260 | # 1.0.8.15 (17 August 2018) 261 | - [#197](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/197) - Added EvaluateGroupByAtDatabase For EF Core 2.1 contributed by [StefH](https://github.com/StefH) 262 | 263 | # 1.0.8.14 (14 August 2018) 264 | - [#190](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/190) - Add SonarCloud (#186) contributed by [StefH](https://github.com/StefH) 265 | - [#193](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/193) - Fix for ParseLambda with itType and resultType: correct order of arguments contributed by [OlegNadymov](https://github.com/OlegNadymov) 266 | - [#195](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/195) - Fix the problem with inner double quotes contributed by [OlegNadymov](https://github.com/OlegNadymov) 267 | - [#186](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/186) - Feature: include SonarCloud code checks [feature] 268 | - [#187](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/187) - Add custom static classes for parsing 269 | 270 | # 1.0.8.12 (27 July 2018) 271 | - [#177](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/177) - Feature: Remove built-in references from netstandard2.0 target contributed by [hazzik](https://github.com/hazzik) 272 | - [#189](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/189) - Fix conversion from a non-nullable value type to the nullable value type contributed by [StefH](https://github.com/StefH) 273 | - [#178](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/178) - Question: No generic method 'Contains' on type 'System.Linq.Enumerable 274 | - [#180](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/180) - Question: GroupBy fails for field named SHORT 275 | - [#188](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/188) - Issue: Implicitly conversion from a non-nullable value type to the nullable form of that value type is broken? 276 | 277 | # 1.0.8.11 (06 June 2018) 278 | - [#172](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/172) - Issue: DynamicQueryableExtensions.OrderBy extension method not using ParsingConfig parameter 279 | 280 | # 1.0.8.10 (05 June 2018) 281 | - [#143](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/143) - Question : How to orderby an attribute of a List 282 | - [#170](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/170) - Question: Support to build Expressions besides LambdaExpressions 283 | 284 | # 1.0.8.9 (26 May 2018) 285 | - [#166](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/166) - Feature: Added support for implicit type conversions contributed by [arjenvrh](https://github.com/arjenvrh) 286 | 287 | # 1.0.8.8 (21 May 2018) 288 | - [#168](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/168) - Fixed ConstantExpressionHelper.cs (#167) contributed by [StefH](https://github.com/StefH) 289 | - [#167](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/167) - Issue: Memory leak in `ConstantExpressionHelper.cs` [bug] 290 | 291 | # 1.0.8.7 (09 May 2018) 292 | - [#156](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/156) - Fix parsing config contributed by [jogibear9988](https://github.com/jogibear9988) 293 | 294 | # 1.0.8.6 (28 April 2018) 295 | - [#158](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/158) - Fix157 contributed by [jogibear9988](https://github.com/jogibear9988) 296 | - [#157](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/157) - Issue : SkipWhile Method not found in mono [bug] 297 | - [#161](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/161) - Error (1.0.8.3 to 1.0.8.4 on EF 6.2) "No generic method 'OrderBy' on type System.Linq.Queryable" 298 | 299 | # 1.0.8.4 (25 April 2018) 300 | - [#159](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/159) - Performance fix (#153) contributed by [StefH](https://github.com/StefH) 301 | - [#151](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/151) - Parse Query Syntax like Code 302 | - [#153](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/153) - Issue: Performance while working with EF core 303 | 304 | # 1.0.8.3 (30 March 2018) 305 | - [#137](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/137) - Feature: Add support for querying a IQueryable<dynamic> contributed by [NickDarvey](https://github.com/NickDarvey) 306 | - [#150](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/150) - Feature: Support Binary & For String and Int [feature] contributed by [jogibear9988](https://github.com/jogibear9988) 307 | - [#139](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/139) - Question: How to get related entities only one field 308 | - [#141](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/141) - Question: Is there TryParseLambda 309 | 310 | # 1.0.8.2 (09 January 2018) 311 | - [#138](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/138) - Solved issue 130 contributed by [StefH](https://github.com/StefH) 312 | - [#130](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/130) - BUG: Dynamic new in Where() causes NRE 313 | 314 | # 1.0.8.1 (05 January 2018) 315 | - [#135](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/135) - Add DbGeography to predefined types to allow advanced spatial queries. contributed by [czielin](https://github.com/czielin) 316 | - [#95](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/95) - Has no assembly version number. 317 | - [#126](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/126) - How to make a request with Collate in order to get Accent Insensitive results? 318 | - [#129](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/129) - ToDynamicList/ToDynamicArray cannot actually cast to specified type in .net core 2 [bug] 319 | - [#131](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/131) - Adding LIKE operator for EF6 320 | - [#132](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/132) - System.Linq.Dynamic.Core.Exceptions.ParseException in IQueryable<object> filled with anonymous type 321 | - [#133](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/133) - Possibility to parse an Expression<T, bool> to a valid expression string 322 | - [#134](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/134) - Accessing DbGeography methods/properties 323 | 324 | # 1.0.8.0 (16 December 2017) 325 | - [#127](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/127) - Refactored Parser contributed by [StefH](https://github.com/StefH) 326 | 327 | # 1.0.7.1.13 (29 November 2017) 328 | - [#117](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/117) - New features contributed by [jogibear9988](https://github.com/jogibear9988) 329 | - [#123](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/123) - appveyor contributed by [StefH](https://github.com/StefH) 330 | - [#114](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/114) - Dynamic Linq Query not usable with ORM Provider [bug] 331 | - [#120](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/120) - Error with parsing 332 | - [#122](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/122) - Join with int list 333 | - [#124](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/124) - OrderBy produces error. 334 | - [#125](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/125) - Not compatable with dotnet Core 2. [bug] 335 | 336 | # 1.0.7.1.12 (09 November 2017) 337 | - [#115](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/115) - Dynamic Linq Query not usable with ORM Provider (fix for #114) contributed by [jogibear9988](https://github.com/jogibear9988) 338 | - [#116](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/116) - Bugfix DynamicLinq when using IQueryable contributed by [jogibear9988](https://github.com/jogibear9988) 339 | - [#108](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/108) - [Question] Nullable property inside Join statement 340 | - [#109](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/109) - Not able to build with VS2017 341 | - [#111](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/111) - [Bug] Incorrect Nullable<> parsing [bug] 342 | - [#112](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/112) - Support NETStandard 2.0 [feature] 343 | - [#113](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/113) - .pdb is missing in nuget [bug] 344 | 345 | # 1.0.7.1.10 (27 October 2017) 346 | - [#8](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/8) - Remove useless dependences [feature] contributed by [yyjdelete](https://github.com/yyjdelete) 347 | - [#37](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/37) - Support strings as Enum Parameter Objects contributed by [jogibear9988](https://github.com/jogibear9988) 348 | - [#38](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/38) - Support more comparisons with strings contributed by [jogibear9988](https://github.com/jogibear9988) 349 | - [#39](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/39) - Exception friendly Type loading contributed by [jogibear9988](https://github.com/jogibear9988) 350 | - [#47](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/47) - * Add unit test and fix public methods access. contributed by [jotab123](https://github.com/jotab123) 351 | - [#55](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/55) - Fix Nullable Enums from String contributed by [jogibear9988](https://github.com/jogibear9988) 352 | - [#56](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/56) - Create .editorconfig contributed by [jogibear9988](https://github.com/jogibear9988) 353 | - [#68](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/68) - Work on #66 -> Should work now. Tests will follow on VS2017 support! contributed by [jogibear9988](https://github.com/jogibear9988) 354 | - [#69](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/69) - Fix - when method has object parameter and ValueType value is passed into this method, result is exception in System.Dynamic.Utils.ExpressionUtils.ValidateOneArgument. contributed by [DavidCizek](https://github.com/DavidCizek) 355 | - [#76](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/76) - Fix - shift operators work only for int, short, ushort, byte, sbyte. contributed by [DavidCizek](https://github.com/DavidCizek) 356 | - [#77](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/77) - New features: Hexadecimal integers and array initializers contributed by [DavidCizek](https://github.com/DavidCizek) 357 | - [#78](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/78) - New feature: GroupJoin [feature] contributed by [ghost](https://github.com/ghost) 358 | - [#80](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/80) - [Feature] Usage of cached Lambda Expressions contributed by [jogibear9988](https://github.com/jogibear9988) 359 | - [#85](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/85) - [Fix] Guid? == null comparison contributed by [jogibear9988](https://github.com/jogibear9988) 360 | - [#86](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/86) - [Fix] Fixed null in Parameter and added functionality Binary And and Or with different Types contributed by [jogibear9988](https://github.com/jogibear9988) 361 | - [#92](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/92) - [Feature] Adds support for decimal qualifiers. Resolves #91 contributed by [pferraris](https://github.com/pferraris) 362 | - [#93](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/93) - [Bug] Fix uap10 build in appveyor contributed by [StefH](https://github.com/StefH) 363 | - [#99](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/99) - Added DynamicEnumerable Async extension methods contributed by [StefH](https://github.com/StefH) 364 | - [#100](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/100) - Feature: NullPropagation operator contributed by [StefH](https://github.com/StefH) 365 | - [#103](https://github.com/zzzprojects/System.Linq.Dynamic.Core/pull/103) - support group by with 2 parameters, add tolist contributed by [jogibear9988](https://github.com/jogibear9988) 366 | - [#1](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/1) - SymbolTable.DoesMethodHaveParameterArray throws exception when accessing a dynamic created property 367 | - [#2](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/2) - UnitTest : GroupByAndSelect_TestDynamicSelectMember fails [bug] 368 | - [#3](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/3) - Add "SelectMany" [feature] 369 | - [#4](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/4) - Illegal one-byte branch at position: 9. Requested branch was: 143 370 | - [#5](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/5) - Only parameterless constructors and initializers are supported in LINQ to Entities [bug] 371 | - [#6](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/6) - Add support for dotnet5.4 framework [feature] 372 | - [#7](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/7) - Add SelectMany with resultSelector [feature] 373 | - [#9](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/9) - Add Null-coalescing operator support [feature] 374 | - [#10](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/10) - Support explicit integer qualifiers [feature] 375 | - [#11](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/11) - IN does not support negative and parse of negative integers with qualifiers. [bug] 376 | - [#12](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/12) - parsing negative float or double with qualifier [feature] 377 | - [#13](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/13) - Add isnull sql function "isnull(a, b)" [feature] 378 | - [#14](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/14) - Ampersand can be used both as logical And or as vb-like concatenation operator [feature] 379 | - [#15](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/15) - Add Skip, Take to ExpressionParser [feature] 380 | - [#16](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/16) - Add Paging support [feature] 381 | - [#17](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/17) - Windows 10 uwp support 382 | - [#18](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/18) - SelectMany over an Array throws System.IndexOutOfRangeException [bug] 383 | - [#19](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/19) - NotEqual filter not working with DateTime [bug] 384 | - [#20](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/20) - Can't install using nuget in Asp.Net 4.0 Web Pages project 385 | - [#21](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/21) - Question: why is Distinct not supported? [feature] 386 | - [#22](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/22) - DynamicExpression accessibility [feature] 387 | - [#23](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/23) - Cannot work with property which in base class. [bug] 388 | - [#24](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/24) - FirstOrDefaultAsync method is missing 389 | - [#25](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/25) - DynamicExpression gone in version 1.0.3.4 390 | - [#26](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/26) - Calling ToString on a nullable column throws error 391 | - [#27](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/27) - UWP version 392 | - [#28](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/28) - Dynamic Queries seem to lose "Include()"s 393 | - [#29](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/29) - An another project ? 394 | - [#30](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/30) - Move to .NET Core RTM 395 | - [#31](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/31) - Group by multiple columns? [bug] 396 | - [#32](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/32) - When same dynamic class is first used in Linq2Entities, it's reused for Linq2Sql [bug] 397 | - [#33](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/33) - Package 1.0.6.3 install fails for UWP App [bug] 398 | - [#36](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/36) - CreateClass Equivalent? [feature] 399 | - [#40](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/40) - Add strong naming from library [feature] 400 | - [#42](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/42) - Microsoft.EntityFrameworkCore.DynamicLinq - ToListAsync()? 401 | - [#43](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/43) - Join with dependent subquery? 402 | - [#44](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/44) - Casting a int to a nullable int will throw an error when using linq to entities"Only parameterless constructors and initializers are supported in LINQ to Entities" 403 | - [#45](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/45) - Take() and Skip() lose ElementType [bug] 404 | - [#46](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/46) - Methods on type are not accessible error 405 | - [#48](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/48) - Add an overload to the "ToDynamicList" method which accepts a Type [feature] 406 | - [#49](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/49) - .Contains("") operation Exception 407 | - [#50](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/50) - Add functionality to optimize your queries using Linq.Expression.Optimizer [feature] 408 | - [#51](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/51) - [Question] How can I format a datetime (nullable) field value in select? 409 | - [#52](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/52) - Can I convert int to string type? 410 | - [#57](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/57) - Issue finding indexer [bug] 411 | - [#60](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/60) - Issue with nested Calls 412 | - [#62](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/62) - OrderBy Chaining [bug, feature] 413 | - [#63](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/63) - Syntax IN dont work with Enums 414 | - [#65](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/65) - Support embedded quotes in string literal [feature] 415 | - [#66](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/66) - Is there Way to enter a Complex query 416 | - [#67](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/67) - Convert Project to VS2017 [feature] 417 | - [#70](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/70) - Move all tests into 1 test project [feature] 418 | - [#72](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/72) - [Bug] Re-enable support for uap10.0 [bug] 419 | - [#73](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/73) - [Feature] Extend OrderBy functionality [feature] 420 | - [#74](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/74) - Join on nullable and not nullable type throws exception [bug] 421 | - [#75](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/75) - GroupBy clause add an "Item" property when projects the query 422 | - [#79](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/79) - DynamicExpressionParser does not allow empty parameter lists. [bug] 423 | - [#81](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/81) - [Question] Create new nuget? 424 | - [#82](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/82) - [Feature] Add DefaultIfEmpty [feature] 425 | - [#84](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/84) - [Bug] DynamicClassFactory not caching generated types [bug] 426 | - [#90](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/90) - [Bug] ParseIntegerLiteral Int16 [bug] 427 | - [#91](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/91) - [Bug] Support for decimal qualifiers 'M' & 'm' [bug] 428 | - [#94](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/94) - [Bug] ParseException: Operator '==' incompatible with operand types 'ObjectId' and 'ObjectId' [bug] 429 | - [#96](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/96) - Async support for ToDynamicList() [feature] 430 | - [#102](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/102) - Aggregate method does not work with Average function 431 | - [#104](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/104) - Add PDB to nuget package [feature] 432 | - [#106](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/106) - Using both System.Linq and System.Linq.Dynamic.Core 433 | - [#107](https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/107) - Type conversions generated in cases where they're not needed. [bug] 434 | 435 | -------------------------------------------------------------------------------- /examples/System.Linq.Dynamic.Core.txt: -------------------------------------------------------------------------------- 1 | --path "C:\Users\StefHeyenrath\Documents\Github\System.Linq.Dynamic.Core" --output ../../../../../examples/System.Linq.Dynamic.Core.md --skip-empty-releases --exclude-labels invalid question --language en --version v1.2.5 -------------------------------------------------------------------------------- /examples/WireMock.Net.txt: -------------------------------------------------------------------------------- 1 | --path "C:\Users\azurestef\Documents\Github\WireMock.Net" --output ../../../../../examples/WireMock.Net.md --skip-empty-releases --exclude-labels question invalid doc --language en --version 1.3.6 -------------------------------------------------------------------------------- /icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StefH/GitHubReleaseNotes/d0358d062c0623cd2aac111c9b564cb99850f204/icon.png -------------------------------------------------------------------------------- /src/GitHubReleaseNotes.Logic/Configuration.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using System.Globalization; 3 | 4 | namespace GitHubReleaseNotes.Logic; 5 | 6 | public class Configuration : IConfiguration 7 | { 8 | public string RepositoryPath { get; set; } = null!; 9 | 10 | public string? OutputFile { get; set; } 11 | 12 | public string Version { get; set; } = "next"; 13 | 14 | public CultureInfo Culture { get; set; } = CultureInfo.CurrentCulture; 15 | 16 | public bool SkipEmptyReleases { get; set; } 17 | 18 | public string? TemplatePath { get; set; } 19 | 20 | public string? Login { get; set; } 21 | 22 | public string? Password { get; set; } 23 | 24 | public string? Token { get; set; } 25 | 26 | public IEnumerable<string>? ExcludeLabels { get; set; } 27 | } -------------------------------------------------------------------------------- /src/GitHubReleaseNotes.Logic/Extensions/RepositoryExtensions.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Threading.Tasks; 5 | using GitHubReleaseNotes.Logic.Models; 6 | using GitReader; 7 | using GitReader.Primitive; 8 | using GitReader.Structures; 9 | 10 | namespace GitHubReleaseNotes.Logic.Extensions; 11 | 12 | internal static class RepositoryExtensions 13 | { 14 | public static async Task<IReadOnlyList<ReleaseInfo>> GetOrderedReleaseInfosAsync(this StructuredRepository repo, string version) 15 | { 16 | var orderedReleaseInfos = new List<ReleaseInfo>(); 17 | 18 | var getCommitTasks = new Dictionary<string, Task<Commit?>>(); 19 | 20 | foreach (var tag in repo.Tags) 21 | { 22 | var getCommitTask = repo.GetCommitAsync(tag.Value.ObjectHash); 23 | getCommitTasks.Add(tag.Key, getCommitTask); 24 | } 25 | 26 | await Task.WhenAll(getCommitTasks.Values); 27 | 28 | foreach (var tag in getCommitTasks) 29 | { 30 | var tagVersion = GetVersionAsLong(tag.Key); 31 | if (tagVersion == null) 32 | { 33 | // Skip invalid versions 34 | continue; 35 | } 36 | 37 | var commit = tag.Value.Result; 38 | if (commit == null) 39 | { 40 | throw new InvalidOperationException($"Tag {tag.Key} has no commit."); 41 | } 42 | 43 | var releaseInfo = new ReleaseInfo 44 | { 45 | Version = tagVersion.Value, 46 | FriendlyName = tag.Key, 47 | When = commit.Committer.Date 48 | }; 49 | orderedReleaseInfos.Add(releaseInfo); 50 | } 51 | 52 | orderedReleaseInfos = orderedReleaseInfos.OrderBy(tag => tag.Version).ToList(); 53 | 54 | // Add the `next` version 55 | orderedReleaseInfos.Add(new ReleaseInfo 56 | { 57 | Version = long.MaxValue, 58 | FriendlyName = version, 59 | When = DateTimeOffset.Now 60 | }); 61 | 62 | return orderedReleaseInfos; 63 | } 64 | 65 | private static long? GetVersionAsLong(string friendlyName) 66 | { 67 | var versionAsString = new string(friendlyName.Where(c => char.IsDigit(c) || c == '.').ToArray()); 68 | if (Version.TryParse(versionAsString, out var version)) 69 | { 70 | return version.Major * 1000000000L + version.Minor * 1000000L + (version.Build > 0 ? version.Build : 0) * 1000L + (version.Revision > 0 ? version.Revision : 0); 71 | } 72 | 73 | return null; 74 | } 75 | } -------------------------------------------------------------------------------- /src/GitHubReleaseNotes.Logic/Generator.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.IO; 3 | using System.Threading.Tasks; 4 | 5 | namespace GitHubReleaseNotes.Logic; 6 | 7 | public class Generator 8 | { 9 | private readonly IConfiguration _configuration; 10 | private readonly RepositoryHelper _repositoryHelper; 11 | private readonly HandleBarsHelper _handleBarsHelper; 12 | 13 | public Generator(IConfiguration configuration) 14 | { 15 | _configuration = configuration ?? throw new ArgumentNullException(nameof(configuration)); 16 | 17 | _repositoryHelper = new RepositoryHelper(configuration); 18 | _handleBarsHelper = new HandleBarsHelper(configuration); 19 | } 20 | 21 | public async Task GenerateAsync() 22 | { 23 | try 24 | { 25 | var releaseInfos = await _repositoryHelper.GetReleaseInfoAsync().ConfigureAwait(false); 26 | 27 | string result = _handleBarsHelper.Generate(releaseInfos); 28 | 29 | if (!string.IsNullOrEmpty(_configuration.OutputFile)) 30 | { 31 | Console.WriteLine($"Release Notes written to '{new FileInfo(_configuration.OutputFile!).FullName}'"); 32 | File.WriteAllText(_configuration.OutputFile!, result); 33 | } 34 | else 35 | { 36 | Console.WriteLine(result); 37 | } 38 | } 39 | catch (Exception ex) 40 | { 41 | Console.WriteLine(ex.Message); 42 | } 43 | } 44 | } -------------------------------------------------------------------------------- /src/GitHubReleaseNotes.Logic/GitHubClientFactory.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Octokit; 3 | 4 | namespace GitHubReleaseNotes.Logic; 5 | 6 | internal static class GitHubClientFactory 7 | { 8 | private static readonly TimeSpan RequestTimeout = TimeSpan.FromMinutes(5); 9 | 10 | private const string AppName = "GitHubReleaseNotes"; 11 | 12 | public static IGitHubClient CreateClient(IConfiguration configuration, string owner) 13 | { 14 | if (configuration == null) 15 | { 16 | throw new ArgumentNullException(nameof(configuration)); 17 | } 18 | 19 | var product = !string.IsNullOrEmpty(owner) ? owner : AppName; 20 | var client = new GitHubClient(new ProductHeaderValue(product)); 21 | 22 | if (!string.IsNullOrEmpty(configuration.Token)) 23 | { 24 | client.Credentials = new Credentials(configuration.Token); 25 | } 26 | else if (!string.IsNullOrEmpty(configuration.Login) && !string.IsNullOrEmpty(configuration.Password)) 27 | { 28 | client.Credentials = new Credentials(configuration.Login, configuration.Password); 29 | } 30 | 31 | client.SetRequestTimeout(RequestTimeout); 32 | 33 | return client; 34 | } 35 | } -------------------------------------------------------------------------------- /src/GitHubReleaseNotes.Logic/GitHubReleaseNotes.Logic.csproj: -------------------------------------------------------------------------------- 1 | <Project Sdk="Microsoft.NET.Sdk"> 2 | 3 | <PropertyGroup> 4 | <TargetFrameworks>net48;net6.0</TargetFrameworks> 5 | <ProjectGuid>{B6269AAC-170A-43D0-8B9B-579DED3D9A99}</ProjectGuid> 6 | <PackageIcon>icon.png</PackageIcon> 7 | <Nullable>enable</Nullable> 8 | </PropertyGroup> 9 | 10 | <ItemGroup> 11 | <EmbeddedResource Include="Template.txt" /> 12 | </ItemGroup> 13 | 14 | <ItemGroup> 15 | <PackageReference Include="GitReader" Version="1.7.0" /> 16 | <PackageReference Include="Octokit" Version="10.0.0" /> 17 | <PackageReference Include="Handlebars.Net" Version="2.1.4" /> 18 | <PackageReference Include="IsExternalInit" Version="1.0.3"> 19 | <PrivateAssets>all</PrivateAssets> 20 | <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> 21 | </PackageReference> 22 | <PackageReference Include="Required" Version="1.0.0"> 23 | <PrivateAssets>all</PrivateAssets> 24 | <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> 25 | </PackageReference> 26 | </ItemGroup> 27 | 28 | <ItemGroup> 29 | <None Include="../../icon.png" Pack="true" PackagePath="" /> 30 | </ItemGroup> 31 | 32 | <ItemGroup Condition="'$(TargetFramework)' == 'net48'"> 33 | <Reference Include="System.Net.Http" /> 34 | </ItemGroup> 35 | </Project> -------------------------------------------------------------------------------- /src/GitHubReleaseNotes.Logic/HandleBarsHelper.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.IO; 4 | using System.Reflection; 5 | using GitHubReleaseNotes.Logic.Models; 6 | using HandlebarsDotNet; 7 | 8 | namespace GitHubReleaseNotes.Logic; 9 | 10 | internal class HandleBarsHelper 11 | { 12 | private const string TemplateFilename = "GitHubReleaseNotes.Logic.Template.txt"; 13 | 14 | private readonly IConfiguration _configuration; 15 | 16 | public HandleBarsHelper(IConfiguration configuration) 17 | { 18 | _configuration = configuration ?? throw new ArgumentNullException(nameof(configuration)); 19 | } 20 | 21 | internal string Generate(IEnumerable<ReleaseInfo> releaseInfos) 22 | { 23 | RegisterHelpers(); 24 | 25 | var template = Handlebars.Compile(GetTemplateAsString()); 26 | 27 | return template(new { releaseInfos }); 28 | } 29 | 30 | private string GetTemplateAsString() 31 | { 32 | // If provided, read custom Template 33 | if (!string.IsNullOrEmpty(_configuration.TemplatePath)) 34 | { 35 | return File.ReadAllText(_configuration.TemplatePath); 36 | } 37 | 38 | // Use default embedded Template 39 | var assembly = typeof(HandleBarsHelper).GetTypeInfo().Assembly; 40 | using var stream = assembly.GetManifestResourceStream(TemplateFilename)!; 41 | using var reader = new StreamReader(stream); 42 | 43 | return reader.ReadToEnd(); 44 | } 45 | 46 | private void RegisterHelpers() 47 | { 48 | Handlebars.RegisterHelper("join", (writer, context, arguments) => 49 | { 50 | if (arguments[0] is IEnumerable<object> enumerable) 51 | { 52 | string concatenatedString = string.Join(arguments[1] as string, enumerable); 53 | writer.WriteSafeString(concatenatedString); 54 | } 55 | }); 56 | 57 | Handlebars.RegisterHelper("formatDate", (writer, context, arguments) => 58 | { 59 | switch (arguments[0]) 60 | { 61 | case DateTimeOffset value: 62 | writer.WriteSafeString(value.ToString(arguments[1] as string, _configuration.Culture)); 63 | break; 64 | 65 | case DateTime value: 66 | writer.WriteSafeString(value.ToString(arguments[1] as string, _configuration.Culture)); 67 | break; 68 | } 69 | }); 70 | } 71 | } -------------------------------------------------------------------------------- /src/GitHubReleaseNotes.Logic/IConfiguration.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using System.Globalization; 3 | 4 | namespace GitHubReleaseNotes.Logic; 5 | 6 | public interface IConfiguration 7 | { 8 | string RepositoryPath { get; } 9 | 10 | string? OutputFile { get; } 11 | 12 | string Version { get; } 13 | 14 | CultureInfo Culture { get; } 15 | 16 | bool SkipEmptyReleases { get; } 17 | 18 | string? TemplatePath { get; } 19 | 20 | string? Login { get; } 21 | 22 | string? Password { get; } 23 | 24 | string? Token { get; } 25 | 26 | IEnumerable<string>? ExcludeLabels { get; } 27 | } -------------------------------------------------------------------------------- /src/GitHubReleaseNotes.Logic/Models/IssueInfo.cs: -------------------------------------------------------------------------------- 1 | namespace GitHubReleaseNotes.Logic.Models; 2 | 3 | internal class IssueInfo 4 | { 5 | public required int Number { get; set; } 6 | 7 | public required bool IsPulRequest { get; set; } 8 | 9 | public required string IssueUrl { get; set; } 10 | 11 | public required string Title { get; set; } 12 | 13 | public required string User { get; set; } 14 | 15 | public required string UserUrl { get; set; } 16 | 17 | public required string[] Labels { get; set; } 18 | } -------------------------------------------------------------------------------- /src/GitHubReleaseNotes.Logic/Models/IssuesAndPullRequestsModel.cs: -------------------------------------------------------------------------------- 1 | using Octokit; 2 | using System.Collections.Generic; 3 | 4 | namespace GitHubReleaseNotes.Logic.Models; 5 | 6 | internal class IssuesAndPullRequestsModel 7 | { 8 | public required ICollection<Issue> Issues { get; set; } 9 | 10 | public required ICollection<PullRequest> PullRequests { get; set; } 11 | } -------------------------------------------------------------------------------- /src/GitHubReleaseNotes.Logic/Models/ReleaseInfo.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | 4 | namespace GitHubReleaseNotes.Logic.Models; 5 | 6 | internal class ReleaseInfo 7 | { 8 | public required long Version { get; set; } 9 | 10 | public required string FriendlyName { get; set; } 11 | 12 | public required DateTimeOffset When { get; set; } 13 | 14 | public List<IssueInfo> IssueInfos { get; set; } = null!; 15 | } -------------------------------------------------------------------------------- /src/GitHubReleaseNotes.Logic/Models/RepositorySettings.cs: -------------------------------------------------------------------------------- 1 | namespace GitHubReleaseNotes.Logic.Models; 2 | 3 | internal record RepositorySettings(string Owner, string Name, string HeadBranch); -------------------------------------------------------------------------------- /src/GitHubReleaseNotes.Logic/RepositoryHelper.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.IO; 4 | using System.Linq; 5 | using System.Text.RegularExpressions; 6 | using System.Threading.Tasks; 7 | using GitHubReleaseNotes.Logic.Extensions; 8 | using GitHubReleaseNotes.Logic.Models; 9 | using GitReader.Structures; 10 | using Octokit; 11 | 12 | namespace GitHubReleaseNotes.Logic; 13 | 14 | public class RepositoryHelper 15 | { 16 | private const int DeltaSeconds = 30; 17 | 18 | private static readonly Regex OwnerAndProjectRegex = new("(^https:\\/\\/github\\.com\\/(?<ownerHttps>.+)\\/(?<projectHttps>.+)\\.git)|(^git@github\\.com:(?<ownerSSH>.+)\\/(?<projectSSH>.+)\\.git$)$", RegexOptions.Compiled); 19 | 20 | private readonly IConfiguration _configuration; 21 | 22 | public RepositoryHelper(IConfiguration configuration) 23 | { 24 | _configuration = configuration ?? throw new ArgumentNullException(nameof(configuration)); 25 | } 26 | 27 | internal async Task<IEnumerable<ReleaseInfo>> GetReleaseInfoAsync() 28 | { 29 | using var repository = await GitReader.Repository.Factory.OpenStructureAsync(_configuration.RepositoryPath); 30 | 31 | var originUrl = repository.RemoteUrls.First(r => r.Key == "origin").Value; 32 | var gitUrl = !originUrl.EndsWith(".git") ? $"{originUrl}.git" : originUrl; 33 | var headBranchName = repository.Head?.Name ?? throw new InvalidOperationException("The Head branch has no name."); 34 | 35 | Console.WriteLine($"Analyzing Git Repository at '{new FileInfo(_configuration.RepositoryPath).FullName}'"); 36 | var orderedReleaseInfos = await repository.GetOrderedReleaseInfosAsync(_configuration.Version); 37 | 38 | Console.WriteLine($"Getting Issues and Pull Requests from '{gitUrl}'"); 39 | var result = await GetAllIssuesAndPullRequestsAsync(gitUrl, headBranchName).ConfigureAwait(false); 40 | 41 | bool IssueTimeIsLessThenReleaseTime(DateTimeOffset releaseTime, DateTimeOffset? issueClosedTime) 42 | => issueClosedTime < releaseTime.AddSeconds(DeltaSeconds); 43 | 44 | bool IssueTimeIsGreaterThenPreviousReleaseTime(IReadOnlyList<ReleaseInfo> releaseInfos, int idx, DateTimeOffset? issueClosedTime) => 45 | idx <= 0 || issueClosedTime > releaseInfos[idx - 1].When.AddSeconds(DeltaSeconds); 46 | 47 | bool IssueLinkedToRelease(IReadOnlyList<ReleaseInfo> releaseInfos, int idx, ReleaseInfo releaseInfo, DateTimeOffset? issueClosedAtTime) => 48 | IssueTimeIsLessThenReleaseTime(releaseInfo.When, issueClosedAtTime) && IssueTimeIsGreaterThenPreviousReleaseTime(releaseInfos, idx, issueClosedAtTime); 49 | 50 | bool ExcludeIssue(string[] labels) => 51 | _configuration.ExcludeLabels != null && _configuration.ExcludeLabels.Any(s => labels.Contains(s, StringComparer.OrdinalIgnoreCase)); 52 | 53 | // Loop all orderedReleaseInfos and add the correct Pull Requests and Issues 54 | foreach (var x in orderedReleaseInfos.Select((releaseInfo, index) => new { index, releaseInfo })) 55 | { 56 | // Process only Issues 57 | var releaseInfos = orderedReleaseInfos; // Fix: "Captured variable is modified in outer scope" 58 | var issuesForThisTag = result.Issues.Where(issue => issue.PullRequest == null && IssueLinkedToRelease(releaseInfos, x.index, x.releaseInfo, issue.ClosedAt)); 59 | var issueInfos = issuesForThisTag.Select(issue => new IssueInfo 60 | { 61 | Number = issue.Number, 62 | IsPulRequest = false, 63 | IssueUrl = issue.HtmlUrl, 64 | Title = issue.Title, 65 | User = issue.User.Login, 66 | UserUrl = issue.User.HtmlUrl, 67 | Labels = issue.Labels.Select(label => label.Name).ToArray() 68 | }); 69 | 70 | // Process PullRequests 71 | var pullsForThisTag = result.PullRequests.Where(pullRequest => IssueLinkedToRelease(releaseInfos, x.index, x.releaseInfo, pullRequest.ClosedAt)); 72 | 73 | var pullInfos = pullsForThisTag.Select(pull => 74 | { 75 | var labels = pull.Labels.Select(l => l.Name); 76 | 77 | // Get the labels from the Issues (if present). Because these are not present in the 'PullRequest' ? 78 | var relatedIssue = result.Issues.FirstOrDefault(issue => issue.Number == pull.Number); 79 | if (relatedIssue != null) 80 | { 81 | labels = relatedIssue.Labels.Select(label => label.Name); 82 | } 83 | 84 | return new IssueInfo 85 | { 86 | Number = pull.Number, 87 | IsPulRequest = true, 88 | IssueUrl = pull.HtmlUrl, 89 | Title = pull.Title, 90 | User = pull.User.Login, 91 | UserUrl = pull.User.HtmlUrl, 92 | Labels = labels.ToArray() 93 | }; 94 | }); 95 | 96 | var allIssues = issueInfos.Union(pullInfos) 97 | .Distinct() 98 | .Where(issueInfo => !ExcludeIssue(issueInfo.Labels)); 99 | 100 | x.releaseInfo.IssueInfos = allIssues.OrderByDescending(issue => issue.IsPulRequest).ThenBy(issue => issue.Number).ToList(); 101 | } 102 | 103 | if (_configuration.SkipEmptyReleases) 104 | { 105 | orderedReleaseInfos = orderedReleaseInfos.Where(r => r.IssueInfos.Count > 0).ToList(); 106 | } 107 | 108 | return orderedReleaseInfos.OrderByDescending(r => r.Version); 109 | } 110 | 111 | private async Task<IssuesAndPullRequestsModel> GetAllIssuesAndPullRequestsAsync(string gitUrl, string headBranchName) 112 | { 113 | GetRepositorySettingsOrThrowException(gitUrl, headBranchName, out var repositorySettings); 114 | 115 | //var miscellaneousRateLimit = await client.Miscellaneous.GetRateLimits(); 116 | //if (miscellaneousRateLimit.Resources.Core.Remaining < 21) 117 | //{ 118 | // throw new Exception($"You have only {miscellaneousRateLimit.Resources.Core.Remaining} Core Requests remaining."); 119 | //} 120 | 121 | var issuesTask = GetIssuesForRepositoryAsync(repositorySettings); 122 | var pullRequestsTask = GetMergedPullRequestsForRepositoryAsync(repositorySettings); 123 | 124 | await Task.WhenAll(issuesTask, pullRequestsTask).ConfigureAwait(false); 125 | 126 | return new IssuesAndPullRequestsModel 127 | { 128 | Issues = await issuesTask, 129 | PullRequests = await pullRequestsTask 130 | }; 131 | } 132 | 133 | private async Task<ICollection<Issue>> GetIssuesForRepositoryAsync(RepositorySettings repositorySettings) 134 | { 135 | var client = GitHubClientFactory.CreateClient(_configuration, repositorySettings.Owner); 136 | 137 | // Do a request to GitHub using Octokit.GitHubClient to get all Closed Issues (this does also include Closed and Merged Pull Requests) 138 | var closedIssuesRequest = new RepositoryIssueRequest 139 | { 140 | Filter = IssueFilter.All, 141 | State = ItemStateFilter.Closed 142 | }; 143 | 144 | // Return all Closed issues 145 | return (await client.Issue.GetAllForRepository(repositorySettings.Owner, repositorySettings.Name, closedIssuesRequest).ConfigureAwait(false)) 146 | .OrderBy(i => i.Id) 147 | .ToList(); 148 | } 149 | 150 | private async Task<ICollection<PullRequest>> GetMergedPullRequestsForRepositoryAsync(RepositorySettings repositorySettings) 151 | { 152 | var client = GitHubClientFactory.CreateClient(_configuration, repositorySettings.Owner); 153 | 154 | // Do a request to GitHub using Octokit.GitHubClient to get all Closed Pull Requests 155 | var closedPullRequestsRequest = new PullRequestRequest 156 | { 157 | //SortDirection = SortDirection.Ascending, 158 | State = ItemStateFilter.Closed, 159 | Base = repositorySettings.HeadBranch 160 | }; 161 | 162 | // Return only Closed and Merged PullRequests 163 | return (await client.PullRequest.GetAllForRepository(repositorySettings.Owner, repositorySettings.Name, closedPullRequestsRequest).ConfigureAwait(false)) 164 | .Where(pull => pull.Merged) 165 | .OrderBy(pull => pull.Id) 166 | .ToList() 167 | .AsReadOnly(); 168 | } 169 | 170 | private static void GetRepositorySettingsOrThrowException(string url, string headBranchName, out RepositorySettings repositorySettings) 171 | { 172 | var groups = OwnerAndProjectRegex.Match(url).Groups; 173 | 174 | if (!TryGetValue(groups, "ownerHttps", "ownerSSH", out var owner) || !TryGetValue(groups, "projectHttps", "projectSSH", out var project)) 175 | { 176 | throw new UriFormatException($"The url '{url}' is not a valid GitHub url, the Owner and or Project are not present."); 177 | } 178 | 179 | repositorySettings = new RepositorySettings(owner, project, headBranchName); 180 | } 181 | 182 | private static bool TryGetValue(GroupCollection groups, string groupName1, string groupName2, out string value) 183 | { 184 | value = groups[groupName1].Value; 185 | if (!string.IsNullOrEmpty(value)) 186 | { 187 | return true; 188 | } 189 | 190 | value = groups[groupName2].Value; 191 | if (!string.IsNullOrEmpty(value)) 192 | { 193 | return true; 194 | } 195 | 196 | return false; 197 | } 198 | } -------------------------------------------------------------------------------- /src/GitHubReleaseNotes.Logic/Template.txt: -------------------------------------------------------------------------------- 1 | {{#each releaseInfos}} 2 | # {{FriendlyName}} ({{formatDate When "dd MMMM yyyy"}}) 3 | {{#each issueInfos}} 4 | - [#{{Number}}]({{IssueUrl}}) - {{Title}}{{#if Labels}} [{{join Labels ", "}}]{{/if}}{{#if IsPulRequest}} contributed by [{{User}}]({{UserUrl}}){{/if}} 5 | {{/each}} 6 | 7 | {{/each}} -------------------------------------------------------------------------------- /src/GitHubReleaseNotes.NET48/FodyWeavers.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <Weavers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="FodyWeavers.xsd"> 3 | <Costura IncludeDebugSymbols="false" DisableCleanup="true" Unmanaged32Assemblies="git2-1196807" /> 4 | </Weavers> -------------------------------------------------------------------------------- /src/GitHubReleaseNotes.NET48/FodyWeavers.xsd: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 3 | <!-- This file was generated by Fody. Manual changes to this file will be lost when your project is rebuilt. --> 4 | <xs:element name="Weavers"> 5 | <xs:complexType> 6 | <xs:all> 7 | <xs:element name="Costura" minOccurs="0" maxOccurs="1"> 8 | <xs:complexType> 9 | <xs:all> 10 | <xs:element minOccurs="0" maxOccurs="1" name="ExcludeAssemblies" type="xs:string"> 11 | <xs:annotation> 12 | <xs:documentation>A list of assembly names to exclude from the default action of "embed all Copy Local references", delimited with line breaks</xs:documentation> 13 | </xs:annotation> 14 | </xs:element> 15 | <xs:element minOccurs="0" maxOccurs="1" name="IncludeAssemblies" type="xs:string"> 16 | <xs:annotation> 17 | <xs:documentation>A list of assembly names to include from the default action of "embed all Copy Local references", delimited with line breaks.</xs:documentation> 18 | </xs:annotation> 19 | </xs:element> 20 | <xs:element minOccurs="0" maxOccurs="1" name="ExcludeRuntimeAssemblies" type="xs:string"> 21 | <xs:annotation> 22 | <xs:documentation>A list of runtime assembly names to exclude from the default action of "embed all Copy Local references", delimited with line breaks</xs:documentation> 23 | </xs:annotation> 24 | </xs:element> 25 | <xs:element minOccurs="0" maxOccurs="1" name="IncludeRuntimeAssemblies" type="xs:string"> 26 | <xs:annotation> 27 | <xs:documentation>A list of runtime assembly names to include from the default action of "embed all Copy Local references", delimited with line breaks.</xs:documentation> 28 | </xs:annotation> 29 | </xs:element> 30 | <xs:element minOccurs="0" maxOccurs="1" name="Unmanaged32Assemblies" type="xs:string"> 31 | <xs:annotation> 32 | <xs:documentation>A list of unmanaged 32 bit assembly names to include, delimited with line breaks.</xs:documentation> 33 | </xs:annotation> 34 | </xs:element> 35 | <xs:element minOccurs="0" maxOccurs="1" name="Unmanaged64Assemblies" type="xs:string"> 36 | <xs:annotation> 37 | <xs:documentation>A list of unmanaged 64 bit assembly names to include, delimited with line breaks.</xs:documentation> 38 | </xs:annotation> 39 | </xs:element> 40 | <xs:element minOccurs="0" maxOccurs="1" name="PreloadOrder" type="xs:string"> 41 | <xs:annotation> 42 | <xs:documentation>The order of preloaded assemblies, delimited with line breaks.</xs:documentation> 43 | </xs:annotation> 44 | </xs:element> 45 | </xs:all> 46 | <xs:attribute name="CreateTemporaryAssemblies" type="xs:boolean"> 47 | <xs:annotation> 48 | <xs:documentation>This will copy embedded files to disk before loading them into memory. This is helpful for some scenarios that expected an assembly to be loaded from a physical file.</xs:documentation> 49 | </xs:annotation> 50 | </xs:attribute> 51 | <xs:attribute name="IncludeDebugSymbols" type="xs:boolean"> 52 | <xs:annotation> 53 | <xs:documentation>Controls if .pdbs for reference assemblies are also embedded.</xs:documentation> 54 | </xs:annotation> 55 | </xs:attribute> 56 | <xs:attribute name="IncludeRuntimeReferences" type="xs:boolean"> 57 | <xs:annotation> 58 | <xs:documentation>Controls if runtime assemblies are also embedded.</xs:documentation> 59 | </xs:annotation> 60 | </xs:attribute> 61 | <xs:attribute name="UseRuntimeReferencePaths" type="xs:boolean"> 62 | <xs:annotation> 63 | <xs:documentation>Controls whether the runtime assemblies are embedded with their full path or only with their assembly name.</xs:documentation> 64 | </xs:annotation> 65 | </xs:attribute> 66 | <xs:attribute name="DisableCompression" type="xs:boolean"> 67 | <xs:annotation> 68 | <xs:documentation>Embedded assemblies are compressed by default, and uncompressed when they are loaded. You can turn compression off with this option.</xs:documentation> 69 | </xs:annotation> 70 | </xs:attribute> 71 | <xs:attribute name="DisableCleanup" type="xs:boolean"> 72 | <xs:annotation> 73 | <xs:documentation>As part of Costura, embedded assemblies are no longer included as part of the build. This cleanup can be turned off.</xs:documentation> 74 | </xs:annotation> 75 | </xs:attribute> 76 | <xs:attribute name="LoadAtModuleInit" type="xs:boolean"> 77 | <xs:annotation> 78 | <xs:documentation>Costura by default will load as part of the module initialization. This flag disables that behavior. Make sure you call CosturaUtility.Initialize() somewhere in your code.</xs:documentation> 79 | </xs:annotation> 80 | </xs:attribute> 81 | <xs:attribute name="IgnoreSatelliteAssemblies" type="xs:boolean"> 82 | <xs:annotation> 83 | <xs:documentation>Costura will by default use assemblies with a name like 'resources.dll' as a satellite resource and prepend the output path. This flag disables that behavior.</xs:documentation> 84 | </xs:annotation> 85 | </xs:attribute> 86 | <xs:attribute name="ExcludeAssemblies" type="xs:string"> 87 | <xs:annotation> 88 | <xs:documentation>A list of assembly names to exclude from the default action of "embed all Copy Local references", delimited with |</xs:documentation> 89 | </xs:annotation> 90 | </xs:attribute> 91 | <xs:attribute name="IncludeAssemblies" type="xs:string"> 92 | <xs:annotation> 93 | <xs:documentation>A list of assembly names to include from the default action of "embed all Copy Local references", delimited with |.</xs:documentation> 94 | </xs:annotation> 95 | </xs:attribute> 96 | <xs:attribute name="ExcludeRuntimeAssemblies" type="xs:string"> 97 | <xs:annotation> 98 | <xs:documentation>A list of runtime assembly names to exclude from the default action of "embed all Copy Local references", delimited with |</xs:documentation> 99 | </xs:annotation> 100 | </xs:attribute> 101 | <xs:attribute name="IncludeRuntimeAssemblies" type="xs:string"> 102 | <xs:annotation> 103 | <xs:documentation>A list of runtime assembly names to include from the default action of "embed all Copy Local references", delimited with |.</xs:documentation> 104 | </xs:annotation> 105 | </xs:attribute> 106 | <xs:attribute name="Unmanaged32Assemblies" type="xs:string"> 107 | <xs:annotation> 108 | <xs:documentation>A list of unmanaged 32 bit assembly names to include, delimited with |.</xs:documentation> 109 | </xs:annotation> 110 | </xs:attribute> 111 | <xs:attribute name="Unmanaged64Assemblies" type="xs:string"> 112 | <xs:annotation> 113 | <xs:documentation>A list of unmanaged 64 bit assembly names to include, delimited with |.</xs:documentation> 114 | </xs:annotation> 115 | </xs:attribute> 116 | <xs:attribute name="PreloadOrder" type="xs:string"> 117 | <xs:annotation> 118 | <xs:documentation>The order of preloaded assemblies, delimited with |.</xs:documentation> 119 | </xs:annotation> 120 | </xs:attribute> 121 | </xs:complexType> 122 | </xs:element> 123 | </xs:all> 124 | <xs:attribute name="VerifyAssembly" type="xs:boolean"> 125 | <xs:annotation> 126 | <xs:documentation>'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed.</xs:documentation> 127 | </xs:annotation> 128 | </xs:attribute> 129 | <xs:attribute name="VerifyIgnoreCodes" type="xs:string"> 130 | <xs:annotation> 131 | <xs:documentation>A comma-separated list of error codes that can be safely ignored in assembly verification.</xs:documentation> 132 | </xs:annotation> 133 | </xs:attribute> 134 | <xs:attribute name="GenerateXsd" type="xs:boolean"> 135 | <xs:annotation> 136 | <xs:documentation>'false' to turn off automatic generation of the XML Schema file.</xs:documentation> 137 | </xs:annotation> 138 | </xs:attribute> 139 | </xs:complexType> 140 | </xs:element> 141 | </xs:schema> -------------------------------------------------------------------------------- /src/GitHubReleaseNotes.NET48/GitHubReleaseNotes.NET48.csproj: -------------------------------------------------------------------------------- 1 | <Project Sdk="Microsoft.NET.Sdk"> 2 | 3 | <PropertyGroup> 4 | <OutputType>Exe</OutputType> 5 | <TargetFramework>net48</TargetFramework> 6 | <ProjectGuid>{B6269AAC-170A-43D0-8B9B-579DED3D9A00}</ProjectGuid> 7 | <StartupObject>GitHubReleaseNotes.Program</StartupObject> 8 | </PropertyGroup> 9 | 10 | <ItemGroup> 11 | <Compile Include="..\GitHubReleaseNotes\ConfigurationParser.cs" Link="ConfigurationParser.cs" /> 12 | <Compile Include="..\GitHubReleaseNotes\SimpleCommandLineParser.cs" Link="SimpleCommandLineParser.cs" /> 13 | </ItemGroup> 14 | 15 | <ItemGroup> 16 | <PackageReference Include="Costura.Fody" Version="5.7.0"> 17 | <PrivateAssets>all</PrivateAssets> 18 | <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> 19 | </PackageReference> 20 | <PackageReference Include="Fody" Version="6.8.0"> 21 | <PrivateAssets>all</PrivateAssets> 22 | <IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets> 23 | </PackageReference> 24 | </ItemGroup> 25 | 26 | <ItemGroup> 27 | <ProjectReference Include="..\GitHubReleaseNotes.Logic\GitHubReleaseNotes.Logic.csproj"> 28 | <AdditionalProperties>TargetFramework=net48</AdditionalProperties> 29 | </ProjectReference> 30 | </ItemGroup> 31 | 32 | <Target Name="Zip" AfterTargets="Build"> 33 | <Zip SourceFile="$(OutputPath)\$(AssemblyName).exe" ZipFileName="$(OutputPath)\$(AssemblyName).zip" /> 34 | </Target> 35 | 36 | <UsingTask TaskName="Zip" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v12.0.dll"> 37 | <ParameterGroup> 38 | <SourceFile ParameterType="System.String" Required="true" /> 39 | <ZipFileName ParameterType="System.String" Required="true" /> 40 | </ParameterGroup> 41 | 42 | <Task> 43 | <Reference Include="System.IO.Compression.FileSystem" /> 44 | <Using Namespace="System.IO.Compression" /> 45 | <Code Type="Fragment" Language="cs"> 46 | <![CDATA[ 47 | try 48 | { 49 | Log.LogMessage(string.Format("Zipping file {0} to {1}", SourceFile, ZipFileName)); 50 | 51 | // Temporarily create a directory to hold the file to be zipped 52 | string tempFolder = Path.Combine(Path.GetDirectoryName(SourceFile), Path.GetFileNameWithoutExtension(SourceFile) + "_temp"); 53 | Directory.CreateDirectory(tempFolder); 54 | 55 | // Copy the source file to the temp directory 56 | string tempFilePath = Path.Combine(tempFolder, Path.GetFileName(SourceFile)); 57 | File.Copy(SourceFile, tempFilePath, true); 58 | 59 | // Create a zip archive that contains the file in the temp directory 60 | if (File.Exists(ZipFileName)) 61 | { 62 | File.Delete(ZipFileName); // Ensure we are creating a new zip file 63 | } 64 | ZipFile.CreateFromDirectory(tempFolder, ZipFileName); 65 | 66 | // Clean up the temp directory 67 | Directory.Delete(tempFolder, true); 68 | 69 | return true; 70 | } 71 | catch(Exception ex) 72 | { 73 | Log.LogErrorFromException(ex); 74 | return false; 75 | } 76 | ]]> 77 | </Code> 78 | </Task> 79 | </UsingTask> 80 | 81 | </Project> -------------------------------------------------------------------------------- /src/GitHubReleaseNotes.NET48/Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Reflection; 3 | using System.Threading.Tasks; 4 | using GitHubReleaseNotes.Logic; 5 | 6 | namespace GitHubReleaseNotes; 7 | 8 | static class Program 9 | { 10 | static async Task Main(string[] args) 11 | { 12 | await MainAsync(args).ConfigureAwait(false); 13 | } 14 | 15 | private static Task MainAsync(string[] args) 16 | { 17 | var configuration = ConfigurationParser.Parse(args); 18 | 19 | Console.WriteLine($"GitHubReleaseNotes ({Assembly.GetExecutingAssembly().GetName().Version})"); 20 | return new Generator(configuration).GenerateAsync(); 21 | } 22 | } -------------------------------------------------------------------------------- /src/GitHubReleaseNotes.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 17 4 | VisualStudioVersion = 17.5.33516.290 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{EF77BB40-C919-4644-81A3-968854FB9B23}" 7 | EndProject 8 | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{A9E332DE-6598-41D3-B4FA-A4C5E1523BFA}" 9 | ProjectSection(SolutionItems) = preProject 10 | ..\Directory.Build.props = ..\Directory.Build.props 11 | ..\GenerateReleaseNotes.cmd = ..\GenerateReleaseNotes.cmd 12 | ..\README.md = ..\README.md 13 | ..\ReleaseNotes.md = ..\ReleaseNotes.md 14 | EndProjectSection 15 | EndProject 16 | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "examples", "examples", "{5B560300-4B76-4FFF-8B7B-D0F52972A2F5}" 17 | ProjectSection(SolutionItems) = preProject 18 | ..\examples\RamlToOpenApiConverter.md = ..\examples\RamlToOpenApiConverter.md 19 | ..\examples\RestEase-Client-Generator.md = ..\examples\RestEase-Client-Generator.md 20 | ..\examples\System.Linq.Dynamic.Core.md = ..\examples\System.Linq.Dynamic.Core.md 21 | ..\examples\System.Linq.Dynamic.Core.txt = ..\examples\System.Linq.Dynamic.Core.txt 22 | ..\examples\WireMock.Net.md = ..\examples\WireMock.Net.md 23 | ..\examples\WireMock.Net.txt = ..\examples\WireMock.Net.txt 24 | EndProjectSection 25 | EndProject 26 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GitHubReleaseNotes.Logic", "GitHubReleaseNotes.Logic\GitHubReleaseNotes.Logic.csproj", "{B6269AAC-170A-43D0-8B9B-579DED3D9A99}" 27 | EndProject 28 | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Chocolatey", "Chocolatey", "{13B407F6-F183-4D36-8218-497AF9C05280}" 29 | ProjectSection(SolutionItems) = preProject 30 | ..\Chocolatey\GitHubReleaseNotes\generate.linq = ..\Chocolatey\GitHubReleaseNotes\generate.linq 31 | ..\Chocolatey\GitHubReleaseNotes\GitHubReleaseNotes.nuspec = ..\Chocolatey\GitHubReleaseNotes\GitHubReleaseNotes.nuspec 32 | ..\Chocolatey\GitHubReleaseNotes\HowTo.md = ..\Chocolatey\GitHubReleaseNotes\HowTo.md 33 | ..\Chocolatey\GitHubReleaseNotes\ReadMe.md = ..\Chocolatey\GitHubReleaseNotes\ReadMe.md 34 | EndProjectSection 35 | EndProject 36 | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tools", "Tools", "{EC3EE34B-AC6A-4051-90D8-BECA56E110CE}" 37 | ProjectSection(SolutionItems) = preProject 38 | ..\Chocolatey\GitHubReleaseNotes\tools\chocolateyinstall.ps1 = ..\Chocolatey\GitHubReleaseNotes\tools\chocolateyinstall.ps1 39 | ..\Chocolatey\GitHubReleaseNotes\tools\chocolateyuninstall.ps1 = ..\Chocolatey\GitHubReleaseNotes\tools\chocolateyuninstall.ps1 40 | ..\Chocolatey\GitHubReleaseNotes\tools\LICENSE.txt = ..\Chocolatey\GitHubReleaseNotes\tools\LICENSE.txt 41 | ..\Chocolatey\GitHubReleaseNotes\tools\VERIFICATION.txt = ..\Chocolatey\GitHubReleaseNotes\tools\VERIFICATION.txt 42 | EndProjectSection 43 | EndProject 44 | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "winget-pkgs", "winget-pkgs", "{1D8E407B-B13C-4377-8D6E-76521411105D}" 45 | ProjectSection(SolutionItems) = preProject 46 | ..\Wix\generate files.linq = ..\Wix\generate files.linq 47 | ..\Wix\generate guid.linq = ..\Wix\generate guid.linq 48 | ..\Wix\HowTo.md = ..\Wix\HowTo.md 49 | ..\Wix\productGuid.txt = ..\Wix\productGuid.txt 50 | ..\Wix\upgradeGuid.txt = ..\Wix\upgradeGuid.txt 51 | EndProjectSection 52 | EndProject 53 | Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "Setup", "..\Wix\Setup\Setup.wixproj", "{9456D153-CBDD-470B-9BFF-17C145ED9C24}" 54 | EndProject 55 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GitHubReleaseNotes.Tool", "dotnet-githubreleasenotes\GitHubReleaseNotes.Tool.csproj", "{A50D0A88-AC3D-455E-9048-B9BF6E6E2E5F}" 56 | EndProject 57 | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "1.0.9.0", "1.0.9.0", "{CB61AA1D-6C90-4002-939F-77ABB1830CE4}" 58 | ProjectSection(SolutionItems) = preProject 59 | ..\Wix\1.0.9.0\StefHeyenrath.GitHubReleaseNotes.installer.yaml = ..\Wix\1.0.9.0\StefHeyenrath.GitHubReleaseNotes.installer.yaml 60 | ..\Wix\1.0.9.0\StefHeyenrath.GitHubReleaseNotes.locale.en-US.yaml = ..\Wix\1.0.9.0\StefHeyenrath.GitHubReleaseNotes.locale.en-US.yaml 61 | ..\Wix\1.0.9.0\StefHeyenrath.GitHubReleaseNotes.yaml = ..\Wix\1.0.9.0\StefHeyenrath.GitHubReleaseNotes.yaml 62 | EndProjectSection 63 | EndProject 64 | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Wix [not used anymore]", "Wix [not used anymore]", "{E0D35E17-7751-4C7E-BA6E-86F475EA54D9}" 65 | EndProject 66 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GitHubReleaseNotes", "GitHubReleaseNotes\GitHubReleaseNotes.csproj", "{E851802A-C1F1-47BB-8725-1FD1868CC6EB}" 67 | EndProject 68 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GitHubReleaseNotes.NET48", "GitHubReleaseNotes.NET48\GitHubReleaseNotes.NET48.csproj", "{B6269AAC-170A-43D0-8B9B-579DED3D9A00}" 69 | EndProject 70 | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "1.0.10.0", "1.0.10.0", "{4A8497B4-9F89-4989-AC7A-7E65245D64BC}" 71 | ProjectSection(SolutionItems) = preProject 72 | ..\Wix\1.0.10.0\StefHeyenrath.GitHubReleaseNotes.installer.yaml = ..\Wix\1.0.10.0\StefHeyenrath.GitHubReleaseNotes.installer.yaml 73 | ..\Wix\1.0.10.0\StefHeyenrath.GitHubReleaseNotes.locale.en-US.yaml = ..\Wix\1.0.10.0\StefHeyenrath.GitHubReleaseNotes.locale.en-US.yaml 74 | ..\Wix\1.0.10.0\StefHeyenrath.GitHubReleaseNotes.yaml = ..\Wix\1.0.10.0\StefHeyenrath.GitHubReleaseNotes.yaml 75 | EndProjectSection 76 | EndProject 77 | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "1.0.10.1", "1.0.10.1", "{1465CF9D-BCBB-450B-AD34-9D4E965C93B6}" 78 | ProjectSection(SolutionItems) = preProject 79 | ..\Wix\1.0.10.1\StefHeyenrath.GitHubReleaseNotes.installer.yaml = ..\Wix\1.0.10.1\StefHeyenrath.GitHubReleaseNotes.installer.yaml 80 | ..\Wix\1.0.10.1\StefHeyenrath.GitHubReleaseNotes.locale.en-US.yaml = ..\Wix\1.0.10.1\StefHeyenrath.GitHubReleaseNotes.locale.en-US.yaml 81 | ..\Wix\1.0.10.1\StefHeyenrath.GitHubReleaseNotes.yaml = ..\Wix\1.0.10.1\StefHeyenrath.GitHubReleaseNotes.yaml 82 | EndProjectSection 83 | EndProject 84 | Global 85 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 86 | Debug|Any CPU = Debug|Any CPU 87 | Debug|x86 = Debug|x86 88 | Release|Any CPU = Release|Any CPU 89 | Release|x86 = Release|x86 90 | EndGlobalSection 91 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 92 | {B6269AAC-170A-43D0-8B9B-579DED3D9A99}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 93 | {B6269AAC-170A-43D0-8B9B-579DED3D9A99}.Debug|Any CPU.Build.0 = Debug|Any CPU 94 | {B6269AAC-170A-43D0-8B9B-579DED3D9A99}.Debug|x86.ActiveCfg = Debug|Any CPU 95 | {B6269AAC-170A-43D0-8B9B-579DED3D9A99}.Debug|x86.Build.0 = Debug|Any CPU 96 | {B6269AAC-170A-43D0-8B9B-579DED3D9A99}.Release|Any CPU.ActiveCfg = Release|Any CPU 97 | {B6269AAC-170A-43D0-8B9B-579DED3D9A99}.Release|Any CPU.Build.0 = Release|Any CPU 98 | {B6269AAC-170A-43D0-8B9B-579DED3D9A99}.Release|x86.ActiveCfg = Release|Any CPU 99 | {B6269AAC-170A-43D0-8B9B-579DED3D9A99}.Release|x86.Build.0 = Release|Any CPU 100 | {9456D153-CBDD-470B-9BFF-17C145ED9C24}.Debug|Any CPU.ActiveCfg = Debug|x86 101 | {9456D153-CBDD-470B-9BFF-17C145ED9C24}.Debug|x86.ActiveCfg = Debug|x86 102 | {9456D153-CBDD-470B-9BFF-17C145ED9C24}.Debug|x86.Build.0 = Debug|x86 103 | {9456D153-CBDD-470B-9BFF-17C145ED9C24}.Release|Any CPU.ActiveCfg = Release|x86 104 | {9456D153-CBDD-470B-9BFF-17C145ED9C24}.Release|x86.ActiveCfg = Release|x86 105 | {9456D153-CBDD-470B-9BFF-17C145ED9C24}.Release|x86.Build.0 = Release|x86 106 | {A50D0A88-AC3D-455E-9048-B9BF6E6E2E5F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 107 | {A50D0A88-AC3D-455E-9048-B9BF6E6E2E5F}.Debug|Any CPU.Build.0 = Debug|Any CPU 108 | {A50D0A88-AC3D-455E-9048-B9BF6E6E2E5F}.Debug|x86.ActiveCfg = Debug|Any CPU 109 | {A50D0A88-AC3D-455E-9048-B9BF6E6E2E5F}.Debug|x86.Build.0 = Debug|Any CPU 110 | {A50D0A88-AC3D-455E-9048-B9BF6E6E2E5F}.Release|Any CPU.ActiveCfg = Release|Any CPU 111 | {A50D0A88-AC3D-455E-9048-B9BF6E6E2E5F}.Release|Any CPU.Build.0 = Release|Any CPU 112 | {A50D0A88-AC3D-455E-9048-B9BF6E6E2E5F}.Release|x86.ActiveCfg = Release|Any CPU 113 | {A50D0A88-AC3D-455E-9048-B9BF6E6E2E5F}.Release|x86.Build.0 = Release|Any CPU 114 | {E851802A-C1F1-47BB-8725-1FD1868CC6EB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 115 | {E851802A-C1F1-47BB-8725-1FD1868CC6EB}.Debug|Any CPU.Build.0 = Debug|Any CPU 116 | {E851802A-C1F1-47BB-8725-1FD1868CC6EB}.Debug|x86.ActiveCfg = Debug|Any CPU 117 | {E851802A-C1F1-47BB-8725-1FD1868CC6EB}.Debug|x86.Build.0 = Debug|Any CPU 118 | {E851802A-C1F1-47BB-8725-1FD1868CC6EB}.Release|Any CPU.ActiveCfg = Release|Any CPU 119 | {E851802A-C1F1-47BB-8725-1FD1868CC6EB}.Release|Any CPU.Build.0 = Release|Any CPU 120 | {E851802A-C1F1-47BB-8725-1FD1868CC6EB}.Release|x86.ActiveCfg = Release|Any CPU 121 | {E851802A-C1F1-47BB-8725-1FD1868CC6EB}.Release|x86.Build.0 = Release|Any CPU 122 | {B6269AAC-170A-43D0-8B9B-579DED3D9A00}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 123 | {B6269AAC-170A-43D0-8B9B-579DED3D9A00}.Debug|Any CPU.Build.0 = Debug|Any CPU 124 | {B6269AAC-170A-43D0-8B9B-579DED3D9A00}.Debug|x86.ActiveCfg = Debug|Any CPU 125 | {B6269AAC-170A-43D0-8B9B-579DED3D9A00}.Debug|x86.Build.0 = Debug|Any CPU 126 | {B6269AAC-170A-43D0-8B9B-579DED3D9A00}.Release|Any CPU.ActiveCfg = Release|Any CPU 127 | {B6269AAC-170A-43D0-8B9B-579DED3D9A00}.Release|Any CPU.Build.0 = Release|Any CPU 128 | {B6269AAC-170A-43D0-8B9B-579DED3D9A00}.Release|x86.ActiveCfg = Release|Any CPU 129 | {B6269AAC-170A-43D0-8B9B-579DED3D9A00}.Release|x86.Build.0 = Release|Any CPU 130 | EndGlobalSection 131 | GlobalSection(SolutionProperties) = preSolution 132 | HideSolutionNode = FALSE 133 | EndGlobalSection 134 | GlobalSection(NestedProjects) = preSolution 135 | {B6269AAC-170A-43D0-8B9B-579DED3D9A99} = {EF77BB40-C919-4644-81A3-968854FB9B23} 136 | {EC3EE34B-AC6A-4051-90D8-BECA56E110CE} = {13B407F6-F183-4D36-8218-497AF9C05280} 137 | {9456D153-CBDD-470B-9BFF-17C145ED9C24} = {E0D35E17-7751-4C7E-BA6E-86F475EA54D9} 138 | {A50D0A88-AC3D-455E-9048-B9BF6E6E2E5F} = {EF77BB40-C919-4644-81A3-968854FB9B23} 139 | {CB61AA1D-6C90-4002-939F-77ABB1830CE4} = {1D8E407B-B13C-4377-8D6E-76521411105D} 140 | {E851802A-C1F1-47BB-8725-1FD1868CC6EB} = {EF77BB40-C919-4644-81A3-968854FB9B23} 141 | {B6269AAC-170A-43D0-8B9B-579DED3D9A00} = {EF77BB40-C919-4644-81A3-968854FB9B23} 142 | {4A8497B4-9F89-4989-AC7A-7E65245D64BC} = {1D8E407B-B13C-4377-8D6E-76521411105D} 143 | {1465CF9D-BCBB-450B-AD34-9D4E965C93B6} = {1D8E407B-B13C-4377-8D6E-76521411105D} 144 | EndGlobalSection 145 | GlobalSection(ExtensibilityGlobals) = postSolution 146 | SolutionGuid = {6A791AAB-CF55-4174-A6B7-C2AC7E7DECB2} 147 | EndGlobalSection 148 | EndGlobal 149 | -------------------------------------------------------------------------------- /src/GitHubReleaseNotes.sln.DotSettings: -------------------------------------------------------------------------------- 1 | <wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation"> 2 | <s:Boolean x:Key="/Default/UserDictionary/Words/=Heyenrath/@EntryIndexedValue">True</s:Boolean> 3 | <s:Boolean x:Key="/Default/UserDictionary/Words/=Octokit/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary> -------------------------------------------------------------------------------- /src/GitHubReleaseNotes/ConfigurationParser.cs: -------------------------------------------------------------------------------- 1 | using System.IO; 2 | using GitHubReleaseNotes.Logic; 3 | 4 | namespace GitHubReleaseNotes; 5 | 6 | internal static class ConfigurationParser 7 | { 8 | internal static Configuration Parse(string[] args) 9 | { 10 | var parser = new SimpleCommandLineParser(); 11 | parser.Parse(args); 12 | 13 | return new Configuration 14 | { 15 | RepositoryPath = Path.Combine(parser.GetStringValue("path", string.Empty), ".git"), 16 | OutputFile = parser.GetStringValue("output"), 17 | Culture = parser.GetCultureInfo("language"), 18 | Version = parser.GetStringValue("version", "next"), 19 | TemplatePath = parser.GetStringValue("template"), 20 | SkipEmptyReleases = parser.GetBoolValue("skip-empty-releases") || parser.Contains("skip-empty-releases"), // "--skip-empty-releases true" and "--skip-empty-releases" both qualify 21 | Token = parser.GetStringValue("token"), 22 | Login = parser.GetStringValue("login"), 23 | Password = parser.GetStringValue("password"), 24 | ExcludeLabels = parser.GetValues("exclude-labels") 25 | }; 26 | } 27 | } -------------------------------------------------------------------------------- /src/GitHubReleaseNotes/GitHubReleaseNotes.csproj: -------------------------------------------------------------------------------- 1 | <Project Sdk="Microsoft.NET.Sdk"> 2 | 3 | <PropertyGroup> 4 | <OutputType>Exe</OutputType> 5 | <TargetFramework>net8.0</TargetFramework> 6 | <AssemblyName>GitHubReleaseNotes</AssemblyName> 7 | <RootNamespace>GitHubReleaseNotes</RootNamespace> 8 | <PackageIcon>icon.png</PackageIcon> 9 | <ProjectGuid>{E851802A-C1F1-47BB-8725-1FD1868CC6EB}</ProjectGuid> 10 | <PublishSingleFile>true</PublishSingleFile> 11 | <SelfContained>True</SelfContained> 12 | 13 | <!-- 14 | handlebars.net\2.1.4\lib\netstandard2.1\Handlebars.dll : warning IL2104: Assembly 'Handlebars' produced trim warnings. 15 | octokit\0.48.0\lib\netstandard2.0\Octokit.dll : warning IL2104: Assembly 'Octokit' produced trim warnings. 16 | --> 17 | <PublishTrimmed>false</PublishTrimmed> 18 | </PropertyGroup> 19 | 20 | <!--<PropertyGroup Condition="'$(Configuration)' == 'Release'"> 21 | <GeneratePackageOnBuild>true</GeneratePackageOnBuild> 22 | </PropertyGroup>--> 23 | 24 | <ItemGroup> 25 | <ProjectReference Include="..\GitHubReleaseNotes.Logic\GitHubReleaseNotes.Logic.csproj" /> 26 | </ItemGroup> 27 | 28 | <ItemGroup> 29 | <None Include="../../icon.png" Pack="true" PackagePath="" /> 30 | </ItemGroup> 31 | 32 | <Target Name="PublishAndZip" AfterTargets="Build"> 33 | <Exec Command="dotnet publish --no-build --no-restore -r win-x64 --self-contained --configuration $(Configuration)" /> 34 | <Zip SourceFile="$(OutputPath)\publish\$(AssemblyName).exe" ZipFileName="$(OutputPath)\publish\$(AssemblyName).zip" /> 35 | </Target> 36 | 37 | <!-- 38 | To use "Microsoft.Build.Tasks.v12.0.dll", install Microsoft.VisualStudio.2022.BuildTools 39 | 40 | Note that the two dashes in front of "id" need to be escaped in the command below: 41 | 42 | winget install \-\-id=Microsoft.VisualStudio.2022.BuildTools -e 43 | --> 44 | <UsingTask TaskName="Zip" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v12.0.dll"> 45 | <ParameterGroup> 46 | <SourceFile ParameterType="System.String" Required="true" /> 47 | <ZipFileName ParameterType="System.String" Required="true" /> 48 | </ParameterGroup> 49 | 50 | <Task> 51 | <Reference Include="System.IO.Compression.FileSystem" /> 52 | <Using Namespace="System.IO.Compression" /> 53 | <Code Type="Fragment" Language="cs"> 54 | <![CDATA[ 55 | try 56 | { 57 | Log.LogMessage(string.Format("Zipping file {0} to {1}", SourceFile, ZipFileName)); 58 | 59 | // Temporarily create a directory to hold the file to be zipped 60 | string tempFolder = Path.Combine(Path.GetDirectoryName(SourceFile), Path.GetFileNameWithoutExtension(SourceFile) + "_temp"); 61 | Directory.CreateDirectory(tempFolder); 62 | 63 | // Copy the source file to the temp directory 64 | string tempFilePath = Path.Combine(tempFolder, Path.GetFileName(SourceFile)); 65 | File.Copy(SourceFile, tempFilePath, true); 66 | 67 | // Create a zip archive that contains the file in the temp directory 68 | if (File.Exists(ZipFileName)) 69 | { 70 | File.Delete(ZipFileName); // Ensure we are creating a new zip file 71 | } 72 | ZipFile.CreateFromDirectory(tempFolder, ZipFileName); 73 | 74 | // Clean up the temp directory 75 | Directory.Delete(tempFolder, true); 76 | 77 | return true; 78 | } 79 | catch(Exception ex) 80 | { 81 | Log.LogErrorFromException(ex); 82 | return false; 83 | } 84 | ]]> 85 | </Code> 86 | </Task> 87 | </UsingTask> 88 | 89 | </Project> -------------------------------------------------------------------------------- /src/GitHubReleaseNotes/Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Reflection; 3 | using System.Threading.Tasks; 4 | using GitHubReleaseNotes.Logic; 5 | 6 | namespace GitHubReleaseNotes; 7 | 8 | class Program 9 | { 10 | static async Task Main(string[] args) 11 | { 12 | var configuration = ConfigurationParser.Parse(args); 13 | 14 | Console.WriteLine($"GitHubReleaseNotes ({Assembly.GetExecutingAssembly().GetName().Version})"); 15 | await new Generator(configuration).GenerateAsync(); 16 | } 17 | } -------------------------------------------------------------------------------- /src/GitHubReleaseNotes/SimpleCommandLineParser.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Globalization; 4 | using System.Linq; 5 | 6 | namespace GitHubReleaseNotes; 7 | 8 | // Based on 9 | // - http://blog.gauffin.org/2014/12/simple-command-line-parser/ 10 | // - https://github.com/WireMock-Net/WireMock.Net/blob/master/src/WireMock.Net.StandAlone/SimpleCommandLineParser.cs 11 | internal class SimpleCommandLineParser 12 | { 13 | private const string Sigil = "--"; 14 | 15 | private IDictionary<string, string[]> Arguments { get; } = new Dictionary<string, string[]>(); 16 | 17 | public void Parse(string[] args) 18 | { 19 | string? currentName = null; 20 | 21 | var values = new List<string>(); 22 | foreach (string arg in args) 23 | { 24 | if (arg.StartsWith(Sigil)) 25 | { 26 | if (!string.IsNullOrEmpty(currentName)) 27 | { 28 | Arguments[currentName!] = values.ToArray(); 29 | } 30 | 31 | values.Clear(); 32 | currentName = arg.Substring(Sigil.Length); 33 | } 34 | else if (string.IsNullOrEmpty(currentName)) 35 | { 36 | Arguments[arg] = Array.Empty<string>(); 37 | } 38 | else 39 | { 40 | values.Add(arg); 41 | } 42 | } 43 | 44 | if (!string.IsNullOrEmpty(currentName)) 45 | { 46 | Arguments[currentName!] = values.ToArray(); 47 | } 48 | } 49 | 50 | public bool Contains(string name) 51 | { 52 | return Arguments.ContainsKey(name); 53 | } 54 | 55 | public string[]? GetValues(string name, string[]? defaultValues = null) 56 | { 57 | return Contains(name) ? Arguments[name] : defaultValues; 58 | } 59 | 60 | public T? GetValue<T>(string name, Func<string[], T> func, T? defaultValue = default) 61 | { 62 | return Contains(name) ? func(Arguments[name]) : defaultValue; 63 | } 64 | 65 | public bool GetBoolValue(string name, bool defaultValue = false) 66 | { 67 | return GetValue(name, values => 68 | { 69 | var value = values.FirstOrDefault(); 70 | return !string.IsNullOrEmpty(value) ? bool.Parse(value) : defaultValue; 71 | }, defaultValue); 72 | } 73 | 74 | public int? GetIntValue(string name, int? defaultValue = null) 75 | { 76 | return GetValue(name, values => 77 | { 78 | var value = values.FirstOrDefault(); 79 | return !string.IsNullOrEmpty(value) ? int.Parse(value) : defaultValue; 80 | }, defaultValue); 81 | } 82 | 83 | public string? GetStringValue(string name) 84 | { 85 | return GetValue(name, values => values.FirstOrDefault()); 86 | } 87 | 88 | public string GetStringValue(string name, string defaultValue) 89 | { 90 | return GetValue(name, values => values.FirstOrDefault() ?? defaultValue) ?? defaultValue; 91 | } 92 | 93 | public CultureInfo GetCultureInfo(string name) 94 | { 95 | var value = GetStringValue(name, "en"); 96 | return value == "system" ? CultureInfo.CurrentCulture : new CultureInfo(value); 97 | } 98 | } -------------------------------------------------------------------------------- /src/dotnet-githubreleasenotes/GitHubReleaseNotes.Tool.csproj: -------------------------------------------------------------------------------- 1 | <Project Sdk="Microsoft.NET.Sdk"> 2 | 3 | <PropertyGroup> 4 | <OutputType>Exe</OutputType> 5 | <TargetFramework>net6</TargetFramework> 6 | <PackAsTool>true</PackAsTool> 7 | <ToolCommandName>GitHubReleaseNotes</ToolCommandName> 8 | <Title>GitHubReleaseNotes 9 | GitHubReleaseNotes 10 | GitHubReleaseNotes 11 | 12 | 13 | 14 | true 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /src/dotnet-githubreleasenotes/Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Globalization; 4 | using System.Reflection; 5 | using System.Threading.Tasks; 6 | using CommandLine; 7 | using GitHubReleaseNotes.Logic; 8 | 9 | namespace GitHubReleaseNotes; 10 | 11 | public class Program 12 | { 13 | internal class Options : IConfiguration 14 | { 15 | [Option("path", Default = "", HelpText = "The path from the git repository. If not supplied, the current folder is used.")] 16 | public string Path { get; set; } = string.Empty; 17 | 18 | public string RepositoryPath => System.IO.Path.Combine(Path, ".git"); 19 | 20 | [Option("output", HelpText = "The location from the generated Release Notes. If not supplied, the output is written to the console.")] 21 | public string? OutputFile { get; set; } 22 | 23 | [Option("version", Default = "next", HelpText = "Define a custom version name for the latest release instead of the value 'next'.")] 24 | public string Version { get; set; } = "next"; 25 | 26 | [Option("language", Default = "en", HelpText = "Provide the language (two letter according to ISO-639-1) which is used to format the dates. If not provided, 'en' is used. It's also possible to use a value like 'system', which takes the current system ui language.")] 27 | public string Language { get; set; } = "en"; 28 | 29 | public CultureInfo Culture => string.IsNullOrEmpty(Language) || Language == "system" ? CultureInfo.CurrentCulture : new CultureInfo(Language); 30 | 31 | [Option("skip-empty-releases", HelpText = "Define this optional argument to skip writing releases which have no associated Issues or Pull Requests.")] 32 | public bool SkipEmptyReleases { get; set; } 33 | 34 | [Option("template", HelpText = "Provide a custom Handlebars template instead of the default template to generate the Release Notes.")] 35 | public string? TemplatePath { get; set; } 36 | 37 | [Option("token", HelpText = "Provide the GitHub API token as authentication for connecting to private repositories. Or to get more GitHub API requests.")] 38 | public string? Token { get; set; } 39 | 40 | [Option("login", HelpText = "Provide the GitHub API login as authentication for connecting to private repositories.")] 41 | public string? Login { get; set; } 42 | 43 | [Option("password", HelpText = "Provide the GitHub API password as authentication for connecting to private repositories.")] 44 | public string? Password { get; set; } 45 | 46 | [Option("exclude-labels", HelpText = "Exclude Issues and Pull Requests which have these labels set.")] 47 | public IEnumerable? ExcludeLabels { get; set; } 48 | } 49 | 50 | static async Task Main(string[] args) 51 | { 52 | Console.WriteLine($"GitHubReleaseNotes ({Assembly.GetExecutingAssembly().GetName().Version})"); 53 | 54 | await new Parser(cfg => 55 | { 56 | cfg.AutoVersion = false; 57 | cfg.AutoHelp = true; 58 | cfg.HelpWriter = Console.Out; 59 | }).ParseArguments(args).WithParsedAsync(options => new Generator(options).GenerateAsync()); 60 | } 61 | } -------------------------------------------------------------------------------- /src/dotnet-githubreleasenotes/Properties/launchSettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "profiles": { 3 | "GitHubReleaseNotes.Tool": { 4 | "commandName": "Project", 5 | "commandLineArgs": "--path \"C:\\Dev\\GitHub\\WireMock.Net\" --output ../../../../../examples/WireMock.Net.md --skip-empty-releases --exclude-labels invalid question --language en --token %GH_TOKEN%" 6 | } 7 | } 8 | } --------------------------------------------------------------------------------