예제 #1
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);
        }