src/pull.py
author Shawn Walker <srw@sun.com>
Fri, 11 Sep 2009 05:01:08 -0500
changeset 1352 5c92c9d342ef
parent 1132 1abf9cf8f69c
child 1431 62b6033670e4
permissions -rwxr-xr-x
11065 client v1 catalog support for v0 catalogs 269 Catalog should include package dependencies 318 Unify depot and client pkg format 2763 pkg.catalog should have a function to split entries into appropriate fields 3045 pkg list tracebacks when installed state directory is out of sync with pkg directory 5562 catalog uses local time instead of UTC 8341 extract catalog cache from image 8473 cached catalog data can be wrong if mixing client versions 9248 client traceback if preferred publisher not in catalog cache 10041 catalog attrs can be out of sync with catalog 11071 pkg list -v doesn't show full FMRI for those from a preferred publisher 11072 client double instantiates image on startup 11074 manifests need sha-1 signature 11075 catalog should provide manifest signature data
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
409
713e20963dc2 2314 shebang lines should use minimum python version
Shawn Walker <swalker@opensolaris.org>
parents: 375
diff changeset
     1
#!/usr/bin/python2.4
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
     2
#
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
     3
# CDDL HEADER START
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
     4
#
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
     5
# The contents of this file are subject to the terms of the
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
     6
# Common Development and Distribution License (the "License").
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
     7
# You may not use this file except in compliance with the License.
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
     8
#
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
     9
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    10
# or http://www.opensolaris.org/os/licensing.
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    11
# See the License for the specific language governing permissions
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    12
# and limitations under the License.
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    13
#
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    14
# When distributing Covered Code, include this CDDL HEADER in each
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    15
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    16
# If applicable, add the following below this CDDL HEADER, with the
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    17
# fields enclosed by brackets "[]" replaced with your own identifying
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    18
# information: Portions Copyright [yyyy] [name of copyright owner]
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    19
#
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    20
# CDDL HEADER END
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    21
#
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    22
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    23
#
971
67d3507036ab 2422 error/usage message program identification is inconsistent in pkgrecv
Tom Mueller <Tom.Mueller@sun.com>
parents: 856
diff changeset
    24
# Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    25
# Use is subject to license terms.
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    26
#
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    27
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    28
import calendar
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    29
import getopt
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    30
import gettext
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    31
import os
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    32
import shutil
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    33
import sys
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    34
import tempfile
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    35
import traceback
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    36
import urllib
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    37
import urlparse
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    38
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    39
import pkg.client.progress as progress
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    40
import pkg.fmri
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    41
import pkg.manifest as manifest
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    42
import pkg.pkgtarfile as ptf
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    43
import pkg.portable as portable
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    44
import pkg.publish.transaction as trans
1352
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1132
diff changeset
    45
import pkg.server.catalog as catalog
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    46
import pkg.server.config as config
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    47
import pkg.server.repository as repo
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    48
import pkg.server.repositoryconfig as rc
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    49
import pkg.version as version
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    50
696
6bbfd2dece6f 4371 user-agent string needs to be different for different client front-ends
Danek Duvall <danek.duvall@sun.com>
parents: 440
diff changeset
    51
from pkg.client import global_settings
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    52
from pkg.misc import (emsg, get_pkg_otw_size, gunzip_from_stream, msg,
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    53
    versioned_urlopen, PipeError)
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    54
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    55
# Globals
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    56
complete_catalog = None
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    57
repo_cache = {}
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    58
tmpdirs = []
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    59
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    60
def error(text):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    61
        """Emit an error message prefixed by the command name """
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    62
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    63
        # If we get passed something like an Exception, we can convert
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    64
        # it down to a string.
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    65
        text = str(text)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    66
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    67
        # If the message starts with whitespace, assume that it should come
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    68
        # *before* the command-name prefix.
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    69
        text_nows = text.lstrip()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    70
        ws = text[:len(text) - len(text_nows)]
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    71
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    72
        # This has to be a constant value as we can't reliably get our actual
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    73
        # program name on all platforms.
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    74
        emsg(ws + "pkgrecv: " + text_nows)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    75
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    76
def usage(usage_error=None, retcode=2):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    77
        """Emit a usage message and optionally prefix it with a more specific
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    78
        error message.  Causes program to exit."""
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    79
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    80
        if usage_error:
971
67d3507036ab 2422 error/usage message program identification is inconsistent in pkgrecv
Tom Mueller <Tom.Mueller@sun.com>
parents: 856
diff changeset
    81
                error(usage_error)
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    82
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    83
        msg(_("""\
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    84
Usage:
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    85
        pkgrecv [-s src_repo_uri] [-d (path|dest_uri)] [-k] [-m] [-n] [-r]
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    86
            (fmri|pattern) ...
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    87
        pkgrecv [-s src_repo_uri] -n
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    88
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    89
Options:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    90
        -d path_or_uri  The path of a directory to save the retrieved package
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    91
                        to, or the URI of a repository to republish it to.  If
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    92
                        not provided, the default value is the current working
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    93
                        directory.  If a directory path is provided, then
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    94
                        package content will only be retrieved if it does not
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    95
                        already exist in the target directory.  If a repository
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    96
                        URI is provided, a temporary directory will be created
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    97
                        and all of the package data retrieved before attempting
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    98
                        to republish it.
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    99
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   100
        -h              Display this usage message.
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   101
        -k              Keep the retrieved package content compressed, ignored
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   102
                        when republishing.  Should not be used with pkgsend.
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   103
        -m match        Controls matching behaviour using the following values:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   104
                            all-timestamps
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   105
                                includes all matching timestamps, not just
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   106
                                latest (implies all-versions)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   107
                            all-versions
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   108
                                includes all matching versions, not just latest
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   109
        -n              List the most recent versions of the packages available
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   110
                        from the specified repository and exit (all other
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   111
                        options except -s will be ignored).
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   112
        -r              Recursively evaluates all dependencies for the provided
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   113
                        list of packages and adds them to the list.
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   114
        -s src_repo_uri A URI representing the location of a pkg(5)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   115
                        repository to retrieve package data from.
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   116
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   117
Environment:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   118
        PKG_DEST        Destination directory or repository URI
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   119
        PKG_SRC         Source repository URI"""))
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   120
        sys.exit(retcode)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   121
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   122
def cleanup():
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   123
        """To be called at program finish."""
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   124
        for d in tmpdirs:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   125
                shutil.rmtree(d, True)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   126
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   127
def abort(err=None, retcode=1):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   128
        """To be called when a fatal error is encountered."""
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   129
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   130
        if err:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   131
                # Clear any possible output first.
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   132
                msg("")
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   133
                error(err)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   134
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   135
        cleanup()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   136
        sys.exit(retcode)
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   137
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   138
def get_tracker(quiet=False):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   139
        if quiet:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   140
                progresstracker = progress.QuietProgressTracker()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   141
        else:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   142
                try:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   143
                        progresstracker = \
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   144
                            progress.FancyUNIXProgressTracker()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   145
                except progress.ProgressTrackerException:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   146
                        progresstracker = progress.CommandLineProgressTracker()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   147
        return progresstracker
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   148
1132
1abf9cf8f69c 9206 pkgrecv'd packages may not have matching comment in manifest
Shawn Walker <srw@sun.com>
parents: 1118
diff changeset
   149
def get_manifest(src_uri, pfmri, basedir, contents=False):
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   150
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   151
        m = None
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   152
        pkgdir = os.path.join(basedir, pfmri.get_dir_path())
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   153
        mpath = os.path.join(pkgdir, "manifest")
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   154
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   155
        raw = None
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   156
        overwrite = False
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   157
        if not os.path.exists(mpath):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   158
                raw = fetch_manifest(src_uri, pfmri)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   159
                overwrite = True
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   160
        else:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   161
                try:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   162
                        raw = file(mpath, "rb").read()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   163
                except:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   164
                        abort(err=_("Unable to load manifest '%s' for package "
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   165
                            " '%s'.") % (mpath, pfmri))
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   166
1132
1abf9cf8f69c 9206 pkgrecv'd packages may not have matching comment in manifest
Shawn Walker <srw@sun.com>
parents: 1118
diff changeset
   167
        if contents:
1abf9cf8f69c 9206 pkgrecv'd packages may not have matching comment in manifest
Shawn Walker <srw@sun.com>
parents: 1118
diff changeset
   168
                return raw
