Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
9827764
extractor: Add staged source-aware extraction
gotenksIN Sep 11, 2026
9e9f912
extractor: Add graceful cancellation
gotenksIN Sep 11, 2026
da3d104
extractor: Apply BSDIFF delta operations
gotenksIN Sep 11, 2026
a7d6358
cli: Return failure for extraction errors
gotenksIN Sep 11, 2026
2c90160
extractor: Accept padded source images
gotenksIN Sep 11, 2026
4fe2369
verity: Generate partition hash trees
gotenksIN Sep 11, 2026
381000a
zucchini: Vendor audited native boundary
gotenksIN Sep 11, 2026
0291aee
zucchini: Apply OTA patch operations
gotenksIN Sep 11, 2026
2cbadc0
puffin: Apply BSDIFF patch operations
gotenksIN Sep 11, 2026
705bb20
puffin: Apply Zucchini patch operations
gotenksIN Sep 11, 2026
a34540f
lz4: Vendor bit-exact native boundary
gotenksIN Sep 12, 2026
4b0af5c
lz4diff: Apply delta patch operations
gotenksIN Sep 12, 2026
9ae10c5
verity: Generate partition FEC data
gotenksIN Sep 12, 2026
849819a
release: Verify native package artifacts
gotenksIN Sep 12, 2026
45b23da
bsdiff: Preserve Android source semantics
gotenksIN Sep 12, 2026
a736d51
zucchini: pure-Rust apply engine with NoOp + ELF support
akhilnarang Sep 12, 2026
d72a53f
zucchini: pure-Rust DEX apply support
akhilnarang Sep 12, 2026
277cf2a
zucchini: add pure-Rust fixture tests, port notes, clippy cleanups
akhilnarang Sep 12, 2026
cb92075
zucchini: port Android preflight hardening to pure Rust
akhilnarang Sep 12, 2026
c6cf3d6
zucchini: fix apply-path edge cases found by audit
akhilnarang Sep 12, 2026
04772a9
zucchini: cooperative cancellation hook and fallible reservations
akhilnarang Sep 12, 2026
cc36e94
zucchini: make pure Rust the only apply path; C++ becomes opt-in
akhilnarang Sep 12, 2026
755c9bc
zucchini: document audit fixes, cancellation, size delta, and wiring
akhilnarang Sep 12, 2026
192b155
zucchini: rerun build script when the native differential toggle changes
akhilnarang Sep 12, 2026
7909945
zucchini: read TypeId descriptor string indices with 32-bit width in …
akhilnarang Sep 12, 2026
1d40d4c
zucchini: derive DEX index read width from the group width
akhilnarang Sep 12, 2026
d4aa25e
zucchini: document DEX index-width derivation
akhilnarang Sep 12, 2026
aa05cc4
zucchini: preserve cooperative cancellation end to end
akhilnarang Sep 12, 2026
2658c8d
zucchini: fallible reservations for attacker-controlled vectors
akhilnarang Sep 12, 2026
5d4f66f
zucchini: cache DEX instructions and per-group references
akhilnarang Sep 12, 2026
83e0d3c
zucchini: test public cancellation mapping
akhilnarang Sep 12, 2026
496a821
zucchini: match native DEX opcode families and pruning order
akhilnarang Sep 12, 2026
4e3cd3c
build: prune dead native closure, drop bsdiff-android, split CLI/Pyth…
Sep 12, 2026
2b636d2
zucchini: remove obsolete native implementation
akhilnarang Sep 12, 2026
6b6fc74
lz4: replace vendored C sources with pinned lz4-sys crate
akhilnarang Sep 12, 2026
cd3deba
tests: shrink fixture fanout with runtime builders
akhilnarang Sep 12, 2026
faf0f66
chore: trim stale build/docs and dead zucchini keepers
akhilnarang Sep 12, 2026
bb45b2c
zucchini: switch to pinned native artifact fetch
akhilnarang Sep 12, 2026
c55a0a8
test: consolidate opaque fixtures into deterministic corpus
akhilnarang Sep 12, 2026
830b30a
harden native artifact fetch and wheel pipeline
akhilnarang Sep 12, 2026
8c50a0a
Prune test corpus and consolidate delta/runtime helpers
akhilnarang Sep 12, 2026
a1f1bad
Remove unreachable return in fetch script
akhilnarang Sep 12, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
106 changes: 83 additions & 23 deletions .github/workflows/release.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -70,16 +70,6 @@ jobs:
with:
key: ${{ matrix.target }}

- name: Install build deps (macOS)
if: runner.os == 'macOS'
run: brew install protobuf

- name: Install build deps (Linux)
if: runner.os == 'Linux'
run: |
sudo apt-get update
sudo apt-get install -y protobuf-compiler

- name: Install zig
if: runner.os == 'Linux' && !contains(matrix.target, 'android')
uses: mlugg/setup-zig@v2
Expand All @@ -103,41 +93,35 @@ jobs:
ndk-version: r23
local-cache: true

