pip/pip/commands/list.py

133 lines
5.2 KiB
Python
Raw Normal View History

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
from pip.index import PackageFinder
from pip.log import logger
from pip.req import InstallRequirement
2012-12-16 08:23:20 +01:00
from pip.util import get_installed_distributions, dist_is_editable
from pip.cmdoptions import make_option_group, index_group
2011-03-19 19:30:56 +01:00
class ListCommand(Command):
name = 'list'
2011-03-19 19:30:56 +01:00
usage = '%prog [OPTIONS]'
summary = 'List all currently installed packages.'
2011-03-19 19:30:56 +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',
action='store_true',
default=False,
help='If in a virtualenv, do not report globally-installed packages')
cmd_opts.add_option(
'-o', '--outdated',
action='store_true',
default=False,
help='Output all currently installed outdated packages to stdout (excluding editables)')
cmd_opts.add_option(
'-u', '--uptodate',
action='store_true',
default=False,
help='Output all currently installed uptodate packages to stdout (excluding editables)')
2012-12-16 08:23:20 +01:00
cmd_opts.add_option(
'-e', '--editables',
action='store_true',
default=False,
help='Output all currently installed editable packages to stdout')
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)
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.
"""
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):
if options.outdated:
2012-12-16 08:23:20 +01:00
self.run_outdated(options)
elif options.uptodate:
2012-12-16 08:23:20 +01:00
self.run_uptodate(options)
elif options.editables:
self.run_editables(options)
2012-09-13 00:50:25 +02:00
else:
2012-12-16 08:23:20 +01:00
self.run_listing(options)
2012-12-16 08:23:20 +01:00
def run_outdated(self, options):
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-10-01 22:23:49 +02:00
def find_packages_latests_versions(self, options):
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 = []
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'),
)
finder = self._build_package_finder(options, index_urls)
finder.add_dependency_links(dependency_links)
2011-03-19 19:30:56 +01:00
installed_packages = get_installed_distributions(local_only=options.local, include_editables=False)
for dist in installed_packages:
req = InstallRequirement.from_line(dist.key, None)
2011-03-19 19:30:56 +01:00
try:
link = finder.find_requirement(req, True)
# If link is None, means installed version is most up-to-date
if link is None:
continue
except DistributionNotFound:
continue
2012-09-12 00:07:37 +02:00
except BestVersionAlreadyInstalled:
remote_version = req.installed_version
else:
# It might be a good idea that link or finder had a public method
# that returned version
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
2012-12-16 08:23:20 +01:00
def run_listing(self, options):
installed_packages = get_installed_distributions(local_only=options.local)
self.output_package_listing(installed_packages)
2012-12-16 08:23:20 +01:00
def run_editables(self, options):
installed_packages = get_installed_distributions(local_only=options.local, editables_only=True)
self.output_package_listing(installed_packages)
def output_package_listing(self, installed_packages):
for dist in installed_packages:
2012-12-16 08:23:20 +01:00
line = '%s (%s)' % (dist.project_name, dist.version)
if dist_is_editable(dist):
line += ' editable src at %s' % dist.location
logger.notify(line)
2012-09-13 00:50:25 +02:00
2012-12-16 08:23:20 +01:00
def run_uptodate(self, options):
uptodate = []
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)
self.output_package_listing(uptodate)