PageRenderTime 58ms CodeModel.GetById 22ms RepoModel.GetById 0ms app.codeStats 0ms

/SerenityFlow/4SerenityFeatureLivePlugin.cs

https://gitlab.com/enesasillioglu/GitExtensions-SerenityFlow-Plugin
C# | 174 lines | 148 code | 22 blank | 4 comment | 25 complexity | bd1e116473688eea684989b54466c995 MD5 | raw file
  1. using System;
  2. using System.IO;
  3. using System.Windows.Forms;
  4. using GitCommands;
  5. using GitUIPluginInterfaces;
  6. namespace SerenityFlow
  7. {
  8. public class SerenityFeatureLivePlugin : GitPluginBase, IGitPluginForRepository, IGitPlugin
  9. {
  10. public override string Description
  11. {
  12. get
  13. {
  14. return "4) FEATURE'ı MASTER'a BİRLEŞTİR (Tag/Merge-Squash)";
  15. }
  16. }
  17. public override bool Execute(GitUIBaseEventArgs args)
  18. {
  19. var module = (GitModule)args.GitModule;
  20. var allChangesCmd = GitCommands.GitCommandHelpers.GetAllChangedFilesCmd(true, UntrackedFilesMode.All, IgnoreSubmodulesMode.All);;
  21. int exitCode;
  22. exitCode = args.GitModule.RunGitCmdResult("submodule update --init --recursive").ExitCode;
  23. var resultString = args.GitModule.RunGitCmdResult(allChangesCmd);
  24. var statusString = resultString.StdOutput;
  25. var changedFiles = GitCommandHelpers.GetAllChangedFilesFromString(module, statusString);
  26. if (changedFiles.Count != 0)
  27. {
  28. MessageBox.Show("Commit edilmeyi bekleyen dosyalarınız var. Lütfen işlemden önce bu dosyaları commit ediniz!");
  29. return false;
  30. }
  31. var currentBranch = (args.GitModule.GetSelectedBranch() ?? "").ToLowerInvariant();
  32. // master branch inde değilsek ona geçelim
  33. var branch = currentBranch;
  34. if (branch != "master")
  35. {
  36. var switchBranchCmd = GitCommandHelpers.CheckoutCmd("master", LocalChangesAction.DontChange);
  37. exitCode = args.GitModule.RunGitCmdResult(switchBranchCmd).ExitCode;
  38. branch = args.GitModule.GetSelectedBranch().ToLowerInvariant();
  39. if (branch != "master")
  40. {
  41. MessageBox.Show("Master branch'ine geçiş yapılamadı. İşleme devam edilemiyor!");
  42. return false;
  43. }
  44. }
  45. // master a direk commit olmadığını varsayıyoruz, dolayısıyla rebase e gerek yok, sadece pull yapalım.
  46. // rebase yaparsak bazı merge commitleriyle ilgili kayıp yaşanabilir
  47. // bu arada eğer local te bir şekilde master da commit varsa (merkezde olmayan??) branch bir önceki committen alınmış olur
  48. var pullCmd = module.PullCmd("origin", "master", "master", false);
  49. var cmdResult = args.GitModule.RunGitCmdResult(pullCmd);
  50. var pullResult = cmdResult.StdError;
  51. exitCode = cmdResult.ExitCode;
  52. if (exitCode != 0)
  53. {
  54. MessageBox.Show("Pull işlemi esnasında şu hata alındı:\n" +
  55. pullResult + "\nExitCode:" + exitCode);
  56. return true;
  57. }
  58. currentBranch = (args.GitModule.GetSelectedBranch() ?? "").ToLowerInvariant();
  59. if (currentBranch.IsNullOrEmpty() || currentBranch.ToLowerInvariant() != "master")
  60. {
  61. MessageBox.Show("Bu işlem master branch'inde yapılmalıdır!");
  62. return false;
  63. }
  64. var featureMergeHash = Clipboard.GetText();
  65. if (Dialogs.Prompt("Canlıya gönderilecek feature branch'in TEST'e birleştirildiği commit hash'ini giriniz",
  66. "Feature Branch Merge", ref featureMergeHash) != DialogResult.OK)
  67. return false;
  68. var mergeInfo = module.ShowSha1(featureMergeHash);
  69. var mergeLines = mergeInfo.Split(new char[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);
  70. if (mergeLines.Length < 3 ||
  71. !mergeLines[0].StartsWith("commit ", StringComparison.OrdinalIgnoreCase) ||
  72. !mergeLines[1].StartsWith("Merge: ", StringComparison.OrdinalIgnoreCase) ||
  73. !mergeLines[2].StartsWith("Author: ", StringComparison.OrdinalIgnoreCase) ||
  74. !mergeLines[4].Trim().StartsWith("Merge branch '", StringComparison.OrdinalIgnoreCase) ||
  75. mergeLines[4].IndexOf("' into", StringComparison.OrdinalIgnoreCase) < 0)
  76. {
  77. Dialogs.Alert("Merge commit'i yerine aşağıdaki sonuç bulundu:\n\n" +
  78. mergeInfo);
  79. return false;
  80. }
  81. var mergeTitle = mergeLines[4].Trim();
  82. mergeTitle = mergeTitle.Substring("Merge branch '".Length);
  83. var mergeIntoIdx = mergeTitle.IndexOf("' into");
  84. var branchName = mergeTitle.Substring(0, mergeIntoIdx);
  85. var info = module.ShowSha1(featureMergeHash + "^2");
  86. var lines = info.Split(new char[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);
  87. if (lines.Length < 3 ||
  88. ((!lines[0].StartsWith("commit ", StringComparison.OrdinalIgnoreCase) ||
  89. !lines[1].StartsWith("Author: ", StringComparison.OrdinalIgnoreCase)) &&
  90. (!lines[0].StartsWith("commit ", StringComparison.OrdinalIgnoreCase) ||
  91. !lines[1].StartsWith("Merge: ", StringComparison.OrdinalIgnoreCase) ||
  92. !lines[2].StartsWith("Author: ", StringComparison.OrdinalIgnoreCase) ||
  93. info.Contains("' into test") ||
  94. info.Contains("' into 'test"))))
  95. {
  96. Dialogs.Alert("Birleştirilen feature branch'i yerine aşağıdaki sonuç bulundu:\n\n" +
  97. info);
  98. return false;
  99. }
  100. var author = lines[1].Trim().Substring("Author: ".Length).Trim();
  101. var commit = lines[0].Trim().Substring("commit ".Length).Trim();
  102. var tagName = "published-" + branchName;
  103. var tagResult = module.Tag(tagName, commit, false, false);
  104. if (!tagResult.IsNullOrWhiteSpace())
  105. Dialogs.Alert("TAG RESULT: " + tagResult);
  106. var pushTagCmd = GitCommandHelpers.PushTagCmd("origin", tagName, false);
  107. cmdResult = args.GitModule.RunGitCmdResult(pushTagCmd);
  108. var pushTagResult = cmdResult.StdError;
  109. exitCode = cmdResult.ExitCode;
  110. if (exitCode != 0)
  111. {
  112. MessageBox.Show("Tag push işlemi esnasında şu hata alındı:\n" + pushTagResult + "\nExitCode:" + exitCode);
  113. return true;
  114. }
  115. var mergeCmd = GitCommandHelpers.MergeBranchCmd(commit, true, true, true, null);
  116. cmdResult = args.GitModule.RunGitCmdResult(mergeCmd);
  117. var mergeResult = cmdResult.StdError;
  118. exitCode = cmdResult.ExitCode;
  119. if (exitCode != 0 && exitCode != 128)
  120. {
  121. MessageBox.Show("Merge işlemi esnasında şu hata alındı:\n" + mergeResult + "\nExitCode:" + exitCode);
  122. return true;
  123. }
  124. var gitDirectory = args.GitModule.GetGitDirectory();
  125. var msg = File.ReadAllText(Path.Combine(gitDirectory, "SQUASH_MSG"));
  126. msg = "Publish Branch '" + branchName + "'\n\n" + msg;
  127. var msgFile = Path.Combine(gitDirectory, "SQUASH_MSG2");
  128. File.WriteAllText(msgFile, msg);
  129. try
  130. {
  131. var commitCmd = "commit --author=\"" + author + "\" --file=\"" + msgFile.Replace("\\", "/") + "\"";
  132. cmdResult = args.GitModule.RunGitCmdResult(commitCmd);
  133. var commitResult = cmdResult.StdError;
  134. exitCode = cmdResult.ExitCode;
  135. if (exitCode != 0)
  136. {
  137. MessageBox.Show("Commit işlemi esnasında şu hata alındı:\n" + commitResult + "\nExitCode:" + exitCode);
  138. return true;
  139. }
  140. }
  141. finally
  142. {
  143. File.Delete(msgFile);
  144. }
  145. 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));
  146. return true;
  147. }
  148. }
  149. }