001package 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 022import java.io.File; 023import java.util.ArrayList; 024import java.util.List; 025 026import org.apache.maven.scm.ScmException; 027import org.apache.maven.scm.ScmFile; 028import org.apache.maven.scm.ScmFileSet; 029import org.apache.maven.scm.ScmFileStatus; 030import org.apache.maven.scm.ScmResult; 031import org.apache.maven.scm.ScmTagParameters; 032import org.apache.maven.scm.command.Command; 033import org.apache.maven.scm.command.tag.AbstractTagCommand; 034import org.apache.maven.scm.command.tag.TagScmResult; 035import org.apache.maven.scm.provider.ScmProviderRepository; 036import org.apache.maven.scm.provider.hg.HgUtils; 037import org.apache.maven.scm.provider.hg.command.HgCommandConstants; 038import org.apache.maven.scm.provider.hg.command.HgConsumer; 039import org.apache.maven.scm.provider.hg.command.inventory.HgListConsumer; 040import org.apache.maven.scm.provider.hg.repository.HgScmProviderRepository; 041import 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 * 049 */ 050public 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}