public override bool Execute(GitUIBaseEventArgs args) { var module = (GitModule)args.GitModule; var allChangesCmd = GitCommandHelpers.GetAllChangedFilesCmd(true, UntrackedFilesMode.All, IgnoreSubmodulesMode.All);; CmdResult cmdResult; var exitCode = args.GitModule.RunGitCmdResult("submodule update --init --recursive").ExitCode; // öncelikle bekleyen hiçbir değişiklik olmadığından emin oluyoruz var status = args.GitModule.RunGitCmdResult(allChangesCmd); var statusString = status.StdOutput; exitCode = status.ExitCode; var changedFiles = GitCommandHelpers.GetAllChangedFilesFromString(module, statusString); if (changedFiles.Count != 0) { MessageBox.Show("Commit edilmeyi bekleyen dosyalarınız var. Lütfen TEST işleminden önce bu dosyaları commit ediniz!"); return(false); } // bunun bir feature branch i olmasını kontrol et var featureBranch = (args.GitModule.GetSelectedBranch() ?? "").ToLowerInvariant(); if (featureBranch.IsNullOrEmpty() || featureBranch == "master" || featureBranch == "test") { MessageBox.Show("Bu işlem master ya da test branch lerinde yapılamaz!"); return(false); } // son kez onay alalım if (!Dialogs.Confirm("Bulunduğunuz branch, TEST'e gönderilecek.\n\n" + "Devam etmek istiyor musunuz?")) { return(true); } // origin deki son değişikliklerden haberdar ol var fetchCmd = module.FetchCmd("origin", "", ""); var fetchResultX = args.GitModule.RunGitCmdResult(fetchCmd); exitCode = fetchResultX.ExitCode; if (exitCode != 0) { MessageBox.Show("Fetch işlemi esnasında şu hata alındı:\n" + fetchResultX.StdError + "\nExitCode:" + exitCode); return(false); } // remote branch varsa, son değişiklikleri pull edelim var remoteBranchExists = module.GetRefs(false, true).Any(x => x.Name == featureBranch & x.IsRemote); if (remoteBranchExists) { var pullFeatureCmd = module.PullCmd("origin", featureBranch, featureBranch, false); cmdResult = args.GitModule.RunGitCmdResult(pullFeatureCmd); var pullFeatureResult = cmdResult.StdError; exitCode = cmdResult.ExitCode; if (exitCode != 0) { MessageBox.Show("Feature pull işlemi esnasında şu hata alındı:\n" + pullFeatureResult + "\nExitCode:" + exitCode); return(true); } } // test branch ine geçiş yap var switchBranchCmd = GitCommandHelpers.CheckoutCmd("test", LocalChangesAction.DontChange); exitCode = args.GitModule.RunGitCmdResult(switchBranchCmd).ExitCode; var currentBranch = args.GitModule.GetSelectedBranch().ToLowerInvariant(); if (currentBranch != "test") { MessageBox.Show("Test branch'ine geçiş yapılamadı. İşleme devam edilemiyor!"); return(true); } // varsa test teki son değişiklikleri al // test e direk commit olmayacağı varsayıldığından rebase e gerek yok. var pullCmd = module.PullCmd("origin", "test", "test", false); cmdResult = args.GitModule.RunGitCmdResult(pullCmd); var pullResult = cmdResult.StdError; exitCode = cmdResult.ExitCode; if (exitCode != 0) { MessageBox.Show("Test'ten pull işlemi esnasında şu hata alındı:\n" + pullResult + "\nExitCode:" + exitCode); return(true); } // feature branch i test e birleştir var mergeCmd = GitCommandHelpers.MergeBranchCmd(featureBranch, allowFastForward: false, squash: false, noCommit: false, strategy: ""); cmdResult = args.GitModule.RunGitCmdResult(mergeCmd); var mergeResult = cmdResult.StdError; exitCode = cmdResult.ExitCode; if (exitCode != 0) { MessageBox.Show("Merge işlemi esnasında şu hata alındı:\n" + mergeResult + "\nExitCode:" + exitCode); return(true); } MessageBox.Show(String.Format("{0} feature branch'i başarıyla TEST'e merge edildi.\n\nLütfen projeyi son haliyle TEST'teyken " + "build edip, PUSH işlemi yapınız.", featureBranch)); Clipboard.SetText("Gerekli kontroller yapılmıştır, gerçek ortama çıkarılabilir mi?"); return(true); }
public override bool Execute(GitUIBaseEventArgs args) { var module = (GitModule)args.GitModule; int exitCode; exitCode = args.GitModule.RunGitCmdResult("submodule update --init --recursive").ExitCode; allChangesCmd = allChangesCmd ?? GitCommands.GitCommandHelpers.GetAllChangedFilesCmd(true, UntrackedFilesMode.All, IgnoreSubmodulesMode.All);; // öncelikle bekleyen hiçbir değişiklik olmadığından emin oluyoruz var cmdResult = args.GitModule.RunGitCmdResult(allChangesCmd); var statusString = cmdResult.StdError; exitCode = cmdResult.ExitCode; var changedFiles = GitCommandHelpers.GetAllChangedFilesFromString(module, statusString); if (changedFiles.Count != 0) { MessageBox.Show("Commit edilmeyi bekleyen dosyalarınız var. Lütfen yeni bir feature branch oluşturmadan önce bu dosyaları commit ediniz!"); return(false); } // feature branch i için uygun bir isim alalım. bu master, test, ya da mevcut bir branch ten farklı olmalı string featureBranchName = ""; while (featureBranchName.IsNullOrEmpty()) { if (Dialogs.Prompt("Yeni bir feature branch oluşturulacak. Bunun için master branch'e geçilip, son değişiklikler pull ile alınacak." + "\n\nLütfen oluşturmak istediğiniz branch'e bir isim veriniz", "Yeni Feature Branch Oluşturma", ref featureBranchName) != DialogResult.OK) { return(false); } if (featureBranchName != null) { featureBranchName = featureBranchName.Trim(); if (featureBranchName != null && module.GetRefs().Any(x => String.Compare(x.Name, featureBranchName, StringComparison.OrdinalIgnoreCase) == 0)) { Dialogs.Alert("Girdiğiniz branch ismine sahip başka bir branch var, lütfen başka bir isim giriniz!"); featureBranchName = null; } } } // master branch inde değilsek ona geçelim var branch = args.GitModule.GetSelectedBranch().ToLowerInvariant(); if (branch != "master") { var switchBranchCmd = GitCommandHelpers.CheckoutCmd("master", LocalChangesAction.DontChange); exitCode = args.GitModule.RunGitCmdResult(switchBranchCmd).ExitCode; branch = args.GitModule.GetSelectedBranch().ToLowerInvariant(); if (branch != "master") { MessageBox.Show("Master branch'ine geçiş yapılamadı. İşleme devam edilemiyor!"); return(false); } } // master a direk commit olmadığını varsayıyoruz, dolayısıyla rebase e gerek yok, sadece pull yapalım. // rebase yaparsak bazı merge commitleriyle ilgili kayıp yaşanabilir // bu arada eğer local te bir şekilde master da commit varsa (merkezde olmayan??) branch bir önceki committen alınmış olur var pullCmd = module.PullCmd("origin", "master", "master", false); cmdResult = args.GitModule.RunGitCmdResult(pullCmd); var pullResult = cmdResult.StdError; exitCode = cmdResult.ExitCode; if (exitCode != 0) { MessageBox.Show("Pull işlemi esnasında şu hata alındı:\n" + pullResult + "\nExitCode:" + exitCode); return(true); } // feature branch oluştur var checkoutCmd = "checkout -b " + featureBranchName; cmdResult = args.GitModule.RunGitCmdResult(checkoutCmd); var checkoutResult = cmdResult.StdError; exitCode = cmdResult.ExitCode; if (exitCode != 0) { MessageBox.Show("Branch oluşturma işlemi esnasında şu hata alındı:\n" + checkoutResult + "\nExitCode:" + exitCode); return(true); } MessageBox.Show(String.Format("{0} feature branch'i başarıyla oluşturuldu.", featureBranchName)); return(true); }
public override bool Execute(GitUIBaseEventArgs args) { var module = (GitModule)args.GitModule; var allChangesCmd = GitCommands.GitCommandHelpers.GetAllChangedFilesCmd(true, UntrackedFilesMode.All, IgnoreSubmodulesMode.All);; int exitCode; exitCode = args.GitModule.RunGitCmdResult("submodule update --init --recursive").ExitCode; var resultString = args.GitModule.RunGitCmdResult(allChangesCmd); var statusString = resultString.StdOutput; var changedFiles = GitCommandHelpers.GetAllChangedFilesFromString(module, statusString); if (changedFiles.Count != 0) { MessageBox.Show("Commit edilmeyi bekleyen dosyalarınız var. Lütfen işlemden önce bu dosyaları commit ediniz!"); return(false); } var currentBranch = (args.GitModule.GetSelectedBranch() ?? "").ToLowerInvariant(); // master branch inde değilsek ona geçelim var branch = currentBranch; if (branch != "master") { var switchBranchCmd = GitCommandHelpers.CheckoutCmd("master", LocalChangesAction.DontChange); exitCode = args.GitModule.RunGitCmdResult(switchBranchCmd).ExitCode; branch = args.GitModule.GetSelectedBranch().ToLowerInvariant(); if (branch != "master") { MessageBox.Show("Master branch'ine geçiş yapılamadı. İşleme devam edilemiyor!"); return(false); } } // master a direk commit olmadığını varsayıyoruz, dolayısıyla rebase e gerek yok, sadece pull yapalım. // rebase yaparsak bazı merge commitleriyle ilgili kayıp yaşanabilir // bu arada eğer local te bir şekilde master da commit varsa (merkezde olmayan??) branch bir önceki committen alınmış olur var pullCmd = module.PullCmd("origin", "master", "master", false); var cmdResult = args.GitModule.RunGitCmdResult(pullCmd); var pullResult = cmdResult.StdError; exitCode = cmdResult.ExitCode; if (exitCode != 0) { MessageBox.Show("Pull işlemi esnasında şu hata alındı:\n" + pullResult + "\nExitCode:" + exitCode); return(true); } currentBranch = (args.GitModule.GetSelectedBranch() ?? "").ToLowerInvariant(); if (currentBranch.IsNullOrEmpty() || currentBranch.ToLowerInvariant() != "master") { MessageBox.Show("Bu işlem master branch'inde yapılmalıdır!"); return(false); } var featureMergeHash = Clipboard.GetText(); if (Dialogs.Prompt("Canlıya gönderilecek feature branch'in TEST'e birleştirildiği commit hash'ini giriniz", "Feature Branch Merge", ref featureMergeHash) != DialogResult.OK) { return(false); } var mergeInfo = module.ShowSha1(featureMergeHash); var mergeLines = mergeInfo.Split(new char[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries); if (mergeLines.Length < 3 || !mergeLines[0].StartsWith("commit ", StringComparison.OrdinalIgnoreCase) || !mergeLines[1].StartsWith("Merge: ", StringComparison.OrdinalIgnoreCase) || !mergeLines[2].StartsWith("Author: ", StringComparison.OrdinalIgnoreCase) || !mergeLines[4].Trim().StartsWith("Merge branch '", StringComparison.OrdinalIgnoreCase) || mergeLines[4].IndexOf("' into", StringComparison.OrdinalIgnoreCase) < 0) { Dialogs.Alert("Merge commit'i yerine aşağıdaki sonuç bulundu:\n\n" + mergeInfo); return(false); } var mergeTitle = mergeLines[4].Trim(); mergeTitle = mergeTitle.Substring("Merge branch '".Length); var mergeIntoIdx = mergeTitle.IndexOf("' into"); var branchName = mergeTitle.Substring(0, mergeIntoIdx); var info = module.ShowSha1(featureMergeHash + "^2"); var lines = info.Split(new char[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries); if (lines.Length < 3 || ((!lines[0].StartsWith("commit ", StringComparison.OrdinalIgnoreCase) || !lines[1].StartsWith("Author: ", StringComparison.OrdinalIgnoreCase)) && (!lines[0].StartsWith("commit ", StringComparison.OrdinalIgnoreCase) || !lines[1].StartsWith("Merge: ", StringComparison.OrdinalIgnoreCase) || !lines[2].StartsWith("Author: ", StringComparison.OrdinalIgnoreCase) || info.Contains("' into test") || info.Contains("' into 'test")))) { Dialogs.Alert("Birleştirilen feature branch'i yerine aşağıdaki sonuç bulundu:\n\n" + info); return(false); } var author = lines[1].Trim().Substring("Author: ".Length).Trim(); var commit = lines[0].Trim().Substring("commit ".Length).Trim(); var tagName = "published-" + branchName; var tagResult = module.Tag(tagName, commit, false, false); if (!tagResult.IsNullOrWhiteSpace()) { Dialogs.Alert("TAG RESULT: " + tagResult); } var pushTagCmd = GitCommandHelpers.PushTagCmd("origin", tagName, false); cmdResult = args.GitModule.RunGitCmdResult(pushTagCmd); var pushTagResult = cmdResult.StdError; exitCode = cmdResult.ExitCode; if (exitCode != 0) { MessageBox.Show("Tag push işlemi esnasında şu hata alındı:\n" + pushTagResult + "\nExitCode:" + exitCode); return(true); } var mergeCmd = GitCommandHelpers.MergeBranchCmd(commit, true, true, true, null); cmdResult = args.GitModule.RunGitCmdResult(mergeCmd); var mergeResult = cmdResult.StdError; exitCode = cmdResult.ExitCode; if (exitCode != 0 && exitCode != 128) { MessageBox.Show("Merge işlemi esnasında şu hata alındı:\n" + mergeResult + "\nExitCode:" + exitCode); return(true); } var gitDirectory = args.GitModule.GetGitDirectory(); var msg = File.ReadAllText(Path.Combine(gitDirectory, "SQUASH_MSG")); msg = "Publish Branch '" + branchName + "'\n\n" + msg; var msgFile = Path.Combine(gitDirectory, "SQUASH_MSG2"); File.WriteAllText(msgFile, msg); try { var commitCmd = "commit --author=\"" + author + "\" --file=\"" + msgFile.Replace("\\", "/") + "\""; cmdResult = args.GitModule.RunGitCmdResult(commitCmd); var commitResult = cmdResult.StdError; exitCode = cmdResult.ExitCode; if (exitCode != 0) { MessageBox.Show("Commit işlemi esnasında şu hata alındı:\n" + commitResult + "\nExitCode:" + exitCode); return(true); } } finally { File.Delete(msgFile); } MessageBox.Show(String.Format("{0} feature branch'i başarıyla MASTER'a merge edildi.\n\nDeğişiklikleri inceleyip sürüm çıkabilirsiniz.", branchName)); return(true); }