blob: 522fef4adb8301fb67373b4243b6327cc712947e [file] [log] [blame]
package org.apache.maven.shared.release.config;
/*
* 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 java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Properties;
import java.util.Set;
import org.apache.maven.shared.release.scm.IdentifiedScm;
/**
* Class providing utility methods used during the release process
*
* @author <a href="mailto:jwhitlock@apache.org">Jeremy Whitlock</a>
*/
public class ReleaseUtils
{
private ReleaseUtils()
{
// nothing to see here
}
/**
* Merge two descriptors together. All SCM settings are overridden by the merge descriptor, as is the
* <code>workingDirectory</code> field. The <code>completedPhase</code> field is used as
* a default from the merge descriptor, but not overridden if it exists.
*
* @param mergeInto the descriptor to be merged into
* @param toBeMerged the descriptor to merge into mergeInto
* @return ReleaseDescriptor the merged descriptor
*/
public static ReleaseDescriptor merge( ReleaseDescriptor mergeInto, ReleaseDescriptor toBeMerged )
{
// Overridden if configured from the caller
mergeInto.setScmId( mergeOverride( mergeInto.getScmId(), toBeMerged.getScmId() ) );
mergeInto.setScmSourceUrl( mergeOverride( mergeInto.getScmSourceUrl(), toBeMerged.getScmSourceUrl() ) );
mergeInto.setScmCommentPrefix(
mergeOverride( mergeInto.getScmCommentPrefix(), toBeMerged.getScmCommentPrefix() ) );
mergeInto.setScmReleaseLabel( mergeOverride( mergeInto.getScmReleaseLabel(),
toBeMerged.getScmReleaseLabel() ) );
mergeInto.setScmTagBase( mergeOverride( mergeInto.getScmTagBase(), toBeMerged.getScmTagBase() ) );
mergeInto.setScmTagNameFormat(
mergeOverride( mergeInto.getScmTagNameFormat(), toBeMerged.getScmTagNameFormat() ) );
mergeInto.setScmBranchBase( mergeOverride( mergeInto.getScmBranchBase(), toBeMerged.getScmBranchBase() ) );
mergeInto.setScmUsername( mergeOverride( mergeInto.getScmUsername(), toBeMerged.getScmUsername() ) );
mergeInto.setScmPassword( mergeOverride( mergeInto.getScmPassword(), toBeMerged.getScmPassword() ) );
mergeInto.setScmPrivateKey( mergeOverride( mergeInto.getScmPrivateKey(), toBeMerged.getScmPrivateKey() ) );
mergeInto.setScmPrivateKeyPassPhrase(
mergeOverride( mergeInto.getScmPrivateKeyPassPhrase(), toBeMerged.getScmPrivateKeyPassPhrase() ) );
mergeInto.setScmCommentPrefix(
mergeOverride( mergeInto.getScmCommentPrefix(), toBeMerged.getScmCommentPrefix() ) );
mergeInto.setAdditionalArguments(
mergeOverride( mergeInto.getAdditionalArguments(), toBeMerged.getAdditionalArguments() ) );
mergeInto.setPreparationGoals(
mergeOverride( mergeInto.getPreparationGoals(), toBeMerged.getPreparationGoals() ) );
mergeInto.setCompletionGoals(
mergeOverride( mergeInto.getCompletionGoals(), toBeMerged.getCompletionGoals() ) );
mergeInto.setPerformGoals( mergeOverride( mergeInto.getPerformGoals(), toBeMerged.getPerformGoals() ) );
mergeInto.setPomFileName( mergeOverride( mergeInto.getPomFileName(), toBeMerged.getPomFileName() ) );
mergeInto.setCheckModificationExcludes( toBeMerged.getCheckModificationExcludes() );
mergeInto.setScmUseEditMode( toBeMerged.isScmUseEditMode() );
mergeInto.setAddSchema( toBeMerged.isAddSchema() );
mergeInto.setGenerateReleasePoms( toBeMerged.isGenerateReleasePoms() );
mergeInto.setInteractive( toBeMerged.isInteractive() );
mergeInto.setUpdateDependencies( toBeMerged.isUpdateDependencies() );
mergeInto.setCommitByProject( mergeOverride( mergeInto.isCommitByProject(), toBeMerged.isCommitByProject(),
false ) );
mergeInto.setUseReleaseProfile( toBeMerged.isUseReleaseProfile() );
mergeInto.setBranchCreation( toBeMerged.isBranchCreation() );
mergeInto.setUpdateBranchVersions( toBeMerged.isUpdateBranchVersions() );
mergeInto.setUpdateWorkingCopyVersions( toBeMerged.isUpdateWorkingCopyVersions() );
mergeInto.setSuppressCommitBeforeTagOrBranch( toBeMerged.isSuppressCommitBeforeTagOrBranch() );
mergeInto.setUpdateVersionsToSnapshot( toBeMerged.isUpdateVersionsToSnapshot() );
mergeInto.setAllowTimestampedSnapshots( toBeMerged.isAllowTimestampedSnapshots() );
mergeInto.setSnapshotReleasePluginAllowed( toBeMerged.isSnapshotReleasePluginAllowed() );
mergeInto.setAutoVersionSubmodules( toBeMerged.isAutoVersionSubmodules() );
mergeInto.setDefaultReleaseVersion( mergeOverride( mergeInto.getDefaultReleaseVersion(),
toBeMerged.getDefaultReleaseVersion() ) );
mergeInto.setDefaultDevelopmentVersion( mergeOverride( mergeInto.getDefaultDevelopmentVersion(),
toBeMerged.getDefaultDevelopmentVersion() ) );
mergeInto.setRemoteTagging( toBeMerged.isRemoteTagging() );
mergeInto.setLocalCheckout( toBeMerged.isLocalCheckout() );
mergeInto.setPushChanges( toBeMerged.isPushChanges() );
mergeInto.setWaitBeforeTagging( toBeMerged.getWaitBeforeTagging() );
// If the user specifies versions, these should be override the existing versions
if ( toBeMerged.getReleaseVersions() != null )
{
mergeInto.getReleaseVersions().putAll( toBeMerged.getReleaseVersions() );
}
if ( toBeMerged.getDevelopmentVersions() != null )
{
mergeInto.getDevelopmentVersions().putAll( toBeMerged.getDevelopmentVersions() );
}
// These must be overridden, as they are not stored
mergeInto.setWorkingDirectory(
mergeOverride( mergeInto.getWorkingDirectory(), toBeMerged.getWorkingDirectory() ) );
mergeInto.setCheckoutDirectory(
mergeOverride( mergeInto.getCheckoutDirectory(), toBeMerged.getCheckoutDirectory() ) );
// Not overridden - not configured from caller
mergeInto.setCompletedPhase( mergeDefault( mergeInto.getCompletedPhase(), toBeMerged.getCompletedPhase() ) );
mergeInto.setProjectVersionPolicyId(
mergeDefault( mergeInto.getProjectVersionPolicyId(), toBeMerged.getProjectVersionPolicyId() ) );
return mergeInto;
}
private static String mergeOverride( String thisValue, String mergeValue )
{
return mergeValue != null ? mergeValue : thisValue;
}
private static String mergeDefault( String thisValue, String mergeValue )
{
return thisValue != null ? thisValue : mergeValue;
}
private static boolean mergeOverride( boolean thisValue, boolean mergeValue, boolean defaultValue )
{
return mergeValue != defaultValue ? mergeValue : thisValue;
}
public static ReleaseDescriptor copyPropertiesToReleaseDescriptor( Properties properties )
{
ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
releaseDescriptor.setCompletedPhase( properties.getProperty( "completedPhase" ) );
releaseDescriptor.setCommitByProject( Boolean.parseBoolean( properties.getProperty( "commitByProject" ) ) );
releaseDescriptor.setScmId( properties.getProperty( "scm.id" ) );
releaseDescriptor.setScmSourceUrl( properties.getProperty( "scm.url" ) );
releaseDescriptor.setScmUsername( properties.getProperty( "scm.username" ) );
releaseDescriptor.setScmPassword( properties.getProperty( "scm.password" ) );
releaseDescriptor.setScmPrivateKey( properties.getProperty( "scm.privateKey" ) );
releaseDescriptor.setScmPrivateKeyPassPhrase( properties.getProperty( "scm.passphrase" ) );
releaseDescriptor.setScmTagBase( properties.getProperty( "scm.tagBase" ) );
releaseDescriptor.setScmTagNameFormat( properties.getProperty( "scm.tagNameFormat" ) );
releaseDescriptor.setScmBranchBase( properties.getProperty( "scm.branchBase" ) );
releaseDescriptor.setScmReleaseLabel( properties.getProperty( "scm.tag" ) );
releaseDescriptor.setScmCommentPrefix( properties.getProperty( "scm.commentPrefix" ) );
releaseDescriptor.setAdditionalArguments( properties.getProperty( "exec.additionalArguments" ) );
releaseDescriptor.setPomFileName( properties.getProperty( "exec.pomFileName" ) );
releaseDescriptor.setPreparationGoals( properties.getProperty( "preparationGoals" ) );
releaseDescriptor.setCompletionGoals( properties.getProperty( "completionGoals" ) );
releaseDescriptor.setProjectVersionPolicyId( properties.getProperty( "projectVersionPolicyId" ) );
String snapshotReleasePluginAllowedStr = properties.getProperty( "exec.snapshotReleasePluginAllowed" );
releaseDescriptor.setSnapshotReleasePluginAllowed( snapshotReleasePluginAllowedStr == null
? false
: Boolean.valueOf(
snapshotReleasePluginAllowedStr ).booleanValue() );
String remoteTaggingStr = properties.getProperty( "remoteTagging" );
releaseDescriptor.setRemoteTagging(
remoteTaggingStr == null ? false : Boolean.valueOf( remoteTaggingStr ).booleanValue() );
String pushChanges = properties.getProperty( "pushChanges" );
releaseDescriptor.setPushChanges( pushChanges == null ? true : Boolean.valueOf( pushChanges ).booleanValue() );
loadResolvedDependencies( properties, releaseDescriptor );
// boolean properties are not written to the properties file because the value from the caller is always used
for ( Iterator<?> i = properties.keySet().iterator(); i.hasNext(); )
{
String property = (String) i.next();
if ( property.startsWith( "project.rel." ) )
{
releaseDescriptor.mapReleaseVersion( property.substring( "project.rel.".length() ),
properties.getProperty( property ) );
}
else if ( property.startsWith( "project.dev." ) )
{
releaseDescriptor.mapDevelopmentVersion( property.substring( "project.dev.".length() ),
properties.getProperty( property ) );
}
else if ( property.startsWith( "project.scm." ) )
{
int index = property.lastIndexOf( '.' );
if ( index > "project.scm.".length() )
{
String key = property.substring( "project.scm.".length(), index );
if ( !releaseDescriptor.getOriginalScmInfo().containsKey( key ) )
{
if ( properties.getProperty( "project.scm." + key + ".empty" ) != null )
{
releaseDescriptor.mapOriginalScmInfo( key, null );
}
else
{
IdentifiedScm scm = new IdentifiedScm();
scm.setConnection( properties.getProperty( "project.scm." + key + ".connection" ) );
scm.setDeveloperConnection(
properties.getProperty( "project.scm." + key + ".developerConnection" ) );
scm.setUrl( properties.getProperty( "project.scm." + key + ".url" ) );
scm.setTag( properties.getProperty( "project.scm." + key + ".tag" ) );
scm.setId( properties.getProperty( "project.scm." + key + ".id" ) );
releaseDescriptor.mapOriginalScmInfo( key, scm );
}
}
}
}
}
return releaseDescriptor;
}
private static void loadResolvedDependencies( Properties prop, ReleaseDescriptor descriptor )
{
Map<String, Map<String, String>> resolvedDependencies = new HashMap<String, Map<String, String>>();
Set entries = prop.entrySet();
Iterator<Entry<String, String>> iterator = entries.iterator();
String propertyName;
Entry<String, String> currentEntry;
while ( iterator.hasNext() )
{
currentEntry = iterator.next();
propertyName = currentEntry.getKey();
if ( propertyName.startsWith( "dependency." ) )
{
Map<String, String> versionMap;
String artifactVersionlessKey;
int startIndex = "dependency.".length();
int endIndex;
String versionType;
versionMap = new HashMap<String, String>();
if ( propertyName.indexOf( ".development" ) != -1 )
{
endIndex = propertyName.lastIndexOf( ".development" );
versionType = ReleaseDescriptor.DEVELOPMENT_KEY;
}
else if ( propertyName.indexOf( ".release" ) != -1 )
{
endIndex = propertyName.lastIndexOf( ".release" );
versionType = ReleaseDescriptor.RELEASE_KEY;
}
else
{
// MRELEASE-834, probably a maven-dependency-plugin property
continue;
}
artifactVersionlessKey = propertyName.substring( startIndex, endIndex );
if ( resolvedDependencies.containsKey( artifactVersionlessKey ) )
{
versionMap = resolvedDependencies.get( artifactVersionlessKey );
}
else
{
versionMap = new HashMap<String, String>();
resolvedDependencies.put( artifactVersionlessKey, versionMap );
}
versionMap.put( versionType, currentEntry.getValue() );
}
}
descriptor.setResolvedSnapshotDependencies( resolvedDependencies );
}
}