1abf9cf8f69c 9206 pkgrecv'd packages may not have matching comment in manifest
Shawn Walker <srw@sun.com>
parents: 1118
diff changeset
   169
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   170
        try:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   171
                m = manifest.CachedManifest(pfmri, basedir, None,
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   172
                    contents=raw)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   173
        except:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   174
                abort(err=_("Unable to parse manifest '%s' for package "
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   175
                    "'%s'") % (mpath, pfmri))
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   176
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   177
        if overwrite:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   178
                # Overwrite the manifest file so that the on-disk version will
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   179
                # be consistent with the server (due to fmri addition).
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   180
                try:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   181
                        f = open(mpath, "wb")
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   182
                        f.write(raw)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   183
                        f.close()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   184
                except:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   185
                        abort(err=_("Unable to write manifest '%s' for package "
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   186
                           " '%s'.") % (mpath, pfmri))
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   187
        return m
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   188
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   189
def get_repo(uri):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   190
        if uri in repo_cache:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   191
                return repo_cache[uri]
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   192
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   193
        parts = urlparse.urlparse(uri, "file", allow_fragments=0)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   194
        path = urllib.url2pathname(parts[2])
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   195
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   196
        scfg = config.SvrConfig(path, None, None)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   197
        scfg.set_read_only()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   198
        try:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   199
                scfg.init_dirs()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   200
        except (config.SvrConfigError, EnvironmentError), e:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   201
                raise repo.RepositoryError(_("An error occurred while "
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   202
                    "trying to initialize the repository directory "
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   203
                    "structures:\n%s") % e)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   204
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   205
        scfg.acquire_in_flight()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   206
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   207
        try:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   208
                scfg.acquire_catalog()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   209
        except catalog.CatalogPermissionsException, e:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   210
                raise repo.RepositoryError(str(e))
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   211
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   212
        try:
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   213
                repo_cache[uri] = repo.Repository(scfg)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   214
        except rc.InvalidAttributeValueError, e:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   215
                raise repo.RepositoryError(_("The specified repository's "
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   216
                    "configuration data is not valid:\n%s") % e)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   217
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   218
        return repo_cache[uri]
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   219
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   220
def fetch_manifest(src_uri, pfmri):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   221
        """Return the manifest data for package-fmri 'fmri' from the repository
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   222
        at 'src_uri'."""
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   223
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   224
        if src_uri.startswith("file://"):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   225
                try:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   226
                        r = get_repo(src_uri)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   227
                        m = file(r.manifest(pfmri), "rb")
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   228
                except (EnvironmentError, repo.RepositoryError), e:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   229
                        abort(err=e)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   230
        else:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   231
                # Request manifest from repository.
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   232
                try:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   233
                        m = versioned_urlopen(src_uri, "manifest", [0],
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   234
                            pfmri.get_url_path())[0]
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   235
                except Exception, e:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   236
                        abort(err=_("Unable to retrieve manifest %s from "
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   237
                            "%s: %s") % (pfmri.get_url_path(), src_uri, e))
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   238
                except:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   239
                        abort()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   240
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   241
        # Read from repository, return to caller.
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   242
        try:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   243
                mfst_str = m.read()
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   244
        except:
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   245
                abort(err=_("Error occurred while reading from: %s") % src_uri)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   246
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   247
        if hasattr(m, "close"):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   248
                m.close()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   249
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   250
        return mfst_str
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   251
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   252
def expand_fmri(pfmri, constraint=version.CONSTRAINT_AUTO):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   253
        """Find matching fmri using CONSTRAINT_AUTO cache for performance.
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   254
        Returns None if no matching fmri is found."""
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   255
        if isinstance(pfmri, str):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   256
                pfmri = pkg.fmri.PkgFmri(pfmri, "5.11")
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   257
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   258
        for f in complete_catalog.get(pfmri.pkg_name, []):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   259
                if not pfmri.version or \
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   260
                    f.version.is_successor(pfmri.version, constraint):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   261
                        return f
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   262
        return
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   263
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   264
def expand_matching_fmris(fmri_list, pfmri_strings):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   265
        """find matching fmris using pattern matching and
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   266
        constraint auto."""
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   267
        counthash = {}
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   268
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   269
        try:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   270
                patterns = [
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   271
                    pkg.fmri.MatchingPkgFmri(s, "5.11")
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   272
                    for s in pfmri_strings
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   273
                ]
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   274
        except pkg.fmri.FmriError, e:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   275
                abort(err=e)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   276
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   277
        matches = catalog.extract_matching_fmris(fmri_list,
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   278
            patterns=patterns, constraint=version.CONSTRAINT_AUTO,
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   279
            counthash=counthash, matcher=pkg.fmri.glob_match)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   280
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   281
        bail = False
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   282
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   283
        for f in patterns:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   284
                if f not in counthash:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   285
                        emsg(_("No match found for %s") % f.pkg_name)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   286
                        bail = True
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   287
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   288
        if bail:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   289
                abort()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   290
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   291
        return matches
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   292
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   293
def get_dependencies(src_uri, fmri_list, basedir, tracker):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   294
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   295
        old_limit = sys.getrecursionlimit()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   296
        # The user may be recursing 'entire' or 'redistributable'.
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   297
        sys.setrecursionlimit(3000)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   298
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   299
        s = set()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   300
        for f in fmri_list:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   301
                pfmri = expand_fmri(f)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   302
                _get_dependencies(src_uri, s, pfmri, basedir, tracker)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   303
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   304
        # Restore the previous default.
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   305
        sys.setrecursionlimit(old_limit)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   306
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   307
        return list(s)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   308
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   309
def _get_dependencies(src_uri, s, pfmri, basedir, tracker):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   310
        """Expand all dependencies."""
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   311
        tracker.evaluate_progress(fmri=pfmri)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   312
        s.add(pfmri)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   313
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   314
        m = get_manifest(src_uri, pfmri, basedir)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   315
        for a in m.gen_actions_by_type("depend"):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   316
                new_fmri = expand_fmri(a.attrs["fmri"])
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   317
                if new_fmri and new_fmri not in s:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   318
                        _get_dependencies(src_uri, s, new_fmri, basedir,
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   319
                            tracker)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   320
        return s
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   321
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   322
def get_hashes_and_sizes(m):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   323
        """Returns a dict of hashes and transfer sizes of actions with content
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   324
        in a manifest."""
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   325
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   326
        seen_hashes = set()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   327
        def repeated(a):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   328
                if a in seen_hashes:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   329
                        return True
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   330
                seen_hashes.add(a)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   331
                return False
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   332
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   333
        cshashes = {}
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   334
        for atype in ("file", "license"):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   335
                for a in m.gen_actions_by_type(atype):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   336
                        if hasattr(a, "hash") and not repeated(a.hash):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   337
                                sz = int(a.attrs.get("pkg.size", 0))
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   338
                                csize = int(a.attrs.get("pkg.csize", 0))
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   339
                                otw_sz = get_pkg_otw_size(a)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   340
                                cshashes[a.hash] = (sz, csize, otw_sz)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   341
        return cshashes
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   342
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   343
def prune(fmri_list, all_versions, all_timestamps):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   344
        """Returns a filtered version of fmri_list based on the provided
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   345
        parameters."""
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   346
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   347
        if all_timestamps:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   348
                pass
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   349
        elif all_versions:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   350
                dedup = {}
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   351
                for f in fmri_list:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   352
                        dedup.setdefault(f.get_short_fmri(), []).append(f)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   353
                fmri_list = [sorted(dedup[f], reverse=True)[0] for f in dedup]
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   354
        else:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   355
                dedup = {}
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   356
                for f in fmri_list:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   357
                        dedup.setdefault(f.pkg_name, []).append(f)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   358
                fmri_list = [sorted(dedup[f], reverse=True)[0] for f in dedup]
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   359
        return fmri_list
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   360
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   361
def fetch_files_byhash(src_uri, cshashes, destdir, keep_compressed, tracker):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   362
        """Given a list of tuples containing content hash, and size and download
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   363
        the content from src_uri into destdir."""
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   364
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   365
        def valid_file(h):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   366
                # XXX this should check data digest
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   367
                fname = os.path.join(destdir, h)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   368
                if os.path.exists(fname):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   369
                        if keep_compressed:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   370
                                sz = cshashes[h][1]
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   371
                        else:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   372
                                sz = cshashes[h][0]
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   373
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   374
                        if sz == 0:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   375
                                return True
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   376
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   377
                        try:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   378
                                fs = os.stat(fname)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   379
                        except:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   380
                                pass
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   381
                        else:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   382
                                if fs.st_size == sz:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   383
                                        return True
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   384
                return False
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   385
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   386
        if src_uri.startswith("file://"):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   387
                try:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   388
                        r = get_repo(src_uri)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   389
                except repo.RepositoryError, e:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   390
                        abort(err=e)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   391
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   392
                for h in cshashes.keys():
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   393
                        dest = os.path.join(destdir, h)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   394
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   395
                        # Check to see if the file already exists first, so the
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   396
                        # user can continue interrupted pkgrecv operations.
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   397
                        retrieve = not valid_file(h)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   398
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   399
                        try:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   400
                                if retrieve and keep_compressed:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   401
                                        src = r.file(h)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   402
                                        shutil.copy(src, dest)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   403
                                elif retrieve:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   404
                                        src = file(r.file(h), "rb")
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   405
                                        outfile = open(dest, "wb")
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   406
                                        gunzip_from_stream(src, outfile)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   407
                                        outfile.close()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   408
                        except (EnvironmentError,
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   409
                            repo.RepositoryError), e:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   410
                                try:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   411
                                        portable.remove(dest)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   412
                                except:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   413
                                        pass
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   414
                                abort(err=e)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   415
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   416
                        tracker.download_add_progress(1, cshashes[h][2])
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   417
                return
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   418
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   419
        req_dict = {}
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   420
        for i, k in enumerate(cshashes.keys()):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   421
                # Check to see if the file already exists first, so the user can
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   422
                # continue interrupted pkgrecv operations.
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   423
                if valid_file(k):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   424
                        tracker.download_add_progress(1, cshashes[k][2])
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   425
                        continue
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   426
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   427
                entry = "File-Name-%s" % i
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   428
                req_dict[entry] = k
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   429
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   430
        req_str = urllib.urlencode(req_dict)
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   431
        if not req_str:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   432
                # Nothing to retrieve.
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   433
                return
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   434
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   435
        tmpdir = tempfile.mkdtemp()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   436
        tmpdirs.append(tmpdir)
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   437
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   438
        try:
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   439
                f = versioned_urlopen(src_uri, "filelist", [0],
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   440
                    data=req_str)[0]
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   441
        except:
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   442
                abort(err=_("Unable to retrieve content from: %s") % src_uri)
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   443
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   444
        tar_stream = ptf.PkgTarFile.open(mode = "r|", fileobj = f)
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   445
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   446
        for info in tar_stream:
420
0b6ecdba5641 2272 pkgrecv should uncompress by default
Brad Hall <bhall@eng.sun.com>
parents: 409
diff changeset
   447
                gzfobj = None
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   448
                try:
420
0b6ecdba5641 2272 pkgrecv should uncompress by default
Brad Hall <bhall@eng.sun.com>
parents: 409
diff changeset
   449
                        if not keep_compressed:
0b6ecdba5641 2272 pkgrecv should uncompress by default
Brad Hall <bhall@eng.sun.com>
parents: 409
diff changeset
   450
                                # Uncompress as we retrieve the files
0b6ecdba5641 2272 pkgrecv should uncompress by default
Brad Hall <bhall@eng.sun.com>
parents: 409
diff changeset
   451
                                gzfobj = tar_stream.extractfile(info)
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   452
                                fpath = os.path.join(tmpdir,
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   453
                                    info.name)
420
0b6ecdba5641 2272 pkgrecv should uncompress by default
Brad Hall <bhall@eng.sun.com>
parents: 409
diff changeset
   454
                                outfile = open(fpath, "wb")
0b6ecdba5641 2272 pkgrecv should uncompress by default
Brad Hall <bhall@eng.sun.com>
parents: 409
diff changeset
   455
                                gunzip_from_stream(gzfobj, outfile)
