001    package org.apache.maven.scm.provider.hg.command.tag;
002    
003    /*
004     * Licensed to the Apache Software Foundation (ASF) under one
005     * or more contributor license agreements.  See the NOTICE file
006     * distributed with this work for additional information
007     * regarding copyright ownership.  The ASF licenses this file
008     * to you under the Apache License, Version 2.0 (the
009     * "License"); you may not use this file except in compliance
010     * with the License.  You may obtain a copy of the License at
011     *
012     * http://www.apache.org/licenses/LICENSE-2.0
013     *
014     * Unless required by applicable law or agreed to in writing,
015     * software distributed under the License is distributed on an
016     * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
017     * KIND, either express or implied.  See the License for the
018     * specific language governing permissions and limitations
019     * under the License.
020     */
021    
022    import java.io.File;
023    import java.util.ArrayList;
024    import java.util.List;
025    
026    import org.apache.maven.scm.ScmException;
027    import org.apache.maven.scm.ScmFile;
028    import org.apache.maven.scm.ScmFileSet;
029    import org.apache.maven.scm.ScmFileStatus;
030    import org.apache.maven.scm.ScmResult;
031    import org.apache.maven.scm.ScmTagParameters;
032    import org.apache.maven.scm.command.Command;
033    import org.apache.maven.scm.command.tag.AbstractTagCommand;
034    import org.apache.maven.scm.command.tag.TagScmResult;
035    import org.apache.maven.scm.provider.ScmProviderRepository;
036    import org.apache.maven.scm.provider.hg.HgUtils;
037    import org.apache.maven.scm.provider.hg.command.HgCommandConstants;
038    import org.apache.maven.scm.provider.hg.command.HgConsumer;
039    import org.apache.maven.scm.provider.hg.command.inventory.HgListConsumer;
040    import org.apache.maven.scm.provider.hg.repository.HgScmProviderRepository;
041    import org.codehaus.plexus.util.StringUtils;
042    
043    /**
044     * Tag
045     *
046     * @author <a href="mailto:ryan@darksleep.com">ryan daum</a>
047     * @author Olivier Lamy
048     * @version $Id: HgTagCommand.java 1306867 2012-03-29 13:45:10Z olamy $
049     */
050    public class HgTagCommand
051        extends AbstractTagCommand
052        implements Command
053    {
054    
055        protected ScmResult executeTagCommand( ScmProviderRepository scmProviderRepository, ScmFileSet fileSet, String tag,
056                                               String message )
057            throws ScmException
058        {
059            return executeTagCommand( scmProviderRepository, fileSet, tag, new ScmTagParameters( message ) );
060        }
061    
062        /**
063         * {@inheritDoc}
064         */
065        protected ScmResult executeTagCommand( ScmProviderRepository scmProviderRepository, ScmFileSet fileSet, String tag,
066                                               ScmTagParameters scmTagParameters )
067            throws ScmException
068        {
069    
070            if ( tag == null || StringUtils.isEmpty( tag.trim() ) )
071            {
072                throw new ScmException( "tag must be specified" );
073            }
074    
075            if ( !fileSet.getFileList().isEmpty() )
076            {
077                throw new ScmException( "This provider doesn't support tagging subsets of a directory : " + fileSet.getFileList() );
078            }
079    
080            File workingDir = fileSet.getBasedir();
081    
082            // build the command
083            String[] tagCmd =
084                new String[]{ HgCommandConstants.TAG_CMD, HgCommandConstants.MESSAGE_OPTION, scmTagParameters.getMessage(),
085                    tag };
086    
087            // keep the command about in string form for reporting
088            StringBuilder cmd = joinCmd( tagCmd );
089            HgTagConsumer consumer = new HgTagConsumer( getLogger() );
090            ScmResult result = HgUtils.execute( consumer, getLogger(), workingDir, tagCmd );
091            HgScmProviderRepository repository = (HgScmProviderRepository) scmProviderRepository;
092            if ( result.isSuccess() )
093            {
094                // now push
095                // Push to parent branch if any
096    
097                if ( repository.isPushChanges() )
098                {
099                    if ( !repository.getURI().equals( fileSet.getBasedir().getAbsolutePath() ) )
100                    {
101                        String branchName = HgUtils.getCurrentBranchName( getLogger(), workingDir );
102                        boolean differentOutgoingBranch =
103                            HgUtils.differentOutgoingBranchFound( getLogger(), workingDir, branchName );
104    
105                        String[] pushCmd = new String[]{ HgCommandConstants.PUSH_CMD,
106                            differentOutgoingBranch ? HgCommandConstants.REVISION_OPTION + branchName : null,
107                            repository.getURI() };
108    
109                        result =
110                            HgUtils.execute( new HgConsumer( getLogger() ), getLogger(), fileSet.getBasedir(), pushCmd );
111                    }
112                }
113            }
114            else
115            {
116                throw new ScmException( "Error while executing command " + cmd.toString() );
117            }
118    
119            // do an inventory to return the files tagged (all of them)
120            String[] listCmd = new String[]{ HgCommandConstants.INVENTORY_CMD };
121            HgListConsumer listconsumer = new HgListConsumer( getLogger() );
122            result = HgUtils.execute( listconsumer, getLogger(), fileSet.getBasedir(), listCmd );
123            if ( result.isSuccess() )
124            {
125                List<ScmFile> files = listconsumer.getFiles();
126                List<ScmFile> fileList = new ArrayList<ScmFile>();
127                for ( ScmFile f : files )
128                {
129                    if ( !f.getPath().endsWith( ".hgtags" ) )
130                    {
131                        fileList.add( new ScmFile( f.getPath(), ScmFileStatus.TAGGED ) );
132                    }
133                }
134    
135                return new TagScmResult( fileList, result );
136            }
137            else
138            {
139                throw new ScmException( "Error while executing command " + cmd.toString() );
140            }
141        }
142    
143        private StringBuilder joinCmd( String[] cmd )
144        {
145            StringBuilder result = new StringBuilder();
146            for ( int i = 0; i < cmd.length; i++ )
147            {
148                String s = cmd[i];
149                result.append( s );
150                if ( i < cmd.length - 1 )
151                {
152                    result.append( " " );
153                }
154            }
155            return result;
156        }
157    }