Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 13 Feb 1998 17:23:10 -0800 (PST)
From:      Simon Shapiro <shimon@simon-shapiro.org>
To:        Mike Smith <mike@smith.net.au>
Cc:        install@FreeBSD.ORG
Subject:   RE: New package scheme, early draft
Message-ID:  <XFMail.980213172310.shimon@simon-shapiro.org>
In-Reply-To: <199802132354.PAA05277@dingo.cdrom.com>

next in thread | previous in thread | raw e-mail | index | archive | help
Perfect!  On most of my systems the staging space is not a problem, but I
can see how that can be important.

An idea for a package is to use ar(1) for the pacage.  It is a well
understood, inhenerntly Unix facility.  A bit unusual, but why not?

On 13-Feb-98 Mike Smith wrote:
> 
> Apolgies for omitting this from the previous message.
> 
> New Software Packaging Tools for FreeBSD
> ======================================================================
> (c) Michael Smith and contributors 1997, 1998
> 
> 
> What's wrong with the current tools?
> ------------------------------------
> 
>  - The current packaging tools have no sense of continuity, ie. 
>     - there is no understanding that foo-1.2 is an upgrade to foo-1.1
>     - installing foo-1.2 over the top of foo-1.1 does not transfer
>       dependancies from the old version.
> 
>  - It is not possible to apply updates to a package; packages can only
>    be installed wholesale.
> 
>  - The use of tar/gzip requires an expensive unpacking stage.
> 
>  - There is no mechanism for reverting to a previous version of a
>    package.
> 
>  - The information kept about files installed from a package is
>    not enough to verify the state of a package.
> 
>  - A file or directory cannot belong to more than one package.
> 
>  - Various combinations of the above make it impossible to use the
>    package tools for distributing components of the base system.
> 
> What will the new tools do?
> ---------------------------
> 
>  - Continuity will be maintained across versions of a package:
>     - it will only be possible to have one version of a package
>       installed at a given time.
>     - upgrading/downgrading a package will transfer dependancies.
> 
>  - Packages will be identified using an extended naming scheme that
>    allows updates to be applied to a package.
> 
>  - Packages will use the Zip format, allowing direct installation from
>    the package file rather than using a staging area.
> 
>  - A comprehensive database will be kept regarding the files belonging
>    to package(s), including all pertinent data about the file
>    (eg. ownership, permissions, checksum (if appropriate), package(s) 
>    claiming ownership, etc).
>    
>  - Packages will be able to be up/downgraded at will.
> 
> How new packages will be built.
> -------------------------------
> 
> A package will consist of a single Zip file containing the package
> script and optional data files.  The package script will be called
> PACKAGE, and be contained at the top level of the Zip file.  Other
> files will be organised in subdirectories to suit the package script.
> 
> Package flavours
> ----------------
> 
> A package may contain one of:
> 
>  - A complete software component, allowing installation of some
>    version on a virgin system.
>  - A component upgrade, allowing the upgrading of a given range of
>    previous versions to a new version.
>  - A delta, adding extra functionality or fixes to an existing
>    installed component.
> 
> 
> The package script.
> -------------------
> 
> All operations on the package are controlled by the package script.
> The script is a plain text file, divided into sections as detailed
> below.
> 
> Each section is formatted as :
> 
> <Operation> {
>       <body lines>
> }
> 
> where <Operation> is one of the standard operations INFO, INSTALL, 
> REMOVE, VERIFY, or a package-specific operation.
> 
> The INFO section provides general information about the package. It is
> processed every time the package information is read.
> 
> The INSTALL and REMOVE sections contain procedures for performing the
> installation/removal of the package.
> 
> The VERIFY section may contain extra code for performing verification
> of the installation status of the package.  Normal verification
> consists of performing MD5 signature and permissions checks of
> installed files.  Other tests may look for data files, running
> processes, etc.
> 
> The package script is parsed and executed by a secure Tcl interpreter.
> Many standard Tcl commands and variables are also available (xref
> command list).  The package system also exports a number of variables
> (xref variable list).
> 
> In addition, the following commands are available,  Unless otherwise
> stated, commands may appear in any order, and are processed in the
> order they appear.
> 
> INFO section
> ------------
> 
> NAME <package-name>
> 
>       Sets the package name to be operated on by this section.  If
>       this name does not match that of the Zip file, an error may be
>       generated.  In the case of a package containing a delta,
>       nominates the package to which the delta will be applied.
>       This name is used by the REQUIRE VERSION and REQUIRE DELTA
>       commands (see below) to locate the "current" package.
> 
> 
> VERSION <major>.<minor>
> 
>       Sets the major/minor version number for the package to assume
>       following a successful installation.
> 
> DELTA <delta-name> [<delta-name>...]
> 
>       Sets the delta name(s) to be added/removed following a 
>       successful installation/removal.
> 
> 
> CANONICALNAME <name>
> 
>       Packages will often contain third-party software with
>       completely different naming conventions.  This command
>       supplies a canonical name for the name-major.minor+delta
>       combination that results from a successful installation of the
>       contents of the package.
> 
> INSTALL section
> ---------------
> 
> REQUIRE PACKAGE <package-spec-expression>
> 
>       Produces an error if <package-spec-expression> evaluates
>       false.  In addition, the package(s) whose presence contributes
>       to satisfying the expression are listed in
>       $pkg_info(package:required), and if the installation completes
>       successfully the requirement will be permanently recorded.
> 
>       (Feature: recursive fetch/install of required-but-not-present
>                 packages/deltas)
> 
> 
> REQUIRE VERSION <version-spec>        (XXX should allow expression?)
> 
>       Produces an error if the current package (as specified in the
>       PACKAGE command above) does not meet <version-spec>.  This
>       command is normally used in packages containing deltas
>       (nominating the version(s) to which the delta may be applied)
>       or upgrades from earlier versions of the package.
> 
> 
> REQUIRE DELTA <delta-expression>
> 
>       Produces an error if the current package (as specified in the
>       PACKAGE command above) does not meet <delta-spec-expression>.
>       This command is normally used in packages containing deltas to
>       state the prerequisite delta set.  The delta(s) whose presence
>       contributes to satisfying the expression are listed in
>       $pkg_info(delta:required), and if the installation of the
>       delta completes successfully the requirement will be
>       permanently recorded.
>       
> 
> REQUIRE USER <user-specification>
> REQUIRE GROUP <group-specification>
> 
>       The user/group specified must be present for the installation to
>       complete.
> 
>       (Feature: automatic adding of user/group.  Preserve real UID/GID
>                 in variables.)
> 
> 
> EXCLUDE PACKAGE <package-spec-expression>
> 
>       Produces an error if <package-spec-expression> evaluates true.
>       In addition, a record is kept of the exclusion condition, and
>       no package/delta may be subsequently added which meets the
>       exclusion condition.
> 
>       (Feature: automatic removal of excluded packages)
> 
> 
> EXCLUDE DELTA <delta-expression>
> 
>       Produces an error if the current package (as specified in the
>       PACKAGE command above) meets <delta-expression>.  This command
>       is normally used in packages containing deltas to state the
>       set of deltas which are known to not coexist.  If the delta is
>       added successfully, a record is kept of the expression and no
>       package may be subsequently added which meets the condition.
> 
> 
> USE PACKAGE <package-spec>
> 
>       If a package matching <package-spec> is present, it will be
>       listed in $pkg_info(use), and if the installation completes
>       successfully this usage will be upgraded to a requirement.
> 
>       (Feature: automatic fetch/install of uses-but-not-present
>                 packages/deltas, with user prompting configurable)
> 
> 
> REPLACE PACKAGE <package-spec> <reason>
> 
>       If a package matching <package-spec> is present, the user may
>       be prompted to indicate that the offending package should be
>       removed first. The <reason> string may be supplied as
>       justification for this.
> 
> 
> EXEC <relative-path>
> 
>       Executes the program located in the package at
>       <relative-path>.  If the current security model prohibits
>       execution of script-supplied programs, an error will be
>       generated.
> 
> 
> SOURCE <relative-path> [<security-level>]
> 
>       The script located in the package at <relative-path> is
>       executed in another Tcl interpreter with security set to
>       <security-level>. If this level is incompatible with the
>       current security model, an error will be generated.  If no
>       level is specified, the current level is maintained.
> 
> 
> INSTALL <destination-path> <source-path> [@<list-path>]
> INSTALL <destination-path> <source-path> [<filename-list>]
> 
>       Installs files from the <source-path> within the package
>       archive into <destination-path> in the filesystem. If
>       @<list-path> is supplied, the file at that location in the
>       package is consulted for a list of files to be installed. If
>       <filename-list> is supplied, the files listed are
>       installed. If neither is supplied, all files under
>       <source-path> are installed.
> 
>       In all cases, every file installed is recorded.  If an error
>       occurs installing a file, all installed files are removed and
>       an error is returned.
> 
>       During an upgrade installation, files need not be present in
>       the package if the version from the previous version(s) are
>       suitable.  In this case, they should still be passed to the
>       INSTALL command, which will note that the file is not supplied
>       but already present.  This will prevent the file in question
>       from being removed as obsolete.
> 
>       The <destination-path> argument should be an absolute path; it
>       will normally be one of the paths from $pkg_info(path:*), see
>       below.  Other paths may be specified, but the security model
>       in force may not allow installation outside the nominated areas.
> 
> ATTRIBUTE ADD <attribute> <destination-path> [@<list-path>]
> ATTRIBUTE ADD <attribute> <destination-path> [<filename-list>]
> ATTRIBUTE ADD <attribute> <destination-path> [<source-path>]
> 
>       Adds an attribute to file(s).  Attributes control how files
>       are installed and recorded.  The destination path should match
>       that supplied when the file is installed.  If @<list-path> is
>       supplied, the file at that location is consulted for a list of
>       files to which the attribute will be applied. If
>       <filename-list> is supplied, the attribute is applied to the
>       listed files.  If a single path is supplied, and it refers to
>       a relative source path within the Zip archive, and the Zip
>       archive is available, the names of all files under that path
>       are used.
> 
>       Currently supported attributes are:
> 
>       CONTENTS_VARY           The file's contents may vary over the
>                               installed lifetime of the package.  As
>                               such, keeping a checksum of the file
>                               is not useful.
> 
>       INHERIT_FILE            The file is not included as part of
>                               the package, but may be produced by
>                               the application and should be
>                               considered as belonging to the
>                               package.  Implies CONTENTS_VARY.
> 
>       (XXX more here!)
> 
> 
> PRESERVE <file-spec>
> 
>       Normally when an upgrade from a previous version is being
>       performed, the files from the previous version are removed.
>       This command causes all files matching <file-spec> from
>       the previous version to be preserved.
> 
>       This directive is most suitable for preservation of
>       configuration files when upgrading from a compatible previous 
>       version.
> 
>       (XXX should this prevent the file being overwritten by an
>       INSTALL?)
> 
> PRESERVE ALL
> 
>       This command is normally used in an upgrade situation where
>       the wholesale removal of all files associated with the
>       previous version is not desired.  It should normally be
>       avoided in preference to supplying the files in question to
>       the INSTALL command.
> 
> KEEP <relative-path>
> 
>       Specifies that the file(s) at/under <relative-path> should be
>       preserved by the installation proecess for later use in other
>       sections (which may be invoked when the Zip file is not present).
> 
>       Files retained by KEEP should be stored in the same place the
>       PACKAGE file is kept.
> 
> REMOVE section
> --------------
> 
> (XXX functionality to stop a running daemon etc. before removing)
> 
> VERIFY section
> --------------
> 
> (XXX functionality to verify that a daemon etc. is running)
> 
> General commands
> ----------------
> 
> These commands may be used in any section.
> 
> MATCH PACKAGE <package-expression>
> 
>       Returns a list of packages currently installed which match
>       <package-expression>.
> 
> 
> PKG_NAME <package-ident>
> PKG_MAJOR <package-ident>
> PKG_MINOR <package-ident>
> PKG_DELTAS <package-ident>
> 
>       Return various components of a package name
> 
> 
> Variable list
> -------------
> 
> These variables are defined by the package system, and may be
> consulted by the package script.
> 
> pkg_info
> 
>       This array contains fields describing the package.
> 
>       package:name
> 
>               Contains the name component of the current package, if
>               known.
> 
>       package:required
> 
>               Lists full package identifiers for packages that have
>               been established as prerequisites for the current 
>               package.
> 
>       delta:required
> 
>               Lists the deltas which have been established as
>               prerequisites for the current package.
> 
>       security:policy         (readonly)
> 
>               Names the current security policy.
> 
>       security:exec           (readonly)
> 
>               Boolean indicating whether the current security policy
>               will allow the EXEC command.
> 
>       security:source
> 
>               Boolean indicating whether the current security policy
>               will allow the SOURCE command.
> 
>       security:paths
> 
>               Lists the path prefix components under which files may
>               be installed; if this list is empty, files may be
>               installed anywhere.
> 
>       path:prefix
> 
>               The standard installation prefix; where files go by
>               default.
> 
>       path:x11prefix
> 
>               The prefix for X11-related files.
> 
> What's missing?
> ---------------
> 
>  - Text-file editing primitives (eg. replace PREFIX)
> 
> 
> Expressions and names.
> ----------------------
> 
> <package-ident>               Package identifiers.
> 
> A given package in a given state is described thus:
> 
>  <name>-<major>.<minor><delta-list>
> 
> where
> 
>  <name>               is an alpha token identifying the package.  Only one
>               package with this name may be present in the system at
>               a given time.
>  <major>      is the major version number for the package.  This
>               number is incremented when the package undergoes a
>               change which is likely to render it incompatible with
>               previous versions.
>  <minor>      is the minor version number for the package.  This
>               number is incremented when the package changes but the
>               change is not likely to result in incompatabilities.
>  <delta-list> is a list of entries, each formatted as +<delta>,
>               which identify deltas which have been applied to the
>               package.
> 
> <delta>                       Package Deltas.
> 
> In order to allow minor changes to be made to a package without
> requring a change in version numbers, as well as to allow
> customisations of a package, "deltas" are supported.
> 
> A delta applies to an existing package (possibly to a range of
> versions), and may replace or alter files within the package.
> 
> (Feature: the package tools may elect to refuse to apply a delta which
>         alters files previously altered by another delta.  The aim
>         here is to reduce the likelihood of two deltas produced in
>         igorance of one another being able to interfere.)
> 
> <package-spec>                Package Specification.
> 
> A package specification is a wildcard expression intended to match
> against package identifiers. All fields must be present, and matching
> occurs separately for each field.  A package identifier matches if all
> fields match the specification.
> 
> <name>                Glob-style string patterns are supported here. (xref
>               Tcl 'string match')
> <vesion-spec>
> <major>,<minor>       These fields may contain '*' (matching any
version), 
>               or a numeric value preceeded by >, >=, =, <= or <,
>               matching if the ident being considered has a field
>               numerically greater, greater or equal, equal, less or
>               equal or less than the value supplied.  The = prefix
>               may be omitted for simplicity.
> <delta-spec>  Items in the delta list may be prefixed with +,
>               indicating that the named delta is required for a
>               match, or !, indicating that the named delta must not
>               be present for a match.
> 
> Commands using package specifications may treat the results of a match
> as a logical value (eg. in an expression) or as a list of matching
> packages.
> 
> <package-spec-expression>
> <delta-spec-expression>
> 
> Specifications may be grouped to form expressions. In an
> expression, specifications are considered to evaluate 'true' if they
> match one or more packages.
> 
> Operators supported are '&&' (logical and) and '||' (logical or).
> Precedence must be established using parentheses, an expression may
> not contain more than one operator.  (XXX someone write a better
> expression parser?)
> 
> When evaluating expressions, the full set of matched items is
> retained and may be used by the command evaluating the expression.
> Expressions are fully, not lazily, evaluated.
> 
> <file-spec>
> 
> This is a glob-style file match.  It returns a list of files matching
> the expression.  The leading path may be explicitly matched (if the
> spec begins with a /), otherwise the command using the spec may only
> match the trailing component, depending on context.
> 
> <relative-path>
> 
> This is a package-internal relative path.  It may be evaluated within
> the Zip file, or within some storage area containing files extracted
> from the Zip file by a KEEP command.
> 
> 
> The database.
> -------------
> 
> Everything known about files installed from packages, package
> requirements and exclusions, etc. is stored in the package management
> database.
> 
> Package records define packages that have been installed.  A package
> record matches a given name-major.minor tuple.  The package record
> contains (XXX enumerate fields).
> 
> Delta records are attached to package records.  Each delta record
> contains details of the delta (XXX enumerate fields).  Delta records
> are sorted by order of application.
> 
> File records contain information pertaining to files under control of
> the package system.  Files may be claimed by more than one package, so
> the file:package association is kept separately from the file record.
> (XXX enumerate fields, comment on attributes)
> 
> The filestore and backing out.
> ------------------------------
> 
> XXX Elaborate on moving of files from old packages to the store, and
> resurrection of old versions from the store when new versions
> installed.  Also mention purging of old versions from the store.
> 
> 
> 
> -- 
> \\  Sometimes you're ahead,       \\  Mike Smith
> \\  sometimes you're behind.      \\  mike@smith.net.au
> \\  The race is long, and in the  \\  msmith@freebsd.org
> \\  end it's only with yourself.  \\  msmith@cdrom.com
> 
> 
> 
> To Unsubscribe: send mail to majordomo@FreeBSD.org
> with "unsubscribe freebsd-install" in the body of the message

----------


Sincerely Yours, 

Simon Shapiro
Shimon@Simon-Shapiro.ORG                      Voice:   503.708.7858

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-install" in the body of the message



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?XFMail.980213172310.shimon>