[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

world management and patches



    Date: Thu, 28 Jul 88 20:00 EDT
    From: cjl@WHEATIES.AI.MIT.EDU (Chris Lindblad)

	Date: Thu, 23 Jun 88 10:36 EDT
	From: SWM@SAPSUCKER.SCRC.Symbolics.COM (Scott McKay)

	    Date: Wed, 22 Jun 88 13:23 CDT
	    From: Gumby@MCC.COM (David Vinayak Wallace)

	    But they don't give you any tool for 1creating0 ECOs, so you can't use it
	    to distribute patches to your own systems.

	m-X Start/Add/Finish Patch is how we create ECOs, except that we
	include, by hand, a form at the top of the patch file, 2sct:define-eco0.
	The sole purpose of that form is to make the herald and :Show ECOs print
	something that indicates that there are ECO patches.

    Unless I missed something, this still is not enough to make mail message ECOs
    that can be decoded with the ZMAIL command "Decode ECO".  How do you make a
    mail message ECO from a distribution tape ECO?

    It would also be nice if the file sys:zmail;eco-commands.lisp were on the next
    eco tape.

We didn't include the encoding stuff because it was not adequately
tested.  In fact, I know of several bugs.  Including it in 7.2 would
have constituted a promise to support it, which promise we are not ready
to make.

The ECO tape included the entire source of SYS:IO1;ENCODE-BINARY-FILES,
even if the patches did not.  The following is the entire source of
SYS:ZMAIL;ECO-COMMANDS.

Please, do not expect to have bugs fixed in this.  The 1only0 thing you
can count on working is encoding and decoding a distribution "tape"
which has been made using the :Use Disk keyword to :Distribute Systems.

----------------
;;; -*- Mode: LISP; Syntax: Common-Lisp; Base: 10; Package: ZWEI; Lowercase: Yes -*-

;;;>
;;;> *****************************************************************************************
;;;> ** (c) Copyright 1988, 1987, 1986 Symbolics, Inc.  All rights reserved.
;;;> ** Portions of font library Copyright (c) 1984 Bitstream, Inc.  All Rights Reserved.
;;;>
;;;>    The software, data, and information contained herein are proprietary 
;;;> to, and comprise valuable trade secrets of, Symbolics, Inc., which intends 
;;;> to keep such software, data, and information confidential and to preserve 
;;;> them as trade secrets.  They are given in confidence by Symbolics pursuant 
;;;> to a written license agreement, and may be used, copied, transmitted, and 
;;;> stored only in accordance with the terms of such license.
;;;> 
;;;> Symbolics, Symbolics 3600, Symbolics 3670 (R), Symbolics 3675 (R), Symbolics 3630,
;;;> Symbolics 3640, Symbolics 3645 (R), Symbolics 3650 (R), Symbolics 3620 (R), Symbolics 
;;;> 3610 (R), Symbolics Common Lisp (R), Symbolics-Lisp (R), Zetalisp (R), Genera (R),
;;;> Wheels, Dynamic Windows (R), Showcase, SmartStore, Semanticue, Frame-Up, Firewall (R),
;;;> MACSYMA (R), COMMON LISP MACSYMA, CL-MACSYMA (R), LISP MACHINE MACSYMA (R), MACSYMA 
;;;> Newsletter (R), Document Examiner (R), S-DYNAMICS (R), S-GEOMETRY (R), S-PAINT (R),
;;;> S-RENDER (R), "Your Next Step in Computing" (R), Ivory, Symbolics C, Symbolics Pascal,
;;;> and Symbolics Fortran are trademarks of Symbolics, Inc.
;;;> 
;;;> RESTRICTED RIGHTS LEGEND
;;;>    Use, duplication, and disclosure by the Government are subject to restrictions 
;;;> as set forth in subdivision (c)(1)(ii) of the Rights in Trademark Data and Computer 
;;;> Software Clause at FAR 52.227-7013.
;;;> 
;;;>      Symbolics, Inc.
;;;>      11 Cambridge Center
;;;>      Cambridge, Massachusetts  02142
;;;>      United States of America
;;;>      617-621-7500
;;;> *****************************************************************************************
;;;>

(define-zmail-top-level-command com-zmail-make-encoded-ECO-file
    "Encode a file (presumably a quasi-distribution-tape) and put the result in another file."
    (no-msg-ok)
  (let* ((input (accept-defaulted-pathname "Encode file for ECO" (default-pathname)))
	 (output (accept-defaulted-pathname
		   "Pathname of result" (send input :new-type :encode) :direction :write)))
    (with-open-file (i input
		       :direction :input
		       :characters :default)
      (with-open-file (o output
			 :direction :output)
	(cli::encode-data-as-ascii i o))))
  dis-none)

(defvar *mail-ECO-encoded-file* nil)

(define-zmail-top-level-command com-zmail-mail-eco
    "Encode a file, if necessary, and put encoded ASCII into a message draft."
    (no-msg-ok)
  (let ((eco-file (accept-defaulted-pathname "Get ECO material from file" (default-pathname))))
    (with-open-file (i eco-file
		     :direction :input
		     :characters :default)
      (condition-case ()
	   (cli::read-encoded-file-preamble i)
	 (error
	   (beep)
	   (format t "The file ~A has not been encoded~@
                ~2T for mail ECO transmission.  Please name a file for the encoded result."
	     eco-file)
	   (let ((output (accept-defaulted-pathname
			   "Pathname for encoded output" (send eco-file :new-type :encode)
			   :direction :write)))
	     (with-open-file (i eco-file
			      :direction :input
			      :characters :default)
	       (with-open-file (o output
				:direction :output)
		 (cli::encode-data-as-ascii i o)))
	     (setq eco-file output)))))
    (let ((*mail-eco-encoded-file* eco-file))
      (compose-from-template 'mail-eco-mail-template))))

(defvar *ECO-greeting* "        *** Software ECO Distribution ***
     by electronic mail, from Symbolics, Inc.

>> To restore this distribution, please use the Zmail command

        m-X Decode ECO

   It will save the decoded distribution in the file named in the 
   encoded body.  It will also offer to do Restore Distribution from
   this file. 
")

(defvar *ECO-delimiter*
	"  -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
")

;; Mostly copied from Compatible Mail Template
(deftemplate mail-eco-mail-template
  (:type :compatible-mail)
  (:name "ECO mail")
  (:documentation "Mail an ECO with compatible special variable user options.")
  (:read-only)
  (:header-field :to (prompt-for-addresses "To:"))
  (:header-field :subject "Software ECO Distribution")
  (:text (string-append *eco-greeting* *eco-delimiter*
			(with-output-to-string (s)
			  (with-open-file (i *mail-eco-encoded-file*
					     :direction :input :characters :default)
			    (si:stream-copy-until-eof i s)))
			*eco-delimiter*))			  
  (:starting-point :reply)) 

(define-zmail-top-level-command com-zmail-decode-eco
    "Decode a message as a Software ECO Distribution, into the file named in the encoded body.
Offer to do Restore Distribution on this file."
    ()
  (flet ((bad-eco-barf (&optional error)
	   (barf "This message does not appear to be a valid Software ECO Distribution~@[:~@
                  ~2T~~A~~]." error)))
    (let ((encoded-start-bp (search (msg-start-bp *msg*) *eco-delimiter*))
	  (pathname nil)
	  (restore-dist nil))
      (unless encoded-start-bp
	(bad-eco-barf))
      (let ((encoded-end-bp (search encoded-start-bp *eco-delimiter*)))
	(unless encoded-end-bp
	  (bad-eco-barf "Could not find a pair of encoded-ECO delimiters"))
	(setq encoded-end-bp (search encoded-end-bp *eco-delimiter* t))	;back over it
	(condition-case (error)
	     (progn
	       (setq pathname (with-interval-stream (s encoded-start-bp encoded-end-bp t)
				(cli::read-encoded-file-preamble s)))
	       (format query-io "~&The decoded ECO will be stored in ~A." pathname)
	       (setq restore-dist
		     (yes-or-no-p "Should I do a :Restore Distribution from that file, too? "))
	       (setq pathname
		     (with-interval-stream (s encoded-start-bp encoded-end-bp t)
		       (cli::decode-data-from-ascii s))))
	   (cli::ascii-decoding-data-error (bad-eco-barf error)))
	(format t "~&Decoded ECO stored in ~A." pathname)
	(if restore-dist
	    (progn (format t "~&Restoring distribution from ~A." pathname)
		   ;;--- This awful kludge [let - flet - letf] is made necessary by
		   ;;--- insufficient smarts in the released version of
		   ;;--- dis:open-input-distribution-tape-access-path.  Be sure to change
		   ;;--- it to do this dwimification in the next release. -- Dodds 5/02/88
		   (let ((old-open-input-distribution-tape-access-path
			   #'dis:open-input-distribution-tape-access-path))
		     (flet ((new-open-input-distribution-tape-access-path (&optional
									    use-disk path)
			      (when (and (null path) (typep use-disk 'fs:pathname))
				(setq path use-disk
				      use-disk t))
			      (funcall old-open-input-distribution-tape-access-path
				       use-disk path)))
		       (letf ((#'dis:open-input-distribution-tape-access-path
			       #'new-open-input-distribution-tape-access-path))
			 (dis:restore-distribution-from-tape :use-disk pathname))))
		   (format t "~&Distribution restored.  Do :Load Patches to ~
                              install the ECO in the running world."))
	  (format t "~&Don't forget to :Restore Distribution :Use Disk Yes,~@
                     ~2Tusing the file ~A,~@
                     ~2Tthen :Load Patches to install the ECO in the running world."
	    pathname)))))
  dis-none)