« NSIS PL

VPatch 3.1

Ten dokument zgodny jest z NSIS 2.46

Wprowadzenie


VPatch pozwala na utworzenie pliku aktualizującego (łatki), który umożliwia uaktualnienie starszej wersji twojego oprogramowania do nowszej. Narzędzie GenPat tworzy plik aktualizacyjny. Wtyczka może użyć ten plik aktualizujący do zaktualizowania pliku. Dzięki użyciu pliku aktualizującego, możesz znacznie zredukować rozmiar aktualizacji do pobrania, ponieważ w pliku tym zapisane są tylko informacje o różnicach pomiędzy plikami.


Sposób użycia


Utworzenie pliku aktualizującego


Upewnij się, że masz plik źródłowy (wersja oryginalna) oraz plik docelowy (wersja do zaktualizowania). Na przyklad, DATA.DTA (znajdujący się w systemie użytkownika) oraz DATA_20.DTA (wersja 2.0 tego pliku z danymi). Teraz, wywołaj narzędzie GenPat.exe, korzystając z linii poleceń:

GENPAT oldfile.txt newfile.txt patch.pat

Utworzony zostanie plik aktualizujący, zajmie to parę chwil.

Używając parametru /B=(Rozmiar Bloku (BlockSize)) narzędzia GenPat (wstaw po nazwie pliku), możesz użyć różnego rozmiaru bloku. Mniejszy rozmiar bloku może przyczynić się do utworzenia plików aktualizujacych o mniejszym rozmiarze, lecz ich tworzenie może potrwać nieco dłużej (domyślny rozmiar bloku równy jest 64).

Jeśli masz problemy z użyciem tego narzedzia, które pracuje w linii poleceń, możesz pobrać GUI (graficzny interfejs użytkownika) dla VPatch z poniższej strony: http://www.tibed.net/vpatch.




Aktualizacja pliku podczas instalacji


Użyj wtyczki VPatch, aby zaktualizować plik używając pliku aktualizującego:

vpatch::vpatchfile "patch.pat" "oldfile.txt" "temporary_newfile.txt"

Wynik operacji aktualizacji zostanie dodany na stos i może przyjąć jedną z poniższych wartości (w nawiasie podano polski przekład):

  • OK
  • OK, new version already installed (OK, nowa wersja pliku jest już zainstalowana)
  • An error occurred while patching (Wystąpił błąd podczas aktualizowania pliku)
  • Patch data is invalid or corrupt (Dane aktualizatora są nieprawidłowe lub uszkodzone)
  • No suitable patches were found (Nie znaleziono odpowiedniego pliku do zaktualizowania)

Przykład możesz znaleźć w pliku example.nsi (Examples/VPatch/example.nsi). Powinieneś sprawdzać czy łańcuch znaków na stosie zaczyna się od słowa "OK", ponieważ oznacza to, że proces aktualizacji zakończył się powodzeniem i możesz zmienić nazwę plikowi "temporary_newfile.txt" w nazwę "oldfile.txt" by zastąpić plik oryginalny, jeśli chcesz.




Wielokrotna aktualizacja w jednym pliku


GenPat dołącza dane aktualizatora do pliku, który wcześniej określisz. Jeśli istnieje już plik aktualizacyjny dla tego samego oryginalnego pliku, z tą samą sumą CRC, w pliku aktualizatora, plik aktualizacyjny zostanie zastąpiony. Na przykład, jeśli chcesz mieć możliwość aktualizacji wersji 1 oraz 2 do wersji 3, możesz wstawić dane aktualizacyjne pliku 1 > 3 oraz 2 > 3 do tego samego pliku.

Możesz również wstawić dane aktualizacyjne dla różnych plików w jednym pliku aktualizacyjnym, na przykład, dane aktualizacyje z pliku A w wersji 1 do pliku A w wersji 2 oraz dane aktualizacyjne z pliku B w wersji 1 do pliku B w wersji 2. Po prostu wywołaj wtyczkę wielokrotnie, z podanym tym samym plikiem aktaulizacyjnym. Prawidłowe dane aktualizacyjne zostaną automatycznie wybrane (dzięki danym CRC).




Kody wyjścia generatora plików aktualizacyjnych (GenPat)


