src/modules/actions/depend.py
author Bart Smaalders <Bart.Smaalders@Sun.COM>
Wed, 18 Nov 2009 15:53:48 -0800
changeset 1505 cc598d70bbbe
parent 1378 d87edd34039a
child 1516 8c950a3b4171
permissions -rw-r--r--
4425 pkg install should deal w/ complex dependency changes in one install 12018 Implement Facets 12046 Implement publisher search order proposal 12050 Implement Exclude type dependency 762 Dead code in cfgfiles.py? 2606 expanded dependency version specification capability desired 3096 install and uninstall of multiple matches doesn't seem to work 5015 newest package version not installed by depend action with type=require 6018 image-update fails to update optional dependency 7394 package operation failure misleading when mixing build versions 8535 pkgsend in testutils should not fork 8988 nested incorporations fail with IndexError 9030 image-update fails when package constrained by two incorporations 9242 gcc-dev, ss-dev, etc. should be constrained by entire 9294 uninstall should not remove symlinks still used by another package 10922 Image.repair() doesn't set self.imageplan, leading to traceback on "pkg fix" 11681 fmri object should include publisher in hash 11697 pkg dumps stack traceback when --be-name argument contains '+' character 12120 -n operations (install, image-update, etc) w/o -v can skip retrieving manifests 12121 filters have been obsoleted by variants & facets and should be removed. 12455 pkg needs additional exit status codes 12551 imageplan should use manifest prefetch facility introduced in 1472:c50eb141435a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
409
713e20963dc2 2314 shebang lines should use minimum python version
Shawn Walker <swalker@opensolaris.org>
parents: 307
diff changeset
     1
#!/usr/bin/python2.4
59
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
diff changeset
     2
#
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
diff changeset
     3
# CDDL HEADER START
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
diff changeset
     4
#
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
diff changeset
     5
# The contents of this file are subject to the terms of the
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
diff changeset
     6
# Common Development and Distribution License (the "License").
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
diff changeset
     7
# You may not use this file except in compliance with the License.
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
diff changeset
     8
#
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
diff changeset
     9
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
diff changeset
    10
# or http://www.opensolaris.org/os/licensing.
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
diff changeset
    11
# See the License for the specific language governing permissions
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
diff changeset
    12
# and limitations under the License.
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
diff changeset
    13
#
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
diff changeset
    14
# When distributing Covered Code, include this CDDL HEADER in each
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
diff changeset
    15
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
diff changeset
    16
# If applicable, add the following below this CDDL HEADER, with the
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
diff changeset
    17
# fields enclosed by brackets "[]" replaced with your own identifying
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
diff changeset
    18
# information: Portions Copyright [yyyy] [name of copyright owner]
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
diff changeset
    19
#
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
diff changeset
    20
# CDDL HEADER END
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
diff changeset
    21
#
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
diff changeset
    22
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
diff changeset
    23
#
926
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 659
diff changeset
    24
# Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
59
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
diff changeset
    25
# Use is subject to license terms.
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
diff changeset
    26
#
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
diff changeset
    27
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
diff changeset
    28
"""Action describing a package dependency.
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
diff changeset
    29
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
diff changeset
    30
This module contains the DependencyAction class, which represents a
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
diff changeset
    31
relationship between the package containing the action and another package.
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
diff changeset
    32
"""
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
diff changeset
    33
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
diff changeset
    34
import generic
222
12006bf2a260 4 We need to be able to verify that package(s) is/are correctly installed
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 180
diff changeset
    35
import pkg.fmri as fmri
655
6eef82185057 2325 optional dependency enforcement can't handle fmris disappearing from the catalog
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 568
diff changeset
    36
import pkg.version
526
8c243883ae41 822 Depot traceback on "pkgsend -s <server> open foo"
Dan Price <dp@eng.sun.com>
parents: 409
diff changeset
    37
59
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
diff changeset
    38
