VPatch allows to create a patch file to update previous versions of your software. The GenPat utility generates the patch file. The plug-in can use the patch to update a file. Using a patch, you can reduce the download size of your updates because only the differences between the files are included in the patch file.
Make sure you have the source file (original version) and the target file (version to update to). For example, DATA.DTA (currently on user system) and DATA_20.DTA (version 2.0 of this data file). Now call the command line tool GenPat.exe:
GENPAT oldfile.txt newfile.txt patch.pat
Now, the patch will be generated, this will take some time.
Using the /B=(BlockSize) parameter of the GenPat utility (put it after the filenames), you can use a different block size. A smaller block size may result in a smaller patch, but the generation will take more time (the default blocksize is 64).
If you have trouble using this command-line utility, you can download a GUI (graphical user interface) for VPatch from its own website: http://www.tibed.net/vpatch.
Use the VPatch plug-in to update a file using a patch file:
vpatch::vpatchfile "patch.pat" "oldfile.txt" "temporary_newfile.txt"
The result of the patch operating will be added to the stack and can be one of the following texts:
Check example.nsi for an example. You should check whether the stack string starts with "OK" because then the patch has succeeded and you can rename "temporary_newfile.txt" to "oldfile.txt" to replace the original, if you want.
GenPat appends a patch to the file you specified. If there is already a patch for the same original file, with the same CRC/MD5, in the patch file, the patch will be replaced. For example, if you want to be able to upgrade version 1 and 2 to version 3, you can put a 1 > 3 and 2 > 3 patch in one file.
You can also put patches for different files in one patch file, for example, a patch from file A version 1 to file A version 2 and a patch from file B version 1 to file B version 2. Just call the plug-in multiple times with the same patch file. It will automatically select the right patch (based on the file CRC).
In version 3 the following exit codes (known as error levels in the DOS period) can be returned by GenPat. GenPat will return an exit code based on success of the patch generation. Here is a list of the possible exit codes:
Exit code | Description |
0 | Success |
1 | Arguments missing |
2 | Other error |
3 | Source file already has a patch in specified patch file (ERROR), use /R switch to override |
These exit codes can be useful when you generate patch files through a NSIS script.
Source code is available in the original package and in the SVN repository of NSIS.
The source of the NSIS plug-in that applies patches can be found in the Source\Plugin folder.
The most interesting part of VPatch, the actual patch generation algorithm, can be found in Source\GenPat\PatchGenerator.cpp. The header of that file contains a brief explanation of the algorithm as well.
A user interface is included as well, which you will have to build yourself because the GUI executable was too large to include. Besides Borland Delphi 6 or higher (you can use the freely available Personal edition), you will also need to install the VirtualTreeView component by Mike Lischke.
Written by Koen van de Sande.
C plug-in initially by Edgewize, updated by Koen van de Sande.
New documentation and example by Joost Verburg and Koen van de Sande.
Copyright (C) 2001-2005 Koen van de Sande / Van de Sande Productions This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any distribution.