fix SafeDeleteTest
[idea/community.git] / plugins / hg4idea / src / org / zmlx / hg4idea / command / HgStatusCommand.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.command;
14
15 import com.intellij.openapi.diagnostic.Logger;
16 import com.intellij.openapi.project.Project;
17 import com.intellij.openapi.vfs.VirtualFile;
18 import org.apache.commons.lang.StringUtils;
19 import org.jetbrains.annotations.NotNull;
20 import org.jetbrains.annotations.Nullable;
21 import org.zmlx.hg4idea.HgFile;
22 import org.zmlx.hg4idea.HgRevisionNumber;
23
24 import java.io.File;
25 import java.util.*;
26
27 public class HgStatusCommand {
28
29   private static final Logger LOG = Logger.getInstance(HgStatusCommand.class.getName());
30
31   private static final int ITEM_COUNT = 3;
32   private static final int STATUS_INDEX = 0;
33
34   private final Project project;
35
36   private boolean includeAdded = true;
37   private boolean includeModified = true;
38   private boolean includeRemoved = true;
39   private boolean includeDeleted = true;
40   private boolean includeUnknown = true;
41   private boolean includeIgnored = true;
42   private boolean includeCopySource = true;
43   private HgRevisionNumber baseRevision;
44   private HgRevisionNumber targetRevision;
45
46   public HgStatusCommand(Project project) {
47     this.project = project;
48   }
49
50   public void setIncludeAdded(boolean includeAdded) {
51     this.includeAdded = includeAdded;
52   }
53
54   public void setIncludeModified(boolean includeModified) {
55     this.includeModified = includeModified;
56   }
57
58   public void setIncludeRemoved(boolean includeRemoved) {
59     this.includeRemoved = includeRemoved;
60   }
61
62   public void setIncludeDeleted(boolean includeDeleted) {
63     this.includeDeleted = includeDeleted;
64   }
65
66   public void setIncludeUnknown(boolean includeUnknown) {
67     this.includeUnknown = includeUnknown;
68   }
69
70   public void setIncludeIgnored(boolean includeIgnored) {
71     this.includeIgnored = includeIgnored;
72   }
73
74   public void setIncludeCopySource(boolean includeCopySource) {
75     this.includeCopySource = includeCopySource;
76   }
77
78   public void setBaseRevision(HgRevisionNumber base) {
79     baseRevision = base;
80   }
81
82   public void setTargetRevision(HgRevisionNumber target) {
83     targetRevision = target;
84   }
85
86   public Set<HgChange> execute(VirtualFile repo) {
87     return doExecute(repo, null);
88   }
89
90   @Nullable
91   public HgChange execute(VirtualFile repo, @NotNull String file) {
92     Set<HgChange> changes = doExecute(repo, file);
93     return changes.isEmpty() ? null : changes.iterator().next();
94   }
95
96   private Set<HgChange> doExecute(VirtualFile repo, String file) {
97     if (repo == null) {
98       return Collections.emptySet();
99     }
100
101     HgCommandService service = HgCommandService.getInstance(project);
102
103     List<String> arguments = new LinkedList<String>();
104     if (includeAdded) {
105       arguments.add("--added");
106     }
107     if (includeModified) {
108       arguments.add("--modified");
109     }
110     if (includeRemoved) {
111       arguments.add("--removed");
112     }
113     if (includeDeleted) {
114       arguments.add("--deleted");
115     }
116     if (includeUnknown) {
117       arguments.add("--unknown");
118     }
119     if (includeIgnored) {
120       arguments.add("--ignored");
121     }
122     if (includeCopySource) {
123       arguments.add("--copies");
124     }
125     if (baseRevision != null) {
126       arguments.add("--rev");
127       arguments.add(baseRevision.getChangeset());
128       if (targetRevision != null) {
129         arguments.add("--rev");
130         arguments.add(targetRevision.getChangeset());
131       }
132     }
133
134     if (file != null) {
135       arguments.add(file);
136     }
137
138     HgCommandResult result = service.execute(repo, "status", arguments);
139     Set<HgChange> changes = new HashSet<HgChange>();
140     HgChange previous = null;
141     if (result == null) {
142       return changes;
143     }
144     for (String line : result.getOutputLines()) {
145       if (StringUtils.isBlank(line) || line.length() < ITEM_COUNT) {
146         LOG.warn("Unexpected line in status '" + line + '\'');
147         continue;
148       }
149       HgFileStatusEnum status = HgFileStatusEnum.valueOf(line.charAt(STATUS_INDEX));
150       File ioFile = new File(repo.getPath(), line.substring(2));
151       if (HgFileStatusEnum.COPY == status && previous != null
152         && previous.getStatus() == HgFileStatusEnum.ADDED) {
153         previous.setStatus(HgFileStatusEnum.COPY);
154         previous.setBeforeFile(new HgFile(repo, ioFile));
155         previous = null;
156       } else {
157         previous = new HgChange(new HgFile(repo, ioFile), status);
158         changes.add(previous);
159       }
160     }
161     return changes;
162   }
163 }