72 lines
1.6 KiB
Markdown
72 lines
1.6 KiB
Markdown
# py-pwr
|
|
|
|
Minimal Python client for wharf/pwr files. It parses the wire format,
|
|
protobuf messages, and can apply patch ops when you provide file index
|
|
to path mappings.
|
|
|
|
## Features
|
|
- Read `.pwr`, `.pws`, `.pwm`, `.pww` files.
|
|
- Iterate sync ops and bsdiff controls.
|
|
- Apply patches for RSYNC and BSDIFF series using target/output file lists.
|
|
- Optional decompression for brotli/zstd if the modules are installed.
|
|
|
|
## Limitations
|
|
- TLC container decoding is not included. You can pass a decoder to
|
|
`PatchReader`/`SignatureReader` to parse the raw container bytes.
|
|
|
|
## Usage
|
|
|
|
Patch inspection:
|
|
|
|
```python
|
|
from pwr import PatchReader
|
|
|
|
with PatchReader.open("update.pwr") as reader:
|
|
for entry in reader.iter_file_entries():
|
|
if entry.is_rsync():
|
|
for op in entry.sync_ops:
|
|
pass
|
|
elif entry.is_bsdiff():
|
|
for ctrl in entry.bsdiff_controls:
|
|
pass
|
|
```
|
|
|
|
Apply a patch (requires file index mappings):
|
|
|
|
```python
|
|
from pwr import PatchReader, apply_patch
|
|
|
|
target_paths = [
|
|
"old/file0.bin",
|
|
"old/file1.bin",
|
|
]
|
|
|
|
output_paths = [
|
|
"new/file0.bin",
|
|
"new/file1.bin",
|
|
]
|
|
|
|
with PatchReader.open("update.pwr") as reader:
|
|
apply_patch(reader, target_paths, output_paths)
|
|
```
|
|
|
|
Apply to folders (uses embedded TLC container paths):
|
|
|
|
```python
|
|
from pwr import apply_patch_to_folders
|
|
|
|
apply_patch_to_folders("update.pwr", "old_folder", "new_folder")
|
|
```
|
|
|
|
Quick inspect:
|
|
|
|
```bash
|
|
python py-pwr/main.py path/to/file.pwr
|
|
```
|
|
|
|
Apply via CLI:
|
|
|
|
```bash
|
|
python py-pwr/main.py apply update.pwr /path/to/old_folder /path/to/new_folder
|
|
```
|