summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOluwatobi Bashir-Bello <nbashirbello@google.com>2014-08-14 13:58:27 -0400
committerOluwatobi Bashir-Bello <nbashirbello@google.com>2014-08-15 12:08:58 -0400
commitb9f98cdc24dbecc75b6b0d3684a54f85bdae17ad (patch)
tree259170c344057632ca474760bae8c9efab26d54f
parent7e3d46f3b677817867642ef650aadfa2f3d8a6fb (diff)
downloadcloud-b9f98cdc24dbecc75b6b0d3684a54f85bdae17ad.tar.gz
Add functionality to export the IDEA settings into a specified file.
Change-Id: I9051f33b0f867df0c063f24c2aff351605e677f8
-rw-r--r--src/com/google/gct/idea/settings/ExportSettings.java115
1 files changed, 115 insertions, 0 deletions
diff --git a/src/com/google/gct/idea/settings/ExportSettings.java b/src/com/google/gct/idea/settings/ExportSettings.java
new file mode 100644
index 0000000..6228f25
--- /dev/null
+++ b/src/com/google/gct/idea/settings/ExportSettings.java
@@ -0,0 +1,115 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.google.gct.idea.settings;
+
+import com.intellij.ide.IdeBundle;
+import com.intellij.ide.plugins.IdeaPluginDescriptor;
+import com.intellij.ide.plugins.PluginManager;
+import com.intellij.ide.plugins.PluginManagerCore;
+import com.intellij.openapi.application.ApplicationManager;
+import com.intellij.openapi.application.PathManager;
+import com.intellij.openapi.components.ExportableApplicationComponent;
+import com.intellij.openapi.components.ExportableComponent;
+import com.intellij.openapi.components.ServiceBean;
+import com.intellij.openapi.ui.Messages;
+import com.intellij.openapi.util.io.FileUtil;
+import com.intellij.util.containers.ContainerUtil;
+import com.intellij.util.io.ZipUtil;
+
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.*;
+import java.util.jar.JarOutputStream;
+
+/**
+ * Provides functionality to export the IDEA settings into a specified jar
+ */
+public class ExportSettings {
+ // TODO: use ImportSettings.SETTINGS_JAR_MARKER after merge
+ public static final String SETTINGS_JAR_MARKER = "IntelliJ IDEA Global Settings";
+
+ public static void doExport(String path) {
+ final Set<ExportableComponent> exportableComponents =
+ new HashSet<ExportableComponent>(Arrays.asList(ApplicationManager.getApplication().getComponents(ExportableApplicationComponent.class)));
+ exportableComponents.addAll(ServiceBean.loadServicesFromBeans(ExportableComponent.EXTENSION_POINT, ExportableComponent.class));
+
+ if (exportableComponents.isEmpty()) {
+ return;
+ }
+
+ Set<File> exportFiles = new HashSet<File>();
+ for (final ExportableComponent markedComponent : exportableComponents) {
+ ContainerUtil.addAll(exportFiles, markedComponent.getExportFiles());
+ }
+
+ ApplicationManager.getApplication().saveSettings();
+
+ final File saveFile = new File(path);
+ try {
+ if (saveFile.exists()) {
+ final int ret = Messages
+ .showOkCancelDialog(IdeBundle.message("prompt.overwrite.settings.file", FileUtil.toSystemDependentName(saveFile.getPath())),
+ IdeBundle.message("title.file.already.exists"), Messages.getWarningIcon());
+ if (ret != Messages.OK) return;
+ }
+
+ final JarOutputStream output = new JarOutputStream(new FileOutputStream(saveFile));
+ try {
+ final File configPath = new File(PathManager.getConfigPath());
+ final HashSet<String> writtenItemRelativePaths = new HashSet<String>();
+ for (File file : exportFiles) {
+ final String rPath = FileUtil.getRelativePath(configPath, file);
+ assert rPath != null;
+ final String relativePath = FileUtil.toSystemIndependentName(rPath);
+ if (file.exists()) {
+ ZipUtil.addFileOrDirRecursively(output, saveFile, file, relativePath, null, writtenItemRelativePaths);
+ }
+ }
+
+ exportInstalledPlugins(saveFile, output, writtenItemRelativePaths);
+
+ final File magicFile = new File(FileUtil.getTempDirectory(), SETTINGS_JAR_MARKER);
+ FileUtil.createIfDoesntExist(magicFile);
+ magicFile.deleteOnExit();
+ ZipUtil.addFileToZip(output, magicFile, SETTINGS_JAR_MARKER, writtenItemRelativePaths, null);
+ }
+ finally {
+ output.close();
+ }
+ }
+ catch (IOException e1) {
+ Messages.showErrorDialog(IdeBundle.message("error.writing.settings", e1.toString()),IdeBundle.message("title.error.writing.file"));
+ }
+
+ }
+
+ private static void exportInstalledPlugins(File saveFile, JarOutputStream output, HashSet<String> writtenItemRelativePaths) throws IOException {
+ final List<String> oldPlugins = new ArrayList<String>();
+ for (IdeaPluginDescriptor descriptor : PluginManagerCore.getPlugins()) {
+ if (!descriptor.isBundled() && descriptor.isEnabled()) {
+ oldPlugins.add(descriptor.getPluginId().getIdString());
+ }
+ }
+ if (!oldPlugins.isEmpty()) {
+ final File tempFile = File.createTempFile("installed", "plugins");
+ tempFile.deleteOnExit();
+ PluginManagerCore.savePluginsList(oldPlugins, false, tempFile);
+ ZipUtil.addDirToZipRecursively(output, saveFile, tempFile, "/" + PluginManager.INSTALLED_TXT, null, writtenItemRelativePaths);
+ }
+ }
+}