[Mercurial] Possible NPE, code style.
[idea/community.git] / plugins / hg4idea / src / org / zmlx / hg4idea / command / HgCatCommand.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.apache.commons.lang.StringUtils;
17 import org.zmlx.hg4idea.HgFile;
18 import org.zmlx.hg4idea.HgRevisionNumber;
19
20 import java.nio.charset.Charset;
21 import java.util.Collections;
22 import java.util.LinkedList;
23 import java.util.List;
24
25 public class HgCatCommand {
26
27   private final Project myProject;
28
29   public HgCatCommand(Project project) {
30     myProject = project;
31   }
32
33   public String execute(HgFile hgFile, HgRevisionNumber vcsRevisionNumber, Charset charset) {
34     final List<String> arguments = createArguments(vcsRevisionNumber, hgFile.getRelativePath());
35     final HgCommandService service = HgCommandService.getInstance(myProject);
36     final HgCommandResult result = service.execute(hgFile.getRepo(), Collections.<String>emptyList(), "cat", arguments, charset);
37
38     if (result == null) { // in case of error
39       return "";
40     }
41     if (result.getExitValue() == 1) { // file not found in given revision
42       return getContentFollowingRenames(hgFile, vcsRevisionNumber, charset, service);
43     }
44     return result.getRawOutput();
45   }
46
47   private String getContentFollowingRenames(HgFile hgFile, HgRevisionNumber vcsRevisionNumber, Charset charset, HgCommandService service) {
48     final String renamedHgFile = new HgTrackFileNamesAccrossRevisionsCommand(myProject)
49       .execute(hgFile, getCurrentRevision(hgFile), vcsRevisionNumber.getRevision(), -1);
50     if (renamedHgFile != null) {
51       final HgCommandResult result = service.execute(hgFile.getRepo(), Collections.<String>emptyList(), "cat",
52                                                      createArguments(vcsRevisionNumber, renamedHgFile), charset);
53       return result != null ? result.getRawOutput() : "";
54     }
55     return "";
56   }
57
58   private String getCurrentRevision(HgFile hgFile) {
59     HgParentsCommand parentsCommand = new HgParentsCommand(myProject);
60     List<HgRevisionNumber> parents = parentsCommand.execute(hgFile.getRepo());
61
62     String currentRevision = "0";
63
64     if (parents.size() == 1) {
65       currentRevision = parents.get(0).getRevision();
66     } else if (parents.size() > 1) {
67       long maxParentNumber = Long.MIN_VALUE;
68
69       for (HgRevisionNumber revisionNumber : parents) {
70         long revisionAsLong = revisionNumber.getRevisionAsLong();
71
72         if (revisionAsLong > maxParentNumber) {
73           maxParentNumber = revisionAsLong;
74           currentRevision = revisionNumber.getRevision();
75         }
76       }
77     }
78
79     return currentRevision;
80   }
81
82   private static List<String> createArguments(HgRevisionNumber vcsRevisionNumber, String fileName) {
83     final List<String> arguments = new LinkedList<String>();
84     if (vcsRevisionNumber != null) {
85       arguments.add("--rev");
86       if (StringUtils.isNotBlank(vcsRevisionNumber.getChangeset())) {
87         arguments.add(vcsRevisionNumber.getChangeset());
88       } else {
89         arguments.add(vcsRevisionNumber.getRevision());
90       }
91     }
92     arguments.add(fileName);
93     return arguments;
94   }
95
96 }