/* * Copyright 2003-2011 JetBrains s.r.o. * * 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 jetbrains.mps.build; import jetbrains.mps.util.FileUtil; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.lang.String; import java.util.*; public class GenerateNSI { private final List<File> myBaseDirs = new ArrayList<File>(); private final File myCurrentDir; private final String myInput; private final String myOutput; public static void main(String[] args) throws IOException { new GenerateNSI(args).generate(); } public GenerateNSI(String[] args) { for (int i = 2; i < args.length; i++) { myBaseDirs.add(new File(args[i])); } myCurrentDir = new File(""); myInput = args[0]; myOutput = args[1]; } public void generate() throws IOException { generateInstFile(); generateUninstFile(); } private static class FileComparator implements Comparator<File> { @Override public int compare(File file1, File file2) { return file1.getAbsolutePath().compareTo(file2.getAbsolutePath()); } } private String getRelativePath(String path, File basedir) { return getRelativePath(path, basedir.getAbsolutePath()); } private String getRelativePath(String path, String basePath) { if (!path.startsWith(basePath)) { return path; } String rPath = path.substring(basePath.length(), path.length()); if (rPath.startsWith(File.separator)) { rPath = rPath.substring(1, rPath.length()); } return rPath; } private void generateUninstFile() throws IOException { BufferedWriter uninstWriter = new BufferedWriter(new FileWriter(myOutput)); try { for (File basedir : myBaseDirs) { if (basedir.isDirectory()) { generateUninstFilePart(uninstWriter, basedir); } else { generateUninstFilePartForFile(uninstWriter, basedir); } } uninstWriter.newLine(); uninstWriter.write("RmDir \"$INSTDIR\""); } finally { uninstWriter.close(); } } private void generateUninstFilePartForFile(BufferedWriter uninstWriter, File file) throws IOException { uninstWriter.newLine(); uninstWriter.write("Delete \"$INSTDIR\\" + file.getName() + "\""); } private void generateUninstFilePart(BufferedWriter uninstWriter, File basedir) throws IOException { List<File> allFiles = getAllFiles(basedir); Collections.sort(allFiles, new FileComparator()); for (File file : allFiles) { uninstWriter.newLine(); uninstWriter.write("Delete \"$INSTDIR\\" + getRelativePath(file.getAbsolutePath(), basedir) + "\""); } uninstWriter.newLine(); List<File> dirs = getAllDirs(basedir); Collections.sort(dirs, new FileComparator()); for (int i = dirs.size() - 1; i >= 0; i--) { final File dir = dirs.get(i); if (dir.getAbsolutePath().length() == 0) continue; uninstWriter.newLine(); uninstWriter.write("RmDir \"$INSTDIR\\" + getRelativePath(dir.getAbsolutePath(), basedir) + "\""); } } private void generateInstFile() throws IOException { BufferedWriter instWriter = new BufferedWriter(new FileWriter(myInput)); try { for (File basedir : myBaseDirs) { if (basedir.isDirectory()) { generateInstFilePart(instWriter, basedir); } else { generateInstFilePartForAFile(instWriter, basedir); } } } finally { instWriter.close(); } } private void generateInstFilePartForAFile(BufferedWriter instWriter, File file) throws IOException { instWriter.newLine(); instWriter.newLine(); instWriter.write("SetOutPath $INSTDIR"); instWriter.newLine(); instWriter.write("File \"" + getRelativePath(file.getAbsolutePath(), myCurrentDir.getAbsolutePath()) + "\""); } private void generateInstFilePart(BufferedWriter instWriter, File basedir) throws IOException { Collection<File> dirs = getAllDirs(basedir); for (File dir : dirs) { final File[] files = dir.listFiles(); if (files.length == 0) continue; instWriter.newLine(); instWriter.newLine(); if (dir.getAbsolutePath().length() > basedir.getAbsolutePath().length()) { instWriter.write("SetOutPath \"$INSTDIR\\" + getRelativePath(dir.getAbsolutePath(), basedir) + "\""); } else { instWriter.write("SetOutPath $INSTDIR"); } for (File file : files) { if (!file.isDirectory()) { instWriter.newLine(); instWriter.write("File \"" + getRelativePath(file.getAbsolutePath(), myCurrentDir.getAbsolutePath()) + "\""); } } } } private List<File> getAllFiles(File basedir) { return getAllFiles(basedir, new LinkedList<File>()); } private List<File> getAllFiles(File dir, List<File> list) { File[] files = dir.listFiles(); for (File f : files) { if (!f.isDirectory()) { list.add(f); } else if (!FileUtil.isIgnoredDir(f.getName())) { getAllFiles(f, list); } } return list; } private ArrayList<File> getAllDirs(File basedir) { return getAllDirs(basedir, new ArrayList<File>()); } private ArrayList<File> getAllDirs(File dir, ArrayList<File> list) { if (FileUtil.isIgnoredDir(dir.getName())) return list; list.add(dir); File[] files = dir.listFiles(); for (File f : files) { if (f.isDirectory()) { getAllDirs(f, list); } } return list; } }