- name: Install protoc (Windows)
if: runner.os == 'Windows'
uses: arduino/setup-protoc@v1
with:
version: "3.x"

- name: Build binary (Linux)
if: runner.os == 'Linux' && !contains(matrix.target, 'android')
run: |
cargo zigbuild --release --locked --target=${{ matrix.target }} --color=always --verbose
cargo zigbuild --profile release-cli --locked --target=${{ matrix.target }} --color=always --verbose --bin otadump

- name: Build binary (Android)
if: contains(matrix.target, 'android')
run: |
cargo ndk --target=${{ matrix.target }} build --release --locked --color=always --verbose
cargo ndk --target=${{ matrix.target }} build --profile release-cli --locked --color=always --verbose --bin otadump

- name: Build binary (macOS / Windows)
if: runner.os == 'macOS' || runner.os == 'Windows'
run: |
cargo build --release --locked --target=${{ matrix.target }} --color=always --verbose
cargo build --profile release-cli --locked --target=${{ matrix.target }} --color=always --verbose --bin otadump

- name: Package (*nix)
if: runner.os != 'Windows'
run: >
tar -cv
LICENSE README.md
-C target/${{ matrix.target }}/release/ otadump
LICENSE README.md src/puffin/LICENSE licenses/LICENSE.lz4 licenses/README.md
-C target/${{ matrix.target }}/release-cli/ otadump
| gzip --best
> 'otadump-${{ steps.get_version.outputs.value }}-${{ matrix.target }}.tar.gz'
- name: Package (Windows)
if: runner.os == 'Windows'
run: >
7z a 'otadump-${{ steps.get_version.outputs.value }}-${{ matrix.target }}.zip'
LICENSE README.md
./target/${{ matrix.target }}/release/otadump.exe
LICENSE README.md src/puffin/LICENSE licenses/LICENSE.lz4 licenses/README.md
./target/${{ matrix.target }}/release-cli/otadump.exe
- name: Upload artifact
uses: actions/upload-artifact@v4.6.0
with:
Expand All @@ -157,3 +141,79 @@ jobs:
*.zip
name: ${{ steps.get_version.outputs.value }}
tag_name: ""

wheel-linux-abi3:
name: wheel manylinux2014 x86_64
runs-on: ubuntu-latest
container:
image: quay.io/pypa/manylinux2014_x86_64@sha256:493d2032114d757aaa761a9385ad8497f391503bf71acef9abeeb66682ca5d90
steps:
- name: Checkout repository
uses: actions/checkout@v4

- name: Install Rust
uses: dtolnay/rust-toolchain@stable

- name: Install Python build tools
run: |
/opt/python/cp39-cp39/bin/python -m pip install --upgrade pip
/opt/python/cp39-cp39/bin/python -m pip install uv maturin auditwheel

- name: Validate, test, and build wheel in pinned manylinux
env:
PATH: /opt/python/cp39-cp39/bin:${{ env.PATH }}
OTADUMP_NATIVE_CACHE: /tmp/otadump-native-cache
run: |
set -euxo pipefail

cargo fmt --all -- --check
cargo check --locked
cargo test --locked --release --all-features
cargo clippy --locked --all-targets --all-features -- -D warnings

rm -rf "$OTADUMP_NATIVE_CACHE"
python3 scripts/fetch-native-artifact.py \
--bundle-lock native/zucchini/ARTIFACT_BUNDLE_LOCK.json \
--checksum-lock native/zucchini/ARTIFACT_LOCK.sha256 \
--out /tmp/otadump-native/linux-x86_64-gnu \
--cache "$OTADUMP_NATIVE_CACHE"
python3 tests/native_artifact_fetch_test.py

uv build --wheel
auditwheel show dist/*.whl
auditwheel repair --wheel-dir wheelhouse dist/*.whl

python -m venv /tmp/otadump-wheel-smoke
source /tmp/otadump-wheel-smoke/bin/activate
pip install wheelhouse/*.whl
python tests/python_smoke.py
python - <<'PY'
import pathlib
import otadump

extension = next(pathlib.Path(otadump.__file__).parent.glob("otadump*.so"))
print(extension)
PY

SO_PATH=$(python - <<'PY'
import pathlib
import otadump

extension = next(pathlib.Path(otadump.__file__).parent.glob("otadump*.so"))
print(extension)
PY
)
nm -gD "$SO_PATH" >/tmp/otadump-wheel.nm.txt
readelf -d "$SO_PATH" >/tmp/otadump-wheel.readelf.txt
ldd "$SO_PATH" >/tmp/otadump-wheel.ldd.txt

- name: Upload wheel artifacts
uses: actions/upload-artifact@v4.6.0
with:
name: python-wheel-manylinux2014-x86_64
path: |
dist/*.whl
wheelhouse/*.whl
/tmp/otadump-wheel.nm.txt
/tmp/otadump-wheel.readelf.txt
/tmp/otadump-wheel.ldd.txt
137 changes: 133 additions & 4 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading
Loading