class DependencyAction(generic.Action):
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
diff changeset
    39
        """Class representing a dependency packaging object.  The fmri attribute
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
diff changeset
    40
        is expected to be the pkg FMRI that this package depends on.  The type
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1378
diff changeset
    41
        attribute is one of these:
59
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
diff changeset
    42
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1378
diff changeset
    43
        optional - optional dependency on minimum version of other package. In
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1378
diff changeset
    44
        other words, if installed, other packages must be at least at specified
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1378
diff changeset
    45
        version level.
307
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 258
diff changeset
    46
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1378
diff changeset
    47
        require -  dependency on minimum version of other package is needed 
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1378
diff changeset
    48
        for correct function of this package.
307
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 258
diff changeset
    49
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1378
diff changeset
    50
        incorporate - optional dependency on precise version of other package; 
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1378
diff changeset
    51
        non-specified portion of version is free to float.
307
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 258
diff changeset
    52
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1378
diff changeset
    53
        exclude - package may not be installed together with named version 
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1378
diff changeset
    54
        or higher - reverse logic of require."""
59
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
diff changeset
    55
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
diff changeset
    56
        name = "depend"
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
diff changeset
    57
        attributes = ("type", "fmri")
180
1f2f625cd98a depend actions need to have a key_attr so we can diff them
Dan Price <dp@eng.sun.com>
parents: 144
diff changeset
    58
        key_attr = "fmri"
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1378
diff changeset
    59
        known_types = ("optional", "require", "exclude", "incorporate")
59
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
diff changeset
    60
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
diff changeset
    61
        def __init__(self, data=None, **attrs):
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
diff changeset
    62
                generic.Action.__init__(self, data, **attrs)
1234
d9885dff5d16 4705 UnboundLocalError in depend action
Shawn Walker <srw@sun.com>
parents: 1146
diff changeset
    63
                if "type" not in self.attrs:
d9885dff5d16 4705 UnboundLocalError in depend action
Shawn Walker <srw@sun.com>
parents: 1146
diff changeset
    64
                        raise pkg.actions.InvalidActionError(
d9885dff5d16 4705 UnboundLocalError in depend action
Shawn Walker <srw@sun.com>
parents: 1146
diff changeset
    65
                            str(self), _("Missing type attribute"))
d9885dff5d16 4705 UnboundLocalError in depend action
Shawn Walker <srw@sun.com>
parents: 1146
diff changeset
    66
d9885dff5d16 4705 UnboundLocalError in depend action
Shawn Walker <srw@sun.com>
parents: 1146
diff changeset
    67
                if "fmri" not in self.attrs:
d9885dff5d16 4705 UnboundLocalError in depend action
Shawn Walker <srw@sun.com>
parents: 1146
diff changeset
    68
                        raise pkg.actions.InvalidActionError(
d9885dff5d16 4705 UnboundLocalError in depend action
Shawn Walker <srw@sun.com>
parents: 1146
diff changeset
    69
                            str(self), _("Missing fmri attribute"))
d9885dff5d16 4705 UnboundLocalError in depend action
Shawn Walker <srw@sun.com>
parents: 1146
diff changeset
    70
d9885dff5d16 4705 UnboundLocalError in depend action
Shawn Walker <srw@sun.com>
parents: 1146
diff changeset
    71
                if self.attrs["type"] not in self.known_types:
d9885dff5d16 4705 UnboundLocalError in depend action
Shawn Walker <srw@sun.com>
parents: 1146
diff changeset
    72
                        raise pkg.actions.InvalidActionError(str(self),
d9885dff5d16 4705 UnboundLocalError in depend action
Shawn Walker <srw@sun.com>
parents: 1146
diff changeset
    73
                            _("Unknown type (%s) in depend action") %
d9885dff5d16 4705 UnboundLocalError in depend action
Shawn Walker <srw@sun.com>
parents: 1146
diff changeset
    74
                            self.attrs["type"])
d9885dff5d16 4705 UnboundLocalError in depend action
Shawn Walker <srw@sun.com>
parents: 1146
diff changeset
    75
532
1b1547cb8655 3461 fmri strictness checks broke sunfreeware.com
Dan Price <dp@eng.sun.com>
parents: 526
diff changeset
    76
                try:
1b1547cb8655 3461 fmri strictness checks broke sunfreeware.com
Dan Price <dp@eng.sun.com>
parents: 526
diff changeset
    77
                        if "fmri" in self.attrs:
1b1547cb8655 3461 fmri strictness checks broke sunfreeware.com
Dan Price <dp@eng.sun.com>
parents: 526
diff changeset
    78
                                self.clean_fmri()
1b1547cb8655 3461 fmri strictness checks broke sunfreeware.com
Dan Price <dp@eng.sun.com>
parents: 526
diff changeset
    79
                except ValueError:
1b1547cb8655 3461 fmri strictness checks broke sunfreeware.com
Dan Price <dp@eng.sun.com>
parents: 526
diff changeset
    80
                        print "Warning: failed to clean FMRI: %s" % \
1b1547cb8655 3461 fmri strictness checks broke sunfreeware.com
Dan Price <dp@eng.sun.com>
parents: 526
diff changeset
    81
                            self.attrs["fmri"]
526
8c243883ae41 822 Depot traceback on "pkgsend -s <server> open foo"
Dan Price <dp@eng.sun.com>
parents: 409
diff changeset
    82
8c243883ae41 822 Depot traceback on "pkgsend -s <server> open foo"
Dan Price <dp@eng.sun.com>
parents: 409
diff changeset
    83
        def clean_fmri(self):
8c243883ae41 822 Depot traceback on "pkgsend -s <server> open foo"
Dan Price <dp@eng.sun.com>
parents: 409
diff changeset
    84
                """ Clean up an invalid depend fmri into one which
8c243883ae41 822 Depot traceback on "pkgsend -s <server> open foo"
Dan Price <dp@eng.sun.com>
parents: 409
diff changeset
    85
                we can recognize.
8c243883ae41 822 Depot traceback on "pkgsend -s <server> open foo"
Dan Price <dp@eng.sun.com>
parents: 409
diff changeset
    86
                Example: 2.01.01.38-0.96  -> 2.1.1.38-0.96
8c243883ae41 822 Depot traceback on "pkgsend -s <server> open foo"
Dan Price <dp@eng.sun.com>
parents: 409
diff changeset
    87
                This also corrects self.attrs["fmri"] as external code
8c243883ae41 822 Depot traceback on "pkgsend -s <server> open foo"
Dan Price <dp@eng.sun.com>
parents: 409
diff changeset
    88
                knows about that, too.
8c243883ae41 822 Depot traceback on "pkgsend -s <server> open foo"
Dan Price <dp@eng.sun.com>
parents: 409
diff changeset
    89
                """
8c243883ae41 822 Depot traceback on "pkgsend -s <server> open foo"
Dan Price <dp@eng.sun.com>
parents: 409
diff changeset
    90
                #
8c243883ae41 822 Depot traceback on "pkgsend -s <server> open foo"
Dan Price <dp@eng.sun.com>
parents: 409
diff changeset
    91
                # This hack corrects a problem in pre-2008.11 packaging
8c243883ae41 822 Depot traceback on "pkgsend -s <server> open foo"
Dan Price <dp@eng.sun.com>
parents: 409
diff changeset
    92
                # metadata: some depend actions were specified with invalid
8c243883ae41 822 Depot traceback on "pkgsend -s <server> open foo"
Dan Price <dp@eng.sun.com>
parents: 409
diff changeset
    93
                # fmris of the form 2.38.01.01.3 (the padding zero is considered
8c243883ae41 822 Depot traceback on "pkgsend -s <server> open foo"
Dan Price <dp@eng.sun.com>
parents: 409
diff changeset
    94
                # invalid).  When we get an invalid FMRI, we use regular
8c243883ae41 822 Depot traceback on "pkgsend -s <server> open foo"
Dan Price <dp@eng.sun.com>
parents: 409
diff changeset
    95
                # expressions to perform a replacement operation which
8c243883ae41 822 Depot traceback on "pkgsend -s <server> open foo"
Dan Price <dp@eng.sun.com>
parents: 409
diff changeset
    96
                # cleans up these problems.
8c243883ae41 822 Depot traceback on "pkgsend -s <server> open foo"
Dan Price <dp@eng.sun.com>
parents: 409
diff changeset
    97
                #
8c243883ae41 822 Depot traceback on "pkgsend -s <server> open foo"
Dan Price <dp@eng.sun.com>
parents: 409
diff changeset
    98
                # n.b. that this parser is not perfect: it will fix only
532
1b1547cb8655 3461 fmri strictness checks broke sunfreeware.com
Dan Price <dp@eng.sun.com>
parents: 526
diff changeset
    99
                # the 'release' and 'branch' part of depend fmris-- these
1b1547cb8655 3461 fmri strictness checks broke sunfreeware.com
Dan Price <dp@eng.sun.com>
parents: 526
diff changeset
   100
                # are the only places we've seen rules violations.
