contrib/packaging/inno/modpath.iss
author Gregory Szorc <gregory.szorc@gmail.com>
Sun, 03 Mar 2019 18:19:07 -0800
changeset 41858 d7dc4ac1ff84
parent 41852 0f49b56d5d74
child 44010 109315c41d5e
permissions -rw-r--r--
inno: script to automate building Inno installer The official Inno installer build process is poorly documented. And attempting to reproduce behavior of the installer uploaded to www.mercurial-scm.org has revealed a number of unexpected behaviors. This commit attempts to improve the state of reproducibility of the Inno installer by introducing a Python script to largely automate the building of the installer. The new script (which must be run from an environment with the Visual C++ environment configured) takes care of producing an Inno installer. When run from a fresh Mercurial source checkout with all the proper system dependencies (the VC++ toolchain, Windows 10 SDK, and Inno tools) installed, it "just works." The script takes care of downloading all the Python dependencies in a secure manner and manages the build environment for you. You don't need any additional config files: just launch the script, pointing it at an existing Python and ISCC binary and it takes care of the rest. The produced installer creates a Mercurial installation with a handful of differences from the existing 4.9 installers (produced by someone else): * add_path.exe is missing (this was removed a few changesets ago) * The set of api-ms-win-core-* DLLs is different (I suspect this is due to me using a different UCRT / Windows version). * kernelbase.dll and msasn1.dll are missing. * There are a different set of .pyc files for dulwich, keyring, and pygments due to us using the latest versions of each. * We include Tcl/Tk DLLs and .pyc files (I'm not sure why these are missing from the existing installers). * We include the urllib3 and win32ctypes packages (which are dependencies of dulwich and pywin32, respectively). I'm not sure why these aren't present in the existing installers. * We include a different set of files for the distutils package. I'm not sure why. But it should be harmless. * We include the docutils package (it is getting picked up as a dependency somehow). I think this is fine. * We include a copy of argparse.pyc. I'm not sure why this was missing from existing installers. * We don't have a copy of sqlite3/dump.pyc. I'm not sure why. The SQLite C extension code only imports this module when conn.iterdump() is called. It should be safe to omit. * We include files in the email.test and test packages. The set of files is small and their presence should be harmless. The new script and support code is written in Python 3 because it is brand new and independent code and I don't believe new Python projects should be using Python 2 in 2019 if they have a choice about it. The readme.txt file has been renamed to readme.rst and overhauled to reflect the existence of build.py. Differential Revision: https://phab.mercurial-scm.org/D6066
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
41852
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
     1
// ----------------------------------------------------------------------------
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
     2
//
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
     3
// Inno Setup Ver:	5.4.2
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
     4
// Script Version:	1.4.2
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
     5
// Author:			Jared Breland <jbreland@legroom.net>
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
     6
// Homepage:		http://www.legroom.net/software
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
     7
// License:			GNU Lesser General Public License (LGPL), version 3
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
     8
//						http://www.gnu.org/licenses/lgpl.html
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
     9
