/*
 * HeadsUp Agile
 * Copyright 2009-2012 Heads Up Development Ltd.
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as
 * published by the Free Software Foundation, either version 3 of the
 * License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

package org.headsupdev.agile.scm;

import org.apache.maven.scm.log.ScmLogger;
import org.apache.maven.scm.manager.BasicScmManager;
import org.apache.maven.scm.provider.git.gitexe.GitExeScmProvider;
import org.apache.maven.scm.provider.svn.svnexe.SvnExeScmProvider;
import org.apache.maven.scm.provider.hg.HgScmProvider;

import java.util.LinkedList;
import java.util.List;

/**
 * Interface for the main source control management ApI
 *
 * @author Andrew Williams
 * @version $Id$
 * @since 1.0
 */
public class HeadsUpScmManager extends BasicScmManager
{
    private static HeadsUpScmManager instance = new HeadsUpScmManager();

    private static final List<String> SCM_IDS = new LinkedList<String>();

    static
    {
        SCM_IDS.add( "svn" );
        SCM_IDS.add( "git" );
        SCM_IDS.add( "hg" );
    }

    public static HeadsUpScmManager getInstance()
    {
        return instance;
    }

    public HeadsUpScmManager()
    {
        setScmProvider( "svn", new SvnExeScmProvider() );
        setScmProvider( "git", new GitExeScmProvider() );
        setScmProvider( "hg", new HgScmProvider() );
    }

    @Override
    protected ScmLogger getScmLogger()
    {
        return new ScmLoggerAdapter();
    }

    public List<String> getScmIds()
    {
        return SCM_IDS;
    }

    /**
     * Get the variant that describes the behaviour of an scm variant.
     * The parameter can be either the scm code or an scm url string
     *
     * @param scm the scm code (i.e. svn,hg) or an scm url (i.e. scm:git:file:///tmp/repo)
     * @return the ScmVariant for the requested scm type or null if not recognised
     */
    public ScmVariant getScmVariant( String scm )
    {
        String scmCode = scm;
        if ( scm.startsWith( "scm:" ) )
        {
            String tmp = scm.substring( 4 );
            int end = tmp.indexOf( ':' );
            scmCode = tmp.substring( 0, end );
        }

        if ( scmCode.equals( "svn" ) )
        {
            return new SvnScmVariant();
        }
        else if ( scmCode.equals( "git" ) )
        {
            return new GitScmVariant();
        }
        else if ( scmCode.equals( "hg" ) )
        {
            return new HgScmVariant();
        }

        return null;
    }
}

@@ -1463,38 +1463,8 @@
   %7B%0A
-        SCM_IDS.add( %22svn%22 );%0A
     
@@ -1514,24 +1514,54 @@
 dd( %22hg%22 );%0A
+        SCM_IDS.add( %22svn%22 );%0A
     %7D%0A%0A    p

make git default