IDEA-68731 Batch process hg revert and hg resolve. Get rid of HgFile.
[idea/community.git] / plugins / hg4idea / src / org / zmlx / hg4idea / provider / HgRollbackEnvironment.java
1 // Copyright 2008-2010 Victor Iacoban
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software distributed under
10 // the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
11 // either express or implied. See the License for the specific language governing permissions and
12 // limitations under the License.
13 package org.zmlx.hg4idea.provider;
14
15 import com.intellij.openapi.project.Project;
16 import com.intellij.openapi.vcs.FilePath;
17 import com.intellij.openapi.vcs.VcsException;
18 import com.intellij.openapi.vcs.changes.Change;
19 import com.intellij.openapi.vcs.changes.ContentRevision;
20 import com.intellij.openapi.vcs.changes.VcsDirtyScopeManager;
21 import com.intellij.openapi.vcs.rollback.RollbackEnvironment;
22 import com.intellij.openapi.vcs.rollback.RollbackProgressListener;
23 import com.intellij.openapi.vfs.VirtualFile;
24 import org.jetbrains.annotations.NotNull;
25 import org.zmlx.hg4idea.HgRevisionNumber;
26 import org.zmlx.hg4idea.HgVcsMessages;
27 import org.zmlx.hg4idea.command.HgResolveCommand;
28 import org.zmlx.hg4idea.command.HgRevertCommand;
29 import org.zmlx.hg4idea.command.HgWorkingCopyRevisionsCommand;
30 import org.zmlx.hg4idea.util.HgUtil;
31
32 import java.util.Collection;
33 import java.util.LinkedList;
34 import java.util.List;
35 import java.util.Map;
36
37 public class HgRollbackEnvironment implements RollbackEnvironment {
38
39   private final Project project;
40
41   public HgRollbackEnvironment(Project project) {
42     this.project = project;
43   }
44
45   public String getRollbackOperationName() {
46     return HgVcsMessages.message("hg4idea.revert");
47   }
48
49   public void rollbackChanges(List<Change> changes, List<VcsException> vcsExceptions,
50     @NotNull RollbackProgressListener listener) {
51     if (changes == null || changes.isEmpty()) {
52       return;
53     }
54     List<FilePath> filePaths = new LinkedList<FilePath>();
55     for (Change change : changes) {
56       ContentRevision contentRevision;
57       if (Change.Type.DELETED == change.getType()) {
58         contentRevision = change.getBeforeRevision();
59       } else {
60         contentRevision = change.getAfterRevision();
61       }
62       if (contentRevision != null) {
63         filePaths.add(contentRevision.getFile());
64       }
65     }
66     revert(filePaths);
67   }
68
69   public void rollbackMissingFileDeletion(List<FilePath> files,
70     List<VcsException> exceptions, RollbackProgressListener listener) {
71     revert(files);
72   }
73
74   public void rollbackModifiedWithoutCheckout(List<VirtualFile> files,
75     List<VcsException> exceptions, RollbackProgressListener listener) {
76   }
77
78   public List<VcsException> rollbackMissingFileDeletion(List<FilePath> files) {
79     if (files == null || files.isEmpty()) {
80       return null;
81     }
82     revert(files);
83     return null;
84   }
85
86   public void rollbackIfUnchanged(VirtualFile file) {
87   }
88
89   private void revert(List<FilePath> filePaths) {
90     VcsDirtyScopeManager dirtyScopeManager = VcsDirtyScopeManager.getInstance(project);
91
92     HgWorkingCopyRevisionsCommand identifyCommand = new HgWorkingCopyRevisionsCommand(project);
93     HgRevertCommand revertCommand = new HgRevertCommand(project);
94     HgResolveCommand resolveCommand = new HgResolveCommand(project);
95
96     for (Map.Entry<VirtualFile,Collection<FilePath>> entry : HgUtil.groupFilePathsByHgRoots(project, filePaths).entrySet()) {
97       final VirtualFile repo = entry.getKey();
98       final Collection<FilePath> files = entry.getValue();
99
100       HgRevisionNumber revisionNumber = identifyCommand.firstParent(repo);
101       revertCommand.execute(repo, files, revisionNumber, false);
102       resolveCommand.markResolved(repo, files);
103     }
104   }
105
106 }