//
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    10
// Script Function:
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    11
//	Allow modification of environmental path directly from Inno Setup installers
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    12
//
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    13
// Instructions:
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    14
//	Copy modpath.iss to the same directory as your setup script
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    15
//
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    16
//	Add this statement to your [Setup] section
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    17
//		ChangesEnvironment=true
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    18
//
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    19
//	Add this statement to your [Tasks] section
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    20
//	You can change the Description or Flags
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    21
//	You can change the Name, but it must match the ModPathName setting below
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    22
//		Name: modifypath; Description: &Add application directory to your environmental path; Flags: unchecked
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    23
//
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    24
//	Add the following to the end of your [Code] section
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    25
//	ModPathName defines the name of the task defined above
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    26
//	ModPathType defines whether the 'user' or 'system' path will be modified;
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    27
//		this will default to user if anything other than system is set
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    28
//	setArrayLength must specify the total number of dirs to be added
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    29
//	Result[0] contains first directory, Result[1] contains second, etc.
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    30
//		const
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    31
//			ModPathName = 'modifypath';
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    32
//			ModPathType = 'user';
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    33
//
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    34
//		function ModPathDir(): TArrayOfString;
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    35
//		begin
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    36
//			setArrayLength(Result, 1);
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    37
//			Result[0] := ExpandConstant('{app}');
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    38
//		end;
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    39
//		#include "modpath.iss"
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    40
// ----------------------------------------------------------------------------
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    41
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    42
procedure ModPath();
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    43
var
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    44
	oldpath:	String;
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    45
	newpath:	String;
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    46
	updatepath:	Boolean;
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    47
	pathArr:	TArrayOfString;
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    48
	aExecFile:	String;
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    49
	aExecArr:	TArrayOfString;
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    50
	i, d:		Integer;
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    51
	pathdir:	TArrayOfString;
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    52
	regroot:	Integer;
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    53
	regpath:	String;
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    54
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    55
begin
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    56
	// Get constants from main script and adjust behavior accordingly
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    57
	// ModPathType MUST be 'system' or 'user'; force 'user' if invalid
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    58
	if ModPathType = 'system' then begin
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    59
		regroot := HKEY_LOCAL_MACHINE;
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    60
		regpath := 'SYSTEM\CurrentControlSet\Control\Session Manager\Environment';
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    61
	end else begin
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    62
		regroot := HKEY_CURRENT_USER;
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    63
		regpath := 'Environment';
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    64
	end;
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    65
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    66
	// Get array of new directories and act on each individually
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    67
	pathdir := ModPathDir();
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    68
	for d := 0 to GetArrayLength(pathdir)-1 do begin
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    69
		updatepath := true;
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    70
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    71
		// Modify WinNT path
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    72
		if UsingWinNT() = true then begin
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    73
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    74
			// Get current path, split into an array
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    75
			RegQueryStringValue(regroot, regpath, 'Path', oldpath);
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    76
			oldpath := oldpath + ';';
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    77
			i := 0;
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    78
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    79
			while (Pos(';', oldpath) > 0) do begin
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    80
				SetArrayLength(pathArr, i+1);
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    81
				pathArr[i] := Copy(oldpath, 0, Pos(';', oldpath)-1);
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    82
				oldpath := Copy(oldpath, Pos(';', oldpath)+1, Length(oldpath));
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    83
				i := i + 1;
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    84
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    85
				// Check if current directory matches app dir
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    86
				if pathdir[d] = pathArr[i-1] then begin
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    87
					// if uninstalling, remove dir from path
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    88
					if IsUninstaller() = true then begin
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    89
						continue;
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    90
					// if installing, flag that dir already exists in path
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    91
					end else begin
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    92
						updatepath := false;
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    93
					end;
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    94
				end;
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    95
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    96
				// Add current directory to new path
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    97
				if i = 1 then begin
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    98
					newpath := pathArr[i-1];
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    99
				end else begin
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   100
					newpath := newpath + ';' + pathArr[i-1];
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   101
				end;
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   102
			end;
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   103
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   104
			// Append app dir to path if not already included
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   105
			if (IsUninstaller() = false) AND (updatepath = true) then
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   106
				newpath := newpath + ';' + pathdir[d];
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   107
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   108
			// Write new path
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   109
			RegWriteStringValue(regroot, regpath, 'Path', newpath);
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   110
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   111
		// Modify Win9x path
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   112
		end else begin
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   113
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   114
			// Convert to shortened dirname
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   115
			pathdir[d] := GetShortName(pathdir[d]);
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   116
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   117
			// If autoexec.bat exists, check if app dir already exists in path
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   118
			aExecFile := 'C:\AUTOEXEC.BAT';
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   119
			if FileExists(aExecFile) then begin
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   120
				LoadStringsFromFile(aExecFile, aExecArr);
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   121
				for i := 0 to GetArrayLength(aExecArr)-1 do begin
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   122
					if IsUninstaller() = false then begin
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   123
						// If app dir already exists while installing, skip add
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   124
						if (Pos(pathdir[d], aExecArr[i]) > 0) then
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   125
							updatepath := false;
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   126
							break;
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   127
					end else begin
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   128
						// If app dir exists and = what we originally set, then delete at uninstall
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   129
						if aExecArr[i] = 'SET PATH=%PATH%;' + pathdir[d] then
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   130
							aExecArr[i] := '';
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   131
					end;
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   132
				end;
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   133
			end;
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   134
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   135
			// If app dir not found, or autoexec.bat didn't exist, then (create and) append to current path
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   136
			if (IsUninstaller() = false) AND (updatepath = true) then begin
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   137
				SaveStringToFile(aExecFile, #13#10 + 'SET PATH=%PATH%;' + pathdir[d], True);
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   138
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   139
			// If uninstalling, write the full autoexec out
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   140
			end else begin
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   141
				SaveStringsToFile(aExecFile, aExecArr, False);
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   142
			end;
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   143
		end;
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   144
	end;
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   145
end;
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   146
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   147
// Split a string into an array using passed delimeter
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   148
procedure MPExplode(var Dest: TArrayOfString; Text: String; Separator: String);
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   149
var
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   150
	i: Integer;
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   151
begin
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   152
	i := 0;
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   153
	repeat
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   154
		SetArrayLength(Dest, i+1);
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   155
		if Pos(Separator,Text) > 0 then	begin
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   156
			Dest[i] := Copy(Text, 1, Pos(Separator, Text)-1);
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   157
			Text := Copy(Text, Pos(Separator,Text) + Length(Separator), Length(Text));
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   158
			i := i + 1;
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   159
		end else begin
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   160
			 Dest[i] := Text;
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   161
			 Text := '';
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   162
		end;
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   163
	until Length(Text)=0;
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   164
end;
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   165
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   166
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   167
procedure CurStepChanged(CurStep: TSetupStep);
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   168
var
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   169
	taskname:	String;
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   170
begin
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   171
	taskname := ModPathName;
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   172
	if CurStep = ssPostInstall then
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   173
		if IsTaskSelected(taskname) then
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   174
			ModPath();
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   175
end;
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   176
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   177
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   178
var
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   179
	aSelectedTasks:	TArrayOfString;
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   180
	i:				Integer;
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   181
	taskname:		String;
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   182
	regpath:		String;
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   183
	regstring:		String;
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   184
	appid:			String;
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   185
begin
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   186
	// only run during actual uninstall
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   187
	if CurUninstallStep = usUninstall then begin
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   188
		// get list of selected tasks saved in registry at install time
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   189
		appid := '{#emit SetupSetting("AppId")}';
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   190
		if appid = '' then appid := '{#emit SetupSetting("AppName")}';
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   191
		regpath := ExpandConstant('Software\Microsoft\Windows\CurrentVersion\Uninstall\'+appid+'_is1');
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   192
		RegQueryStringValue(HKLM, regpath, 'Inno Setup: Selected Tasks', regstring);
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   193
		if regstring = '' then RegQueryStringValue(HKCU, regpath, 'Inno Setup: Selected Tasks', regstring);
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   194
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   195
		// check each task; if matches modpath taskname, trigger patch removal
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   196
		if regstring <> '' then begin
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   197
			taskname := ModPathName;
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   198
			MPExplode(aSelectedTasks, regstring, ',');
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   199
			if GetArrayLength(aSelectedTasks) > 0 then begin
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   200
				for i := 0 to GetArrayLength(aSelectedTasks)-1 do begin
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   201
					if comparetext(aSelectedTasks[i], taskname) = 0 then
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   202
						ModPath();
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   203
				end;
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   204
			end;
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   205
		end;
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   206
	end;
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   207
end;
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   208
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   209
function NeedRestart(): Boolean;
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   210
var
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   211
	taskname:	String;
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   212
begin
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   213
	taskname := ModPathName;
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   214
	if IsTaskSelected(taskname) and not UsingWinNT() then begin
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   215
		Result := True;
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   216
	end else begin
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   217
		Result := False;
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   218
	end;
0f49b56d5d74 inno: replace add_path.exe with a Pascal script
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   219
end;