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");