1b1547cb8655 3461 fmri strictness checks broke sunfreeware.com
Dan Price <dp@eng.sun.com>
parents: 526
diff changeset
   101
                #
1b1547cb8655 3461 fmri strictness checks broke sunfreeware.com
Dan Price <dp@eng.sun.com>
parents: 526
diff changeset
   102
                # Lots of things could go wrong here-- the caller should
1b1547cb8655 3461 fmri strictness checks broke sunfreeware.com
Dan Price <dp@eng.sun.com>
parents: 526
diff changeset
   103
                # catch ValueError.
526
8c243883ae41 822 Depot traceback on "pkgsend -s <server> open foo"
Dan Price <dp@eng.sun.com>
parents: 409
diff changeset
   104
                #
8c243883ae41 822 Depot traceback on "pkgsend -s <server> open foo"
Dan Price <dp@eng.sun.com>
parents: 409
diff changeset
   105
                fmri_string = self.attrs["fmri"]
8c243883ae41 822 Depot traceback on "pkgsend -s <server> open foo"
Dan Price <dp@eng.sun.com>
parents: 409
diff changeset
   106
8c243883ae41 822 Depot traceback on "pkgsend -s <server> open foo"
Dan Price <dp@eng.sun.com>
parents: 409
diff changeset
   107
                #
8c243883ae41 822 Depot traceback on "pkgsend -s <server> open foo"
Dan Price <dp@eng.sun.com>
parents: 409
diff changeset
   108
                # Start by locating the @ and the "," or "-" or ":" which
8c243883ae41 822 Depot traceback on "pkgsend -s <server> open foo"
Dan Price <dp@eng.sun.com>
parents: 409
diff changeset
   109
                # is to the right of said @.
8c243883ae41 822 Depot traceback on "pkgsend -s <server> open foo"
Dan Price <dp@eng.sun.com>
parents: 409
diff changeset
   110
                #
8c243883ae41 822 Depot traceback on "pkgsend -s <server> open foo"
Dan Price <dp@eng.sun.com>
parents: 409
diff changeset
   111
                verbegin = fmri_string.find("@")
8c243883ae41 822 Depot traceback on "pkgsend -s <server> open foo"
Dan Price <dp@eng.sun.com>
parents: 409
diff changeset
   112
                if verbegin == -1:
8c243883ae41 822 Depot traceback on "pkgsend -s <server> open foo"
Dan Price <dp@eng.sun.com>
parents: 409
diff changeset
   113
                        return
8c243883ae41 822 Depot traceback on "pkgsend -s <server> open foo"
Dan Price <dp@eng.sun.com>
parents: 409
diff changeset
   114
                verend = fmri_string.find(",", verbegin)
8c243883ae41 822 Depot traceback on "pkgsend -s <server> open foo"
Dan Price <dp@eng.sun.com>
parents: 409
diff changeset
   115
                if verend == -1:
8c243883ae41 822 Depot traceback on "pkgsend -s <server> open foo"
Dan Price <dp@eng.sun.com>
parents: 409
diff changeset
   116
                        verend = fmri_string.find("-", verbegin)
8c243883ae41 822 Depot traceback on "pkgsend -s <server> open foo"
Dan Price <dp@eng.sun.com>
parents: 409
diff changeset
   117
                if verend == -1:
8c243883ae41 822 Depot traceback on "pkgsend -s <server> open foo"
Dan Price <dp@eng.sun.com>
parents: 409
diff changeset
   118
                        verend = fmri_string.find(":", verbegin)
8c243883ae41 822 Depot traceback on "pkgsend -s <server> open foo"
Dan Price <dp@eng.sun.com>
parents: 409
diff changeset
   119
                if verend == -1:
8c243883ae41 822 Depot traceback on "pkgsend -s <server> open foo"
Dan Price <dp@eng.sun.com>
parents: 409
diff changeset
   120
                        verend = len(fmri_string)
532
1b1547cb8655 3461 fmri strictness checks broke sunfreeware.com
Dan Price <dp@eng.sun.com>
parents: 526
diff changeset
   121
526
8c243883ae41 822 Depot traceback on "pkgsend -s <server> open foo"
Dan Price <dp@eng.sun.com>
parents: 409
diff changeset
   122
                # skip over the @ sign
8c243883ae41 822 Depot traceback on "pkgsend -s <server> open foo"
Dan Price <dp@eng.sun.com>
parents: 409
diff changeset
   123
                verbegin += 1