W wersji 3 dostępne są następujące kody wyjścia (znane też jako poziomy błędu, w czasach DOS), zwracane przez GenPat. GenPat zwróci kod wyjścia zależny od przebiegu procesu generowania pliku aktualizacyjnego. Poniżej znajduje się lista możliwych kodów wyjścia:

  • 0 = Sukces
  • 1 = Brak podanego parametru
  • 2 = Inny błąd
  • 3 = Plik źródłowy posiada już dane aktualizacyjne w określonym pliku (ERROR), użyj przełącznika /R, aby je nadpisać

Wymienione powyżej kody wyjścia mogą być użyteczne przy tworzeniu plików aktualizacyjnych poprzez skrypty NSIS.



Kod źródłowy


Kod źródłowy dostępny jest w oryginalnym pakiecie oraz w repozytorium SVN pakietu NSIS.


Wtyczka NSIS (C++)


Kody źródłowe wtyczki NSIS można znaleźć w katalogu Source\Plugin.




Generator plików aktualizacyjnych (C++)


Najciekawszy element VPatch, bieżący algorytm generowania plików aktualizacyjnych, można znaleźć w pliku Source\GenPat\PatchGenerator.cpp. Plik nagłówkowy tego pliku zawiera krótkie wyjaśnienie zasady działania algorytmu.




Interfejs użytkownika (Delphi)


Interfejs użytkownika jest także załączony, ale plik wykonawczy GUI musisz utworzyć sam, ponieważ jest zbyt duży by go dołączyć do dystrybucji. Poza środowiskiem Borland Delphi 6 lub nowszym (możesz użyć jego darmowej wersji Personal), będziesz musiał także zainstalować komponent VirtualTreeView napisany przez Mike'a Lischke.




Historia wersji


Aktualna wersja: 3.1

  • GenPat now compiles on POSIX platforms (MinGW/GCC), Visual C++ 6 and Borland C++.
  • More test cases to verify functionality of GenPat.

Historia wersji Starsze wydania


3.0

  • Final: Updates to the GUI, installer
  • RC8: GenPat will now flag replacement of a patch (e.g. the source file has the same contents as a previous patch inside a patch file) as an error. You can specifically allow it using the /R switch. Added license to source files.
  • RC7: Fixed critical bug in GenPat with multiple patches in a single file. Fixed serious bug in stand-alone EXE runtime: process kept on running forever. Included case testing through a Python script to test common usage (and prevent bugs like the one in GenPat in the future).
  • RC6: Upgraded to non-beta compiler. Added /A switch to change block match limit and /O to deactivate the limit. Updated GUI to support the /O switch.
  • RC4a to RC5a: input block size is now checked for power of 2 and fixed if incorrect. When patch file does not yet exist, to longer forgets to create the header. No longer tries to allocate memory when there are no chunks. Fixed memory leaks.
  • Target file date is now preserved inside a patch and restored on the user system.
  • MD5 checksums are now used instead of CRC32 checksums, unless existing patches in a file already are in CRC32 mode.
  • The patch generator, GenPat, has been completely rewritten in C++. It no longer needs to keep the entire files in memory, instead memory usage is a certain percentage of the source file size. The percentage is based on the block size, larger block sizes will reduce memory usage.
  • All runtimes now share a common codebase, perform proper error checking and don't leave behind files if the input file was already up to date.
  • Bug Fix: The patch generator algorithm no longer reduces to a quadratic runtime if there are many blocks with the same content in the files to patch.
  • Bug Fix: The documentation of the command-line utilities was incorrect and no warnings would be given by the runtimes, causing the patch not to work (this does not apply to NSIS patches).

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.

2.0 final

  • 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).

2.0 beta 2

  • All new algorithm used in the patch generator: much faster (up to 90%) while using smaller block sizes (higher compression)
  • Created a NSIS 2 plugin
  • Works with small files
  • Replaces existing patch in file if original file CRC is identical


Autorzy


Napisał: Koen van de Sande

Wtyczka w języku C napisana przez Edgewize, zaktualizowana przez Koen van de Sande

Nową dokumentację oraz przykład napisali Joost Verburg oraz Koen van de Sande


Licencja

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.