コード例 #1
0
        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);
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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);
        }
コード例 #4
0
        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);
        }
コード例 #5
0
        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);
        }
コード例 #6
0
        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");
        }
コード例 #7
0
        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");
        }
コード例 #8
0
        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");
        }
コード例 #9
0
ファイル: Program.cs プロジェクト: tr4wzified/Synthesis
        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();
                }
            }
        }