8c243883ae41 822 Depot traceback on "pkgsend -s <server> open foo"
Dan Price <dp@eng.sun.com>
parents: 409
diff changeset
   124
                verdots = fmri_string[verbegin:verend]
8c243883ae41 822 Depot traceback on "pkgsend -s <server> open foo"
Dan Price <dp@eng.sun.com>
parents: 409
diff changeset
   125
                dots = verdots.split(".")
532
1b1547cb8655 3461 fmri strictness checks broke sunfreeware.com
Dan Price <dp@eng.sun.com>
parents: 526
diff changeset
   126
526
8c243883ae41 822 Depot traceback on "pkgsend -s <server> open foo"
Dan Price <dp@eng.sun.com>
parents: 409
diff changeset
   127
                # Do the correction
926
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 659
diff changeset
   128
                cleanvers = ".".join([str(int(s)) for s in dots])
532
1b1547cb8655 3461 fmri strictness checks broke sunfreeware.com
Dan Price <dp@eng.sun.com>
parents: 526
diff changeset
   129
926
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 659
diff changeset
   130
                #
532
1b1547cb8655 3461 fmri strictness checks broke sunfreeware.com
Dan Price <dp@eng.sun.com>
parents: 526
diff changeset
   131
                # Next, find the branch if it exists, the first '-'
1b1547cb8655 3461 fmri strictness checks broke sunfreeware.com
Dan Price <dp@eng.sun.com>
parents: 526
diff changeset
   132
                # following the version.
1b1547cb8655 3461 fmri strictness checks broke sunfreeware.com
Dan Price <dp@eng.sun.com>
parents: 526
diff changeset
   133
                #
1b1547cb8655 3461 fmri strictness checks broke sunfreeware.com
Dan Price <dp@eng.sun.com>
parents: 526
diff changeset
   134
                branchbegin = fmri_string.find("-", verend)
1b1547cb8655 3461 fmri strictness checks broke sunfreeware.com
Dan Price <dp@eng.sun.com>
parents: 526
diff changeset
   135
                if branchbegin != -1:
1b1547cb8655 3461 fmri strictness checks broke sunfreeware.com
Dan Price <dp@eng.sun.com>
parents: 526
diff changeset
   136
                        branchend = fmri_string.find(":", branchbegin)
1b1547cb8655 3461 fmri strictness checks broke sunfreeware.com
Dan Price <dp@eng.sun.com>
parents: 526
diff changeset
   137
                        if branchend == -1:
1b1547cb8655 3461 fmri strictness checks broke sunfreeware.com
Dan Price <dp@eng.sun.com>
parents: 526
diff changeset
   138
                                branchend = len(fmri_string)
1b1547cb8655 3461 fmri strictness checks broke sunfreeware.com
Dan Price <dp@eng.sun.com>
parents: 526
diff changeset
   139
1b1547cb8655 3461 fmri strictness checks broke sunfreeware.com
Dan Price <dp@eng.sun.com>
parents: 526
diff changeset
   140
                        # skip over the -
1b1547cb8655 3461 fmri strictness checks broke sunfreeware.com
Dan Price <dp@eng.sun.com>
parents: 526
diff changeset
   141
                        branchbegin += 1
1b1547cb8655 3461 fmri strictness checks broke sunfreeware.com
Dan Price <dp@eng.sun.com>
parents: 526
diff changeset
   142
                        branchdots = fmri_string[branchbegin:branchend]
1b1547cb8655 3461 fmri strictness checks broke sunfreeware.com
Dan Price <dp@eng.sun.com>
parents: 526
diff changeset
   143
                        dots = branchdots.split(".")
1b1547cb8655 3461 fmri strictness checks broke sunfreeware.com
Dan Price <dp@eng.sun.com>
parents: 526
diff changeset
   144
1b1547cb8655 3461 fmri strictness checks broke sunfreeware.com
Dan Price <dp@eng.sun.com>
parents: 526
diff changeset
   145
                        # Do the correction
1b1547cb8655 3461 fmri strictness checks broke sunfreeware.com
Dan Price <dp@eng.sun.com>
parents: 526
diff changeset
   146
                        cleanbranch = ".".join([str(int(x)) for x in dots])
1b1547cb8655 3461 fmri strictness checks broke sunfreeware.com
Dan Price <dp@eng.sun.com>
parents: 526
diff changeset
   147
