PageRenderTime 14ms CodeModel.GetById 0ms RepoModel.GetById 0ms app.codeStats 0ms

/src/org/bitbucket/connectors/jetbrains/vcs/HgHandler.java

https://bitbucket.org/atlassian/jetbrains-bitbucket-connector/
Java | 194 lines | 164 code | 25 blank | 5 comment | 31 complexity | a51e324d7ee6f719b81426ec360bd924 MD5 | raw file
  1. package org.bitbucket.connectors.jetbrains.vcs;
  2. import com.intellij.openapi.progress.ProgressManager;
  3. import com.intellij.openapi.project.Project;
  4. import com.intellij.openapi.ui.Messages;
  5. import com.intellij.openapi.vcs.AbstractVcs;
  6. import com.intellij.openapi.vcs.VcsException;
  7. import com.intellij.openapi.vfs.VirtualFile;
  8. import com.intellij.util.Consumer;
  9. import com.intellij.util.ui.UIUtil;
  10. import org.bitbucket.connectors.jetbrains.ProjectUtil;
  11. import org.bitbucket.connectors.jetbrains.ui.BitbucketBundle;
  12. import org.jetbrains.annotations.Nullable;
  13. import org.zmlx.hg4idea.HgVcs;
  14. import org.zmlx.hg4idea.command.*;
  15. import org.zmlx.hg4idea.execution.HgCommandException;
  16. import org.zmlx.hg4idea.execution.HgCommandResult;
  17. import org.zmlx.hg4idea.execution.HgCommandResultHandler;
  18. import org.zmlx.hg4idea.util.HgUtil;
  19. import java.io.*;
  20. import java.util.ArrayList;
  21. import java.util.List;
  22. /**
  23. * User: leha2000
  24. * Date: Oct 14, 2011
  25. * Time: 11:34:36 AM
  26. */
  27. public class HgHandler implements VcsHandler {
  28. public boolean checkout(Project project, String folder, String repositoryUrl) {
  29. HgCloneCommand cmd = new HgCloneCommand(project);
  30. cmd.setRepositoryURL(repositoryUrl);
  31. cmd.setDirectory(folder);
  32. HgCommandResult result = cmd.execute();
  33. if (result == null) {
  34. deleteEmptyFolder(folder);
  35. error(project, BitbucketBundle.message("clone-failed"), BitbucketBundle.message("clone-failed-unknown-err"));
  36. return false;
  37. } else if (result.getExitValue() != 0) {
  38. deleteEmptyFolder(folder);
  39. error(project, BitbucketBundle.message("clone-failed"), BitbucketBundle.message("clone-failed-msg", repositoryUrl, result.getRawError() + "\n" + result.getRawOutput()));
  40. return false;
  41. }
  42. return true;
  43. }
  44. private void deleteEmptyFolder(String folder) {
  45. File f = new File(folder);
  46. if (f.exists() && f.isDirectory() && f.list().length == 0) {
  47. f.delete();
  48. }
  49. }
  50. private static void error(final Project project, final String title, final String msg) {
  51. UIUtil.invokeLaterIfNeeded(new Runnable() {
  52. public void run() {
  53. Messages.showErrorDialog(project, msg, title);
  54. }
  55. });
  56. }
  57. public VirtualFile getRepositoryRoot(VirtualFile folder) {
  58. return HgUtil.getNearestHgRoot(folder);
  59. }
  60. public boolean initRepository(final Project project, final VirtualFile root) {
  61. final Boolean[] res = new Boolean[1];
  62. new HgInitCommand(project).execute(root, new HgCommandResultHandler() {
  63. @Override
  64. public void process(@Nullable HgCommandResult hgCommandResult) {
  65. synchronized (res) {
  66. res[0] = hgCommandResult != null && hgCommandResult.getExitValue() == 0;
  67. res.notify();
  68. }
  69. }
  70. });
  71. try {
  72. synchronized (res) {
  73. if (res[0] == null) {
  74. res.wait();
  75. }
  76. }
  77. } catch (InterruptedException e) {
  78. return false;
  79. }
  80. final Exception[] exc = new Exception[1];
  81. ProgressManager.getInstance().runProcessWithProgressSynchronously(new Runnable() {
  82. public void run() {
  83. ProgressManager.getInstance().getProgressIndicator().setText(BitbucketBundle.message("share-project-on-bitbucket"));
  84. new HgAddCommand(project).execute(ProjectUtil.getSourceFolders(project, root));
  85. try {
  86. new HgCommitCommand(project, root, BitbucketBundle.message("initial-rev-msg")).execute();
  87. } catch (HgCommandException e) {
  88. exc[0] = e;
  89. } catch (VcsException e) {
  90. exc[0] = e;
  91. }
  92. }
  93. }, BitbucketBundle.message("create-local-repository"), true, project);
  94. return exc[0] == null;
  95. }
  96. public boolean push(Project project, VirtualFile root, String repositoryUrl) {
  97. final Boolean[] res = new Boolean[1];
  98. new HgPushCommand(project, root, repositoryUrl).execute(new HgCommandResultHandler() {
  99. public void process(@Nullable HgCommandResult result) {
  100. synchronized (res) {
  101. res[0] = result != null && result.getExitValue() == 0;
  102. res.notify();
  103. }
  104. }
  105. });
  106. try {
  107. synchronized (res) {
  108. if (res[0] == null) {
  109. res.wait();
  110. }
  111. }
  112. return res[0] == Boolean.TRUE;
  113. } catch (InterruptedException e) {
  114. return false;
  115. }
  116. }
  117. public void setRepositoryDefaultUrl(Project project, VirtualFile root, String repositoryUrl) throws IOException {
  118. File hgrc = new File(new File(root.getPath(), ".hg"), "hgrc");
  119. if (!hgrc.exists()) {
  120. hgrc.createNewFile();
  121. }
  122. List<String> lines = new ArrayList<String>();
  123. List<String> pathLines = new ArrayList<String>();
  124. BufferedReader reader = new BufferedReader(new FileReader(hgrc));
  125. try {
  126. String line;
  127. boolean paths = false;
  128. while ((line = reader.readLine()) != null) {
  129. line = line.trim();
  130. if (line.startsWith("[")) {
  131. paths = "[paths]".equals(line);
  132. if (!paths) {
  133. lines.add(line);
  134. }
  135. continue;
  136. }
  137. if (paths) {
  138. if (!"default".equals(getKey(line))) {
  139. pathLines.add(line);
  140. }
  141. } else {
  142. lines.add(line);
  143. }
  144. }
  145. } finally {
  146. reader.close();
  147. }
  148. PrintWriter writer = new PrintWriter(new BufferedWriter(new FileWriter(hgrc, false)));
  149. try {
  150. writer.println("[paths]");
  151. writer.println("default=" + repositoryUrl);
  152. for (String line: pathLines) {
  153. writer.println(line);
  154. }
  155. for (String line: lines) {
  156. writer.println(line);
  157. }
  158. } finally {
  159. writer.close();
  160. }
  161. }
  162. private static String getKey(String s) {
  163. String[] parts = s.split("=");
  164. return parts.length > 0 ? parts[0].trim() : null;
  165. }
  166. public AbstractVcs getVcs(Project project) {
  167. return HgVcs.getInstance(project);
  168. }
  169. }