From 6315d964629a2c6b34b66995a0d660601850037b Mon Sep 17 00:00:00 2001 From: Kirill Likhodedov Date: Tue, 24 Apr 2012 15:41:50 +0400 Subject: [PATCH 01/26] Github: better check if parent remote of a fork is defined Before the change, when using github account "foobar", forking from "foo" resulted in incorrect fork parent remote identification. --- .../src/org/jetbrains/plugins/github/GithubRebaseAction.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/github/src/org/jetbrains/plugins/github/GithubRebaseAction.java b/plugins/github/src/org/jetbrains/plugins/github/GithubRebaseAction.java index 29a06253faef..4d42d0d077d4 100644 --- a/plugins/github/src/org/jetbrains/plugins/github/GithubRebaseAction.java +++ b/plugins/github/src/org/jetbrains/plugins/github/GithubRebaseAction.java @@ -141,7 +141,7 @@ public class GithubRebaseAction extends DumbAwareAction { final Ref remoteForForkParentRepo = new Ref(); for (GitRemote gitRemote : gitRepository.getRemotes()) { for (String url : gitRemote.getUrls()) { - if (url.endsWith(parent + ".git")) { + if (url.endsWith("/" + parent + ".git")) { remoteForForkParentRepo.set(gitRemote.getName()); break; } From e790f42de96269abb89df317986221f1e6473423 Mon Sep 17 00:00:00 2001 From: Kirill Likhodedov Date: Fri, 27 Apr 2012 13:29:28 +0400 Subject: [PATCH 02/26] IDEA-85310 Better handle HTTP urls without .git at the end JGit can throw not only JGitInternalException, but InvalidRemoteException as well. --- .../git4idea/src/git4idea/jgit/GitHttpAdapter.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/plugins/git4idea/src/git4idea/jgit/GitHttpAdapter.java b/plugins/git4idea/src/git4idea/jgit/GitHttpAdapter.java index 30b272cd363b..b14876795efe 100644 --- a/plugins/git4idea/src/git4idea/jgit/GitHttpAdapter.java +++ b/plugins/git4idea/src/git4idea/jgit/GitHttpAdapter.java @@ -301,6 +301,19 @@ public final class GitHttpAdapter { rememberPassword(provider); return GeneralResult.SUCCESS; } + catch (InvalidRemoteException e) { + if (!noRemoteWithoutGitErrorFixTried && isNoRemoteWithoutDotGitError(e, url)) { + url += ".git"; + command.setUrl(url); + provider.setUrl(url); + noRemoteWithoutGitErrorFixTried = true; + // don't "eat" one password entering attempt + //noinspection AssignmentToForLoopParameter + i--; + command.cleanup(); + } + throw e; + } catch (JGitInternalException e) { if (authError(e)) { if (provider.wasCancelled()) { // if user cancels the dialog, just return From 0f537c0f7fbc60b74ade88ef78d52f525aee41b7 Mon Sep 17 00:00:00 2001 From: Kirill Likhodedov Date: Fri, 27 Apr 2012 14:32:53 +0400 Subject: [PATCH 03/26] IDEA-85310 Better error notification for http * Log exception as error, not as info. * Display the error stored in GitFetchResult. --- plugins/git4idea/src/git4idea/jgit/GitHttpAdapter.java | 2 +- plugins/git4idea/src/git4idea/update/GitFetcher.java | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/plugins/git4idea/src/git4idea/jgit/GitHttpAdapter.java b/plugins/git4idea/src/git4idea/jgit/GitHttpAdapter.java index b14876795efe..4f6e81012d7a 100644 --- a/plugins/git4idea/src/git4idea/jgit/GitHttpAdapter.java +++ b/plugins/git4idea/src/git4idea/jgit/GitHttpAdapter.java @@ -146,7 +146,7 @@ public final class GitHttpAdapter { } private static void logException(GitRepository repository, String remoteName, String remoteUrl, Exception e, String operation) { - LOG.info("Exception while " + operation + " " + remoteName + "(" + remoteUrl + ")" + " in " + repository.toLogString(), e); + LOG.error("Exception while " + operation + " " + remoteName + "(" + remoteUrl + ")" + " in " + repository.toLogString(), e); } private static GitFetchResult.Type convertToFetchResultType(GeneralResult result) { diff --git a/plugins/git4idea/src/git4idea/update/GitFetcher.java b/plugins/git4idea/src/git4idea/update/GitFetcher.java index bf01ef78ab95..94260ce1cbb2 100644 --- a/plugins/git4idea/src/git4idea/update/GitFetcher.java +++ b/plugins/git4idea/src/git4idea/update/GitFetcher.java @@ -299,7 +299,9 @@ public class GitFetcher { additionalInfo.put(root, ai); } if (!result.isSuccess()) { - displayFetchResult(myProject, result, errorNotificationTitle, getErrors()); + Collection errors = new ArrayList(getErrors()); + errors.addAll(result.getErrors()); + displayFetchResult(myProject, result, errorNotificationTitle, errors); return false; } } From 356c720e6aaa08de27c5e99e3401e32c7d2ea7dc Mon Sep 17 00:00:00 2001 From: Kirill Likhodedov Date: Fri, 27 Apr 2012 15:23:23 +0400 Subject: [PATCH 04/26] IDEA-85138 GitHub Rebase my Github fork: fetch the upstream before rebase * Create GitFetcher#fetch(root, remote) to fetch the given remote instead of the current remote. * Call it from GithubRebaseAction, display error and don't proceed in the case of error. --- .../src/git4idea/update/GitFetchResult.java | 5 ++++ .../src/git4idea/update/GitFetcher.java | 28 +++++++++++++++++++ .../plugins/github/GithubRebaseAction.java | 28 +++++++++++++++++++ 3 files changed, 61 insertions(+) diff --git a/plugins/git4idea/src/git4idea/update/GitFetchResult.java b/plugins/git4idea/src/git4idea/update/GitFetchResult.java index 9ed1559588c7..1138bbc9ba6f 100644 --- a/plugins/git4idea/src/git4idea/update/GitFetchResult.java +++ b/plugins/git4idea/src/git4idea/update/GitFetchResult.java @@ -65,6 +65,11 @@ public final class GitFetchResult { public static GitFetchResult error(Exception error) { return error(Collections.singletonList(error)); } + + @NotNull + public static GitFetchResult error(@NotNull String errorMessage) { + return error(new Exception(errorMessage)); + } public boolean isSuccess() { return myType == Type.SUCCESS; diff --git a/plugins/git4idea/src/git4idea/update/GitFetcher.java b/plugins/git4idea/src/git4idea/update/GitFetcher.java index 94260ce1cbb2..e7628d655175 100644 --- a/plugins/git4idea/src/git4idea/update/GitFetcher.java +++ b/plugins/git4idea/src/git4idea/update/GitFetcher.java @@ -98,6 +98,30 @@ public class GitFetcher { return fetchResult; } + @NotNull + public GitFetchResult fetch(@NotNull VirtualFile root, @NotNull String remoteName) { + GitRepository repository = myRepositoryManager.getRepositoryForRoot(root); + if (repository == null) { + return logError("Repository can't be null for " + root, myRepositoryManager.toString()); + } + GitRemote remote = GitUtil.findRemoteByName(repository, remoteName); + if (remote == null) { + return logError("Couldn't find remote with the name " + remoteName, null); + } + String url = remote.getFirstUrl(); + if (url == null) { + return logError("URL is null for remote " + remote.getName(), null); + } + return fetchRemote(repository, remote, url); + } + + private static GitFetchResult logError(@NotNull String message, @Nullable String additionalInfo) { + String addInfo = additionalInfo != null ? "\n" + additionalInfo : ""; + LOG.error(message + addInfo); + return GitFetchResult.error(message); + } + + @NotNull private GitFetchResult fetchCurrentRemote(@NotNull GitRepository repository) { FetchParams fetchParams = getFetchParams(repository); if (fetchParams.isError()) { @@ -106,7 +130,11 @@ public class GitFetcher { GitRemote remote = fetchParams.getRemote(); String url = fetchParams.getUrl(); + return fetchRemote(repository, remote, url); + } + @NotNull + private GitFetchResult fetchRemote(@NotNull GitRepository repository, @NotNull GitRemote remote, @NotNull String url) { if (GitHttpAdapter.shouldUseJGit(url)) { return GitHttpAdapter.fetch(repository, remote, url, null); } diff --git a/plugins/github/src/org/jetbrains/plugins/github/GithubRebaseAction.java b/plugins/github/src/org/jetbrains/plugins/github/GithubRebaseAction.java index 4d42d0d077d4..5967e49727e3 100644 --- a/plugins/github/src/org/jetbrains/plugins/github/GithubRebaseAction.java +++ b/plugins/github/src/org/jetbrains/plugins/github/GithubRebaseAction.java @@ -19,7 +19,9 @@ import com.intellij.openapi.actionSystem.ActionManager; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.PlatformDataKeys; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.progress.ProgressManager; +import com.intellij.openapi.progress.Task; import com.intellij.openapi.project.DumbAwareAction; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.Messages; @@ -35,8 +37,13 @@ import git4idea.commands.GitSimpleHandler; import git4idea.repo.GitRemote; import git4idea.repo.GitRepository; import git4idea.repo.GitRepositoryManager; +import git4idea.update.GitFetchResult; +import git4idea.update.GitFetcher; +import org.jetbrains.annotations.NotNull; import org.jetbrains.plugins.github.ui.GithubLoginDialog; +import java.util.concurrent.atomic.AtomicReference; + /** * Created by IntelliJ IDEA. * @@ -194,6 +201,10 @@ public class GithubRebaseAction extends DumbAwareAction { }); } + boolean fetchedSuccessfully = fetchParentOrNotifyError(project, gitRepository, remoteForForkParentRepo.get()); + if (!fetchedSuccessfully) { + return; + } BasicAction.saveAll(); final GithubRebase action = (GithubRebase) ActionManager.getInstance().getAction("Github.Rebase.Internal"); action.setRebaseOrigin(remoteForForkParentRepo.get()); @@ -202,6 +213,23 @@ public class GithubRebaseAction extends DumbAwareAction { action.actionPerformed(actionEvent); } + private static boolean fetchParentOrNotifyError(@NotNull final Project project, @NotNull final GitRepository repository, + @NotNull final String remote) { + final AtomicReference fetchResult = new AtomicReference(); + ProgressManager.getInstance().run(new Task.Modal(project, "Fetching " + remote, false) { + @Override + public void run(@NotNull ProgressIndicator indicator) { + fetchResult.set(new GitFetcher(project, indicator, false).fetch(repository.getRoot(), remote)); + } + }); + GitFetchResult result = fetchResult.get(); + if (!result.isSuccess()) { + GitFetcher.displayFetchResult(project, result, null, result.getErrors()); + return false; + } + return true; + } + private void showErrorMessageInEDT(final Project project, final String message) { UIUtil.invokeLaterIfNeeded(new Runnable(){ @Override From a16105cf0caa56d5d692d10ccfdff25257f9fd3f Mon Sep 17 00:00:00 2001 From: Kirill Likhodedov Date: Fri, 27 Apr 2012 15:27:50 +0400 Subject: [PATCH 05/26] IDEA-85139 GitHub "Rebase my Github fork" dialog should have "Interactive" deselected by default --- plugins/git4idea/src/git4idea/rebase/GitRebaseDialog.java | 2 +- .../src/org/jetbrains/plugins/github/ui/GithubRebaseDialog.java | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/git4idea/src/git4idea/rebase/GitRebaseDialog.java b/plugins/git4idea/src/git4idea/rebase/GitRebaseDialog.java index e08d4a890787..2dff5fc4aa6e 100644 --- a/plugins/git4idea/src/git4idea/rebase/GitRebaseDialog.java +++ b/plugins/git4idea/src/git4idea/rebase/GitRebaseDialog.java @@ -76,7 +76,7 @@ public class GitRebaseDialog extends DialogWrapper { /** * If selected, rebase is interactive */ - private JCheckBox myInteractiveCheckBox; + protected JCheckBox myInteractiveCheckBox; /** * No merges are performed if selected. */ diff --git a/plugins/github/src/org/jetbrains/plugins/github/ui/GithubRebaseDialog.java b/plugins/github/src/org/jetbrains/plugins/github/ui/GithubRebaseDialog.java index 0b9b571509a9..b6c8e0085261 100644 --- a/plugins/github/src/org/jetbrains/plugins/github/ui/GithubRebaseDialog.java +++ b/plugins/github/src/org/jetbrains/plugins/github/ui/GithubRebaseDialog.java @@ -41,6 +41,7 @@ public class GithubRebaseDialog extends GitRebaseDialog { public void configure(final String originName) { setTitle("Rebase GitHub"); + myInteractiveCheckBox.setSelected(false); myShowRemoteBranchesCheckBox.setSelected(true); myShowRemoteBranchesCheckBox.getParent().remove(myShowRemoteBranchesCheckBox); myGitRootComboBox.setEnabled(false); From 5a37d384c42d7dc77b5e2bf9b6f76d1c716a201e Mon Sep 17 00:00:00 2001 From: Kirill Likhodedov Date: Fri, 27 Apr 2012 16:23:12 +0400 Subject: [PATCH 06/26] IDEA-55671 Git rebase nearly always reports an error * Make success to be the default status. * Add better diagnosis for conflict and error. --- .../git4idea/src/git4idea/rebase/GitRebaseLineListener.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/git4idea/src/git4idea/rebase/GitRebaseLineListener.java b/plugins/git4idea/src/git4idea/rebase/GitRebaseLineListener.java index b5ab7ceee4a9..62aabee3a3bc 100644 --- a/plugins/git4idea/src/git4idea/rebase/GitRebaseLineListener.java +++ b/plugins/git4idea/src/git4idea/rebase/GitRebaseLineListener.java @@ -61,7 +61,7 @@ public class GitRebaseLineListener extends GitLineHandlerAdapter { assert myStatus == null; myStatus = Status.FINISHED; } - else if (line.startsWith("Automatic cherry-pick failed. ")) { + else if (line.startsWith("Automatic cherry-pick failed") || line.startsWith("When you have resolved this problem")) { assert myStatus == null || myStatus == Status.ERROR; myStatus = Status.CONFLICT; } @@ -69,7 +69,7 @@ public class GitRebaseLineListener extends GitLineHandlerAdapter { assert myStatus == null; myStatus = myProgressLine == null ? Status.CANCELLED : Status.ERROR; } - else if (line.startsWith("fatal") || line.startsWith("error: ")) { + else if (line.startsWith("fatal") || line.startsWith("error: ") || line.startsWith("Cannot rebase")) { if (myStatus != Status.CONFLICT) { myStatus = Status.ERROR; } @@ -97,7 +97,7 @@ public class GitRebaseLineListener extends GitLineHandlerAdapter { else { total = current = 0; } - return new Result(myStatus == null ? Status.ERROR : myStatus, total, current); + return new Result(myStatus == null ? Status.FINISHED : myStatus, total, current); } /** From 942c9fdc0b4cd24a26ac60139a023cc8435c06dd Mon Sep 17 00:00:00 2001 From: Kirill Likhodedov Date: Sat, 28 Apr 2012 12:09:23 +0400 Subject: [PATCH 07/26] IDEA-76340 Refresh after Git stash/unstash --- plugins/git4idea/src/git4idea/actions/GitStash.java | 4 +++- plugins/git4idea/src/git4idea/ui/GitUnstashDialog.java | 5 +++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/plugins/git4idea/src/git4idea/actions/GitStash.java b/plugins/git4idea/src/git4idea/actions/GitStash.java index 38abfd3f8d34..39339ba71d14 100644 --- a/plugins/git4idea/src/git4idea/actions/GitStash.java +++ b/plugins/git4idea/src/git4idea/actions/GitStash.java @@ -48,9 +48,11 @@ public class GitStash extends GitRepositoryAction { if (!d.isOK()) { return; } - affectedRoots.add(d.getGitRoot()); + VirtualFile root = d.getGitRoot(); + affectedRoots.add(root); final GitLineHandler h = d.handler(); GitHandlerUtil.doSynchronously(h, GitBundle.getString("stashing.title"), h.printableCommandLine()); + root.refresh(true, true); } /** diff --git a/plugins/git4idea/src/git4idea/ui/GitUnstashDialog.java b/plugins/git4idea/src/git4idea/ui/GitUnstashDialog.java index e6accdb510cd..61ce16bfe79a 100644 --- a/plugins/git4idea/src/git4idea/ui/GitUnstashDialog.java +++ b/plugins/git4idea/src/git4idea/ui/GitUnstashDialog.java @@ -406,7 +406,8 @@ public class GitUnstashDialog extends DialogWrapper { if (!d.isOK()) { return; } - affectedRoots.add(d.getGitRoot()); + VirtualFile root = d.getGitRoot(); + affectedRoots.add(root); GitLineHandler h = d.handler(); final AtomicBoolean conflict = new AtomicBoolean(); @@ -418,9 +419,9 @@ public class GitUnstashDialog extends DialogWrapper { } }); int rc = GitHandlerUtil.doSynchronously(h, GitBundle.getString("unstash.unstashing"), h.printableCommandLine(), false); + root.refresh(true, true); if (conflict.get()) { - VirtualFile root = d.getGitRoot(); boolean conflictsResolved = new UnstashConflictResolver(project, root, d.getSelectedStash()).merge(); LOG.info("loadRoot " + root + ", conflictsResolved: " + conflictsResolved); } else if (rc != 0) { From f37d5724996037b00a2ed4919fd088e811ca6d16 Mon Sep 17 00:00:00 2001 From: Kirill Likhodedov Date: Sat, 28 Apr 2012 12:10:23 +0400 Subject: [PATCH 08/26] GitUtil.findGitDir: find better, expecting a relative path to submodule's git dir. Might be related to IDEA-85369. --- plugins/git4idea/src/git4idea/GitUtil.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/plugins/git4idea/src/git4idea/GitUtil.java b/plugins/git4idea/src/git4idea/GitUtil.java index 9d21bab8482c..8556b790634b 100644 --- a/plugins/git4idea/src/git4idea/GitUtil.java +++ b/plugins/git4idea/src/git4idea/GitUtil.java @@ -114,6 +114,14 @@ public class GitUtil { else { pathToDir = content; } + + if (!FileUtil.isAbsolute(pathToDir)) { + String canonicalPath = FileUtil.toCanonicalPath(FileUtil.join(rootDir.getPath(), pathToDir)); + if (canonicalPath == null) { + return null; + } + pathToDir = FileUtil.toSystemIndependentName(canonicalPath); + } return VcsUtil.getVirtualFile(pathToDir); } From 32335558ad270371e53a1c85e455d94d3a28f8c8 Mon Sep 17 00:00:00 2001 From: Kirill Likhodedov Date: Sat, 28 Apr 2012 12:18:25 +0400 Subject: [PATCH 09/26] IDEA-85121 SIOOBE when showing Git branches for git-svn Just return the whole branch name as the remote name in this case. --- plugins/git4idea/src/git4idea/GitBranch.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/plugins/git4idea/src/git4idea/GitBranch.java b/plugins/git4idea/src/git4idea/GitBranch.java index a6d01112aa55..11b06afcdabe 100644 --- a/plugins/git4idea/src/git4idea/GitBranch.java +++ b/plugins/git4idea/src/git4idea/GitBranch.java @@ -101,7 +101,9 @@ public class GitBranch extends GitReference { */ public static Pair splitNameOfRemoteBranch(String branchName) { int firstSlash = branchName.indexOf('/'); - return Pair.create(branchName.substring(0, firstSlash), branchName.substring(firstSlash + 1)); + String remoteName = firstSlash > -1 ? branchName.substring(0, firstSlash) : branchName; + String remoteBranchName = branchName.substring(firstSlash + 1); + return Pair.create(remoteName, remoteBranchName); } /** From b56a75e42d3a4784be91fc6f97c9f3eb2afeb282 Mon Sep 17 00:00:00 2001 From: Kirill Likhodedov Date: Sat, 28 Apr 2012 12:26:32 +0400 Subject: [PATCH 10/26] IDEA-85015 More diagnostics. Print the root, try to invoke git log -1 HEAD and check the result. --- .../src/git4idea/changes/GitChangeUtils.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/plugins/git4idea/src/git4idea/changes/GitChangeUtils.java b/plugins/git4idea/src/git4idea/changes/GitChangeUtils.java index 80ff6e9cb3dc..4e5f4af077cc 100644 --- a/plugins/git4idea/src/git4idea/changes/GitChangeUtils.java +++ b/plugins/git4idea/src/git4idea/changes/GitChangeUtils.java @@ -15,6 +15,7 @@ */ package git4idea.changes; +import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; @@ -50,6 +51,8 @@ public class GitChangeUtils { */ public static final String COMMITTED_CHANGELIST_FORMAT = "%ct%n%H%n%P%n%an%x20%x3C%ae%x3E%n%cn%x20%x3C%ce%x3E%n%s%n%x03%n%b%n%x03"; + private static final Logger LOG = Logger.getInstance(GitChangeUtils.class); + /** * A private constructor for utility class */ @@ -194,11 +197,17 @@ public class GitChangeUtils { handler.endOptions(); handler.setNoSSH(true); handler.setSilent(true); - //handler.setSilent(true); String output = handler.run(); StringTokenizer stk = new StringTokenizer(output, "\n\r \t", false); if (!stk.hasMoreTokens()) { - throw new VcsException("The string '" + revisionNumber + "' does not represents a revision number. Output: [" + output + "]"); + GitSimpleHandler dh = new GitSimpleHandler(project, vcsRoot, GitCommand.LOG); + dh.addParameters("-1", "HEAD"); + dh.setNoSSH(true); + dh.setSilent(true); + String out = dh.run(); + LOG.info("Diagnostic output from 'git log -1 HEAD': [" + out + "]"); + throw new VcsException(String.format("The string '%s' does not represent a revision number. Output: [%s]\n Root: %s", + revisionNumber, output, vcsRoot)); } Date timestamp = GitUtil.parseTimestampWithNFEReport(stk.nextToken(), handler, output); return new GitRevisionNumber(stk.nextToken(), timestamp); From a336fce606251b8b3b02046034113d563c3d4b62 Mon Sep 17 00:00:00 2001 From: Kirill Likhodedov Date: Sat, 28 Apr 2012 13:49:47 +0400 Subject: [PATCH 11/26] IDEA-85343 Git:Cherry-Pick: when the commit dialog is shown not try to push on 'commit' button The GitCheckinEnvironment remembers the previous value, because it is invoked via the executor, not from the standard commit section. This is a hotfix. Will be reworked within IDEA-84825 --- .../src/git4idea/checkin/GitCheckinEnvironment.java | 9 +++++++-- .../src/git4idea/history/browser/CherryPicker.java | 4 +++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/plugins/git4idea/src/git4idea/checkin/GitCheckinEnvironment.java b/plugins/git4idea/src/git4idea/checkin/GitCheckinEnvironment.java index 18de6c810cb3..a2e21ae6f5ec 100644 --- a/plugins/git4idea/src/git4idea/checkin/GitCheckinEnvironment.java +++ b/plugins/git4idea/src/git4idea/checkin/GitCheckinEnvironment.java @@ -557,6 +557,12 @@ public class GitCheckinEnvironment implements CheckinEnvironment { myDirtyScopeManager.dirDirtyRecursively(root); } + public void reset() { + myNextCommitAmend = false; + myNextCommitAuthor = null; + myNextCommitIsPushed = null; + } + /** * Checkin options for git */ @@ -642,9 +648,8 @@ public class GitCheckinEnvironment implements CheckinEnvironment { */ public void refresh() { myAuthor.setSelectedItem(""); - myNextCommitAuthor = null; myAmend.setSelected(false); - myNextCommitIsPushed = null; + reset(); } /** diff --git a/plugins/git4idea/src/git4idea/history/browser/CherryPicker.java b/plugins/git4idea/src/git4idea/history/browser/CherryPicker.java index 85f5b378deb4..6afe63a51788 100644 --- a/plugins/git4idea/src/git4idea/history/browser/CherryPicker.java +++ b/plugins/git4idea/src/git4idea/history/browser/CherryPicker.java @@ -34,6 +34,7 @@ import com.intellij.util.ArrayUtil; import com.intellij.util.Consumer; import com.intellij.util.WaitForProgressToShow; import git4idea.PlatformFacade; +import git4idea.checkin.GitCheckinEnvironment; import git4idea.commands.Git; import git4idea.commands.GitCommandResult; import git4idea.commands.GitMessageWithFilesDetector; @@ -486,8 +487,9 @@ public class CherryPicker { final Collection committingDocs = markCommittingDocs(); try { CheckinEnvironment ce = myPlatformFacade.getVcs(myProject).getCheckinEnvironment(); - if (ce != null) { + if (ce != null && ce instanceof GitCheckinEnvironment) { try { + ((GitCheckinEnvironment)ce).reset(); List exceptions = ce.commit(myChanges, myCommitMessage); VcsDirtyScopeManager.getInstance(myProject).filePathsDirty(ChangesUtil.getPaths(myChanges), null); if (exceptions != null && !exceptions.isEmpty()) { From 88e9045425c9fa1fd0eb403922361303095a7f43 Mon Sep 17 00:00:00 2001 From: Kirill Likhodedov Date: Sat, 28 Apr 2012 15:29:21 +0400 Subject: [PATCH 12/26] IDEA-85380 Show diff on a conflicted file under Git throws NPE * GitMergeProvider, identifying the LAST_REVISION_NUMBER: - if there is no MERGE_HEAD, try the CHERRY_PICK_HEAD. - log the error if none can be resolved (and if HEAD can't be resolved in the case of rebase). * Protect against the NPE in ConflictedDiffRequestPresentable. --- .../ConflictedDiffRequestPresentable.java | 7 ++-- .../src/git4idea/merge/GitMergeProvider.java | 36 +++++++++++++++---- 2 files changed, 34 insertions(+), 9 deletions(-) diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/actions/ConflictedDiffRequestPresentable.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/actions/ConflictedDiffRequestPresentable.java index ce19d4c0aeb8..b9e6837f7776 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/actions/ConflictedDiffRequestPresentable.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/actions/ConflictedDiffRequestPresentable.java @@ -25,11 +25,11 @@ import com.intellij.openapi.util.Getter; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.vcs.AbstractVcs; import com.intellij.openapi.vcs.FilePathImpl; -import com.intellij.openapi.vcs.VcsBundle; import com.intellij.openapi.vcs.VcsException; import com.intellij.openapi.vcs.changes.Change; import com.intellij.openapi.vcs.changes.ChangesUtil; import com.intellij.openapi.vcs.changes.MergeTexts; +import com.intellij.openapi.vcs.history.VcsRevisionNumber; import com.intellij.openapi.vcs.merge.MergeData; import com.intellij.openapi.vfs.CharsetToolkit; import com.intellij.openapi.vfs.VirtualFile; @@ -97,8 +97,9 @@ public class ConflictedDiffRequestPresentable implements DiffRequestPresentable CharsetToolkit.bytesToString(mergeData.ORIGINAL, charset), myProject, null, null); request.setWindowTitle(FileUtil.toSystemDependentName(myFile.getPresentableUrl())); // todo titles? - request.setVersionTitles(new String[] {myChange.getAfterRevision().getRevisionNumber().asString(), - "Base Version", mergeData.LAST_REVISION_NUMBER.asString()}); + VcsRevisionNumber lastRevisionNumber = mergeData.LAST_REVISION_NUMBER; + request.setVersionTitles(new String[]{myChange.getAfterRevision().getRevisionNumber().asString(), + "Base Version", lastRevisionNumber != null ? lastRevisionNumber.asString() : ""}); return new MyResult(request, DiffPresentationReturnValue.useRequest); } catch (VcsException e) { diff --git a/plugins/git4idea/src/git4idea/merge/GitMergeProvider.java b/plugins/git4idea/src/git4idea/merge/GitMergeProvider.java index 779546da35e0..fcc5fc72b39c 100644 --- a/plugins/git4idea/src/git4idea/merge/GitMergeProvider.java +++ b/plugins/git4idea/src/git4idea/merge/GitMergeProvider.java @@ -19,6 +19,7 @@ import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; import com.intellij.openapi.vcs.FilePath; import com.intellij.openapi.vcs.VcsException; +import com.intellij.openapi.vcs.history.VcsRevisionNumber; import com.intellij.openapi.vcs.merge.MergeData; import com.intellij.openapi.vcs.merge.MergeProvider2; import com.intellij.openapi.vcs.merge.MergeSession; @@ -37,6 +38,7 @@ import git4idea.commands.GitSimpleHandler; import git4idea.util.StringScanner; import git4idea.i18n.GitBundle; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.io.IOException; import java.util.HashMap; @@ -119,12 +121,7 @@ public class GitMergeProvider implements MergeProvider2 { } mergeData.CURRENT = loadRevisionCatchingErrors(current); mergeData.LAST = loadRevisionCatchingErrors(last); - try { - mergeData.LAST_REVISION_NUMBER = GitRevisionNumber.resolve(myProject, root, myReverse ? "HEAD" : "MERGE_HEAD"); - } - catch (VcsException e) { - // ignore exception, the null value will be used - } + mergeData.LAST_REVISION_NUMBER = findLastRevisionNumber(root); } catch (IOException e) { throw new IllegalStateException("Failed to load file content", e); @@ -135,6 +132,33 @@ public class GitMergeProvider implements MergeProvider2 { return mergeData; } + @Nullable + private VcsRevisionNumber findLastRevisionNumber(@NotNull VirtualFile root) { + if (myReverse) { + try { + return GitRevisionNumber.resolve(myProject, root, "HEAD"); + } + catch (VcsException e) { + log.error("Couldn't resolve the HEAD in " + root, e); + } + } + else { + try { + return GitRevisionNumber.resolve(myProject, root, "MERGE_HEAD"); + } + catch (VcsException e) { + log.info("Couldn't resolved the MERGE_HEAD in " + root, e); // this may be not a bug, just cherry-pick + try { + return GitRevisionNumber.resolve(myProject, root, "CHERRY_PICK_HEAD"); + } + catch (VcsException e1) { + log.error("Couldn't resolve neither MERGE_HEAD, nor the CHERRY_PICK_HEAD in " + root, e1); + } + } + } + return null; + } + private byte[] loadRevisionCatchingErrors(final GitFileRevision revision) throws VcsException, IOException { try { return revision.getContent(); From 208e521731773c003748b4a8b0fa68905daad4f8 Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Fri, 27 Apr 2012 19:37:44 +0400 Subject: [PATCH 13/26] pass run configuration type id to compile server --- .../src/com/intellij/compiler/options/CompileStepBeforeRun.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/java/execution/impl/src/com/intellij/compiler/options/CompileStepBeforeRun.java b/java/execution/impl/src/com/intellij/compiler/options/CompileStepBeforeRun.java index 4c2a775ccd7e..e7891d8930de 100644 --- a/java/execution/impl/src/com/intellij/compiler/options/CompileStepBeforeRun.java +++ b/java/execution/impl/src/com/intellij/compiler/options/CompileStepBeforeRun.java @@ -48,6 +48,7 @@ public class CompileStepBeforeRun extends BeforeRunTaskProvider ID = Key.create("Make"); private static final Key RUN_CONFIGURATION = Key.create("RUN_CONFIGURATION"); + private static final Key RUN_CONFIGURATION_TYPE_ID = Key.create("RUN_CONFIGURATION_TYPE_ID"); @NonNls protected static final String MAKE_PROJECT_ON_RUN_KEY = "makeProjectOnRun"; @@ -148,6 +149,7 @@ public class CompileStepBeforeRun extends BeforeRunTaskProvider Date: Fri, 27 Apr 2012 19:38:37 +0400 Subject: [PATCH 14/26] android-jps: correct support of light builds --- .../android/util/AndroidCommonUtils.java | 8 ++++++- .../jetbrains/jps/android/AndroidJpsUtil.java | 3 ++- .../android/compiler/AndroidCompileUtil.java | 24 ++----------------- .../compiler/AndroidPrecompileTask.java | 7 ------ 4 files changed, 11 insertions(+), 31 deletions(-) diff --git a/plugins/android/common/src/org/jetbrains/android/util/AndroidCommonUtils.java b/plugins/android/common/src/org/jetbrains/android/util/AndroidCommonUtils.java index b9f63309e95b..cf55bc4e679b 100644 --- a/plugins/android/common/src/org/jetbrains/android/util/AndroidCommonUtils.java +++ b/plugins/android/common/src/org/jetbrains/android/util/AndroidCommonUtils.java @@ -66,7 +66,6 @@ public class AndroidCommonUtils { private static final String[] DRAWABLE_EXTENSIONS = new String[]{PNG_EXTENSION, "jpg", "gif"}; @NonNls public static final String RELEASE_BUILD_OPTION = "RELEASE_BUILD_KEY"; - @NonNls public static final String LIGHT_BUILD_OPTION = "LIGHT_BUILD_KEY"; @NonNls public static final String PROGUARD_CFG_PATH_OPTION = "ANDROID_PROGUARD_CFG_PATH"; @NonNls public static final String DIRECTORY_FOR_LOGS_NAME = "proguard_logs"; @NonNls public static final String PROGUARD_OUTPUT_JAR_NAME = "obfuscated_sources.jar"; @@ -78,9 +77,16 @@ public class AndroidCommonUtils { }; @NonNls public static final String INCLUDE_SYSTEM_PROGUARD_FILE_ELEMENT_NAME = "includeSystemProguardFile"; + private static final String[] TEST_CONFIGURATION_TYPE_IDS = + {"JUnit", "TestNG", "ScalaTestRunConfiguration", "SpecsRunConfiguration", "Specs2RunConfiguration"}; + private AndroidCommonUtils() { } + public static boolean isTestConfiguration(@NotNull String typeId) { + return ArrayUtil.find(TEST_CONFIGURATION_TYPE_IDS, typeId) >= 0; + } + public static String command2string(@NotNull Collection command) { final StringBuilder builder = new StringBuilder(); for (Iterator it = command.iterator(); it.hasNext(); ) { diff --git a/plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidJpsUtil.java b/plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidJpsUtil.java index f9c7c1b682fa..03c2faeaf491 100644 --- a/plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidJpsUtil.java +++ b/plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidJpsUtil.java @@ -435,7 +435,8 @@ class AndroidJpsUtil { } public static boolean isLightBuild(@NotNull CompileContext context) { - return Boolean.parseBoolean(context.getBuilderParameter(AndroidCommonUtils.LIGHT_BUILD_OPTION)); + final String typeId = context.getBuilderParameter("RUN_CONFIGURATION_TYPE_ID"); + return typeId != null && AndroidCommonUtils.isTestConfiguration(typeId); } public static boolean isReleaseBuild(@NotNull CompileContext context) { diff --git a/plugins/android/src/org/jetbrains/android/compiler/AndroidCompileUtil.java b/plugins/android/src/org/jetbrains/android/compiler/AndroidCompileUtil.java index 351fad3391b2..9ada61a6e078 100644 --- a/plugins/android/src/org/jetbrains/android/compiler/AndroidCompileUtil.java +++ b/plugins/android/src/org/jetbrains/android/compiler/AndroidCompileUtil.java @@ -24,7 +24,6 @@ import com.intellij.compiler.impl.ModuleCompileScope; import com.intellij.compiler.options.CompileStepBeforeRun; import com.intellij.compiler.progress.CompilerTask; import com.intellij.execution.configurations.RunConfiguration; -import com.intellij.execution.junit.JUnitConfiguration; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ModalityState; import com.intellij.openapi.compiler.*; @@ -88,10 +87,6 @@ public class AndroidCompileUtil { @NonNls public static final String PROGUARD_CFG_FILE_NAME = "proguard-project.txt"; @NonNls public static final String OLD_PROGUARD_CFG_FILE_NAME = "proguard.cfg"; - @NonNls - private static final String[] SCALA_TEST_CONFIGURATIONS = - {"ScalaTestRunConfiguration", "SpecsRunConfiguration", "Specs2RunConfiguration"}; - private AndroidCompileUtil() { } @@ -622,23 +617,8 @@ public class AndroidCompileUtil { } public static boolean isFullBuild(@NotNull CompileContext context) { - final RunConfiguration runConfiguration = CompileStepBeforeRun.getRunConfiguration(context); - - if (runConfiguration == null) { - return true; - } - - if (runConfiguration instanceof JUnitConfiguration) { - return false; - } - - for (AndroidLightBuildProvider provider : AndroidLightBuildProvider.EP_NAME.getExtensions()) { - if (provider.toPerformLightBuild(runConfiguration)) { - return false; - } - } - final String id = runConfiguration.getType().getId(); - return ArrayUtil.find(SCALA_TEST_CONFIGURATIONS, id) < 0; + final RunConfiguration c = CompileStepBeforeRun.getRunConfiguration(context); + return c == null || !AndroidCommonUtils.isTestConfiguration(c.getType().getId()); } public static boolean isReleaseBuild(@NotNull CompileContext context) { diff --git a/plugins/android/src/org/jetbrains/android/compiler/AndroidPrecompileTask.java b/plugins/android/src/org/jetbrains/android/compiler/AndroidPrecompileTask.java index 7539aa2329a4..ad884623dbb9 100644 --- a/plugins/android/src/org/jetbrains/android/compiler/AndroidPrecompileTask.java +++ b/plugins/android/src/org/jetbrains/android/compiler/AndroidPrecompileTask.java @@ -32,7 +32,6 @@ import com.intellij.openapi.roots.DependencyScope; import com.intellij.openapi.roots.ModuleOrderEntry; import com.intellij.openapi.roots.ModuleRootManager; import com.intellij.openapi.roots.OrderEntry; -import com.intellij.openapi.util.Key; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; @@ -41,7 +40,6 @@ import org.jetbrains.android.facet.AndroidFacet; import org.jetbrains.android.facet.AndroidRootUtil; import org.jetbrains.android.maven.AndroidMavenUtil; import org.jetbrains.android.sdk.AndroidPlatform; -import org.jetbrains.android.util.AndroidCommonUtils; import org.jetbrains.annotations.NotNull; import java.io.File; @@ -54,7 +52,6 @@ import java.util.Set; */ public class AndroidPrecompileTask implements CompileTask { private static final Logger LOG = Logger.getInstance("#org.jetbrains.android.compiler.AndroidPrecompileTask"); - private static final Key LIGHT_BUILD_KEY = Key.create(AndroidCommonUtils.LIGHT_BUILD_OPTION); @Override public boolean execute(CompileContext context) { @@ -106,10 +103,6 @@ public class AndroidPrecompileTask implements CompileTask { LOG.debug("Files excluded by Android: " + addedEntries.size()); CompilerManager.getInstance(project).addCompilationStatusListener(new MyCompilationStatusListener(project, addedEntries), project); } - - if (!AndroidCompileUtil.isFullBuild(context)) { - context.getCompileScope().putUserData(LIGHT_BUILD_KEY, Boolean.toString(true)); - } return true; } From 9684d73c40188ff902d0289ab8006f1d2ea90aaf Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Fri, 27 Apr 2012 20:29:27 +0400 Subject: [PATCH 15/26] android-jps: check compatibility of sdk package versions --- .../AndroidSourceGeneratingBuilder.java | 86 +++++++++++++------ 1 file changed, 60 insertions(+), 26 deletions(-) diff --git a/plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidSourceGeneratingBuilder.java b/plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidSourceGeneratingBuilder.java index b7a70d8a9418..974092fc2ca5 100644 --- a/plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidSourceGeneratingBuilder.java +++ b/plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidSourceGeneratingBuilder.java @@ -46,6 +46,9 @@ public class AndroidSourceGeneratingBuilder extends ModuleLevelBuilder { @NonNls private static final String PERMISSION_GROUP_TAG = "permission-group"; @NonNls private static final String NAME_ATTRIBUTE = "name"; + private static final int MIN_PLATFORM_TOOLS_REVISION = 11; + private static final int MIN_SDK_TOOLS_REVISION = 19; + public AndroidSourceGeneratingBuilder() { super(BuilderCategory.SOURCE_GENERATOR); } @@ -70,6 +73,15 @@ public class AndroidSourceGeneratingBuilder extends ModuleLevelBuilder { } private static ModuleLevelBuilder.ExitCode doBuild(CompileContext context, ModuleChunk chunk) throws IOException { + final Map moduleDataMap = computeModuleDatas(chunk.getModules(), context); + if (moduleDataMap == null || moduleDataMap.size() == 0) { + return ExitCode.ABORT; + } + + if (!checkVersions(moduleDataMap, context)) { + return ExitCode.ABORT; + } + final Map idlFilesToCompile = new HashMap(); final Map rsFilesToCompile = new HashMap(); @@ -93,12 +105,6 @@ public class AndroidSourceGeneratingBuilder extends ModuleLevelBuilder { return true; } }); - - final Map moduleDataMap = computeModuleDatas(chunk.getModules(), context); - - if (moduleDataMap == null || moduleDataMap.size() == 0) { - return ExitCode.ABORT; - } boolean success = true; if (context.isProjectRebuild()) { @@ -154,6 +160,43 @@ public class AndroidSourceGeneratingBuilder extends ModuleLevelBuilder { return success ? ExitCode.OK : ExitCode.ABORT; } + private static boolean checkVersions(@NotNull Map dataMap, @NotNull CompileContext context) { + for (Map.Entry entry : dataMap.entrySet()) { + final Module module = entry.getKey(); + final AndroidPlatform platform = entry.getValue().getPlatform(); + + boolean success = true; + + final int platformToolsRevision = platform.getPlatformToolsRevision(); + if (platformToolsRevision >= 0 && platformToolsRevision < MIN_PLATFORM_TOOLS_REVISION) { + final String message = '[' + + module.getName() + + "] Incompatible version of Android SDK Platform-tools package. Min version is " + + MIN_PLATFORM_TOOLS_REVISION + + ". Please, update it though SDK manager"; + context.processMessage(new CompilerMessage(BUILDER_NAME, BuildMessage.Kind.ERROR, message)); + success = false; + } + + final int sdkToolsRevision = platform.getSdkToolsRevision(); + if (sdkToolsRevision >= 0 && sdkToolsRevision < MIN_SDK_TOOLS_REVISION) { + final String message = '[' + + module.getName() + + "] Incompatible version of Android SDK Tools package. Min version is " + + MIN_SDK_TOOLS_REVISION + + ". Please, update it though SDK manager"; + context.processMessage(new CompilerMessage(BUILDER_NAME, BuildMessage.Kind.ERROR, message)); + success = false; + } + + // show error message only for first module, because all modules usualy have the same sdk specified + if (!success) { + return false; + } + } + return true; + } + private static boolean runBuildConfigGeneration(@NotNull CompileContext context, @NotNull Map moduleDataMap, @NotNull AndroidBuildConfigStateStorage storage) { @@ -276,7 +319,7 @@ public class AndroidSourceGeneratingBuilder extends ModuleLevelBuilder { continue; } - final IAndroidTarget target = moduleData.getAndroidTarget(); + final IAndroidTarget target = moduleData.getPlatform().getTarget(); try { final File[] sourceRoots = AndroidJpsUtil.getSourceRootsForModuleAndDependencies(module); @@ -353,8 +396,9 @@ public class AndroidSourceGeneratingBuilder extends ModuleLevelBuilder { continue; } - final IAndroidTarget target = moduleData.getAndroidTarget(); - final String sdkLocation = moduleData.getSdkLocation(); + final AndroidPlatform platform = moduleData.getPlatform(); + final IAndroidTarget target = platform.getTarget(); + final String sdkLocation = platform.getSdk().getSdkPath(); final String filePath = file.getPath(); File tmpOutputDirectory = null; @@ -414,7 +458,7 @@ public class AndroidSourceGeneratingBuilder extends ModuleLevelBuilder { final File generatedSourcesDir = AndroidJpsUtil.getGeneratedSourcesStorage(module); final File aptOutputDirectory = new File(generatedSourcesDir, AndroidJpsUtil.AAPT_GENERATED_SOURCE_ROOT_NAME); - final IAndroidTarget target = moduleData.getAndroidTarget(); + final IAndroidTarget target = moduleData.getPlatform().getTarget(); try { if (!needToRunAaptCompilation(facet)) { @@ -777,8 +821,6 @@ public class AndroidSourceGeneratingBuilder extends ModuleLevelBuilder { success = false; continue; } - final AndroidSdk androidSdk = platform.getSdk(); - final IAndroidTarget target = platform.getTarget(); final File manifestFile = AndroidJpsUtil.getManifestFileForCompilationPath(facet); if (manifestFile == null || !manifestFile.exists()) { @@ -796,7 +838,7 @@ public class AndroidSourceGeneratingBuilder extends ModuleLevelBuilder { continue; } - moduleDataMap.put(module, new MyModuleData(androidSdk.getSdkPath(), target, facet, manifestFile, packageName)); + moduleDataMap.put(module, new MyModuleData(platform, facet, manifestFile, packageName)); } return success ? moduleDataMap : null; @@ -883,32 +925,24 @@ public class AndroidSourceGeneratingBuilder extends ModuleLevelBuilder { } private static class MyModuleData { - private final String mySdkLocation; - private final IAndroidTarget myAndroidTarget; + private final AndroidPlatform myPlatform; private final AndroidFacet myFacet; private final File myManifestFileForCompiler; private final String myPackage; - private MyModuleData(@NotNull String sdkLocation, - @NotNull IAndroidTarget androidTarget, + private MyModuleData(@NotNull AndroidPlatform platform, @NotNull AndroidFacet facet, @NotNull File manifestFileForCompiler, @NotNull String aPackage) { - mySdkLocation = sdkLocation; - myAndroidTarget = androidTarget; + myPlatform = platform; myFacet = facet; myManifestFileForCompiler = manifestFileForCompiler; myPackage = aPackage; } @NotNull - public IAndroidTarget getAndroidTarget() { - return myAndroidTarget; - } - - @NotNull - public String getSdkLocation() { - return mySdkLocation; + public AndroidPlatform getPlatform() { + return myPlatform; } @NotNull From 7b31831db0645da2a281bc98b78a0caec77125cc Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Sat, 28 Apr 2012 16:06:49 +0400 Subject: [PATCH 16/26] android-jps: warn about app->app dependencies --- .../AndroidSourceGeneratingBuilder.java | 43 +++++++++++++++++-- 1 file changed, 39 insertions(+), 4 deletions(-) diff --git a/plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidSourceGeneratingBuilder.java b/plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidSourceGeneratingBuilder.java index 974092fc2ca5..a153b7fa1e12 100644 --- a/plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidSourceGeneratingBuilder.java +++ b/plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidSourceGeneratingBuilder.java @@ -18,6 +18,8 @@ import org.jetbrains.android.util.*; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.jps.ClasspathItem; +import org.jetbrains.jps.ClasspathKind; import org.jetbrains.jps.Module; import org.jetbrains.jps.ModuleChunk; import org.jetbrains.jps.incremental.*; @@ -81,6 +83,7 @@ public class AndroidSourceGeneratingBuilder extends ModuleLevelBuilder { if (!checkVersions(moduleDataMap, context)) { return ExitCode.ABORT; } + checkAndroidDependencies(moduleDataMap, context); final Map idlFilesToCompile = new HashMap(); final Map rsFilesToCompile = new HashMap(); @@ -170,10 +173,10 @@ public class AndroidSourceGeneratingBuilder extends ModuleLevelBuilder { final int platformToolsRevision = platform.getPlatformToolsRevision(); if (platformToolsRevision >= 0 && platformToolsRevision < MIN_PLATFORM_TOOLS_REVISION) { final String message = '[' + - module.getName() + - "] Incompatible version of Android SDK Platform-tools package. Min version is " + - MIN_PLATFORM_TOOLS_REVISION + - ". Please, update it though SDK manager"; + module.getName() + + "] Incompatible version of Android SDK Platform-tools package. Min version is " + + MIN_PLATFORM_TOOLS_REVISION + + ". Please, update it though SDK manager"; context.processMessage(new CompilerMessage(BUILDER_NAME, BuildMessage.Kind.ERROR, message)); success = false; } @@ -197,6 +200,38 @@ public class AndroidSourceGeneratingBuilder extends ModuleLevelBuilder { return true; } + private static void checkAndroidDependencies(@NotNull Map moduleDataMap, @NotNull CompileContext context) { + for (Map.Entry entry : moduleDataMap.entrySet()) { + final Module module = entry.getKey(); + final MyModuleData moduleData = entry.getValue(); + final AndroidFacet facet = moduleData.getFacet(); + + if (facet.isLibrary()) { + continue; + } + + for (ClasspathItem item : module.getClasspath(ClasspathKind.PRODUCTION_RUNTIME, false)) { + if (item instanceof Module) { + final Module depModule = (Module)item; + final AndroidFacet depFacet = AndroidJpsUtil.getFacet(depModule); + + if (depFacet != null && !depFacet.isLibrary()) { + String message = "Suspicious module dependency " + + module.getName() + + " -> " + + depModule.getName() + + ": Android application module depends on other application module. Possibly, you should "; + if (AndroidJpsUtil.isMavenizedModule(depModule)) { + message += "change packaging type of module " + depModule.getName() + " to 'apklib' in pom.xml file or "; + } + message += "change dependency scope to 'Provided'."; + context.processMessage(new CompilerMessage(BUILDER_NAME, BuildMessage.Kind.WARNING, message)); + } + } + } + } + } + private static boolean runBuildConfigGeneration(@NotNull CompileContext context, @NotNull Map moduleDataMap, @NotNull AndroidBuildConfigStateStorage storage) { From d2aef91fdac9778087e14be50f80c9f632a6f8a8 Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Sat, 28 Apr 2012 16:08:04 +0400 Subject: [PATCH 17/26] android-jps: clear res cache on rebuild --- .../jps/android/AndroidPackagingBuilder.java | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidPackagingBuilder.java b/plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidPackagingBuilder.java index 298ffaf8cb02..c0469285bb6c 100644 --- a/plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidPackagingBuilder.java +++ b/plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidPackagingBuilder.java @@ -138,8 +138,7 @@ public class AndroidPackagingBuilder extends ProjectLevelBuilder { private static boolean runPngCaching(@NotNull CompileContext context, @NotNull Module module, @NotNull AndroidFileSetStorage storage, - @Nullable AndroidFileSetState state) - throws IOException { + @Nullable AndroidFileSetState state) throws IOException { final AndroidFileSetState savedState = storage.getState(module.getName()); if (context.isMake() && savedState != null && savedState.equalsTo(state)) { return true; @@ -165,6 +164,14 @@ public class AndroidPackagingBuilder extends ProjectLevelBuilder { final File resCacheDir = AndroidJpsUtil.getResourcesCacheDir(context, module); + if (context.isProjectRebuild() && resCacheDir.exists()) { + if (!FileUtil.delete(resCacheDir)) { + context.processMessage(new CompilerMessage(BUILDER_NAME, BuildMessage.Kind.ERROR, + "Cannot delete directory " + resCacheDir.getPath())); + return false; + } + } + if (!resCacheDir.exists()) { if (!resCacheDir.mkdirs()) { context.processMessage(new CompilerMessage(BUILDER_NAME, BuildMessage.Kind.ERROR, From 83d573e09cabdee444d7d25b2286f20d1c453778 Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Sat, 28 Apr 2012 16:08:29 +0400 Subject: [PATCH 18/26] android-jps: todo --- .../org/jetbrains/android/compiler/AndroidPrecompileTask.java | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/android/src/org/jetbrains/android/compiler/AndroidPrecompileTask.java b/plugins/android/src/org/jetbrains/android/compiler/AndroidPrecompileTask.java index ad884623dbb9..e4d6b8b2295f 100644 --- a/plugins/android/src/org/jetbrains/android/compiler/AndroidPrecompileTask.java +++ b/plugins/android/src/org/jetbrains/android/compiler/AndroidPrecompileTask.java @@ -94,6 +94,7 @@ public class AndroidPrecompileTask implements CompileTask { excludeAllSourceRoots(module, configuration, addedEntries); } else { + // todo: support this by project converter to use on compile-server unexcludeAllSourceRoots(facet, configuration); } } From 7cacf55cee9fd657ea61d5b31506b7a70d908a60 Mon Sep 17 00:00:00 2001 From: anna Date: Sat, 28 Apr 2012 14:56:47 +0200 Subject: [PATCH 19/26] borders --- .../application/options/CodeStyleGenerationConfigurable.java | 2 ++ .../com/intellij/application/options/CodeStyleImportsPanel.java | 1 + .../application/options/codeStyle/CodeStyleBlankLinesPanel.java | 2 ++ 3 files changed, 5 insertions(+) diff --git a/java/java-impl/src/com/intellij/application/options/CodeStyleGenerationConfigurable.java b/java/java-impl/src/com/intellij/application/options/CodeStyleGenerationConfigurable.java index 8f1241f5603e..297f0b9f1d36 100644 --- a/java/java-impl/src/com/intellij/application/options/CodeStyleGenerationConfigurable.java +++ b/java/java-impl/src/com/intellij/application/options/CodeStyleGenerationConfigurable.java @@ -22,6 +22,7 @@ import com.intellij.openapi.options.Configurable; import com.intellij.openapi.project.Project; import com.intellij.openapi.project.ProjectManager; import com.intellij.psi.codeStyle.CodeStyleSettings; +import com.intellij.ui.IdeBorderFactory; import com.intellij.ui.ToolbarDecorator; import com.intellij.ui.components.JBList; @@ -59,6 +60,7 @@ public class CodeStyleGenerationConfigurable implements Configurable { public CodeStyleGenerationConfigurable(CodeStyleSettings settings) { mySettings = settings; myMembersOrderList = new MembersOrderList(); + myPanel.setBorder(IdeBorderFactory.createEmptyBorder(2, 2, 2, 2)); } public JComponent createComponent() { diff --git a/java/java-impl/src/com/intellij/application/options/CodeStyleImportsPanel.java b/java/java-impl/src/com/intellij/application/options/CodeStyleImportsPanel.java index 8a042c1a6ae0..7a890c7081bc 100644 --- a/java/java-impl/src/com/intellij/application/options/CodeStyleImportsPanel.java +++ b/java/java-impl/src/com/intellij/application/options/CodeStyleImportsPanel.java @@ -70,6 +70,7 @@ public class CodeStyleImportsPanel extends JPanel { public CodeStyleImportsPanel(CodeStyleSettings settings){ mySettings = settings; setLayout(new BorderLayout()); + setBorder(IdeBorderFactory.createEmptyBorder(2, 2, 2, 2)); add(myWholePanel, BorderLayout.CENTER); myGeneralPanel.add(createGeneralOptionsPanel(), BorderLayout.CENTER); diff --git a/platform/lang-impl/src/com/intellij/application/options/codeStyle/CodeStyleBlankLinesPanel.java b/platform/lang-impl/src/com/intellij/application/options/codeStyle/CodeStyleBlankLinesPanel.java index 4f22cd550ee0..624be921f472 100644 --- a/platform/lang-impl/src/com/intellij/application/options/codeStyle/CodeStyleBlankLinesPanel.java +++ b/platform/lang-impl/src/com/intellij/application/options/codeStyle/CodeStyleBlankLinesPanel.java @@ -23,6 +23,7 @@ import com.intellij.psi.codeStyle.CodeStyleSettings; import com.intellij.psi.codeStyle.CommonCodeStyleSettings; import com.intellij.psi.codeStyle.CustomCodeStyleSettings; import com.intellij.psi.codeStyle.LanguageCodeStyleSettingsProvider; +import com.intellij.ui.IdeBorderFactory; import com.intellij.ui.OptionGroup; import com.intellij.ui.ScrollPaneFactory; import com.intellij.ui.components.JBLabel; @@ -54,6 +55,7 @@ public class CodeStyleBlankLinesPanel extends MultilanguageCodeStyleAbstractPane public CodeStyleBlankLinesPanel(CodeStyleSettings settings) { super(settings); + myPanel.setBorder(IdeBorderFactory.createEmptyBorder(2, 2, 2, 2)); init(); } From d1433ca83b74f11c018b34d1479ecdd040498e06 Mon Sep 17 00:00:00 2001 From: "Maxim.Medvedev" Date: Sat, 28 Apr 2012 13:10:20 +0400 Subject: [PATCH 20/26] IDEA-81521 formatting for native list and maps inside argument list --- .../groovy/formatter/GroovyBlockGenerator.java | 6 ++++-- .../groovy/lang/formatter/FormatterTest.java | 2 ++ .../groovy/formatter/mapInArgumentList.test | 13 +++++++++++++ 3 files changed, 19 insertions(+), 2 deletions(-) create mode 100644 plugins/groovy/testdata/groovy/formatter/mapInArgumentList.test diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/formatter/GroovyBlockGenerator.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/formatter/GroovyBlockGenerator.java index b42bf1cceec7..ffdc1fcd08b8 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/formatter/GroovyBlockGenerator.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/formatter/GroovyBlockGenerator.java @@ -304,8 +304,10 @@ public class GroovyBlockGenerator implements GroovyElementTypes { // println 'xxx' // }) if (blockPsi instanceof GrArgumentList && mySettings.ALIGN_MULTILINE_PARAMETERS_IN_CALLS) { - return children.size() != 3 || children.get(0).getElementType() != mLPAREN - || children.get(1).getElementType() != CLOSABLE_BLOCK || children.get(2).getElementType() != mRPAREN; + return !(children.size() == 3 && + children.get(0).getElementType() == mLPAREN && + (children.get(1).getElementType() == CLOSABLE_BLOCK || children.get(1).getElementType() == LIST_OR_MAP) && + children.get(2).getElementType() == mRPAREN); } if (blockPsi instanceof GrAssignmentExpression && ((GrAssignmentExpression)blockPsi).getRValue() instanceof GrAssignmentExpression) { diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/formatter/FormatterTest.java b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/formatter/FormatterTest.java index 12b386232606..067ef7c2386b 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/formatter/FormatterTest.java +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/formatter/FormatterTest.java @@ -235,6 +235,8 @@ public class FormatterTest extends GroovyFormatterTestCase { public void testGeese7() {doGeeseTest();} public void testGeese8() {doGeeseTest();} + public void testMapInArgumentList() {doTest();} + private void doGeeseTest() { GroovyCodeStyleSettings customSettings = myTempSettings.getCustomSettings(GroovyCodeStyleSettings.class); boolean oldvalue = customSettings.USE_FLYING_GEESE_BRACES; diff --git a/plugins/groovy/testdata/groovy/formatter/mapInArgumentList.test b/plugins/groovy/testdata/groovy/formatter/mapInArgumentList.test new file mode 100644 index 000000000000..ea87e82c46f3 --- /dev/null +++ b/plugins/groovy/testdata/groovy/formatter/mapInArgumentList.test @@ -0,0 +1,13 @@ +test( + changesSorter: [ + (GradleMismatchedLibraryPathChange): 2, + (GradleLibraryDependencyPresenceChange): 1 + ] +) +----- +test( + changesSorter: [ + (GradleMismatchedLibraryPathChange): 2, + (GradleLibraryDependencyPresenceChange): 1 + ] +) \ No newline at end of file From 596e2376e5f3564021ed24726db12f99f772c296 Mon Sep 17 00:00:00 2001 From: "Maxim.Medvedev" Date: Sat, 28 Apr 2012 13:45:45 +0400 Subject: [PATCH 21/26] IDEA-81521 aligning arguments of native map --- .../groovy/formatter/GroovyBlockGenerator.java | 16 ++++++++++++++++ .../formatter/GroovyCodeStyleSettings.java | 1 + .../GroovyLanguageCodeStyleSettingsProvider.java | 8 +++++++- .../statements/arguments/GrNamedArgument.java | 4 ++++ .../arguments/GrNamedArgumentImpl.java | 8 ++++++++ .../groovy/lang/formatter/FormatterTest.java | 4 ++++ .../groovy/formatter/MapInArgumentList2.test | 13 +++++++++++++ 7 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 plugins/groovy/testdata/groovy/formatter/MapInArgumentList2.test diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/formatter/GroovyBlockGenerator.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/formatter/GroovyBlockGenerator.java index ffdc1fcd08b8..23992e3a8a30 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/formatter/GroovyBlockGenerator.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/formatter/GroovyBlockGenerator.java @@ -49,7 +49,9 @@ import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrLabeledStatement; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrStatement; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrVariable; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrVariableDeclaration; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments.GrArgumentLabel; import org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments.GrArgumentList; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments.GrNamedArgument; import org.jetbrains.plugins.groovy.lang.psi.api.statements.blocks.GrCodeBlock; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrAssignmentExpression; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrBinaryExpression; @@ -153,6 +155,20 @@ public class GroovyBlockGenerator implements GroovyElementTypes { return subBlocks; } + if (blockPsi instanceof GrListOrMap && ((GrListOrMap)blockPsi).isMap() && myGroovySettings.ALIGN_NAMED_ARGS_IN_MAP) { + AlignmentProvider.Aligner labels = myAlignmentProvider.createAligner(); + AlignmentProvider.Aligner exprs = myAlignmentProvider.createAligner(); + GrNamedArgument[] namedArgs = ((GrListOrMap)blockPsi).getNamedArguments(); + for (GrNamedArgument arg : namedArgs) { + GrArgumentLabel label = arg.getLabel(); + if (label != null) labels.append(label); + + PsiElement colon = arg.getColon(); + if (colon == null) colon = arg.getExpression(); + if (colon != null) exprs.append(colon); + } + } + // For Parameter lists if (isListLikeClause(blockPsi)) { final ArrayList subBlocks = new ArrayList(); diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/formatter/GroovyCodeStyleSettings.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/formatter/GroovyCodeStyleSettings.java index 2869eb12bcf2..a1b4bef01e24 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/formatter/GroovyCodeStyleSettings.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/formatter/GroovyCodeStyleSettings.java @@ -44,6 +44,7 @@ public class GroovyCodeStyleSettings extends CustomCodeStyleSettings { public boolean SPACE_IN_NAMED_ARGUMENT = true; public boolean ALIGN_MULTILINE_LIST_OR_MAP = false; public boolean SPACE_WITHIN_LIST_OR_MAP = false; + public boolean ALIGN_NAMED_ARGS_IN_MAP = false; public GroovyCodeStyleSettings(CodeStyleSettings container) { super("GroovyCodeStyleSettings", container); diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/formatter/GroovyLanguageCodeStyleSettingsProvider.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/formatter/GroovyLanguageCodeStyleSettingsProvider.java index a93b3cf1549b..e0166e4369ad 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/formatter/GroovyLanguageCodeStyleSettingsProvider.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/formatter/GroovyLanguageCodeStyleSettingsProvider.java @@ -43,8 +43,10 @@ public class GroovyLanguageCodeStyleSettingsProvider extends LanguageCodeStyleSe @NotNull SettingsType settingsType) { if (settingsType == SettingsType.WRAPPING_AND_BRACES_SETTINGS) { consumer.showAllStandardOptions(); - consumer.showCustomOption(GroovyCodeStyleSettings.class, "USE_FLYING_GEESE_BRACES", "Use flying geese braces", CodeStyleSettingsCustomizable.WRAPPING_BRACES); + consumer.showCustomOption(GroovyCodeStyleSettings.class, "USE_FLYING_GEESE_BRACES", "Use flying geese braces", + CodeStyleSettingsCustomizable.WRAPPING_BRACES); consumer.showCustomOption(GroovyCodeStyleSettings.class, "ALIGN_MULTILINE_LIST_OR_MAP", "Align when multiple", "List and map literals"); + consumer.showCustomOption(GroovyCodeStyleSettings.class, "ALIGN_NAMED_ARGS_IN_MAP", "Align named arguments", "List and map literals"); return; } if (settingsType == SettingsType.SPACING_SETTINGS) { @@ -268,6 +270,10 @@ public class GroovyLanguageCodeStyleSettingsProvider extends LanguageCodeStyleSe " label: " + " if (2 < 3) return else if (2 > 3) return else return\n" + " for (int i = 0; i < 0xFFFFFF; i += 2) System.out.println(i)\n" + + " print([\n" + + " l1: expr1,\n" + + " label2: expr2\n" + + " ])\n" + " while (x < 50000) x++\n" + " switch (a) {\n" + " case 0:\n" + diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/api/statements/arguments/GrNamedArgument.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/api/statements/arguments/GrNamedArgument.java index e7feced34096..3d5d6a1c0f63 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/api/statements/arguments/GrNamedArgument.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/api/statements/arguments/GrNamedArgument.java @@ -16,6 +16,7 @@ package org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments; +import com.intellij.psi.PsiElement; import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElement; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrExpression; @@ -34,4 +35,7 @@ public interface GrNamedArgument extends GroovyPsiElement { @Nullable String getLabelName(); + + @Nullable + PsiElement getColon(); } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/arguments/GrNamedArgumentImpl.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/arguments/GrNamedArgumentImpl.java index 5f592e5bf1a5..a118ae2af69e 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/arguments/GrNamedArgumentImpl.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/arguments/GrNamedArgumentImpl.java @@ -17,8 +17,10 @@ package org.jetbrains.plugins.groovy.lang.psi.impl.statements.arguments; import com.intellij.lang.ASTNode; +import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.plugins.groovy.lang.lexer.GroovyTokenTypes; import org.jetbrains.plugins.groovy.lang.parser.GroovyElementTypes; import org.jetbrains.plugins.groovy.lang.psi.GroovyElementVisitor; import org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments.GrArgumentLabel; @@ -59,4 +61,10 @@ public class GrNamedArgumentImpl extends GroovyPsiElementImpl implements GrNamed final GrArgumentLabel label = getLabel(); return label == null ? null : label.getName(); } + + @Nullable + @Override + public PsiElement getColon() { + return findChildByType(GroovyTokenTypes.mCOLON); + } } \ No newline at end of file diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/formatter/FormatterTest.java b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/formatter/FormatterTest.java index 067ef7c2386b..ef7b27a79f5a 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/formatter/FormatterTest.java +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/formatter/FormatterTest.java @@ -236,6 +236,10 @@ public class FormatterTest extends GroovyFormatterTestCase { public void testGeese8() {doGeeseTest();} public void testMapInArgumentList() {doTest();} + public void testMapInArgumentList2() { + myTempSettings.getCustomSettings(GroovyCodeStyleSettings.class).ALIGN_NAMED_ARGS_IN_MAP = true; + doTest(); + } private void doGeeseTest() { GroovyCodeStyleSettings customSettings = myTempSettings.getCustomSettings(GroovyCodeStyleSettings.class); diff --git a/plugins/groovy/testdata/groovy/formatter/MapInArgumentList2.test b/plugins/groovy/testdata/groovy/formatter/MapInArgumentList2.test new file mode 100644 index 000000000000..8101230b11be --- /dev/null +++ b/plugins/groovy/testdata/groovy/formatter/MapInArgumentList2.test @@ -0,0 +1,13 @@ +test( + changesSorter: [ + (GradleMismatchedLibraryPathChange): 2, + (GradleLibraryDependencyPresenceChange): 1 + ] +) +----- +test( + changesSorter: [ + (GradleMismatchedLibraryPathChange) : 2, + (GradleLibraryDependencyPresenceChange): 1 + ] +) \ No newline at end of file From 13b058e294a141dbfaff1110f689deebba8f637e Mon Sep 17 00:00:00 2001 From: "Maxim.Medvedev" Date: Sat, 28 Apr 2012 16:54:57 +0400 Subject: [PATCH 22/26] allow backward shift disabling in groovy alignment provider --- .../groovy/formatter/AlignmentProvider.java | 49 ++++++++++++------- .../plugins/groovy/formatter/GeeseUtil.java | 2 +- .../formatter/GroovyBlockGenerator.java | 22 ++++----- .../processors/GroovyIndentProcessor.java | 6 --- 4 files changed, 43 insertions(+), 36 deletions(-) diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/formatter/AlignmentProvider.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/formatter/AlignmentProvider.java index b4326d6dd936..d1df472da142 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/formatter/AlignmentProvider.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/formatter/AlignmentProvider.java @@ -35,16 +35,20 @@ class AlignmentProvider { private final Map> myTree = new HashMap>(); private final Map, Alignment> myAlignments = new HashMap, Alignment>(); + private final Map, Boolean> myAllowBackwardShift = new HashMap, Boolean>(); - public void addPair(PsiElement e1, PsiElement e2) { + public void addPair(PsiElement e1, PsiElement e2, Boolean allowBackwardShift) { LOG.assertTrue(e1 != e2); final Set set1 = myTree.get(e1); final Set set2 = myTree.get(e2); - LOG.assertTrue(set1 == null || set2 == null || !myAlignments.containsKey(set1) || !myAlignments.containsKey(set2)); - if (set1 != null && set2 != null) { + LOG.assertTrue(!myAlignments.containsKey(set1) || !myAlignments.containsKey(set2)); + LOG.assertTrue(myAllowBackwardShift.get(set1).booleanValue() == myAllowBackwardShift.get(set2).booleanValue()); + if (allowBackwardShift != null) { + LOG.assertTrue(myAllowBackwardShift.get(set1).booleanValue() == allowBackwardShift.booleanValue()); + } if (myAlignments.containsKey(set2)) { for (Iterator iterator = set1.iterator(); iterator.hasNext(); ) { PsiElement element = iterator.next(); @@ -64,15 +68,23 @@ class AlignmentProvider { } } else if (set1 != null) { + if (allowBackwardShift != null) { + LOG.assertTrue(myAllowBackwardShift.get(set1).booleanValue() == allowBackwardShift.booleanValue()); + } addInternal(set1, e2); } else if (set2 != null) { + if (allowBackwardShift != null) { + LOG.assertTrue(myAllowBackwardShift.get(set2).booleanValue() == allowBackwardShift.booleanValue()); + } addInternal(set2, e1); } else { final HashSet set = createHashSet(); addInternal(set, e1); addInternal(set, e2); + myAllowBackwardShift.put(set, allowBackwardShift); + } } @@ -92,16 +104,17 @@ class AlignmentProvider { }; } - public void addPair(ASTNode node1, ASTNode node2) { - addPair(node1.getPsi(), node2.getPsi()); + public void addPair(ASTNode node1, ASTNode node2, boolean allowBackwardShift) { + addPair(node1.getPsi(), node2.getPsi(), allowBackwardShift); } - private void add(PsiElement element) { + private void add(PsiElement element, boolean allowBackwardShift) { if (myTree.get(element) != null) return; final HashSet set = createHashSet(); set.add(element); myTree.put(element, set); + myAllowBackwardShift.put(set, allowBackwardShift); } @Nullable @@ -114,17 +127,19 @@ class AlignmentProvider { Alignment alignment = myAlignments.get(set); if (alignment != null) return alignment; - alignment = Alignment.createAlignment(true); + alignment = Alignment.createAlignment(myAllowBackwardShift.get(set)); myAlignments.put(set, alignment); return alignment; } - public Aligner createAligner(PsiElement expression) { - return new Aligner(expression); + public Aligner createAligner(PsiElement expression, boolean allowBackwardShift) { + Aligner aligner = new Aligner(allowBackwardShift); + aligner.append(expression); + return aligner; } - public Aligner createAligner() { - return new Aligner(); + public Aligner createAligner(boolean allowBackwardShift) { + return new Aligner(allowBackwardShift); } /** @@ -135,12 +150,10 @@ class AlignmentProvider { */ class Aligner { private PsiElement myRef = null; + private boolean allowBackwardShift = true; - private Aligner() { - } - - private Aligner(PsiElement initial) { - myRef = initial; + Aligner(boolean allowBackwardShift) { + this.allowBackwardShift = allowBackwardShift; } void append(@Nullable PsiElement element) { @@ -148,10 +161,10 @@ class AlignmentProvider { if (myRef == null) { myRef = element; - add(element); + add(element, allowBackwardShift); } else { - addPair(myRef, element); + addPair(myRef, element, allowBackwardShift); } } } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/formatter/GeeseUtil.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/formatter/GeeseUtil.java index cf080d546e77..30115c2fe6f2 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/formatter/GeeseUtil.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/formatter/GeeseUtil.java @@ -139,7 +139,7 @@ public class GeeseUtil { break; } } - alignments.addPair(rBrace, cur); + alignments.addPair(rBrace, cur, true); } public static boolean isClosureContainLF(PsiElement rBrace) { diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/formatter/GroovyBlockGenerator.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/formatter/GroovyBlockGenerator.java index 23992e3a8a30..80aabd5f05a9 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/formatter/GroovyBlockGenerator.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/formatter/GroovyBlockGenerator.java @@ -139,7 +139,7 @@ public class GroovyBlockGenerator implements GroovyElementTypes { if (childNode.getTextRange().getLength() > 0) { final Indent indent = GroovyIndentProcessor.getChildIndent(myBlock, childNode); if (myAlignment != null) { - myAlignmentProvider.addPair(myNode, childNode); + myAlignmentProvider.addPair(myNode, childNode, true); } subBlocks.add(new GroovyBlock(childNode, indent, myWrap, mySettings, myGroovySettings, myAlignmentProvider)); } @@ -150,14 +150,14 @@ public class GroovyBlockGenerator implements GroovyElementTypes { // chained properties, calls, indexing, etc if (NESTED.contains(myNode.getElementType()) && blockPsi.getParent() != null && !NESTED.contains(blockPsi.getParent().getNode().getElementType())) { final List subBlocks = new ArrayList(); - AlignmentProvider.Aligner dotsAligner = mySettings.ALIGN_MULTILINE_CHAINED_METHODS ? myAlignmentProvider.createAligner() : null; + AlignmentProvider.Aligner dotsAligner = mySettings.ALIGN_MULTILINE_CHAINED_METHODS ? myAlignmentProvider.createAligner(true) : null; addNestedChildren(myNode.getPsi(), subBlocks, dotsAligner, true); return subBlocks; } if (blockPsi instanceof GrListOrMap && ((GrListOrMap)blockPsi).isMap() && myGroovySettings.ALIGN_NAMED_ARGS_IN_MAP) { - AlignmentProvider.Aligner labels = myAlignmentProvider.createAligner(); - AlignmentProvider.Aligner exprs = myAlignmentProvider.createAligner(); + AlignmentProvider.Aligner labels = myAlignmentProvider.createAligner(false); + AlignmentProvider.Aligner exprs = myAlignmentProvider.createAligner(true); GrNamedArgument[] namedArgs = ((GrListOrMap)blockPsi).getNamedArguments(); for (GrNamedArgument arg : namedArgs) { GrArgumentLabel label = arg.getLabel(); @@ -175,7 +175,7 @@ public class GroovyBlockGenerator implements GroovyElementTypes { List astNodes = visibleChildren(myNode); if (mustAlign(blockPsi, astNodes)) { - final AlignmentProvider.Aligner aligner = myAlignmentProvider.createAligner(); + final AlignmentProvider.Aligner aligner = myAlignmentProvider.createAligner(false); for (ASTNode node : astNodes) { if (!isKeyword(node)) aligner.append(node.getPsi()); } @@ -194,7 +194,7 @@ public class GroovyBlockGenerator implements GroovyElementTypes { final ArrayList subBlocks = new ArrayList(); if (classLevel && myAlignment != null) { - final AlignmentProvider.Aligner aligner = myAlignmentProvider.createAligner(); + final AlignmentProvider.Aligner aligner = myAlignmentProvider.createAligner(true); for (ASTNode child : children) { aligner.append(child.getPsi()); } @@ -228,7 +228,7 @@ public class GroovyBlockGenerator implements GroovyElementTypes { else { currentGroup = new ArrayList(); for (LeafPsiElement expression : table) { - currentGroup.add(myAlignmentProvider.createAligner(expression)); + currentGroup.add(myAlignmentProvider.createAligner(expression, true)); } } } @@ -244,9 +244,9 @@ public class GroovyBlockGenerator implements GroovyElementTypes { if (variables.length > 0) { if (!classLevel || currentGroup == null || fieldGroupEnded(psi)) { currentGroup = new ArrayList(); - currentGroup.add(myAlignmentProvider.createAligner()); - currentGroup.add(myAlignmentProvider.createAligner()); - currentGroup.add(myAlignmentProvider.createAligner()); + currentGroup.add(myAlignmentProvider.createAligner(true)); + currentGroup.add(myAlignmentProvider.createAligner(true)); + currentGroup.add(myAlignmentProvider.createAligner(true)); } AlignmentProvider.Aligner varName = currentGroup.get(1); @@ -444,7 +444,7 @@ public class GroovyBlockGenerator implements GroovyElementTypes { private List generateForBinaryExpr() { final ArrayList subBlocks = new ArrayList(); AlignmentProvider.Aligner - alignment = mySettings.ALIGN_MULTILINE_BINARY_OPERATION ? myAlignmentProvider.createAligner() : null; + alignment = mySettings.ALIGN_MULTILINE_BINARY_OPERATION ? myAlignmentProvider.createAligner(true) : null; GrBinaryExpression binary = (GrBinaryExpression)myNode.getPsi(); LOG.assertTrue(binary != null); diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/formatter/processors/GroovyIndentProcessor.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/formatter/processors/GroovyIndentProcessor.java index a2d41525e024..aea939055570 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/formatter/processors/GroovyIndentProcessor.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/formatter/processors/GroovyIndentProcessor.java @@ -138,12 +138,6 @@ public abstract class GroovyIndentProcessor implements GroovyElementTypes { } } - if (psiParent instanceof GrListOrMap) { - if (child.getElementType() != mLBRACK && child.getElementType() != mRBRACK /*&& child.getElementType() != mCOMMA*/) { - return Indent.getContinuationWithoutFirstIndent(); - } - } - if ((psiParent instanceof GrDocComment && child.getElementType() != mGDOC_COMMENT_START) || psiParent instanceof GrDocTag && From d6f9757924182f1ff9aee19002165403ade879d8 Mon Sep 17 00:00:00 2001 From: Dmitry Boulytchev Date: Sat, 28 Apr 2012 17:12:17 +0400 Subject: [PATCH 23/26] Optimization on fix of bug on covariant method addition (compile server). --- .../ether/dependencyView/Mappings.java | 25 ++++++------------- 1 file changed, 7 insertions(+), 18 deletions(-) diff --git a/jps/model/src/org/jetbrains/ether/dependencyView/Mappings.java b/jps/model/src/org/jetbrains/ether/dependencyView/Mappings.java index 2cbd433db166..36cab34b1830 100644 --- a/jps/model/src/org/jetbrains/ether/dependencyView/Mappings.java +++ b/jps/model/src/org/jetbrains/ether/dependencyView/Mappings.java @@ -1069,23 +1069,12 @@ public class Mappings { if (overrides.satisfy(mm) && inheritorOf.isValue() && inheritorOf.value()) { debug("Current method overrides that found"); - final Option subtypeOf = u.isSubtypeOf(mm.type, m.type); + final int file = myClassToSourceFile.get(cc.name); - if (Difference.weakerAccess(mm.access, m.access) || - ((m.access & Opcodes.ACC_STATIC) > 0 && (mm.access & Opcodes.ACC_STATIC) == 0) || - ((m.access & Opcodes.ACC_STATIC) == 0 && (mm.access & Opcodes.ACC_STATIC) > 0) || - ((m.access & Opcodes.ACC_FINAL) > 0) || - !m.exceptions.equals(mm.exceptions) || - (subtypeOf.isValue() && subtypeOf.value()) || - (subtypeOf.isNone() || !subtypeOf.value()) || - !empty(mm.signature) || !empty(m.signature)) { - final int file = myClassToSourceFile.get(cc.name); - - if (file > 0) { - final String f = myContext.getValue(file); - debug("Complex condition is satisfied, affecting file ", f); - affectedFiles.add(new File(f)); - } + if (file > 0) { + final String f = myContext.getValue(file); + debug("Affecting file ", f); + affectedFiles.add(new File(f)); } } else { @@ -2052,7 +2041,7 @@ public class Mappings { myDebugS.debug(comment, s); } - public void toStream (final PrintStream stream) { + public void toStream(final PrintStream stream) { final Streamable[] data = { myClassToSubclasses, myClassToClassDependency, @@ -2071,7 +2060,7 @@ public class Mappings { "ClassToSourceFile" }; - for (int i = 0; i Date: Sat, 28 Apr 2012 17:09:16 +0400 Subject: [PATCH 24/26] GitFileUtils#add use Set instead of List for faster contains() check. [reviewed by irengrig] --- plugins/git4idea/src/git4idea/util/GitFileUtils.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/plugins/git4idea/src/git4idea/util/GitFileUtils.java b/plugins/git4idea/src/git4idea/util/GitFileUtils.java index 4a89f87c4daa..63f040651847 100644 --- a/plugins/git4idea/src/git4idea/util/GitFileUtils.java +++ b/plugins/git4idea/src/git4idea/util/GitFileUtils.java @@ -30,10 +30,7 @@ import git4idea.repo.GitRepository; import git4idea.repo.GitRepositoryManager; import org.jetbrains.annotations.NotNull; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; +import java.util.*; /** * File utilities for the git @@ -179,7 +176,7 @@ public class GitFileUtils { String output = handler.run(); List nonIgnoredFiles = new ArrayList(paths.size()); - List ignoredPaths = Arrays.asList(StringUtil.splitByLines(output)); + Set ignoredPaths = new HashSet(Arrays.asList(StringUtil.splitByLines(output))); for (String pathToCheck : paths) { if (!ignoredPaths.contains(pathToCheck)) { nonIgnoredFiles.add(pathToCheck); From 72a59fcc1e797492de1c1cdef00d043f0a51b219 Mon Sep 17 00:00:00 2001 From: Kirill Likhodedov Date: Sat, 28 Apr 2012 17:14:15 +0400 Subject: [PATCH 25/26] IDEA-85310 GitHttpAdapter: remove "throw" occasionally left while debugging. [reviewed by irengrig] --- plugins/git4idea/src/git4idea/jgit/GitHttpAdapter.java | 1 - 1 file changed, 1 deletion(-) diff --git a/plugins/git4idea/src/git4idea/jgit/GitHttpAdapter.java b/plugins/git4idea/src/git4idea/jgit/GitHttpAdapter.java index 4f6e81012d7a..325fdb5f98e3 100644 --- a/plugins/git4idea/src/git4idea/jgit/GitHttpAdapter.java +++ b/plugins/git4idea/src/git4idea/jgit/GitHttpAdapter.java @@ -312,7 +312,6 @@ public final class GitHttpAdapter { i--; command.cleanup(); } - throw e; } catch (JGitInternalException e) { if (authError(e)) { From 8b57bde812646ca92e752c290c364448c61b1e06 Mon Sep 17 00:00:00 2001 From: Kirill Likhodedov Date: Sat, 28 Apr 2012 17:14:46 +0400 Subject: [PATCH 26/26] introduce constant, add javadoc --- .../src/git4idea/history/browser/CherryPicker.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/plugins/git4idea/src/git4idea/history/browser/CherryPicker.java b/plugins/git4idea/src/git4idea/history/browser/CherryPicker.java index 6afe63a51788..13491fd91270 100644 --- a/plugins/git4idea/src/git4idea/history/browser/CherryPicker.java +++ b/plugins/git4idea/src/git4idea/history/browser/CherryPicker.java @@ -60,6 +60,12 @@ import static git4idea.commands.GitSimpleEventDetector.Event.LOCAL_CHANGES_OVERW public class CherryPicker { + /** + * Name of the {@code .git/CHERRY_PICK_HEAD} file which is stored under {@code .git} when cherry-pick is in progress, + * and contains the hash of the commit being cherry-picked. + */ + private static final String CHERRY_PICK_HEAD_FILE = "CHERRY_PICK_HEAD"; + private static final Logger LOG = Logger.getInstance(CherryPicker.class); @NotNull private final Project myProject; @@ -255,7 +261,7 @@ public class CherryPicker { } private void removeCherryPickHead(@NotNull GitRepository repository) { - File cherryPickHeadFile = new File(repository.getGitDir().getPath(), "CHERRY_PICK_HEAD"); + File cherryPickHeadFile = new File(repository.getGitDir().getPath(), CHERRY_PICK_HEAD_FILE); final VirtualFile cherryPickHead = myPlatformFacade.getLocalFileSystem().refreshAndFindFileByIoFile(cherryPickHeadFile); if (cherryPickHead != null && cherryPickHead.exists()) {