Merge fixes of some exceptions made for 121.
[idea/community.git] / plugins / hg4idea / src / org / zmlx / hg4idea / HgRevisionNumber.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;
14
15 import com.google.common.base.Objects;
16 import com.intellij.openapi.vcs.history.VcsRevisionNumber;
17
18 import java.util.Collections;
19 import java.util.List;
20
21 public class HgRevisionNumber implements VcsRevisionNumber {
22
23   private final String revision;
24   private final String changeset;
25   private final String commitMessage;
26   private final String author;
27   private final List<HgRevisionNumber> parents;
28
29   private final boolean isWorkingVersion;
30
31   // this is needed in place of VcsRevisionNumber.NULL, because sometimes we need to return HgRevisionNumber.
32   public static final HgRevisionNumber NULL_REVISION_NUMBER = new HgRevisionNumber("", "", "", "", Collections.<HgRevisionNumber>emptyList()) {
33     @Override
34     public int compareTo(VcsRevisionNumber o) {
35       return NULL.compareTo(o);
36     }
37
38     @Override
39     public String asString() {
40       return NULL.asString();
41     }
42   };
43
44   public static HgRevisionNumber getInstance(String revision, String changeset, String author, String commitMessage) {
45     return new HgRevisionNumber(revision, changeset, author, commitMessage, Collections.<HgRevisionNumber>emptyList());
46   }
47
48   public static HgRevisionNumber getInstance(String revision, String changeset) {
49     return new HgRevisionNumber(revision, changeset, "", "", Collections.<HgRevisionNumber>emptyList());
50   }
51   
52   public static HgRevisionNumber getInstance(String revision, String changeset, List<HgRevisionNumber> parents) {
53     return new HgRevisionNumber(revision, changeset, "", "", parents);
54   }
55
56   public static HgRevisionNumber getLocalInstance(String revision) {
57     return new HgRevisionNumber(revision, "", "", "", Collections.<HgRevisionNumber>emptyList());
58   }
59
60   private HgRevisionNumber(String revision, String changeset, String author, String commitMessage, List<HgRevisionNumber> parents) {
61     this.commitMessage = commitMessage;
62     this.author = author;
63     this.parents = parents;
64     this.revision = revision.trim();
65     this.changeset = changeset.trim();
66     isWorkingVersion = changeset.endsWith("+");
67   }
68
69   public String getChangeset() {
70     return changeset;
71   }
72
73   public String getRevision() {
74     return revision;
75   }
76
77   public long getRevisionAsLong() {
78     return java.lang.Long.parseLong(revision);
79   }
80
81   public String getCommitMessage() {
82     return commitMessage;
83   }
84
85   public String getAuthor() {
86     return author;
87   }
88
89   public boolean isWorkingVersion() {
90     return isWorkingVersion;
91   }
92
93   public String asString() {
94     return revision + ":" + changeset;
95   }
96
97   public List<HgRevisionNumber> getParents() {
98     return parents;
99   }
100
101   public int compareTo(VcsRevisionNumber o) {
102     // boundary cases
103     if (this == o) {
104       return 0;
105     }
106     if (!(o instanceof HgRevisionNumber)) {
107       return -1;
108     }
109     final HgRevisionNumber other = (HgRevisionNumber) o;
110     if (changeset.equals(other.changeset)) {
111       return 0;
112     }
113
114     // One of the revisions is local. Local is "greater" than any from the history.
115     if (changeset.isEmpty()) {
116       return 1;
117     }
118     if (other.changeset.isEmpty()) {
119       return -1;
120     }
121
122     // compare revision numbers.
123     final int revCompare = java.lang.Long.valueOf(getRevisionNumber()).compareTo(java.lang.Long.valueOf(other.getRevisionNumber()));
124     if (revCompare != 0) {
125       return revCompare;
126     }
127     // If they are equal, the working revision is greater.
128     if (isWorkingVersion) {
129       return other.isWorkingVersion ? 0 : 1;
130     } else {
131       return other.isWorkingVersion ? -1 : 0;
132     }
133   }
134
135   /**
136    * Returns the numeric part of the revision, i. e. the revision without trailing '+' if one exists. 
137    */
138   public String getRevisionNumber() {
139     if (isWorkingVersion) {
140       return revision.substring(0, revision.length()-1);
141     }
142     return revision;
143   }
144
145   @Override
146   public int hashCode() {
147     return Objects.hashCode(revision, changeset);
148   }
149
150   @Override
151   public boolean equals(Object object) {
152     if (object == this) {
153       return true;
154     }
155     if (!(object instanceof HgRevisionNumber)) {
156       return false;
157     }
158     HgRevisionNumber that = (HgRevisionNumber) object;
159     return compareTo(that) == 0;
160   }
161
162   @Override
163   public String toString() {
164     return asString();
165   }
166 }