src/util/publish/pkgmerge.py
author Brock Pytlik <brock.pytlik@oracle.com>
Wed, 27 Apr 2011 20:30:32 -0700
changeset 2310 ce10607d5332
parent 2284 7e9dfdc8fc7c
child 2569 1f9f50d0cde3
permissions -rw-r--r--
11684 desire option to not propagate certs to non-global zones 17522 system repository should provide basic functionality 17523 Need a functioning sysdepo 17524 system depot should auto generate its configuration based on system image 17525 system depot should respond to versions/0 17526 system depot should provide publisher configuration 17527 caching should be enabled for system depot 17528 system depot should proxy http repositories 17529 system depot should proxy https repositories 17530 pkg client needs to be aware of the system repository 17531 pkg needs to cache system publisher information 17532 pkg should retrieve publisher information from the system repository when configured 17533 pkg needs to use the system repository as a proxy for http repositories 17534 pkg needs to use the system repository as a proxy for https repositories 17535 need an image property to indicate whether to use the system repository 17536 an image shouldn't require any configured publishers 17537 notion of preferred publisher should be removed 17538 pkg should be able to merge system publisher info with locally configured publishers 17539 pkg should notify that users cannot modify system publishers in certain ways 17540 pkg publisher needs to be updated to include information about system publishers 17541 pkg will need a way to specify alternate system repository urls 17547 file repositories need to be proxied by the system repository 17594 pkg set-publisher in GZ should refresh sysdepo service 17604 converting an imageconfig object to a string causes an infinite loop 17847 pkg set-publisher shouldn't allow -P along with --search-* 17911 pkg image-create should allow an image to be created without a publisher 18200 need a manpage for the sysrepo service
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2240
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
     1
#!/usr/bin/python2.6
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
     2
#
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
     3
# CDDL HEADER START
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
     4
#
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
     5
# The contents of this file are subject to the terms of the
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
     6
# Common Development and Distribution License (the "License").
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
     7
# You may not use this file except in compliance with the License.
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
     8
#
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
     9
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    10
# or http://www.opensolaris.org/os/licensing.
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    11
# See the License for the specific language governing permissions
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    12
# and limitations under the License.
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    13
#
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    14
# When distributing Covered Code, include this CDDL HEADER in each
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    15
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    16
# If applicable, add the following below this CDDL HEADER, with the
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    17
# fields enclosed by brackets "[]" replaced with your own identifying
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    18
# information: Portions Copyright [yyyy] [name of copyright owner]
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    19
#
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    20
# CDDL HEADER END
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    21
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    22
#
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    23
# Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    24
#
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    25
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    26
try:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    27
        import calendar
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    28
        import collections
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    29
        import getopt
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    30
        import gettext
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    31
        import itertools
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    32
        import locale
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    33
        import os
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    34
        import shutil
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    35
        import sys
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    36
        import tempfile
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    37
        import traceback
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    38
        import urllib
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    39
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    40
        import pkg.actions as actions
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    41
        import pkg.fmri
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    42
        import pkg.client.api_errors as apx
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    43
        import pkg.client.progress as progress
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    44
        import pkg.client.publisher as publisher
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    45
        import pkg.client.transport.transport as transport
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    46
        import pkg.manifest as manifest
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    47
        import pkg.misc as misc
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    48
        import pkg.publish.transaction as trans
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    49
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    50
        from pkg.misc import PipeError, emsg, msg
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    51
except KeyboardInterrupt:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    52
        import sys
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    53
        sys.exit(1)
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    54
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    55
BUILD_RELEASE  = "5.11"  # Should be an option to this program some day?
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    56
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    57
catalog_dict   = {}    # hash table of catalogs by source uri
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    58
fmri_cache     = {}
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    59
manifest_cache = {}
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    60
null_manifest  = manifest.Manifest()
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    61
tmpdir         = None
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    62
dry_run        = False
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    63
xport          = None
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    64
dest_xport     = None
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    65
pubs           = set()
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    66
target_pub     = None
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    67
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    68
def cleanup():
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    69
        """To be called at program finish."""
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    70
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    71
        if tmpdir:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    72
                shutil.rmtree(tmpdir, ignore_errors=True)
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    73
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    74
        if dry_run:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    75
                return
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    76
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    77
        # Attempt to kick off a refresh of target repository for each
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    78
        # publisher before exiting.
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    79
        for pfx in pubs:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    80
                target_pub.prefix = pfx
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    81
                try:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    82
                        dest_xport.publish_refresh_packages(target_pub)
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    83
                except apx.TransportError:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    84
                        # If this fails, ignore it as this was a last
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    85
                        # ditch attempt anyway.
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    86
                        break
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    87
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    88
def usage(errmsg="", exitcode=2):
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    89
        """Emit a usage message and optionally prefix it with a more specific
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    90
        error message.  Causes program to exit."""
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    91
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    92
        if errmsg:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    93
                emsg("pkgmerge: %s" % errmsg)
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    94
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    95
        msg(_("""\
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    96
Usage:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    97
        pkgmerge [-n] -d dest_repo -s variant=value[,...],src_repo ...
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    98
            [pkg_fmri_pattern ...]
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    99
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   100
Options:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   101
        -d dest_repo
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   102
                The filesystem path or URI of the target repository to publish
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   103
                the merged packages to.  The target repository must already
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   104
                exist; new repositories can be created using pkgrepo(1).
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   105
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   106
        -n
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   107
                Perform a trial run with no changes made to the target
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   108
                repository.
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   109
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   110
        -s variant=value,src_repo
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   111
                The variant name and value to use for packages from this source,
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   112
                followed by the filesystem path or URI of the source repository
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   113
                or package archive to retrieve packages from.  Multiple variants
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   114
                may be specified separated by commas.  The same variants must
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   115
                be named for all sources.  This option may be specified multiple
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   116
                times.
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   117
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   118
        --help or -?
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   119
                Displays a usage message.
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   120
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   121
Environment:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   122
        TMPDIR, TEMP, TMP
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   123
                The absolute path of the directory where temporary data should
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   124
                be stored during program execution.
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   125
"""))
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   126
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   127
        sys.exit(exitcode)
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   128
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   129
def error(text, exitcode=1):
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   130
        """Emit an error message prefixed by the command name """
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   131
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   132
        emsg("pkgmerge: %s" % text)
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   133
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   134
        if exitcode != None:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   135
                sys.exit(exitcode)
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   136
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   137
def get_tracker(quiet=False):
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   138
        if quiet:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   139
                progresstracker = progress.QuietProgressTracker()
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   140
        else:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   141
                try:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   142
                        progresstracker = \
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   143
                            progress.FancyUNIXProgressTracker()
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   144
                except progress.ProgressTrackerException:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   145
                        progresstracker = progress.CommandLineProgressTracker()
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   146
        return progresstracker
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   147
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   148
def load_catalog(repouri, pub):
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   149
        """Load catalog from specified uri"""
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   150
        # Pull catalog only from this host
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2284
diff changeset
   151
        pub.repository.origins = [repouri]
