Cool, good to know. On Linux, without the bitshift, it was outputting files with 0 permissions for anybody.

One thing to try (worked fine for me on Linux:
`info.external_attr = (0775 << 16L) + 0775`

If OSX is looking at the lower order bits, and Linux at the higher order bits, then adding the two together _may_ produce a cross-platform zip. To test, here's the code I used (in a file zipit.py):

```
from zipfile import ZipFile, ZipInfo, ZIP_DEFLATED, is_zipfile, BadZipfile

z = ZipFile("out.zip", 'w', ZIP_DEFLATED)

info = ZipInfo("test.sh")
info.external_attr = (0775 << 16L) + 0775 # give full access to included file
with open("test.sh", "r") as fh:
    z.writestr(info, fh.read())
```

And, on the command line, something like:
`echo "echo 'Works.'" > test.sh; chmod +x test.sh; python zipit.py; mkdir out; mv out.zip out; cd out; unzip out.zip; ./test.sh; cd ..; rm -r out`