From 3e633bb4e247996f7fb546c00c2b64bf2d0d31e4 Mon Sep 17 00:00:00 2001 From: he1pa <18012015693@163.com> Date: Wed, 10 Jul 2024 11:34:43 +0800 Subject: [PATCH] 1. update kcl fmt command. 2. use EnvironmentUtil.getValue to replace System.getenv(), ref: https://stackoverflow.com/questions/26320583/system-getenv-only-works-properly-when-debugging-intellij-plugin Signed-off-by: he1pa <18012015693@163.com> --- .../kcl/action/FormatDirectoryAction.java | 4 ++-- .../kcl/action/FormatSingleFileAction.java | 9 ++++---- .../kusionstack/kcl/util/KCLBinaryUtil.java | 23 +++++++++---------- .../kusionstack/kcl/util/KCLFmtCommand.java | 15 ++++++++---- 4 files changed, 29 insertions(+), 22 deletions(-) diff --git a/src/main/java/io/kusionstack/kcl/action/FormatDirectoryAction.java b/src/main/java/io/kusionstack/kcl/action/FormatDirectoryAction.java index 0f329bb..c8d4cce 100644 --- a/src/main/java/io/kusionstack/kcl/action/FormatDirectoryAction.java +++ b/src/main/java/io/kusionstack/kcl/action/FormatDirectoryAction.java @@ -27,7 +27,7 @@ public void update(@NotNull AnActionEvent e) { VirtualFile vf = e.getData(CommonDataKeys.VIRTUAL_FILE); e.getPresentation().setVisible((vf != null && vf.isDirectory())); // the action button is enabled only when kcl is installed - e.getPresentation().setEnabled(KCLBinaryUtil.KCLFmtCmdInstalled()); + e.getPresentation().setEnabled(KCLBinaryUtil.KCLInstalled()); } @Override @@ -38,7 +38,7 @@ public void actionPerformed(@NotNull AnActionEvent e) { FileDocumentManager.getInstance().saveAllDocuments(); // do kcl fmt VirtualFile file = e.getRequiredData(CommonDataKeys.VIRTUAL_FILE); - KCLFmtCommand.execute(file); + KCLFmtCommand.execute(file, true); VfsUtil.markDirtyAndRefresh(true, true, true, file); } diff --git a/src/main/java/io/kusionstack/kcl/action/FormatSingleFileAction.java b/src/main/java/io/kusionstack/kcl/action/FormatSingleFileAction.java index 86cb501..8b5971a 100644 --- a/src/main/java/io/kusionstack/kcl/action/FormatSingleFileAction.java +++ b/src/main/java/io/kusionstack/kcl/action/FormatSingleFileAction.java @@ -17,6 +17,8 @@ import com.intellij.openapi.vfs.VirtualFile; import org.jetbrains.annotations.NotNull; +import com.intellij.openapi.diagnostic.Logger; + /** * @author amyxia * @version FormatSingleFileAction: FormatSingleFileAction.java, v 0.1 2020年11月04日 10:00 下午 amyxia Exp $ @@ -27,9 +29,9 @@ public void update(@NotNull AnActionEvent e) { // Using the event, evaluate the context, and enable or disable the action. // the action button is visible only when the current file is a kcl file VirtualFile vf = e.getData(CommonDataKeys.VIRTUAL_FILE); - e.getPresentation().setVisible((vf != null && isKCLFile(vf))); + e.getPresentation().setVisible(true); // the action button is enabled only when kcl is installed - e.getPresentation().setEnabled(KCLBinaryUtil.KCLFmtCmdInstalled()); + e.getPresentation().setEnabled(KCLBinaryUtil.KCLInstalled()); } @Override @@ -43,9 +45,8 @@ public void actionPerformed(@NotNull AnActionEvent event) { } else { FileDocumentManager.getInstance().saveAllDocuments(); } - // execute kcl --fmt command to get formatted content - KCLFmtCommand.execute(file); + KCLFmtCommand.execute(file, false); VfsUtil.markDirtyAndRefresh(true, true, true, file); } diff --git a/src/main/java/io/kusionstack/kcl/util/KCLBinaryUtil.java b/src/main/java/io/kusionstack/kcl/util/KCLBinaryUtil.java index c6bac05..cdde0f6 100644 --- a/src/main/java/io/kusionstack/kcl/util/KCLBinaryUtil.java +++ b/src/main/java/io/kusionstack/kcl/util/KCLBinaryUtil.java @@ -5,11 +5,13 @@ import com.google.common.base.Joiner; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.util.EnvironmentUtil; import java.io.BufferedReader; import java.io.File; import java.io.IOException; import java.io.InputStreamReader; +import java.util.Arrays; import java.util.stream.Collectors; /** @@ -20,8 +22,6 @@ public class KCLBinaryUtil { private static final Logger LOGGER = Logger.getInstance(KCLBinaryUtil.class); public static String KCLLocation; public static final String kclCmdName = "kcl"; - public static final String kclFmtCmdName = "kcl-fmt"; - static { KCLInstalled(); } @@ -30,12 +30,8 @@ public static boolean KCLInstalled() { return KCLCmdInstalled(kclCmdName); } - public static boolean KCLFmtCmdInstalled() { - return KCLCmdInstalled(kclFmtCmdName); - } - public static boolean KCLCmdInstalled(String command) { - String[] kclParentPaths = System.getenv("PATH").split(File.pathSeparator); + String[] kclParentPaths = EnvironmentUtil.getValue("PATH").split(File.pathSeparator); for (String location :kclParentPaths) { File file = new File(Joiner.on(File.separator).join(location, command)); if (file.exists()) { @@ -46,16 +42,19 @@ public static boolean KCLCmdInstalled(String command) { } return false; } - public static ExecuteResult execKCLCmd(String command, String... options) { - if (!KCLCmdInstalled(command)) { - LOGGER.error(String.format("KCL command %s is not installed. Cannot execute.", command)); + public static ExecuteResult execKCLSubCmd(String subCommand, String... options) { + if (!KCLInstalled()) { + LOGGER.error(String.format("KCL command %s is not installed. Cannot execute.", subCommand)); return ExecuteResult.KCLNotInstalled(); } // assemble the KCL command from filePath & options - String[] cmd = new String[1 + options.length]; + String[] cmd = new String[2 + options.length]; + cmd[0] = KCLLocation; - System.arraycopy(options, 0, cmd, 1, options.length); + cmd[1] = subCommand; + System.arraycopy(options, 0, cmd, 2, options.length); try { + LOGGER.info(String.format("run cmd %s ", Arrays.toString(cmd))); Process process = Runtime.getRuntime().exec(cmd); process.waitFor(); if (process.exitValue() == 0) { diff --git a/src/main/java/io/kusionstack/kcl/util/KCLFmtCommand.java b/src/main/java/io/kusionstack/kcl/util/KCLFmtCommand.java index 4655117..1f23f89 100644 --- a/src/main/java/io/kusionstack/kcl/util/KCLFmtCommand.java +++ b/src/main/java/io/kusionstack/kcl/util/KCLFmtCommand.java @@ -7,6 +7,8 @@ import com.intellij.openapi.vfs.VirtualFile; import org.jetbrains.annotations.NotNull; +import java.util.Arrays; + /** * @author amyxia * @version KCLFmtCommand: KCLFmtCommand.java, v 0.1 2020年12月03日 2:53 下午 amyxia Exp $ @@ -14,11 +16,16 @@ public class KCLFmtCommand { private static final Logger LOGGER = Logger.getInstance(KCLFmtCommand.class); - public static boolean execute(@NotNull VirtualFile virtualFile) { - String[] options = {virtualFile.getCanonicalPath(), "-R"}; - ExecuteResult result = KCLBinaryUtil.execKCLCmd("kcl-fmt", options); + public static boolean execute(@NotNull VirtualFile virtualFile, boolean isDirectory) { + String path = virtualFile.getCanonicalPath(); + LOGGER.info(String.format("path: %s", isDirectory)); + if (isDirectory){ + path = path.concat("..."); + } + + ExecuteResult result = KCLBinaryUtil.execKCLSubCmd("fmt", path); if (!result.isSuccess()) { - LOGGER.error(String.format("kcl-fmt %s -R exec failed, err msg: %s", virtualFile.getPath(), result.getStderr())); + LOGGER.error(String.format("kcl fmt %s exec failed, err msg: %s", virtualFile.getPath(), result.getStderr())); } return result.isSuccess(); }