2240
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   152
        pub.refresh(full_refresh=True, immediate=True)
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   153
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   154
        catalog_dict[repouri.uri] = dict(
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   155
            (name, [
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   156
                entry
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   157
                for entry in pub.catalog.fmris_by_version(name)
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   158
            ])
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   159
            for name in pub.catalog.names()
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   160
        )
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   161
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   162
        # Discard catalog.
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   163
        pub.remove_meta_root()
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   164
        # XXX At the moment, the only way to force the publisher object to
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2284
diff changeset
   165
        # discard its copy of a catalog is to set repository.
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2284
diff changeset
   166
        pub.repository = pub.repository
2240
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   167
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   168
def get_all_pkg_names(repouri):
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   169
        return catalog_dict[repouri.uri].keys()
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   170
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   171
def get_manifest(repouri, fmri):
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   172
        """Fetch the manifest for package-fmri 'fmri' from the source
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   173
        in 'repouri'... return as Manifest object."""
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   174
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   175
        # support null manifests to keep lists ordered for merge
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   176
        if not fmri:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   177
                return null_manifest
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   178
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   179
        mfst_str = xport.get_manifest(fmri, pub=repouri, content_only=True)
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   180
        m = manifest.Manifest(fmri)
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   181
        m.set_content(content=mfst_str)
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   182
        return m
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   183
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   184
def main_func():
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   185
        global dry_run, tmpdir, xport, dest_xport, target_pub
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   186
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   187
        dest_repo     = None
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   188
        source_list   = []
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   189
        variant_list  = []
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   190
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   191
        try:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   192
                opts, pargs = getopt.getopt(sys.argv[1:], "d:ns:?", ["help"])
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   193
                for opt, arg in opts:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   194
                        if opt == "-d":
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   195
                                dest_repo = misc.parse_uri(arg)
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   196
                        elif opt == "-n":
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   197
                                dry_run = True
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   198
                        elif opt == "-s":
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   199
                                s = arg.split(",")
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   200
                                if len(s) < 2:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   201
                                        usage("-s option must specify "
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   202
                                            "variant=value,repo_uri")
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   203
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   204
                                # All but last part should be variant.
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   205
                                src_vars = {}
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   206
                                for v in s[:-1]:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   207
                                        try:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   208
                                                vname, vval = v.split("=")
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   209
                                        except ValueError:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   210
                                                usage("-s option must specify "
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   211
                                                    "variant=value,repo_uri")
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   212
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   213
                                        if not vname.startswith("variant."):
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   214
                                                vname = "variant.%s" % vname
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   215
                                        src_vars[vname] = vval
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   216
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   217
                                variant_list.append(src_vars)
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   218
                                source_list.append(publisher.RepositoryURI(
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   219
                                    misc.parse_uri(s[-1])))
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   220
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   221
                        if opt in ("--help", "-?"):
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   222
                                usage(exitcode=0)
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   223
        except getopt.GetoptError, e:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   224
                usage(_("illegal option -- %s") % e.opt)
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   225
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   226
        if not source_list:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   227
                usage(_("At least one variant name, value, and package source "
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   228
                   "must be provided using -s."))
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   229
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   230
        if not dest_repo:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   231
                usage(_("A destination package repository must be provided "
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   232
                    "using -d."))
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   233
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   234
        # Determine the unique set of variants across all sources.
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   235
        variants = set()
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   236
        vcombos = collections.defaultdict(set)
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   237
        for src_vars in variant_list:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   238
                for v, vval in src_vars.iteritems():
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   239
                        variants.add(v)
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   240
                        vcombos[v].add((v, vval))
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   241
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   242
        # merge_fmris() expects this to be a list.
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   243
        variants = list(variants)
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   244
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   245
        # Require that the user specified the same variants for all sources.
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   246
        for i, src_vars in enumerate(variant_list):
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   247
                missing = set(v for v in variants if v not in variant_list[i])
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   248
                if missing:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   249
                        missing = ", ".join(missing)
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   250
                        source = source_list[i]
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   251
                        usage(_("Source %(source)s missing values for "
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   252
                            "variants: %(missing)s") % locals())
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   253
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   254
        # Require that each unique variant combination has a source.
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   255
        for combo in itertools.product(*vcombos.values()):
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   256
                found = False
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   257
                for i, src in enumerate(source_list):
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   258
                        for vname, vval in combo:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   259
                                if variant_list[i].get(vname,
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   260
                                    None) != vval:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   261
                                        found = False
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   262
                                        break
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   263
                        else:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   264
                                found = True
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   265
                                break
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   266
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   267
                if not found:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   268
                        combo = " ".join(
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   269
                            "%s=%s" % (vname, vval)
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   270
                            for vname, vval in combo
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   271
                        )
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   272
                        usage(_("No source was specified for variant "
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   273
                            "combination %(combo)s.") % locals())
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   274
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   275
        # initialize transport
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   276
        # we use a single endpoint for now, since the transport code
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   277
        # uses publisher as a unique key... so we just flop the repo
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   278
        # list as needed to access the different catalogs/manifests/files.
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   279
        temp_root = misc.config_temp_root()
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   280
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   281
        tmpdir = tempfile.mkdtemp(dir=temp_root, prefix="pkgmerge")
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   282
        xport, xport_cfg = transport.setup_transport()
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   283
        xport_cfg.incoming_root = tmpdir
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   284
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   285
        pub = transport.setup_publisher(source_list,
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   286
            "pkgmerge", xport, xport_cfg, remote_prefix=True)
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   287
        cat_dir = tempfile.mkdtemp(dir=tmpdir)
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   288
        pub.meta_root = cat_dir
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   289
        pub.transport = xport
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   290
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   291
        # Use separate transport for destination repository in case source
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   292
        # and destination have identical publisher configuration.
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   293
        dest_xport, dest_xport_cfg = transport.setup_transport()
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   294
        dest_xport_cfg.incoming_root = tmpdir
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   295
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   296
        # retrieve catalogs for all specified repositories
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   297
        for s in source_list:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   298
                load_catalog(s, pub)
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   299
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   300
        # determine the list of packages we'll be processing
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   301
        if not pargs:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   302
                # use the latest versions and merge everything
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   303
                fmri_arguments = list(set(
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   304
                    name
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   305
                    for s in source_list
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   306
                    for name in get_all_pkg_names(s)
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   307
                ))
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   308
                exclude_args = []
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   309
        else:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   310
                fmri_arguments = [
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   311
                    f
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   312
                    for f in pargs
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   313
                    if not f.startswith("!")
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   314
                ]
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   315
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   316
                exclude_args = [
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   317
                    f[1:]
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   318
                    for f in pargs
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   319
                    if f.startswith("!")
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   320
                ]
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   321
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   322
        # build fmris to be merged
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   323
        masterlist = [
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   324
            build_merge_list(fmri_arguments, exclude_args, catalog_dict[s.uri])
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   325
            for s in source_list
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   326
        ]
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   327
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   328
        # check for unmatched patterns
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   329
        in_none = reduce(lambda x, y: x & y, (set(u) for d, u in masterlist))
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   330
        if in_none:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   331
                error(_("The following pattern(s) did not match any packages "
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   332
                    "in any of the specified repositories:\n%s") % "\n".join(
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   333
                    in_none))
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   334
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   335
        # generate set of all package names to be processed, and dict of lists
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   336
        # indexed by order in source_list; if that repo has no fmri for this
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   337
        # pkg then use None.
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   338
        allpkgs = set(name for d, u in masterlist for name in d)
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   339
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   340
        processdict = {}
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   341
        for p in allpkgs:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   342
                for d, u in masterlist:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   343
                        processdict.setdefault(p, []).append(d.setdefault(p,
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   344
                            None))
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   345
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   346
        # check to make sure all fmris are at same version modulo timestamp
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   347
        for entry in processdict:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   348
                if len(set([
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   349
                        str(a).rsplit(":")[0]
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   350
                        for a in processdict[entry]
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   351
                        if a is not None
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   352
                    ])) > 1:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   353
                        error(_("fmris matching the following patterns do not "
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   354
                            "have matching versions across all repositories: "
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   355
                            "%s") % processdict[entry])
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   356
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   357
        # we're ready to merge
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   358
        if not dry_run:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   359
                target_pub = transport.setup_publisher(dest_repo,
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   360
                    pub.prefix, dest_xport, dest_xport_cfg, remote_prefix=True)
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   361
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   362
        def get_basename(pfmri):
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   363
                open_time = pfmri.get_timestamp()
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   364
                return "%d_%s" % \
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   365
                    (calendar.timegm(open_time.utctimetuple()),
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   366
                    urllib.quote(str(pfmri), ""))
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   367
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   368
        tracker = get_tracker()
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   369
        tracker.republish_set_goal(len(processdict), 0, 0)
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   370
        for entry in processdict:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   371
                man, retrievals = merge_fmris(source_list,
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   372
                    processdict[entry], variant_list, variants)
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   373
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   374
                # Determine total bytes to retrieve for this package; this must
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   375
                # be done using the retrievals dict since they are coalesced by
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   376
                # hash.
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   377
                getbytes = sum(
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   378
                    misc.get_pkg_otw_size(a)
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   379
                    for i, uri in enumerate(source_list)
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   380
                    for a in retrievals[i]
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   381
                )
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   382
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   383
                # Determine total bytes to send for this package; this must be
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   384
                # done using the manifest since retrievals are coalesced based
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   385
                # on hash, but sends are not.
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   386
                sendbytes = sum(
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   387
                    int(a.attrs.get("pkg.size", 0))
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   388
                    for a in man.gen_actions()
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   389
                )
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   390
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   391
                f = man.fmri
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   392
                tracker.republish_start_pkg(f.pkg_name, getbytes=getbytes,
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   393
                    sendbytes=sendbytes)
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   394
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   395
                if dry_run:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   396
                        # Dry-run; attempt a merge of everything but don't
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   397
                        # write any data or publish packages.
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   398
                        tracker.republish_end_pkg()
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   399
                        continue
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   400
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   401
                pkgdir = tempfile.mkdtemp(dir=tmpdir)
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   402
                # Retrieve package data from each package source.
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   403
                for i, uri in enumerate(source_list):
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2284
diff changeset
   404
                        pub.repository.origins = [uri]
