From 31251b2000a4378e65839b357dfc4dbf28a9dfb5 Mon Sep 17 00:00:00 2001 From: Theodore Dubois Date: Sat, 28 Nov 2020 22:20:26 -0800 Subject: [PATCH] Rename /ios/apk to /ish/apk, add /ish/version --- Dockerfile | 2 +- flatten.py | 23 ++++++++++++++++++++--- odr-repositories | 2 +- 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/Dockerfile b/Dockerfile index 35c2535..c9739c3 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,4 @@ FROM --platform=linux/386 alpine:3.12.0 AS ish-alpine -RUN touch /etc/ish-version FROM ish-alpine LABEL ish.export=appstore.tar.gz @@ -8,5 +7,6 @@ RUN : > /etc/motd FROM ish-alpine LABEL ish.export=appstore-apk.tar.gz +RUN mkdir /ish && touch /ish/version COPY apk-motd /etc/motd COPY odr-repositories /etc/apk/repositories diff --git a/flatten.py b/flatten.py index e946931..d702881 100755 --- a/flatten.py +++ b/flatten.py @@ -5,31 +5,48 @@ import tarfile WHITEOUT = '.wh.' +WHITEOUT_OPAQUE = '.wh..wh..opq' def flatten(image, output): manifest = json.load(image.extractfile('manifest.json')) assert len(manifest) == 1 manifest = manifest[0] + entries = {} layers = [tarfile.open(fileobj=image.extractfile(layer)) for layer in manifest['Layers']] for layer in layers: + real_members = [] + # process whiteout files for info in layer.getmembers(): info.name = './' + info.name dirname, sep, basename = info.name.rpartition('/') - if basename.startswith(WHITEOUT): + + if basename == WHITEOUT_OPAQUE: + for key in entries.keys(): + if key.startswith(dirname+sep): + del entries[key] + elif basename.startswith(WHITEOUT): del entries[dirname+sep+basename[len(WHITEOUT):]] else: - entries[info.name] = layer, info + real_members.append(info) + continue + + # real files + for info in real_members: + entries[info.name] = layer, info + # need a root entry if './' not in entries: info = tarfile.TarInfo('./') info.type = tarfile.DIRTYPE info.mode = 0o755 entries[info.name] = None, info + for layer, info in entries.values(): fileobj = layer.extractfile(info) if info.isfile() else None - info.mtime = 0 + info.mtime = 0 # make reproducible output.addfile(info, fileobj) + for layer in layers: layer.close() diff --git a/odr-repositories b/odr-repositories index 681127c..45f120e 100644 --- a/odr-repositories +++ b/odr-repositories @@ -1 +1 @@ -file:///ios/apk/main +file:///ish/apk/main