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