public SemanticReleaseNotes GenerateReleaseNotes() { var context = _context; using (var gitRepoContext = GetRepository(context, _fileSystem)) { // Remote repo's require some additional preparation before first use. if (gitRepoContext.IsRemote) { gitRepoContext.PrepareRemoteRepoForUse(context.Repository.Branch); if (!string.IsNullOrWhiteSpace(context.OutputFile)) { gitRepoContext.CheckoutFilesIfExist(context.OutputFile); } } var gitRepo = gitRepoContext.Repository; if (context.IssueTracker == null) { // TODO: Write auto detection mechanism which is better than this throw new GitReleaseNotesException("Feature to automatically detect issue tracker must be written"); //var firstOrDefault = _issueTrackers.FirstOrDefault(i => i.Value.RemotePresentWhichMatches); //if (firstOrDefault.Value != null) //{ // issueTracker = firstOrDefault.Value; //} } var issueTracker = _issueTrackerFactory.CreateIssueTracker(context, gitRepo); if (issueTracker == null) { throw new GitReleaseNotesException("Failed to create issue tracker from context, cannot continue"); } var releaseFileWriter = new ReleaseFileWriter(_fileSystem); string outputFile = null; var previousReleaseNotes = new SemanticReleaseNotes(); var outputPath = gitRepo.Info.Path; var outputDirectory = new DirectoryInfo(outputPath); if (outputDirectory.Name == ".git") { outputPath = outputDirectory.Parent.FullName; } if (!string.IsNullOrEmpty(context.OutputFile)) { outputFile = Path.IsPathRooted(context.OutputFile) ? context.OutputFile : Path.Combine(outputPath, context.OutputFile); previousReleaseNotes = new ReleaseNotesFileReader(_fileSystem, outputPath).ReadPreviousReleaseNotes(outputFile); } var categories = new Categories(context.Categories, context.AllLabels); var tagToStartFrom = context.AllTags ? GitRepositoryInfoFinder.GetFirstCommit(gitRepo) : GitRepositoryInfoFinder.GetLastTaggedCommit(gitRepo) ?? GitRepositoryInfoFinder.GetFirstCommit(gitRepo); var currentReleaseInfo = GitRepositoryInfoFinder.GetCurrentReleaseInfo(gitRepo); if (!string.IsNullOrEmpty(context.Version)) { currentReleaseInfo.Name = context.Version; currentReleaseInfo.When = DateTimeOffset.Now; } var releaseNotes = GenerateReleaseNotes( context, gitRepo, issueTracker, previousReleaseNotes, categories, tagToStartFrom, currentReleaseInfo); var releaseNotesOutput = releaseNotes.ToString(); releaseFileWriter.OutputReleaseNotesFile(releaseNotesOutput, outputFile); return releaseNotes; } }
static int Main(string[] args) { GitReleaseNotesEnvironment.Log = new ConsoleLog(); var modelBindingDefinition = Configuration.Configure<GitReleaseNotesArguments>(); if (args.Any(a => a == "/?" || a == "?" || a.Equals("/help", StringComparison.InvariantCultureIgnoreCase))) { ShowHelp(modelBindingDefinition); return 0; } var exitCode = 0; var arguments = modelBindingDefinition.CreateAndBind(args); if (string.IsNullOrEmpty(arguments.OutputFile)) { ShowHelp(modelBindingDefinition); return 1; } var context = arguments.ToContext(); //if (!context.Validate()) //{ // return -1; //} try { var fileSystem = new FileSystem.FileSystem(); var releaseFileWriter = new ReleaseFileWriter(fileSystem); string outputFile = null; var previousReleaseNotes = new SemanticReleaseNotes(); var outputPath = context.WorkingDirectory; var outputDirectory = new DirectoryInfo(outputPath); if (outputDirectory.Name == ".git") { outputPath = outputDirectory.Parent.FullName; } if (!string.IsNullOrEmpty(arguments.OutputFile)) { outputFile = Path.IsPathRooted(arguments.OutputFile) ? arguments.OutputFile : Path.Combine(outputPath, arguments.OutputFile); previousReleaseNotes = new ReleaseNotesFileReader(fileSystem, outputPath).ReadPreviousReleaseNotes(outputFile); } var releaseNotesGenerator = new ReleaseNotesGenerator(context); var releaseNotes = releaseNotesGenerator.GenerateReleaseNotesAsync(previousReleaseNotes).Result; var releaseNotesOutput = releaseNotes.ToString(); releaseFileWriter.OutputReleaseNotesFile(releaseNotesOutput, outputFile); Log.WriteLine("Done"); } catch (GitReleaseNotesException ex) { exitCode = -1; Log.WriteLine("An expected error occurred: {0}", ex.Message); } catch (Exception ex) { exitCode = -2; Log.WriteLine("An unexpected error occurred: {0}", ex.Message); } if (Debugger.IsAttached) { Console.WriteLine("Press any key to continue"); Console.ReadKey(); } return exitCode; }
private static int GenerateReleaseNotes(string[] args) { var modelBindingDefinition = Args.Configuration.Configure<GitReleaseNotesArguments>(); if (args.Any(a => a == "/?" || a == "?" || a.Equals("/help", StringComparison.InvariantCultureIgnoreCase))) { var help = new HelpProvider().GenerateModelHelp(modelBindingDefinition); var f = new ConsoleHelpFormatter(); f.WriteHelp(help, Console.Out); return 0; } var arguments = modelBindingDefinition.CreateAndBind(args); if (!ArgumentVerifier.VerifyArguments(arguments)) { return 1; } var workingDirectory = arguments.WorkingDirectory ?? Directory.GetCurrentDirectory(); var gitDirectory = GitDirFinder.TreeWalkForGitDir(workingDirectory); if (string.IsNullOrEmpty(gitDirectory)) { throw new Exception("Failed to find .git directory."); } Console.WriteLine("Git directory found at {0}", gitDirectory); var repositoryRoot = Directory.GetParent(gitDirectory).FullName; var gitRepo = new Repository(gitDirectory); CreateIssueTrackers(gitRepo, arguments); IIssueTracker issueTracker = null; if (arguments.IssueTracker == null) { var firstOrDefault = _issueTrackers.FirstOrDefault(i => i.Value.RemotePresentWhichMatches); if (firstOrDefault.Value != null) issueTracker = firstOrDefault.Value; } if (issueTracker == null) { if (!_issueTrackers.ContainsKey(arguments.IssueTracker.Value)) throw new Exception(string.Format("{0} is not a known issue tracker", arguments.IssueTracker.Value)); issueTracker = _issueTrackers[arguments.IssueTracker.Value]; } if (!issueTracker.VerifyArgumentsAndWriteErrorsToConsole()) { return 1; } var fileSystem = new FileSystem.FileSystem(); var releaseFileWriter = new ReleaseFileWriter(fileSystem); string outputFile = null; var previousReleaseNotes = new SemanticReleaseNotes(); if (!string.IsNullOrEmpty(arguments.OutputFile)) { outputFile = Path.IsPathRooted(arguments.OutputFile) ? arguments.OutputFile : Path.Combine(repositoryRoot, arguments.OutputFile); previousReleaseNotes = new ReleaseNotesFileReader(fileSystem, repositoryRoot).ReadPreviousReleaseNotes(outputFile); } var categories = arguments.Categories == null ? Categories : Categories.Concat(arguments.Categories.Split(',')).ToArray(); TaggedCommit tagToStartFrom = arguments.AllTags ? GitRepositoryInfoFinder.GetFirstCommit(gitRepo) : GitRepositoryInfoFinder.GetLastTaggedCommit(gitRepo) ?? GitRepositoryInfoFinder.GetFirstCommit(gitRepo); var currentReleaseInfo = GitRepositoryInfoFinder.GetCurrentReleaseInfo(gitRepo); if (!string.IsNullOrEmpty(arguments.Version)) { currentReleaseInfo.Name = arguments.Version; currentReleaseInfo.When = DateTimeOffset.Now; } var releaseNotes = ReleaseNotesGenerator.GenerateReleaseNotes( gitRepo, issueTracker, previousReleaseNotes, categories, tagToStartFrom, currentReleaseInfo, issueTracker.DiffUrlFormat); var releaseNotesOutput = releaseNotes.ToString(); releaseFileWriter.OutputReleaseNotesFile(releaseNotesOutput, outputFile); PublishReleaseIfNeeded(releaseNotesOutput, arguments, issueTracker); return 0; }