1b1547cb8655 3461 fmri strictness checks broke sunfreeware.com
Dan Price <dp@eng.sun.com>
parents: 526
diff changeset
   148
                if branchbegin == -1:
1b1547cb8655 3461 fmri strictness checks broke sunfreeware.com
Dan Price <dp@eng.sun.com>
parents: 526
diff changeset
   149
                        cleanfmri = fmri_string[:verbegin] + cleanvers + \
1b1547cb8655 3461 fmri strictness checks broke sunfreeware.com
Dan Price <dp@eng.sun.com>
parents: 526
diff changeset
   150
                            fmri_string[verend:]
1b1547cb8655 3461 fmri strictness checks broke sunfreeware.com
Dan Price <dp@eng.sun.com>
parents: 526
diff changeset
   151
                else:
1b1547cb8655 3461 fmri strictness checks broke sunfreeware.com
Dan Price <dp@eng.sun.com>
parents: 526
diff changeset
   152
                        cleanfmri = fmri_string[:verbegin] + cleanvers + \
1b1547cb8655 3461 fmri strictness checks broke sunfreeware.com
Dan Price <dp@eng.sun.com>
parents: 526
diff changeset
   153
                            fmri_string[verend:branchbegin] + cleanbranch + \
1b1547cb8655 3461 fmri strictness checks broke sunfreeware.com
Dan Price <dp@eng.sun.com>
parents: 526
diff changeset
   154
                            fmri_string[branchend:]
926
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 659
diff changeset
   155
526
8c243883ae41 822 Depot traceback on "pkgsend -s <server> open foo"
Dan Price <dp@eng.sun.com>
parents: 409
diff changeset
   156
                # XXX enable if you need to debug
8c243883ae41 822 Depot traceback on "pkgsend -s <server> open foo"
Dan Price <dp@eng.sun.com>
parents: 409
diff changeset
   157
                #if cleanfmri != fmri_string:
8c243883ae41 822 Depot traceback on "pkgsend -s <server> open foo"
Dan Price <dp@eng.sun.com>
parents: 409
diff changeset
   158
                #       print "corrected invalid fmri: %s -> %s" % \
8c243883ae41 822 Depot traceback on "pkgsend -s <server> open foo"
Dan Price <dp@eng.sun.com>
parents: 409
diff changeset
   159
                #           (fmri_string, cleanfmri)
8c243883ae41 822 Depot traceback on "pkgsend -s <server> open foo"
Dan Price <dp@eng.sun.com>
parents: 409
diff changeset
   160
                self.attrs["fmri"] = cleanfmri
8c243883ae41 822 Depot traceback on "pkgsend -s <server> open foo"
Dan Price <dp@eng.sun.com>
parents: 409
diff changeset
   161
8c243883ae41 822 Depot traceback on "pkgsend -s <server> open foo"
Dan Price <dp@eng.sun.com>
parents: 409
diff changeset
   162
        def verify(self, image, **args):
655
6eef82185057 2325 optional dependency enforcement can't handle fmris disappearing from the catalog
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 568
diff changeset
   163
                # XXX Exclude and range between min and max not yet handled
307
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 258
diff changeset
   164
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1378
diff changeset
   165
                def __min_version():
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1378
diff changeset
   166
                        return pkg.version.Version("0", image.attrs["Build-Release"])
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1378
diff changeset
   167
926
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 659
diff changeset
   168
                ctype = self.attrs["type"]
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1378
diff changeset
   169
                pfmri = fmri.PkgFmri(self.attrs["fmri"], image.attrs["Build-Release"])
222
12006bf2a260 4 We need to be able to verify that package(s) is/are correctly installed
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 180
diff changeset
   170
926
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 659
diff changeset
   171
                if ctype not in self.known_types:
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 659
diff changeset
   172
                        return ["Unknown type (%s) in depend action" % ctype]
307
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 258
diff changeset
   173
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1378
diff changeset
   174
                installed_version = image.get_version_installed(pfmri)
655
6eef82185057 2325 optional dependency enforcement can't handle fmris disappearing from the catalog
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 568
diff changeset
   175
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1378
diff changeset
   176
                min_fmri = None
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1378
diff changeset
   177
                max_fmri = None