2240
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   405
                        mfile = xport.multi_file_ni(pub, pkgdir,
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   406
                            decompress=True, progtrack=tracker)
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   407
                        for a in retrievals[i]:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   408
                                mfile.add_action(a)
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   409
                        mfile.wait_files()
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   410
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   411
                # Publish merged package.
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   412
                try:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   413
                        trans_id = get_basename(f)
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   414
                        pkg_name = f.get_fmri()
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   415
                        target_pub.prefix = f.publisher
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   416
                        pubs.add(f.publisher)
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   417
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   418
                        t = trans.Transaction(dest_repo, pkg_name=pkg_name,
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   419
                            trans_id=trans_id, xport=dest_xport, pub=target_pub,
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   420
                            progtrack=tracker)
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   421
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   422
                        # Remove any previous failed attempt to
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   423
                        # to republish this package.
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   424
                        try:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   425
                                t.close(abandon=True)
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   426
                        except:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   427
                                # It might not exist already.
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   428
                                pass
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   429
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   430
                        t.open()
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   431
                        for a in man.gen_actions():
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   432
                                if (a.name == "set" and
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   433
                                    a.attrs["name"] == "pkg.fmri"):
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   434
                                        # To be consistent with the
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   435
                                        # server, the fmri can't be
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   436
                                        # added to the manifest.
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   437
                                        continue
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   438
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   439
                                if hasattr(a, "hash"):
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   440
                                        fname = os.path.join(pkgdir,
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   441
                                            a.hash)
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   442
                                        a.data = lambda: open(fname, "rb")
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   443
                                t.add(a)
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   444
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   445
                        # Always defer catalog update.
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   446
                        t.close(add_to_catalog=False)
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   447
                except trans.TransactionError, e:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   448
                        error(str(e))
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   449
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   450
                # Done with this package.
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   451
                tracker.republish_end_pkg()
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   452
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   453
                # Dump retrieved package data after each republication.
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   454
                shutil.rmtree(pkgdir)
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   455
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   456
        tracker.republish_done()
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   457
        tracker.reset()
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   458
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   459
        return 0
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   460
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   461
def merge_fmris(source_list, fmri_list, variant_list, variants):
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   462
        """Merge a list of manifests representing multiple variants,
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   463
        returning the merged manifest and a list of lists of actions to
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   464
        retrieve from each source"""
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   465
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   466
        # Merge each variant one at a time.
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   467
        merged = {}
