diff --git a/plugins/gradle/resources/i18n/GradleBundle.properties b/plugins/gradle/resources/i18n/GradleBundle.properties index 254c04a80c20..0ba4bda74acb 100644 --- a/plugins/gradle/resources/i18n/GradleBundle.properties +++ b/plugins/gradle/resources/i18n/GradleBundle.properties @@ -1,8 +1,10 @@ gradle.name=Gradle -gradle.settings.text.use.wrapper=Use gradle wrapper (recommended) -gradle.settings.text.use.wrapper.disabled=Use gradle wrapper (not configured for the current project) -gradle.settings..text.use.local.distribution=Use local gradle distribution +gradle.settings.text.use.default_wrapper.configured=Use default gradle wrapper (recommended) +gradle.settings.text.use.default_wrapper.not_configured=Use default gradle wrapper (not configured for the current project) +gradle.settings.text.use.wrapper.with_verification=Use gradle wrapper with verification +gradle.settings.text.wrapper.verification.compatibility=Gradle wrapper verification works with Gradle 1.7 or later +gradle.settings.text.use.local.distribution=Use local gradle distribution gradle.settings.text.use.bundled.distribution=Use bundled gradle distribution: ({0}) gradle.settings.text.home.path=Gradle home: diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/GradleManager.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/GradleManager.java index 64b962aed8d7..c5b3738af7e8 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/GradleManager.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/GradleManager.java @@ -167,7 +167,15 @@ implements ExternalSystemConfigurableAware, ExternalSystemUiAware, ExternalSyste } GradleProjectSettings projectLevelSettings = settings.getLinkedProjectSettings(pair.second); - DistributionType distributionType = projectLevelSettings == null ? DistributionType.LOCAL : projectLevelSettings.getDistributionType(); + final DistributionType distributionType; + if (projectLevelSettings == null) { + distributionType = + GradleUtil.isGradleDefaultWrapperFilesExist(pair.second) ? DistributionType.DEFAULT_WRAPPED : DistributionType.LOCAL; + } + else { + distributionType = projectLevelSettings.getDistributionType() == null ? DistributionType.LOCAL : projectLevelSettings.getDistributionType(); + } + GradleExecutionSettings result = new GradleExecutionSettings(localGradlePath, settings.getServiceDirectoryPath(), distributionType, diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/GradleExecutionHelper.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/GradleExecutionHelper.java index 694b1a599a26..22108676425d 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/GradleExecutionHelper.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/GradleExecutionHelper.java @@ -34,6 +34,7 @@ import org.gradle.tooling.model.idea.BasicIdeaProject; import org.gradle.tooling.model.idea.IdeaProject; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.plugins.gradle.settings.DistributionType; import org.jetbrains.plugins.gradle.settings.GradleExecutionSettings; import java.io.File; @@ -133,15 +134,17 @@ public class GradleExecutionHelper { public T execute(@NotNull String projectPath, @Nullable GradleExecutionSettings settings, @NotNull Function f) { + // This is a workaround to get right base dir in case of 'PROJECT' setting used in case custom wrapper property file location + // see org.gradle.wrapper.PathAssembler#getBaseDir for details String userDir = null; - try { - // This is a workaround to get right base dir in case of 'PROJECT' setting used - // see org.gradle.wrapper.PathAssembler#getBaseDir for details - userDir = System.getProperty("user.dir"); - System.setProperty("user.dir", projectPath); - } - catch (Exception e) { - // ignore + if(settings != null && settings.getDistributionType() == DistributionType.WRAPPED) { + try { + userDir = System.getProperty("user.dir"); + System.setProperty("user.dir", projectPath); + } + catch (Exception e) { + // ignore + } } ProjectConnection connection = getConnection(projectPath, settings); try { diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/settings/GradleProjectSettingsControl.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/settings/GradleProjectSettingsControl.java index 85ac9006f7ec..5408a9c01348 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/settings/GradleProjectSettingsControl.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/settings/GradleProjectSettingsControl.java @@ -30,6 +30,7 @@ import com.intellij.ui.components.JBLabel; import com.intellij.ui.components.JBRadioButton; import com.intellij.util.Alarm; import com.intellij.util.Consumer; +import com.intellij.util.ui.UIUtil; import org.gradle.util.GradleVersion; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -69,6 +70,8 @@ public class GradleProjectSettingsControl extends AbstractExternalProjectSetting private JLabel myGradleHomeLabel; private TextFieldWithBrowseButton myGradleHomePathField; private JBRadioButton myUseWrapperButton; + private JBRadioButton myUseWrapperWithVerificationButton; + private JBLabel myUseWrapperVerificationLabel; private JBRadioButton myUseLocalDistributionButton; private JBRadioButton myUseBundledDistributionButton; @@ -111,7 +114,11 @@ public class GradleProjectSettingsControl extends AbstractExternalProjectSetting initControls(); content.add(myUseWrapperButton, ExternalSystemUiUtil.getFillLineConstraints(indentLevel)); - content.add(myUseBundledDistributionButton, ExternalSystemUiUtil.getFillLineConstraints(indentLevel)); + content.add(myUseWrapperWithVerificationButton, ExternalSystemUiUtil.getLabelConstraints(indentLevel)); + content.add(myUseWrapperVerificationLabel, ExternalSystemUiUtil.getFillLineConstraints(indentLevel)); + //content.add(Box.createGlue(), ExternalSystemUiUtil.getFillLineConstraints(indentLevel)); + // Hide bundled distribution option for a while + // content.add(myUseBundledDistributionButton, ExternalSystemUiUtil.getFillLineConstraints(indentLevel)); content.add(myUseLocalDistributionButton, ExternalSystemUiUtil.getFillLineConstraints(indentLevel)); content.add(myGradleHomeLabel, ExternalSystemUiUtil.getLabelConstraints(indentLevel)); @@ -122,7 +129,7 @@ public class GradleProjectSettingsControl extends AbstractExternalProjectSetting ActionListener listener = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - boolean localDistributionEnabled = e.getSource() == myUseLocalDistributionButton; + boolean localDistributionEnabled = myUseLocalDistributionButton.isSelected(); myGradleHomePathField.setEnabled(localDistributionEnabled); if (localDistributionEnabled) { if(myGradleHomePathField.getText().isEmpty()){ @@ -142,9 +149,16 @@ public class GradleProjectSettingsControl extends AbstractExternalProjectSetting } } }; - myUseWrapperButton = new JBRadioButton(GradleBundle.message("gradle.settings.text.use.wrapper")); + + myUseWrapperButton = new JBRadioButton(GradleBundle.message("gradle.settings.text.use.default_wrapper.configured")); myUseWrapperButton.addActionListener(listener); - myUseLocalDistributionButton = new JBRadioButton(GradleBundle.message("gradle.settings..text.use.local.distribution")); + myUseWrapperWithVerificationButton = new JBRadioButton(GradleBundle.message("gradle.settings.text.use.wrapper.with_verification")); + myUseWrapperWithVerificationButton.addActionListener(listener); + myUseWrapperVerificationLabel = new JBLabel(GradleBundle.message("gradle.settings.text.wrapper.verification.compatibility")); + myUseWrapperVerificationLabel.setFont(UIUtil.getLabelFont(UIUtil.FontSize.MINI)); + myUseWrapperVerificationLabel.setIcon(UIUtil.getBalloonInformationIcon()); + + myUseLocalDistributionButton = new JBRadioButton(GradleBundle.message("gradle.settings.text.use.local.distribution")); myUseLocalDistributionButton.addActionListener(listener); myUseBundledDistributionButton = new JBRadioButton( @@ -154,6 +168,7 @@ public class GradleProjectSettingsControl extends AbstractExternalProjectSetting ButtonGroup buttonGroup = new ButtonGroup(); buttonGroup.add(myUseWrapperButton); + buttonGroup.add(myUseWrapperWithVerificationButton); buttonGroup.add(myUseBundledDistributionButton); buttonGroup.add(myUseLocalDistributionButton); } @@ -217,9 +232,11 @@ public class GradleProjectSettingsControl extends AbstractExternalProjectSetting return GradleBundle.message("gradle.home.setting.type.explicit.incorrect", gradleHomePath); } settings.setDistributionType(DistributionType.LOCAL); - } else if (myUseWrapperButton.isSelected()) { + } else if(myUseWrapperButton.isSelected()) { + settings.setDistributionType(DistributionType.DEFAULT_WRAPPED); + } else if(myUseWrapperWithVerificationButton.isSelected()) { settings.setDistributionType(DistributionType.WRAPPED); - } else { + } else if (myUseBundledDistributionButton.isSelected()) { settings.setDistributionType(DistributionType.BUNDLED); } @@ -228,18 +245,20 @@ public class GradleProjectSettingsControl extends AbstractExternalProjectSetting @Override protected boolean isExtraSettingModified() { - if (myUseBundledDistributionButton.isSelected() && - getInitialSettings().getDistributionType() != DistributionType.BUNDLED) { + DistributionType distributionType = getInitialSettings().getDistributionType(); + if (myUseBundledDistributionButton.isSelected() && distributionType != DistributionType.BUNDLED) { return true; } - if (myUseWrapperButton.isSelected() && - getInitialSettings().getDistributionType() != DistributionType.WRAPPED) { - return true; + if (myUseWrapperButton.isSelected() && distributionType != DistributionType.DEFAULT_WRAPPED) { + return true; } - if (myUseLocalDistributionButton.isSelected() && - getInitialSettings().getDistributionType() != DistributionType.LOCAL) { + if (myUseWrapperWithVerificationButton.isSelected() && distributionType != DistributionType.WRAPPED) { + return true; + } + + if (myUseLocalDistributionButton.isSelected() && distributionType != DistributionType.LOCAL) { return true; } @@ -260,7 +279,7 @@ public class GradleProjectSettingsControl extends AbstractExternalProjectSetting myGradleHomePathField.getTextField().setForeground(LocationSettingType.EXPLICIT_CORRECT.getColor()); updateWrapperControls(getInitialSettings().getExternalProjectPath()); - if (myUseWrapperButton.isSelected()) { + if (!myUseLocalDistributionButton.isSelected()) { myGradleHomePathField.setEnabled(false); return; } @@ -282,15 +301,42 @@ public class GradleProjectSettingsControl extends AbstractExternalProjectSetting } public void updateWrapperControls(@Nullable String linkedProjectPath) { - myUseWrapperButton.setText(GradleBundle.message("gradle.settings.text.use.wrapper")); + if(StringUtil.isEmpty(linkedProjectPath)) { + myUseLocalDistributionButton.setSelected(true); + myGradleHomePathField.setEnabled(true); + return; + } + + final boolean isGradleDefaultWrapperFilesExist = GradleUtil.isGradleDefaultWrapperFilesExist(linkedProjectPath); + if (isGradleDefaultWrapperFilesExist) { + myUseWrapperButton.setEnabled(true); + myUseWrapperButton.setSelected(true); + myGradleHomePathField.setEnabled(false); + myUseWrapperButton.setText(GradleBundle.message("gradle.settings.text.use.default_wrapper.configured")); + } else { + myUseWrapperButton.setEnabled(false); + myUseLocalDistributionButton.setSelected(true); + myGradleHomePathField.setEnabled(true); + myUseWrapperButton.setText(GradleBundle.message("gradle.settings.text.use.default_wrapper.not_configured")); + } + + if(getInitialSettings().getDistributionType() == null) { + return; + } + switch (getInitialSettings().getDistributionType()) { case LOCAL: myGradleHomePathField.setEnabled(true); myUseLocalDistributionButton.setSelected(true); break; - case WRAPPED: + case DEFAULT_WRAPPED: myGradleHomePathField.setEnabled(false); myUseWrapperButton.setSelected(true); + myUseWrapperButton.setEnabled(true); + break; + case WRAPPED: + myGradleHomePathField.setEnabled(false); + myUseWrapperWithVerificationButton.setSelected(true); break; case BUNDLED: myGradleHomePathField.setEnabled(false); diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/settings/DistributionType.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/settings/DistributionType.java index 3540abe23943..e04dc14ce944 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/settings/DistributionType.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/settings/DistributionType.java @@ -20,5 +20,30 @@ package org.jetbrains.plugins.gradle.settings; * @since 8/23/13 */ public enum DistributionType { - BUNDLED, WRAPPED, LOCAL + /** + * Gradle version packaged with IDE used + */ + BUNDLED, + /** + * The default configuration of the wrapper task assumed based on manually wrapper generated files: + *

+ * Build layout with default wrapper task: + *

+   * project_dir/
+   *    gradlew
+   *    gradlew.bat
+   *    gradle/wrapper/
+   *        gradle-wrapper.jar
+   *        gradle-wrapper.properties
+   * 
+ */ + DEFAULT_WRAPPED, + /** + * Wrapper task configuration based on build.gradle script to be used. + */ + WRAPPED, + /** + * Locally installed gradle to be used + */ + LOCAL } diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/settings/GradleProjectSettings.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/settings/GradleProjectSettings.java index d2a655492873..b8beb6ea67fb 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/settings/GradleProjectSettings.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/settings/GradleProjectSettings.java @@ -26,11 +26,7 @@ import org.jetbrains.annotations.Nullable; public class GradleProjectSettings extends ExternalProjectSettings { @Nullable private String myGradleHome; - @NotNull private DistributionType distributionType; - - public GradleProjectSettings() { - this.distributionType = DistributionType.LOCAL; - } + @Nullable private DistributionType distributionType; @Nullable public String getGradleHome() { @@ -41,12 +37,12 @@ public class GradleProjectSettings extends ExternalProjectSettings { myGradleHome = gradleHome; } - @NotNull + @Nullable public DistributionType getDistributionType() { return distributionType; } - public void setDistributionType(@NotNull DistributionType distributionType) { + public void setDistributionType(@Nullable DistributionType distributionType) { this.distributionType = distributionType; } diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/util/GradleUtil.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/util/GradleUtil.java index 63cd133690e6..4c243984b4d0 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/util/GradleUtil.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/util/GradleUtil.java @@ -53,7 +53,7 @@ public class GradleUtil { } @SuppressWarnings("IOResourceOpenedButNotSafelyClosed") - public static boolean isGradleWrapperDefined(@Nullable String gradleProjectPath) { + public static boolean isGradleDefaultWrapperFilesExist(@Nullable String gradleProjectPath) { return !StringUtil.isEmpty(getWrapperDistribution(gradleProjectPath)); }