public async Task <WopResult> GoOptimize(bool cleanupAfterwards, Repository repository, string branchName = null) { var repositoryOwner = repository.Owner.Login; var repositoryName = repository.Name; var myUser = await _gitOctoKitHandler.GitHubClient.User.Current(); await _git.ConfigureGitCredentials(); Console.WriteLine($"{repositoryOwner}/{repositoryName} is being optimized..."); Console.WriteLine(); string dirOfClonedRepos = _wopConfig.ClonedRepositoriesDirectoryName; if (!Path.IsPathRooted(dirOfClonedRepos)) { dirOfClonedRepos = Path.Combine(FolderHelperMethods.Internal_AssemblyDirectory.Value, _wopConfig.ClonedRepositoriesDirectoryName); } Directory.CreateDirectory(dirOfClonedRepos); Directory.SetCurrentDirectory(dirOfClonedRepos); var clonedRepo = await _git.GitClone(dirOfClonedRepos, repositoryOwner, repositoryName); Directory.SetCurrentDirectory(clonedRepo); try { var repositoryInfo = await _gitOctoKitHandler.GitHubClient.Repository.Get(repositoryOwner, repositoryName); if (branchName == null) { branchName = repositoryInfo.DefaultBranch; if (branchName == null) { throw new Exception("ERROR, couldn't determine branchname"); } } await _git.RunHubCommand("fork"); await _git.RunHubCommand($"remote set-url {_wopConfig.GitHubUserName} https://github.com/{_wopConfig.GitHubUserName}/{repositoryName}.git"); //Fetch everything in my repository await _git.RunHubCommand("fetch --all"); //Go to master await _git.RunHubCommand($"checkout {_wopConfig.GitHubUserName}/{branchName}"); await _git.RunHubCommand($"merge --strategy-option=theirs origin/{branchName}"); await _git.RunHubCommand($"push {_wopConfig.GitHubUserName} HEAD:{branchName}"); var wasAbleToAddTrackedBranch = await _git.RunHubCommand($"checkout --track -b {Constants.FeatureName} {_wopConfig.GitHubUserName}/{Constants.FeatureName}"); if (wasAbleToAddTrackedBranch.ExitCode == 0) { await _git.RunHubCommand($"merge --strategy-option=theirs {_wopConfig.GitHubUserName}/{branchName}"); await _git.RunHubCommand($"push {_wopConfig.GitHubUserName} {Constants.FeatureName} -u"); } else { var createdNewBranch = await _git.RunHubCommand($"checkout -b {Constants.FeatureName}"); if (createdNewBranch.ExitCode == 0) { } else { await _git.RunHubCommand($"checkout {Constants.FeatureName}"); await _git.RunHubCommand($"merge --strategy-option=theirs {_wopConfig.GitHubUserName}/{branchName}"); } await _git.RunHubCommand($"push {_wopConfig.GitHubUserName} {Constants.FeatureName} -u"); } var optimizedFileResults = await GoOptimize(clonedRepo, _wopConfig); //var optimizedFileResults = await GoOptimizeStub(clonedRepo, config); await _git.RunHubCommand("add ."); var descriptionForCommit = TemplatesHandler.GetDescriptionForCommit(); await _git.Commit("Wop optimized this repository", descriptionForCommit); await _git.RunHubCommand($"push"); var descriptionForPullRequest = TemplatesHandler.GetDescriptionForPullRequest(); var successfulOptimizations = optimizedFileResults.Any(t => t.OptimizationResult == OptimizationResult.Success && t.OriginalSize > t.OptimizedSize); var retval = new WopResult() { OptimizedFiles = optimizedFileResults }; //Only create pull request if there were actually any successful optimizations if (successfulOptimizations) { PullRequest obtainedPullRequest = await _gitOctoKitHandler.GetPullRequest(repositoryOwner, repositoryName); if (obtainedPullRequest == null) { var pr = new NewPullRequest("The Web Optimization Project has optimized your repository!", $"{_wopConfig.GitHubUserName}:{Constants.FeatureName}", branchName) { Body = descriptionForPullRequest }; obtainedPullRequest = await _gitOctoKitHandler.GitHubClient.PullRequest.Create(repositoryOwner, repositoryName, pr); } Console.WriteLine($"Using PR: {obtainedPullRequest.Url}"); var descriptionForCommitInPr = TemplatesHandler.GetCommitDescriptionForPullRequest(clonedRepo, branchName, optimizedFileResults, DateTime.UtcNow.ToString()); Console.WriteLine($"Creating comment on pr with length {descriptionForCommitInPr.Length}..."); var createdComment = await _gitOctoKitHandler.GitHubClient.Issue.Comment.Create(repositoryOwner, repositoryName, obtainedPullRequest.Number, descriptionForCommitInPr); Console.WriteLine($"Comment created: {createdComment.Url}"); retval.CreatedPullRequest = obtainedPullRequest; } Console.WriteLine(); Console.WriteLine($"{repositoryOwner}/{repositoryName} is optimized :)"); Console.WriteLine(); return(retval); } finally { if (cleanupAfterwards) { Console.WriteLine($"Cleaning up local files '{clonedRepo}'..."); Directory.SetCurrentDirectory(dirOfClonedRepos); CleanupRecursively(clonedRepo); //Directory.Delete(clonedRepo, true); Console.WriteLine($"Directory {clonedRepo} removed."); } } }
public static async Task GoOptimize(string repositoryOwner, string repositoryName, string branchName = null) { Console.WriteLine($"{repositoryOwner}/{repositoryName} is being optimized..."); Console.WriteLine(); var config = ConfigHelper.GetConfig(); var gitOctoKitHandler = new GitOctoKitHandler(config); string dirOfClonedRepos = config.ClonedRepositoriesDirectoryName; if (!Path.IsPathRooted(dirOfClonedRepos)) { dirOfClonedRepos = Path.Combine(FolderHelperMethods.EntryAssemblyDirectory.Value, config.ClonedRepositoriesDirectoryName); } Directory.CreateDirectory(dirOfClonedRepos); Directory.SetCurrentDirectory(dirOfClonedRepos); var git = new GitCommandLineHandler(config); var clonedRepo = await git.GitClone(dirOfClonedRepos, repositoryOwner, repositoryName); Directory.SetCurrentDirectory(clonedRepo); if (branchName == null) { branchName = await git.GetHeadBranch(); if (branchName == null) { throw new Exception("ERROR, couldn't determine branchname"); } } await git.RunHubCommand("fork"); await git.RunHubCommand($"remote set-url {config.GithubUserName} https://github.com/{config.GithubUserName}/{repositoryName}.git"); //Fetch everything in my repository await git.RunHubCommand("fetch --all"); //Go to master await git.RunHubCommand($"checkout {config.GithubUserName}/{branchName}"); await git.RunHubCommand($"merge --strategy-option=theirs origin/{branchName}"); await git.RunHubCommand($"push {config.GithubUserName} HEAD:{branchName}"); var wasAbleToAddTrackedBranch = await git.RunHubCommand($"checkout --track -b {Constants.FeatureName} {config.GithubUserName}/{Constants.FeatureName}"); if (wasAbleToAddTrackedBranch == 0) { await git.RunHubCommand($"merge --strategy-option=theirs {config.GithubUserName}/{branchName}"); await git.RunHubCommand($"push {config.GithubUserName} {Constants.FeatureName} -u"); } else { var createdNewBranch = await git.RunHubCommand($"checkout -b {Constants.FeatureName}"); if (createdNewBranch == 0) { } else { await git.RunHubCommand($"checkout {Constants.FeatureName}"); await git.RunHubCommand($"merge --strategy-option=theirs {config.GithubUserName}/{branchName}"); } await git.RunHubCommand($"push {config.GithubUserName} {Constants.FeatureName} -u"); } var optimizedFileResults = await GoOptimize(clonedRepo, config); //var optimizedFileResults = await GoOptimizeStub(clonedRepo, config); await git.RunHubCommand("add ."); var descriptionForCommit = await TemplatesHandler.GetDescriptionForCommit(); await git.Commit("Wop optimized this repository", descriptionForCommit); await git.RunHubCommand($"push"); var descriptionForPullRequest = await TemplatesHandler.GetDescriptionForPullRequest(); //Only create pull request if there were actually any successful optimizations if (optimizedFileResults.Any(t => t.Successful) && optimizedFileResults.Sum(t => t.OriginalSize) > optimizedFileResults.Sum(t => t.OptimizedSize)) { var pullRequestState = await git.PullRequest("The Web Optimization Project has optimized your repository!", descriptionForPullRequest); Console.WriteLine("Pullrequeststate: " + pullRequestState); PullRequest obtainedPullRequest = null; for (int i = 0; i < 3; i++) { obtainedPullRequest = await gitOctoKitHandler.GetPullRequest(repositoryOwner, repositoryName); if (obtainedPullRequest != null) { break; } Console.WriteLine("Couldn't find Pull Request. Waiting and retrying..."); await Task.Delay(10000); } Console.WriteLine($"Found pull request: {obtainedPullRequest.HtmlUrl}"); var commitIdentifier = "### Commit "; var splittedBody = obtainedPullRequest.Body.Split('\n'); var commitCount = splittedBody.Count(t => t.StartsWith(commitIdentifier)); var descriptionForCommitInPr = await TemplatesHandler.GetCommitDescriptionForPullRequest(clonedRepo, branchName, optimizedFileResults, commitCount + 1); var bodySb = new StringBuilder(obtainedPullRequest.Body); bodySb.AppendLine(); bodySb.AppendLine(); bodySb.AppendLine(descriptionForCommitInPr); var pullRequestUpdate = new PullRequestUpdate() { Body = bodySb.ToString() }; await gitOctoKitHandler.GitHubClient.PullRequest.Update(repositoryOwner, repositoryName, obtainedPullRequest.Number, pullRequestUpdate); } Console.WriteLine(); Console.WriteLine($"{repositoryOwner}/{repositoryName} is optimized :)"); Console.WriteLine(); }