2284
7e9dfdc8fc7c 17908 pkgmerge should have a blend mode
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2240
diff changeset
   468
        # where to find files...
7e9dfdc8fc7c 17908 pkgmerge should have a blend mode
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2240
diff changeset
   469
        hash_source = {}
7e9dfdc8fc7c 17908 pkgmerge should have a blend mode
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2240
diff changeset
   470
2240
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   471
        for i, variant in enumerate(variants):
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   472
                # Build the unique list of remaining variant combinations to
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   473
                # use for merging this variant.
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   474
                combos = set(
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   475
                    tuple(
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   476
                        (vname, src_vars[vname])
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   477
                        for vname in variants[i + 1:]
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   478
                    )
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   479
                    for src_vars in variant_list
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   480
                )
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   481
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   482
                if not combos:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   483
                        # If there are no other variants to combine, then simply
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   484
                        # combine all manifests.
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   485
                        combos = [()]
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   486
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   487
                # Perform the variant merge for each unique combination of
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   488
                # remaining variants.  For example, a pkgmerge of:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   489
                #   -s arch=sparc,debug=false,flavor=32,...
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   490
                #   -s arch=sparc,debug=false,flavor=64,...
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   491
                #   -s arch=sparc,debug=true,flavor=32,...
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   492
                #   -s arch=sparc,debug=true,flavor=64,...
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   493
                #   -s arch=i386,debug=false,flavor=32,...
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   494
                #   -s arch=i386,debug=false,flavor=64,...
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   495
                #   -s arch=i386,debug=true,flavor=32,...
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   496
                #   -s arch=i386,debug=true,flavor=64,...
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   497
                #
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   498
                # ...would produce the following combinations for each variant:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   499
                #   variant.arch
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   500
                #     debug=false, flavor=32
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   501
                #     debug=false, flavor=64
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   502
                #     debug=true, flavor=32
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   503
                #     debug=true, flavor=64
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   504
                #   variant.debug
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   505
                #     flavor=32
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   506
                #     flavor=64
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   507
                #   variant.flavor
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   508
                #
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   509
                for combo in combos:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   510
                        # Build the list of sources, fmris, and variant values
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   511
                        # involved in this particular combo merge.
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   512
                        slist = []
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   513
                        flist = []
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   514
                        vlist = []