222
12006bf2a260 4 We need to be able to verify that package(s) is/are correctly installed
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 180
diff changeset
   178
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1378
diff changeset
   179
                if ctype == "require":
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1378
diff changeset
   180
                        required = True
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1378
diff changeset
   181
                        min_fmri = pfmri
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1378
diff changeset
   182
                elif ctype == "incorporate":
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1378
diff changeset
   183
                        max_fmri = pfmri
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1378
diff changeset
   184
                        min_fmri = pfmri
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1378
diff changeset
   185
                        required = False
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1378
diff changeset
   186
                elif ctype == "optional":
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1378
diff changeset
   187
                        required = False
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1378
diff changeset
   188
                        min_fmri = pfmri
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1378
diff changeset
   189
                elif ctype == "exclude":
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1378
diff changeset
   190
                        required = False
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1378
diff changeset
   191
                        max_fmri = pfmri
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1378
diff changeset
   192
                        min_fmri = pfmri.copy()
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1378
diff changeset
   193
                        min_fmri.version = __min_version()
655
6eef82185057 2325 optional dependency enforcement can't handle fmris disappearing from the catalog
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 568
diff changeset
   194
6eef82185057 2325 optional dependency enforcement can't handle fmris disappearing from the catalog
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 568
diff changeset
   195
                if installed_version:
6eef82185057 2325 optional dependency enforcement can't handle fmris disappearing from the catalog
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 568
diff changeset
   196
                        vi = installed_version.version
659
2c35d63c360e 4455 depend.verify min_fmri checking needs to be <=, not <
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 655
diff changeset
   197
                        if min_fmri and min_fmri.version and \
2c35d63c360e 4455 depend.verify min_fmri checking needs to be <=, not <
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 655
diff changeset
   198
                            min_fmri.version.is_successor(vi,
2c35d63c360e 4455 depend.verify min_fmri checking needs to be <=, not <
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 655
diff changeset
   199
                            pkg.version.CONSTRAINT_NONE):
526
8c243883ae41 822 Depot traceback on "pkgsend -s <server> open foo"
Dan Price <dp@eng.sun.com>
parents: 409
diff changeset
   200
                                return ["%s dependency %s is downrev (%s)" %
926
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 659
diff changeset
   201
                                    (ctype, min_fmri, installed_version)]
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1378
diff changeset
   202
                        if max_fmri and max_fmri.version and  \
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1378
diff changeset
   203
                            vi > max_fmri.version and \
926
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 659
diff changeset
   204
                            not vi.is_successor(max_fmri.version,
659
2c35d63c360e 4455 depend.verify min_fmri checking needs to be <=, not <
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 655
diff changeset
   205
                            pkg.version.CONSTRAINT_AUTO):
2c35d63c360e 4455 depend.verify min_fmri checking needs to be <=, not <
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 655
diff changeset
   206
                                return ["%s dependency %s is uprev (%s)" %
926
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 659
diff changeset
   207
                                    (ctype, max_fmri, installed_version)]
655
6eef82185057 2325 optional dependency enforcement can't handle fmris disappearing from the catalog
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 568
diff changeset
   208
                elif required:
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1378
diff changeset
   209
                        return ["Required dependency %s is not installed" % pfmri]
526
8c243883ae41 822 Depot traceback on "pkgsend -s <server> open foo"
Dan Price <dp@eng.sun.com>
parents: 409
diff changeset
   210
307
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 258
diff changeset
   211
                return []
222
12006bf2a260 4 We need to be able to verify that package(s) is/are correctly installed
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 180
diff changeset
   212
144
ce619e0b453f Fix unscalable search indexing
Danek Duvall <danek.duvall@sun.com>
parents: 140
diff changeset
   213
        def generate_indices(self):
1100
22a8b08d460a 7364 documentation and code comments needed for fix for 6175
Brock Pytlik <bpytlik@sun.com>
parents: 941
diff changeset
   214
                """Generates the indices needed by the search dictionary.  See
22a8b08d460a 7364 documentation and code comments needed for fix for 6175
Brock Pytlik <bpytlik@sun.com>
parents: 941
diff changeset
   215
                generic.py for a more detailed explanation."""
22a8b08d460a 7364 documentation and code comments needed for fix for 6175
Brock Pytlik <bpytlik@sun.com>
parents: 941
diff changeset
   216
926
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 659
diff changeset
   217
                ctype = self.attrs["type"]
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 659
diff changeset
   218
                pfmri = self.attrs["fmri"]
