From 030279297c4aba201f34cd84a6f1073b378bfbc9 Mon Sep 17 00:00:00 2001 From: Kirill Likhodedov Date: Fri, 30 Mar 2012 14:40:17 +0400 Subject: [PATCH] IDEA-83755 GitCommand locking made modifiable Some commands don't need write locks in certain cases: for example, git stash list. For them let create an instance of GitCommand with read lock instead of write lock. Apply this locking policy to 'git stash list' and 'git checkout -b ' --- .../src/git4idea/commands/GitCommand.java | 17 +++++++++++++++++ .../git4idea/src/git4idea/commands/GitImpl.java | 2 +- .../src/git4idea/history/GitHistoryUtils.java | 4 ++-- .../src/git4idea/stash/GitStashUtils.java | 2 +- 4 files changed, 21 insertions(+), 4 deletions(-) diff --git a/plugins/git4idea/src/git4idea/commands/GitCommand.java b/plugins/git4idea/src/git4idea/commands/GitCommand.java index 26cd4da68ab2..302caeccc76b 100644 --- a/plugins/git4idea/src/git4idea/commands/GitCommand.java +++ b/plugins/git4idea/src/git4idea/commands/GitCommand.java @@ -89,6 +89,18 @@ public class GitCommand { @NotNull @NonNls private final String myName; // command name passed to git @NotNull private final LockingPolicy myLocking; // Locking policy for the command + /** + * Creates a git command with LockingPolicy different from the default one. + * Use this constructor with care: specifying read-policy on a write operation may result in a conflict during simultaneous + * modification of index. + * @param command Original command. + * @param lockingPolicy Locking policy overriding default locking policy of the original command. + */ + private GitCommand(@NotNull GitCommand command, @NotNull LockingPolicy lockingPolicy) { + myName = command.name(); + myLocking = lockingPolicy; + } + private GitCommand(@NonNls @NotNull String name, @NotNull LockingPolicy locking) { myLocking = locking; myName = name; @@ -119,4 +131,9 @@ public class GitCommand { return myLocking; } + @NotNull + public GitCommand readLockingCommand() { + return new GitCommand(this, LockingPolicy.READ); + } + } diff --git a/plugins/git4idea/src/git4idea/commands/GitImpl.java b/plugins/git4idea/src/git4idea/commands/GitImpl.java index f610113b1cbe..c70436c9f58f 100644 --- a/plugins/git4idea/src/git4idea/commands/GitImpl.java +++ b/plugins/git4idea/src/git4idea/commands/GitImpl.java @@ -182,7 +182,7 @@ public class GitImpl implements Git { @Override public GitCommandResult checkoutNewBranch(@NotNull GitRepository repository, @NotNull String branchName, @Nullable GitLineHandlerListener listener) { - final GitLineHandler h = new GitLineHandler(repository.getProject(), repository.getRoot(), GitCommand.CHECKOUT); + final GitLineHandler h = new GitLineHandler(repository.getProject(), repository.getRoot(), GitCommand.CHECKOUT.readLockingCommand()); h.setSilent(false); h.addParameters("-b"); h.addParameters(branchName); diff --git a/plugins/git4idea/src/git4idea/history/GitHistoryUtils.java b/plugins/git4idea/src/git4idea/history/GitHistoryUtils.java index 3c79476025e1..49003575ee9a 100644 --- a/plugins/git4idea/src/git4idea/history/GitHistoryUtils.java +++ b/plugins/git4idea/src/git4idea/history/GitHistoryUtils.java @@ -728,7 +728,7 @@ public class GitHistoryUtils { @Nullable public static Pair getStashTop(@NotNull Project project, @NotNull VirtualFile root) throws VcsException { - GitSimpleHandler h = new GitSimpleHandler(project, root, GitCommand.STASH); + GitSimpleHandler h = new GitSimpleHandler(project, root, GitCommand.STASH.readLockingCommand()); GitLogParser parser = new GitLogParser(project, SHORT_HASH, SHORT_PARENTS); h.setSilent(true); h.setNoSSH(true); @@ -776,7 +776,7 @@ public class GitHistoryUtils { @Nullable public static List> loadStashStackAsCommits(@NotNull Project project, @NotNull VirtualFile root, SymbolicRefsI refs, final String... parameters) throws VcsException { - GitSimpleHandler h = new GitSimpleHandler(project, root, GitCommand.STASH); + GitSimpleHandler h = new GitSimpleHandler(project, root, GitCommand.STASH.readLockingCommand()); GitLogParser parser = new GitLogParser(project, GitLogParser.NameStatus.STATUS, SHORT_HASH, HASH, COMMIT_TIME, AUTHOR_NAME, AUTHOR_TIME, AUTHOR_EMAIL, COMMITTER_NAME, COMMITTER_EMAIL, SHORT_PARENTS, REF_NAMES, SHORT_REF_LOG_SELECTOR, SUBJECT, BODY, RAW_BODY); h.setSilent(true); diff --git a/plugins/git4idea/src/git4idea/stash/GitStashUtils.java b/plugins/git4idea/src/git4idea/stash/GitStashUtils.java index b952f3455b85..a36a87ec0576 100644 --- a/plugins/git4idea/src/git4idea/stash/GitStashUtils.java +++ b/plugins/git4idea/src/git4idea/stash/GitStashUtils.java @@ -64,7 +64,7 @@ public class GitStashUtils { public static void loadStashStack(@NotNull Project project, @NotNull VirtualFile root, final Charset charset, final Consumer consumer) { - GitSimpleHandler h = new GitSimpleHandler(project, root, GitCommand.STASH); + GitSimpleHandler h = new GitSimpleHandler(project, root, GitCommand.STASH.readLockingCommand()); h.setSilent(true); h.setNoSSH(true); h.addParameters("list");