1010import processing .app .Platform ;
1111import processing .app .Preferences ;
1212import processing .app .ui .Toolkit ;
13+ import processing .core .PApplet ;
1314
1415import javax .swing .*;
1516import javax .swing .border .EmptyBorder ;
@@ -86,25 +87,25 @@ protected Object doInBackground() throws Exception {
8687
8788 // tools
8889 File downloadedTools = new File (tempFolder , downloadUrls .toolsFilename );
89- downloadAndUnpack (downloadUrls .toolsUrl , downloadedTools , sdkFolder );
90+ downloadAndUnpack (downloadUrls .toolsUrl , downloadedTools , sdkFolder , true );
9091
9192 // platform-tools
9293 File downloadedPlatformTools = new File (tempFolder , downloadUrls .platformToolsFilename );
93- downloadAndUnpack (downloadUrls .platformToolsUrl , downloadedPlatformTools , sdkFolder );
94+ downloadAndUnpack (downloadUrls .platformToolsUrl , downloadedPlatformTools , sdkFolder , true );
9495
9596 // build-tools
9697 File downloadedBuildTools = new File (tempFolder , downloadUrls .buildToolsFilename );
97- downloadAndUnpack (downloadUrls .buildToolsUrl , downloadedBuildTools , buildToolsFolder );
98+ downloadAndUnpack (downloadUrls .buildToolsUrl , downloadedBuildTools , buildToolsFolder , true );
9899
99100 // platform
100101 File downloadedPlatform = new File (tempFolder , downloadUrls .platformFilename );
101- downloadAndUnpack (downloadUrls .platformUrl , downloadedPlatform , platformsFolder );
102+ downloadAndUnpack (downloadUrls .platformUrl , downloadedPlatform , platformsFolder , false );
102103
103104 // usb driver
104105 if (Platform .isWindows ()) {
105106 File usbDriverFolder = new File (extrasFolder , "google" );
106107 File downloadedFolder = new File (tempFolder , "latest_usb_driver_windows.zip" );
107- downloadAndUnpack (URL_USB_DRIVER , downloadedFolder , usbDriverFolder );
108+ downloadAndUnpack (URL_USB_DRIVER , downloadedFolder , usbDriverFolder , false );
108109 }
109110
110111 if (Platform .isLinux () || Platform .isMacOS ()) {
@@ -135,7 +136,7 @@ protected void done() {
135136 }
136137
137138 private void downloadAndUnpack (String urlString , File saveTo ,
138- File unpackTo ) throws IOException {
139+ File unpackTo , boolean setExec ) throws IOException {
139140 URL url = null ;
140141 try {
141142 url = new URL (urlString );
@@ -167,7 +168,7 @@ private void downloadAndUnpack(String urlString, File saveTo,
167168 inputStream .close ();
168169 outputStream .close ();
169170
170- extractFolder (saveTo , unpackTo );
171+ extractFolder (saveTo , unpackTo , setExec );
171172 }
172173
173174 /*
@@ -370,7 +371,7 @@ public void actionPerformed(ActionEvent actionEvent) {
370371 }
371372
372373
373- static void extractFolder (File file , File newPath ) throws IOException {
374+ static void extractFolder (File file , File newPath , boolean setExec ) throws IOException {
374375 int BUFFER = 2048 ;
375376 zip = new ZipFile (file );
376377 Enumeration <? extends ZipEntry > zipFileEntries = zip .entries ();
@@ -387,7 +388,16 @@ static void extractFolder(File file, File newPath) throws IOException {
387388 // create the parent directory structure if needed
388389 destinationParent .mkdirs ();
389390
391+ String ext = PApplet .getExtension (currentEntry );
392+ if (setExec && ext .equals ("unknown" )) {
393+ // On some OS X machines the android binaries loose their executable
394+ // attribute, rendering the mode unusable
395+ destFile .setExecutable (true );
396+ }
397+
390398 if (!entry .isDirectory ()) {
399+ // should preserve permissions
400+ // https://bitbucket.org/atlassian/amps/pull-requests/21/amps-904-preserve-executable-file-status/diff
391401 BufferedInputStream is = new BufferedInputStream (zip
392402 .getInputStream (entry ));
393403 int currentByte ;
0 commit comments