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