VPatch 2.1:

* Added argument checking and error handling to GenPat. Now returns exit codes as well to indicate success/failure (and the reason for failure). Only GenPat has changed in this version compared to 2.0 final.
* Bug Fix: GenPat no longer gives an Access Violation when attempting to patch a file smaller than 64 bytes into a file larger than 64 bytes.


git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@3318 212acab6-be3b-0410-9dea-997c60f758d6
This commit is contained in:
kichik 2003-12-27 18:36:57 +00:00
parent 14f2e625e4
commit b7c7a31b3e
5 changed files with 314 additions and 108 deletions

View file

@ -98,87 +98,161 @@ a:hover
<body>
<div class="center">
<table width="750" class="maintable" cellspacing="0" cellpadding="0">
<tr>
<td>
<h1>VPatch 2</h1>
<div>
<h2>Introduction</h2>
<p>VPatch allows to create a patch file to update previous versions of your software. The GenPat
utitily 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.</p>
<h2>How to use</h2>
<h3>Generate the patch file</h3>
<p>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:</p>
<pre>
<tr>
<td>
<h1>VPatch 2</h1>
<div>
<h2>Introduction</h2>
<p>VPatch allows to create a patch file to update previous versions
of your software. The GenPat utitily 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.</p>
<h2>How to use</h2>
<h3>Generate the patch file</h3>
<p>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:</p>
<pre>
GENPAT data.dta data_20.dta data.pat
</pre>
<p>Now, the patch will be generated, this will take some time.</p>
<p>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).</p>
<h3>Update the file during installation</h3>
<p>Use the VPatch plug-in to update a file using a patch file:</p>
<pre>
<p>Now, the patch will be generated, this will take some time.</p>
<p>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).</p>
<h3>Update the file during installation</h3>
<p>Use the VPatch plug-in to update a file using a patch file:</p>
<pre>
vpatch::vpatchfile "pathfile.pat" "source.file" "new.file"
</pre>
<p>The result of the patch operating will be added to the stack and can be one of the following
texts:</p>
<ul>
<li>OK</li>
<li>OK, new version already installed</li>
<li>An error occured while patching</li>
<li>Patch data is invalid or corrupt</li>
<li>No suitable patches were found</li>
</ul>
<p>Check <a href="example.nsi">example.nsi</a> for an example.</p>
<h3>Multiple patches in one file</h3>
<p>GenPat appends a patch to the file you specified. If there is already a patch for the same
orginal file 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 &gt; 3 and 2 &gt; 3 patch in one file.</p>
<p>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).</p>
<h2>Source code</h2>
<h3>NSIS plug-in (C++)</h3>
<p>The source of the NSIS plug-in that applies patches can be found in the Source\Plugin
folder.</p>
<h3>Patch Generator (Delphi)</h3>
<p>The most interesting part of VPatch, the actual patch generation algoritm, can be found in
Source\GenPat\PatchGenerator.pas. The header of that file contains a brief explanation of the
algoritm as well.</p>
<h3>User interface (Delphi)</h3>
<p>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 <a href=
<p>The result of the patch operating will be added to the stack and
can be one of the following texts:</p>
<ul>
<li>OK</li>
<li>OK, new version already installed</li>
<li>An error occured while patching</li>
<li>Patch data is invalid or corrupt</li>
<li>No suitable patches were found</li>
</ul>
<p>Check <a href="example.nsi">example.nsi</a> for an example.</p>
<h3>Multiple patches in one file</h3>
<p>GenPat appends a patch to the file you specified. If there is already
a patch for the same orginal file 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 &gt; 3 and 2 &gt; 3 patch in
one file.</p>
<p>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).</p>
<h3>GenPat exit codes</h3>
<p>In version 2.1 support was added for exit codes (known as error levels
in the DOS period) to GenPat. GenPat will return an exit code based
on succes of the patch generation. Here is a list of the possible
exit codes:</p>
<table width="547" border="0" cellspacing="0" cellpadding="0">
<tr>
<td><b>Exit code</b></td>
<td><b>Description</b></td>
</tr>
<tr>
<td>0</td>
<td>Success</td>
</tr>
<tr>
<td>1</td>
<td>Arguments missing</td>
</tr>
<tr>
<td>2</td>
<td>Source file not found</td>
</tr>
<tr>
<td>3</td>
<td>Target file not found</td>
</tr>
<tr>
<td>4</td>
<td>Unknown error while reading existing patch file</td>
</tr>
<tr>
<td>5</td>
<td>Unknown error while generating patch</td>
</tr>
<tr>
<td>6</td>
<td>Unknown error while writing patch file to disk</td>
</tr>
<tr>
<td>10</td>
<td>CRC of source and target file are equal</td>
</tr>
<tr>
<td>11</td>
<td>Not enough memory for source file</td>
</tr>
<tr>
<td>12</td>
<td>Not enough memory for target file</td>
</tr>
</table>
<p>These exit codes can be useful when you generate patch files through
a script.</p>
</div>
<div>
<h2>Source code</h2>
<h3>NSIS plug-in (C++)</h3>
<p>The source of the NSIS plug-in that applies patches can be found
in the Source\Plugin folder.</p>
<h3>Patch Generator (Delphi)</h3>
<p>The most interesting part of VPatch, the actual patch generation
algoritm, can be found in Source\GenPat\PatchGenerator.pas. The header
of that file contains a brief explanation of the algoritm as well.</p>
<h3>User interface (Delphi)</h3>
<p>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 <a href=
"http://www.delphi-gems.com">VirtualTreeView</a> component by Mike Lischke.</p>
<h2>Version history</h2>
<ul>
<li>2.0 final
<ul>
<li>Cleaned up source code for the patch generator, which is now included (this code is written in
Borland Delphi 6 and compiles with the freely available Personal edition).</li>
</ul>
</li>
<li>2.0 beta 2
<ul>
<li>All new algorithm used in the patch generator: much faster (up to 90%) while using smaller
block sizes (higher compression)</li>
<li>Created a NSIS 2 plugin</li>
<li>Works with small files</li>
<li>Replaces existing patch in file if original file CRC is identical</li>
</ul>
</li>
</ul>
<h2>Credits</h2>
<p>Written by Koen van de Sande<br />
C plug-in by Edgewize<br />
New documentation and example by Joost Verburg</p>
<h2>License</h2>
<pre>
<h2>Version history</h2>
<ul>
<li>2.1
<ul>
<li>Added argument checking and error handling to GenPat. Now
returns exit codes as well to indicate success/failure (and
the reason for failure). Only GenPat has changed in this version
compared to 2.0 final.</li>
<li>Bug Fix: GenPat no longer gives an Access Violation when attempting
to patch a file smaller than 64 bytes into a file larger than
64 bytes.</li>
</ul>
</li>
<li>2.0 final
<ul>
<li>Cleaned up source code for the patch generator, which is now
included (this code is written in Borland Delphi 6 and compiles
with the freely available Personal edition).</li>
</ul>
</li>
<li>2.0 beta 2
<ul>
<li>All new algorithm used in the patch generator: much faster
(up to 90%) while using smaller block sizes (higher compression)</li>
<li>Created a NSIS 2 plugin</li>
<li>Works with small files</li>
<li>Replaces existing patch in file if original file CRC is identical</li>
</ul>
</li>
</ul>
<h2>Credits</h2>
<p>Written by Koen van de Sande<br />
C plug-in by Edgewize<br />
New documentation and example by Joost Verburg</p>
<h2>License</h2>
<pre>
Copyright (C) 2001-2003 Koen van de Sande
This software is provided 'as-is', without any express or implied
@ -196,8 +270,9 @@ it freely, subject to the following restrictions:
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.
</pre></div>
</td>
</pre>
</div>
</td>
</tr>
</table>
</div>