2284
7e9dfdc8fc7c 17908 pkgmerge should have a blend mode
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2240
diff changeset
   515
                        sindex = []
2240
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   516
                        new_fmri = None
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   517
                        for j, src in enumerate(source_list):
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   518
                                if combo:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   519
                                        # If filtering on a specific combination
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   520
                                        # then skip this source if any of the
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   521
                                        # combination parameters don't match.
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   522
                                        skip = False
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   523
                                        for vname, vval in combo:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   524
                                                if variant_list[j].get(vname,
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   525
                                                    None) != vval:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   526
                                                        skip = True
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   527
                                                        break
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   528
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   529
                                        if skip:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   530
                                                continue
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   531
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   532
                                # Skip this source if it doesn't have a matching
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   533
                                # package to merge, or if it has already been
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   534
                                # merged with another package.
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   535
                                pfmri = fmri_list[j]
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   536
                                if not pfmri or \
2284
7e9dfdc8fc7c 17908 pkgmerge should have a blend mode
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2240
diff changeset
   537
                                    merged.get(id(pfmri), None) == null_manifest:
2240
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   538
                                        continue
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   539
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   540
                                # The newest FMRI in the set of manifests being
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   541
                                # merged will be used as the new FMRI of the
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   542
                                # merged package.
2284
7e9dfdc8fc7c 17908 pkgmerge should have a blend mode
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2240
diff changeset
   543
                                if new_fmri is None or pfmri.version > new_fmri.version:
2240
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   544
                                        new_fmri = pfmri
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   545
2284
7e9dfdc8fc7c 17908 pkgmerge should have a blend mode
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2240
diff changeset
   546
                                sindex.append(j)
2240
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   547
                                slist.append(src)
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   548
                                flist.append(pfmri)
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   549
                                vlist.append(variant_list[j][variant])
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   550
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   551
                        if not flist:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   552
                                # Nothing to merge for this combination.
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   553
                                continue
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   554
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   555
                        # Build the list of manifests to be merged.
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   556
                        mlist = []
2284
7e9dfdc8fc7c 17908 pkgmerge should have a blend mode
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2240
diff changeset
   557
                        for j, s, f in zip(sindex, slist, flist):
7e9dfdc8fc7c 17908 pkgmerge should have a blend mode
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2240
diff changeset
   558
                                if id(f) in merged:
2240
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   559
                                        # Manifest already merged before, use
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   560
                                        # the merged version.
2284
7e9dfdc8fc7c 17908 pkgmerge should have a blend mode
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2240
diff changeset
   561
                                        m = merged[id(f)]
2240
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   562
                                else:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   563
                                        # Manifest not yet merged, retrieve
2284
7e9dfdc8fc7c 17908 pkgmerge should have a blend mode
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2240
diff changeset
   564
                                        # from source; record those w/ payloads
7e9dfdc8fc7c 17908 pkgmerge should have a blend mode
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2240
diff changeset
   565
                                        # so we know from where to get them..
2240
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   566
                                        m = get_manifest(s, f)
2284
7e9dfdc8fc7c 17908 pkgmerge should have a blend mode
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2240
diff changeset
   567
                                        for a in m.gen_actions():
7e9dfdc8fc7c 17908 pkgmerge should have a blend mode
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2240
diff changeset
   568
                                                if a.has_payload:
7e9dfdc8fc7c 17908 pkgmerge should have a blend mode
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2240
diff changeset
   569
                                                        hash_source.setdefault(a.hash, j)
2240
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   570
                                mlist.append(m)
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   571
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   572
                        m = __merge_fmris(new_fmri, mlist, flist, vlist,
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   573
                            variant)
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   574
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   575
                        for f in flist:
2284
7e9dfdc8fc7c 17908 pkgmerge should have a blend mode
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2240
diff changeset
   576
                                if id(f) == id(new_fmri):
2240
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   577
                                        # This FMRI was used for the merged
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   578
                                        # manifest; any future merges should
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   579
                                        # use the merged manifest for this
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   580
                                        # FMRI.
2284
7e9dfdc8fc7c 17908 pkgmerge should have a blend mode
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2240
diff changeset
   581
                                        merged[id(f)] = m
2240
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   582
                                else:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   583
                                        # This package has been merged with
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   584
                                        # another so shouldn't be retrieved
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   585
                                        # or merged again.
2284
7e9dfdc8fc7c 17908 pkgmerge should have a blend mode
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2240
diff changeset
   586
                                        merged[id(f)] = null_manifest
2240
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   587
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   588
        # Merge process should have resulted in a single non-null manifest.
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   589
        m = [v for v in merged.values() if v != null_manifest]
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   590
        assert len(m) == 1
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   591
        m = m[0]
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   592
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   593
        # Finally, build a list of actions to retrieve based on position in
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   594
        # source_list.
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   595
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   596
        retrievals = [list() for i in source_list]
