[hg] Fixed NPE if hg exe is not configured.
[idea/community.git] / plugins / hg4idea / src / org / zmlx / hg4idea / command / HgAnnotateCommand.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.project.Project;
16 import org.zmlx.hg4idea.HgFile;
17 import org.zmlx.hg4idea.HgRevisionNumber;
18 import org.zmlx.hg4idea.execution.HgCommandResult;
19 import org.zmlx.hg4idea.execution.HgCommandExecutor;
20 import org.zmlx.hg4idea.provider.annotate.HgAnnotationLine;
21 import org.jetbrains.annotations.NotNull;
22
23 import java.util.ArrayList;
24 import java.util.Arrays;
25 import java.util.List;
26 import java.util.regex.Matcher;
27 import java.util.regex.Pattern;
28
29 public class HgAnnotateCommand {
30
31   private static final Pattern LINE_PATTERN = Pattern.compile(
32     "(.+)\\s+([0-9]+)\\s+([0-9a-f]+)\\s+([0-9]{4}-[0-9]{2}-[0-9]{2}):([0-9]+):\\s(.*)"
33   );
34
35   private static final int USER_GROUP = 1;
36   private static final int REVISION_GROUP = 2;
37   private static final int CHANGESET_GROUP = 3;
38   private static final int DATE_GROUP = 4;
39   private static final int LINE_NUMBER_GROUP = 5;
40   private static final int CONTENT_GROUP = 6;
41
42   private final Project project;
43
44   public HgAnnotateCommand(Project project) {
45     this.project = project;
46   }
47
48   public List<HgAnnotationLine> execute(@NotNull HgFile hgFile) {
49     HgCommandExecutor executor = new HgCommandExecutor(project);
50     HgCommandResult result = executor.executeInCurrentThread(hgFile.getRepo(), "annotate", Arrays.asList("-cqnudl", hgFile.getRelativePath()));
51
52     final List<HgAnnotationLine> annotations = new ArrayList<HgAnnotationLine>();
53     if (result == null) {
54       return annotations;
55     }
56
57     for (String line : result.getOutputLines()) {
58       Matcher matcher = LINE_PATTERN.matcher(line);
59       if (matcher.matches()) {
60         String user = matcher.group(USER_GROUP);
61         HgRevisionNumber revision = HgRevisionNumber.getInstance(
62           matcher.group(REVISION_GROUP),
63           matcher.group(CHANGESET_GROUP)
64         );
65         String date = matcher.group(DATE_GROUP);
66         Integer lineNumber = Integer.valueOf(matcher.group(LINE_NUMBER_GROUP));
67         String content = matcher.group(CONTENT_GROUP);
68         HgAnnotationLine annotationLine = new HgAnnotationLine(
69           user, revision, date, lineNumber, content
70         );
71         annotations.add(annotationLine);
72       }
73     }
74     return annotations;
75   }
76
77 }