pkg_merge/merge.py
author Jon Tibble <meths@btinternet.com>
Thu, 03 May 2012 18:34:11 +0100
changeset 575 a99c06dc8ffa
parent 509 c3b231caabc4
permissions -rwxr-xr-x
Added tag oi_151a_prestable3 for changeset 54f799203c89
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
509
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
     1
#!/usr/bin/python2.6
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
     2
#
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
     3
# CDDL HEADER START
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
     4
#
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
     5
# The contents of this file are subject to the terms of the
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
     6
# Common Development and Distribution License (the "License").
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
     7
# You may not use this file except in compliance with the License.
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
     8
#
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
     9
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    10
# or http://www.opensolaris.org/os/licensing.
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    11
# See the License for the specific language governing permissions
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    12
# and limitations under the License.
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    13
#
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    14
# When distributing Covered Code, include this CDDL HEADER in each
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    15
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    16
# If applicable, add the following below this CDDL HEADER, with the
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    17
# fields enclosed by brackets "[]" replaced with your own identifying
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    18
# information: Portions Copyright [yyyy] [name of copyright owner]
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    19
#
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    20
# CDDL HEADER END
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    21
#
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    22
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    23
#
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    24
# Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    25
#
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    26
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    27
import sys
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    28
import os
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    29
import traceback
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    30
import getopt
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    31
import urllib
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    32
import tempfile
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    33
import gettext
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    34
import shutil
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    35
import warnings
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    36
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    37
import pkg.fmri
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    38
import pkg.client.api_errors as apx
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    39
import pkg.client.publisher as publisher
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    40
import pkg.client.transport.transport as transport
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    41
import pkg.actions as actions
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    42
import pkg.manifest as manifest
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    43
import pkg.version as version
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    44
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    45
from pkg.misc import PipeError
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    46
from pkg.client import global_settings
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    47
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    48
pub = None
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    49
tmpdirs = []
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    50
xport = None
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    51
xport_cfg = None
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    52
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    53
def pname():
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    54
        return os.path.basename(sys.argv[0])
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    55
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    56
def usage(usage_error = None):
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    57
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    58
        if usage_error:
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    59
                error(usage_error)
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    60
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    61
        print >> sys.stderr, _("""\
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    62
Usage:
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    63
        %s -r [-d dir] [-n] -v varname,url -v varname,url [-v varname,url ...] variant_type  pkgname [pkgname ...]
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    64
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    65
        example:
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    66
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    67
        %s -r -d /tmp/merge -n -v sparc,http://server1 -v i386,http://server2 arch entire
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    68
        """ % (pname(), pname()))
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    69
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    70
        sys.exit(2)
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    71
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    72
def error(error):
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    73
        """ Emit an error message prefixed by the command name """
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    74
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    75
        print >> sys.stderr, pname() + ": " + error
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    76
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    77
def fetch_files_byaction(repouri, actions, pkgdir):
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    78
        """Given a list of files named by content hash, download from
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    79
        repouri into pkgdir."""
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    80
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    81
        mfile = xport.multi_file_ni(repouri, pkgdir, decompress=True)
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    82
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    83
        for a in actions:
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    84
                mfile.add_action(a) 
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    85
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    86
        mfile.wait_files()
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    87
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    88
manifest_cache = {}
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    89
null_manifest = manifest.Manifest()
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    90
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    91
def get_manifest(repouri, fmri):
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    92
        if not fmri: # no matching fmri
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    93
                return null_manifest
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    94
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    95
        key = "%s->%s" % (repouri.uri, fmri)
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    96
        if key not in manifest_cache:
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    97
                manifest_cache[key] = fetch_manifest(repouri, fmri)
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    98
        return manifest_cache[key]
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
    99
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   100
def fetch_manifest(repouri, fmri):
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   101
        """Fetch the manifest for package-fmri 'fmri' from the server
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   102
        in 'server_url'... return as Manifest object."""
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   103
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   104
        mfst_str = xport.get_manifest(fmri, pub=repouri, content_only=True)
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   105
        m = manifest.Manifest(fmri)
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   106
        m.set_content(content=mfst_str)
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   107
        return m
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   108
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   109
def fetch_catalog(repouri):
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   110
        """Fetch the catalog from the server_url."""
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   111
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   112
        if not pub.meta_root:
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   113
                # Create a temporary directory for catalog.
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   114
                cat_dir = tempfile.mkdtemp()
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   115
                tmpdirs.append(cat_dir)
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   116
                pub.meta_root = cat_dir
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   117
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   118
        pub.transport = xport
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   119
        # Pull catalog only from this host
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   120
        pub.selected_repository.origins = [repouri]
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   121
        pub.refresh(True, True)
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   122
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   123
        cat = pub.catalog
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   124
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   125
        return cat
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   126
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   127
catalog_dict = {}
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   128
def load_catalog(repouri):
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   129
        c = fetch_catalog(repouri)
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   130
        d = {}
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   131
        for f in c.fmris():
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   132
                if f.pkg_name in d:
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   133
                        d[f.pkg_name].append(f)
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   134
                else:
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   135
                        d[f.pkg_name] = [f]
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   136
                for k in d.keys():
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   137
                        d[k].sort(reverse = True)
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   138
        catalog_dict[repouri.uri] = d
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   139
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   140
def expand_fmri(repouri, fmri_string, constraint=version.CONSTRAINT_AUTO):
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   141
        """ from specified server, find matching fmri using CONSTRAINT_AUTO
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   142
        cache for performance.  Returns None if no matching fmri is found """
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   143
        if repouri.uri not in catalog_dict:
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   144
                load_catalog(repouri)
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   145
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   146
        fmri = pkg.fmri.PkgFmri(fmri_string, "5.11")
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   147
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   148
        for f in catalog_dict[repouri.uri].get(fmri.pkg_name, []):
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   149
                if not fmri.version or f.version.is_successor(fmri.version, constraint):
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   150
                        return f
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   151
        return None
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   152
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   153
def get_all_pkg_names(repouri):
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   154
        """ return all the pkg_names in this catalog """
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   155
        if repouri.uri not in catalog_dict:
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   156
                load_catalog(repouri)
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   157
        return catalog_dict[repouri.uri].keys()
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   158
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   159
def get_dependencies(repouri, fmri_list):
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   160
        s = set()
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   161
        for f in fmri_list:
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   162
                fmri = expand_fmri(repouri, f)
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   163
                _get_dependencies(s, repouri, fmri)
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   164
        return s
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   165
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   166
def _get_dependencies(s, repouri, fmri):
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   167
        """ recursive incorp expansion"""
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   168
        s.add(fmri)
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   169
        for a in get_manifest(repouri, fmri).gen_actions_by_type("depend"):
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   170
                if a.attrs["type"] == "incorporate":
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   171
                        new_fmri = expand_fmri(repouri, a.attrs["fmri"])
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   172
                        if new_fmri and new_fmri not in s:
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   173
                                _get_dependencies(s, repouri, new_fmri)
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   174
        return s
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   175
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   176
def cleanup():
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   177
        """To be called at program finish."""
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   178
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   179
        for d in tmpdirs:
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   180
                shutil.rmtree(d, True)
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   181
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   182
def main_func():
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   183
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   184
        global pub, xport, xport_cfg
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   185
        basedir = None
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   186
        newfmri = False
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   187
        incomingdir = None
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   188
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   189
        gettext.install("pkg", "/usr/share/locale")
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   190
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   191
        global_settings.client_name = "pkgmerge"
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   192
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   193
        try:
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   194
                opts, pargs = getopt.getopt(sys.argv[1:], "d:nrv:")
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   195
        except getopt.GetoptError, e:
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   196
                usage(_("Illegal option -- %s") % e.opt)
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   197
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   198
        varlist = []
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   199
        recursive = False
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   200
        get_files = True
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   201
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   202
        for opt, arg in opts:
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   203
                if opt == "-d":
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   204
                        basedir = arg
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   205
                if opt == "-v":
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   206
                        varlist.append(arg)
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   207
                if opt == "-r":
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   208
                        recursive = True
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   209
                if opt == "-n":
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   210
                        get_files = False
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   211
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   212
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   213
        if len(varlist) < 2:
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   214
                usage(_("at least two -v arguments needed to merge"))
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   215
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   216
        if not basedir:
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   217
                basedir = os.getcwd()
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   218
        
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   219
        incomingdir = os.path.normpath(os.path.join(basedir,
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   220
            "incoming-%d" % os.getpid()))
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   221
        os.makedirs(incomingdir)
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   222
        tmpdirs.append(incomingdir)
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   223
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   224
        server_list = [
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   225
            publisher.RepositoryURI(v.split(",", 1)[1])
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   226
            for v in varlist
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   227
        ]
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   228
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   229
        xport, xport_cfg = transport.setup_transport()
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   230
        xport_cfg.incoming_root = incomingdir
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   231
        pub = transport.setup_publisher(server_list, "merge", xport, xport_cfg,
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   232
            remote_prefix=True)
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   233
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   234
        if len(pargs) == 1:
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   235
                recursive = False
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   236
                overall_set = set()
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   237
                for s in server_list:
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   238
                        for name in get_all_pkg_names(s):
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   239
                                overall_set.add(name)
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   240
                fmri_arguments = list(overall_set)
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   241
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   242
        else:
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   243
                fmri_arguments = pargs[1:]
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   244
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   245
        if not pargs:
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   246
                usage(_("you must specify a variant"))
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   247
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   248
        variant = "variant.%s" % pargs[0]
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   249
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   250
        variant_list = [
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   251
                v.split(",", 1)[0]
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   252
                for v in varlist
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   253
                ]
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   254
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   255
        fmri_expansions = []
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   256
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   257
        if recursive:
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   258
                overall_set = set()
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   259
                for s in server_list:
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   260
                        deps = get_dependencies(s, fmri_arguments)
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   261
                        for d in deps:
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   262
                                if d:
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   263
                                        q = str(d).rsplit(":", 1)[0]
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   264
                                        overall_set.add(q)
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   265
                fmri_arguments = list(overall_set)
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   266
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   267
        fmri_arguments.sort()
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   268
        print "Processing %d packages" % len(fmri_arguments)
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   269
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   270
        for fmri in fmri_arguments:
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   271
                try:
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   272
                        fmri_list = [
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   273
                                expand_fmri(s, fmri)
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   274
                                for s in server_list
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   275
                                ]
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   276
                        if len(set([
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   277
                                   str(f).rsplit(":", 1)[0]
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   278
                                   for f in fmri_list
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   279
                                   if f
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   280
                                   ])) != 1:
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   281
                                error("fmris at different versions: %s" % fmri_list)
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   282
                                continue
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   283
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   284
                except pkg.fmri.IllegalFmri:
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   285
                        error(_("pkgfmri error"))
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   286
                        return 1
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   287
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   288
                for f in fmri_list:
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   289
                        if f:
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   290
                                basename = f.get_name()
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   291
                                break
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   292
                else:
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   293
                        error("No package of name %s in specified catalogs %s; ignoring." %\
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   294
                                      (fmri, server_list))
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   295
                        continue
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   296
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   297
                merge_fmris(server_list, fmri_list, variant_list, variant, basedir, basename, get_files)
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   298
        cleanup()
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   299
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   300
        return 0
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   301
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   302
def merge_fmris(server_list, fmri_list, variant_list, variant, basedir,
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   303
    basename, get_files):
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   304
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   305
        manifest_list = [
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   306
                get_manifest(s, f)
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   307
                for s, f in zip(server_list, fmri_list)
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   308
                ]
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   309
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   310
        # remove variant tags and package variant metadata
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   311
        # from manifests since we're reassigning...
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   312
        # this allows merging pre-tagged packages
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   313
        for m in manifest_list:
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   314
                for i, a in enumerate(m.actions[:]):
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   315
                        if variant in a.attrs:
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   316
                                del a.attrs[variant]
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   317
                        if a.name == "set" and a.attrs["name"] == variant:
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   318
                                del m.actions[i]
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   319
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   320
        action_lists = manifest.Manifest.comm(*tuple(manifest_list))
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   321
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   322
        # set fmri actions require special merge logic.
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   323
        set_fmris = []
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   324
        for l in action_lists:
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   325
                for i, a in enumerate(l):
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   326
                        if not (a.name == "set" and
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   327
                            a.attrs["name"] == "pkg.fmri"):
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   328
                                continue
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   329
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   330
                        set_fmris.append(a)
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   331
                        del l[i]
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   332
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   333
        # If set fmris are present, then only the most recent one
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   334
        # and add it back to the last action list.
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   335
        if set_fmris:
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   336
                def order(a, b):
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   337
                        f1 = pkg.fmri.PkgFmri(a.attrs["value"], "5.11")
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   338
                        f2 = pkg.fmri.PkgFmri(b.attrs["value"], "5.11")
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   339
                        return cmp(f1, f2)
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   340
                set_fmris.sort(cmp=order)
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   341
                action_lists[-1].insert(0, set_fmris[-1])
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   342
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   343
        for a_list, v in zip(action_lists[0:-1], variant_list):
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   344
                for a in a_list:
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   345
                        a.attrs[variant] = v
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   346
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   347
        # combine actions into single list
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   348
        allactions = reduce(lambda a, b: a + b, action_lists)
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   349
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   350
        # figure out which variants are actually there for this pkg
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   351
        actual_variant_list = [
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   352
                v
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   353
                for m, v in zip(manifest_list, variant_list)
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   354
                if m != null_manifest
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   355
                ]
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   356
        print "Merging %s for %s" % (basename, actual_variant_list)
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   357
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   358
        # add set action to document which variants are supported
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   359
        allactions.append(actions.fromstr("set name=%s %s" % (variant,
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   360
            " ".join(["value=%s" % a
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   361
                      for a in actual_variant_list
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   362
                      ]))))
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   363
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   364
        allactions.sort()
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   365
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   366
        m = manifest.Manifest()
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   367
        m.set_content(content=allactions)
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   368
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   369
        # urlquote to avoid problems w/ fmris w/ '/' character in name
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   370
        basedir = os.path.join(basedir, urllib.quote(basename, ""))
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   371
        if not os.path.exists(basedir):
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   372
                os.makedirs(basedir)
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   373
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   374
        m_path = os.path.join(basedir, "manifest")
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   375
        m.store(m_path)
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   376
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   377
        for f in fmri_list:
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   378
                if f:
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   379
                        fmri = str(f).rsplit(":", 1)[0]
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   380
                        break
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   381
        f_file = file(os.path.join(basedir, "fmri"), "w")
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   382
        f_file.write(fmri)
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   383
        f_file.close()
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   384
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   385
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   386
        if get_files:
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   387
                # generate list of hashes for each server; last is commom
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   388
                already_seen = {}
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   389
                def repeated(a, d):
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   390
                        if a in d:
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   391
                                return True
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   392
                        d[a] = 1
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   393
                        return False
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   394
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   395
                action_sets = [
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   396
                        set(
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   397
                                [
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   398
                                 a
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   399
                                 for a in action_list
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   400
                                 if hasattr(a, "hash") and not \
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   401
                                 repeated(a.hash, already_seen)
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   402
                                ]
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   403
                                )
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   404
                        for action_list in action_lists
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   405
                        ]
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   406
                # remove duplicate files (save time)
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   407
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   408
                for server, action_set in zip(server_list + [server_list[0]],
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   409
                    action_sets):
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   410
                        if len(action_set) > 0:
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   411
                                fetch_files_byaction(server, action_set,
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   412
                                    basedir)
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   413
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   414
        return 0
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   415
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   416
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   417
if __name__ == "__main__":
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   418
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   419
        # Make all warnings be errors.
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   420
        warnings.simplefilter('error')
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   421
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   422
        try:
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   423
                ret = main_func()
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   424
        except (apx.InvalidDepotResponseException, apx.TransportError,
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   425
            apx.BadRepositoryURI, apx.UnsupportedRepositoryURI), e:
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   426
                cleanup()
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   427
                print >> sys.stderr, e
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   428
                sys.exit(1)
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   429
        except SystemExit, e:
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   430
                cleanup()
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   431
                raise e
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   432
        except (PipeError, KeyboardInterrupt):
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   433
                # We don't want to display any messages here to prevent
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   434
                # possible further broken pipe (EPIPE) errors.
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   435
                cleanup()
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   436
                sys.exit(1)
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   437
        except:
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   438
                traceback.print_exc()
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   439
                cleanup()
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   440
                sys.exit(99)
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   441
        sys.exit(ret)
c3b231caabc4 IPS transition (g11n (main) part; supplement 2)
asano
parents:
diff changeset
   442