2284
7e9dfdc8fc7c 17908 pkgmerge should have a blend mode
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2240
diff changeset
   597
2240
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   598
        for a in m.gen_actions():
2284
7e9dfdc8fc7c 17908 pkgmerge should have a blend mode
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2240
diff changeset
   599
                if a.has_payload:
7e9dfdc8fc7c 17908 pkgmerge should have a blend mode
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2240
diff changeset
   600
                        source = hash_source.pop(a.hash, None)
7e9dfdc8fc7c 17908 pkgmerge should have a blend mode
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2240
diff changeset
   601
                        if source is not None:
7e9dfdc8fc7c 17908 pkgmerge should have a blend mode
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2240
diff changeset
   602
                                retrievals[source].append(a)
2240
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   603
        return m, retrievals
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   604
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   605
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   606
def __merge_fmris(new_fmri, manifest_list, fmri_list, variant_list, variant):
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   607
        """Private merge implementation."""
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   608
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   609
        # Remove variant tags, package variant metadata, and signatures
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   610
        # from manifests since we're reassigning.  This allows merging
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   611
        # pre-tagged, already merged pkgs, or signed packages.
2284
7e9dfdc8fc7c 17908 pkgmerge should have a blend mode
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2240
diff changeset
   612
7e9dfdc8fc7c 17908 pkgmerge should have a blend mode
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2240
diff changeset
   613
        blended_actions = []
7e9dfdc8fc7c 17908 pkgmerge should have a blend mode
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2240
diff changeset
   614
        blend_names = set([variant, variant[8:]])
7e9dfdc8fc7c 17908 pkgmerge should have a blend mode
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2240
diff changeset
   615
2240
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   616
        for j, m in enumerate(manifest_list):
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   617
                deleted_count = 0
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   618
                vval = variant_list[j]
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   619
                for i, a in enumerate(m.actions[:]):
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   620
                        if a.name == "signature" or \
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   621
                            (a.name == "set" and a.attrs["name"] == "pkg.fmri"):
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   622
                                # signatures and pkg.fmri actions are no longer
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   623
                                # valid after merging
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   624
                                del m.actions[i - deleted_count]
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   625
                                deleted_count += 1
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   626
                                continue
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   627
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   628
                        if variant in a.attrs:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   629
                                if a.attrs[variant] != vval:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   630
                                        # we have an already merged
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   631
                                        # manifest; filter out actions
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   632
                                        # for other variants
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   633
                                        del m.actions[i - deleted_count]
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   634
                                        deleted_count += 1
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   635
                                        continue
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   636
                                else:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   637
                                        del a.attrs[variant]
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   638
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   639
                        if a.name == "set" and a.attrs["name"] == variant:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   640
                                if vval not in a.attrlist("value"):
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   641
                                        error(_("package %(pkg)s is tagged as "
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   642
                                            "not supporting %(var_name)s "
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   643
                                            "%(var_value)s") % {
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   644
                                            "pkg": fmri_list[j],
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   645
                                            "var_name": variant,
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   646
                                            "var_value": vval })
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   647
                                del m.actions[i - deleted_count]
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   648
                                deleted_count += 1
2284
7e9dfdc8fc7c 17908 pkgmerge should have a blend mode
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2240
diff changeset
   649
                        # checking if we're supposed to blend this action
7e9dfdc8fc7c 17908 pkgmerge should have a blend mode
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2240
diff changeset
   650
                        # for this variant.  Handle prepended "variant.".
7e9dfdc8fc7c 17908 pkgmerge should have a blend mode
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2240
diff changeset
   651
                        if blend_names & set(a.attrlist("pkg.merge.blend")):
7e9dfdc8fc7c 17908 pkgmerge should have a blend mode
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2240
diff changeset
   652
                                blended_actions.append((j, a))
7e9dfdc8fc7c 17908 pkgmerge should have a blend mode
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2240
diff changeset
   653
7e9dfdc8fc7c 17908 pkgmerge should have a blend mode
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2240
diff changeset
   654
        # add blended actions to other manifests
7e9dfdc8fc7c 17908 pkgmerge should have a blend mode
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2240
diff changeset
   655
        for j, m in enumerate(manifest_list):
7e9dfdc8fc7c 17908 pkgmerge should have a blend mode
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2240
diff changeset
   656
                for k, a in blended_actions:
7e9dfdc8fc7c 17908 pkgmerge should have a blend mode
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2240
diff changeset
   657
                        if k != j:
7e9dfdc8fc7c 17908 pkgmerge should have a blend mode
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2240
diff changeset
   658
                                m.actions.append(a)
2240
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   659
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   660
        # Like the unix utility comm, except that this function
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   661
        # takes an arbitrary number of manifests and compares them,
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   662
        # returning a tuple consisting of each manifest's actions
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   663
        # that are not the same for all manifests, followed by a
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   664
        # list of actions that are the same in each manifest.
2284
7e9dfdc8fc7c 17908 pkgmerge should have a blend mode
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2240
diff changeset
   665
        try:
7e9dfdc8fc7c 17908 pkgmerge should have a blend mode
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2240
diff changeset
   666
                action_lists = list(manifest.Manifest.comm(manifest_list))
