build/msi/MySQLCA/CustomAction.cs (126 lines of code) (raw):

/* Copyright (c) 2011, 2013 Oracle and/or its affiliates. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; version 2 of the License. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ using System; using System.Collections.Generic; using System.Text; using Microsoft.Deployment.WindowsInstaller; using System.Windows.Forms; using System.IO; using System.Diagnostics; namespace MySQLCA { public class CustomActions { [CustomAction] public static ActionResult PrecompilePythonFiles(Session session) { session.Log("Entering CustomAction: PrecompilePythonFiles"); try { string installpath = GetCustomActionDataArguments(session)[0]; Process proc = new Process(); proc.StartInfo.FileName = installpath + "\\python.exe"; proc.StartInfo.Arguments = "-mcompileall .."; proc.StartInfo.UseShellExecute = true; proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; proc.StartInfo.WorkingDirectory = installpath + "\\python"; proc.Start(); proc.WaitForExit(); } catch (Exception ex) { session.Log("Exception in CustomAction PrecompilePythonFiles: "+ex.Message); return ActionResult.Failure; } session.Log("Exiting CustomAction: PrecompilePythonFiles"); return ActionResult.Success; } [CustomAction] public static ActionResult DeleteFolders(Session session) { ActionResult thisResult = ActionResult.Failure; session.Log("Entering CustomAction: DeleteFolders"); string[] arguments = session.CustomActionData.ToString().Split(','); if (arguments == null || arguments.Length != 1) { session.Log("Error retrieving directories to delete"); } else { session.Log("Attempting to remove directory"); try { string targetDirectory = arguments[0].ToString().TrimEnd('\\'); string targetParent = Directory.GetParent(targetDirectory).FullName; session.Log(String.Format("Deleting: {0}", targetDirectory)); Directory.Delete(targetDirectory, true); session.Log(String.Format("Deleted: {0}", targetDirectory)); session.Log(String.Format("Checking for empty parent: {0}", targetParent)); if (IsDirectoryEmpty(targetParent)) { session.Log(String.Format("Deleting: {0}", targetParent)); Directory.Delete(targetParent, true); session.Log(String.Format("Deleted: {0}", targetParent)); } thisResult = ActionResult.Success; } catch (Exception ex) { session.Log("Exception in CustomAction DeleteFolders: " + ex.Message); thisResult = ActionResult.Failure; } } session.Log("Exiting CustomAction: DeleteFolders"); return thisResult; } [CustomAction] public static ActionResult DeleteFilesWildcard(Session session) { ActionResult thisResult = ActionResult.Failure; session.Log("Entering CustomAction: DeleteFilesWildcard"); string[] arguments = session.CustomActionData.ToString().Split(','); if (arguments == null || arguments.Length != 2) { session.Log("Error retrieving file pattern to delete"); } else { session.Log("Attempting to remove file(s)"); try { string targetDirectory = arguments[0].ToString().TrimEnd('\\'); string targetPattern = arguments[1].ToString(); string[] fileList = Directory.GetFiles(targetDirectory, targetPattern); // Delete files from the list foreach (string f in fileList) { session.Log(String.Format("Deleting: {0}", f)); File.Delete(f); } thisResult = ActionResult.Success; } catch (Exception ex) { session.Log("Exception in CustomAction DeleteFilesWildcard: " + ex.Message); thisResult = ActionResult.Failure; } } session.Log("Exiting CustomAction: DeleteFilesWildcard"); return thisResult; } private static bool IsDirectoryEmpty(string targetDirectory) { bool directoryEmpty = false; if (Directory.Exists(targetDirectory)) { string[] directoryListing = Directory.GetDirectories(targetDirectory); string[] fileListing = Directory.GetFiles(targetDirectory); directoryEmpty = ((directoryListing.Length == 0) && (fileListing.Length == 0)); } return directoryEmpty; } private static string[] GetCustomActionDataArguments(Session session) { string[] keys = new string[session.CustomActionData.Keys.Count]; session.CustomActionData.Keys.CopyTo(keys, 0); return keys[0].Split(','); } } }