From bedb5d8995369a11a53fa748a0f0ca30941baaf9 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Wed, 18 Sep 2013 18:46:27 +0200 Subject: [PATCH] move NsiFiles helper task to community --- build/build.iml | 1 + build/lib/NsiFiles.jar | Bin 0 -> 4180 bytes .../internalUtilities/ant/NsiFiles.java | 198 ++++++++++++++++++ 3 files changed, 199 insertions(+) create mode 100644 build/lib/NsiFiles.jar create mode 100644 build/src/com/intellij/internalUtilities/ant/NsiFiles.java diff --git a/build/build.iml b/build/build.iml index d1dd857397f0..8c1854cb3e68 100644 --- a/build/build.iml +++ b/build/build.iml @@ -4,6 +4,7 @@ + diff --git a/build/lib/NsiFiles.jar b/build/lib/NsiFiles.jar new file mode 100644 index 0000000000000000000000000000000000000000..1c51e070d67fa5a40ca87c486a85655537fe81ef GIT binary patch literal 4180 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 myFileSets = new ArrayList(); + private final Map> myDirToFiles = new LinkedHashMap>(); + private final Map myAbsoluteToRelative = new HashMap(); + + /** + * The file to create; required + * @param nsiFile new file to generate file install list to. + */ + public void setInstFile(File nsiFile) { + myInstFile = nsiFile; + } + + /** + * The file to create; required + * @param nsiFile new file to generate file uninstall list to. + */ + public void setUninstFile(File nsiFile) { + myUnInstFile = nsiFile; + } + + /** + * ;optional + * @param fileSet to be included in processing + */ + public void addFileSet(FileSet fileSet) { + myFileSets.add(fileSet); + } + + /** + * ;optional + * @param baseDir of the files to be processed. + */ + public void setBaseDir(File baseDir) { + myBaseDir = baseDir; + } + + public void execute() throws BuildException { + if (myInstFile == null) throw new BuildException("Specify required isntFile attribute."); + if (myUnInstFile == null) throw new BuildException("Specify required unisntFile attribute."); + + if (myBaseDir == null && myFileSets.size() == 0) { + throw new BuildException("basedir attribute must be set, " + + "or at least " + + "one fileset must be given!"); + } + + try { + if (myBaseDir != null) { + FileSet fs = (FileSet) getImplicitFileSet().clone(); + fs.setDir(myBaseDir); + processFileSet(fs); + } + + for (FileSet fileSet : myFileSets) { + processFileSet(fileSet); + } + + generateInstFile(); + generateUninstFile(); + } + catch (IOException e) { + throw new BuildException(e); + } + finally { + cleanup(); + } + } + + private void generateUninstFile() throws IOException { + BufferedWriter uninstWriter = new BufferedWriter(new FileWriter(myUnInstFile)); + try { + List allFiles = new ArrayList(); + final Collection> lists = myDirToFiles.values(); + for (final List list : lists) { + allFiles.addAll(list); + } + + Collections.sort(allFiles); + for (String file : allFiles) { + uninstWriter.newLine(); + final String relPath = myAbsoluteToRelative.get(file); + uninstWriter.write("Delete \"$INSTDIR\\" + relPath + "\""); + if (relPath.endsWith(".py")) { + uninstWriter.newLine(); + uninstWriter.write("Delete \"$INSTDIR\\" + relPath + "c\""); // .pyc + } + } + + uninstWriter.newLine(); + List dirs = new ArrayList(myDirToFiles.keySet()); + Collections.sort(dirs); + for (int i = dirs.size() - 1; i >= 0; i--) { + final String dir = dirs.get(i); + if (dir.length() == 0) continue; + uninstWriter.newLine(); + uninstWriter.write("RmDir /r \"$INSTDIR\\" + dir + "\\__pycache__\""); + uninstWriter.newLine(); + uninstWriter.write("RmDir \"$INSTDIR\\" + dir + "\""); + } + uninstWriter.newLine(); + uninstWriter.write("RmDir \"$INSTDIR\""); + } + finally{ + uninstWriter.close(); + } + } + + private void generateInstFile() throws IOException { + BufferedWriter instWriter = new BufferedWriter(new FileWriter(myInstFile)); + try { + Collection dirs = myDirToFiles.keySet(); + for (String dir : dirs) { + final List files = myDirToFiles.get(dir); + if (files.size() == 0) continue; + instWriter.newLine(); + instWriter.newLine(); + if (dir.length() > 0) { + instWriter.write("SetOutPath $INSTDIR\\" + dir); + } + else { + instWriter.write("SetOutPath $INSTDIR"); + } + + for (String file : files) { + instWriter.newLine(); + instWriter.write("File \"" + file + "\""); + } + } + } + finally { + instWriter.close(); + } + } + + private void processFileSet(final FileSet fileSet) throws IOException { + final DirectoryScanner scanner = fileSet.getDirectoryScanner(getProject()); + final String[] files = scanner.getIncludedFiles(); + String base = fileSet.getDir(getProject()).getCanonicalPath() + "\\"; + for (String file : files) { + String lastDir = ""; + getDirFileList(lastDir); + int idx = -1; + do { + idx = file.indexOf('\\', idx + 1); + if (idx == -1) break; + lastDir = file.substring(0, idx); + getDirFileList(lastDir); + } + while (true); + + List fileList = getDirFileList(lastDir); + final String absolute = base + file; + fileList.add(absolute); + myAbsoluteToRelative.put(absolute, file); + } + } + + private List getDirFileList(final String dir) { + List fileList = myDirToFiles.get(dir); + if (fileList == null) { + fileList = new ArrayList(); + myDirToFiles.put(dir, fileList); + } + return fileList; + } + + private void cleanup() { + myBaseDir = null; + myInstFile = null; + myFileSets.clear(); + myDirToFiles.clear(); + myAbsoluteToRelative.clear(); + } +}