7e9dfdc8fc7c 17908 pkgmerge should have a blend mode
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2240
diff changeset
   667
        except manifest.ManifestError, e:
7e9dfdc8fc7c 17908 pkgmerge should have a blend mode
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2240
diff changeset
   668
                error("Duplicate action(s) in package \"%s\": \n%s" %
7e9dfdc8fc7c 17908 pkgmerge should have a blend mode
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2240
diff changeset
   669
                    (new_fmri.pkg_name, e))
2240
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   670
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   671
        # Declare new package FMRI.
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   672
        action_lists[-1].insert(0,
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   673
            actions.fromstr("set name=pkg.fmri value=%s" % new_fmri))
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   674
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   675
        for a_list, v in zip(action_lists[:-1], variant_list):
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   676
                for a in a_list:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   677
                        a.attrs[variant] = v
2284
7e9dfdc8fc7c 17908 pkgmerge should have a blend mode
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2240
diff changeset
   678
        # discard any blend tags for this variant from common list
7e9dfdc8fc7c 17908 pkgmerge should have a blend mode
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2240
diff changeset
   679
        for a in action_lists[-1]:
7e9dfdc8fc7c 17908 pkgmerge should have a blend mode
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2240
diff changeset
   680
                blend_attrs = set(a.attrlist("pkg.merge.blend"))
7e9dfdc8fc7c 17908 pkgmerge should have a blend mode
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2240
diff changeset
   681
                match = blend_names & blend_attrs
7e9dfdc8fc7c 17908 pkgmerge should have a blend mode
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2240
diff changeset
   682
                for m in list(match):
7e9dfdc8fc7c 17908 pkgmerge should have a blend mode
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2240
diff changeset
   683
                        if len(blend_attrs) == 1:
7e9dfdc8fc7c 17908 pkgmerge should have a blend mode
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2240
diff changeset
   684
                                del a.attrs["pkg.merge.blend"]
7e9dfdc8fc7c 17908 pkgmerge should have a blend mode
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2240
diff changeset
   685
                        else:
7e9dfdc8fc7c 17908 pkgmerge should have a blend mode
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2240
diff changeset
   686
                                a.attrlist("pkg.merge.blend").remove(m)