526
8c243883ae41 822 Depot traceback on "pkgsend -s <server> open foo"
Dan Price <dp@eng.sun.com>
parents: 409
diff changeset
   219
926
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 659
diff changeset
   220
                if ctype not in self.known_types:
941
e7bff46da54e 6175 search needs to be moved to version 1
Brock Pytlik <bpytlik@sun.com>
parents: 926
diff changeset
   221
                        return []
67
62c897652bbc Handle dependencies when removing a package.
Danek Duvall <danek.duvall@sun.com>
parents: 59
diff changeset
   222
526
8c243883ae41 822 Depot traceback on "pkgsend -s <server> open foo"
Dan Price <dp@eng.sun.com>
parents: 409
diff changeset
   223
                #
67
62c897652bbc Handle dependencies when removing a package.
Danek Duvall <danek.duvall@sun.com>
parents: 59
diff changeset
   224
                # XXX Ideally, we'd turn the string into a PkgFmri, and separate
62c897652bbc Handle dependencies when removing a package.
Danek Duvall <danek.duvall@sun.com>
parents: 59
diff changeset
   225
                # the stem from the version, or use get_dir_path, but we can't
62c897652bbc Handle dependencies when removing a package.
Danek Duvall <danek.duvall@sun.com>
parents: 59
diff changeset
   226
                # create a PkgFmri without supplying a build release and without
62c897652bbc Handle dependencies when removing a package.
Danek Duvall <danek.duvall@sun.com>
parents: 59
diff changeset
   227
                # it creating a dummy timestamp.  So we have to split it apart
62c897652bbc Handle dependencies when removing a package.
Danek Duvall <danek.duvall@sun.com>
parents: 59
diff changeset
   228
                # manually.
62c897652bbc Handle dependencies when removing a package.
Danek Duvall <danek.duvall@sun.com>
parents: 59
diff changeset
   229
                #
1146
7c10e9798405 3322 'depend' search index has a syntax all its own
Brock Pytlik <bpytlik@sun.com>
parents: 1100
diff changeset
   230
                # XXX This code will need to change if we start using fmris
7c10e9798405 3322 'depend' search index has a syntax all its own
Brock Pytlik <bpytlik@sun.com>
parents: 1100
diff changeset
   231
                # with publishers in dependencies.
526
8c243883ae41 822 Depot traceback on "pkgsend -s <server> open foo"
Dan Price <dp@eng.sun.com>
parents: 409
diff changeset
   232
                #
926
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 659
diff changeset
   233
                if pfmri.startswith("pkg:/"):
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 659
diff changeset
   234
                        pfmri = pfmri[5:]
67
62c897652bbc Handle dependencies when removing a package.
Danek Duvall <danek.duvall@sun.com>
parents: 59
diff changeset
   235
                # Note that this creates a directory hierarchy!
1146
7c10e9798405 3322 'depend' search index has a syntax all its own
Brock Pytlik <bpytlik@sun.com>
parents: 1100
diff changeset
   236
                inds = [
7c10e9798405 3322 'depend' search index has a syntax all its own
Brock Pytlik <bpytlik@sun.com>
parents: 1100
diff changeset
   237
                        ("depend", ctype, pfmri, None)
7c10e9798405 3322 'depend' search index has a syntax all its own
Brock Pytlik <bpytlik@sun.com>
parents: 1100
diff changeset
   238
                ]
532
1b1547cb8655 3461 fmri strictness checks broke sunfreeware.com
Dan Price <dp@eng.sun.com>
parents: 526
diff changeset
   239
1146
7c10e9798405 3322 'depend' search index has a syntax all its own
Brock Pytlik <bpytlik@sun.com>
parents: 1100
diff changeset
   240
                if "@" in pfmri:
7c10e9798405 3322 'depend' search index has a syntax all its own
Brock Pytlik <bpytlik@sun.com>
parents: 1100
diff changeset
   241
                        stem = pfmri.split("@")[0]
7c10e9798405 3322 'depend' search index has a syntax all its own
Brock Pytlik <bpytlik@sun.com>
parents: 1100
diff changeset
   242
                        inds.append(("depend", ctype, stem, None))
7c10e9798405 3322 'depend' search index has a syntax all its own
Brock Pytlik <bpytlik@sun.com>
parents: 1100
diff changeset
   243
                return inds