dif-zipp
This module creates and applies differences/patches between two folders.
Raison d'etre
Although the module can't create diffs cross-platform, yet (Windows support is missing, see below) it can apply them cross-platform.
This means that this is a useful tool when building update-patches for desktop applications (think Electron, NW) etc. Because:
- The end user does not have to have git (or even an unzipper) installed.
- Diffs/patches can be easily downloaded and applied in a "user data" - folder, omitting the need to rebuild a binary on updates.
Inner workings
The module works by
-
Creating diffs
- Identifying the differences using the Linux/Mac command "diff". (So it won't work on Windows. We might fix Windows-compatability in the future by using the FC command.)
- Analyzing the output of the diff, thus sorting files and folders into three categories (add, change and remove).
- Creating a manifest file with the differences.
- Zipping the manifest file together with the files/folders that are additions and changes.
-
Applying diffs
- Unzipping a "diff-zip".
- Reading the manifest file.
- Applying the changes to a folder.
Installation
npm install diff-zip
Then, in your program, require diff-zip:
const DiffZip = require('diff-zip')
Creating diffs
Choose any two folders or two different commits in a git repository.
If you choose a git repository you can run any commands (build scripts etc) on the folders before creating a diff.
Diffing between two folders
await DiffZip.create (
'path to zip file to be created',
'path to folder A (initial state)',
'path to folderB (final state)',
true
)
Diffing between two commits in a git repository
await DiffZip.repoDiff (
'path to temporary working dir',
'path to git repo (ssh path)',
'path to zip file to be created',
'commitHash for initial state',
'commitHash for final state',
['command1', 'command2' etc]
true,
true
)
Applying diffs
Choose a folder to apply the diff to and decide if you want to apply it directly to the folder or to a copy of the folder.
await DiffZip.apply(
'path to zip file to apply as diff',
'path to folder to apply the diff to',
'path to copy of folder to be created',
true
)