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 }