From b9b59a3aeb75b2f85bf99087f8992cceab48d9f6 Mon Sep 17 00:00:00 2001 From: Sam Tobin-Hochstadt Date: Sat, 29 Nov 2014 14:30:39 -0500 Subject: [PATCH] Split `distro-build` and `remote-shell` pkgs from the main repository. `distro-build` is at: https://github.com/racket/distro-build `remote-shell` is at: https://github.com/racket/remote-shell --- .../distro-build-client/LICENSE.txt | 11 - .../distro-build-client/display-time.rkt | 11 - .../distro-build-client/doc.txt | 564 ------------------ .../distro-build-client/info.rkt | 11 - .../distro-build-client/installer-dmg.rkt | 142 ----- .../distro-build-client/installer-exe.rkt | 434 -------------- .../distro-build-client/installer-pkg.rkt | 157 ----- .../distro-build-client/installer-sh.rkt | 87 --- .../distro-build-client/installer-tgz.rkt | 35 -- .../distro-build-client/installer.rkt | 106 ---- .../macosx-installer/pkg-bg.png | Bin 11559 -> 0 bytes .../macosx-installer/racket-rising.png | Bin 16255 -> 0 bytes .../distro-build-client/set-config.rkt | 49 -- .../unix-installer/installer-header | 507 ---------------- .../distro-build-client/unpack-collects.rkt | 32 - .../windows-installer/header-r.bmp | Bin 34254 -> 0 bytes .../windows-installer/header.bmp | Bin 34254 -> 0 bytes .../windows-installer/installer.ico | Bin 25214 -> 0 bytes .../windows-installer/uninstaller.ico | Bin 25214 -> 0 bytes .../windows-installer/welcome.bmp | Bin 206038 -> 0 bytes .../distro-build-lib/LICENSE.txt | 11 - .../distro-build-lib/info.rkt | 12 - .../distro-build-server/LICENSE.txt | 11 - .../distro-build-server/assemble-site.rkt | 142 ----- .../distro-build-server/config.rkt | 205 ------- .../distro-build-server/download-page.rkt | 404 ------------- .../distro-build-server/drive-clients.rkt | 532 ----------------- .../distro-build-server/email.rkt | 74 --- .../distro-build-server/indexes.rkt | 42 -- .../distro-build-server/info.rkt | 17 - .../distro-build-server/install-for-docs.rkt | 70 --- .../distro-build-server/install-pkgs.rkt | 23 - .../distro-build-server/manage-snapshots.rkt | 139 ----- .../distro-build-server/pack-built.rkt | 59 -- .../distro-build-server/pack-collects.rkt | 19 - .../distro-build-server/pkg-info.rkt | 37 -- .../distro-build-server/readme.rkt | 141 ----- .../distro-build-server/serve-catalog.rkt | 181 ------ .../distro-build-server/set-server-config.rkt | 33 - .../distro-build-server/url-options.rkt | 22 - .../distro-build/LICENSE.txt | 11 - pkgs/distro-build-pkgs/distro-build/info.rkt | 10 - pkgs/plt-services/info.rkt | 5 +- pkgs/plt-services/meta/info.rkt | 5 +- pkgs/plt-services/meta/props | 2 - .../remote-shell-doc/LICENSE.txt | 11 - .../remote-shell-doc/info.rkt | 16 - .../remote-shell-doc/remote-shell.scrbl | 196 ------ .../remote-shell-lib/LICENSE.txt | 11 - .../remote-shell-lib/info.rkt | 10 - .../remote-shell-lib/ssh.rkt | 177 ------ .../remote-shell-lib/vbox.rkt | 138 ----- .../remote-shell/LICENSE.txt | 11 - pkgs/remote-shell-pkgs/remote-shell/info.rkt | 10 - 54 files changed, 4 insertions(+), 4929 deletions(-) delete mode 100644 pkgs/distro-build-pkgs/distro-build-client/LICENSE.txt delete mode 100644 pkgs/distro-build-pkgs/distro-build-client/display-time.rkt delete mode 100644 pkgs/distro-build-pkgs/distro-build-client/doc.txt delete mode 100644 pkgs/distro-build-pkgs/distro-build-client/info.rkt delete mode 100644 pkgs/distro-build-pkgs/distro-build-client/installer-dmg.rkt delete mode 100644 pkgs/distro-build-pkgs/distro-build-client/installer-exe.rkt delete mode 100644 pkgs/distro-build-pkgs/distro-build-client/installer-pkg.rkt delete mode 100644 pkgs/distro-build-pkgs/distro-build-client/installer-sh.rkt delete mode 100644 pkgs/distro-build-pkgs/distro-build-client/installer-tgz.rkt delete mode 100644 pkgs/distro-build-pkgs/distro-build-client/installer.rkt delete mode 100644 pkgs/distro-build-pkgs/distro-build-client/macosx-installer/pkg-bg.png delete mode 100644 pkgs/distro-build-pkgs/distro-build-client/macosx-installer/racket-rising.png delete mode 100644 pkgs/distro-build-pkgs/distro-build-client/set-config.rkt delete mode 100644 pkgs/distro-build-pkgs/distro-build-client/unix-installer/installer-header delete mode 100644 pkgs/distro-build-pkgs/distro-build-client/unpack-collects.rkt delete mode 100644 pkgs/distro-build-pkgs/distro-build-client/windows-installer/header-r.bmp delete mode 100644 pkgs/distro-build-pkgs/distro-build-client/windows-installer/header.bmp delete mode 100644 pkgs/distro-build-pkgs/distro-build-client/windows-installer/installer.ico delete mode 100644 pkgs/distro-build-pkgs/distro-build-client/windows-installer/uninstaller.ico delete mode 100644 pkgs/distro-build-pkgs/distro-build-client/windows-installer/welcome.bmp delete mode 100644 pkgs/distro-build-pkgs/distro-build-lib/LICENSE.txt delete mode 100644 pkgs/distro-build-pkgs/distro-build-lib/info.rkt delete mode 100644 pkgs/distro-build-pkgs/distro-build-server/LICENSE.txt delete mode 100644 pkgs/distro-build-pkgs/distro-build-server/assemble-site.rkt delete mode 100644 pkgs/distro-build-pkgs/distro-build-server/config.rkt delete mode 100644 pkgs/distro-build-pkgs/distro-build-server/download-page.rkt delete mode 100644 pkgs/distro-build-pkgs/distro-build-server/drive-clients.rkt delete mode 100644 pkgs/distro-build-pkgs/distro-build-server/email.rkt delete mode 100644 pkgs/distro-build-pkgs/distro-build-server/indexes.rkt delete mode 100644 pkgs/distro-build-pkgs/distro-build-server/info.rkt delete mode 100644 pkgs/distro-build-pkgs/distro-build-server/install-for-docs.rkt delete mode 100644 pkgs/distro-build-pkgs/distro-build-server/install-pkgs.rkt delete mode 100644 pkgs/distro-build-pkgs/distro-build-server/manage-snapshots.rkt delete mode 100644 pkgs/distro-build-pkgs/distro-build-server/pack-built.rkt delete mode 100644 pkgs/distro-build-pkgs/distro-build-server/pack-collects.rkt delete mode 100644 pkgs/distro-build-pkgs/distro-build-server/pkg-info.rkt delete mode 100644 pkgs/distro-build-pkgs/distro-build-server/readme.rkt delete mode 100644 pkgs/distro-build-pkgs/distro-build-server/serve-catalog.rkt delete mode 100644 pkgs/distro-build-pkgs/distro-build-server/set-server-config.rkt delete mode 100644 pkgs/distro-build-pkgs/distro-build-server/url-options.rkt delete mode 100644 pkgs/distro-build-pkgs/distro-build/LICENSE.txt delete mode 100644 pkgs/distro-build-pkgs/distro-build/info.rkt delete mode 100644 pkgs/remote-shell-pkgs/remote-shell-doc/LICENSE.txt delete mode 100644 pkgs/remote-shell-pkgs/remote-shell-doc/info.rkt delete mode 100644 pkgs/remote-shell-pkgs/remote-shell-doc/remote-shell.scrbl delete mode 100644 pkgs/remote-shell-pkgs/remote-shell-lib/LICENSE.txt delete mode 100644 pkgs/remote-shell-pkgs/remote-shell-lib/info.rkt delete mode 100644 pkgs/remote-shell-pkgs/remote-shell-lib/ssh.rkt delete mode 100644 pkgs/remote-shell-pkgs/remote-shell-lib/vbox.rkt delete mode 100644 pkgs/remote-shell-pkgs/remote-shell/LICENSE.txt delete mode 100644 pkgs/remote-shell-pkgs/remote-shell/info.rkt diff --git a/pkgs/distro-build-pkgs/distro-build-client/LICENSE.txt b/pkgs/distro-build-pkgs/distro-build-client/LICENSE.txt deleted file mode 100644 index 2f13367cd2..0000000000 --- a/pkgs/distro-build-pkgs/distro-build-client/LICENSE.txt +++ /dev/null @@ -1,11 +0,0 @@ -distro-build -Copyright (c) 2010-2014 PLT Design Inc. - -This package is distributed under the GNU Lesser General Public -License (LGPL). This means that you can link this package into proprietary -applications, provided you follow the rules stated in the LGPL. You -can also modify this package; if you distribute a modified version, -you must distribute it under the terms of the LGPL, which in -particular means that you must release the source code for the -modified software. See http://www.gnu.org/copyleft/lesser.html -for more information. diff --git a/pkgs/distro-build-pkgs/distro-build-client/display-time.rkt b/pkgs/distro-build-pkgs/distro-build-client/display-time.rkt deleted file mode 100644 index c81278b938..0000000000 --- a/pkgs/distro-build-pkgs/distro-build-client/display-time.rkt +++ /dev/null @@ -1,11 +0,0 @@ -#lang racket/base -(require racket/date) - -(provide display-time) - -(define (display-time) - (define now (seconds->date (current-seconds))) - (printf "[~a] The time is now ~a\n" - (parameterize ([date-display-format 'iso-8601]) - (date->string now #t)) - (date->string now #t))) diff --git a/pkgs/distro-build-pkgs/distro-build-client/doc.txt b/pkgs/distro-build-pkgs/distro-build-client/doc.txt deleted file mode 100644 index ceca0de398..0000000000 --- a/pkgs/distro-build-pkgs/distro-build-client/doc.txt +++ /dev/null @@ -1,564 +0,0 @@ -Site Configuration Modules -========================== - -A build farm is normally run via the `installers', `site', or -`snapshot-site' target of the Racket repository's top-level -makefile. Each of those targets uses `installers', which expects a -`CONFIG=...' argument to specify a configuration module file (or uses -"build/site.rkt" as the default). - -A site configuration module starts `#lang distro-build/config' and -uses keywords to specify various options for the configuration. This -format is described is detail further below; for now, it's enough to -know that there are various options, each of which is associated with -a keyword. - -The machine where `make installers' is run is the server machine. -The server machine first prepares packages for installation on -clients. The site configuration's top-level entry is consulted for -a `#:pkgs' and/or `#:doc-search' option, which overrides any `PKGS' -and/or `DOC_SEARCH' configuration from the makefile. - -The site configuration file otherwise describes and configures -client machines hierarchically, where configuration options -propagate down the hierarchy when they are not overridden more -locally. - -Each client is normally built by running commands via `ssh', where the -client's host, `#:host' (with and optional `#:port' and/or `#:user') -indicate the `ssh' target. Each client machine must be set up with a -public-key authentication, because a direct `ssh' is expected to work -without a password prompt. An exception is when the host is -"localhost" and user is #f, in which case a shell is used directly -instead of `ssh'. When `ssh` is used, -R is also used to create a -tunnel back to the server, and the client by default uses that tunnel -for all communication, and the server by default accepts only -connections via "localhost". - -On the client machine, all work is performed at a specified -directory as specified by `#:dir'. The directory defaults to -"build/plt" (Unix, Mac OS X) or "build\\plt" (Windows), except when -the host is "localhost" and the client is #f, in which case the -current directory (i.e., the server's directory) is used. - -Normally, the client directory is a git clone: - - - If the directory exists already on a client machine (and the - machine is not configured for "clean" mode), then if the directory - contains a ".git" subdirectory, it is assumed to be a git clone - and updated with `git pull'. The `git pull' operation can be - disabled by specifying `#:pull?' as #f, and it defaults to #f - in the case that `#:dir' is not specified, the host is - "localhost", and the user is #f. - - - If the directory does not exist, a git repository is - cloned. The repository can be specified with `#:repo'. By - default, the server is used as the source git repository (so - that the server and client are in sync), which means that the - server's directory must be a git clone. - -Note that neither `ssh' nor `git' turn out to be needed when the host -is "localhost", the user is #f, and the directory is not specified -(which corresponds to the defaults in all cases). - -If a build fails for a machine, building continues on other -machines. Success for a given machine means that its installer -ends up in "build/installers" (and failure for a machine means no -installer) as recorded in the "table.rktd" file. - -To use the `site' makefile target, the configuration file must at -least provide a `#:dist-base-url' value, which is a URL at which the -site will be made available. To use the `snapshot-site' makefile -target, then `#:site-dest' will need to be specified, normally as a -path that ends with the value produced by `(current-stamp)'. - -Hint: When developing a configuration file, use an empty set of -packages to a configuration that works as quickly as possible. Then, -change the list of packages to the ones that you actually want in the -installers. - -Machine Requirements --------------------- - -Each Unix or Mac OS X client needs the following available: - - * SSH server with public-key authentication (except "localhost") - * git (unless the working directory is ready) - * gcc, make, etc. - -Each Windows client needs the following: - - * SSH server with public-key authentication, providing either a - Windows command line (like freeSSHd) or bash with access to - cmd.exe (like Cygwin's opensshd) - * git (unless the working directory is ready) - * Microsoft Visual Studio (version >= 9.0, <= 12.0), installed - in the default folder: - C:\Program Files\Microsoft Visual Studio - or - C:\Program Files (x86)\Microsoft Visual Studio - * Nullsoft Scriptable Install System (NSIS) verstion 2.x, installed - in the default folder: - C:\Program Files\NSIS\makensis.exe - or - C:\Program Files (x86)\NSIS\makensis.exe - or installed so that `makensis' in your PATH. - -Site Configuration -------------------- - -A site configuration module is normally written in the -`distro-build/config' language. The configuration describes individual -machines, and groups them with `parallel' or `sequential' to indicate -whether the machine's builds should run sequentially or in parallel. -Options specified at `parallel' or `sequential' are propagated to each -machine in the group. - -Site-configuration keywords (where means no spaces, etc.): - - #:host --- defaults to "localhost" - - #:name --- defaults to host; this string is recorded as a - description of the installer and can be used in a generated table of - installer links; see also "Names and Download Pages" below - - #:port --- SSH port for the client; defaults to 22 - - #:user --- SSH user for the client; defaults to #f, - which means the current user - - #:dir --- defaults to "build/plt" or "build\\plt", or - to the current directory if the host is "localhost" and the user - is #f - - #:server --- the address of the server as accessed by the - client; when ssh remote tunneling works, then "localhost" should - work to reach the server; defaults to the `SERVER' makefile - variable, which in turn defaults to "localhost" - - #:server-port --- the port of the server as accessed by - the client, and also the port started on clients to tunnel back to - the server; defaults to the `SERVER_PORT' makefile variable, which - in turn defaults to 9440 - - #:server-hosts --- addresses that determine the - interfaces on which the server listens; an empty list means all of - the server's interfaces, while `(list "localhost")' listens only - on the loopback device; defaults to the `SERVER_HOSTS` makefile - variable split on commas, which in turn defaults to `(list - "localhost")' - - #:repo --- the git repository for Racket; defaults to - "http://:/.git" - - #:pkgs '( ...) --- packages to install; defaults to the - `PKGS' makefile variable - - #:dist-base-url --- a URL that is used to construct a - default for `#:doc-search' and `#:dist-catalogs', where the - constructed values are consistent with converting a build server's - content into a download site; since URLs are constructed via - relative paths, this URL normally should end with a slash - - #:doc-search --- URL to install as the configuration for - remote documentation searches in generated installers; "" is - replaced with the PLT default; defaults to #:dist-base-url (if - present) extended with "doc/local-redirect/index.html", or the - `DOC_SEARCH' makefile variable - - #:install-name --- string used as the name of the - installation for package operations in the `user' package scope, - where "" keeps the name as the Racket version; the default is - "snapshot" if the value of `#:release?' is false, "" otherwise. - - #:build-stamp --- a string representing a build stamp, - recorded in installes; the default is from the `BUILD_STAMP' - makefile variable or generated if the value of `#:release?' is - false, "" otherwise. - - #:dist-name --- the distribution name; defaults to the - `DIST_NAME' makefile variable - - #:dist-base --- the distribution's installater name prefix; - defaults to the `DIST_BASE' makefile variable - - #:dist-dir --- the distribution's installation directory; - defaults to the `DIST_DIR' makefile variable - - #:dist-suffix --- a suffix for the installer's name, - usually used for an OS variant; defaults to the `DIST_SUFFIX' - makefile variable - - #:dist-catalogs '( ...) --- catalog URLs to install as the - initial catalog configuration in generated installed, where "" is - replaced with the PLT default catalogs; defaults to - `#:dist-base-url' (if present) extended with "catalogs" in a list - followed by "" - - #:readme --- the content of a "README" file - to include in installers, or a function that takes a hash table - for a configuration and returns a string; the default is the - `make-readme' function from `distro-build/readme' (see below) - - #:max-vm --- max number of VMs allowed to run with this - machine, counting the machine; defaults to 1 - - #:vbox --- Virtual Box machine name (as shown, for example, - in the Virtual Box GUI); if provided, the virtual machine is - started and stopped on the server as needed - - #:platform --- 'unix, 'macosx, 'windows, or 'windows/bash - (which means 'windows though an SSH server providing `bash', such - as Cygwin's); defaults to `(system-type)' - - #:configure '( ...) --- arguments to `configure' - - #:bits --- 32 or 64, affects Visual Studio mode - - #:vc --- provided to "vcvarsall/bat" to select the Visual - Studio build mode; the default is "x86" or "x86_amd64", depending - on `#:bits' - - #:sign-identity --- provides an identity to be passed to - `codesign` for code signing on Mac OS X (for all executables in a - distribution), where an empty string disables signing; the default - is "" - - #:j --- parallelism for `make' on Unix and Mac OS X and - for `raco setup' on all platforms; defaults to 1 - - #:timeout --- numbers of seconds to wait before declaring - failure; defaults to 30 minutes - - #:clean? --- if true, then the build process on the client - machine starts by removing ; set this to #f for a shared repo - checkout; the default is determined by the `CLEAN_MODE' makefile - variable, unless `#:host' is "localhost", `#:user' is #f, and - `#:dir' is not specified, in which case the default is #f - - #:pull? --- if true, then the build process on the client - machine starts by a `git pull' in `#:dir'; set to #f, for example, - for a repo checkout that is shared with server; the default is #t, - unless `#:host' is "localhost", `#:user' is #f, and `#:dir' is not - specified, in which case the default is #f - - #:release? --- if true, then create release-mode - installers; the default is determined by the `RELEASE_MODE' - makefile variable - - #:source? --- determines the default value for - `#:source-runtime?' and `#:source-pkgs' - - #:source-runtime? --- if true, then create an archive that - contains the run-time system in source form (possibly with built - packages), instead of a platform-specific installer; a #t value - works best when used with a Unix client machine, since Unix - clients typically have no native-library packages; the default is - the value of `#:source?' - - #:source-pkgs? --- if true, then packages are included in - the installer/archive only in source form; a true value works best - when the `#:source-runtime?' value is also #t; the default is the - value of `#:source?' - - #:versionless? --- if true, avoids including the Racket - version number in an installer's name or in the installation path; - the default is determined by the `VERSIONLESS_MODE' makefile - variable - - #:mac-pkg? --- if true, creates a ".pkg" for Mac OS X (in - single-file format) instead of a ".dmg"; the default is #f - - #:pause-before --- a pause in seconds to - wait before starting a machine, which may help a virtual machine - avoid confusion from being stopped and started too quickly; the - default is 0 - - #:pause-after --- a pause in seconds to - wait after stopping a machine; the default is 0 - - #:custom --- a hash table mapping arbitrary keywords to - arbitrary values; when a value for `#:custom' is overriden in a - nested configuration, the new table is merged with the overriden - one; use such a table for additional configuration entries other - than the built-in ones, where additional entires may be useful to - a `#:readme' procedure - -Top keywords (recognized only in the configuration top-level): - - #:site-dest --- destination for completed build, used - by the `site' and `snapshot-site' makefile targets; the default is - "build/site" - - #:pdf-doc? --- whether to build PDF documentation when - assembling a site; the default is #f - - #:email-to --- a list of addresses to receive - e-mail reporting build results; mail is sent via `sendmail' - unless `#:smtp-...' configuration is supplied - - #:email-from --- address used as the sender of e-mailed - reports; the first string in `#:email-to' is used by default - - #:smtp-server - #:smtp-port - #:smtp-connect <'plain, 'ssl, or 'tls> - #:smtp-user - #:smtp-password - --- configuration for sending e-mail through SMTP instead of - `sendmail'; the `#:smtp-port' default (25, 465, or 587) is picked - based on `#:smtp-connect', which in turn defaults to 'plain; - supply non-#f `#:smtp-user' and `#:smtp-password' when - authentication is required by the server - - #:site-help --- hash table of extra "help" information - for entries on a web page created by the `site' and - `snapshot-site' makefile targets; the hash keys are strings for - row labels in the download table (after splitting on "|" and - removing "{...}"), and the values are X-expressions for the help - content - - #:site-title --- title for the main page generated - by the `site' or `snapshot-site' makefile target; the default - is "Racket Downloads" - - #:max-snapshots --- number of snapshots to keep, used by - the `snapshot-site' makefile target - - #:plt-web-style? --- indicates whether `plt-web` should - be used to generate a site or snapshot page; the default is #t - -More precisely, the `distro-build/config' language is like -`racket/base' except that the module body must have exactly one -expression (plus any number of definitions, etc.) that produces a -site-configuration value. The value is exported as `site-config' -from the module. Any module can act as a site-configuration module -a long as it exports `site-config' as a site-configuration value. - -The `distro-build/config' language also adds the following functions -to `racket/base': - - (machine ... ...) -> site-config? - Produces a site configuration based on the given keyword-based - options. The support keyword arguments are described above. - - (sequential ... ... config ...) - -> site-config? - config : site-config? - Produces a site configuration that runs each `config' - sequentially. The support keyword arguments are described above. - - (parallel ... ... config ...) - -> site-config? - config : site-config? - Produces a site configuration that runs each `config' in - parallel. The support keyword arguments are described above. - - (site-config? v) -> boolean? - (site-config-tag config) -> (or/c 'machine 'sequential 'parallel) - config : site-config? - (site-config-options config) -> (hash/c keyword? any/c) - config : site-config? - (site-config-content config) -> (listof site-config?) - config : site-config? - Site configuation inspection - - (current-mode) -> string? - (current-mode s) -> void? - s : string? - A parameter whose value is the user's requested mode for this - configuration, normally as provided via the makefile's - `CONFIG_MODE' variable. The default mode is "default". The - interpretation of modes is completely up to the - site configuration file. - - (current-stamp) -> string? - Returns a string to identify the current build, normally a - combination of the date and a git commit hash. - -READMEs -------- - -The `distro-build/readme' library provides functions for constructing -a README file's content. Each function takes a hash table mapping -configuration keywords to values. - - (make-readme config) -> string - config : hash? - Produces basic "README" content, using information about the - distribution and the Racket license. The content is constructed - using `config' keywords such as `#:name', `#:platform', - `#:dist-name', and `#:dist-catalogs', and sometimes `current-stamp'. - - (make-macosx-notes config) -> string - config : hash? - Produces "README" content to tell Mac OS X users how to install a - distribution folder. This function is used by `make-readme' when - `#:platform' in `config' is 'macosx. - -Names and Download Pages ------------------------- - -The `#:name' for an installer is used in an HTML table of download -links by the `site' or `snapshot-site' targets. The names are first -sorted. Then, for the purposes of building the table, a "|" separated -by any number of spaces within a name is treated as a hierarchical -delimiter, while anything within "{" and "}" in a hierarchical level -is stripped from the displayed name along with surrounding spaces (so -that it can affect sorting without being displayed). Anything after "; -" within a "|"-separated part is rendered as a detail part of the -label (e.g., in a smaller font). - -For example, the names - - "Racket | {2} Linux | 32-bit" - "Racket | {2} Linux | 64-bit; built on Ubuntu" - "Racket | {1} Windows | 32-bit" - "Racket | {1} Windows | 64-bit" - "Racket | {3} Source" - -are shown (actually or conceptually) as - - Racket - Windows - [32-bit] - [64-bit] - Linux - [32-bit] - [64-bit] - [Source] - -where the square-bracketed entries are hyperlinks and the -angle-bracketed pieces are details. - -Examples --------- - -** Single Installer ** - -The simplest possible configuration file is - - #lang distro-build/config - (machine) - -In fact, this configuration file is created automatically as -"build/site.rkt" (if the file does not exist already) and used as the -default configuration. With this configuration, - - make installers - -creates an installer in "build/installers" for the platform that is -used to create the installer. - -** Installer Web Page *** - -To make a web page that serves both a minimal installer and packages, -create a "site.rkt" file with - - #lang distro-build/config - - (sequential - ;; The packages that will be available: - #:pkgs '("main-distribution") - ;; FIXME: the URL where the installer and packages will be: - #:dist-base-url "http://my-server.domain/snapshot/" - (machine - ;; FIXME: the way the installer is described on the web page: - #:name "Minimal Racket | My Platform" - ;; The packages in this installer: - #:pkgs '())) - -then - - make site CONFIG=site.rkt - -creates a "build/site" directory that you can move to your web server's -"snapshot" directory, so that "build/site/index.html" is the main -page, and so on. - -** Accumulated Shapshots Web Page ** - -To make a web site that provides some number (5, by default) of -snapshots, use `(current-stamp)' when constructing the -`#:dist-base-url' value. Also, use `(current-stamp)' as the directory -for assembling the "site": - - #lang distro-build/config - (sequential - ;; The packages that will be available: - #:pkgs '("gui-lib") - ;; FIXME: the URL where the installer and packages will be: - #:dist-base-url (string-append "http://my-server.domain/snapshots/" - (current-stamp) "/") - ;; The local directory where a snapshot is written - #:site-dest (build-path "build/site" (current-stamp)) - (machine - ;; FIXME: the way the installer is described on the web page: - #:name "Minimal Racket | My Platform" - ;; The packages in this installer: - #:pkgs '())) - -Then, - - make snapshot-site CONFIG=site.rkt - -creates a "build/site" directory that you can move to your web -server's "snapshots" directory, so that "build/site/index.html" is the -main page that initially points to "build/site//index.html", -and so on. To make a newer snapshot, update the git repository, leave -"build/site" in place, and run - - make snapshot-site CONFIG=site.rkt - -again. The new installers will go into a new subdirectory, and -the main "index.html" file will be rewritten to point to them. - -** Multiple Platforms ** - -A configuration module that drives multiple clients to build -installers might look like this: - - #lang distro-build/config - - (sequential - #:pkgs '("drracket") - #:server-hosts '() ; Insecure? See below. - (machine - #:desc "Linux (32-bit, Precise Pangolin)" - #:name "Ubuntu 32" - #:vbox "Ubuntu 12.04" - #:host "192.168.56.102") - (machine - #:desc "Windows (64-bit)" - #:name "Windows 64" - #:host "10.0.0.7" - #:server "10.0.0.1" - #:dir "c:\\Users\\racket\\build\\plt" - #:platform 'windows - #:bits 64)) - -The configuration describes using the hosts "192.168.56.1" and -"10.0.0.7" for Linux and Windows builds, respectively, which are run -one at a time. - -The Linux machine runs in VirtualBox on the server machine (in a -virtual machine named "Ubuntu 12.04"). It contacts the server still as -"localhost", and that works because the ssh connection to the Linux -machine creates a tunnel (at the same port as the server's, wjich -defaults to 9440). - -The Windows machine uses freeSSHd (not a `bash'-based SSH server like -Cygwin) and communicates back to the server as "10.0.0.1" instead of -using an SSH tunnel. To make that work, `#:server-hosts' is specified -as the empty list to make the server listen on all interfaces (instead -of just "localhost") --- which is possibly less secure than the -default restriction that allows build-server connections only via -"localhost". - -With this configuration file in "site.rkt", - - make installers CONFIG=site.rkt - -produces two installers, both in "build/installers", and a hash table -in "table.rktd" that maps "Linux (32-bit, Precise Pangolin)" to the -Linux installer and "Windows (64-bit)" to the Windows installer. diff --git a/pkgs/distro-build-pkgs/distro-build-client/info.rkt b/pkgs/distro-build-pkgs/distro-build-client/info.rkt deleted file mode 100644 index 48249db045..0000000000 --- a/pkgs/distro-build-pkgs/distro-build-client/info.rkt +++ /dev/null @@ -1,11 +0,0 @@ -#lang info - -(define collection "distro-build") - -(define deps '("base" - "ds-store-lib")) -(define build-deps '("at-exp-lib")) - -(define pkg-desc "client-side part of \"distro-build\"") - -(define pkg-authors '(mflatt)) diff --git a/pkgs/distro-build-pkgs/distro-build-client/installer-dmg.rkt b/pkgs/distro-build-pkgs/distro-build-client/installer-dmg.rkt deleted file mode 100644 index b4793f2185..0000000000 --- a/pkgs/distro-build-pkgs/distro-build-client/installer-dmg.rkt +++ /dev/null @@ -1,142 +0,0 @@ -#lang at-exp racket/base -(require racket/system - racket/file - racket/format - racket/runtime-path - ds-store - ds-store/alias) - -(provide installer-dmg - make-dmg) - -(define hdiutil "/usr/bin/hdiutil") -(define codesign "/usr/bin/codesign") - -(define-runtime-path bg-image "macosx-installer/racket-rising.png") - -(define (system*/show . l) - (displayln (apply ~a #:separator " " l)) - (flush-output) - (unless (apply system* l) - (error "failed"))) - -(define (make-dmg volname src-dir dmg bg readme sign-identity) - (define tmp-dmg (make-temporary-file "~a.dmg")) - (define work-dir - (let-values ([(base name dir?) (split-path src-dir)]) - (build-path base "work"))) - (when (file-exists? dmg) (delete-file dmg)) - (delete-directory/files work-dir #:must-exist? #f) - (make-directory* work-dir) - (printf "Copying ~a\n" src-dir) - (define dest-dir (build-path work-dir volname)) - (copy-directory/files src-dir dest-dir - #:keep-modify-seconds? #t) - (when readme - (call-with-output-file* - (build-path work-dir volname "README.txt") - #:exists 'truncate - (lambda (o) - (display readme o)))) - (when bg - (copy-file bg (build-path work-dir ".bg.png"))) - (unless (string=? sign-identity "") - (sign-executables dest-dir sign-identity)) - ;; The following command should work fine, but it looks like hdiutil in 10.4 - ;; is miscalculating the needed size, making it too big in our case (and too - ;; small with >8GB images). It seems that it works to first generate an - ;; uncompressed image and then convert it to a compressed one. - ;; hdiutil create -format UDZO -imagekey zlib-level=9 -ov \ - ;; -mode 555 -volname volname -srcfolder . dmg - ;; So, first create an uncompressed image... - (parameterize ([current-directory work-dir]) - (system*/show hdiutil - "create" "-format" "UDRW" "-ov" - "-mode" "755" "-volname" volname "-srcfolder" "." - tmp-dmg)) - ;; Then do the expected dmg layout... - (when bg - (dmg-layout tmp-dmg volname ".bg.png")) - ;; And create the compressed image from the uncompressed image: - (system*/show hdiutil - "convert" "-format" "UDBZ" "-imagekey" "zlib-level=9" "-ov" - tmp-dmg "-o" dmg) - (delete-file tmp-dmg)) - -(define (sign-executables dest-dir sign-identity) - ;; Sign any executable in "bin", top-level ".app", or either of those in "lib" - (define (check-bins dir) - (for ([f (in-list (directory-list dir #:build? #t))]) - (when (and (file-exists? f) - (member 'execute (file-or-directory-permissions f)) - (member (call-with-input-file - f - (lambda (i) - (define bstr (read-bytes 4 i)) - (and (bytes? bstr) - (= 4 (bytes-length bstr)) - (integer-bytes->integer bstr #f)))) - '(#xFeedFace #xFeedFacf))) - (system*/show codesign "-s" sign-identity f)))) - (define (check-apps dir) - (for ([f (in-list (directory-list dir #:build? #t))]) - (when (and (directory-exists? f) - (regexp-match #rx#".app$" f)) - (define name (let-values ([(base name dir?) (split-path f)]) - (path-replace-suffix name #""))) - (define exe (build-path f "Contents" "MacOS" name)) - (when (file-exists? exe) - (system*/show codesign "-s" sign-identity f))))) - (check-bins (build-path dest-dir "bin")) - (check-bins (build-path dest-dir "lib")) - (check-apps dest-dir) - (check-apps (build-path dest-dir "lib"))) - -(define (dmg-layout dmg volname bg) - (define-values (mnt del?) - (let ([preferred (build-path "/Volumes/" volname)]) - (if (not (directory-exists? preferred)) - ;; Use the preferred path so that the alias is as - ;; clean as possible: - (values preferred #f) - ;; fall back to using a temporary directory - (values (make-temporary-file "~a-mnt" 'directory) #t)))) - (system*/show hdiutil - "attach" "-readwrite" "-noverify" "-noautoopen" - "-mountpoint" mnt dmg) - (define alias (path->alias-bytes (build-path mnt bg) - #:wrt mnt)) - (make-file-or-directory-link "/Applications" (build-path mnt "Applications")) - (define (->path s) (string->path s)) - (write-ds-store (build-path mnt ".DS_Store") - (list - (ds 'same 'BKGD 'blob - (bytes-append #"PctB" - (integer->integer-bytes (bytes-length alias) 4 #t #t) - (make-bytes 4 0))) - (ds 'same 'ICVO 'bool #t) - (ds 'same 'fwi0 'blob - ;; Window location (size overridden below), sideview off: - (fwind 160 320 540 1000 'icnv #f)) - (ds 'same 'fwsw 'long 135) ; window sideview width? - (ds 'same 'fwsh 'long 380) ; window sideview height? - (ds 'same 'icgo 'blob #"\0\0\0\0\0\0\0\4") ; ??? - (ds 'same 'icvo 'blob - ;; folder view options: - #"icv4\0\200nonebotm\0\0\0\0\0\0\0\0\0\4\0\0") - (ds 'same 'icvt 'shor 16) ; icon label size - (ds 'same 'pict 'blob alias) - (ds (->path ".bg.png") 'Iloc 'blob (iloc 900 180)) ; file is hidden, anway - (ds (->path "Applications") 'Iloc 'blob (iloc 500 180)) - (ds (->path volname) 'Iloc 'blob (iloc 170 180)))) - (system*/show hdiutil "detach" mnt) - (when del? - (delete-directory mnt))) - -(define (installer-dmg human-name base-name dist-suffix readme sign-identity) - (define dmg-name (format "bundle/~a-~a~a.dmg" - base-name - (system-library-subpath #f) - dist-suffix)) - (make-dmg human-name "bundle/racket" dmg-name bg-image readme sign-identity) - dmg-name) diff --git a/pkgs/distro-build-pkgs/distro-build-client/installer-exe.rkt b/pkgs/distro-build-pkgs/distro-build-client/installer-exe.rkt deleted file mode 100644 index 5ca6b62b02..0000000000 --- a/pkgs/distro-build-pkgs/distro-build-client/installer-exe.rkt +++ /dev/null @@ -1,434 +0,0 @@ -#lang at-exp racket/base -(require racket/format - racket/list - racket/system - racket/path - racket/runtime-path - setup/getinfo) - -(provide installer-exe) - -(define-runtime-path installer-dir "windows-installer") - -(define (get-exe-actions src-dir filename combine) - (define f (build-path src-dir "lib" filename)) - (for/list ([(k v) (if (file-exists? f) - (call-with-input-file* f read) - (hash))]) - (combine k v))) - -(define (get-extreg src-dir) - (apply - append - (get-exe-actions src-dir "extreg.rktd" - (lambda (k v) - (for/list ([v (in-list v)]) - (append v (list k))))))) - -(define (get-startmenu src-dir) - (get-exe-actions src-dir "startmenu.rktd" - (lambda (k v) k))) - -(define (get-auto-launch src-dir) - (define l - (filter (lambda (p) (real? (cdr p))) - (get-exe-actions src-dir "startmenu.rktd" - cons))) - (if (null? l) - #f - (path-replace-suffix (caar (sort l < #:key cdr)) #""))) - -(define (try-exe f) - (and (file-exists? f) f)) - -(define (nsis-generate dest distname version winplatform - makensis - #:extension-registers [extregs null] - #:start-menus [startmenus null] - #:versionless [versionless? #t] - #:simple? [simple? #f] - #:auto-launch [auto-launch #f]) - (define distdir (regexp-replace* #rx" " distname "-")) - (define destfilename (file-name-from-path dest)) - (define-values (version1 version2 version3 version4) - (apply - values - (take (cdr (regexp-match #rx"^([0-9]*)[.]([0-9]*)[.]([0-9]*)[.]([0-9]*)" - (string-append version ".0.0.0"))) - 4))) - (define got-files (make-hash)) - (define (get-file s) - (unless (hash-ref got-files s #f) - (define dest (build-path "bundle" s)) - (unless (file-exists? dest) - (hash-set! got-files s #t) - (copy-file (build-path installer-dir s) dest))) - s) - (define script - @~a{ -!include "MUI2.nsh" -!include "WinVer.nsh" -!include "nsDialogs.nsh" - -;; ==================== Configuration - -!define RKTVersion "@|version|" -!define RKTVersionLong "@|version1|.@|version2|.@|version3|.@|version4|" -;; Full name for the package, and a short name for installer texts -!define RKTHumanName "@|distname| v@|version| (@|winplatform|)" -!define RKTShortName "@|distname|" -!define RKTStartName "@|distname|@(if versionless? "" @~a{ v@|version|})" -!define RKTDirName "@|distdir|@(if versionless? "" @~a{-@|version|})" -!define RKTRegName "@|distdir|-@|winplatform|-@|version|" -!define RKTProgFiles "$PROGRAMFILES@(if (equal? winplatform "x86_64") "64" "")" -@(if simple? @~a{!define SimpleInstaller} "") -@(if auto-launch @~a{!define RKTLaunchProgram "@|auto-launch|"} "") - -Name "${RKTHumanName}" -OutFile "@|destfilename|" - -BrandingText "${RKTHumanName}" -BGGradient 4040A0 101020 - -SetCompressor /SOLID "LZMA" - -InstallDir "${RKTProgFiles}\${RKTDirName}" -!ifndef SimpleInstaller - InstallDirRegKey HKLM "Software\${RKTRegName}" "" -!endif -!define MUI_STARTMENUPAGE_DEFAULTFOLDER "${RKTStartName}" -!define MUI_ICON "@(get-file "installer.ico")" -!define MUI_UNICON "@(get-file "uninstaller.ico")" -!define MUI_HEADERIMAGE -!define MUI_HEADERIMAGE_BITMAP "@(get-file "header.bmp")" -!define MUI_HEADERIMAGE_BITMAP_RTL "@(get-file "header-r.bmp")" -!define MUI_HEADERIMAGE_RIGHT - -!define MUI_WELCOMEFINISHPAGE_BITMAP "@(get-file "welcome.bmp")" -!define MUI_UNWELCOMEFINISHPAGE_BITMAP "@(get-file "welcome.bmp")" - -!define MUI_WELCOMEPAGE_TITLE "${RKTHumanName} Setup" -!define MUI_UNWELCOMEPAGE_TITLE "${RKTHumanName} Uninstall" -!ifdef SimpleInstaller - !define MUI_WELCOMEPAGE_TEXT "This is a simple installer for ${RKTShortName}.$\r$\n$\r$\nIt will only create the @|distname| folder. To uninstall, simply remove the folder.$\r$\n$\r$\n$_CLICK" -!else - !define MUI_WELCOMEPAGE_TEXT "This wizard will guide you through the installation of ${RKTShortName}.$\r$\n$\r$\nPlease close any running Racket applications so the installer can update the relevant system files.$\r$\n$\r$\n$_CLICK" -!endif -!define MUI_UNWELCOMEPAGE_TEXT "This wizard will guide you through the removal of ${RKTShortName}.$\r$\n$\r$\nBefore starting, make sure no Racket applications are running.$\r$\n$\r$\n$_CLICK" - -!define MUI_FINISHPAGE_TITLE "${RKTHumanName}" -!ifdef SimpleInstaller - !define MUI_FINISHPAGE_RUN - !define MUI_FINISHPAGE_RUN_FUNCTION OpenInstDir - Function OpenInstDir - ExecShell "" "$INSTDIR" - FunctionEnd - !define MUI_FINISHPAGE_RUN_TEXT "Open the installation folder" -@(if auto-launch - @~a{ - !else - !define MUI_FINISHPAGE_RUN "$INSTDIR\${RKTLaunchProgram}.exe" - !define MUI_FINISHPAGE_RUN_TEXT "Run ${RKTLaunchProgram}"} - "") -!endif -!define MUI_FINISHPAGE_LINK "Visit the Racket web site" -!define MUI_FINISHPAGE_LINK_LOCATION "http://racket-lang.org/" - -; !define MUI_UNFINISHPAGE_NOAUTOCLOSE ; to allow users see what was erased - -!define MUI_STARTMENUPAGE_REGISTRY_ROOT "HKLM" -!define MUI_STARTMENUPAGE_REGISTRY_KEY "Software\${RKTRegName}" -!define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "Start Menu Folder" - -; Doesn't work on some non-xp machines -; !define MUI_INSTFILESPAGE_PROGRESSBAR colored - -VIProductVersion "${RKTVersionLong}" -VIAddVersionKey "ProductName" "Racket" -VIAddVersionKey "Comments" "This is the Racket language, see http://racket-lang.org/." -VIAddVersionKey "CompanyName" "PLT Design Inc." -VIAddVersionKey "LegalCopyright" "© PLT Design Inc." -VIAddVersionKey "FileDescription" "Racket Installer" -VIAddVersionKey "FileVersion" "${RKTVersion}" - -;; ==================== Variables - -!ifndef SimpleInstaller - Var MUI_TEMP - Var STARTMENU_FOLDER -!endif - -;; ==================== Interface - -!define MUI_ABORTWARNING - -; Install -!insertmacro MUI_PAGE_WELCOME -!define MUI_PAGE_CUSTOMFUNCTION_LEAVE myTestInstDir -!insertmacro MUI_PAGE_DIRECTORY -!ifndef SimpleInstaller - !insertmacro MUI_PAGE_STARTMENU Application $STARTMENU_FOLDER -!endif -!insertmacro MUI_PAGE_INSTFILES - -; Uncheck and hide the "run" checkbox on vista, since it will run with -; elevated permissions (see also ../nsis-vista-note.txt) -!define MUI_PAGE_CUSTOMFUNCTION_SHOW DisableRunCheckBoxIfOnVista -!insertmacro MUI_PAGE_FINISH -Function DisableRunCheckBoxIfOnVista - ${If} ${AtLeastWinVista} - ; use EnableWindow instead of ShowWindow to just disable it - ShowWindow $mui.FinishPage.Run 0 - ${NSD_Uncheck} $mui.FinishPage.Run - ${EndIf} -FunctionEnd - -!ifndef SimpleInstaller - ; Uninstall - !define MUI_WELCOMEPAGE_TITLE "${MUI_UNWELCOMEPAGE_TITLE}" - !define MUI_WELCOMEPAGE_TEXT "${MUI_UNWELCOMEPAGE_TEXT}" - ; !insertmacro MUI_UNPAGE_WELCOME - !insertmacro MUI_UNPAGE_CONFIRM - !insertmacro MUI_UNPAGE_INSTFILES - ; !insertmacro MUI_UNPAGE_FINISH -!endif - -!ifndef SimpleInstaller - !define MUI_CUSTOMFUNCTION_UNGUIINIT un.myGUIInit -!endif - -!insertmacro MUI_LANGUAGE "English" - -!ifndef SimpleInstaller - !define UNINSTEXE "$INSTDIR\Uninstall.exe" -!endif - -;; ==================== Installer - -!ifdef SimpleInstaller -Function myTestInstDir - IfFileExists "$INSTDIR\*.*" +1 inst_dir_exists - MessageBox MB_YESNO "The directory '$INSTDIR' already exists, continue?" /SD IDYES IDYES inst_dir_exists - Abort - inst_dir_exists: -FunctionEnd -!else -Function myTestInstDir - ; The assumption is that users might have all kinds of ways to get a Racket - ; tree, plus, they might have an old wise-based installation, so it is better - ; to rely on files rather than test registry keys. Note: no version check. - ; if any of these exist, then we assume it's an old installation - IfFileExists "$INSTDIR\Racket.exe" racket_is_installed - @(if auto-launch @~a{IfFileExists "$INSTDIR\${RKTLaunchProgram}.exe" racket_is_installed} "") - IfFileExists "$INSTDIR\collects" racket_is_installed - Goto racket_is_not_installed - racket_is_installed: - IfFileExists "${UNINSTEXE}" we_have_uninstall - MessageBox MB_YESNO "It appears that there is an existing Racket installation in '$INSTDIR', but no Uninstaller was found.$\r$\nContinue anyway (not recommended)?" /SD IDYES IDYES maybe_remove_tree - Abort - we_have_uninstall: - MessageBox MB_YESNO "It appears that there is an existing Racket installation in '$INSTDIR'.$\r$\nDo you want to uninstall it first (recommended)?" /SD IDNO IDNO maybe_remove_tree - HideWindow - ClearErrors - ExecWait '"${UNINSTEXE}" _?=$INSTDIR' - IfErrors uninstaller_problematic - IfFileExists "$INSTDIR\Racket.exe" uninstaller_problematic - BringToFront - Goto racket_is_not_installed - uninstaller_problematic: - MessageBox MB_YESNO "Errors in uninstallation!$\r$\nDo you want to quit and sort things out now (highly recommended)?" /SD IDNO IDNO maybe_remove_tree - Quit - maybe_remove_tree: - MessageBox MB_YESNO "Since you insist, do you want to simply remove the previous directory now?$\r$\n(It is really better if you sort this out manually.)" /SD IDYES IDNO racket_is_not_installed - RMDir /r $INSTDIR - racket_is_not_installed: -FunctionEnd -!endif - -Section "" - SetShellVarContext all - - SetDetailsPrint both - DetailPrint "Installing Racket..." - SetDetailsPrint listonly - SetOutPath "$INSTDIR" - File /a /r "racket\*.*" - !ifndef SimpleInstaller - WriteUninstaller "${UNINSTEXE}" ; Create uninstaller - !endif - - !ifndef SimpleInstaller - SetDetailsPrint both - DetailPrint "Creating Shortcuts..." - SetDetailsPrint listonly - !insertmacro MUI_STARTMENU_WRITE_BEGIN Application - SetOutPath "$INSTDIR" ; Make installed links run in INSTDIR - CreateDirectory "$SMPROGRAMS\$STARTMENU_FOLDER" - @apply[~a - #:separator "\n" - (for/list ([exe-str (in-list startmenus)]) - (define exe exe-str) - (define lnk (path->string (path-replace-suffix exe-str #".lnk"))) - @~a{ CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\@|lnk|" "$INSTDIR\@|exe|"})] - CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\Racket.lnk" "$INSTDIR\Racket.exe" - CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\Racket Folder.lnk" "$INSTDIR" - CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\Uninstall.lnk" "${UNINSTEXE}" - !insertmacro MUI_STARTMENU_WRITE_END - - SetDetailsPrint both - DetailPrint "Setting Registry Keys..." - SetDetailsPrint listonly - WriteRegStr HKLM "Software\${RKTRegName}" "" "$INSTDIR" ; Save folder location - @apply[~a - #:separator "\n" - (apply - append - (for/list ([extreg (in-list extregs)]) - (define kind (list-ref extreg 1)) - (define icon (list-ref extreg 3)) - (define cmd (list-ref extreg 4)) - (define exe-name (list-ref extreg 5)) - (append - (for/list ([ext (in-list (list-ref extreg 2))]) - @~a{ WriteRegStr HKCR ".@|ext|" "" "@|kind|"}) - (list - @~a{ WriteRegStr HKCR "@|kind|" "" "@(list-ref extreg 0)"} - @~a{ WriteRegStr HKCR "@|kind|\DefaultIcon" "" "$INSTDIR\lib\@|icon|"}) - (if cmd - (list - @~a{ WriteRegStr HKCR "@|kind|\shell\open\command" "" '"$INSTDIR\@|exe-name|" @|cmd|'}) - null))))] - ; Example, in case we want some things like this in the future - ; WriteRegStr HKCR "Racket.Document\shell\racket" "" "Run with Racket" - ; WriteRegStr HKCR "Racket.Document\shell\racket\command" "" '"$INSTDIR\Racket.exe" "-r" "%1"' - - WriteRegExpandStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${RKTRegName}" "UninstallString" '"${UNINSTEXE}"' - WriteRegExpandStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${RKTRegName}" "InstallLocation" "$INSTDIR" - WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${RKTRegName}" "DisplayName" "${RKTHumanName}" - WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${RKTRegName}" "DisplayIcon" "$INSTDIR\DrRacket.exe,0" - WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${RKTRegName}" "DisplayVersion" "${RKTVersion}" - ; used to also have "VersionMajor" & "VersionMinor" but looks like it's not needed - WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${RKTRegName}" "HelpLink" "http://racket-lang.org/" - WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${RKTRegName}" "URLInfoAbout" "http://racket-lang.org/" - WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${RKTRegName}" "Publisher" "PLT Design Inc." - WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${RKTRegName}" "NoModify" "1" - WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${RKTRegName}" "NoRepair" "1" - !endif - - SetDetailsPrint both - DetailPrint "Installation complete." -SectionEnd - -;; ==================== Uninstaller - -!ifndef SimpleInstaller - -Function un.myGUIInit - ; if any of these exist, then we're fine - IfFileExists "$INSTDIR\Racket.exe" racket_is_installed_un - IfFileExists "$INSTDIR\lib\GRacket.exe" racket_is_installed_un - @(if auto-launch @~a{IfFileExists "$INSTDIR\${RKTLaunchProgram}.exe" racket_is_installed_un} "") - IfFileExists "$INSTDIR\collects" racket_is_installed_un - MessageBox MB_YESNO "It does not appear that Racket is installed in '$INSTDIR'.$\r$\nContinue anyway (not recommended)?" /SD IDYES IDYES racket_is_installed_un - Abort "Uninstall aborted by user" - racket_is_installed_un: -FunctionEnd - -Section "Uninstall" - SetShellVarContext all - - SetDetailsPrint both - DetailPrint "Removing the Racket installation..." - SetDetailsPrint listonly - Delete "$INSTDIR\*.exe" - Delete "$INSTDIR\README*.*" - RMDir /r "$INSTDIR\include" - RMDir /r "$INSTDIR\collects" - RMDir /r "$INSTDIR\lib" - RMDir /r "$INSTDIR\share" - RMDir /r "$INSTDIR\etc" - RMDir /r "$INSTDIR\doc" - ;; these exist in Racket-Full installations - RMDir /r "$INSTDIR\man" - ; RMDir /r "$INSTDIR\src" - Delete "${UNINSTEXE}" - RMDir "$INSTDIR" - ;; if the directory is opened, it will take some time to remove - Sleep 1000 - IfErrors +1 uninstall_inst_dir_ok - MessageBox MB_YESNO "The Racket installation at '$INSTDIR' was not completely removed.$\r$\nForce deletion?$\r$\n(Make sure no Racket applications are running.)" /SD IDYES IDNO uninstall_inst_dir_ok - RMDir /r "$INSTDIR" - IfErrors +1 uninstall_inst_dir_ok - MessageBox MB_OK "Forced deletion did not work either, you will need to clean up '$INSTDIR' manually." /SD IDOK - uninstall_inst_dir_ok: - - SetDetailsPrint both - DetailPrint "Removing Shortcuts..." - SetDetailsPrint listonly - !insertmacro MUI_STARTMENU_GETFOLDER Application $MUI_TEMP - Delete "$SMPROGRAMS\$MUI_TEMP\*.lnk" - ;; Delete empty start menu parent diretories - StrCpy $MUI_TEMP "$SMPROGRAMS\$MUI_TEMP" - startMenuDeleteLoop: - RMDir $MUI_TEMP - GetFullPathName $MUI_TEMP "$MUI_TEMP\.." - IfErrors startMenuDeleteLoopDone - StrCmp $MUI_TEMP $SMPROGRAMS startMenuDeleteLoopDone startMenuDeleteLoop - startMenuDeleteLoopDone: - - SetDetailsPrint both - DetailPrint "Removing Registry Keys..." - SetDetailsPrint listonly - DeleteRegKey /ifempty HKLM "Software\${RKTRegName}\Start Menu Folder" - DeleteRegKey /ifempty HKLM "Software\${RKTRegName}" - @apply[~a - #:separator "\n" - (append - (for*/list ([extreg (in-list extregs)] - [ext (in-list (list-ref extreg 2))]) - @~a{ DeleteRegKey HKCR ".@|ext|"}) - (for/list ([extreg (in-list extregs)]) - @~a{ DeleteRegKey HKCR ".@(list-ref extreg 1)"}))] - DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${RKTRegName}" - - SetDetailsPrint both - DetailPrint "Uninstallation complete." -SectionEnd - -!endif -}) - (call-with-output-file* - "bundle/installer.nsi" - #:mode 'text - #:exists 'truncate - (lambda (o) - (display script o) - (newline o))) - (parameterize ([current-directory "bundle"]) - (system* makensis "/V3" "installer.nsi"))) - -(define (installer-exe human-name base-name versionless? dist-suffix readme) - (define makensis (or (find-executable-path "makensis.exe") - (try-exe "c:\\Program Files\\NSIS\\makensis.exe") - (try-exe "c:\\Program Files (x86)\\NSIS\\makensis.exe") - (error 'installer-exe "cannot find \"makensis.exe\""))) - (define platform (let-values ([(base name dir?) (split-path (system-library-subpath #f))]) - (path->string name))) - (define exe-path (format "bundle/~a-~a-win32~a.exe" base-name platform dist-suffix)) - (when readme - (call-with-output-file* - #:exists 'truncate - #:mode 'text - (build-path "bundle" "racket" "README.txt") - (lambda (o) - (display readme o)))) - (nsis-generate exe-path - human-name - (version) - platform - makensis - #:versionless versionless? - #:extension-registers (get-extreg "bundle/racket") - #:start-menus (get-startmenu "bundle/racket") - #:auto-launch (get-auto-launch "bundle/racket")) - exe-path) diff --git a/pkgs/distro-build-pkgs/distro-build-client/installer-pkg.rkt b/pkgs/distro-build-pkgs/distro-build-client/installer-pkg.rkt deleted file mode 100644 index 231f94c309..0000000000 --- a/pkgs/distro-build-pkgs/distro-build-client/installer-pkg.rkt +++ /dev/null @@ -1,157 +0,0 @@ -#lang at-exp racket/base -(require racket/system - racket/file - racket/format - racket/runtime-path - ds-store - ds-store/alias - xml) - -(provide installer-pkg) - -(define pkgbuild "/usr/bin/pkgbuild") -(define productbuild "/usr/bin/productbuild") - -(define-runtime-path bg-image "macosx-installer/pkg-bg.png") - -(define (system*/show . l) - (displayln (apply ~a #:separator " " l)) - (flush-output) - (unless (apply system* l) - (error "failed"))) - -(define (gen-install-script install-dest) - (~a "#!/bin/sh\n" - "echo \"" (regexp-replace* #rx"[\"$]" - install-dest - "\"'\\0'\"") - "\"/bin > /etc/paths.d/racket\n")) - -(define (make-pkg human-name src-dir pkg-name readme sign-identity) - (define install-dest (string-append "/Applications/" human-name)) - (define id (string-append "org.racket-lang." - (regexp-replace* #rx" " - human-name - "-"))) - - (define (make-rel dir-name) - (let-values ([(base name dir?) (split-path src-dir)]) - (build-path base dir-name))) - - (define work-dir (make-rel "work")) - (delete-directory/files work-dir #:must-exist? #f) - (define scripts-dir (make-rel "scripts")) - (delete-directory/files scripts-dir #:must-exist? #f) - (define resources-dir (make-rel "resources")) - (delete-directory/files resources-dir #:must-exist? #f) - - (printf "Creating ~a\n" scripts-dir) - (make-directory* scripts-dir) - (define postinstall (build-path scripts-dir "postinstall")) - (call-with-output-file* - postinstall - (lambda (o) - (write-string (gen-install-script install-dest) o))) - (file-or-directory-permissions postinstall #o770) - - (printf "Creating ~a\n" resources-dir) - (make-directory* resources-dir) - (copy-file bg-image (build-path resources-dir "background.png")) - - (printf "Copying ~a\n" src-dir) - (define dest-dir work-dir) - (copy-directory/files src-dir dest-dir - #:keep-modify-seconds? #t) - (when readme - (call-with-output-file* - (build-path dest-dir "README.txt") - #:exists 'truncate - (lambda (o) - (display readme o)))) - (copy-file (build-path dest-dir "README.txt") - (build-path resources-dir "README.txt")) - - (system*/show pkgbuild - "--root" dest-dir - "--install-location" install-dest - "--scripts" scripts-dir - "--identifier" id - "--version" (version) - (make-rel "racket.pkg")) - (define pkg-xml (make-rel "racket.xml")) - (system*/show productbuild - "--synthesize" - "--package" (make-rel "racket.pkg") - pkg-xml) - (define synthesized (call-with-input-file* - pkg-xml - read-xml)) - (define updated - (struct-copy document synthesized - [element (let ([e (document-element synthesized)]) - (struct-copy element e - [content - (list* - (element #f #f - 'title - null - (list (pcdata #f #f human-name))) - (element #f #f - 'readme - (list (attribute #f #f 'file "README.txt")) - null) - (element #f #f - 'background - (list (attribute #f #f 'file "background.png") - (attribute #f #f 'alignment "topleft") - (attribute #f #f 'scaling "none")) - null) - (element #f #f - 'installation-check - (list (attribute #f #f 'script "check_exists_already()")) - null) - (element #f #f - 'script - null - (list - (cdata #f #f - @~a{ - function check_exists_already () { - if (system.files.fileExistsAtPath(@|(~s install-dest)|)) { - my.result.type = "Fatal"; - my.result.title = "Folder Exists Already"; - my.result.message = ("Cannot install because a " - + @|(~s (~s human-name))| - + " folder" - + " already exists in the Applications folder." - + " Please remove it and try again."); - return false; - } - return true; - }}))) - (element-content e))]))])) - (call-with-output-file* - pkg-xml - #:exists 'truncate - (lambda (o) - (write-xml updated o))) - (apply system*/show - productbuild - (append - (list "--distribution" pkg-xml - "--package-path" (make-rel 'same) - "--resources" resources-dir - "--identifier" id - "--version" (version)) - (if (string=? sign-identity "") - null - (list "--sign" sign-identity)) - (list pkg-name)))) - -(define (installer-pkg human-name base-name dist-suffix readme sign-identity) - (define pkg-name (format "bundle/~a-~a~a.pkg" - base-name - (system-library-subpath #f) - dist-suffix)) - (make-pkg human-name "bundle/racket" pkg-name readme sign-identity) - pkg-name) diff --git a/pkgs/distro-build-pkgs/distro-build-client/installer-sh.rkt b/pkgs/distro-build-pkgs/distro-build-client/installer-sh.rkt deleted file mode 100644 index 5bec2708b2..0000000000 --- a/pkgs/distro-build-pkgs/distro-build-client/installer-sh.rkt +++ /dev/null @@ -1,87 +0,0 @@ -#lang at-exp racket/base -(require racket/system - racket/file - racket/port - racket/format - racket/runtime-path - file/tar) - -(provide installer-sh) - -(define-runtime-path installer-header "unix-installer/installer-header") - -(define (system/show . l) - (displayln (apply ~a #:separator " " l)) - (unless (apply system* (find-executable-path (car l)) (cdr l)) - (error "failed"))) - -(define (system/read . l) - (displayln (apply ~a #:separator " " l)) - (define o (open-output-bytes)) - (parameterize ([current-output-port o]) - (apply system* (find-executable-path (car l)) (cdr l))) - (read (open-input-bytes (get-output-bytes o)))) - -(define (count-lines i) - (if (input-port? i) - (for/sum ([l (in-lines i)]) 1) - (call-with-input-file* i count-lines))) - -(define (generate-installer-sh src-dir dest target-dir-name human-name release? readme) - (system/show "chmod" - "-R" "g+w" src-dir) - (define tmp-tgz (make-temporary-file "~a.tgz")) - (delete-file tmp-tgz) - (printf "Tarring to ~s\n" tmp-tgz) - (when readme - (call-with-output-file* - (build-path src-dir "README") - #:exists 'truncate - (lambda (o) - (display readme o)))) - (parameterize ([current-directory src-dir]) - (apply tar-gzip tmp-tgz (directory-list))) - (define tree-size (system/read "du" "-hs" src-dir)) - (define archive-cksum (system/read "cksum" tmp-tgz)) - (define script - @~a{#!/bin/sh - - # This is a self-extracting shell script for @|human-name|. - # To use it, just run it, or run "sh" with it as an argument. - - DISTNAME="@|human-name|" - TARGET="@|target-dir-name|" - BINSUM="@|archive-cksum|" - ORIGSIZE="@|tree-size|" - RELEASED="@(if release? "yes" "no")"}) - (define installer-lines (+ (count-lines (open-input-string script)) - (count-lines installer-header) - 2)) - (call-with-output-file* - dest - #:exists 'truncate - (lambda (o) - (display script o) - (newline o) - (fprintf o "BINSTARTLINE=\"~a\"\n" installer-lines) - (call-with-input-file* - installer-header - (lambda (i) - (copy-port i o))) - (call-with-input-file* - tmp-tgz - (lambda (i) - (copy-port i o))))) - (system/show "chmod" "+x" dest) - (delete-file tmp-tgz)) - -(define (installer-sh human-name base-name dir-name release? dist-suffix readme) - (define sh-path (format "bundle/~a-~a~a.sh" - base-name - (system-library-subpath #f) - dist-suffix)) - (generate-installer-sh "bundle/racket" sh-path - dir-name human-name - release? - readme) - sh-path) diff --git a/pkgs/distro-build-pkgs/distro-build-client/installer-tgz.rkt b/pkgs/distro-build-pkgs/distro-build-client/installer-tgz.rkt deleted file mode 100644 index 5e813e70a3..0000000000 --- a/pkgs/distro-build-pkgs/distro-build-client/installer-tgz.rkt +++ /dev/null @@ -1,35 +0,0 @@ -#lang at-exp racket/base -(require racket/system - racket/file - racket/format - file/tar) - -(provide installer-tgz) - -(define (system/show . l) - (displayln (apply ~a #:separator " " l)) - (unless (apply system* (find-executable-path (car l)) (cdr l)) - (error "failed"))) - -(define (generate-tgz src-dir dest-path target-dir-name readme) - (system/show "chmod" "-R" "g+w" src-dir) - (define dest (path->complete-path dest-path)) - (when (file-exists? dest) (delete-file dest)) - (printf "Tarring to ~s\n" dest) - (when readme - (call-with-output-file* - (build-path src-dir "README") - #:exists 'truncate - (lambda (o) - (display readme o)))) - (parameterize ([current-directory src-dir]) - (apply tar-gzip dest #:path-prefix target-dir-name (directory-list)))) - -(define (installer-tgz base-name dir-name dist-suffix readme) - (define tgz-path (format "bundle/~a-src~a.tgz" - base-name - dist-suffix)) - (generate-tgz "bundle/racket" tgz-path - dir-name - readme) - tgz-path) diff --git a/pkgs/distro-build-pkgs/distro-build-client/installer.rkt b/pkgs/distro-build-pkgs/distro-build-client/installer.rkt deleted file mode 100644 index bd5e9d76ad..0000000000 --- a/pkgs/distro-build-pkgs/distro-build-client/installer.rkt +++ /dev/null @@ -1,106 +0,0 @@ -#lang racket/base -(require racket/cmdline - "installer-sh.rkt" - "installer-dmg.rkt" - "installer-pkg.rkt" - "installer-exe.rkt" - "installer-tgz.rkt" - net/url - racket/file - racket/path - racket/port - "display-time.rkt") - -(module test racket/base) - -(define release? #f) -(define source? #f) -(define versionless? #f) -(define mac-pkg? #f) -(define upload-to #f) -(define upload-desc "") -(define download-readme #f) - -(define-values (short-human-name human-name base-name dir-name dist-suffix sign-identity) - (command-line - #:once-each - [("--release") "Create a release installer" - (set! release? #t)] - [("--source") "Create a source installer" - (set! source? #t)] - [("--versionless") "Avoid version number in names and paths" - (set! versionless? #t)] - [("--mac-pkg") "Create a \".pkg\" installer on Mac OS X" - (set! mac-pkg? #t)] - [("--upload") url "Upload installer" - (unless (string=? url "") - (set! upload-to url))] - [("--desc") desc "Description to accompany upload" - (set! upload-desc desc)] - [("--readme") readme "URL for README.txt to include" - (unless (string=? readme "") - (set! download-readme readme))] - #:args - (human-name base-name dir-name dist-suffix sign-identity) - (values human-name - (format "~a v~a" human-name (version)) - (if versionless? - base-name - (format "~a-~a" base-name (version))) - (if (or (and release? (not source?)) - versionless?) - dir-name - (format "~a-~a" dir-name (version))) - (if (string=? dist-suffix "") - "" - (string-append "-" dist-suffix)) - sign-identity))) - -(display-time) - -(define readme - (and download-readme - (let () - (printf "Downloading ~a\n" download-readme) - (define i (get-pure-port (string->url download-readme))) - (begin0 - (port->string i) - (close-input-port i))))) - -(define installer-file - (if source? - (installer-tgz base-name dir-name dist-suffix readme) - (case (system-type) - [(unix) (installer-sh human-name base-name dir-name release? dist-suffix readme)] - [(macosx) (if mac-pkg? - (installer-pkg (if (or release? versionless?) - short-human-name - human-name) - base-name dist-suffix readme sign-identity) - (installer-dmg (if versionless? - short-human-name - human-name) - base-name dist-suffix readme sign-identity))] - [(windows) (installer-exe short-human-name base-name (or release? versionless?) - dist-suffix readme)]))) - -(call-with-output-file* - (build-path "bundle" "installer.txt") - #:exists 'truncate/replace - (lambda (o) - (fprintf o "~a\n" installer-file) - (fprintf o "~a\n" upload-desc))) - -(when upload-to - (printf "Upload ~a to ~a\n" installer-file upload-to) - (define i - (put-pure-port - (string->url (format "~a~a" - upload-to - (path->string (file-name-from-path installer-file)))) - (file->bytes installer-file) - (list (string-append "Description: " upload-desc)))) - (unless (equal? (read i) #t) - (error "file upload failed"))) - -(display-time) diff --git a/pkgs/distro-build-pkgs/distro-build-client/macosx-installer/pkg-bg.png b/pkgs/distro-build-pkgs/distro-build-client/macosx-installer/pkg-bg.png deleted file mode 100644 index 1d606577d00ad436aff25e7c403114a80a549a0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11559 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 diff --git a/pkgs/distro-build-pkgs/distro-build-client/macosx-installer/racket-rising.png b/pkgs/distro-build-pkgs/distro-build-client/macosx-installer/racket-rising.png deleted file mode 100644 index 068a0bcccdcb07c65d95f9665c8765012177cfc9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16255 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 diff --git a/pkgs/distro-build-pkgs/distro-build-client/set-config.rkt b/pkgs/distro-build-pkgs/distro-build-client/set-config.rkt deleted file mode 100644 index 484bf90d94..0000000000 --- a/pkgs/distro-build-pkgs/distro-build-client/set-config.rkt +++ /dev/null @@ -1,49 +0,0 @@ -#lang racket/base -(require racket/cmdline - racket/file - racket/path) - -(provide set-config) - -(module test racket/base) - -(module+ main - (command-line - #:args - (dest-config-file install-name build-stamp - doc-search . catalog) - (set-config dest-config-file - install-name build-stamp - doc-search catalog))) - -(define (set-config dest-config-file - install-name build-stamp - doc-search catalogs) - (define orig - (if (file-exists? dest-config-file) - (call-with-input-file* dest-config-file read) - (hash))) - - (let* ([table orig] - [table - (if (equal? doc-search "") - table - (hash-set table 'doc-search-url doc-search))] - [table (if (equal? catalogs '("")) - table - (hash-set table 'catalogs - (for/list ([c (in-list catalogs)]) - (if (equal? c "") - #f - c))))] - [table (if (equal? install-name "") - table - (hash-set table 'installation-name install-name))] - [table (hash-set table 'build-stamp build-stamp)]) - (unless (equal? table orig) - (make-directory* (path-only dest-config-file)) - (call-with-output-file dest-config-file - #:exists 'truncate - (lambda (o) - (write table o) - (newline o)))))) diff --git a/pkgs/distro-build-pkgs/distro-build-client/unix-installer/installer-header b/pkgs/distro-build-pkgs/distro-build-client/unix-installer/installer-header deleted file mode 100644 index 6cb7fcb8ee..0000000000 --- a/pkgs/distro-build-pkgs/distro-build-client/unix-installer/installer-header +++ /dev/null @@ -1,507 +0,0 @@ - -############################################################################### -## Command-line flags - -show_help() { - echo "Command-line flags:" - echo "/ --unix-style : install as Unix-style" - echo "\ --in-place : install in-place (not Unix-style)" - echo " --dest : install to " - echo " --create-dir : create destination for Unix-style if it does not exist" - echo " --create-links : create links in for in-place install" - echo " -h, --help : show this help" -} - -where="" -unixstyle="" -accept_dirs="" -SYSDIR="" -SYSDIR_set="" - -while test $# -gt 0 ; do - case "$1" in - -h | --help) - show_help - exit 0 - ;; - --unix-style) - if test "$unixstyle" != "" ; then - echo "conflicting or redundant flag: --unix-style" - exit 1 - fi - unixstyle="Y" - accept_dirs="Y" - shift - ;; - --in-place) - if test "$unixstyle" != "" ; then - echo "conflicting or redundant flag: --in-place" - exit 1 - fi - unixstyle="N" - SYSDIR_set="Y" - shift - ;; - --dest) - shift - if test $# -lt 1 ; then - echo "missing path for --dest" - exit 1 - fi - where="$1" - if test "$where" = "" ; then - echo "empty path for --dest" - exit 1 - fi - shift - ;; - --create-dir) - if test "$create_dir" != "" ; then - echo "redundant flag: --create-dir" - exit 1 - fi - create_dir="Y" - shift - ;; - --create-links) - if test "$SYSDIR" != "" ; then - echo "redundant flag: --create-links" - exit 1 - fi - shift - if test $# -lt 1 ; then - echo "missing path for --create-links" - exit 1 - fi - SYSDIR="$1" - SYSDIR_set="Y" - if test "$SYSDIR" = "" ; then - echo "empty path for --create-links" - exit 1 - fi - shift - ;; - *) - echo "unrecognized command-line argument: $1" - exit 1 - ;; - esac -done - -############################################################################### -## Utilities - -PATH=/usr/bin:/bin - -if test "x`echo -n`" = "x-n"; then - echon() { /bin/echo "$*\c"; } -else - echon() { echo -n "$*"; } -fi - -rm_on_abort="" -failwith() { - err="Error: " - if test "x$1" = "x-noerror"; then err=""; shift; fi - echo "$err$*" 1>&2 - if test ! "x$rm_on_abort" = "x" && test -e "$rm_on_abort"; then - echon " (Removing installation files in $rm_on_abort)" - "$rm" -rf "$rm_on_abort" - echo "" - fi - exit 1 -} -# intentional aborts -abort() { failwith -noerror "Aborting installation."; } -# unexpected exits -exithandler() { echo ""; failwith "Aborting..."; } - -trap exithandler 2 3 9 15 - -lookfor() { - saved_IFS="${IFS}" - IFS=":" - for dir in $PATH; do - if test -x "$dir/$1"; then - eval "$1=$dir/$1" - IFS="$saved_IFS" - return - fi - done - IFS="$saved_IFS" - failwith "could not find \"$1\"." -} - -lookfor rm -lookfor ls -lookfor ln -lookfor tail -lookfor cksum -lookfor tar -lookfor gunzip -lookfor mkdir -lookfor basename -lookfor dirname - -# substitute env vars and tildes -expand_path_var() { - eval "expanded_val=\"\$$1\"" - first_part="${expanded_val%%/*}" - if [ "x$first_part" = "x$expanded_val" ]; then - rest_parts="" - else - rest_parts="/${expanded_val#*/}" - fi - case "x$first_part" in - x*" "* ) ;; - x~* ) expanded_val="`eval \"echo $first_part\"`$rest_parts" ;; - esac - eval "$1=\"$expanded_val\"" -} - -# Need this to make new `tail' respect old-style command-line arguments. Can't -# use `tail -n #' because some old tails won't know what to do with that. -_POSIX2_VERSION=199209 -export _POSIX2_VERSION - -origwd="`pwd`" -installer_file="$0" -cat_installer() { - oldwd="`pwd`"; cd "$origwd" - "$tail" +"$BINSTARTLINE" "$installer_file" - cd "$oldwd" -} - -echo "This program will extract and install $DISTNAME." -echo "" -echo "Note: the required diskspace for this installation is $ORIGSIZE." -echo "" - -############################################################################### -## What kind of installation? - -if test "$unixstyle" = ""; then - echo "Do you want a Unix-style distribution?" - echo " In this distribution mode files go into different directories according" - echo " to Unix conventions. A \"racket-uninstall\" script will be generated" - echo " to be used when you want to remove the installation. If you say 'no'," - echo " the whole Racket directory is kept in a single installation directory" - echo " (movable and erasable), possibly with external links into it -- this is" - echo " often more convenient, especially if you want to install multiple" - echo " versions or keep it in your home directory." - if test ! "x$RELEASED" = "xyes"; then - echo "*** This is a non-release build: such a Unix-style distribution is NOT" - echo "*** recommended, because it cannot be used to install multiple versions" - echo "*** in the default location." - fi - unixstyle="x" - while test "$unixstyle" = "x"; do - echon "Enter yes/no (default: no) > " - read unixstyle - case "$unixstyle" in - [yY]* ) unixstyle="Y" ;; - [nN]* ) unixstyle="N" ;; - "" ) unixstyle="N" ;; - * ) unixstyle="x" ;; - esac - done - echo "" -fi - -############################################################################### -## Where do you want it? -## sets $where to the location: target path for wholedir, prefix for unixstyle - -if test "$where" = ""; then - if test "$unixstyle" = "Y"; then - echo "Where do you want to base your installation of $DISTNAME?" - echo " (If you've done such an installation in the past, either" - echo " enter the same directory, or run 'racket-uninstall' manually.)" - TARGET1="..." - else - echo "Where do you want to install the \"$TARGET\" directory tree?" - TARGET1="$TARGET" - fi - echo " 1 - /usr/$TARGET1 [default]" - echo " 2 - /usr/local/$TARGET1" - echo " 3 - ~/$TARGET1 ($HOME/$TARGET1)" - echo " 4 - ./$TARGET1 (here)" - if test "$unixstyle" = "Y"; then - echo " Or enter a different directory prefix to install in." - else - echo " Or enter a different \"racket\" directory to install in." - fi - echon "> " - read where - - # numeric choice (make "." and "./" synonym for 4) - if test "$unixstyle" = "Y"; then TARGET1="" - else TARGET1="/$TARGET"; fi - case "x$where" in - x | x1 ) where="/usr$TARGET1" ;; - x2 ) where="/usr/local${TARGET1}" ;; - x3 ) where="${HOME}${TARGET1}" ;; - x4 | x. | x./ ) where="`pwd`${TARGET1}" ;; - * ) expand_path_var where ;; - esac -fi - -############################################################################### -## Default system directories prefixed by $1, mimic configure behavior -## used for unixstyle targets and for wholedir links - -set_dirs() { - # unixstyle: uses all of these - # wholedir: uses only bindir, mandir, and appsdir, no need for the others - bindir="$1/bin" - libdir="$1/lib" - incrktdir="$1/include/$TARGET" - librktdir="$1/lib/$TARGET" - sharerktdir="$1/share/$TARGET" - configdir="$1/etc/$TARGET" - appsdir="$1/share/applications" - has_share="N" - if test -d "$1/share"; then has_share="Y"; fi - if test "$has_share" = "N" && test -d "$1/doc"; then docdir="$1/doc/$TARGET" - else docdir="$1/share/$TARGET/doc" - fi - if test "$has_share" = "N" && test -d "$1/man"; then mandir="$1/man" - else mandir="$1/share/man" - fi -} - -############################################################################### -## Integrity check and unpack into $1 -## also sets $INSTDIR to the directory in its canonical form - -unpack_installation() { - T="$1" - # integrity check - echo "" - echon "Checking the integrity of the binary archive... " - SUM="`cat_installer | \"$cksum\"`" || failwith "problems running cksum." - SUM="`set $SUM; echo $1`" - test "$BINSUM" = "$SUM" || failwith "bad CRC checksum." - echo "ok." - # test that the target does not exists - here="N" - if test -d "$T" || test -f "$T"; then - if test -d "$T" && test -x "$T"; then - # use the real name, so "/foo/.." shows as an explicit "/" - oldwd="`pwd`"; cd "$T"; T="`pwd`"; cd "$oldwd" - fi - if test -f "$T"; then echon "\"$T\" exists (as a file)" - elif test ! "`pwd`" = "$T"; then echon "\"$T\" exists" - else here="Y"; echon "\"$T\" is where you ran the installer from" - fi - echon ", delete? " - read R - case "$R" in - [yY]* ) - echon "Deleting old \"$T\"... " - "$rm" -rf "$T" || failwith "could not delete \"$T\"." - echo "done." - ;; - * ) abort ;; - esac - fi - # unpack - rm_on_abort="$T" - "$mkdir" -p "$T" || failwith "could not create directory: $T" - if test "$here" = "Y"; then - cd "$T"; INSTDIR="$T" - echo "*** Note: your original directory was deleted, so you will need" - echo "*** to 'cd' back into it when the installer is done, otherwise" - echo "*** it will look like you have an empty directory." - sleep 1 - else oldwd="`pwd`"; cd "$T"; INSTDIR="`pwd`"; cd "$oldwd" - fi - rm_on_abort="$INSTDIR" - echo "Unpacking into \"$INSTDIR\" (Ctrl+C to abort)..." - cat_installer | "$gunzip" -c \ - | { cd "$INSTDIR" - "$tar" xf - || failwith "problems during unpacking of binary archive." - } - test -d "$INSTDIR/collects" \ - || failwith "unpack failed (could not find \"$T/collects\")." - echo "Done." -} - -############################################################################### -## Whole-directory installations - -wholedir_install() { - - unpack_installation "$where" - rm_on_abort="" - - if test "$SYSDIR_set" != "Y"; then - echo "" - echo "If you want to install new system links within the \"bin\", \"man\"" - echo " and \"share/applications\" subdirectories of a common directory prefix" - echo " (for example, \"/usr/local\") then enter the prefix of an existing" - echo " directory that you want to use. This might overwrite existing symlinks," - echo " but not files." - echon "(default: skip links) > " - read SYSDIR - fi - if test "x$SYSDIR" = "x"; then : - elif test ! -d "$SYSDIR"; then - echo "\"$SYSDIR\" does not exist, skipping links." - elif test ! -x "$SYSDIR" || test ! -w "$SYSDIR"; then - echo "\"$SYSDIR\" is not writable, skipping links." - else - oldwd="`pwd`"; cd "$SYSDIR"; SYSDIR="`pwd`"; cd "$oldwd" - set_dirs "$SYSDIR" - install_links() { # tgtdir(absolute) srcdir(relative to INSTDIR) - if ! test -d "$1"; then - echo "\"$1\" does not exist, skipping." - elif ! test -x "$1" || ! test -w "$1"; then - echo "\"$1\" is not writable, skipping" - else - echo "Installing links in \"$1\"..." - printsep=" " - cd "$1" - for x in `cd "$INSTDIR/$2"; ls`; do - echon "${printsep}$x"; printsep=", " - if test -h "$x"; then rm -f "$x"; fi - if test -d "$x" || test -f "$x"; then - echon " skipped (non-link exists)" - elif ! "$ln" -s "$INSTDIR/$2/$x" "$x"; then - echon " skipped (symlink failed)" - fi - done - echo ""; echo " done." - fi - } - install_links "$bindir" "bin" - install_links "$mandir/man1" "man/man1" - install_links "$appsdir" "share/applications" - fi - -} - -############################################################################### -## Unix-style installations - -dir_createable() { - tdir="`\"$dirname\" \"$1\"`" - if test -d "$tdir" && test -x "$tdir" && test -w "$tdir"; then return 0 - elif test "$tdir" = "/"; then return 1 - else dir_createable "$tdir"; fi -} -show_dir_var() { - if test -f "$2"; then status="error: not a directory!"; err="Y" - elif test ! -d "$2"; then - if dir_createable "$2"; then status="will be created" - else status="error: not writable!"; err="Y"; fi - elif test ! -w "$2"; then status="error: not writable!"; err="Y" - else status="exists" - fi - echo " $1 $2 ($status)" -} - -unixstyle_install() { - - if test -f "$where"; then - failwith "The entered base directory exists as a file: $where" - elif test ! -d "$where"; then - echo "Base directory does not exist: $where" - if test "$create_dir" != "Y"; then - echon " should I create it? (default: yes) " - read R; case "$R" in [nN]* ) abort ;; esac - fi - "$mkdir" -p "$where" || failwith "could not create directory: $where" - elif test ! -w "$where"; then - failwith "The entered base directory is not writable: $where" - fi - cd "$where" || failwith "Base directory does not exist: $where" - where="`pwd`"; cd "$origwd" - - set_dirs "$where" - # loop for possible changes - done="N"; retry="N" - if test "$accept_dirs" = "Y" ; then done="Y"; fi - while test ! "$done" = "Y" || test "x$err" = "xY" ; do - err="N" - if test "$retry" = "N"; then - echo "" - echo "Target Directories:" - show_dir_var "[e] Executables " "$bindir" - show_dir_var "[o] Libraries " "$librktdir" - show_dir_var "[s] Shared files " "$sharerktdir" - show_dir_var "[c] Configuration " "$configdir" - show_dir_var "[d] Documentation " "$docdir" - show_dir_var "[a] .desktop files" "$appsdir" - show_dir_var "[m] Man Pages " "$mandir" - show_dir_var "[l] C Libraries " "$libdir" - show_dir_var "[h] C headers " "$incrktdir" - echo "Enter a letter to change an entry, or enter to continue." - fi - retry="N" - echon "> "; read change_what - read_dir() { - echon "New directory (absolute or relative to $where): "; read new_dir - expand_path_var new_dir - case "$new_dir" in - "/"* ) eval "$1=\"$new_dir\"" ;; - * ) eval "$1=\"$where/$new_dir\"" ;; - esac - } - case "$change_what" in - [eE]* ) read_dir bindir ;; - [dD]* ) read_dir docdir ;; - [lL]* ) read_dir libdir ;; - [hH]* ) read_dir incrktdir ;; - [oO]* ) read_dir librktdir ;; - [sS]* ) read_dir sharerktdir ;; - [cC]* ) read_dir configdir ;; - [aA]* ) read_dir appsdir ;; - [mM]* ) read_dir mandir ;; - "" ) if test "$err" = "N"; then done="Y" - else echo "*** Please fix erroneous paths to proceed"; fi ;; - * ) retry="Y" ;; - esac - done - - if test -x "$bindir/racket-uninstall"; then - echo "" - echo "A previous Racket uninstaller is found at" - echo " \"$bindir/racket-uninstall\"," - echon " should I run it? (default: yes) " - read R - case "$R" in - [nN]* ) abort ;; - * ) echon " running uninstaller..." - "$bindir/racket-uninstall" || failwith "problems during uninstall" - echo " done." ;; - esac - fi - - tmp="$where/$TARGET-tmp-install" - if test -f "$tmp" || test -d "$tmp"; then - echo "\"$tmp\" already exists (needed for the installation)," - echon " ok to remove it? " - read R; case "$R" in [yY]* ) "$rm" -rf "$tmp" ;; * ) abort ;; esac - fi - unpack_installation "$tmp" - - cd "$where" - "$tmp/bin/racket" "$tmp/collects/setup/unixstyle-install.rkt" \ - "move" "$tmp" "$bindir" "$sharerktdir/collects" "$docdir" "$libdir" \ - "$incrktdir" "$librktdir" "$sharerktdir" "$configdir" "$appsdir" "$mandir" \ - || failwith "installation failed" - -} - -############################################################################### -## Run the right installer now - -if test "$unixstyle" = "Y"; then unixstyle_install; else wholedir_install; fi - -echo "" -echo "Installation complete." - -exit - -========== tar.gz file follows ========== diff --git a/pkgs/distro-build-pkgs/distro-build-client/unpack-collects.rkt b/pkgs/distro-build-pkgs/distro-build-client/unpack-collects.rkt deleted file mode 100644 index 7b481b6764..0000000000 --- a/pkgs/distro-build-pkgs/distro-build-client/unpack-collects.rkt +++ /dev/null @@ -1,32 +0,0 @@ -#lang racket/base -(require racket/cmdline - racket/file - racket/port - net/url - file/untgz - "display-time.rkt") - -(module test racket/base) - -(define dest-dir "bundle/racket") - -(define server - (command-line - #:args (server) - server)) - -(define zip-content - (port->bytes - (get-pure-port - (combine-url/relative - (string->url server) - "collects.tgz")))) - -(display-time) - -(define collects-dir (build-path dest-dir "collects")) -(when (directory-exists? collects-dir) - (delete-directory/files collects-dir)) - -(untgz (open-input-bytes zip-content) - #:dest dest-dir) diff --git a/pkgs/distro-build-pkgs/distro-build-client/windows-installer/header-r.bmp b/pkgs/distro-build-pkgs/distro-build-client/windows-installer/header-r.bmp deleted file mode 100644 index 69a3bd4631402bbbb5d2b8232bbbf666e17118b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34254 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 diff --git a/pkgs/distro-build-pkgs/distro-build-client/windows-installer/header.bmp b/pkgs/distro-build-pkgs/distro-build-client/windows-installer/header.bmp deleted file mode 100644 index 65467b088edc223e809f71a3c4e0ad70468a29aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34254 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 OkLLisuKv&Q_5T1@ky#M{ diff --git a/pkgs/distro-build-pkgs/distro-build-client/windows-installer/installer.ico b/pkgs/distro-build-pkgs/distro-build-client/windows-installer/installer.ico deleted file mode 100644 index 632f0551f0d838c064e476538ccc09c4712e2fbb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25214 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�$^4h(0(mybsp7bw|f~7Ao?*kZ4cHb%jGg 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 M^nY_#)lP{21CW@9Jpcdz diff --git a/pkgs/distro-build-pkgs/distro-build-client/windows-installer/uninstaller.ico b/pkgs/distro-build-pkgs/distro-build-client/windows-installer/uninstaller.ico deleted file mode 100644 index 2b2e20e2c00f43bcf82eeea7099bf075f749a2b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25214 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 Y65j^&%qk;_;4`Fmtaz({>b5fe4*z>% diff --git a/pkgs/distro-build-pkgs/distro-build-client/windows-installer/welcome.bmp b/pkgs/distro-build-pkgs/distro-build-client/windows-installer/welcome.bmp deleted file mode 100644 index 5415c45e6d689b93f2b31aa48a21c96163bcf120..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 206038 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 LcCC)7b>#bhhf+P_ diff --git a/pkgs/distro-build-pkgs/distro-build-lib/LICENSE.txt b/pkgs/distro-build-pkgs/distro-build-lib/LICENSE.txt deleted file mode 100644 index 2f13367cd2..0000000000 --- a/pkgs/distro-build-pkgs/distro-build-lib/LICENSE.txt +++ /dev/null @@ -1,11 +0,0 @@ -distro-build -Copyright (c) 2010-2014 PLT Design Inc. - -This package is distributed under the GNU Lesser General Public -License (LGPL). This means that you can link this package into proprietary -applications, provided you follow the rules stated in the LGPL. You -can also modify this package; if you distribute a modified version, -you must distribute it under the terms of the LGPL, which in -particular means that you must release the source code for the -modified software. See http://www.gnu.org/copyleft/lesser.html -for more information. diff --git a/pkgs/distro-build-pkgs/distro-build-lib/info.rkt b/pkgs/distro-build-pkgs/distro-build-lib/info.rkt deleted file mode 100644 index cb259c254d..0000000000 --- a/pkgs/distro-build-pkgs/distro-build-lib/info.rkt +++ /dev/null @@ -1,12 +0,0 @@ -#lang info - -(define collection 'multi) - -(define deps '("distro-build-client" - "distro-build-server")) -(define implies '("distro-build-client" - "distro-build-server")) - -(define pkg-desc "implementation (no documentation) part of \"distro-build\"") - -(define pkg-authors '(mflatt)) diff --git a/pkgs/distro-build-pkgs/distro-build-server/LICENSE.txt b/pkgs/distro-build-pkgs/distro-build-server/LICENSE.txt deleted file mode 100644 index 2f13367cd2..0000000000 --- a/pkgs/distro-build-pkgs/distro-build-server/LICENSE.txt +++ /dev/null @@ -1,11 +0,0 @@ -distro-build -Copyright (c) 2010-2014 PLT Design Inc. - -This package is distributed under the GNU Lesser General Public -License (LGPL). This means that you can link this package into proprietary -applications, provided you follow the rules stated in the LGPL. You -can also modify this package; if you distribute a modified version, -you must distribute it under the terms of the LGPL, which in -particular means that you must release the source code for the -modified software. See http://www.gnu.org/copyleft/lesser.html -for more information. diff --git a/pkgs/distro-build-pkgs/distro-build-server/assemble-site.rkt b/pkgs/distro-build-pkgs/distro-build-server/assemble-site.rkt deleted file mode 100644 index 93ea397837..0000000000 --- a/pkgs/distro-build-pkgs/distro-build-server/assemble-site.rkt +++ /dev/null @@ -1,142 +0,0 @@ -#lang racket/base -(require racket/cmdline - racket/file - net/url - "download-page.rkt" - "indexes.rkt" - (only-in distro-build/config extract-options) - (only-in plt-web site)) - -(module test racket/base) - -(define build-dir (build-path "build")) - -(define built-dir (build-path build-dir "built")) -(define native-dir (build-path build-dir "native")) -(define docs-dir (build-path build-dir "docs")) - -(define installers-dir (build-path "installers")) -(define pkgs-dir (build-path "pkgs")) -(define catalog-dir (build-path "catalog")) -(define from-catalog-dir-to-pkgs-dir (build-path 'up)) -(define doc-dir (build-path "doc")) -(define pdf-doc-dir (build-path "pdf-doc")) -(define log-dir (build-path "log")) - -(define-values (config-file config-mode) - (command-line - #:args - (config-file config-mode) - (values config-file config-mode))) - -(define config (extract-options config-file config-mode)) - -(define dest-dir (hash-ref config - '#:site-dest - (build-path build-dir "site"))) - -(define site-title (hash-ref config - '#:site-title - "Racket Downloads")) - -(define www-site (and (hash-ref config '#:plt-web-style? #t) - (site "www" - #:url "http://racket-lang.org/" - #:generate? #f))) - -(printf "Assembling site as ~a\n" dest-dir) - -(define (copy dir [build-dir build-dir]) - (make-directory* (let-values ([(base name dir?) (split-path dir)]) - (if (path? base) - (build-path dest-dir base) - dest-dir))) - (printf "Copying ~a\n" (build-path build-dir dir)) - (copy-directory/files (build-path build-dir dir) - (build-path dest-dir dir) - #:keep-modify-seconds? #t)) - -(delete-directory/files dest-dir #:must-exist? #f) - -(define (build-catalog built-dir) - (printf "Building catalog from ~a\n" built-dir) - (let ([c-dir (build-path built-dir pkgs-dir)] - [d-dir (build-path dest-dir pkgs-dir)]) - (make-directory* d-dir) - (for ([f (directory-list c-dir)]) - (define c (build-path c-dir f)) - (define d (build-path d-dir f)) - (copy-file c d) - (file-or-directory-modify-seconds d (file-or-directory-modify-seconds c)))) - (let ([c-dir (build-path built-dir catalog-dir "pkg")] - [d-dir (build-path dest-dir catalog-dir "pkg")]) - (make-directory* d-dir) - (for ([f (in-list (directory-list c-dir))]) - (define ht (call-with-input-file* (build-path c-dir f) read)) - (define new-ht - (hash-set ht 'source (relative-path->relative-url-string - (build-path - from-catalog-dir-to-pkgs-dir - pkgs-dir - (path-add-suffix f #".zip"))))) - (call-with-output-file* - (build-path d-dir f) - (lambda (o) - (write new-ht o) - (newline o)))))) - -(build-catalog built-dir) -(when (directory-exists? native-dir) - (build-catalog native-dir)) -(let ([l (directory-list (build-path dest-dir catalog-dir "pkg"))]) - ;; Write list of packages: - (define sl (map path-element->string l)) - (call-with-output-file* - (build-path dest-dir catalog-dir "pkgs") - (lambda (o) - (write sl o) - (newline o))) - ;; Write hash table of package details: - (define dht - (for/hash ([f (in-list l)]) - (values (path-element->string f) - (call-with-input-file* - (build-path dest-dir catalog-dir "pkg" f) - read)))) - (call-with-output-file* - (build-path dest-dir catalog-dir "pkgs-all") - (lambda (o) - (write dht o) - (newline o)))) - -(copy log-dir) -(generate-index-html dest-dir log-dir www-site) - -(copy installers-dir) -(generate-index-html dest-dir installers-dir www-site) - -(define doc-path (build-path docs-dir doc-dir)) -(when (directory-exists? doc-path) - (copy doc-dir docs-dir)) -(define pdf-doc-path (build-path build-dir pdf-doc-dir)) -(when (directory-exists? pdf-doc-path) - (copy pdf-doc-dir) - (generate-index-html dest-dir pdf-doc-dir www-site)) -(copy "stamp.txt") -(copy (build-path "origin" "collects.tgz")) - -(make-download-page (build-path build-dir - installers-dir - "table.rktd") - #:plt-www-site www-site - #:title site-title - #:installers-url "installers/" - #:log-dir-url "log/" - #:docs-url (and (directory-exists? doc-path) - "doc/index.html") - #:pdf-docs-url (and (directory-exists? pdf-doc-path) - "pdf-doc/") - #:dest (build-path dest-dir - "index.html") - #:help-table (hash-ref config '#:site-help (hash)) - #:git-clone (current-directory)) diff --git a/pkgs/distro-build-pkgs/distro-build-server/config.rkt b/pkgs/distro-build-pkgs/distro-build-server/config.rkt deleted file mode 100644 index 21dc7de894..0000000000 --- a/pkgs/distro-build-pkgs/distro-build-server/config.rkt +++ /dev/null @@ -1,205 +0,0 @@ -#lang racket/base - -(require racket/format - (for-syntax syntax/kerncase - racket/base)) - -(provide (except-out (all-from-out racket/base) - #%module-begin) - (rename-out [module-begin #%module-begin]) - sequential - parallel - machine - site-config? - site-config-tag - site-config-options - site-config-content - current-mode - current-stamp - extract-options) - -(module reader syntax/module-reader - distro-build/config) - -(struct site-config (tag options content)) - -(define-syntax-rule (module-begin form ...) - (#%plain-module-begin (site-begin #f form ...))) - -(define-syntax (site-begin stx) - (syntax-case stx () - [(_ #t) #'(begin)] - [(_ #f) - (raise-syntax-error 'site - "did not find an expression for the site configuration")] - [(_ found? next . rest) - (let ([expanded (local-expand #'next 'module (kernel-form-identifier-list))]) - (syntax-case expanded (begin) - [(begin next1 ...) - #`(site-begin found? next1 ... . rest)] - [(id . _) - (and (identifier? #'id) - (ormap (lambda (kw) (free-identifier=? #'id kw)) - (syntax->list #'(require - provide - define-values - define-syntaxes - begin-for-syntax - module - module* - #%require - #%provide)))) - #`(begin #,expanded (site-begin found? . rest))] - [_else - (if (syntax-e #'found?) - (raise-syntax-error 'site - "found second top-level expression" - #'next) - #`(begin - (provide site-config) - (define site-config (let ([v #,expanded]) - (unless (site-config? v) - (error 'site - (~a "expression did not produce a site configuration\n" - " result: ~e\n" - " expression: ~.s") - v - 'next)) - v)) - (site-begin - #t - . rest)))]))])) - -(define sequential - (make-keyword-procedure - (lambda (kws kw-vals . subs) - (constructor kws kw-vals subs - check-group-keyword 'sequential)))) -(define parallel - (make-keyword-procedure - (lambda (kws kw-vals . subs) - (constructor kws kw-vals subs - check-group-keyword 'parallel)))) -(define machine - (make-keyword-procedure - (lambda (kws kw-vals) - (constructor kws kw-vals null - check-machine-keyword 'machine)))) - -(define (constructor kws kw-vals subs check tag) - (site-config - tag - (for/hash ([kw (in-list kws)] - [val (in-list kw-vals)]) - (define r (check kw val)) - (when (eq? r 'bad-keyword) - (error tag - (~a "unrecognized keyword for option\n" - " keyword: ~s") - kw)) - (unless (check kw val) - (error tag - (~a "bad value for keyword\n" - " keyword: ~s\n" - " value: ~e") - kw - val)) - (values kw val)) - (for/list ([sub subs]) - (unless (site-config? sub) - (raise-argument-error tag "site-config?" sub)) - sub))) - -(define (check-group-keyword kw val) - (case kw - [(#:pkgs) (and (list? val) (andmap simple-string? val))] - [(#:doc-search) (string? val)] - [(#:dist-name) (string? val)] - [(#:dist-base) (simple-string? val)] - [(#:dist-dir) (simple-string? val)] - [(#:dist-suffix) (simple-string? val)] - [(#:dist-catalogs) (and (list? val) (andmap string? val))] - [(#:dist-base-url) (string? val)] - [(#:install-name) (string? val)] - [(#:build-stamp) (string? val)] - [(#:max-vm) (real? val)] - [(#:server) (simple-string? val)] - [(#:server-port) (port-no? val)] - [(#:server-hosts) (and (list? val) (andmap simple-string? val))] - [(#:host) (simple-string? val)] - [(#:user) (or (not val) (simple-string? val))] - [(#:port) (port-no? val)] - [(#:dir) (path-string? val)] - [(#:vbox) (string? val)] - [(#:platform) (memq val '(unix macosx windows windows/bash))] - [(#:configure) (and (list? val) (andmap string? val))] - [(#:bits) (or (equal? val 32) (equal? val 64))] - [(#:vc) (string? val)] - [(#:sign-identity) (string? val)] - [(#:timeout) (real? val)] - [(#:j) (exact-positive-integer? val)] - [(#:repo) (string? val)] - [(#:clean?) (boolean? val)] - [(#:pull?) (boolean? val)] - [(#:release?) (boolean? val)] - [(#:source?) (boolean? val)] - [(#:source-runtime?) (boolean? val)] - [(#:source-pkgs?) (boolean? val)] - [(#:versionless?) (boolean? val)] - [(#:mac-pkg?) (boolean? val)] - [(#:site-dest) (path-string? val)] - [(#:site-help) (hash? val)] - [(#:site-title) (string? val)] - [(#:pdf-doc?) (boolean? val)] - [(#:max-snapshots) (real? val)] - [(#:plt-web-style?) (boolean? val)] - [(#:pause-before) (and (real? val) (not (negative? val)))] - [(#:pause-after) (and (real? val) (not (negative? val)))] - [(#:readme) (or (string? val) - (and (procedure? val) - (procedure-arity-includes? val 1)))] - [(#:email-to) (and (list? val) (andmap email? val))] - [(#:email-from) (email? val)] - [(#:smtp-server) (simple-string? val)] - [(#:smtp-port) (port-no? val)] - [(#:smtp-connect) (memq val '(plain ssl tls))] - [(#:smtp-user) (or (not val) (string? val))] - [(#:smtp-password) (or (not val) (string? val))] - [(#:custom) (and (hash? val) - (for/and ([k (in-hash-keys val)]) - (keyword? k)))] - [else 'bad-keyword])) - -(define (check-machine-keyword kw val) - (case kw - [(#:name) (string? val)] - [else (check-group-keyword kw val)])) - -(define (port-no? val) - (and (exact-integer? val) (<= 1 val 65535))) - -(define (simple-string? s) - (and (string? s) - ;; No spaces, quotes, or other things that could - ;; break a command-line, path, or URL construction: - (regexp-match #rx"^[-a-zA-A0-9.]*$" s))) - -(define (email? s) - (and (string? s) - (regexp-match? #rx"@" s))) - -(define current-mode (make-parameter "default")) - -(define current-stamp - (let* ([f (build-path "build" "stamp.txt")] - [s (and (file-exists? f) - (call-with-input-file* f read-line))]) - (lambda () - (if (string? s) - s - "now")))) - -(define (extract-options config-file config-mode) - (parameterize ([current-mode config-mode]) - (site-config-options - (dynamic-require (path->complete-path config-file) 'site-config)))) diff --git a/pkgs/distro-build-pkgs/distro-build-server/download-page.rkt b/pkgs/distro-build-pkgs/distro-build-server/download-page.rkt deleted file mode 100644 index bf907adeaf..0000000000 --- a/pkgs/distro-build-pkgs/distro-build-server/download-page.rkt +++ /dev/null @@ -1,404 +0,0 @@ -#lang at-exp racket/base -(require racket/format - racket/path - racket/system - racket/list - racket/date - racket/file - net/url - openssl/sha1 - scribble/html - (only-in plt-web site page call-with-registered-roots) - (only-in plt-web/style columns)) - -(provide make-download-page - get-installers-table - (struct-out past-success)) - -(module+ main - (require racket/cmdline) - - (define args null) - (define (arg! kw val) - (set! args (cons (cons kw val) args))) - - (define table-file - (command-line - #:once-each - [("--at") url "URL for installers relative to download page" - (arg! '#:installers-url url)] - [("--dest") file "Write to " - (arg! '#:dest file)] - [("--git") dir "Report information from git clone " - (arg! '#:git-clone dir)] - [("--plt") "Use PLT web page style" - (arg! '#:plt-web-style? #t)] - #:args - (table-file) - table-file)) - - (let ([args (sort args keywordhtml p) - (cond - [(pair? p) - (define has-attr? (or (and (pair? (cadr p)) - (pair? (cadr p))) - (null? (cadr p)))) - (apply element (car p) (if has-attr? - (cadr p) - null) - (map xexpr->html (if has-attr? (cddr p) (cdr p))))] - [(string? p) p] - [(or (symbol? p) (number? p)) (entity p)] - [else (error "unknown xexpr")])) - - (define (get-site-help last-col) - (let ([h (hash-ref site-help last-col #f)]) - (if h - (let* ([id (~a "help" (gensym))] - [toggle (let ([elem (~a "document.getElementById" "('" id "')")]) - (~a elem ".style.display = ((" elem ".style.display == 'inline') ? 'none' : 'inline');" - " return false;"))]) - (list - " " - (div class: "helpbutton" - (a href: "#" - class: "helpbuttonlabel" - onclick: toggle - title: "explain" - nbsp "?" nbsp)) - (div class: "hiddenhelp" - id: id - onclick: toggle - style: "display: none" - (div class: "helpcontent" - (div class: "helptext" - (xexpr->html h)))))) - null))) - - (define page-site (and plt-style? - (site "download-page" - #:url "http://page.racket-lang.org/" - #:navigation (if docs-url - (list nbsp - nbsp - (a href: docs-url "Documentation") - (if pdf-docs-url - (a href: pdf-docs-url "PDF") - nbsp)) - null) - #:share-from (or www-site - (site "www" - #:url "http://racket-lang.org/" - #:generate? #f))))) - - (define orig-directory (current-directory)) - - (define page-headers - (style/inline @~a|{ - .detail { font-size: small; font-weight: normal; } - .checksum, .path { font-family: monospace; } - .group { background-color : #ccccff; padding-left: 0.5ex; } - .major { font-weight : bold; font-size : large; left-border: 1ex; } - .minor { font-weight : bold; } - .download-table { border: 0px solid white; } - .download-table td { display: table-cell; padding: 0px 2px 0px 2px; border: 0px solid white; } - .helpbutton { - display: inline; - font-family: sans-serif; - font-size : x-small; - background-color: #ffffee; - border: 1px solid black; - vertical-align: top; - } - .helpbuttonlabel{ vertical-align: top; } - .hiddenhelp { - width: 0em; - position: absolute; - } - .helpcontent { - width: 20em; - font-size : small; - font-weight : normal; - background-color: #ffffee; - padding: 10px; - border: 1px solid black; - } - a { text-decoration: none; } - }|)) - - (define (strip-detail s) - (if (string? s) - (regexp-replace #rx";.*" s "") - s)) - - (define (add-detail s e) - (define m (and (string? s) - (regexp-match #rx"(?<=; )(.*)$" s))) - (cond - [m - (span e (span class: "detail" - nbsp - (cadr m)))] - [else e])) - - (define page-body - (list - (if page-title - ((if plt-style? h3 h2) page-title) - null) - (table - class: "download-table" - (for/list ([elem (in-list elems)]) - (define key (car elem)) - (define inst (and key (hash-ref table-data key))) - (define mid-cols (if (null? (cdr elem)) - #f - (drop-right (cdr elem) 1))) - (define last-col (last elem)) - (define level-class - (case (length elem) - [(2) (~a "major" (if key "" " group"))] - [(3) "minor"] - [else "subminor"])) - (define num-cols (if current-rx - "7" - "5")) - (cond - [(not mid-cols) - (tr (td colspan: num-cols nbsp))] - [inst - (tr (td - (for/list ([col (in-list mid-cols)]) - (span nbsp nbsp nbsp)) - (add-detail - last-col - (if (past-success? inst) - ;; Show missing installer - (span class: (string-append "no-installer " level-class) - (strip-detail last-col)) - ;; Link to installer - (a class: (string-append "installer " level-class) - href: (url->string - (combine-url/relative - (string->url installers-url) - inst)) - (strip-detail last-col)))) - (get-site-help last-col)) - (td nbsp) - (td (if (past-success? inst) - (span class: "detail" "") - (span class: "detail" - (~r (/ (file-size (build-path (path-only table-file) - inst)) - (* 1024 1024)) - #:precision 1) - " MB"))) - (td nbsp) - (td (if (past-success? inst) - (span class: "detail" - (if (and log-dir - (file-exists? (build-path log-dir key))) - (list - (a href: (url->string - (combine-url/relative - (string->url log-dir-url) - key)) - "build failed") - "; ") - null) - "last success: " - (a href: (~a (past-success-relative-url inst)) - (past-success-name inst))) - (span class: "detail" - "SHA1: " - (span class: "checksum" - (call-with-input-file* - (build-path (path-only table-file) - inst) - sha1))))) - (if current-rx - (list - (td nbsp) - (td (span class: "detail" - (let ([inst-path (if (past-success? inst) - (past-success-file inst) - inst)]) - (if (regexp-match? current-rx inst-path) - (a href: (url->string - (combine-url/relative - (string->url installers-url) - (bytes->string/utf-8 - (regexp-replace current-rx - (string->bytes/utf-8 inst-path) - #"current")))) - "as " ldquo "current" rdquo) - nbsp))))) - null))] - [else - (tr (td class: level-class - colspan: num-cols - (for/list ([col (in-list mid-cols)]) - (span nbsp nbsp nbsp)) - (add-detail - last-col - (strip-detail last-col)) - (get-site-help last-col)))]))) - (if (and docs-url - (not site)) - (p (a href: docs-url "Documentation") - (if pdf-docs-url - (list - nbsp - nbsp - (span class: "detail" - (a href: pdf-docs-url "[also available as PDF]"))) - null)) - null) - (if git-clone - (let ([git (find-executable-path "git")]) - (define origin (let ([s (system*/string git "remote" "show" "origin")]) - (define m (regexp-match #rx"(?m:Fetch URL: (.*)$)" s)) - (if m - (cadr m) - "???"))) - (define stamp (system*/string git "log" "-1" "--format=%H")) - (p - (div (span class: "detail" "Repository: " (span class: "path" origin))) - (div (span class: "detail" "Commit: " (span class: "checksum" stamp))) - (or log-link null))) - null) - (if (and log-link (not git-clone)) - (p log-link) - null) - post-content)) - - (define-values (dest-dir dest-file dest-is-dir?) (split-path dest)) - - (define page-content - (if page-site - (page #:site page-site - #:file (path-element->string dest-file) - #:title page-title - #:extra-headers page-headers - (columns 12 #:row? #t - page-body)) - (html (head (title page-title) - page-headers) - (body page-body)))) - - (call-with-registered-roots - (lambda () - (cond - [page-site - ;; Render to "download-page", then move up: - (define base-dir (if (path? dest-dir) - dest-dir - (current-directory))) - (parameterize ([current-directory base-dir]) - (render-all)) - (define dp-dir (build-path base-dir "download-page")) - (for ([f (in-list (directory-list dp-dir))]) - (define f-dest (build-path base-dir f)) - (delete-directory/files f-dest #:must-exist? #f) - (rename-file-or-directory (build-path dp-dir f) f-dest)) - (delete-directory dp-dir)] - [else - (call-with-output-file* - dest - #:exists 'truncate/replace - (lambda (o) - (output-xml page-content o)))])))) diff --git a/pkgs/distro-build-pkgs/distro-build-server/drive-clients.rkt b/pkgs/distro-build-pkgs/distro-build-server/drive-clients.rkt deleted file mode 100644 index 2258600b6d..0000000000 --- a/pkgs/distro-build-pkgs/distro-build-server/drive-clients.rkt +++ /dev/null @@ -1,532 +0,0 @@ -#lang racket/base -(require racket/cmdline - racket/system - racket/port - racket/format - racket/file - racket/string - racket/path - (only-in distro-build/config - current-mode - site-config? - site-config-tag site-config-options site-config-content - current-stamp) - distro-build/url-options - distro-build/display-time - distro-build/readme - remote-shell/vbox - "email.rkt") - -;; See "config.rkt" for an overview. - -(module test racket/base) - -;; ---------------------------------------- - -(define default-release? #f) -(define default-source? #f) -(define default-versionless? #f) -(define default-clean? #f) -(define dry-run #f) - -(define snapshot-install-name "snapshot") - -(define-values (config-file config-mode - default-server default-server-port default-server-hosts - default-pkgs default-doc-search - default-dist-name default-dist-base default-dist-dir) - (command-line - #:once-each - [("--release") "Create release-mode installers" - (set! default-release? #t)] - [("--source") "Create source installers" - (set! default-source? #t)] - [("--versionless") "Avoid version number in names and paths" - (set! default-versionless? #t)] - [("--clean") "Erase client directories before building" - (set! default-clean? #t)] - [("--dry-run") mode - ("Don't actually use the clients;" - " can be `ok', `fail', `error', `stuck', or `frozen'") - (unless (member mode '("ok" "fail" "error" "stuck" "frozen")) - (raise-user-error 'drive-clients "bad dry-run mode: ~a" mode)) - (set! dry-run (string->symbol mode))] - #:args (config-file config-mode - server server-port server-hosts pkgs doc-search - dist-name dist-base dist-dir) - (values config-file config-mode - server server-port server-hosts pkgs doc-search - dist-name dist-base dist-dir))) - -(define config (parameterize ([current-mode config-mode]) - (dynamic-require (path->complete-path config-file) 'site-config))) - -(unless (site-config? config) - (error 'drive-clients - "configuration module did not provide a site-configuration value: ~e" - config)) - -;; ---------------------------------------- - -(define (merge-options opts c) - (for/fold ([opts opts]) ([(k v) (in-hash (site-config-options c))]) - (if (eq? k '#:custom) - (hash-set opts - '#:custom - (let ([prev (hash-ref opts '#:custom (hash))]) - (for/fold ([prev prev]) ([(k2 v2) (in-hash v)]) - (hash-set prev k2 v2)))) - (hash-set opts k v)))) - -(define (get-opt opts kw [default #f] #:localhost [localhost-default default]) - (hash-ref opts kw (lambda () - (cond - [(equal? default localhost-default) default] - [(and (equal? "localhost" (get-opt opts '#:host "localhost")) - (equal? #f (get-opt opts '#:user #f)) - (equal? #f (get-opt opts '#:dir #f))) - localhost-default] - [else default])))) - -(define (get-content c) - (site-config-content c)) - -(define (client-name opts) - (or (get-opt opts '#:name) - (get-opt opts '#:host) - "localhost")) - -(define (get-path-opt opt key default #:localhost [localhost-default default]) - (define d (get-opt opt key default #:localhost localhost-default)) - (if (path? d) - (path->string d) - d)) - -(define (add-defaults c . l) - (let loop ([c c] [l l]) - (cond - [(null? l) c] - [else (loop (hash-set c (car l) - (hash-ref c (car l) (lambda () (cadr l)))) - (cddr l))]))) - -;; ---------------------------------------- -;; Managing VirtualBox machines - -(define (start-client c max-vm) - (define vbox (get-opt c '#:vbox)) - (when vbox - (start-vbox-vm vbox - #:max-vms max-vm - #:dry-run? dry-run))) - -(define (stop-client c) - (define vbox (get-opt c '#:vbox)) - (when vbox - (stop-vbox-vm vbox))) - -(define (try-until-ready c host port user server-port kind cmd) - (when (get-opt c '#:vbox) - ;; A VM may take a little while to get networking set up and - ;; respond, so give a dummy `cmd` a few tries - (let loop ([tries 3]) - (unless (ssh-script host port user server-port kind cmd) - (sleep 1) - (loop (sub1 tries)))))) - -;; ---------------------------------------- - -(define scp (find-executable-path "scp")) -(define ssh (find-executable-path "ssh")) - -(define (system*/show exe . args) - (displayln (apply ~a #:separator " " - (map (lambda (p) (if (path? p) (path->string p) p)) - (cons exe args)))) - (flush-output) - (case dry-run - [(ok) #t] - [(fail) #f] - [(error) (error "error")] - [(stuck) (semaphore-wait (make-semaphore))] - [(frozen) (break-enabled #f) (semaphore-wait (make-semaphore))] - [else - (apply system* exe args)])) - -(define (ssh-script host port user server-port kind . cmds) - (for/and ([cmd (in-list cmds)]) - (when cmd (display-time)) - (or (not cmd) - (if (and (equal? host "localhost") - (not user)) - (apply system*/show cmd) - (apply system*/show ssh - "-p" (~a port) - ;; create tunnel to connect back to server: - "-R" (~a server-port ":localhost:" server-port) - (if user - (~a user "@" host) - host) - (if (eq? kind 'unix) - ;; ssh needs an extra level of quoting - ;; relative to sh: - (for/list ([arg (in-list cmd)]) - (~a "'" - (regexp-replace* #rx"'" arg "'\"'\"'") - "'")) - ;; windows quoting built into `cmd' aready - cmd)))))) - -(define (q s) - (~a "\"" s "\"")) - -(define (qq l kind) - (case kind - [(unix macosx) - (~a "'" - (apply ~a #:separator " " (map q l)) - "'")] - [(windows windows/bash) - (~a "\"" - (apply - ~a #:separator " " - (for/list ([i (in-list l)]) - (~a "\\\"" - i - ;; A backslash is literal unless followed by a - ;; quote. If `i' ends in backslashes, they - ;; must be doubled, because the \" added to - ;; the end will make them treated as escapes. - (let ([m (regexp-match #rx"\\\\*$" i)]) - (car m)) - "\\\""))) - "\"")])) - -(define (shell-protect s kind) - (case kind - [(windows/bash) - ;; Protect Windows arguments to go through bash, where - ;; unquoted backslashes must be escaped, but quotes are effectively - ;; preserved by the shell, and quoted backslashes should be left - ;; alone; also, "&&" must be quoted to avoid parsing by bash - (regexp-replace* "&&" - (list->string - ;; In practice, the following loop is likely to - ;; do nothing, because constructed command lines - ;; tend to have only quoted backslashes. - (let loop ([l (string->list s)] [in-quote? #f]) - (cond - [(null? l) null] - [(and (equal? #\\ (car l)) - (not in-quote?)) - (list* #\\ #\\ (loop (cdr l) #f))] - [(and in-quote? - (equal? #\\ (car l)) - (pair? (cdr l)) - (or (equal? #\" (cadr l)) - (equal? #\\ (cadr l)))) - (list* #\\ (cadr l) (loop (cddr l) #t))] - [(equal? #\" (car l)) - (cons #\" (loop (cdr l) (not in-quote?)))] - [else - (cons (car l) (loop (cdr l) in-quote?))]))) - "\"\\&\\&\"")] - [else s])) - -(define (client-args c server server-port kind readme) - (define desc (client-name c)) - (define pkgs (let ([l (get-opt c '#:pkgs)]) - (if l - (apply ~a #:separator " " l) - default-pkgs))) - (define doc-search (choose-doc-search c default-doc-search)) - (define dist-name (or (get-opt c '#:dist-name) - default-dist-name)) - (define dist-base (or (get-opt c '#:dist-base) - default-dist-base)) - (define dist-dir (or (get-opt c '#:dist-dir) - default-dist-dir)) - (define dist-suffix (get-opt c '#:dist-suffix "")) - (define dist-catalogs (choose-catalogs c '(""))) - (define sign-identity (get-opt c '#:sign-identity "")) - (define release? (get-opt c '#:release? default-release?)) - (define source? (get-opt c '#:source? default-source?)) - (define versionless? (get-opt c '#:versionless? default-versionless?)) - (define source-pkgs? (get-opt c '#:source-pkgs? source?)) - (define source-runtime? (get-opt c '#:source-runtime? source?)) - (define mac-pkg? (get-opt c '#:mac-pkg? #f)) - (define install-name (get-opt c '#:install-name (if release? - "" - snapshot-install-name))) - (define build-stamp (get-opt c '#:build-stamp (if release? - "" - (current-stamp)))) - (~a " SERVER=" server - " SERVER_PORT=" server-port - " PKGS=" (q pkgs) - " DOC_SEARCH=" (q doc-search) - " DIST_DESC=" (q desc) - " DIST_NAME=" (q dist-name) - " DIST_BASE=" dist-base - " DIST_DIR=" dist-dir - " DIST_SUFFIX=" (q dist-suffix) - " DIST_CATALOGS_q=" (qq dist-catalogs kind) - " SIGN_IDENTITY=" (q sign-identity) - " INSTALL_NAME=" (q install-name) - " BUILD_STAMP=" (q build-stamp) - " RELEASE_MODE=" (if release? "--release" (q "")) - " SOURCE_MODE=" (if source-runtime? "--source" (q "")) - " VERSIONLESS_MODE=" (if versionless? "--versionless" (q "")) - " PKG_SOURCE_MODE=" (if source-pkgs? - (q "--source --no-setup") - (q "")) - " MAC_PKG_MODE=" (if mac-pkg? "--mac-pkg" (q "")) - " UPLOAD=http://" server ":" server-port "/upload/" - " README=http://" server ":" server-port "/" (q (file-name-from-path readme)))) - -(define (unix-build c platform host port user server server-port repo clean? pull? readme) - (define dir (get-path-opt c '#:dir "build/plt" #:localhost (current-directory))) - (define (sh . args) - (list "/bin/sh" "-c" (apply ~a args))) - (define j (or (get-opt c '#:j) 1)) - (try-until-ready c host port user server-port 'unix (sh "echo hello")) - (ssh-script - host port user - server-port - 'unix - (and clean? - (sh "rm -rf " (q dir))) - (sh "if [ ! -d " (q dir) " ] ; then" - " git clone " (q repo) " " (q dir) " ; " - "fi") - (and pull? - (sh "cd " (q dir) " ; " - "git pull")) - (sh "cd " (q dir) " ; " - "make -j " j " client" - (client-args c server server-port 'unix readme) - " JOB_OPTIONS=\"-j " j "\"" - " CONFIGURE_ARGS_qq=" (qq (get-opt c '#:configure null) 'unix)))) - -(define (windows-build c platform host port user server server-port repo clean? pull? readme) - (define dir (get-path-opt c '#:dir "build\\plt" #:localhost (current-directory))) - (define bits (or (get-opt c '#:bits) 64)) - (define vc (or (get-opt c '#:vc) - (if (= bits 32) - "x86" - "x86_amd64"))) - (define j (or (get-opt c '#:j) 1)) - (define (cmd . args) - (list "cmd" "/c" (shell-protect (apply ~a args) platform))) - (try-until-ready c host port user server-port 'windows (cmd "echo hello")) - (ssh-script - host port user - server-port - platform - (and clean? - (cmd "IF EXIST " (q dir) " rmdir /S /Q " (q dir))) - (cmd "IF NOT EXIST " (q dir) " git clone " (q repo) " " (q dir)) - (and pull? - (cmd "cd " (q dir) - " && git pull")) - (cmd "cd " (q dir) - " && racket\\src\\worksp\\msvcprep.bat " vc - " && nmake win32-client" - " JOB_OPTIONS=\"-j " j "\"" - (client-args c server server-port platform readme)))) - -(define (client-build c) - (define host (or (get-opt c '#:host) - "localhost")) - (define port (or (get-opt c '#:port) - 22)) - (define user (get-opt c '#:user)) - (define server (or (get-opt c '#:server) - default-server)) - (define server-port (or (get-opt c '#:server-port) - default-server-port)) - (define repo (or (get-opt c '#:repo) - (~a "http://" server ":" server-port "/.git"))) - (define clean? (get-opt c '#:clean? default-clean? #:localhost #f)) - (define pull? (get-opt c '#:pull? #t #:localhost #f)) - - (define readme-txt (let ([rdme (get-opt c '#:readme make-readme)]) - (if (string? rdme) - rdme - (rdme (add-defaults c - '#:release? default-release? - '#:source? default-source? - '#:versionless? default-versionless? - '#:pkgs (string-split default-pkgs) - '#:install-name (if (get-opt c '#:release? default-release?) - "" - snapshot-install-name) - '#:build-stamp (if (get-opt c '#:release? default-release?) - "" - (current-stamp))))))) - (make-directory* (build-path "build" "readmes")) - (define readme (make-temporary-file - "README-~a" - #f - (build-path "build" "readmes"))) - (call-with-output-file* - readme - #:exists 'truncate - (lambda (o) - (display readme-txt o) - (unless (regexp-match #rx"\n$" readme-txt) - ;; ensure a newline at the end: - (newline o)))) - - (define platform (or (get-opt c '#:platform) (system-type))) - - (begin0 - - ((case platform - [(unix macosx) unix-build] - [else windows-build]) - c platform host port user server server-port repo clean? pull? readme) - - (delete-file readme))) - -;; ---------------------------------------- - -(define stop? #f) - -(define failures (make-hasheq)) -(define (record-failure name) - ;; relies on atomicity of `eq?'-based hash table: - (hash-set! failures (string->symbol name) #t)) - -(define (limit-and-report-failure c timeout-factor - shutdown report-fail - thunk) - (define cust (make-custodian)) - (define timeout (or (get-opt c '#:timeout) - (* 30 60))) - (define orig-thread (current-thread)) - (define timeout? #f) - (begin0 - (parameterize ([current-custodian cust]) - (thread (lambda () - (sleep (* timeout-factor timeout)) - (eprintf "timeout for ~s\n" (client-name c)) - ;; try nice interrupt, first: - (set! timeout? #t) - (break-thread orig-thread) - (sleep 1) - ;; force quit: - (report-fail) - (shutdown))) - (with-handlers ([exn? (lambda (exn) - (when (exn:break? exn) - ;; This is useful only when everything is - ;; sequential, which is the only time that - ;; we'll get break events that aren't timeouts: - (unless timeout? - (set! stop? #t))) - (log-error "~a failed..." (client-name c)) - (log-error (exn-message exn)) - (report-fail) - #f)]) - (thunk))) - (custodian-shutdown-all cust))) - -(define (client-thread c all-seq? proc) - (unless stop? - (define log-dir (build-path "build" "log")) - (define log-file (build-path log-dir (client-name c))) - (make-directory* log-dir) - (printf "Logging build: ~a\n" log-file) - (flush-output) - (define cust (make-custodian)) - (define (go shutdown) - (define p (open-output-file log-file - #:exists 'truncate/replace)) - (file-stream-buffer-mode p 'line) - (define (report-fail) - (record-failure (client-name c)) - (printf "Build FAILED for ~s\n" (client-name c))) - (unless (parameterize ([current-output-port p] - [current-error-port p]) - (proc shutdown report-fail)) - (report-fail)) - (display-time)) - (cond - [all-seq? - (go (lambda () (exit 1))) - (thread void)] - [else - (parameterize ([current-custodian cust]) - (thread - (lambda () - (go (lambda () - (custodian-shutdown-all cust))))))]))) - -;; ---------------------------------------- - -(define start-seconds (current-seconds)) -(display-time) - -(void - (sync - (let loop ([config config] - [all-seq? #t] ; Ctl-C handling is better if nothing is in parallel - [opts (hasheq)]) - (cond - [stop? (thread void)] - [else - (case (site-config-tag config) - [(parallel) - (define new-opts (merge-options opts config)) - (define ts - (map (lambda (c) (loop c #f new-opts)) - (get-content config))) - (thread - (lambda () - (for ([t (in-list ts)]) - (sync t))))] - [(sequential) - (define new-opts (merge-options opts config)) - (define (go) - (for-each (lambda (c) (sync (loop c all-seq? new-opts))) - (get-content config))) - (if all-seq? - (begin (go) (thread void)) - (thread go))] - [else - (define c (merge-options opts config)) - (client-thread - c - all-seq? - (lambda (shutdown report-fail) - (limit-and-report-failure - c 2 shutdown report-fail - (lambda () - (sleep (get-opt c '#:pause-before 0)) - ;; start client, if a VM: - (start-client c (or (get-opt c '#:max-vm) 1)) - ;; catch failure in build step proper, so we - ;; can more likely stop the client: - (begin0 - (limit-and-report-failure - c 1 shutdown report-fail - (lambda () (client-build c))) - ;; stop client, if a VM: - (stop-client c) - (sleep (get-opt c '#:pause-after 0)))))))])])))) - -(display-time) -(define end-seconds (current-seconds)) - -(unless stop? - (let ([opts (merge-options (hasheq) config)]) - (let ([to-email (get-opt opts '#:email-to null)]) - (unless (null? to-email) - (printf "Sending report to ~a\n" (apply ~a to-email #:separator ", ")) - (send-email to-email (lambda (key def) - (get-opt opts key def)) - (get-opt opts '#:build-stamp (current-stamp)) - start-seconds end-seconds - (hash-map failures (lambda (k v) (symbol->string k)))) - (display-time))))) diff --git a/pkgs/distro-build-pkgs/distro-build-server/email.rkt b/pkgs/distro-build-pkgs/distro-build-server/email.rkt deleted file mode 100644 index 5bb24bf4fc..0000000000 --- a/pkgs/distro-build-pkgs/distro-build-server/email.rkt +++ /dev/null @@ -1,74 +0,0 @@ -#lang racket/base -(require racket/format - net/head - net/smtp - net/sendmail - openssl - racket/tcp) - -(provide send-email) - -(define (send-email to-email get-opt - stamp - start-seconds end-seconds - failures) - (let ([server (get-opt '#:smtp-server #f)] - [from-email (or (get-opt '#:email-from #f) - (car to-email))] - [subject (~a "[build] " - (if (null? failures) - "success" - "FAILURE") - " " stamp)] - [message (append - (if (null? failures) - '("All builds succeeded.") - (cons - "The following builds failed:" - (for/list ([i (in-list failures)]) - (~a " " i)))) - (list - "" - (let ([e (- end-seconds start-seconds)] - [~d (lambda (n) - (~a n #:width 2 #:pad-string "0" #:align 'right))]) - (~a "Elapsed time: " - (~d (quotient e (* 60 60))) - ":" - (~d (modulo (quotient e (* 60)) 60)) - ":" - (~d (modulo e (* 60 60))))) - "" - (~a "Stamp: " stamp)))]) - (cond - [server - (let* ([smtp-connect (get-opt '#:smtp-connect 'plain)] - [port-no (get-opt '#:smtp-port - (case smtp-connect - [(plain) 25] - [(ssl) 465] - [(tls) 587]))]) - (smtp-send-message server - #:port-no port-no - #:tcp-connect (if (eq? 'ssl smtp-connect) - ssl-connect - tcp-connect) - #:tls-encode (and (eq? 'tls smtp-connect) - ports->ssl-ports) - #:auth-user (get-opt '#:smtp-user #f) - #:auth-passwd (get-opt '#:smtp-password #f) - from-email - to-email - (standard-message-header from-email - to-email - null - null - subject) - message))] - [else - (send-mail-message from-email - subject - to-email - null - null - message)]))) diff --git a/pkgs/distro-build-pkgs/distro-build-server/indexes.rkt b/pkgs/distro-build-pkgs/distro-build-server/indexes.rkt deleted file mode 100644 index a0661ee1f5..0000000000 --- a/pkgs/distro-build-pkgs/distro-build-server/indexes.rkt +++ /dev/null @@ -1,42 +0,0 @@ -#lang racket/base -(require racket/string - scribble/html - plt-web) - -(provide generate-index-html) - -(define (generate-index-html dest-dir sub-dir www-site) - (define content - (for/list ([f (directory-list (build-path dest-dir sub-dir))]) - (define fp (build-path dest-dir sub-dir f)) - (if (file-exists? fp) - (cons f (file-size fp)) - (cons f 'dir)))) - (cond - [www-site - (define web-dir (string-join (map path-element->string (explode-path sub-dir)) "/")) - (log-error "web ~s" web-dir) - (define s - (site web-dir - #:url "http://index.racket-lang.org" - #:share-from www-site - #:always-abs-url? #f)) - (define is (index-site s)) - (index-page is 'same content) - (void)] - [else - (define page-content - (html (head (title "Index")) - (body (table - (for/list ([c (in-list content)]) - (tr (td (a href: (car c) - ((if (eq? 'dir (cdr c)) - (lambda (p) - (format "[~a]" p)) - values) - (car c)))))))))) - (call-with-output-file* - (build-path dest-dir sub-dir "index.html") - (lambda (o) - (output-xml page-content o)))])) - diff --git a/pkgs/distro-build-pkgs/distro-build-server/info.rkt b/pkgs/distro-build-pkgs/distro-build-server/info.rkt deleted file mode 100644 index 8acdb56425..0000000000 --- a/pkgs/distro-build-pkgs/distro-build-server/info.rkt +++ /dev/null @@ -1,17 +0,0 @@ -#lang info - -(define collection "distro-build") - -(define deps '("base" - "distro-build-client" - "web-server-lib" - "ds-store-lib" - "net-lib" - "scribble-html-lib" - "plt-web-lib" - "remote-shell-lib")) -(define build-deps '("at-exp-lib")) - -(define pkg-desc "server-side part of \"distro-build\"") - -(define pkg-authors '(mflatt)) diff --git a/pkgs/distro-build-pkgs/distro-build-server/install-for-docs.rkt b/pkgs/distro-build-pkgs/distro-build-server/install-for-docs.rkt deleted file mode 100644 index 022b158763..0000000000 --- a/pkgs/distro-build-pkgs/distro-build-server/install-for-docs.rkt +++ /dev/null @@ -1,70 +0,0 @@ -#lang racket/base -(require racket/cmdline - racket/file - racket/string - racket/system - compiler/find-exe - (only-in "config.rkt" extract-options) - distro-build/display-time) - -(module test racket/base) - -(define-values (dir config-file config-mode default-pkgs catalogs) - (command-line - #:args - (dir config-file config-mode default-pkgs . catalog) - (values dir config-file config-mode default-pkgs catalog))) - -(define config (extract-options config-file config-mode)) - -(define pkgs - (or (hash-ref config '#:pkgs #f) - (string-split default-pkgs))) - -(define (build-path/s . a) - (path->string (path->complete-path (apply build-path dir a)))) -(define (build-path/f . a) - (string-append "file://" - (path->string (path->complete-path (apply build-path a))))) - -(define ht - (hash 'doc-dir (build-path/s "doc") - 'lib-dir (build-path/s "lib") - 'share-dir (build-path/s "share") - 'dll-dir (build-path/s "lib") - 'links-file (build-path/s "share" "links.rktd") - 'pkgs-dir (build-path/s "share" "pkgs") - 'bin-dir (build-path/s "bin") - 'include-dir (build-path/s "include") - 'catalogs (map build-path/f catalogs))) - -(make-directory* (build-path dir "etc")) - -(call-with-output-file* - (build-path dir "etc" "config.rktd") - #:exists 'truncate/replace - (lambda (o) - (write ht o) - (newline o))) - -(display-time) -(printf "Running `raco pkg install' for packages:\n") -(for ([pkg (in-list pkgs)]) - (printf " ~a\n" pkg)) -(unless (apply system* (find-exe) - "-G" "build/docs/etc" "-l-" - "raco" "pkg" "install" - "--pkgs" - "-i" "--deps" "search-auto" - pkgs) - (error "install failed")) - -(when (hash-ref config '#:pdf-doc? #f) - (display-time) - (printf "Running `raco setup' PDF documentation:\n") - (unless (system* (find-exe) - "-G" "build/docs/etc" "-l-" - "raco" "setup" "--doc-pdf" "build/pdf-doc") - (error "PDF failed"))) - -(display-time) diff --git a/pkgs/distro-build-pkgs/distro-build-server/install-pkgs.rkt b/pkgs/distro-build-pkgs/distro-build-server/install-pkgs.rkt deleted file mode 100644 index f7150e890d..0000000000 --- a/pkgs/distro-build-pkgs/distro-build-server/install-pkgs.rkt +++ /dev/null @@ -1,23 +0,0 @@ -#lang racket/base -(require racket/cmdline - racket/string - (only-in "config.rkt" extract-options)) - -(module test racket/base) - -(define-values (config-file config-mode default-pkgs flags) - (command-line - #:args - (config-file config-mode pkgs . flag) - (values config-file config-mode pkgs flag))) - -(define pkgs (or (hash-ref (extract-options config-file config-mode) - '#:pkgs - #f) - (string-split default-pkgs))) - -(parameterize ([current-command-line-arguments - (list->vector (append (list "pkg" "install") - flags - pkgs))]) - (dynamic-require 'raco #f)) diff --git a/pkgs/distro-build-pkgs/distro-build-server/manage-snapshots.rkt b/pkgs/distro-build-pkgs/distro-build-server/manage-snapshots.rkt deleted file mode 100644 index 53a857f117..0000000000 --- a/pkgs/distro-build-pkgs/distro-build-server/manage-snapshots.rkt +++ /dev/null @@ -1,139 +0,0 @@ -#lang racket/base -(require racket/cmdline - racket/file - net/url - scribble/html - "download-page.rkt" - (only-in distro-build/config extract-options)) - -(module test racket/base) - -(define build-dir (build-path "build")) -(define installers-dir (build-path "installers")) - -(define-values (config-file config-mode) - (command-line - #:args - (config-file config-mode) - (values config-file config-mode))) - -(define config (extract-options config-file config-mode)) - -(define site-dir (hash-ref config - '#:site-dest - (build-path build-dir "site"))) - -(define site-title (hash-ref config - '#:site-title - "Racket Downloads")) - -(define current-snapshot - (let-values ([(base name dir?) (split-path site-dir)]) - (path-element->string name))) - -(define snapshots-dir (build-path site-dir 'up)) - -(define link-file (build-path snapshots-dir "current")) - -(when (link-exists? link-file) - (printf "Removing old \"current\" link\n") - (flush-output) - (delete-file link-file)) - -(define (get-snapshots) - (for/list ([p (in-list (directory-list snapshots-dir))] - #:when (directory-exists? (build-path snapshots-dir p))) - (path-element->string p))) - -(define n (hash-ref config '#:max-snapshots 5)) - -(let ([snapshots (get-snapshots)]) - (when (n . < . (length snapshots)) - (define remove-snapshots (remove - current-snapshot - (list-tail (sort snapshots string>?) n))) - (for ([s (in-list remove-snapshots)]) - (printf "Removing snapshot ~a\n" s) - (flush-output) - (delete-directory/files (build-path snapshots-dir s))))) - -(printf "Loading past successes\n") -(define table-file (build-path site-dir installers-dir "table.rktd")) -(define past-successes - (let ([current-table (get-installers-table table-file)]) - (for/fold ([table (hash)]) ([s (in-list (reverse (remove current-snapshot (get-snapshots))))]) - (define past-table (get-installers-table - (build-path snapshots-dir s installers-dir "table.rktd"))) - (for/fold ([table table]) ([(k v) (in-hash past-table)]) - (if (or (hash-ref current-table k #f) - (hash-ref table k #f) - (not (file-exists? (build-path site-dir "log" k)))) - table - (hash-set table k (past-success s - (string-append s "/index.html") - v))))))) - -(define current-rx (regexp (regexp-quote (version)))) - -(printf "Creating \"current\" links\n") -(flush-output) -(make-file-or-directory-link current-snapshot link-file) -(let ([installer-dir (build-path snapshots-dir current-snapshot "installers")]) - (define (currentize f) - (regexp-replace current-rx - (path->bytes f) - "current")) - (define (make-link f to-file) - (define file-link (build-path - installer-dir - (bytes->path (currentize f)))) - (when (link-exists? file-link) - (delete-file file-link)) - (make-file-or-directory-link to-file file-link)) - ;; Link current successes: - (for ([f (in-list (directory-list installer-dir))]) - (when (regexp-match? current-rx f) - (make-link f f))) - ;; Link past successes: - (for ([v (in-hash-values past-successes)]) - (when (regexp-match? current-rx (past-success-file v)) - (make-link (string->path (past-success-file v)) - (build-path 'up 'up - (past-success-name v) installers-dir - (past-success-file v)))))) - - -(printf "Generating web page\n") -(make-download-page table-file - #:title site-title - #:plt-web-style? (hash-ref config '#:plt-web-style? #t) - #:past-successes past-successes - #:installers-url "current/installers/" - #:log-dir (build-path site-dir "log") - #:log-dir-url "current/log/" - #:docs-url (and (directory-exists? (build-path site-dir "doc")) - "current/doc/index.html") - #:pdf-docs-url (and (directory-exists? (build-path site-dir "pdf-doc")) - "current/pdf-doc/") - #:dest (build-path snapshots-dir - "index.html") - #:current-rx current-rx - #:git-clone (current-directory) - #:help-table (hash-ref config '#:site-help (hash)) - #:post-content (list - (p "Snapshot ID: " - (a href: (string-append current-snapshot - "/index.html") - current-snapshot)) - (let ([snapshots (get-snapshots)]) - (if ((length snapshots) . < . 2) - null - (div class: "detail" - "Other available snapshots:" - (for/list ([s (remove "current" - (remove current-snapshot - (sort snapshots string>?)))]) - (span class: "detail" - nbsp - (a href: (string-append s "/index.html") - s)))))))) diff --git a/pkgs/distro-build-pkgs/distro-build-server/pack-built.rkt b/pkgs/distro-build-pkgs/distro-build-server/pack-built.rkt deleted file mode 100644 index 1914ef50ba..0000000000 --- a/pkgs/distro-build-pkgs/distro-build-server/pack-built.rkt +++ /dev/null @@ -1,59 +0,0 @@ -#lang racket/base -(require pkg - pkg/lib - racket/format - net/url - racket/set - racket/file - racket/path - openssl/sha1 - racket/cmdline) - -(module test racket/base) - -(define create-mode 'built) - -(define pkg-info-file - (command-line - #:once-each - [("--mode") mode "Create package archives for " - (set! create-mode (string->symbol mode))] - #:args (pkg-info-file) - pkg-info-file)) - -(define build-dir "build") -(define dest-dir (build-path build-dir (~a create-mode))) -(define native-dir (build-path build-dir "native" "pkgs")) -(define pkg-dest-dir (path->complete-path (build-path dest-dir "pkgs"))) -(define catalog-dir (build-path dest-dir "catalog")) -(define catalog-pkg-dir (build-path catalog-dir "pkg")) -(make-directory* pkg-dest-dir) -(make-directory* catalog-pkg-dir) - -(define pkg-details (call-with-input-file* pkg-info-file read)) - -(for ([pkg (in-list (installed-pkg-names))]) - (define native-zip (build-path native-dir (path-add-suffix pkg ".zip"))) - (unless (file-exists? native-zip) - (define ht (hash-ref pkg-details pkg (hash))) - (define dest-zip (build-path pkg-dest-dir (~a pkg ".zip"))) - (pkg-create 'zip pkg - #:source 'name - #:dest pkg-dest-dir - #:mode create-mode) - (call-with-output-file* - (build-path catalog-pkg-dir pkg) - #:exists 'truncate - (lambda (o) - (write (hash 'source (path->string (find-relative-path - (simple-form-path catalog-dir) - (simple-form-path dest-zip))) - 'checksum (call-with-input-file* dest-zip sha1) - 'name pkg - 'author (hash-ref ht 'author "plt@racket-lang.org") - 'description (hash-ref ht 'author "library") - 'tags (hash-ref ht 'tags '()) - 'dependencies (hash-ref ht 'dependencies '()) - 'modules (hash-ref ht 'modules '())) - o) - (newline o))))) diff --git a/pkgs/distro-build-pkgs/distro-build-server/pack-collects.rkt b/pkgs/distro-build-pkgs/distro-build-server/pack-collects.rkt deleted file mode 100644 index a7f9ecb3ff..0000000000 --- a/pkgs/distro-build-pkgs/distro-build-server/pack-collects.rkt +++ /dev/null @@ -1,19 +0,0 @@ -#lang racket/base -(require file/tar - file/gzip - racket/file) - -(module test racket/base) - -(define origin-dir (build-path "build" "origin")) - -(make-directory* origin-dir) - -(define tgz-file - (path->complete-path (build-path origin-dir "collects.tgz"))) - -(when (file-exists? tgz-file) - (delete-file tgz-file)) - -(parameterize ([current-directory (build-path "racket")]) - (tar-gzip tgz-file "collects")) diff --git a/pkgs/distro-build-pkgs/distro-build-server/pkg-info.rkt b/pkgs/distro-build-pkgs/distro-build-server/pkg-info.rkt deleted file mode 100644 index 0ed55059b4..0000000000 --- a/pkgs/distro-build-pkgs/distro-build-server/pkg-info.rkt +++ /dev/null @@ -1,37 +0,0 @@ -#lang racket/base -(require pkg/lib - racket/cmdline - net/url) - -(define dest-file #f) - -(define catalog - (command-line - #:once-each - [("-o") file "Output file" - (set! dest-file file)] - #:args - (catalog) - catalog)) - -(define catalog-url - (if (regexp-match? #rx"^[a-z]+:" catalog) - (string->url catalog) - (path->url (path->complete-path catalog)))) - -(define details - (parameterize ([current-pkg-catalogs (list catalog-url)]) - (get-all-pkg-details-from-catalogs))) - -(define (write-out o) - (write details o) - (newline o)) - -(if dest-file - (call-with-output-file* dest-file - #:exists 'truncate/replace - write-out) - (write-out (current-output-port))) - - -(module test racket/base) diff --git a/pkgs/distro-build-pkgs/distro-build-server/readme.rkt b/pkgs/distro-build-pkgs/distro-build-server/readme.rkt deleted file mode 100644 index 3c30e9487d..0000000000 --- a/pkgs/distro-build-pkgs/distro-build-server/readme.rkt +++ /dev/null @@ -1,141 +0,0 @@ -#lang at-exp racket/base -(require racket/format - net/url - (only-in "config.rkt" current-stamp)) - -(provide make-readme - make-source-notes - make-macosx-notes) - -(define (maybe-stamp config) - (if (hash-ref config '#:release? #f) - "" - @~a{ (@(current-stamp))})) - -(define (make-readme config) - @~a{ - The Racket Programming Language - =============================== - - This is the - @|(drop-sort-annotations (hash-ref config '#:name "Racket"))| - distribution for version @(version)@(maybe-stamp config).@; - - @(if (let ([src? (hash-ref config '#:source? #f)]) - (or (hash-ref config '#:source-runtime? src?) - (hash-ref config '#:source-pkgs? src?))) - (string-append "\n" (make-source-notes config) "\n") - "")@; - @(if (and (not (hash-ref config '#:source-runtime? - (hash-ref config '#:source? #f))) - (eq? (hash-ref config '#:platform (system-type)) 'macosx)) - (string-append "\n" (make-macosx-notes config) "\n") - "")@; - @(let* ([catalogs (filter - (lambda (s) (not (equal? s ""))) - (or (hash-ref config '#:dist-catalogs #f) - (let ([v (hash-ref config '#:dist-base-url #f)]) - (and v - (list (url->string - (combine-url/relative (string->url v) "catalog/"))))) - null))] - [s (if (= 1 (length catalogs)) "" "s")] - [is (if (= 1 (length catalogs)) "is" "are")]) - (if (null? catalogs) - "" - @~a{ - - The distribution has been configured so that when you install or - update packages, the package catalog@|s| at@; - @(apply ~a (for/list ([catalog (in-list catalogs)]) - @~a{@"\n" @|catalog|})) - @|is| consulted first. - - }))@; - @(let* ([name (hash-ref config '#:install-name "")]) - (if (or (equal? name "") - (equal? name (version))) - "" - @~a{ - - The distribution has been configured so that the installation - name is - @name - Multiple installations with this name share `user'-scoped packages, - which makes it easier to upgrade from such an installation to this one. - To avoid sharing (which is better for keeping multiple installations - active) use `raco pkg config -i --set name ...' to choose a different - name for this installation. - - }))@; - - Visit http://racket-lang.org/ for more Racket resources. - - - License - ------- - - Racket - Copyright (c) 2010-2014 PLT Design Inc. - - Racket is distributed under the GNU Lesser General Public License - (LGPL). This means that you can link Racket into proprietary - applications, provided you follow the rules stated in the LGPL. You can - also modify Racket; if you distribute a modified version, you must - distribute it under the terms of the LGPL, which in particular means - that you must release the source code for the modified software. See - share/COPYING_LESSER.txt for more information.}) - -(define (drop-sort-annotations s) - ;; Any number of spaces is allowed around "{...}" and "|", - ;; so normalize that space while also removing "{...}": - (regexp-replace* #rx" *[|] *" - (regexp-replace* #rx" *{[^}]*} *" s "") - " | ")) - -(define (make-source-notes config) - (define src? (hash-ref config '#:source? #f)) - (define rt-src - @~a{This distribution provides source for the Racket run-time system; - for build and installation instructions, see "src/README".}) - (define pkg-src - @~a{(The distribution also includes the core Racket collections and any - installed packages in source form.)}) - (define pkg-built - @~a{Besides the run-time system's source, the distribution provides - pre-built versions of the core Racket bytecode, as well as pre-built - versions of included packages and documentation --- which makes it - suitable for quick installation on a Unix platform for which - executable binaries are not already provided.}) - (cond - [(and (hash-ref config '#:source-runtime? src?) - (not (hash-ref config '#:source-pkgs? src?))) - (~a rt-src "\n" pkg-built)] - [(and (hash-ref config '#:source-runtime? src?) - (hash-ref config '#:source-pkgs? src?)) - (~a rt-src "\n" pkg-src)] - [else - @~a{The distribution includes any pre-installed packages in source form.}])) - -(define (make-macosx-notes config) - (define vers-suffix - (if (hash-ref config '#:versionless? #f) - "" - @~a{ v@(version)})) - (if (hash-ref config '#:mac-pkg? #f) - @~a{The installation directory is - /Applications/@(string-append - (hash-ref config '#:dist-name "Racket") - (if (hash-ref config '#:release? #f) - "" - vers-suffix)) - The installer also adjusts "/etc/paths.d/racket" to point to that - directory's "bin" directory, which adjusts the default PATH - environment variable for all users.} - @~a{Install by dragging the enclosing - @|(hash-ref config '#:dist-name "Racket")|@|vers-suffix| - folder to your Applications folder --- or wherever you like. You can - move the folder at any time, but do not move applications or other - files within the folder. If you want to use the Racket command-line - programs, then (optionally) add the path of the "bin" subdirectory to - your PATH environment variable.})) diff --git a/pkgs/distro-build-pkgs/distro-build-server/serve-catalog.rkt b/pkgs/distro-build-pkgs/distro-build-server/serve-catalog.rkt deleted file mode 100644 index 3e36907b69..0000000000 --- a/pkgs/distro-build-pkgs/distro-build-server/serve-catalog.rkt +++ /dev/null @@ -1,181 +0,0 @@ -#lang racket/base -(require web-server/servlet-env - web-server/dispatch - web-server/http/response-structs - web-server/http/request-structs - net/url - racket/format - racket/cmdline - racket/file - racket/path - racket/string - racket/tcp - racket/port - racket/system - (only-in distro-build/config extract-options) - distro-build/readme) - -(module test racket/base) - -(define from-dir "built") - -(define-values (config-file config-mode - default-server-hosts default-server-port - during-cmd-line) - (command-line - #:once-each - [("--mode") dir "Serve package archives from subdirectory" - (set! from-dir dir)] - #:args (config-file config-mode server-hosts server-port . during-cmd) - (values config-file config-mode - server-hosts (string->number server-port) - during-cmd))) - -(define server-hosts - (hash-ref (extract-options config-file config-mode) - '#:server-hosts - (string-split default-server-hosts ","))) -(define server-port - (hash-ref (extract-options config-file config-mode) - '#:server-port - default-server-port)) - -(define build-dir (path->complete-path "build")) -(define built-dir (build-path build-dir from-dir)) -(define native-dir (build-path build-dir "native")) - -(define dirs (list built-dir native-dir)) - -(define (pkg-name->info req name) - (for/or ([d (in-list dirs)]) - (define f (build-path d "catalog" "pkg" name)) - (and (file-exists? f) - ;; Change leading "../" to "./" in source, because - ;; we've shifted "pkg" relative to the site root - ;; by skipping over "catalog" in the URL. - (let ([ht (call-with-input-file* - f - read)]) - (hash-set ht - 'source - (regexp-replace #rx"^[.][.]/" - (hash-ref ht 'source) - "./")))))) - -(define (response/sexpr v) - (response 200 #"Okay" (current-seconds) - #"text/s-expr" null - (λ (op) (write v op)))) - -(define (write-info req pkg-name) - (response/sexpr (pkg-name->info req pkg-name))) - -(define (record-installer dir filename desc) - (when desc - (define table-file (build-path dir "table.rktd")) - (call-with-file-lock/timeout - #:max-delay 2 - table-file - 'exclusive - (lambda () - (define t (hash-set - (if (file-exists? table-file) - (call-with-input-file* table-file read) - (hash)) - desc - filename)) - (call-with-output-file table-file - #:exists 'truncate/replace - (lambda (o) - (write t o) - (newline o)))) - void))) - -(define (receive-file req filename) - (unless (relative-path? filename) - (error "upload path name must be relative")) - (define dir (build-path build-dir "installers")) - (make-directory* dir) - (call-with-output-file (build-path dir filename) - #:exists 'truncate/replace - (lambda (o) - (write-bytes (request-post-data/raw req) o))) - (define desc - (for/or ([h (in-list (request-headers/raw req))]) - (and (equal? (header-field h) #"Description") - (bytes->string/utf-8 (header-value h))))) - (record-installer dir filename desc) - (response/sexpr #t)) - -(define-values (dispatch main-url) - (dispatch-rules - [("pkg" (string-arg)) write-info] - [("upload" (string-arg)) #:method "put" receive-file])) - -;; Tunnel extra hosts to first one: -(when (and (pair? server-hosts) - (pair? (cdr server-hosts))) - (for ([host (in-list (cdr server-hosts))]) - (thread - (lambda () - (define l (tcp-listen server-port 5 #t host)) - (let loop () - (define-values (i o) (tcp-accept l)) - (define-values (i2 o2) (tcp-connect (car server-hosts) server-port)) - (thread (lambda () - (copy-port i o2) - (close-input-port i) - (close-output-port o2))) - (thread (lambda () - (copy-port i2 o) - (close-input-port i2) - (close-output-port o))) - (loop)))))) - -(define (go) - (serve/servlet - dispatch - #:command-line? #t - #:listen-ip (if (null? server-hosts) - #f - (car server-hosts)) - #:extra-files-paths - (append - (list (build-path build-dir "origin")) - (list readmes-dir) - ;; for "pkgs" directories: - (for/list ([d (in-list dirs)]) - (path->complete-path d)) - ;; for ".git": - (list (current-directory))) - #:servlet-regexp #rx"" - #:port server-port)) - -(define readmes-dir (build-path build-dir "readmes")) -(make-directory* readmes-dir) - -(define readme-file (build-path readmes-dir "README.txt")) -(unless (file-exists? readme-file) - (printf "Generating default README\n") - (call-with-output-file* - readme-file - (lambda (o) - (display (make-readme (hash)) o)))) - -(if (null? during-cmd-line) - ;; Just run server: - (go) - ;; Run server in a background thread, finish by - ;; running given command: - (let ([t (thread go)]) - (sync (system-idle-evt)) ; try to wait until server is ready - (unless (apply system* - (let ([exe (car during-cmd-line)]) - (if (and (relative-path? exe) - (not (path-only exe))) - (find-executable-path exe) - exe)) - (cdr during-cmd-line)) - (error 'server-catalog - "command failed: ~s" - during-cmd-line)))) diff --git a/pkgs/distro-build-pkgs/distro-build-server/set-server-config.rkt b/pkgs/distro-build-pkgs/distro-build-server/set-server-config.rkt deleted file mode 100644 index f8558c85cd..0000000000 --- a/pkgs/distro-build-pkgs/distro-build-server/set-server-config.rkt +++ /dev/null @@ -1,33 +0,0 @@ -#lang racket/base -(require racket/cmdline - racket/file - racket/path - (only-in "config.rkt" extract-options) - "url-options.rkt" - distro-build/set-config) - -(module test racket/base) - -(define-values (dest-config-file config-file config-mode - install-name build-stamp - default-doc-search default-catalogs) - (command-line - #:args - (dest-config-file config-file config-mode - install-name build-stamp - doc-search . catalog) - (values dest-config-file config-file config-mode - install-name build-stamp - doc-search catalog))) - -(define config (if (equal? config-file "") - (hash) - (extract-options config-file config-mode))) - -(define doc-search (choose-doc-search config default-doc-search)) - -(define catalogs (choose-catalogs config default-catalogs)) - -(set-config dest-config-file - install-name build-stamp - doc-search catalogs) diff --git a/pkgs/distro-build-pkgs/distro-build-server/url-options.rkt b/pkgs/distro-build-pkgs/distro-build-server/url-options.rkt deleted file mode 100644 index 99cd1be27d..0000000000 --- a/pkgs/distro-build-pkgs/distro-build-server/url-options.rkt +++ /dev/null @@ -1,22 +0,0 @@ -#lang racket/base -(require net/url) - -(provide choose-doc-search - choose-catalogs) - -(define (choose-doc-search config default-doc-search) - (or (hash-ref config '#:doc-search #f) - (let ([v (hash-ref config '#:dist-base-url #f)]) - (and v - (url->string - (combine-url/relative (string->url v) "doc/local-redirect/index.html")))) - default-doc-search)) - -(define (choose-catalogs config default-catalogs) - (or (hash-ref config '#:dist-catalogs #f) - (let ([v (hash-ref config '#:dist-base-url #f)]) - (and v - (list (url->string - (combine-url/relative (string->url v) "catalog/")) - ""))) - default-catalogs)) diff --git a/pkgs/distro-build-pkgs/distro-build/LICENSE.txt b/pkgs/distro-build-pkgs/distro-build/LICENSE.txt deleted file mode 100644 index 2f13367cd2..0000000000 --- a/pkgs/distro-build-pkgs/distro-build/LICENSE.txt +++ /dev/null @@ -1,11 +0,0 @@ -distro-build -Copyright (c) 2010-2014 PLT Design Inc. - -This package is distributed under the GNU Lesser General Public -License (LGPL). This means that you can link this package into proprietary -applications, provided you follow the rules stated in the LGPL. You -can also modify this package; if you distribute a modified version, -you must distribute it under the terms of the LGPL, which in -particular means that you must release the source code for the -modified software. See http://www.gnu.org/copyleft/lesser.html -for more information. diff --git a/pkgs/distro-build-pkgs/distro-build/info.rkt b/pkgs/distro-build-pkgs/distro-build/info.rkt deleted file mode 100644 index b3f7a6ebb5..0000000000 --- a/pkgs/distro-build-pkgs/distro-build/info.rkt +++ /dev/null @@ -1,10 +0,0 @@ -#lang info - -(define collection 'multi) - -(define deps '("distro-build-lib")) -(define implies '("distro-build-lib")) - -(define pkg-desc "Tools for constructing a distribution of Racket") - -(define pkg-authors '(mflatt)) diff --git a/pkgs/plt-services/info.rkt b/pkgs/plt-services/info.rkt index 070c17abd4..8e94505bbe 100644 --- a/pkgs/plt-services/info.rkt +++ b/pkgs/plt-services/info.rkt @@ -10,10 +10,8 @@ ;; "Fake" dependencies to make them included ;; in a default build: "main-distribution-test" - "distro-build" "honu" "gui-pkg-manager" - "remote-shell" ;; Actual dependencies: "eli-tester" @@ -28,8 +26,7 @@ "compatibility-lib" "plt-web" "web-server-lib" - "rackunit-lib" - "remote-shell-lib")) + "rackunit-lib")) (define pkg-desc "Miscellaneous management and maintenance tools used by the Racket development team") diff --git a/pkgs/plt-services/meta/info.rkt b/pkgs/plt-services/meta/info.rkt index 8f629f385c..181042426d 100644 --- a/pkgs/plt-services/meta/info.rkt +++ b/pkgs/plt-services/meta/info.rkt @@ -1,12 +1,13 @@ #lang info (define name "Infrastructure code") -(define compile-omit-paths '("images/taking-screenshots/racket-widget.scm")) +(define compile-omit-paths '("images/taking-screenshots/racket-widget.scm" + "tests/unix-installer.rkt")) (define test-omit-paths '("images/mkheart.rkt" "pkg-index/official" "pkg-index/planet-compat" - "pkg-push")) + "tests/unix-installer.rkt")) (define test-responsibles '(("props" (eli jay)) diff --git a/pkgs/plt-services/meta/props b/pkgs/plt-services/meta/props index 19dfae8f3c..854d5da886 100755 --- a/pkgs/plt-services/meta/props +++ b/pkgs/plt-services/meta/props @@ -691,7 +691,6 @@ path/s is either such a string or a list of them. "pkgs/deinprogramm/deinprogramm/quickcheck/quickcheck.scm" drdr:command-line #f "pkgs/deinprogramm/deinprogramm/quickcheck/random.scm" drdr:command-line #f "pkgs/distributed-places-pkgs" responsible (mflatt) -"pkgs/distro-build-pkgs" responsible (mflatt) "pkgs/draw-pkgs" responsible (mflatt) "pkgs/drracket-pkgs" responsible (robby) "pkgs/drracket-pkgs/drracket/gui-debugger" responsible (gmarceau mflatt) @@ -1132,7 +1131,6 @@ path/s is either such a string or a list of them. "pkgs/redex-pkgs/redex-examples/redex/examples/racket-machine/randomized-tests.rkt" drdr:timeout 300 "pkgs/redex-pkgs/redex-test/redex/tests/run-tests.rkt" drdr:timeout 360 "pkgs/redex-pkgs/redex-test/redex/tests/ryr-test.rkt" drdr:timeout 200 drdr:random #t -"pkgs/remote-shell-pkgs" responsible (mflatt) "pkgs/sandbox-lib" responsible (eli) "pkgs/scheme-lib" responsible (mflatt) "pkgs/scheme-lib/scheme/match.rkt" responsible (samth) diff --git a/pkgs/remote-shell-pkgs/remote-shell-doc/LICENSE.txt b/pkgs/remote-shell-pkgs/remote-shell-doc/LICENSE.txt deleted file mode 100644 index a53fa9c37e..0000000000 --- a/pkgs/remote-shell-pkgs/remote-shell-doc/LICENSE.txt +++ /dev/null @@ -1,11 +0,0 @@ -remote-shell-doc -Copyright (c) 2010-2014 PLT Design Inc. - -This package is distributed under the GNU Lesser General Public -License (LGPL). This means that you can link this package into proprietary -applications, provided you follow the rules stated in the LGPL. You -can also modify this package; if you distribute a modified version, -you must distribute it under the terms of the LGPL, which in -particular means that you must release the source code for the -modified software. See http://www.gnu.org/copyleft/lesser.html -for more information. diff --git a/pkgs/remote-shell-pkgs/remote-shell-doc/info.rkt b/pkgs/remote-shell-pkgs/remote-shell-doc/info.rkt deleted file mode 100644 index fe6f3f137c..0000000000 --- a/pkgs/remote-shell-pkgs/remote-shell-doc/info.rkt +++ /dev/null @@ -1,16 +0,0 @@ -#lang info - -(define collection "remote-shell") - -(define deps '("base")) -(define build-deps '("racket-doc" - "remote-shell-lib" - "scribble-lib")) -(define update-implies '("remote-shell-lib")) - -(define pkg-desc "documentation part of \"remote-shell\"") - -(define pkg-authors '(mflatt)) - - -(define scribblings '(("remote-shell.scrbl" (multi-page)))) diff --git a/pkgs/remote-shell-pkgs/remote-shell-doc/remote-shell.scrbl b/pkgs/remote-shell-pkgs/remote-shell-doc/remote-shell.scrbl deleted file mode 100644 index 896eb668bc..0000000000 --- a/pkgs/remote-shell-pkgs/remote-shell-doc/remote-shell.scrbl +++ /dev/null @@ -1,196 +0,0 @@ -#lang scribble/manual -@(require (for-label racket/base - racket/contract - remote-shell/ssh - remote-shell/vbox)) - -@title{Remote Shells and Virtual Machines} - -The @filepath{remote-shell} collection provides tools for running -shell commands on a remote or virtual machine, including tools for -starting, stopping, and managing VirtualBox virtual-machine instances. - -@table-of-contents[] - -@; ---------------------------------------- - -@section{Remote Shells} - -@defmodule[remote-shell/ssh] - -@defproc[(remote? [v any/c]) boolean?]{ - -Returns @racket[#t] if @racket[v] is a remote-host representation -produced by @racket[remote], @racket[#f] otherwise.} - -@defproc[(remote [#:host host string?] - [#:user user string? ""] - [#:env env (listof (cons/c string? string?)) '()] - [#:remote-tunnels remote-tunnels (listof (cons/c (integer-in 1 65535) - (integer-in 1 65535))) - null] - [#:key key (or/c #f path-string?) #f] - [#:timeout timeout-secs real? 600]) - remote?]{ - -Creates a representation of a remote host. The @racket[host] argument -specifies the host for an @exec{ssh} connection. If @racket[user] is -empty, then the current user name is used for the remote host. - -The @racket[env] argument specifies environment variables to set -before running any command on the remote host. - -The @racket[remote-tunnels] argument specifies ports to tunnel from -the remote host back to the local host. The first port number in each -pair is the port number on the remote host, and the second port number -is the port that it tunnels to on the local host. - -If @racket[key] is not @racket[#f], then it is used as the path to an identity -file used for public-key authentication. - -The @racket[timeout] argument specifies a timeout after which a remote -command will be considered failed.} - - -@defproc[(ssh [remote remote?] - [command (or/c string? path-string?)] - [#:mode mode (or/c 'error 'result 'output) 'error] - [#:failure-log failure-dest (or/c #f path-string?) #f] - [#:success-log success-dest (or/c #f path-string?) #f] - [#:show-time? show-time? any/c #f]) - (or/c void? boolean? (cons/c boolean? bytes?))]{ - -Runs a shell command at @racket[remote], were the @racket[command]s -are concatenated (with no additional spaces) to specify the remote -shell command. The remote command is implemented with @exec{ssh} as -found by @racket[find-system-path]. - -If @racket[mode] is @racket['error], then the result is -@racket[(void)] or an exception is raised if the remote command fails -with an connection error, an error exit code, or by timing out. If -@racket[mode] is @racket['result], then the result is @racket[#t] for -success or @racket[#f] for failure. If @racket[mode] is -@racket['cons], then the result is a pair containing whether the -command succeeded and a byte string for the command's output -(including error output). - -If @racket[failure-dest] is not @racket[#f], then if the command -fails, the remote output (including error output) is recorded to the -specified file. If @racket[success-dest] is not @racket[#f], then if -the command fails, the remote output (including error output) is -recorded to the specified file.} - -@defproc[(scp [remote remote?] - [source path-string?] - [dest path-string?] - [#:mode mode (or/c 'error 'result 'output) 'error]) - (or/c void? boolean?)]{ - -Copies a file to/from a remote host. Use @racket[at-remote] to form -either the @racket[source] or @racket[dest] argument. The remote -command is implemented with @exec{scp} as found by -@racket[find-system-path]. - -If @racket[mode] is @racket['error], then the result is -@racket[(void)] or an exception is raised if the remote command -fails. If @racket[mode] is @racket['result], then the result is -@racket[#t] for success or @racket[#f] for failure.} - - -@defproc[(at-remote [remote remote?] - [path path-string?]) - string?]{ - -Combines @racket[remote] and @racket[path] to form an argument for -@racket[scp] to specify a path at the remote host.} - - -@defproc[(make-sure-remote-is-ready [remote remote?] - [#:tries tries exact-nonnegative-integer? 3]) - void?]{ - -Runs a simple command at @racket[remote] to check that it receives -connections, trying up to @racket[tries] times.} - - -@; ---------------------------------------- - -@section{Managing VirtualBox Machines} - -@defmodule[remote-shell/vbox] - -@defproc[(start-vbox-vm [name string?] - [#:max-vms max-vms real? 1] - [#:log-status log-status (string? #:rest any/c . -> . any) printf] - [#:pause-seconds pause-seconds real? 3] - [#:dry-run? dry-run? any/c #f]) - void?]{ - -Starts a VirtualBox virtual machine @racket[name] that is in a saved, -powered off, or running state (where a running machine continues to -run). - -The start will fail if @racket[max-vms] virtual machines are already -currently running. This limit is a precaution against starting too -many virtual-machine instances, which can overwhelm the host operating -system. - -The @racket[log-status] argument is used to report actions and status -information. - -After the machine is started, @racket[start-vbox-vm] pauses for the -amount of time specified by @racket[pause-seconds], which gives the -virtual machine time to find its bearings. - -If @racket[dry-run] is @racket[#t], then the machine is not actually -started, but status information is written using @racket[log-status] -to report the action that would have been taken.} - - -@defproc[(stop-vbox-vm [name string?] - [#:save-state? save-state? any/c #t] - [#:log-status log-status (string? #:rest any/c . -> . any) printf] - [#:dry-run? dry-run? any/c #f]) - void?]{ - -Stops a VirtualBox virtual machine @racket[name] that is in a running -state. If @racket[save-state?] is true, then the machine is put into -saved state, otherwise the current machine state is discarded and the -machine is powered off. - -The @racket[log-status] argument is used to report actions and status -information. - -If @racket[dry-run] is @racket[#t], then the machine is not actually -started, but status information is written using @racket[log-status] -to report the action that would have been taken.} - - -@defproc[(take-vbox-snapshot [name string?] - [snapshot-name string?]) - void?]{ - -Takes a snapshot of a virtual machine (which may be running), creating -the snapshot named @racket[snapshot-name].} - - -@defproc[(restore-vbox-snapshot [name string?] - [snapshot-name string?]) - void?]{ - -Changes the current state of a virtual machine to be the one recorded -as @racket[snapshot-name]. The virtual machine must not be running.} - -@defproc[(delete-vbox-snapshot [name string?] - [snapshot-name string?]) - void?]{ - -Deletes @racket[snapshot-name] for the virtual machine @racket[name].} - - -@defproc[(exists-vbox-snapshot? [name string?] - [snapshot-name string?]) - boolean?]{ - -Reports whether @racket[snapshot-name] exists for the virtual machine -@racket[name].} diff --git a/pkgs/remote-shell-pkgs/remote-shell-lib/LICENSE.txt b/pkgs/remote-shell-pkgs/remote-shell-lib/LICENSE.txt deleted file mode 100644 index e7ef6b1756..0000000000 --- a/pkgs/remote-shell-pkgs/remote-shell-lib/LICENSE.txt +++ /dev/null @@ -1,11 +0,0 @@ -remote-shell-lib -Copyright (c) 2010-2014 PLT Design Inc. - -This package is distributed under the GNU Lesser General Public -License (LGPL). This means that you can link this package into proprietary -applications, provided you follow the rules stated in the LGPL. You -can also modify this package; if you distribute a modified version, -you must distribute it under the terms of the LGPL, which in -particular means that you must release the source code for the -modified software. See http://www.gnu.org/copyleft/lesser.html -for more information. diff --git a/pkgs/remote-shell-pkgs/remote-shell-lib/info.rkt b/pkgs/remote-shell-pkgs/remote-shell-lib/info.rkt deleted file mode 100644 index a94070f4ff..0000000000 --- a/pkgs/remote-shell-pkgs/remote-shell-lib/info.rkt +++ /dev/null @@ -1,10 +0,0 @@ -#lang info - -(define collection "remote-shell") - -(define deps '("base")) -(define build-deps '()) - -(define pkg-desc "implementation (no documentation) part of \"remote-shell\"") - -(define pkg-authors '(mflatt)) diff --git a/pkgs/remote-shell-pkgs/remote-shell-lib/ssh.rkt b/pkgs/remote-shell-pkgs/remote-shell-lib/ssh.rkt deleted file mode 100644 index b6e832ca3a..0000000000 --- a/pkgs/remote-shell-pkgs/remote-shell-lib/ssh.rkt +++ /dev/null @@ -1,177 +0,0 @@ -#lang racket/base -(require racket/system - racket/format - racket/port - racket/date - racket/contract) - -(provide remote? - (contract-out - (rename create-remote remote - ((#:host string?) - (#:user string? - #:key (or/c #f path-string?) - #:env (listof (cons/c string? string?)) - #:timeout real? - #:remote-tunnels (listof (cons/c (integer-in 1 65535) - (integer-in 1 65535)))) - . ->* . remote?)) - [ssh ((remote?) - (#:mode (or/c 'error 'result 'output) - #:failure-log (or/c #f path-string?) - #:success-log (or/c #f path-string?) - #:show-time? any/c) - #:rest (listof (or/c string? path-string?)) - . ->* . any)] - [scp ((remote? path-string? path-string?) - (#:mode (or/c 'error 'result)) - . ->* . - void?)] - [make-sure-remote-is-ready ((remote?) - (#:tries exact-nonnegative-integer?) - . ->* . - void?)] - [at-remote (remote? path-string? . -> . string?)])) - -(struct remote (host user timeout remote-tunnels env key) - #:constructor-name make-remote) - -(define create-remote - (let () - (define (remote #:host host - #:user [user ""] - #:key [key #f] - #:timeout [timeout 600] - #:remote-tunnels [remote-tunnels null] - #:env [env null]) - (make-remote host user timeout remote-tunnels env key)) - remote)) - -(define scp-exe (find-executable-path "scp")) -(define ssh-exe (find-executable-path "ssh")) - -(define (remote-user+host remote) - (if (not (equal? (remote-user remote) "")) - (~a (remote-user remote) "@" (remote-host remote)) - (remote-host remote))) - -(define (at-remote remote path) - (~a (remote-user+host remote) ":" path)) - -(define (system*/show exe . args) - (displayln (apply ~a #:separator " " - (map (lambda (p) (if (path? p) (path->string p) p)) - (cons exe args)))) - (flush-output) - (apply system* exe args)) - -(define (ssh remote - #:mode [mode 'error] - #:failure-log [failure-dest #f] - #:success-log [success-dest #f] - #:show-time? [show-time? #f] - . args) - (define cmd - (append - (list "/usr/bin/env") - (for/list ([e (in-list (remote-env remote))]) - (~a (car e) "=" (cdr e))) - (list - "/bin/sh" "-c" (apply ~a args)))) - - (define saved (and (or failure-dest success-dest) - (open-output-bytes))) - (define (tee o1 o2) - (cond - [(not o1) - (values o2 void)] - [else - (define-values (i o) (make-pipe 4096)) - (values o - (let ([t (thread (lambda () - (copy-port i o1 o2)))]) - (lambda () - (close-output-port o) - (sync t))))])) - (define-values (stdout sync-out) (tee saved (current-output-port))) - (define-values (stderr sync-err) (tee saved (current-error-port))) - - (define timeout? #f) - (define orig-thread (current-thread)) - (define timeout (remote-timeout remote)) - (define key (remote-key remote)) - (define timeout-thread - (thread (lambda () - (sleep timeout) - (set! timeout? #t) - (break-thread orig-thread)))) - - (define (show-time) - (when show-time? - (printf "The time is now ~a\n" - (date->string (seconds->date (current-seconds)) #t)))) - - (define ok? - (parameterize ([current-output-port stdout] - [current-error-port stderr]) - (with-handlers ([exn? (lambda (exn) - (cond - [timeout? - (eprintf "~a\n" (exn-message exn)) - (eprintf "Timeout after ~a seconds\n" timeout) - #f] - [else (raise exn)]))]) - (show-time) - (begin0 - (if (and (equal? (remote-host remote) "localhost") - (equal? (remote-user remote) "")) - (apply system*/show cmd) - (apply system*/show ssh-exe - (append - ;; create tunnels to connect back to server: - (apply - append - (for/list ([tunnel (in-list (remote-remote-tunnels remote))]) - (list "-R" (~a (car tunnel) ":localhost:" (cdr tunnel))))) - (list (remote-user+host remote)) - (if key (list "-i" key) null) - ;; ssh needs an extra level of quoting - ;; relative to sh: - (for/list ([arg (in-list cmd)]) - (~a "'" - (regexp-replace* #rx"'" arg "'\"'\"'") - "'"))))) - (kill-thread timeout-thread) - (show-time))))) - (sync-out) - (sync-err) - (let ([dest (if ok? success-dest failure-dest)]) - (when dest - (call-with-output-file* - dest - #:exists 'truncate/replace - (lambda (o) (write-bytes (get-output-bytes saved) o))))) - (case mode - [(result) ok?] - [(output) (cons ok? (get-output-bytes saved))] - [else - (unless ok? - (error 'ssh "failed"))])) - -(define (scp remote src dest #:mode [mode 'error]) - (define key (remote-key remote)) - (define ok? (apply system*/show scp-exe (append (if key (list "-i" key) null) (list src dest)))) - (case mode - [(result) ok?] - [else - (unless ok? - (error 'scp "failed"))])) - -(define (make-sure-remote-is-ready remote - #:tries [tries 3]) - (let loop ([tries tries]) - (unless (ssh remote - "echo hello" - #:mode (if (zero? tries) 'error 'result)) - (sleep 1) - (loop (sub1 tries))))) diff --git a/pkgs/remote-shell-pkgs/remote-shell-lib/vbox.rkt b/pkgs/remote-shell-pkgs/remote-shell-lib/vbox.rkt deleted file mode 100644 index 277d52a16e..0000000000 --- a/pkgs/remote-shell-pkgs/remote-shell-lib/vbox.rkt +++ /dev/null @@ -1,138 +0,0 @@ -#lang racket/base -(require racket/system - racket/string - racket/contract) - -(provide - (contract-out - [start-vbox-vm - ((string?) - (#:max-vms real? - #:dry-run? any/c - #:log-status (string? #:rest any/c . -> . any) - #:pause-seconds real?) - . ->* . - void?)] - [stop-vbox-vm - ((string?) - (#:save-state? any/c - #:dry-run? any/c - #:log-status (string? #:rest any/c . -> . any)) - . ->* . - void?)] - [take-vbox-snapshot (string? string? . -> . void?)] - [restore-vbox-snapshot (string? string? . -> . void?)] - [delete-vbox-snapshot (string? string? . -> . void?)] - [exists-vbox-snapshot? (string? string? . -> . boolean?)])) - -(define VBoxManage (find-executable-path "VBoxManage")) -(define use-headless? #t) - -(define (system*/string . args) - (define s (open-output-string)) - (and - (parameterize ([current-output-port s]) - (apply system* args)) - (get-output-string s))) - -(define (vbox-state vbox) - (define s (or (system*/string VBoxManage "showvminfo" vbox) "")) - (define m (regexp-match #rx"(?m:^State:[ ]*([a-z]+(?: [a-z]+)*))" s)) - (define state (and m (string->symbol (cadr m)))) - (case state - [(|powered off| aborted) 'off] - [(running saved paused) state] - [(restoring) (vbox-state vbox)] - [else - (eprintf "~a\n" s) - (error 'vbox-state "could not get virtual machine status: ~s" vbox)])) - -(define (vbox-control vbox what) - (system* VBoxManage "controlvm" vbox what)) - -(define (vbox-start vbox) - (apply system* VBoxManage "startvm" vbox - (if use-headless? - '("--type" "headless") - null)) - ;; wait for the machine to get going: - (let loop ([n 0]) - (unless (eq? 'running (vbox-state vbox)) - (unless (= n 20) - (sleep 0.5) - (loop (add1 n)))))) - -(define call-with-vbox-lock - (let ([s (make-semaphore 1)] - [lock-cust (current-custodian)]) - (lambda (thunk) - (define t (current-thread)) - (define ready (make-semaphore)) - (define done (make-semaphore)) - (parameterize ([current-custodian lock-cust]) - (thread (lambda () - (semaphore-wait s) - (semaphore-post ready) - (sync t done) - (semaphore-post s)))) - (sync ready) - (thunk) - (semaphore-post done)))) - -(define (printf/flush fmt . args) - (apply printf fmt args) - (flush-output)) - -(define (start-vbox-vm vbox - #:max-vms [max-vm 1] - #:dry-run? [dry-run? #f] - #:log-status [log-status printf/flush] - #:pause-seconds [pause-seconds 3]) - (define (check-count) - (define s (system*/string VBoxManage "list" "runningvms")) - (unless ((length (string-split s "\n")) . < . max-vm) - (error 'start-vbox "too many virtual machines running (>= ~a) to start: ~s" - max-vm - vbox))) - (log-status "Starting VirtualBox machine ~s\n" vbox) - (unless dry-run? - (case (vbox-state vbox) - [(running) (void)] - [(paused) (vbox-control vbox "resume")] - [(off saved) (call-with-vbox-lock - (lambda () - (check-count) - (vbox-start vbox)))]) - (unless (eq? (vbox-state vbox) 'running) - (error 'start-vbox-vm "could not get virtual machine started: ~s" vbox)) - ;; pause a little to let the VM get networking ready, etc. - (sleep pause-seconds))) - -(define (stop-vbox-vm vbox - #:save-state? [save-state? #t] - #:dry-run? [dry-run? #f] - #:log-status [log-status printf/flush]) - (log-status "Stopping VirtualBox machine ~s\n" vbox) - (unless dry-run? - (vbox-control vbox (if save-state? "savestate" "poweroff")) - (unless (memq (vbox-state vbox) '(saved off)) - (error 'stop-vbox-vm "virtual machine isn't in the expected state: ~s" vbox)))) - -(define (take-vbox-snapshot vbox name) - (unless (system* VBoxManage "snapshot" vbox "take" name) - (error 'take-vbox-snapshot "failed"))) - -(define (restore-vbox-snapshot vbox name) - (unless (system* VBoxManage "snapshot" vbox "restore" name) - (error 'restore-vbox-snapshot "failed"))) - -(define (delete-vbox-snapshot vbox name) - (unless (system* VBoxManage "snapshot" vbox "delete" name) - (error 'delete-vbox-snapshot "failed"))) - -(define (exists-vbox-snapshot? vbox name) - (define s (system*/string VBoxManage "snapshot" vbox "list" "--machinereadable")) - (unless s - (error 'exists-vbox-snapshot? "failed")) - (regexp-match? (regexp (format "SnapshotName[-0-9]*=\"~a" (regexp-quote name))) - s)) diff --git a/pkgs/remote-shell-pkgs/remote-shell/LICENSE.txt b/pkgs/remote-shell-pkgs/remote-shell/LICENSE.txt deleted file mode 100644 index abd704261b..0000000000 --- a/pkgs/remote-shell-pkgs/remote-shell/LICENSE.txt +++ /dev/null @@ -1,11 +0,0 @@ -remote-shell -Copyright (c) 2010-2014 PLT Design Inc. - -This package is distributed under the GNU Lesser General Public -License (LGPL). This means that you can link this package into proprietary -applications, provided you follow the rules stated in the LGPL. You -can also modify this package; if you distribute a modified version, -you must distribute it under the terms of the LGPL, which in -particular means that you must release the source code for the -modified software. See http://www.gnu.org/copyleft/lesser.html -for more information. diff --git a/pkgs/remote-shell-pkgs/remote-shell/info.rkt b/pkgs/remote-shell-pkgs/remote-shell/info.rkt deleted file mode 100644 index 3b074c5add..0000000000 --- a/pkgs/remote-shell-pkgs/remote-shell/info.rkt +++ /dev/null @@ -1,10 +0,0 @@ -#lang info - -(define collection 'multi) - -(define deps '("remote-shell-lib" "remote-shell-doc")) -(define implies '("remote-shell-lib" "remote-shell-doc")) - -(define pkg-desc "Tools for running on remote and virtual-machine hosts") - -(define pkg-authors '(mflatt))