diff --git a/Makefile b/Makefile --- a/Makefile +++ b/Makefile @@ -140,6 +140,7 @@ osx: (echo "Missing bdist_mpkg (easy_install bdist_mpkg)"; false) rm -rf dist/mercurial-*.mpkg python -m bdist_mpkg.script_bdist_mpkg setup.py -- + python contrib/fixpax.py dist/mercurial-*.mpkg/Contents/Packages/*.pkg/Contents/Archive.pax.gz mkdir -p packages/osx N=`cd dist && echo mercurial-*.mpkg | sed 's,\.mpkg$$,,'` && hdiutil create -srcfolder dist/$$N.mpkg/ -scrub -volname "$$N" -ov packages/osx/$$N.dmg rm -rf dist/mercurial-*.mpkg diff --git a/contrib/fixpax.py b/contrib/fixpax.py new file mode 100644 --- /dev/null +++ b/contrib/fixpax.py @@ -0,0 +1,60 @@ +# fixpax - fix ownership in bdist_mpkg output +# +# Copyright 2015 Matt Mackall +# +# This software may be used and distributed according to the terms of the +# MIT license (http://opensource.org/licenses/MIT) + +"""Set file ownership to 0 in an Archive.pax.gz. +Suitable for fixing files bdist_mpkg output: +*.mpkg/Contents/Packages/*.pkg/Contents/Archive.pax.gz +""" + +import sys, os, gzip + +def fixpax(iname, oname): + i = gzip.GzipFile(iname) + o = gzip.GzipFile(oname, "w") + + while True: + magic = i.read(6) + dev = i.read(6) + ino = i.read(6) + mode = i.read(6) + i.read(6) # uid + i.read(6) # gid + nlink = i.read(6) + rdev = i.read(6) + mtime = i.read(11) + namesize = i.read(6) + filesize = i.read(11) + name = i.read(int(namesize, 8)) + data = i.read(int(filesize, 8)) + + o.write(magic) + o.write(dev) + o.write(ino) + o.write(mode) + o.write("000000") + o.write("000000") + o.write(nlink) + o.write(rdev) + o.write(mtime) + o.write(namesize) + o.write(filesize) + o.write(name) + o.write(data) + + if name.startswith("TRAILER!!!"): + o.write(i.read()) + break + + o.close() + i.close() + +if __name__ == '__main__': + for iname in sys.argv[1:]: + print 'fixing file ownership in %s' % iname + oname = sys.argv[1] + '.tmp' + fixpax(iname, oname) + os.rename(oname, iname)