2240
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   687
        # combine actions into single list
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   688
        allactions = reduce(lambda a, b: a + b, action_lists)
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   689
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   690
        # figure out which variants are actually there for this pkg
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   691
        actual_variant_list = [
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   692
            v
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   693
            for m, v in zip(manifest_list, variant_list)
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   694
        ]
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   695
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   696
        # add set action to document which variants are supported
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   697
        allactions.append(actions.fromstr("set name=%s %s" % (variant,
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   698
            " ".join([
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   699
                "value=%s" % a
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   700
                for a in actual_variant_list
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   701
            ])
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   702
        )))
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   703
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   704
        allactions.sort()
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   705
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   706
        m = manifest.Manifest(pfmri=new_fmri)
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   707
        m.set_content(content=allactions)
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   708
        return m
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   709
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   710
def build_merge_list(include, exclude, cat):
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   711
        """Given a list of patterns to include and a list of patterns
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   712
        to exclude, return a dictionary of fmris to be included,
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   713
        along w/ a list of include patterns that don't match"""
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   714
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   715
        include_dict, include_misses = match_user_fmris(include, cat)
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   716
        exclude_dict, ignored = match_user_fmris(exclude, cat)
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   717
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   718
        for pkg_name in include_dict:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   719
                if pkg_name in exclude_dict:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   720
                        include_dict[pkg_name] -= exclude_dict[pkg_name]
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   721
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   722
        return dict((k, sorted(list(v), reverse=True)[0])
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   723
                    for k,v in include_dict.iteritems()
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   724
                    if v), include_misses
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   725
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   726
def match_user_fmris(patterns, cat):
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   727
        """Given a user-specified list of patterns, return a dictionary
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   728
        of matching fmri sets:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   729
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   730
        {pkgname: [fmri, ... ]
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   731
         pkgname: [fmri, ... ]
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   732
         ...
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   733
        }
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   734
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   735
        Note that patterns starting w/ pkg:/ require an exact match;
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   736
        patterns containing '*' will using fnmatch rules; the default
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   737
        trailing match rules are used for remaining patterns.
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   738
        """
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   739
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   740
        matchers = []
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   741
        fmris    = []
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   742
        versions = []
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   743
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   744
        # ignore dups
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   745
        patterns = list(set(patterns))
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   746
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   747
        # figure out which kind of matching rules to employ
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   748
        latest_pats = set()
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   749
        for pat in patterns:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   750
                try:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   751
                        parts = pat.split("@", 1)
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   752
                        pat_stem = parts[0]
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   753
                        pat_ver = None
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   754
                        if len(parts) > 1:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   755
                                pat_ver = parts[1]
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   756
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   757
                        if "*" in pat_stem or "?" in pat_stem:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   758
                                matcher = pkg.fmri.glob_match
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   759
                        elif pat_stem.startswith("pkg:/") or \
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   760
                            pat_stem.startswith("/"):
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   761
                                matcher = pkg.fmri.exact_name_match
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   762
                        else:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   763
                                matcher = pkg.fmri.fmri_match
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   764
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   765
                        if matcher == pkg.fmri.glob_match:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   766
                                fmri = pkg.fmri.MatchingPkgFmri(
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   767
                                    pat_stem, BUILD_RELEASE)
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   768
                        else:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   769
                                fmri = pkg.fmri.PkgFmri(
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   770
                                    pat_stem, BUILD_RELEASE)
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   771
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   772
                        if not pat_ver:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   773
                                # Do nothing.
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   774
                                pass
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   775
                        elif "*" in pat_ver or "?" in pat_ver or \
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   776
                            pat_ver == "latest":
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   777
                                fmri.version = \
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   778
                                    pkg.version.MatchingVersion(pat_ver,
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   779
                                        BUILD_RELEASE)
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   780
                        else:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   781
                                fmri.version = \
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   782
                                    pkg.version.Version(pat_ver,
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   783
                                        BUILD_RELEASE)
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   784
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   785
                        if pat_ver and \
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   786
                            getattr(fmri.version, "match_latest", None):
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   787
                                latest_pats.add(pat)
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   788
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   789
                        matchers.append(matcher)
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   790
                        versions.append(fmri.version)
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   791
                        fmris.append(fmri)
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   792
                except (pkg.fmri.FmriError,
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   793
                    pkg.version.VersionError), e:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   794
                        error(str(e))
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   795
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   796
        # Create a dictionary of patterns, with each value being a
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   797
        # dictionary of pkg names & fmris that match that pattern.
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   798
        ret = dict(zip(patterns, [dict() for i in patterns]))
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   799
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   800
        for name in cat.keys():
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   801
                for pat, matcher, fmri, version in \
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   802
                    zip(patterns, matchers, fmris, versions):
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   803
                        if not matcher(name, fmri.pkg_name):
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   804
                                continue # name doesn't match
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   805
                        for ver, pfmris in cat[name]:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   806
                                if version and not ver.is_successor(version,
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   807
                                    pkg.version.CONSTRAINT_AUTO):
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   808
                                        continue # version doesn't match
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   809
                                for f in pfmris:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   810
                                        ret[pat].setdefault(f.pkg_name,
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   811
                                            []).append(f)
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   812
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   813
        # Discard all but the newest version of each match.
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   814
        if latest_pats:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   815
                # Rebuild ret based on latest version of every package.
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   816
                latest = {}
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   817
                nret = {}
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   818
                for p in patterns:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   819
                        if p not in latest_pats or not ret[p]:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   820
                                nret[p] = ret[p]
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   821
                                continue
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   822
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   823
                        nret[p] = {}
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   824
                        for pkg_name in ret[p]:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   825
                                nret[p].setdefault(pkg_name, [])
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   826
                                for f in ret[p][pkg_name]:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   827
                                        nver = latest.get(f.pkg_name, None)
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   828
                                        latest[f.pkg_name] = max(nver,
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   829
                                            f.version)
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   830
                                        if f.version == latest[f.pkg_name]:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   831
                                                # Allow for multiple FMRIs of
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   832
                                                # the same latest version.
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   833
                                                nret[p][pkg_name] = [
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   834
                                                    e
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   835
                                                    for e in nret[p][pkg_name]
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   836
                                                    if e.version == f.version
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   837
                                                ]
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   838
                                                nret[p][pkg_name].append(f)
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   839
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   840
                # Assign new version of ret and discard latest list.
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   841
                ret = nret
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   842
                del latest
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   843
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   844
        # merge patterns together and create sets
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   845
        merge_dict = {}
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   846
        for d in ret.values():
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   847
                merge_dict.update(d)
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   848
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   849
        for k in merge_dict:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   850
                merge_dict[k] = set(merge_dict[k])
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   851
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   852
        unmatched_patterns = [
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   853
            p
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   854
            for p in ret
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   855
            if not ret[p]
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   856
        ]
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   857
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   858
        return merge_dict, unmatched_patterns
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   859
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   860
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   861
if __name__ == "__main__":
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   862
        misc.setlocale(locale.LC_ALL, "", error)
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   863
        gettext.install("pkg", "/usr/share/locale")
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   864
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   865
        # Make all warnings be errors.
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   866
        import warnings
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   867
        warnings.simplefilter('error')
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   868
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   869
        try:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   870
                __ret = main_func()
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   871
        except (pkg.actions.ActionError, trans.TransactionError,
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   872
            RuntimeError, pkg.fmri.FmriError, apx.ApiException), __e:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   873
                print >> sys.stderr, "pkgmerge: %s" % __e
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   874
                __ret = 1
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   875
        except (PipeError, KeyboardInterrupt):
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   876
                __ret = 1
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   877
        except SystemExit, __e:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   878
                raise __e
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   879
        except Exception, __e:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   880
                traceback.print_exc()
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   881
                error(_("""\n
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   882
This is an internal error in pkg(5) version %(version)s.  Please let the
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   883
developers know about this problem by including the information above (and
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   884
this message) when filing a bug at:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   885
2284
7e9dfdc8fc7c 17908 pkgmerge should have a blend mode
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2240
diff changeset
   886
%(bug_uri)s""") % { "version": pkg.VERSION, "bug_uri": misc.BUG_URI_CLI },
7e9dfdc8fc7c 17908 pkgmerge should have a blend mode
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2240
diff changeset
   887
                    exitcode=None)
2240
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   888
                __ret = 99
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   889
        finally:
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   890
                cleanup()
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   891
de59b73f1428 14965 merge should be productized
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   892
        sys.exit(__ret)