public void VerifyOverriddenChangesAreUsed() { var yesterday = DateTimeOffset.Now.AddDays(-1); var twoDaysAgo = DateTimeOffset.Now.AddDays(-2); var badChange = new DefaultChange(" ", "Added", "WithoutVersion", yesterday); var fixedChange = new DefaultChange("0.2.0", badChange.Tag, badChange.Summary, badChange.Date); var fineChange = new DefaultChange("0.1.0", "Removed", "Another Summary", twoDaysAgo); var overrides = new Dictionary <string, IChange> { { ToSha1String(badChange), fixedChange } }; var changes = new List <IChange> { badChange, fineChange }; var expectedChanges = new List <IChange> { fixedChange, fineChange }; var repoMock = new Mock <IRepository>(); var commitLog = Mock.Of <IQueryableCommitLog>(cl => cl.GetEnumerator() == MockCommitEnumerator(changes)); var parserMock = new Mock <ICommitParser <IChange> >(); parserMock.Setup(p => p.Parse(fixedChange)).Returns(fixedChange); parserMock.Setup(p => p.Parse(It.IsAny <Commit>())).Returns(fineChange); repoMock.Setup(r => r.Commits).Returns(commitLog); var reader = new GitReader <IChange>(repoMock.Object, parserMock.Object, overrides); var actualChanges = reader.Values(); Assert.That(actualChanges, Is.EquivalentTo(expectedChanges)); repoMock.VerifyAll(); }
public void VerifyUnparseableAreSkipped() { var today = DateTimeOffset.Now; var yesterday = DateTimeOffset.Now.AddDays(-1); var twoDaysAgo = DateTimeOffset.Now.AddDays(-2); var changes = new List <IChange> { new DefaultChange("0.2.0", " ", "Without tag", today), new DefaultChange(" ", "Added", "WithoutVersion", yesterday), new DefaultChange("0.1.0", "Removed", "Another Summary", twoDaysAgo) }; var expectedChanges = new List <IChange> { new DefaultChange("0.1.0", "Removed", "Another Summary", twoDaysAgo) }; var repoMock = new Mock <IRepository>(); var commitLog = Mock.Of <IQueryableCommitLog>(cl => cl.GetEnumerator() == MockCommitEnumerator(changes)); var parserMock = new Mock <ICommitParser <IChange> >(); var reader = new GitReader <IChange>(repoMock.Object, parserMock.Object); parserMock.SetupSequence(p => p.Parse(It.IsAny <Commit>())) .Returns((IChange)null) .Returns((IChange)null) .Returns(expectedChanges.First); repoMock.Setup(r => r.Commits).Returns(commitLog); var actualChanges = reader.Values().ToList(); Assert.That(actualChanges, Is.EquivalentTo(expectedChanges)); repoMock.VerifyAll(); }
public void Update() { if (Origin == null) { Log.Error("Can`t find project"); return; } var branches = this.GitLabWrapper.GetBranches(Origin).ToList(); var localBranches = GitReader.GetLocalBranches(); Branches = branches.Where(x => !x.Protected && localBranches.Any(local => local.FriendlyName == x.Name)) .Select(x => new BranchViewModel(GitLabWrapper, this, x.Name)).ToList(); }
public void VerifyReaderReadsFromRepository() { var expectedChanges = new List <IChange> { new DefaultChange("0.2.0", "Added", "Some Summary", DateTimeOffset.Now), new DefaultChange("0.1.0", "Removed", "Another Summary", DateTimeOffset.Now.AddDays(-1)) }; var repoMock = new Mock <IRepository>(); var commitLog = Mock.Of <IQueryableCommitLog>(cl => cl.GetEnumerator() == MockCommitEnumerator(expectedChanges)); var parserMock = new Mock <ICommitParser <IChange> >(); var reader = new GitReader <IChange>(repoMock.Object, parserMock.Object); repoMock.Setup(r => r.Commits).Returns(commitLog); foreach (var expectedChange in expectedChanges) { parserMock.Setup(p => p.Parse(It.Is <Commit>(c => c.Id.Sha == ToSha1String(expectedChange)))).Returns(expectedChange); } Assert.That(reader.Values(), Is.EquivalentTo(expectedChanges)); repoMock.VerifyAll(); }
static void Main(string[] args) { try { var configBuilder = new ConfigurationBuilder().AddJsonFile("appsettings.json"); Parser.Default.ParseArguments <Options>(args) .WithParsed(options => { var additionalSettings = new List <KeyValuePair <string, string> >(); if (!string.IsNullOrEmpty(options.CustomSettingsPath)) { configBuilder.AddJsonFile(options.CustomSettingsPath); } if (!string.IsNullOrEmpty(options.CustomTemplatePath)) { additionalSettings.Add(new KeyValuePair <string, string>("Template", options.CustomTemplatePath)); } if (!string.IsNullOrEmpty(options.ChangeTypesToExclude)) { additionalSettings.Add(new KeyValuePair <string, string>("ChangeTypesToExclude", options.ChangeTypesToExclude)); } if (!string.IsNullOrEmpty(options.MinVersion)) { additionalSettings.Add(new KeyValuePair <string, string>("MinVersion", options.MinVersion)); } if (!string.IsNullOrEmpty(options.RepositoryPath)) { additionalSettings.Add(new KeyValuePair <string, string>("Repository:Path", options.RepositoryPath)); } if (!string.IsNullOrEmpty(options.FileSourcePath)) { additionalSettings.Add(new KeyValuePair <string, string>("FileSource", options.FileSourcePath)); } configBuilder.AddInMemoryCollection(additionalSettings); }); var config = TryOrExit(() => configBuilder.Build(), "Failed to build configuration"); var appConfig = config.Get <AppConfig>(); var template = GetTemplate(appConfig.Template); var repo = TryOrExit(() => new Repository(appConfig.Repository.Path), "Failed to initialize repository"); var idToOverrideChange = new Dictionary <string, IChange>(); var changeTypesToExclude = appConfig.ChangeTypesToExclude.Split(","); var renderer = new StubbleBuilder().Build(); var minVersion = string.IsNullOrEmpty(appConfig.MinVersion) ? null : new ChangeVersion(appConfig.MinVersion); if (appConfig.MultiProject) { var readers = new List <IGenericReader <ProjectChange> >(); var idToProjectChange = new Dictionary <string, ProjectChange>(); if (!string.IsNullOrEmpty(appConfig.FileSource)) { var fileReader = new FileReader <ProjectChange>(appConfig.FileSource, new ProjectFileSourceRowParser(Console.Error)); readers.Add(fileReader); } if (!string.IsNullOrEmpty(appConfig.Repository.OverrideSource)) { var overrideFileReader = new FileReader <OverrideProjectChange>(appConfig.Repository.OverrideSource, new OverrideProjectSourceRowParser(Console.Error)); readers.Add(overrideFileReader); idToProjectChange = overrideFileReader.Values().ToDictionary <OverrideProjectChange, string, ProjectChange>(change => change.Id, change => change); } var parser = new ProjectCommitParser(appConfig.Parsing); var gitReader = new GitReader <ProjectChange>(repo, parser, idToProjectChange); readers.Add(gitReader); var generator = new ProjectChangelogGenerator(readers, template, renderer); var projectToOutput = generator.Generate(minVersion, changeTypesToExclude); foreach (var(project, output) in projectToOutput) { File.WriteAllText($@"{project}-changelog.md", output); } } else { var readers = new List <IGenericReader <IChange> >(); if (!string.IsNullOrEmpty(appConfig.FileSource)) { var fileReader = new FileReader <DefaultChange>(appConfig.FileSource, new DefaultFileSourceRowParser(Console.Error)); readers.Add(fileReader); } if (!string.IsNullOrEmpty(appConfig.Repository.OverrideSource)) { var overrideFileReader = new FileReader <OverrideChange>(appConfig.Repository.OverrideSource, new OverrideSourceRowParser(Console.Error)); idToOverrideChange = overrideFileReader.Values().ToDictionary <OverrideChange, string, IChange>(change => change.Id, change => change); } Dictionary <string, string> commitShaToTagName = null; if (UsesTagAsSource(appConfig.Parsing)) { commitShaToTagName = new Dictionary <string, string>(); foreach (var tag in repo.Tags) { commitShaToTagName.Add(tag.Target.Sha, tag.FriendlyName); } } var commitParser = new DefaultCommitParser(appConfig.Parsing, commitShaToTagName); var gitReader = new GitReader <IChange>(repo, commitParser, idToOverrideChange); readers.Add(gitReader); var cache = new ChangeCache(); var generator = new StringChangelogGenerator(readers, cache, template, renderer); var output = generator.Generate(minVersion, changeTypesToExclude); File.WriteAllText(@"changelog.md", output); } } catch (Exception e) { Console.WriteLine($"{e.Message}"); Environment.Exit(-1); } }