I maintain a cross platform application, based on PyQt that runs on linux mac and windows.
The windows and mac versions are distributed using py2exe and py2app, which produces quite large bundles (~40 MB).
I would like to add an ‘auto update’ functionality, based on patches to limit downloads size:
- check for new versions on an http server
- download the patches needed to update to the last version
- apply the patches list and restart the application
I have some questions:
- what is the preferred way to update a windows application since open files are locked and can’t be overwritten ?
- how do I prepare and apply the patches ? perhaps using bsdiff/pspatch ?
[update]
I made a simple class to make patches with bsdiff, which is very efficient as advertised on their site : a diff on two py2exe versions of my app (~75 MB uncompressed) produces a 44 kB patch ! Small enough for me, I will stick to this format.
The code is available in the ‘update’ package of pyflu, a small library of Python code.
I don’t believe py2exe supports patched updates. However, if you do not bundle the entire package into a single EXE (py2exe website example – bottom of page), you can get away with smaller updates by just replacing certain files, like the EXE file, for example. This can reduce the size of your updates significantly.
You can write a separate updater app, which can be downloaded/ran from inside your application. This app may be different for every update, as the files that need to be updated may change.
Once the application launches the updater, it will need to close itself so the files can be overwritten. Once the updater is complete, you can have it reopen the application before closing itself.