0b6ecdba5641 2272 pkgrecv should uncompress by default
Brad Hall <bhall@eng.sun.com>
parents: 409
diff changeset
   456
                                outfile.close()
0b6ecdba5641 2272 pkgrecv should uncompress by default
Brad Hall <bhall@eng.sun.com>
parents: 409
diff changeset
   457
                                gzfobj.close()
0b6ecdba5641 2272 pkgrecv should uncompress by default
Brad Hall <bhall@eng.sun.com>
parents: 409
diff changeset
   458
                        else:
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   459
                                # We want to keep the files compressed
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   460
                                # on disk.
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   461
                                tar_stream.extract_to(info, tmpdir,
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   462
                                    info.name)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   463
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   464
                        # Copy the file into place (rename can cause a cross-
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   465
                        # link device failure) and then remove the original.
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   466
                        src = os.path.join(tmpdir, info.name)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   467
                        shutil.copy(src, os.path.join(destdir, info.name))
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   468
                        portable.remove(src)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   469
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   470
                        tracker.download_add_progress(1, cshashes[info.name][2])
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   471
                except KeyboardInterrupt:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   472
                        raise
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   473
                except:
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   474
                        abort(err=_("Unable to extract file: %s") % info.name)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   475
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   476
        shutil.rmtree(tmpdirs.pop(), True)
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   477
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   478
        tar_stream.close()
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   479
        f.close()
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   480
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   481
def list_newest_fmris(fmri_list):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   482
        """List the provided fmris."""
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   483
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   484
        fm_hash = {}
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   485
        fm_list = []
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   486
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   487
        # Order all fmris by package name
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   488
        for f in sorted(fmri_list):
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   489
                if f.pkg_name in fm_hash:
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   490
                        fm_hash[f.pkg_name].append(f)
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   491
                else:
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   492
                        fm_hash[f.pkg_name] = [ f ]
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   493
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   494
        # sort each fmri list
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   495
        for k in fm_hash.keys():
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   496
                fm_hash[k].sort(reverse = True)
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   497
                l = fm_hash[k]
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   498
                fm_list.append(l[0])
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   499
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   500
        for e in fm_list:
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   501
                msg(e)
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   502
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   503
def fetch_catalog(src_uri, tracker):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   504
        """Fetch the catalog from src_uri."""
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   505
        global complete_catalog
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   506
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   507
        tracker.catalog_start(src_uri)
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   508
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   509
        if src_uri.startswith("file://"):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   510
                try:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   511
                        r = get_repo(src_uri)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   512
                        c = r.catalog()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   513
                except repo.RepositoryError, e:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   514
                        error(e)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   515
                        abort()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   516
        else:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   517
                # open connection for catalog
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   518
                try:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   519
                        c = versioned_urlopen(src_uri, "catalog", [0])[0]
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   520
                except:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   521
                        abort(err=_("Unable to download catalog from: %s") % \
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   522
                            src_uri)
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   523
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   524
        # Create a temporary directory for catalog.
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   525
        cat_dir = tempfile.mkdtemp()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   526
        tmpdirs.append(cat_dir)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   527
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   528
        # Call catalog.recv to retrieve catalog.
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   529
        try:
