[platform] common code for reading project name

Fixes NPE (in JPS( and weird names (like 'W')

GitOrigin-RevId: 54837027fffe7c1bcc55067511af54d9ee6bc2cd
This commit is contained in:
Roman Shevchenko
2019-12-12 23:13:53 +00:00
committed by intellij-monorepo-bot
parent a9329dce96
commit c9d5bcb40c
5 changed files with 46 additions and 44 deletions
@@ -9,7 +9,11 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Set;
import java.util.stream.Stream;
/**
* @author nik
@@ -84,4 +88,20 @@ public class JpsPathUtil {
public static boolean isJrtUrl(@NotNull String url) {
return url.startsWith("jrt://");
}
public static @Nullable String readProjectName(@NotNull Path projectDir) {
try (Stream<String> stream = Files.lines(projectDir.resolve(".name"))) {
return stream.findFirst().map(String::trim).orElse(null);
}
catch (IOException e) {
return null;
}
}
public static final String UNNAMED_PROJECT = "<unnamed>";
public static @NotNull String getDefaultProjectName(@NotNull Path projectDir) {
Path parent = projectDir.getParent();
return parent != null ? parent.getFileName().toString() : UNNAMED_PROJECT;
}
}
@@ -33,6 +33,7 @@ import org.jetbrains.jps.model.serialization.module.JpsModulePropertiesSerialize
import org.jetbrains.jps.model.serialization.module.JpsModuleRootModelSerializer;
import org.jetbrains.jps.model.serialization.runConfigurations.JpsRunConfigurationSerializer;
import org.jetbrains.jps.service.SharedThreadPool;
import org.jetbrains.jps.util.JpsPathUtil;
import java.io.File;
import java.io.IOException;
@@ -43,7 +44,6 @@ import java.nio.file.Paths;
import java.util.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Future;
import java.util.stream.Stream;
/**
* @author nik
@@ -101,15 +101,8 @@ public class JpsProjectLoader extends JpsLoaderBase {
@NotNull
public static String getDirectoryBaseProjectName(@NotNull Path dir) {
try (Stream<String> stream = Files.lines(dir.resolve(".name"))) {
String value = stream.findFirst().map(String::trim).orElse(null);
if (value != null) {
return value;
}
}
catch (IOException ignored) { }
Path parent = dir.getParent();
return (parent == null ? dir : parent).getFileName().toString();
String name = JpsPathUtil.readProjectName(dir);
return name != null ? name : JpsPathUtil.getDefaultProjectName(dir);
}
@Nullable
@@ -19,12 +19,15 @@ import com.intellij.openapi.vfs.ReadonlyStatusHandler
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.util.PathUtilRt
import com.intellij.util.SmartList
import com.intellij.util.containers.computeIfAny
import com.intellij.util.io.*
import com.intellij.util.io.delete
import com.intellij.util.io.isDirectory
import com.intellij.util.io.systemIndependentPath
import com.intellij.util.io.write
import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.launch
import org.jetbrains.annotations.ApiStatus
import org.jetbrains.annotations.CalledInAny
import org.jetbrains.jps.util.JpsPathUtil
import java.nio.file.AccessDeniedException
import java.nio.file.Path
import java.nio.file.Paths
@@ -53,18 +56,18 @@ open class ProjectStoreImpl(project: Project) : ProjectStoreBase(project) {
return PathUtilRt.getFileName(projectFilePath).removeSuffix(ProjectFileType.DOT_DEFAULT_EXTENSION)
}
val baseDir = projectBasePath
val nameFile = nameFile
if (nameFile.exists()) {
LOG.runAndLogException { readProjectNameFile(nameFile) }?.let {
lastSavedProjectName = it
return it
}
val projectDir = nameFile.parent
val storedName = JpsPathUtil.readProjectName(projectDir)
if (storedName != null) {
lastSavedProjectName = storedName
return storedName
}
return ProjectNameProvider.EP_NAME.extensionList.computeIfAny {
LOG.runAndLogException { it.getDefaultName(project) }
} ?: PathUtilRt.getFileName(baseDir).replace(":", "")
val computedName = ProjectNameProvider.EP_NAME.iterable.asSequence()
.map { LOG.runAndLogException { it.getDefaultName(project) } }
.find { it != null }
return computedName ?: JpsPathUtil.getDefaultProjectName(projectDir)
}
private suspend fun saveProjectName() {
@@ -20,7 +20,6 @@ import com.intellij.openapi.ui.Messages
import com.intellij.openapi.vfs.LocalFileSystem
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.util.io.createDirectories
import com.intellij.util.io.inputStream
import com.intellij.util.io.systemIndependentPath
import gnu.trove.THashSet
import org.jetbrains.annotations.ApiStatus
@@ -149,10 +148,4 @@ inline fun <T> runAsWriteActionIfNeeded(crossinline runnable: () -> T): T {
ApplicationManager.getApplication().isWriteAccessAllowed -> runnable()
else -> runWriteAction(runnable)
}
}
@Throws(IOException::class)
@ApiStatus.Internal
fun readProjectNameFile(nameFile: Path): String? {
return nameFile.inputStream().reader().useLines { line -> line.firstOrNull { !it.isEmpty() }?.trim() }
}
@@ -1,7 +1,6 @@
// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package com.intellij.ide
import com.intellij.configurationStore.readProjectNameFile
import com.intellij.ide.impl.OpenProjectTask
import com.intellij.ide.impl.ProjectUtil
import com.intellij.ide.ui.UISettings
@@ -19,7 +18,6 @@ import com.intellij.openapi.diagnostic.runAndLogException
import com.intellij.openapi.project.Project
import com.intellij.openapi.project.ProjectManager
import com.intellij.openapi.project.ProjectManagerListener
import com.intellij.openapi.project.impl.ProjectImpl
import com.intellij.openapi.util.ModificationTracker
import com.intellij.openapi.util.SystemInfo
import com.intellij.openapi.util.io.FileUtilRt
@@ -42,10 +40,13 @@ import com.intellij.util.ui.UIUtil
import gnu.trove.THashMap
import gnu.trove.THashSet
import org.jetbrains.annotations.ApiStatus.Internal
import org.jetbrains.jps.util.JpsPathUtil
import java.awt.image.BufferedImage
import java.io.IOException
import java.nio.ByteBuffer
import java.nio.file.*
import java.nio.file.Files
import java.nio.file.Path
import java.nio.file.Paths
import java.nio.file.StandardCopyOption
import java.util.*
import java.util.concurrent.atomic.AtomicLong
import javax.imageio.IIOImage
@@ -573,17 +574,9 @@ private fun readProjectName(path: String): String {
return FileUtilRt.getNameWithoutExtension(file.fileName.toString())
}
val nameFile = file.resolve(Project.DIRECTORY_STORE_FOLDER).resolve(ProjectImpl.NAME_FILE)
try {
val result = readProjectNameFile(nameFile)
if (result != null) {
return result
}
}
catch (ignore: NoSuchFileException) { }
catch (ignored: IOException) { }
return file.fileName?.toString() ?: "<unknown>"
val projectDir = file.resolve(Project.DIRECTORY_STORE_FOLDER)
return JpsPathUtil.readProjectName(projectDir) ?:
JpsPathUtil.getDefaultProjectName(projectDir)
}
private fun getLastProjectFrameInfoFile() = appSystemDir.resolve("lastProjectFrameInfo")