From 9498bdd80f16e9d962bbb6f06ecc8c10fa174f44 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Wed, 13 Jan 2016 19:53:24 -0700 Subject: [PATCH] make `raco distribute` work with non-writable exe Closes PR 15214 Merge to v6.4 --- racket/collects/compiler/distribute.rkt | 10 ++++++++- racket/collects/compiler/embed.rkt | 18 +--------------- .../collects/compiler/private/write-perm.rkt | 21 +++++++++++++++++++ 3 files changed, 31 insertions(+), 18 deletions(-) create mode 100644 racket/collects/compiler/private/write-perm.rkt diff --git a/racket/collects/compiler/distribute.rkt b/racket/collects/compiler/distribute.rkt index e486817b1c..e026d8023a 100644 --- a/racket/collects/compiler/distribute.rkt +++ b/racket/collects/compiler/distribute.rkt @@ -11,7 +11,8 @@ "private/macfw.rkt" "private/windlldir.rkt" "private/elf.rkt" - "private/collects-path.rkt") + "private/collects-path.rkt" + "private/write-perm.rkt") (provide assemble-distribution) @@ -59,6 +60,10 @@ orig-binaries sub-dirs types)] + [old-permss (and executables? + (eq? (system-type) 'unix) + (for/list ([b (in-list binaries)]) + (ensure-writable b)))] [single-mac-app? (and executables? (eq? 'macosx (cross-system-type)) (= 1 (length types)) @@ -150,6 +155,9 @@ exts-dir relative-exts-dir relative->binary-relative) + ;; Restore executable permissions: + (when old-permss + (map done-writable binaries old-permss)) ;; Done! (void)))))) diff --git a/racket/collects/compiler/embed.rkt b/racket/collects/compiler/embed.rkt index 00c783b475..9c58d28b80 100644 --- a/racket/collects/compiler/embed.rkt +++ b/racket/collects/compiler/embed.rkt @@ -21,6 +21,7 @@ "private/pe-rsrc.rkt" "private/collects-path.rkt" "private/configdir.rkt" + "private/write-perm.rkt" "find-exe.rkt") @@ -1804,20 +1805,3 @@ [(list? p) (map mac-mred-collects-path-adjust p)] [(relative-path? p) (build-path 'up 'up 'up p)] [else p])) - -;; Returns #f (no change needed) or old permissions -(define (ensure-writable dest-exe) - (cond - [(member 'write (file-or-directory-permissions dest-exe)) - ;; No change needed - #f] - [else - (define old-perms - (file-or-directory-permissions dest-exe 'bits)) - (file-or-directory-permissions dest-exe (bitwise-ior old-perms #o200)) - old-perms])) - -;; Restores old permissions (if not #f) -(define (done-writable dest-exe old-perms) - (when old-perms - (file-or-directory-permissions dest-exe old-perms))) diff --git a/racket/collects/compiler/private/write-perm.rkt b/racket/collects/compiler/private/write-perm.rkt new file mode 100644 index 0000000000..56fdb17885 --- /dev/null +++ b/racket/collects/compiler/private/write-perm.rkt @@ -0,0 +1,21 @@ +#lang racket/base + +(provide ensure-writable + done-writable) + +;; Returns #f (no change needed) or old permissions +(define (ensure-writable dest-exe) + (cond + [(member 'write (file-or-directory-permissions dest-exe)) + ;; No change needed + #f] + [else + (define old-perms + (file-or-directory-permissions dest-exe 'bits)) + (file-or-directory-permissions dest-exe (bitwise-ior old-perms #o200)) + old-perms])) + +;; Restores old permissions (if not #f) +(define (done-writable dest-exe old-perms) + (when old-perms + (file-or-directory-permissions dest-exe old-perms)))