1352
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1132
diff changeset
   530
                catalog.ServerCatalog.recv(c, cat_dir)
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1132
diff changeset
   531
        except Exception, e:
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1132
diff changeset
   532
                abort(err=_("Error: %s while reading from: %s") % (e, src_uri))
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   533
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   534
        if hasattr(c, "close"):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   535
                c.close()
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   536
1352
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1132
diff changeset
   537
        cat = catalog.ServerCatalog(cat_dir, read_only=True)
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   538
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   539
        d = {}
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   540
        fmri_list = []
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   541
        for f in cat.fmris():
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   542
                fmri_list.append(f)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   543
                d.setdefault(f.pkg_name, [f]).append(f)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   544
        for k in d.keys():
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   545
                d[k].sort(reverse=True)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   546
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   547
        complete_catalog = d
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   548
        tracker.catalog_done()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   549
        return fmri_list
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   550
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   551
def main_func():
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   552
        all_timestamps = False
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   553
        all_versions = False
420
0b6ecdba5641 2272 pkgrecv should uncompress by default
Brad Hall <bhall@eng.sun.com>
parents: 409
diff changeset
   554
        keep_compressed = False
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   555
        list_newest = False
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   556
        recursive = False
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   557
        src_uri = None
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   558
        target = None
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   559
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   560
        # XXX /usr/lib/locale is OpenSolaris-specific.
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   561
        gettext.install("pkgrecv", "/usr/lib/locale")
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   562
696
6bbfd2dece6f 4371 user-agent string needs to be different for different client front-ends
Danek Duvall <danek.duvall@sun.com>
parents: 440
diff changeset
   563
        global_settings.client_name = "pkgrecv"
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   564
        target = os.environ.get("PKG_DEST", None)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   565
        src_uri = os.environ.get("PKG_SRC", None)
696
6bbfd2dece6f 4371 user-agent string needs to be different for different client front-ends
Danek Duvall <danek.duvall@sun.com>
parents: 440
diff changeset
   566
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   567
        try:
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   568
                opts, pargs = getopt.getopt(sys.argv[1:], "d:hkm:nrs:")
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   569
        except getopt.GetoptError, e:
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   570
                usage(_("Illegal option -- %s") % e.opt)
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   571
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   572
        for opt, arg in opts:
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   573
                if opt == "-d":
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   574
                        target = arg
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   575
                elif opt == "-h":
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   576
                        usage(retcode=0)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   577
                elif opt == "-k":
