diff --git a/bin/linux/fsnotifier b/bin/linux/fsnotifier index 16677a1aa909..e4b7dcb6b24c 100755 Binary files a/bin/linux/fsnotifier and b/bin/linux/fsnotifier differ diff --git a/bin/linux/fsnotifier64 b/bin/linux/fsnotifier64 index 1335f1300ddb..8a73a32e167f 100755 Binary files a/bin/linux/fsnotifier64 and b/bin/linux/fsnotifier64 differ diff --git a/native/fsNotifier/linux/main.c b/native/fsNotifier/linux/main.c index 54e47aede8f4..4bd2727c224c 100644 --- a/native/fsNotifier/linux/main.c +++ b/native/fsNotifier/linux/main.c @@ -18,6 +18,8 @@ #include #include +#include +#include #include #include #include @@ -362,45 +364,31 @@ static bool register_roots(array* new_roots, array* unwatchable, array* mounts) } -static bool is_watchable(const char* dev, const char* mnt, const char* fs) { +static bool is_watchable(const char* mnt, const char* fs) { // don't watch special and network filesystems return !(strncmp(mnt, "/dev", 4) == 0 || strncmp(mnt, "/proc", 5) == 0 || strncmp(mnt, "/sys", 4) == 0 || - strncmp(fs, "fuse.", 5) == 0 || strcmp(fs, "cifs") == 0 || strcmp(fs, "nfs") == 0); + strncmp(fs, "fuse.", 5) == 0 || strcmp(fs, "cifs") == 0 || strcmp(fs, MNTTYPE_NFS) == 0 || strcmp(fs, MNTTYPE_SWAP) == 0); } -#define MTAB_DELIMS " \t" - static array* unwatchable_mounts() { - FILE* mtab = fopen("/etc/mtab", "r"); + FILE* mtab = setmntent(_PATH_MOUNTED, "r"); if (mtab == NULL) { - mtab = fopen("/proc/mounts", "r"); - } - if (mtab == NULL) { - userlog(LOG_ERR, "neither /etc/mtab nor /proc/mounts can be read"); + userlog(LOG_ERR, "cannot open " _PATH_MOUNTED); return NULL; } array* mounts = array_create(20); CHECK_NULL(mounts, NULL); - char* line; - while ((line = read_line(mtab)) != NULL) { - userlog(LOG_DEBUG, "mtab: %s", line); - char* dev = strtok(line, MTAB_DELIMS); - char* point = strtok(NULL, MTAB_DELIMS); - char* fs = strtok(NULL, MTAB_DELIMS); - - if (dev == NULL || point == NULL || fs == NULL) { - userlog(LOG_ERR, "can't parse mount line"); - return NULL; - } - - if (!is_watchable(dev, point, fs)) { - CHECK_NULL(array_push(mounts, strdup(point)), NULL); + struct mntent* ent; + while ((ent = getmntent(mtab)) != NULL) { + userlog(LOG_DEBUG, "mtab: %s : %s", ent->mnt_dir, ent->mnt_type); + if (strcmp(ent->mnt_type, MNTTYPE_IGNORE) != 0 && !is_watchable(ent->mnt_dir, ent->mnt_type)) { + CHECK_NULL(array_push(mounts, strdup(ent->mnt_dir)), NULL); } } - fclose(mtab); + endmntent(mtab); return mounts; } diff --git a/plugins/android/src/META-INF/plugin.xml b/plugins/android/src/META-INF/plugin.xml index e9ed727fa56d..9536901bc038 100644 --- a/plugins/android/src/META-INF/plugin.xml +++ b/plugins/android/src/META-INF/plugin.xml @@ -81,6 +81,7 @@ description="Attach debugger to Android process" icon="AndroidIcons.AttachDebugger"> + diff --git a/plugins/android/src/org/jetbrains/android/compiler/AndroidExternalApklibExtractingCompiler.java b/plugins/android/src/org/jetbrains/android/compiler/AndroidExternalApklibExtractingCompiler.java index 31a11780f8cb..2a272bd29bb1 100644 --- a/plugins/android/src/org/jetbrains/android/compiler/AndroidExternalApklibExtractingCompiler.java +++ b/plugins/android/src/org/jetbrains/android/compiler/AndroidExternalApklibExtractingCompiler.java @@ -102,14 +102,17 @@ public class AndroidExternalApklibExtractingCompiler implements SourceGenerating for (GenerationItem item : generatedItems) { final MyGenerationItem genItem = (MyGenerationItem)item; + final File contentRoot = new File(genItem.getGenContentRootPath()); + final VirtualFile vContentRoot = LocalFileSystem.getInstance().findFileByIoFile(contentRoot); - final File srcRoot = new File(genItem.getGenContentRootPath() + '/' + - AndroidMavenUtil.APK_LIB_ARTIFACT_SOURCE_ROOT); - - final VirtualFile vSrcRoot = LocalFileSystem.getInstance().findFileByIoFile(srcRoot); - if (vSrcRoot != null) { - AndroidCompileUtil.markDirtyAndRefresh(vSrcRoot, true); - AndroidUtils.collectFiles(vSrcRoot, visited, generatedVFiles); + if (vContentRoot != null) { + vContentRoot.refresh(false, true); + final VirtualFile vSrcRoot = vContentRoot.findChild(AndroidMavenUtil.APK_LIB_ARTIFACT_SOURCE_ROOT); + + if (vSrcRoot != null) { + AndroidCompileUtil.markDirty(vSrcRoot, true); + AndroidUtils.collectFiles(vSrcRoot, visited, generatedVFiles); + } } } diff --git a/plugins/android/src/org/jetbrains/android/facet/AndroidRootUtil.java b/plugins/android/src/org/jetbrains/android/facet/AndroidRootUtil.java index ad8cf6f640e0..87a156b89407 100644 --- a/plugins/android/src/org/jetbrains/android/facet/AndroidRootUtil.java +++ b/plugins/android/src/org/jetbrains/android/facet/AndroidRootUtil.java @@ -385,7 +385,7 @@ public class AndroidRootUtil { @Nullable public static String getBuildconfigGenSourceRootPath(@NotNull AndroidFacet facet) { // todo: return correct path for mavenized module when it'll be supported - return getAptGenSourceRootPath(facet); + return getAidlGenSourceRootPath(facet); } @Nullable diff --git a/plugins/android/src/org/jetbrains/android/maven/AndroidMavenUtil.java b/plugins/android/src/org/jetbrains/android/maven/AndroidMavenUtil.java index 330670fc0fc0..3d04807e4ec0 100644 --- a/plugins/android/src/org/jetbrains/android/maven/AndroidMavenUtil.java +++ b/plugins/android/src/org/jetbrains/android/maven/AndroidMavenUtil.java @@ -22,10 +22,13 @@ import com.intellij.util.ArrayUtil; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.idea.maven.model.MavenArtifact; +import org.jetbrains.idea.maven.model.MavenConstants; import org.jetbrains.idea.maven.model.MavenId; import org.jetbrains.idea.maven.project.MavenProject; import java.util.Collection; +import java.util.List; /** * @author Eugene.Kudelevsky @@ -56,7 +59,9 @@ public class AndroidMavenUtil { boolean resultUnderApp = false; for (MavenProject p : allProjects) { - if (p.findDependencies(mavenId).size() > 0) { + final List dependencies = p.findDependencies(mavenId); + + if (dependencies.size() > 0 && containsCompileDependency(dependencies)) { final VirtualFile projectDir = p.getDirectoryFile(); final boolean app = APK_PACKAGING_TYPE.equals(p.getPackaging()); if (path == null || !resultUnderApp && app) { @@ -72,6 +77,15 @@ public class AndroidMavenUtil { return path; } + private static boolean containsCompileDependency(Collection dependencies) { + for (MavenArtifact dependency : dependencies) { + if (MavenConstants.SCOPE_COMPILE.equals(dependency.getScope())) { + return true; + } + } + return false; + } + @NotNull public static String getModuleNameForExtApklibArtifact(MavenId mavenId) { return APKLIB_MODULE_PREFIX + getMavenIdStringForFileName(mavenId);