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-- |
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) |