420
0b6ecdba5641 2272 pkgrecv should uncompress by default
Brad Hall <bhall@eng.sun.com>
parents: 409
diff changeset
   578
                        keep_compressed = True
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   579
                elif opt == "-n":
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   580
                        list_newest = True
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   581
                elif opt == "-r":
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   582
                        recursive = True
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   583
                elif opt == "-s":
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   584
                        src_uri = arg
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   585
                elif opt == "-m":
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   586
                        if arg == "all-timestamps":
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   587
                                all_timestamps = True
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   588
                        elif arg == "all-versions":
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   589
                                all_versions = True
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   590
                        else:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   591
                                usage(_("Illegal option value -- %s") % arg)
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   592
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   593
        if not src_uri:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   594
                usage(_("a source repository must be provided"))
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   595
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   596
        tracker = get_tracker()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   597
        if list_newest:
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   598
                if pargs or len(pargs) > 0:
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   599
                        usage(_("-n takes no options"))
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   600
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   601
                fmri_list = fetch_catalog(src_uri, tracker)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   602
                list_newest_fmris(fmri_list)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   603
                return 0
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   604
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   605
        if pargs == None or len(pargs) == 0:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   606
                usage(_("must specify at least one pkgfmri"))
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   607
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   608
        all_fmris = fetch_catalog(src_uri, tracker)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   609
        fmri_arguments = pargs
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   610
        fmri_list = prune(list(set(expand_matching_fmris(all_fmris,
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   611
            fmri_arguments))), all_versions, all_timestamps)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   612
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   613
        create_repo = False
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   614
        defer_refresh = False
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   615
        republish = False
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   616
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   617
        if not target:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   618
                target = basedir = os.getcwd()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   619
        elif target.find("://") != -1:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   620
                basedir = tempfile.mkdtemp()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   621
                tmpdirs.append(basedir)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   622
                republish = True
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   623
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   624
                # Files have to be decompressed for republishing.
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   625
                keep_compressed = False
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   626
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   627
                # Automatically create repository at target location if it
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   628
                # doesn't exist.
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   629
                if target.startswith("file://"):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   630
                        create_repo = True
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   631
                        # For efficiency, and publishing speed, don't update
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   632
                        # indexes until all file publishing is finished.
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   633
                        defer_refresh = True
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   634
        else:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   635
                basedir = target
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   636
                if not os.path.exists(basedir):
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   637
                        try:
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   638
                                os.makedirs(basedir, 0755)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   639
                        except:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   640
                                error(_("Unable to create basedir '%s'.") % \
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   641
                                    basedir)
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   642
                                return 1
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   643
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   644
        if recursive:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   645
                msg(_("Retrieving manifests for dependency evaluation ..."))
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   646
                tracker.evaluate_start()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   647
                fmri_list = prune(get_dependencies(src_uri, fmri_list, basedir,
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   648
                    tracker), all_versions, all_timestamps)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   649
                tracker.evaluate_done()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   650
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   651
        def get_basename(pfmri):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   652
                open_time = pfmri.get_timestamp()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   653
                return "%d_%s" % \
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   654
                    (calendar.timegm(open_time.utctimetuple()),
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   655
                    urllib.quote(str(pfmri), ""))
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   656
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   657
        # First, retrieve the manifests and calculate package transfer sizes.
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   658
        npkgs = len(fmri_list)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   659
        nfiles = 0
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   660
        nbytes = 0
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   661
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   662
        if not recursive:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   663
                msg(_("Retrieving manifests for package evaluation ..."))
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   664
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   665
        tracker.evaluate_start(npkgs=npkgs)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   666
        retrieve_list = []
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   667
        while fmri_list:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   668
                f = fmri_list.pop()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   669
                m = get_manifest(src_uri, f, basedir)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   670
                cshashes = get_hashes_and_sizes(m)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   671
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   672
                for entry in cshashes.itervalues():
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   673
                        nfiles += 1
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   674
                        nbytes += entry[2]
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   675
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   676
                retrieve_list.append((f, cshashes))
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   677
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   678
                tracker.evaluate_progress(fmri=f)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   679
        tracker.evaluate_done()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   680
        tracker.reset()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   681
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   682
        # Next, retrieve and store the content for each package.
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   683
        msg(_("Retrieving package content ..."))
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   684
        tracker.download_set_goal(len(retrieve_list), nfiles, nbytes)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   685
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   686
        publish_list = []
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   687
        while retrieve_list:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   688
                f, cshashes = retrieve_list.pop()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   689
                tracker.download_start_pkg(f.get_fmri(include_scheme=False))
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   690
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   691
                if len(cshashes) > 0:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   692
                        pkgdir = os.path.join(basedir, f.get_dir_path())
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   693
                        fetch_files_byhash(src_uri, cshashes, pkgdir,
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   694
                            keep_compressed, tracker)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   695
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   696
                if republish:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   697
                        publish_list.append(f)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   698
                tracker.download_end_pkg()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   699
        tracker.download_done()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   700
        tracker.reset()
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   701
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   702
        # Finally, republish the packages if needed.
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   703
        while publish_list:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   704
                f = publish_list.pop()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   705
                msg(_("Republishing %s ...") % f)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   706
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   707
                m = get_manifest(src_uri, f, basedir)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   708
1132
1abf9cf8f69c 9206 pkgrecv'd packages may not have matching comment in manifest
Shawn Walker <srw@sun.com>
parents: 1118
diff changeset
   709
                # Get first line of original manifest so that inclusion of the
1abf9cf8f69c 9206 pkgrecv'd packages may not have matching comment in manifest
Shawn Walker <srw@sun.com>
parents: 1118
diff changeset
   710
                # scheme can be determined.
1abf9cf8f69c 9206 pkgrecv'd packages may not have matching comment in manifest
Shawn Walker <srw@sun.com>
parents: 1118
diff changeset
   711
                use_scheme = True
