2011-03-19 19:30:56 +01:00
|
|
|
import pkg_resources
|
|
|
|
from pip.basecommand import Command
|
2012-09-12 00:07:37 +02:00
|
|
|
from pip.exceptions import DistributionNotFound, BestVersionAlreadyInstalled
|
2011-07-09 12:34:15 +02:00
|
|
|
from pip.index import PackageFinder
|
|
|
|
from pip.log import logger
|
|
|
|
from pip.req import InstallRequirement
|
2011-03-19 19:30:56 +01:00
|
|
|
from pip.util import get_installed_distributions
|
2012-12-16 05:26:21 +01:00
|
|
|
from pip.cmdoptions import make_option_group, index_group
|
2011-03-19 19:30:56 +01:00
|
|
|
|
|
|
|
|
2012-09-12 19:57:59 +02:00
|
|
|
class ListCommand(Command):
|
|
|
|
name = 'list'
|
2011-03-19 19:30:56 +01:00
|
|
|
usage = '%prog [OPTIONS]'
|
2012-09-12 19:57:59 +02:00
|
|
|
summary = 'List all currently installed packages.'
|
2011-03-19 19:30:56 +01:00
|
|
|
|
2012-12-16 05:26:21 +01:00
|
|
|
def __init__(self, *args, **kw):
|
|
|
|
super(ListCommand, self).__init__(*args, **kw)
|
|
|
|
|
|
|
|
|
|
|
|
cmd_opts = self.cmd_opts
|
|
|
|
|
|
|
|
cmd_opts.add_option(
|
2011-03-19 19:30:56 +01:00
|
|
|
'-l', '--local',
|
|
|
|
dest='local',
|
|
|
|
action='store_true',
|
|
|
|
default=False,
|
2012-12-16 05:56:29 +01:00
|
|
|
help='If in a virtualenv, do not report globally-installed packages')
|
2012-12-16 05:26:21 +01:00
|
|
|
cmd_opts.add_option(
|
2012-09-12 19:57:59 +02:00
|
|
|
'-o', '--outdated',
|
|
|
|
dest='outdated',
|
|
|
|
action='store_true',
|
|
|
|
default=False,
|
2012-12-16 05:56:29 +01:00
|
|
|
help='Output all currently installed outdated packages to stdout (excluding editables)')
|
2012-12-16 05:26:21 +01:00
|
|
|
cmd_opts.add_option(
|
2012-09-13 02:09:07 +02:00
|
|
|
'-u', '--uptodate',
|
|
|
|
dest='uptodate',
|
|
|
|
action='store_true',
|
|
|
|
default=False,
|
2012-12-16 05:56:29 +01:00
|
|
|
help='Output all currently installed uptodate packages to stdout (excluding editables)')
|
2012-12-16 05:26:21 +01:00
|
|
|
|
|
|
|
index_opts = make_option_group(index_group, self.parser)
|
|
|
|
|
|
|
|
self.parser.insert_option_group(0, index_opts)
|
|
|
|
self.parser.insert_option_group(0, cmd_opts)
|
|
|
|
|
2011-07-09 12:34:15 +02:00
|
|
|
|
|
|
|
def _build_package_finder(self, options, index_urls):
|
|
|
|
"""
|
2012-10-01 22:23:49 +02:00
|
|
|
Create a package finder appropriate to this list command.
|
2011-07-09 12:34:15 +02:00
|
|
|
"""
|
|
|
|
return PackageFinder(find_links=options.find_links,
|
|
|
|
index_urls=index_urls,
|
|
|
|
use_mirrors=options.use_mirrors,
|
|
|
|
mirrors=options.mirrors)
|
2011-03-19 19:30:56 +01:00
|
|
|
|
|
|
|
def run(self, options, args):
|
2012-09-12 19:57:59 +02:00
|
|
|
if options.outdated:
|
|
|
|
self.run_outdated(options, args)
|
2012-09-13 02:09:07 +02:00
|
|
|
elif options.uptodate:
|
|
|
|
self.run_uptodate(options, args)
|
2012-09-13 00:50:25 +02:00
|
|
|
else:
|
|
|
|
self.run_listing(options, args)
|
2012-09-12 19:57:59 +02:00
|
|
|
|
|
|
|
def run_outdated(self, options, args):
|
2012-12-16 05:56:29 +01:00
|
|
|
for dist, remote_version_raw, remote_version_parsed in self.find_packages_latests_versions(options):
|
|
|
|
if remote_version_parsed > dist.parsed_version:
|
|
|
|
logger.notify('%s (CURRENT: %s LATEST: %s)' % (dist.project_name,
|
|
|
|
dist.version, remote_version_raw))
|
2012-09-13 02:09:07 +02:00
|
|
|
|
2012-10-01 22:23:49 +02:00
|
|
|
def find_packages_latests_versions(self, options):
|
2011-07-09 12:34:15 +02:00
|
|
|
index_urls = [options.index_url] + options.extra_index_urls
|
|
|
|
if options.no_index:
|
|
|
|
logger.notify('Ignoring indexes: %s' % ','.join(index_urls))
|
|
|
|
index_urls = []
|
2011-03-19 19:30:56 +01:00
|
|
|
|
|
|
|
dependency_links = []
|
2012-12-16 05:56:29 +01:00
|
|
|
for dist in get_installed_distributions(local_only=options.local):
|
2011-03-19 19:30:56 +01:00
|
|
|
if dist.has_metadata('dependency_links.txt'):
|
|
|
|
dependency_links.extend(
|
|
|
|
dist.get_metadata_lines('dependency_links.txt'),
|
|
|
|
)
|
|
|
|
|
2011-07-09 12:34:15 +02:00
|
|
|
finder = self._build_package_finder(options, index_urls)
|
|
|
|
finder.add_dependency_links(dependency_links)
|
2011-03-19 19:30:56 +01:00
|
|
|
|
2012-12-16 05:56:29 +01:00
|
|
|
installed_packages = get_installed_distributions(local_only=options.local)
|
|
|
|
for dist in installed_packages:
|
|
|
|
req = InstallRequirement.from_line(dist.key, None)
|
2011-03-19 19:30:56 +01:00
|
|
|
try:
|
2011-07-09 12:34:15 +02:00
|
|
|
link = finder.find_requirement(req, True)
|
2011-07-13 15:36:49 +02:00
|
|
|
|
|
|
|
# If link is None, means installed version is most up-to-date
|
|
|
|
if link is None:
|
|
|
|
continue
|
2011-07-09 12:34:15 +02:00
|
|
|
except DistributionNotFound:
|
|
|
|
continue
|
2012-09-12 00:07:37 +02:00
|
|
|
except BestVersionAlreadyInstalled:
|
2012-09-13 02:09:07 +02:00
|
|
|
remote_version = req.installed_version
|
|
|
|
else:
|
|
|
|
# It might be a good idea that link or finder had a public method
|
|
|
|
# that returned version
|
2012-12-16 05:56:29 +01:00
|
|
|
remote_version = finder._link_package_versions(link, req.name)[0]
|
|
|
|
remote_version_raw = remote_version[2]
|
|
|
|
remote_version_parsed = remote_version[0]
|
|
|
|
yield dist, remote_version_raw, remote_version_parsed
|
2012-09-13 00:50:25 +02:00
|
|
|
|
|
|
|
def run_listing(self, options, args):
|
2012-12-16 05:56:29 +01:00
|
|
|
installed_packages = get_installed_distributions(local_only=options.local)
|
2012-09-13 02:09:07 +02:00
|
|
|
self.output_package_listing(installed_packages)
|
|
|
|
|
|
|
|
def output_package_listing(self, installed_packages):
|
2012-12-16 05:56:29 +01:00
|
|
|
for dist in installed_packages:
|
|
|
|
logger.notify('%s (%s)' % (dist.project_name, dist.version))
|
2012-09-13 00:50:25 +02:00
|
|
|
|
2012-09-13 02:09:07 +02:00
|
|
|
def run_uptodate(self, options, args):
|
|
|
|
uptodate = []
|
2012-12-16 05:56:29 +01:00
|
|
|
for dist, remote_version_raw, remote_version_parsed in self.find_packages_latests_versions(options):
|
|
|
|
if dist.parsed_version == remote_version_parsed:
|
|
|
|
uptodate.append(dist)
|
2012-09-13 02:09:07 +02:00
|
|
|
self.output_package_listing(uptodate)
|
|
|
|
|