OK I put 1.1z up on http://www.firehose.net/free/nsis/
(which apparently will finally get pushed to nullsoft.com).
Since I'm out of letters, I'm going to make the next version (which will soley fix bugs, no new features) 1.2.0. Yay.
For fun, here's a list of everything (in reverse-chronological order) that I've done to NSIS in the last month. The end result is a lot more functionality, and a lot less overhead (the current exe header size is 32kb, whereas it used to be about 40kb).
- Moved licensedata into string table out of datablock
- Removed NSIS_CONFIG_CREATESHORTCUT config option (it really didn't add much)
- Additional exehead size optimizations (making it use global variables more instead of passing them around and copying them).
- Made DeleteOnReboot code check for duplicates in wininit.ini on win9x.
- Enlarged resources a bit to make more room for shit (dynamic sized resources would be nice, hmm)
- Made install info+string table etc in datablock.
- Made uninstall info that is written to uninstaller compressed now.
- This makes for slightly smaller installers, typically.
- Made install types and section names stored in string table (less overhead, less stupid static string length limitations)
- Raised the maximum number of install types to 8 from 4 and made it a keen #define (who cares?)
- Added DeleteFileOnReboot function to util.c
- Added /ONREBOOT switch to Delete instruction
- Made uninstaller delete itself after reboot
- Updated CRC checking code for size and speed (no more seeking)
- Updated integrity checks to check for correct length (even when CRC checking is off)
- Made minimum post-header length of 516 bytes when CRC is enabled (in order to simplify the exehead).
- Made cancel selected when the install is aborted.
- Fixed a few potential bugs in libc
- Made OLE/COM initialization better (no more open and close and open and close)
- Reduced size even more (zlib table optimizations and such! - decompression is slower now though, but the header is 35840 bytes with all features on)
- Removed NSIS_CONFIG_COPYFILES config option (it's small anyway)
- Made installation logging off by default (default header size is 31744 bytes, yay!)
- Updated uninstall system to not litter up your temporary directory with tons of nsu* files (it now only creates 26 possible files, and cleans up unused ones on uninstall)
- Reduced size of header by 1k (40960 bytes now with all features turned on)
- Cleaned up a lot of code/errors/etc in exehead
- Cleaned up error/warning handling in compiler
- Added !error and !warning
- Added DeleteINISec and DeleteINIStr commands
- Added jump:X mode to FindWindow
- Made Nop instruction also work as Jump, added Jump command.
- Made section adding more strict (you have to create all sections, none by default to make it less prone to bugs)
- Removed a lot of section related bugs.
- Added Abort command.
- Added SetDetailsView.
- Added FindWindowByTitle (uses FindWindow but with small diffs)
- Fixed bad DeleteRegKey bug that was introduced in 1.1o.
- Fixed a few component selector bugs. Seems to be fine now.
- Added SectionDivider command and divider sections and all that jazz.
- Added $\r and $\n variables (for carriage return and newline, respectively)
- Made install.log write \r\n instead of \n.
- Optimized header size more (it is still the same size, even though stuff was added)
- Added optional /r switch for RMDir (removes recursive directories and deletes all files (read-only or not) from them.
- Made Delete delete read-only files.
- Massive changes to the way strings are handled. Strings are no longer in the data block, but instead in their own string table which is compressed with the header and stored in memory by the installer stub. This is a) faster, and b) allows us to compress the strings. Also, the static strings that the installer needs are no longer stored directly, instead "pointers" to them in the string table are stored (meaning many of the static length restrictions are gone). Doing this also simplifies much of exec.c, making the installer smaller. TODO: make all of the user messages configurable (maybe). Overall these changes produce installers that are about 1-2k smaller.
optimized datablock_optimize - Changed the format of the output statistics.
- Broke stuff (see above)
- Added IfFileExists instruction for branching based on file/directory presence (takes wildcards, too)
- Changed ExecuteEntry so that branching instructions (such as MessageBox and IfFileExists) can go back if necessary (oops - negative ones were broken before.)
- Made add_data_compress and GetCompressedDataFromDataBlock use a slightly more efficient form (1 byte per block is saved, maximum file size is now 2gb instead of 4gb)
- Created BIGTEST.NSI which tests/demonstrates nearly all of the functionality of NSIS.
- Added Nop instruction
- Made it possible to put comments at the end of the line (using ; or # to deliminate it) .. if you need a parameter to start with ; or #, use quotes.
- Fixed GetCompressedDataFromDataBlockToMemory() (this was causing licenses to be truncated).
- Made MessageBox and FindWindow strings able to use variables
- Made last two parameters of MessageBox optional
- Cleaned up some resources (maintained 41.5k header size even though we added some instructions etc)
- Made it so that if the first section starts with - (or is ""), it is not shown in the section list.
- Made it so that sections beginning with a - are treated like empty sections (and are required, and not shown).
- Made SectionIn command additive. i.e. SectionIn 1\nSectionIn 2 adds the section to types 1 and 2.
- Made CreateShortCut more configurable (hotkey and showmode).
- Made integer parser take hexadecimal and octal numbers in addition to decimal.
- Added new examples (example1.nsi, example2.nsi, waplugin.nsi, and viewhtml.nsi)
- Reduced size of header 1.5k by removing unused portions of zlib.
- Improved the InstlalDirRegKey logic to handle quotes in the strings better.
- Removed winamp hack checking (use InstallDirRegKey to find the Winamp directory, in addition to $PROGRAMFILES\Winamp) ex: InstallDirRegKey HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\Winamp" "UninstallString"
- Got rid of shell.cpp, rewrote CreateShortCut in C (using lpVtbl) and included it in util.c, and inlined Shell_Free in ui.c
- Removed time clipping on the Sleep command.
- Made compiler give warnings for certain instances that should not be fatal but should be fixed (i.e. combining LicenseData and SilentInstall)
- Made the install info header compressable (typically saves a few kb)
- Made the uninstall data compressable (typically saves ~1kb)
- Prettied up the output of statistics
- Made the space required/available displays show KB, MB, or GB.
- Made both exehead and compiler use the same zlib directory.
- made nsisconf.nsi included if available (lets you configure defaults)
- added PackEXEHeader command to let you use UPX or Petite or any other packer on the header.
removed one extra resource from exehead to shrink installer slightly. - changed compression system to do one big deflate (should be slightly more efficient)
- added SetDatablockOptimize command and made it off by default (SLOW! :)
- made compiler print more info (compression bytes saved, etc)
- fixed silentinstall uninstall bug
Love,
Justin