зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1809575 - Replace the use of the external xar tool with a simple python implementation. r=gsvelto
Differential Revision: https://phabricator.services.mozilla.com/D166504
This commit is contained in:
Родитель
82fc5b6237
Коммит
f84188c1dc
|
@ -4,12 +4,6 @@ set -v -e -x
|
||||||
ncpu=-j$(grep -c ^processor /proc/cpuinfo)
|
ncpu=-j$(grep -c ^processor /proc/cpuinfo)
|
||||||
|
|
||||||
WORK=/setup/
|
WORK=/setup/
|
||||||
cd $WORK
|
|
||||||
git clone --depth=1 --single-branch -b system-symbols https://github.com/mozilla/xar xar
|
|
||||||
cd xar/xar
|
|
||||||
./autogen.sh --prefix=/builds/worker
|
|
||||||
make "$ncpu" && make install
|
|
||||||
|
|
||||||
cd $WORK
|
cd $WORK
|
||||||
git clone --depth=1 --single-branch -b system-symbols-mac https://github.com/gabrielesvelto/libdmg-hfsplus.git
|
git clone --depth=1 --single-branch -b system-symbols-mac https://github.com/gabrielesvelto/libdmg-hfsplus.git
|
||||||
cd libdmg-hfsplus
|
cd libdmg-hfsplus
|
||||||
|
|
|
@ -32,7 +32,6 @@ Required tools for Linux:
|
||||||
pax
|
pax
|
||||||
gzip
|
gzip
|
||||||
tar
|
tar
|
||||||
xar (http://code.google.com/p/xar/)
|
|
||||||
xpwn's dmg (https://github.com/planetbeing/xpwn)
|
xpwn's dmg (https://github.com/planetbeing/xpwn)
|
||||||
|
|
||||||
Created on Apr 11, 2012
|
Created on Apr 11, 2012
|
||||||
|
@ -50,6 +49,7 @@ import subprocess
|
||||||
import tempfile
|
import tempfile
|
||||||
import traceback
|
import traceback
|
||||||
|
|
||||||
|
from macpkg import Pbzx, uncpio, unxar
|
||||||
from scrapesymbols.gathersymbols import process_paths
|
from scrapesymbols.gathersymbols import process_paths
|
||||||
|
|
||||||
|
|
||||||
|
@ -60,7 +60,9 @@ def expand_pkg(pkg_path, out_path):
|
||||||
@param pkg_path: a path to an installer package (.pkg)
|
@param pkg_path: a path to an installer package (.pkg)
|
||||||
@param out_path: a path to hold the package contents
|
@param out_path: a path to hold the package contents
|
||||||
"""
|
"""
|
||||||
subprocess.check_call(["xar", "-x", "-C", out_path, "-f", pkg_path])
|
for name, content in unxar(open(pkg_path, "rb")):
|
||||||
|
with open(os.path.join(out_path, name), "wb") as fh:
|
||||||
|
shutil.copyfileobj(content, fh)
|
||||||
|
|
||||||
|
|
||||||
def expand_dmg(dmg_path, out_path):
|
def expand_dmg(dmg_path, out_path):
|
||||||
|
@ -178,7 +180,6 @@ def extract_payload(payload_path, output_path):
|
||||||
return True
|
return True
|
||||||
elif header == b"pb":
|
elif header == b"pb":
|
||||||
logging.info("Extracting pbzx payload")
|
logging.info("Extracting pbzx payload")
|
||||||
from macpkg import Pbzx, uncpio
|
|
||||||
|
|
||||||
for path, mode, content in uncpio(Pbzx(open(payload_path, "rb"))):
|
for path, mode, content in uncpio(Pbzx(open(payload_path, "rb"))):
|
||||||
if not path or not stat.S_ISREG(mode):
|
if not path or not stat.S_ISREG(mode):
|
||||||
|
|
|
@ -2,8 +2,65 @@
|
||||||
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
|
||||||
|
import bz2
|
||||||
import lzma
|
import lzma
|
||||||
|
import os
|
||||||
import struct
|
import struct
|
||||||
|
import zlib
|
||||||
|
from xml.etree.ElementTree import XML
|
||||||
|
|
||||||
|
|
||||||
|
def unxar(fileobj):
|
||||||
|
magic = fileobj.read(4)
|
||||||
|
if magic != b"xar!":
|
||||||
|
raise Exception("Not a XAR?")
|
||||||
|
|
||||||
|
header_size = fileobj.read(2)
|
||||||
|
header_size = struct.unpack(">H", header_size)[0]
|
||||||
|
if header_size > 64:
|
||||||
|
raise Exception(
|
||||||
|
f"Don't know how to handle a {header_size} bytes XAR header size"
|
||||||
|
)
|
||||||
|
header_size -= 6 # what we've read so far.
|
||||||
|
header = fileobj.read(header_size)
|
||||||
|
if len(header) != header_size:
|
||||||
|
raise Exception("Failed to read XAR header")
|
||||||
|
(
|
||||||
|
version,
|
||||||
|
compressed_toc_len,
|
||||||
|
uncompressed_toc_len,
|
||||||
|
checksum_type,
|
||||||
|
) = struct.unpack(">HQQL", header[:22])
|
||||||
|
if version != 1:
|
||||||
|
raise Exception(f"XAR version {version} not supported")
|
||||||
|
toc = fileobj.read(compressed_toc_len)
|
||||||
|
base = fileobj.tell()
|
||||||
|
if len(toc) != compressed_toc_len:
|
||||||
|
raise Exception("Failed to read XAR TOC")
|
||||||
|
toc = zlib.decompress(toc)
|
||||||
|
if len(toc) != uncompressed_toc_len:
|
||||||
|
raise Exception("Corrupted XAR?")
|
||||||
|
toc = XML(toc).find("toc")
|
||||||
|
for f in toc.findall("file"):
|
||||||
|
if f.find("type").text != "file":
|
||||||
|
continue
|
||||||
|
filename = f.find("name").text
|
||||||
|
data = f.find("data")
|
||||||
|
length = int(data.find("length").text)
|
||||||
|
size = int(data.find("size").text)
|
||||||
|
offset = int(data.find("offset").text)
|
||||||
|
encoding = data.find("encoding").get("style")
|
||||||
|
fileobj.seek(base + offset, os.SEEK_SET)
|
||||||
|
content = Take(fileobj, length)
|
||||||
|
if encoding == "application/octet-stream":
|
||||||
|
if length != size:
|
||||||
|
raise Exception(f"{length} != {size}")
|
||||||
|
elif encoding == "application/x-bzip2":
|
||||||
|
content = bz2.BZ2File(content)
|
||||||
|
else:
|
||||||
|
raise Exception(f"XAR encoding {encoding} not supported")
|
||||||
|
|
||||||
|
yield filename, content
|
||||||
|
|
||||||
|
|
||||||
class Pbzx(object):
|
class Pbzx(object):
|
||||||
|
|
Загрузка…
Ссылка в новой задаче