Merge remote branch 'origin/master'

This commit is contained in:
irengrig
2012-12-12 18:51:10 +04:00
14 changed files with 140 additions and 157 deletions
@@ -263,7 +263,8 @@ public class InspectionProfileTest extends LightIdeaTestCase {
profile.enableTool(id);
}
profile.writeExternal(new Element("profile"));
assertEquals(1, countInitializedTools(profile));
List<InspectionProfileEntry> initializedTools = getInitializedTools(profile);
assertEquals(initializedTools.toString(), 1, initializedTools.size());
}
public void testInspectionInitializationForSerialization() throws Exception {
@@ -56,9 +56,12 @@ public abstract class ArtifactCompilerInstructionCreatorBase implements Artifact
@Override
public void addExtractDirectoryInstruction(@NotNull File jarFile, @NotNull String pathInJar) {
final boolean copyExcluded = myInstructionsBuilder.getRootsIndex().isExcluded(jarFile);
//an entry of a jar file is excluded if and only if the jar file itself is excluded. In that case we should unpack entries to the artifact
// because the jar itself is explicitly added to the artifact layout.
boolean includeExcluded = true;
final SourceFileFilterImpl filter = new SourceFileFilterImpl(null, myInstructionsBuilder.getRootsIndex(),
myInstructionsBuilder.getIgnoredFileIndex(), copyExcluded);
myInstructionsBuilder.getIgnoredFileIndex(), includeExcluded);
DestinationInfo destination = createDirectoryDestination();
if (destination != null) {
ArtifactRootDescriptor descriptor = myInstructionsBuilder.createJarBasedRoot(jarFile, pathInJar, filter, destination);
@@ -73,9 +73,7 @@ public class AndroidDexBuilder extends TargetBuilder<BuildRootDescriptor, Androi
@NotNull DirtyFilesHolder<BuildRootDescriptor, AndroidDexBuildTarget> holder,
@NotNull BuildOutputConsumer outputConsumer,
@NotNull CompileContext context) throws ProjectBuildException, IOException {
if (AndroidJpsUtil.isLightBuild(context)) {
return;
}
assert !AndroidJpsUtil.isLightBuild(context);
try {
if (!doDexBuild(buildTarget, context, holder.hasDirtyFiles())) {
@@ -97,10 +95,7 @@ public class AndroidDexBuilder extends TargetBuilder<BuildRootDescriptor, Androi
final JpsAndroidModuleExtension extension = AndroidJpsUtil.getExtension(module);
assert extension != null;
if (extension.isLibrary()) {
return true;
}
assert !extension.isLibrary();
final AndroidPlatform platform = AndroidJpsUtil.getAndroidPlatform(module, context, DEX_BUILDER_NAME);
if (platform == null) {
@@ -87,7 +87,7 @@ public class AndroidPackagingBuilder extends TargetBuilder<BuildRootDescriptor,
throw new ProjectBuildException();
}
if (!doPackaging(context, modules)) {
if (!doPackaging(context, modules, outputConsumer)) {
throw new ProjectBuildException();
}
}
@@ -315,7 +315,9 @@ public class AndroidPackagingBuilder extends TargetBuilder<BuildRootDescriptor,
return success;
}
private static boolean doPackaging(@NotNull CompileContext context, @NotNull Collection<JpsModule> modules) throws IOException {
private static boolean doPackaging(@NotNull CompileContext context,
@NotNull Collection<JpsModule> modules,
@NotNull BuildOutputConsumer outputConsumer) throws IOException {
final boolean release = AndroidJpsUtil.isReleaseBuild(context);
final File dataStorageRoot = context.getProjectDescriptor().dataManager.getDataPaths().getDataStorageRoot();
@@ -332,7 +334,8 @@ public class AndroidPackagingBuilder extends TargetBuilder<BuildRootDescriptor,
for (JpsModule module : modules) {
try {
if (!doPackagingForModule(context, module, apkFileSetStorage, apkBuilderConfigStateStorage, release)) {
if (!doPackagingForModule(context, module, apkFileSetStorage, apkBuilderConfigStateStorage,
release, outputConsumer)) {
success = false;
}
}
@@ -359,7 +362,8 @@ public class AndroidPackagingBuilder extends TargetBuilder<BuildRootDescriptor,
@NotNull JpsModule module,
@NotNull AndroidFileSetStorage apkFileSetStorage,
@NotNull AndroidApkBuilderConfigStateStorage apkBuilderConfigStateStorage,
boolean release) throws IOException {
boolean release,
@NotNull BuildOutputConsumer outputConsumer) throws IOException {
final JpsAndroidModuleExtension extension = AndroidJpsUtil.getExtension(module);
if (extension == null || extension.isLibrary()) {
return true;
@@ -435,6 +439,7 @@ public class AndroidPackagingBuilder extends TargetBuilder<BuildRootDescriptor,
final File dst = new File(
AndroidCommonUtils.addSuffixToFileName(outputPath, AndroidCommonUtils.ANDROID_FINAL_PACKAGE_FOR_ARTIFACT_SUFFIX));
FileUtil.copy(new File(outputApkPath), dst);
outputConsumer.registerOutputFile(dst, Collections.<String>emptyList());
}
AndroidJpsUtil.addMessages(context, messages, BUILDER_NAME, module.getName());
final boolean success = messages.get(AndroidCompilerMessageKind.ERROR).isEmpty();
@@ -31,12 +31,19 @@ import java.util.List;
/**
* @author nik
*/
public abstract class AndroidBuildTarget extends ModuleBasedTarget<BuildRootDescriptor> {
public abstract class AndroidBuildTarget extends BuildTarget<BuildRootDescriptor> {
private final AndroidBuildTargetType myTargetType;
protected final JpsModule myModule;
public AndroidBuildTarget(@NotNull AndroidBuildTargetType targetType, @NotNull JpsModule module) {
super(targetType, module);
super(targetType);
myTargetType = targetType;
myModule = module;
}
@NotNull
public JpsModule getModule() {
return myModule;
}
@Override
@@ -67,11 +74,6 @@ public abstract class AndroidBuildTarget extends ModuleBasedTarget<BuildRootDesc
return "Android " + myTargetType.getPresentableName();
}
@Override
public boolean isTests() {
return false;
}
@Nullable
@Override
public BuildRootDescriptor findRootDescriptor(String rootId, BuildRootIndex rootIndex) {
@@ -82,4 +84,22 @@ public abstract class AndroidBuildTarget extends ModuleBasedTarget<BuildRootDesc
}
return null;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || !(o instanceof AndroidBuildTarget)) {
return false;
}
AndroidBuildTarget target = (AndroidBuildTarget)o;
return getTargetType() == target.getTargetType() && getId().equals(target.getId());
}
@Override
public int hashCode() {
return 31 * getId().hashCode() + getTargetType().hashCode();
}
}
@@ -1,7 +1,10 @@
package org.jetbrains.jps.android.builder;
import com.intellij.openapi.util.io.FileUtil;
import org.jetbrains.android.util.AndroidCommonUtils;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jps.android.AndroidJpsUtil;
import org.jetbrains.jps.android.model.JpsAndroidModuleExtension;
import org.jetbrains.jps.builders.BuildRootDescriptor;
import org.jetbrains.jps.builders.BuildTarget;
import org.jetbrains.jps.builders.storage.BuildDataPaths;
@@ -36,12 +39,30 @@ public class AndroidPackagingBuildTarget extends AndroidBuildTarget {
@NotNull
@Override
public Collection<File> getOutputRoots(CompileContext context) {
return Collections.emptyList();
final File moduleOutputDir = context.getProjectPaths().getModuleOutputDir(myModule, false);
final JpsAndroidModuleExtension extension = AndroidJpsUtil.getExtension(myModule);
if (moduleOutputDir == null || extension == null) {
return Collections.emptyList();
}
final String outputPath = AndroidJpsUtil.getApkPath(extension, moduleOutputDir);
if (outputPath == null) {
return Collections.emptyList();
}
final String afpFile = AndroidCommonUtils.addSuffixToFileName(
outputPath, AndroidCommonUtils.ANDROID_FINAL_PACKAGE_FOR_ARTIFACT_SUFFIX);
return Collections.singletonList(new File(FileUtil.toSystemDependentName(afpFile)));
}
@Override
protected void fillDependencies(List<BuildTarget<?>> result) {
result.add(new AndroidDexBuildTarget(myModule));
final JpsAndroidModuleExtension extension = AndroidJpsUtil.getExtension(myModule);
if (extension != null && !extension.isLibrary()) {
// todo: remove this when AndroidPackagingBuilder will be fully target-based
result.add(new AndroidDexBuildTarget(myModule));
}
}
public static class MyTargetType extends AndroidBuildTargetType<AndroidPackagingBuildTarget> {
+1
View File
@@ -337,6 +337,7 @@
<codeStyleSettingsProvider implementation="org.jetbrains.android.formatter.AndroidXmlCodeStyleSettingsProvider"/>
<predefinedCodeStyle implementation="org.jetbrains.android.formatter.AndroidXmlPredefinedCodeStyle"/>
<editorNotificationProvider implementation="org.jetbrains.android.formatter.AndroidCodeStyleNotificationProvider"/>
<compiler.buildTargetScopeProvider implementation="org.jetbrains.android.compiler.AndroidBuildTargetScopeProvider"/>
</extensions>
<extensionPoints>
@@ -0,0 +1,55 @@
package org.jetbrains.android.compiler;
import com.intellij.compiler.impl.BuildTargetScopeProvider;
import com.intellij.facet.ProjectFacetManager;
import com.intellij.openapi.compiler.CompileScope;
import com.intellij.openapi.compiler.CompilerFilter;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.project.Project;
import org.jetbrains.android.facet.AndroidFacet;
import org.jetbrains.android.util.AndroidCommonUtils;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import static org.jetbrains.jps.api.CmdlineRemoteProto.Message.ControllerMessage.ParametersMessage.TargetTypeBuildScope;
/**
* @author Eugene.Kudelevsky
*/
public class AndroidBuildTargetScopeProvider extends BuildTargetScopeProvider {
@NotNull
@Override
public List<TargetTypeBuildScope> getBuildTargetScopes(
@NotNull CompileScope baseScope, @NotNull CompilerFilter filter, @NotNull Project project) {
if (!ProjectFacetManager.getInstance(project).hasFacets(AndroidFacet.ID)) {
return Collections.emptyList();
}
final List<String> dexTargetIds = new ArrayList<String>();
final List<String> packagingTargetIds = new ArrayList<String>();
final boolean fullBuild = AndroidCompileUtil.isFullBuild(baseScope);
for (Module module : baseScope.getAffectedModules()) {
final AndroidFacet facet = AndroidFacet.getInstance(module);
if (facet == null) {
continue;
}
// todo: make AndroidPackagingBuilder fully target-based and change this
packagingTargetIds.add(module.getName());
if (fullBuild && !facet.getConfiguration().LIBRARY_PROJECT) {
dexTargetIds.add(module.getName());
}
}
return Arrays.asList(
TargetTypeBuildScope.newBuilder().setTypeId(AndroidCommonUtils.DEX_BUILD_TARGET_TYPE_ID).
addAllTargetId(dexTargetIds).build(),
TargetTypeBuildScope.newBuilder().setTypeId(AndroidCommonUtils.PACKAGING_BUILD_TARGET_TYPE_ID).
addAllTargetId(packagingTargetIds).build());
}
}
@@ -19,6 +19,7 @@ import com.intellij.compiler.CompilerConfiguration;
import com.intellij.compiler.CompilerConfigurationImpl;
import com.intellij.compiler.CompilerWorkspaceConfiguration;
import com.intellij.compiler.options.CompileStepBeforeRun;
import com.intellij.compiler.server.BuildManager;
import com.intellij.facet.ProjectFacetManager;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.ModalityState;
@@ -72,6 +73,11 @@ public class AndroidPrecompileTask implements CompileTask {
public boolean execute(CompileContext context) {
final Project project = context.getProject();
if (!ProjectFacetManager.getInstance(project).hasFacets(AndroidFacet.ID)) {
return true;
}
BuildManager.forceModelLoading(context);
// in out-of-process mode gen roots will be excluded by AndroidExcludedJavaSourceRootProvider
// we do it here for internal mode and also to make there roots 'visibly excluded' in IDE settings
createGenModulesAndSourceRoots(project);
@@ -149,9 +155,6 @@ public class AndroidPrecompileTask implements CompileTask {
private static boolean checkArtifacts(@NotNull CompileContext context) {
final Project project = context.getProject();
if (!ProjectFacetManager.getInstance(project).hasFacets(AndroidFacet.ID)) {
return true;
}
final CompileScope scope = context.getCompileScope();
final Set<Artifact> artifacts = ApplicationManager.getApplication().runReadAction(new Computable<Set<Artifact>>() {
@@ -1,122 +0,0 @@
package org.jetbrains.android.compiler.artifact;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.compiler.CompileContext;
import com.intellij.openapi.compiler.CompileScope;
import com.intellij.openapi.compiler.PackagingCompiler;
import com.intellij.openapi.compiler.ValidityState;
import com.intellij.openapi.util.Computable;
import com.intellij.openapi.vfs.VirtualFile;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
/**
* @author Eugene.Kudelevsky
*/
public class AndroidArtifactSigningCompiler implements PackagingCompiler {
@Override
public void processOutdatedItem(CompileContext context, String url, @Nullable ValidityState state) {
}
@NotNull
@Override
public ProcessingItem[] getProcessingItems(CompileContext context) {
return ApplicationManager.getApplication().runReadAction(new Computable<ProcessingItem[]>() {
@Override
public ProcessingItem[] compute() {
return null;
}
});
}
@Override
public ProcessingItem[] process(CompileContext context, ProcessingItem[] items) {
return new ProcessingItem[0]; //To change body of implemented methods use File | Settings | File Templates.
}
@NotNull
@Override
public String getDescription() {
return "Android Artifact Signing Compiler";
}
@Override
public boolean validateConfiguration(CompileScope scope) {
return true;
}
@Override
public ValidityState createValidityState(DataInput in) throws IOException {
return new MyValidityState(in);
}
private static class MyProcessingItem implements ProcessingItem {
private final VirtualFile myApkFile;
private final AndroidArtifactSigningMode mySigningMode;
private final String myDebugKeyStorePath;
private final MyValidityState myValidityState;
private MyProcessingItem(@NotNull VirtualFile apkFile,
@NotNull AndroidArtifactSigningMode signingMode,
@Nullable String debugKeyStorePath) {
myApkFile = apkFile;
mySigningMode = signingMode;
myDebugKeyStorePath = debugKeyStorePath;
myValidityState = new MyValidityState(myApkFile.getModificationStamp(),
mySigningMode.name(),
myDebugKeyStorePath);
}
@NotNull
@Override
public VirtualFile getFile() {
return myApkFile;
}
@Override
public ValidityState getValidityState() {
return myValidityState;
}
}
private static class MyValidityState implements ValidityState {
private final long myApkFileTimestamp;
private final String mySigningMode;
private final String myDebugKeyStorePath;
private MyValidityState(long apkFileTimestamp, @NotNull String signingMode, @NotNull String debugKeyStorePath) {
myApkFileTimestamp = apkFileTimestamp;
mySigningMode = signingMode;
myDebugKeyStorePath = debugKeyStorePath;
}
private MyValidityState(@NotNull DataInput in) throws IOException {
myApkFileTimestamp = in.readLong();
mySigningMode = in.readUTF();
myDebugKeyStorePath = in.readUTF();
}
@Override
public boolean equalsTo(ValidityState otherState) {
if (!(otherState instanceof MyValidityState)) {
return false;
}
final MyValidityState state = (MyValidityState)otherState;
return state.myApkFileTimestamp == myApkFileTimestamp &&
state.mySigningMode.equals(mySigningMode) &&
state.myDebugKeyStorePath.equals(myDebugKeyStorePath);
}
@Override
public void save(DataOutput out) throws IOException {
out.writeLong(myApkFileTimestamp);
out.writeUTF(mySigningMode);
out.writeUTF(myDebugKeyStorePath);
}
}
}
@@ -309,7 +309,7 @@ class MockGit implements Git {
}
static String commitMessageForCherryPick(GitCommit commit) {
"$commit.subject\n(cherry-picked from ${commit.shortHash.getString()})"
"$commit.subject\n\n(cherry-picked from ${commit.shortHash.getString()})"
}
}
@@ -160,7 +160,7 @@ hint: and commit the result with 'git commit'
}
String newCommitMessage(GitCommit commit) {
"${commit.description}\n(cherry-picked from ${commit.hash.value})"
"${commit.description}\n\n(cherry-picked from ${commit.hash.value})"
}
protected static class OKCommitDialogHandler implements MockVcsHelper.CommitHandler {
@@ -968,7 +968,7 @@ public class MavenProjectsManager extends MavenSimpleProjectComponent
if (myProject.isDisposed()) return;
MavenFoldersImporter.updateProjectFolders(myProject, targetFoldersOnly);
VirtualFileManager.getInstance().syncRefresh();
VirtualFileManager.getInstance().asyncRefresh(null);
}
});
}
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2009 JetBrains s.r.o.
* Copyright 2000-2012 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -22,11 +22,13 @@ import org.jetbrains.annotations.Nullable;
/**
* @author peter
*/
*/
public class XmlName implements Comparable<XmlName> {
private final String myLocalName;
private final String myNamespaceKey;
private final int myHashCode;
public XmlName(@NotNull @NonNls final String localName) {
this(localName, null);
}
@@ -34,6 +36,8 @@ public class XmlName implements Comparable<XmlName> {
public XmlName(@NotNull @NonNls final String localName, @Nullable final String namespaceKey) {
myLocalName = localName;
myNamespaceKey = namespaceKey;
myHashCode = 31 * myLocalName.hashCode() + (myNamespaceKey != null ? myNamespaceKey.hashCode() : 0);
}
@NotNull
@@ -61,10 +65,7 @@ public class XmlName implements Comparable<XmlName> {
}
public int hashCode() {
int result;
result = myLocalName.hashCode();
result = 31 * result + (myNamespaceKey != null ? myNamespaceKey.hashCode() : 0);
return result;
return myHashCode;
}