public async Task BranchNewContent() { using var repoPath = GetRepository(out var remote, out var local); string tipSha; string commitSha; var clonePath = Path.Combine(repoPath.Dir.Path, "Clone"); using var clone = new Repository(Repository.Clone(remote, clonePath)); { using var repo = new Repository(local); tipSha = repo.Head.Tip.Sha; commitSha = AddACommit(local).Sha; repo.Head.Tip.Sha.Should().NotBeEquivalentTo(tipSha); repo.Network.Push(repo.Branches[DefaultBranch]); } var versioning = new GitPatcherVersioning(PatcherVersioningEnum.Branch, DefaultBranch); var resp = await GitPatcherRun.CheckoutRunnerRepository( proj : ProjPath, localRepoDir : clonePath, patcherVersioning : versioning, nugetVersioning : TypicalNugetVersioning(), logger : null, cancel : CancellationToken.None, compile : false); resp.IsHaltingError.Should().BeFalse(); resp.RunnableState.Succeeded.Should().BeTrue(); clone.Head.Tip.Sha.Should().BeEquivalentTo(commitSha); clone.Head.FriendlyName.Should().BeEquivalentTo(GitPatcherRun.RunnerBranch); clone.Branches[DefaultBranch].Tip.Sha.Should().BeEquivalentTo(tipSha); }
public async Task TagTargetNewContent() { using var repoPath = GetRepository(out var remote, out var local); var clonePath = Path.Combine(repoPath.Dir.Path, "Clone"); using var clone = new Repository(Repository.Clone(remote, clonePath)); var tagStr = "1.3.4"; string commitSha; { using var repo = new Repository(local); AddACommit(local); commitSha = repo.Head.Tip.Sha; var tag = repo.Tags.Add(tagStr, commitSha); repo.Network.Push(repo.Network.Remotes.First(), tag.CanonicalName); } var versioning = new GitPatcherVersioning(PatcherVersioningEnum.Tag, tagStr); var resp = await GitPatcherRun.CheckoutRunnerRepository( proj : ProjPath, localRepoDir : clonePath, patcherVersioning : versioning, nugetVersioning : TypicalNugetVersioning(), logger : null, cancel : CancellationToken.None, compile : false); resp.IsHaltingError.Should().BeFalse(); resp.RunnableState.Succeeded.Should().BeTrue(); clone.Head.Tip.Sha.Should().BeEquivalentTo(commitSha); clone.Head.FriendlyName.Should().BeEquivalentTo(GitPatcherRun.RunnerBranch); }
public async Task BranchTargetJumpback() { using var repoPath = GetRepository(out var remote, out var local); using var repo = new Repository(local); var tipSha = repo.Head.Tip.Sha; var jbName = "Jumpback"; var jbBranch = repo.CreateBranch(jbName); repo.Branches.Update( jbBranch, b => b.Remote = repo.Network.Remotes.First().Name, b => b.UpstreamBranch = jbBranch.CanonicalName); repo.Network.Push(jbBranch); var commit = AddACommit(local); repo.Head.Tip.Sha.Should().NotBeEquivalentTo(tipSha); var versioning = new GitPatcherVersioning(PatcherVersioningEnum.Branch, jbName); var resp = await GitPatcherRun.CheckoutRunnerRepository( proj : ProjPath, localRepoDir : local, patcherVersioning : versioning, nugetVersioning : TypicalNugetVersioning(), logger : null, cancel : CancellationToken.None, compile : false); resp.IsHaltingError.Should().BeFalse(); resp.RunnableState.Succeeded.Should().BeTrue(); repo.Head.Tip.Sha.Should().BeEquivalentTo(tipSha); repo.Head.FriendlyName.Should().BeEquivalentTo(GitPatcherRun.RunnerBranch); repo.Branches[jbName].Tip.Sha.Should().BeEquivalentTo(tipSha); repo.Branches[DefaultBranch].Tip.Sha.Should().BeEquivalentTo(commit.Sha); }
public async Task TagTargetJumpback() { using var repoPath = GetRepository(out var remote, out var local); var tag = "1.3.4"; using var repo = new Repository(local); var tipSha = repo.Head.Tip.Sha; repo.Tags.Add("1.3.4", tipSha); AddACommit(local); repo.Head.Tip.Sha.Should().NotBeEquivalentTo(tipSha); var versioning = new GitPatcherVersioning(PatcherVersioningEnum.Tag, tag); var resp = await GitPatcherRun.CheckoutRunnerRepository( proj : ProjPath, localRepoDir : local, patcherVersioning : versioning, nugetVersioning : TypicalNugetVersioning(), logger : null, cancel : CancellationToken.None, compile : false); resp.IsHaltingError.Should().BeFalse(); resp.RunnableState.Succeeded.Should().BeTrue(); repo.Head.Tip.Sha.Should().BeEquivalentTo(tipSha); repo.Head.FriendlyName.Should().BeEquivalentTo(GitPatcherRun.RunnerBranch); }
public async Task CreatesRunnerBranch() { using var repoPath = GetRepository(out var remote, out var local); var resp = await GitPatcherRun.CheckoutRunnerRepository( proj : ProjPath, localRepoDir : local, patcherVersioning : TypicalPatcherVersioning(), nugetVersioning : TypicalNugetVersioning(), logger : null, cancel : CancellationToken.None, compile : false); using var repo = new Repository(local); repo.Branches.Select(x => x.FriendlyName).Should().Contain(GitPatcherRun.RunnerBranch); }
public async Task NonExistantProjPath() { using var repoPath = GetRepository(out var remote, out var local); var resp = await GitPatcherRun.CheckoutRunnerRepository( proj : string.Empty, localRepoDir : local, patcherVersioning : TypicalPatcherVersioning(), nugetVersioning : TypicalNugetVersioning(), logger : null, cancel : CancellationToken.None, compile : false); resp.IsHaltingError.Should().BeTrue(); resp.RunnableState.Succeeded.Should().BeFalse(); resp.RunnableState.Reason.Should().Contain("Could not locate target project file"); }
public async Task MalformedSha() { using var repoPath = GetRepository(out var remote, out var local); var versioning = new GitPatcherVersioning(PatcherVersioningEnum.Commit, "derp"); var resp = await GitPatcherRun.CheckoutRunnerRepository( proj : ProjPath, localRepoDir : local, patcherVersioning : versioning, nugetVersioning : TypicalNugetVersioning(), logger : null, cancel : CancellationToken.None, compile : false); resp.IsHaltingError.Should().BeTrue(); resp.RunnableState.Succeeded.Should().BeFalse(); resp.RunnableState.Reason.Should().Contain("Malformed sha string"); }
public async Task UnknownSha() { using var repoPath = GetRepository(out var remote, out var local); var versioning = new GitPatcherVersioning(PatcherVersioningEnum.Commit, "46c207318c1531de7dc2f8e8c2a91aced183bc30"); var resp = await GitPatcherRun.CheckoutRunnerRepository( proj : ProjPath, localRepoDir : local, patcherVersioning : versioning, nugetVersioning : TypicalNugetVersioning(), logger : null, cancel : CancellationToken.None, compile : false); resp.IsHaltingError.Should().BeTrue(); resp.RunnableState.Succeeded.Should().BeFalse(); resp.RunnableState.Reason.Should().Contain("Could not locate commit with given sha"); }
static async Task DoWork( string? mutagenVersion, string? synthesisVersion, CancellationToken cancel) { using var temp = TempFolder.Factory(); var failedDeps = new List<Dependent>(); var projResults = new List<(Dependent, string, ErrorResponse)>(); mutagenVersion ??= Versions.MutagenVersion; synthesisVersion ??= Versions.SynthesisVersion; System.Console.WriteLine($"Mutagen: {mutagenVersion}"); System.Console.WriteLine($"Synthesis: {synthesisVersion}"); var deps = await GitHubDependents.GitHubDependents.GetDependents( user: RegistryConstants.GithubUser, repository: RegistryConstants.GithubRepoName, packageID: RegistryConstants.PackageId, pages: byte.MaxValue) .ToArrayAsync(); await Task.WhenAll(deps.GroupBy(x => x.User).Select(group => Task.Run(async () => { cancel.ThrowIfCancellationRequested(); if (group.Key == null) return; await Task.WhenAll(group.Select(dependency => Task.Run(async () => { cancel.ThrowIfCancellationRequested(); try { if (dependency.User.IsNullOrWhitespace() || dependency.Repository.IsNullOrWhitespace()) return; var repoDir = Directory.CreateDirectory(Path.Combine(temp.Dir.Path, group.Key, dependency.Repository)); var clonePath = $"https://github.com/{dependency.User}/{dependency.Repository}"; try { Repository.Clone(clonePath, repoDir.FullName); } catch (Exception ex) { System.Console.Error.WriteLine($"Failed to clone {clonePath}"); System.Console.Error.WriteLine(ex); failedDeps.Add(dependency); return; } cancel.ThrowIfCancellationRequested(); using var repo = new Repository(repoDir.FullName); var slnPath = GitPatcherRun.GetPathToSolution(repo.Info.WorkingDirectory); if (slnPath == null) { System.Console.Error.WriteLine($"Could not get path to solution {clonePath}"); failedDeps.Add(dependency); return; } GitPatcherRun.SwapInDesiredVersionsForSolution( solutionPath: slnPath, drivingProjSubPath: string.Empty, mutagenVersion: mutagenVersion, out var _, synthesisVersion: synthesisVersion, out var _); foreach (var proj in SolutionPatcherRun.AvailableProjectSubpaths(slnPath)) { System.Console.WriteLine($"Checking {group.Key}/{dependency.Repository}:{proj}"); cancel.ThrowIfCancellationRequested(); var path = Path.Combine(repoDir.FullName, proj); var compile = await DotNetCommands.Compile(path, cancel, null); if (compile.Failed) { System.Console.WriteLine("Failed compilation"); } projResults.Add((dependency, proj, compile)); } } catch (Exception ex) { System.Console.Error.WriteLine($"Failed to check {dependency}"); System.Console.Error.WriteLine(ex); return; } }))); }))); cancel.ThrowIfCancellationRequested(); System.Console.WriteLine(); System.Console.WriteLine(); System.Console.WriteLine(); System.Console.WriteLine("-------------------------------"); System.Console.WriteLine(); System.Console.WriteLine(); System.Console.WriteLine(); if (failedDeps.Count > 0) { System.Console.WriteLine("Failed repos:"); foreach (var f in failedDeps .OrderBy(d => d.User) .CreateOrderedEnumerable(d => d.Repository, null, true)) { System.Console.WriteLine($" {f}"); } } var failed = projResults.Where(p => p.Item3.Failed).ToList(); if (failed.Count > 0) { System.Console.WriteLine("Failed projects:"); foreach (var f in failed.OrderBy(f => f.Item1.User) .CreateOrderedEnumerable(d => d.Item1.Repository, null, true) .CreateOrderedEnumerable(d => d.Item2, null, true)) { System.Console.WriteLine($"{f.Item1}: {f.Item2}"); System.Console.WriteLine(); } } }