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

/src/org/bitbucket/connectors/jetbrains/BitbucketCheckoutProvider.java

https://bitbucket.org/atlassian/jetbrains-bitbucket-connector/
Java | 154 lines | 140 code | 14 blank | 0 comment | 28 complexity | 6ba2088f0f5364c26df4a633e8441ab5 MD5 | raw file
  1. package org.bitbucket.connectors.jetbrains;
  2. import com.intellij.ide.GeneralSettings;
  3. import com.intellij.openapi.application.ApplicationManager;
  4. import com.intellij.openapi.application.ApplicationNamesInfo;
  5. import com.intellij.openapi.fileEditor.FileDocumentManager;
  6. import com.intellij.openapi.progress.ProgressIndicator;
  7. import com.intellij.openapi.progress.Task;
  8. import com.intellij.openapi.project.Project;
  9. import com.intellij.openapi.ui.Messages;
  10. import com.intellij.openapi.util.text.StringUtil;
  11. import com.intellij.openapi.vcs.CheckoutProvider;
  12. import com.intellij.openapi.vcs.VcsKey;
  13. import com.intellij.util.SystemProperties;
  14. import org.apache.commons.httpclient.URIException;
  15. import org.bitbucket.connectors.jetbrains.ui.BitbucketBundle;
  16. import org.bitbucket.connectors.jetbrains.ui.BitbucketCloneProjectDialog;
  17. import org.bitbucket.connectors.jetbrains.vcs.GitHandler;
  18. import org.bitbucket.connectors.jetbrains.vcs.HgHandler;
  19. import org.bitbucket.connectors.jetbrains.vcs.VcsHandler;
  20. import org.jetbrains.annotations.NotNull;
  21. import org.jetbrains.annotations.Nullable;
  22. import java.io.File;
  23. import java.lang.reflect.InvocationTargetException;
  24. import java.lang.reflect.Method;
  25. import java.util.Collections;
  26. import java.util.Comparator;
  27. import java.util.List;
  28. public class BitbucketCheckoutProvider implements CheckoutProvider {
  29. public void doCheckout(@NotNull Project project, @Nullable Listener listener) {
  30. List<RepositoryInfo> availableRepos = BitbucketUtil.getRepositories(project, false);
  31. if (availableRepos == null) {
  32. return;
  33. }
  34. if (availableRepos.isEmpty()) {
  35. Messages.showErrorDialog(project, BitbucketBundle.message("clone-err"), BitbucketBundle.message("cannot-clone"));
  36. return;
  37. }
  38. Collections.sort(availableRepos, new Comparator<RepositoryInfo>() {
  39. public int compare(final RepositoryInfo r1, final RepositoryInfo r2) {
  40. int res = r1.getOwner().compareTo(r2.getOwner());
  41. if (res != 0) {
  42. return res;
  43. }
  44. return r1.getName().compareTo(r2.getName());
  45. }
  46. });
  47. String clonePath;
  48. String lastProjectLocation = GeneralSettings.getInstance().getLastProjectCreationLocation();
  49. String userHome = SystemProperties.getUserHome();
  50. if (lastProjectLocation != null) {
  51. clonePath = lastProjectLocation.replace('/', File.separatorChar);
  52. } else {
  53. clonePath = userHome.replace('/', File.separatorChar) + File.separator +
  54. ApplicationNamesInfo.getInstance().getLowercaseProductName() + "Projects";
  55. }
  56. File file = new File(clonePath);
  57. if (!file.exists() || !file.isDirectory()) {
  58. clonePath = userHome;
  59. }
  60. BitbucketCloneProjectDialog checkoutDialog = new BitbucketCloneProjectDialog(project, availableRepos);
  61. checkoutDialog.setSelectedPath(clonePath);
  62. checkoutDialog.show();
  63. if (!checkoutDialog.isOK()) {
  64. return;
  65. }
  66. File folder = new File(checkoutDialog.getSelectedPath());
  67. if (!folder.exists() || !folder.isDirectory()) {
  68. return;
  69. }
  70. String projectName = checkoutDialog.getProjectName();
  71. if (!StringUtil.isEmpty(projectName)) {
  72. folder = new File(folder, projectName);
  73. if (!folder.exists()) {
  74. if (!folder.mkdir()) {
  75. return;
  76. }
  77. } else if (!folder.isDirectory()) {
  78. return;
  79. }
  80. }
  81. RepositoryInfo repository = checkoutDialog.getSelectedRepository();
  82. try {
  83. String repositoryUrl;
  84. boolean git;
  85. if (repository != null) {
  86. repositoryUrl = repository.getCheckoutUrl();
  87. git = repository.isGit();
  88. } else {
  89. repositoryUrl = checkoutDialog.getRepositoryUrl();
  90. if (BitbucketUtil.isHttpUrl(repositoryUrl)) {
  91. repositoryUrl = RepositoryInfo.addPassword(repositoryUrl, false);
  92. }
  93. git = GitHandler.isGitRepository(repositoryUrl);
  94. }
  95. checkout(project, repositoryUrl, folder.getPath(), git, listener);
  96. } catch (URIException e) {
  97. Messages.showErrorDialog(project, e.getMessage(), BitbucketBundle.message("url-encode-err"));
  98. }
  99. }
  100. private void checkout(final Project project, final String repositoryUrl, final String folder, final boolean git, final Listener listener) {
  101. ApplicationManager.getApplication().runWriteAction(new Runnable() {
  102. public void run() {
  103. FileDocumentManager.getInstance().saveAllDocuments();
  104. }
  105. });
  106. new Task.Backgroundable(project, BitbucketBundle.message("checkouting"), true) {
  107. public void run(@NotNull ProgressIndicator progressIndicator) {
  108. final VcsHandler vcsHandler = git ? new GitHandler() : new HgHandler();
  109. if (vcsHandler.checkout(project, folder, repositoryUrl)) {
  110. ApplicationManager.getApplication().invokeLater(new Runnable() {
  111. public void run() {
  112. if (listener != null) {
  113. directoryCheckedOut(listener, new File(folder), vcsHandler.getVcs(project).getKeyInstanceMethod());
  114. listener.checkoutCompleted();
  115. }
  116. }
  117. });
  118. }
  119. }
  120. }.queue();
  121. }
  122. private void directoryCheckedOut(Listener listener, File folder, VcsKey vcsKey) {
  123. for (Method m: listener.getClass().getDeclaredMethods()) {
  124. if ("directoryCheckedOut".equals(m.getName())) {
  125. Object[] params = m.getParameterTypes().length == 2 ?
  126. new Object[] { folder, vcsKey } : // new API
  127. new Object[] { folder }; // old API
  128. try {
  129. m.invoke(listener, params);
  130. return;
  131. } catch (Exception e) {
  132. throw new RuntimeException(e);
  133. }
  134. }
  135. }
  136. }
  137. public String getVcsName() {
  138. return BitbucketUtil.BITBUCKET;
  139. }
  140. }