Exemple #1
0
        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);
        }
Exemple #2
0
        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);
        }