b5847aca665256dd23185ce51776dcfc165e2277
[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 com.intellij.vcsUtil.VcsUtil;
25 import org.jetbrains.annotations.NotNull;
26 import org.zmlx.hg4idea.HgFile;
27 import org.zmlx.hg4idea.HgRevisionNumber;
28 import org.zmlx.hg4idea.HgVcsMessages;
29 import org.zmlx.hg4idea.command.HgResolveCommand;
30 import org.zmlx.hg4idea.command.HgRevertCommand;
31 import org.zmlx.hg4idea.command.HgWorkingCopyRevisionsCommand;
32
33 import java.util.LinkedList;
34 import java.util.List;
35
36 public class HgRollbackEnvironment implements RollbackEnvironment {
37
38   private final Project project;
39
40   public HgRollbackEnvironment(Project project) {
41     this.project = project;
42   }
43
44   public String getRollbackOperationName() {
45     return HgVcsMessages.message("hg4idea.revert");
46   }
47
48   public void rollbackChanges(List<Change> changes, List<VcsException> vcsExceptions,
49     @NotNull RollbackProgressListener listener) {
50     if (changes == null || changes.isEmpty()) {
51       return;
52     }
53     List<FilePath> filePaths = new LinkedList<FilePath>();
54     for (Change change : changes) {
55       ContentRevision contentRevision;
56       if (Change.Type.DELETED == change.getType()) {
57         contentRevision = change.getBeforeRevision();
58       } else {
59         contentRevision = change.getAfterRevision();
60       }
61       if (contentRevision != null) {
62         filePaths.add(contentRevision.getFile());
63       }
64     }
65     revert(filePaths);
66   }
67
68   public void rollbackMissingFileDeletion(List<FilePath> files,
69     List<VcsException> exceptions, RollbackProgressListener listener) {
70     revert(files);
71   }
72
73   public void rollbackModifiedWithoutCheckout(List<VirtualFile> files,
74     List<VcsException> exceptions, RollbackProgressListener listener) {
75   }
76
77   public List<VcsException> rollbackMissingFileDeletion(List<FilePath> files) {
78     if (files == null || files.isEmpty()) {
79       return null;
80     }
81     revert(files);
82     return null;
83   }
84
85   public void rollbackIfUnchanged(VirtualFile file) {
86   }
87
88   private void revert(List<FilePath> filePaths) {
89     VcsDirtyScopeManager dirtyScopeManager = VcsDirtyScopeManager.getInstance(project);
90
91     HgWorkingCopyRevisionsCommand identifyCommand = new HgWorkingCopyRevisionsCommand(project);
92     HgRevertCommand revertCommand = new HgRevertCommand(project);
93     HgResolveCommand resolveCommand = new HgResolveCommand(project);
94
95     for (FilePath filePath : filePaths) {
96       VirtualFile vcsRoot = VcsUtil.getVcsRootFor(project, filePath);
97       if (vcsRoot == null) {
98         continue;
99       }
100
101       HgFile hgFile = new HgFile(vcsRoot, filePath);
102
103       HgRevisionNumber revisionNumber = identifyCommand.firstParent(vcsRoot);
104       revertCommand.execute(hgFile, revisionNumber, false);
105       resolveCommand.markResolved(vcsRoot, filePath);
106
107       dirtyScopeManager.dirDirtyRecursively(filePath.getParentPath());
108     }
109   }
110
111 }