1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.maven.scm.provider.hg;
20
21 import java.io.File;
22
23 import org.apache.maven.scm.ScmException;
24 import org.apache.maven.scm.ScmFileStatus;
25 import org.apache.maven.scm.provider.hg.command.HgCommandConstants;
26 import org.apache.maven.scm.provider.hg.command.HgConsumer;
27 import org.codehaus.plexus.util.cli.Commandline;
28
29
30
31
32
33
34
35 public class HgConfig {
36
37 private static final String HG_REQ = "0.9.2";
38
39
40 private static final String HG_VERSION_TAG = "Mercurial Distributed SCM (version ";
41
42
43 private static final String HG_INSTALL_URL = "'http://www.selenic.com/mercurial/wiki/index.cgi/Download'";
44
45
46 private HgVersionConsumer hgVersion = new HgVersionConsumer(null);
47
48 HgConfig(File workingDir) {
49 try {
50 hgVersion = getHgVersion(workingDir);
51 } catch (ScmException e) {
52
53
54 }
55 }
56
57
58
59
60 private boolean isInstalled() {
61 return hgVersion.isVersionOk(HG_REQ);
62 }
63
64
65
66
67 private boolean isComplete() {
68 return isInstalled();
69 }
70
71
72 public static HgVersionConsumer getHgVersion(File workingDir) throws ScmException {
73 String[] versionCmd = new String[] {HgCommandConstants.VERSION};
74 HgVersionConsumer consumer = new HgVersionConsumer(HG_VERSION_TAG);
75 Commandline cmd = HgUtils.buildCmd(workingDir, versionCmd);
76
77
78 HgUtils.executeCmd(consumer, cmd);
79
80
81 return consumer;
82 }
83
84
85
86
87
88
89
90
91
92 private static boolean compareVersion(String version1, String version2) {
93 int l1, l2;
94 String v1, v2;
95
96 v1 = version1;
97 v2 = version2;
98 l1 = version1.length();
99 l2 = version2.length();
100
101 if (l1 > l2) {
102 for (int x = l2; x >= l1; x--) {
103 v2 += ' ';
104 }
105 }
106 if (l2 > l1) {
107 for (int x = l1; x <= l2; x++) {
108 v1 += ' ';
109 }
110 }
111
112 return v2.compareTo(v1) >= 0;
113 }
114
115
116
117
118
119
120 private static class HgVersionConsumer extends HgConsumer {
121
122 private String versionStr = "NA";
123
124 private String versionTag;
125
126 HgVersionConsumer(String versionTag) {
127 this.versionTag = versionTag;
128 }
129
130 public void doConsume(ScmFileStatus status, String line) {
131 if (line.startsWith(versionTag)) {
132 String[] elements = line.split(" ");
133 versionStr = elements[elements.length - 1].split("\\)")[0];
134 }
135 }
136
137 String getVersion() {
138 return versionStr;
139 }
140
141 boolean isVersionOk(String version) {
142
143
144 return compareVersion(version, versionStr);
145 }
146 }
147
148 private String getInstalledStr() {
149 if (isComplete()) {
150 return "valid and complete.";
151 }
152 return (isInstalled() ? "incomplete. " : "invalid. ") + "Consult " + HG_INSTALL_URL;
153 }
154
155 public String toString(File workingDir) {
156 boolean hgOk = hgVersion.isVersionOk(HG_REQ);
157 return "\n Your Hg installation seems to be " + getInstalledStr() + "\n Hg version: "
158 + hgVersion.getVersion() + (hgOk ? " (OK)" : " (May be INVALID)") + "\n";
159 }
160 }