1abf9cf8f69c 9206 pkgrecv'd packages may not have matching comment in manifest
Shawn Walker <srw@sun.com>
parents: 1118
diff changeset
   712
                contents = get_manifest(src_uri, f, basedir, contents=True)
1abf9cf8f69c 9206 pkgrecv'd packages may not have matching comment in manifest
Shawn Walker <srw@sun.com>
parents: 1118
diff changeset
   713
                if contents.splitlines()[0].find("pkg:/") == -1:
1abf9cf8f69c 9206 pkgrecv'd packages may not have matching comment in manifest
Shawn Walker <srw@sun.com>
parents: 1118
diff changeset
   714
                        use_scheme = False
1abf9cf8f69c 9206 pkgrecv'd packages may not have matching comment in manifest
Shawn Walker <srw@sun.com>
parents: 1118
diff changeset
   715
1abf9cf8f69c 9206 pkgrecv'd packages may not have matching comment in manifest
Shawn Walker <srw@sun.com>
parents: 1118
diff changeset
   716
                pkg_name = f.get_fmri(include_scheme=use_scheme)
1abf9cf8f69c 9206 pkgrecv'd packages may not have matching comment in manifest
Shawn Walker <srw@sun.com>
parents: 1118
diff changeset
   717
                pkgdir = os.path.join(basedir, f.get_dir_path())
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   718
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   719
                # This is needed so any previous failures for a package
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   720
                # can be aborted.
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   721
                trans_id = get_basename(f)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   722
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   723
                try:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   724
                        t = trans.Transaction(target, create_repo=create_repo,
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   725
                            pkg_name=pkg_name, trans_id=trans_id)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   726
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   727
                        # Remove any previous failed attempt to
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   728
                        # to republish this package.
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   729
                        try:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   730
                                t.close(abandon=True)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   731
                        except:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   732
                                # It might not exist already.
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   733
                                pass
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   734
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   735
                        t.open()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   736
                        for a in m.gen_actions():
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   737
                                if a.name == "set" and \
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   738
                                    a.attrs.get("name", "") == "fmri":
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   739
                                        # To be consistent with the server,
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   740
                                        # the fmri can't be added to the
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   741
                                        # manifest.
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   742
                                        continue
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   743
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   744
                                if hasattr(a, "hash"):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   745
                                        fname = os.path.join(pkgdir,
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   746
                                            a.hash)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   747
                                        a.data = lambda: open(fname,
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   748
                                            "rb")
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   749
                                t.add(a)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   750
                        t.close(refresh_index=not defer_refresh)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   751
                except trans.TransactionError, e:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   752
                        abort(err=e)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   753
                        return 1
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   754
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   755
        # Dump all temporary data.
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   756
        cleanup()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   757
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   758
        if republish:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   759
                if defer_refresh:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   760
                        msg(_("Refreshing repository search indices ..."))
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   761
                        try:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   762
                                t = trans.Transaction(target)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   763
                                t.refresh_index()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   764
                        except trans.TransactionError, e:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   765
                                error(e)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   766
                                return 1
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   767
        return 0
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   768
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   769
if __name__ == "__main__":
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   770
        try:
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   771
                __ret = main_func()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   772
        except (pkg.actions.ActionError, trans.TransactionError,
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   773
            RuntimeError), _e:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   774
                error(_e)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   775
                cleanup()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   776
                __ret = 1
440
cbd8cd1564a9 2104 pkgrecv: Spurious error message while downloading package with no files
Brad Hall <bhall@eng.sun.com>
parents: 420
diff changeset
   777
        except (PipeError, KeyboardInterrupt):
cbd8cd1564a9 2104 pkgrecv: Spurious error message while downloading package with no files
Brad Hall <bhall@eng.sun.com>
parents: 420
diff changeset
   778
                # We don't want to display any messages here to prevent
cbd8cd1564a9 2104 pkgrecv: Spurious error message while downloading package with no files
Brad Hall <bhall@eng.sun.com>
parents: 420
diff changeset
   779
                # possible further broken pipe (EPIPE) errors.
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   780
                cleanup()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   781
                __ret = 1
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   782
        except SystemExit, _e:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   783
                cleanup()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   784
                raise _e
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   785
        except:
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   786
                cleanup()
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   787
                traceback.print_exc()
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   788
                error(
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   789
                    _("\n\nThis is an internal error.  Please let the "
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   790
                    "developers know about this\nproblem by filing a bug at "
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   791
                    "http://defect.opensolaris.org and including the\nabove "
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   792
                    "traceback and this message.  The version of pkg(5) is "
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   793
                    "'%s'.") % pkg.VERSION)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   794
                __ret = 99
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   795
        sys.exit(__ret)