blob: 8ed87a34ecff55c61039ac980e524b28146dbf6c [file] [log] [blame]
package org.apache.maven.scm.provider.hg;
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import org.apache.maven.scm.ScmException;
import org.apache.maven.scm.ScmFileStatus;
import org.apache.maven.scm.log.DefaultLog;
import org.apache.maven.scm.provider.hg.command.HgCommandConstants;
import org.apache.maven.scm.provider.hg.command.HgConsumer;
import org.codehaus.plexus.util.cli.Commandline;
import java.io.File;
/**
* Check hg installation.
*
* @author <a href="mailto:thurner.rupert@ymono.net">thurner rupert</a>
* @author <a href="mailto:ryan@darksleep.com">ryan daum</a>
*
*/
public class HgConfig
{
//Minimum version for the Hg SCM
private static final String HG_REQ = "0.9.2";
// The string which indicates the beginning of the Mercurial line
private static final String HG_VERSION_TAG = "ercurial Distributed SCM (version ";
// URL to download mercurial from
private static final String HG_INSTALL_URL = "'http://www.selenic.com/mercurial/wiki/index.cgi/Download'";
//Configuration to check with default values (not installed)
private HgVersionConsumer hgVersion = new HgVersionConsumer( null );
HgConfig( File workingDir )
{
try
{
hgVersion = getHgVersion( workingDir );
}
catch ( ScmException e )
{
//Ignore - is not installed.
//This is already recorded thus we do not generate more info.
}
}
/**
* @return True if one can run basic hg commands
*/
private boolean isInstalled()
{
return hgVersion.isVersionOk( HG_REQ );
}
/**
* @return True if all modules for hg are installed.
*/
private boolean isComplete()
{
return isInstalled();
}
// Consumer to find the Mercurial version
public static HgVersionConsumer getHgVersion( File workingDir )
throws ScmException
{
String[] versionCmd = new String[]{HgCommandConstants.VERSION};
HgVersionConsumer consumer = new HgVersionConsumer( HG_VERSION_TAG );
Commandline cmd = HgUtils.buildCmd( workingDir, versionCmd );
// Execute command
HgUtils.executeCmd( consumer, cmd );
// Return result
return consumer;
}
/**
* Iterate through two dot-notation version strings, normalize them to the same length, then
* do alphabetic comparison
*
* @param version1
* @param version2
* @return true if version2 is greater than version1
*/
private static boolean compareVersion( String version1, String version2 )
{
int l1, l2;
String v1, v2;
v1 = version1;
v2 = version2;
l1 = version1.length();
l2 = version2.length();
if ( l1 > l2 )
{
for ( int x = l2; x >= l1; x-- )
{
v2 += ' ';
}
}
if ( l2 > l1 )
{
for ( int x = l1; x <= l2; x++ )
{
v1 += ' ';
}
}
return v2.compareTo( v1 ) >= 0;
}
/**
* Get version of the executable.
* Version is resolved by splitting the line starting with the version tag and finding
* the second last word.
*/
private static class HgVersionConsumer
extends HgConsumer
{
private String versionStr = "NA";
private String versionTag;
HgVersionConsumer( String versionTag )
{
super( new DefaultLog() );
this.versionTag = versionTag;
}
public void doConsume( ScmFileStatus status, String line )
{
if ( line.startsWith( versionTag ) )
{
String[] elements = line.split( " " );
versionStr = elements[elements.length - 1].split( "\\)" )[0];
}
}
String getVersion()
{
return versionStr;
}
boolean isVersionOk( String version )
{
// build one number out of the whole version #
return compareVersion( version, versionStr );
}
}
private String getInstalledStr()
{
if ( isComplete() )
{
return "valid and complete.";
}
return ( isInstalled() ? "incomplete. " : "invalid. " ) + "Consult " + HG_INSTALL_URL;
}
public String toString( File workingDir )
{
boolean hgOk = hgVersion.isVersionOk( HG_REQ );
return "\n Your Hg installation seems to be " + getInstalledStr() + "\n Hg version: "
+ hgVersion.getVersion() + ( hgOk ? " (OK)" : " (May be INVALID)" ) + "\n";
}
}