Merge pull request #846 from cfuhrman/devel

pkgin: Support multiple matching packages
reviewable/pr18780/r1
Brian Coca 9 years ago
commit b20f2b6abc

@ -68,6 +68,7 @@ import shlex
import os import os
import sys import sys
import pipes import pipes
import re
def query_package(module, pkgin_path, name): def query_package(module, pkgin_path, name):
"""Search for the package by name. """Search for the package by name.
@ -95,33 +96,46 @@ def query_package(module, pkgin_path, name):
# rc will not be 0 unless the search was a success # rc will not be 0 unless the search was a success
if rc == 0: if rc == 0:
# Get first line # Search results may contain more than one line (e.g., 'emacs'), so iterate
line = out.split('\n')[0] # through each line to see if we have a match.
packages = out.split('\n')
# Break up line at spaces. The first part will be the package with its
# version (e.g. 'gcc47-libs-4.7.2nb4'), and the second will be the state for package in packages:
# of the package:
# '' - not installed # Break up line at spaces. The first part will be the package with its
# '<' - installed but out of date # version (e.g. 'gcc47-libs-4.7.2nb4'), and the second will be the state
# '=' - installed and up to date # of the package:
# '>' - installed but newer than the repository version # '' - not installed
pkgname_with_version, raw_state = out.split(splitchar)[0:2] # '<' - installed but out of date
# '=' - installed and up to date
# Strip version # '>' - installed but newer than the repository version
# (results in sth like 'gcc47-libs') pkgname_with_version, raw_state = package.split(splitchar)[0:2]
pkgname_without_version = '-'.join(pkgname_with_version.split('-')[:-1])
# Search for package, stripping version
if name != pkgname_without_version: # (results in sth like 'gcc47-libs' or 'emacs24-nox11')
return False pkg_search_obj = re.search(r'^([a-zA-Z]+[0-9]*[\-]*\w*)-[0-9]', pkgname_with_version, re.M)
# no fall-through
# Do not proceed unless we have a match
# The package was found; now return its state if not pkg_search_obj:
if raw_state == '<': continue
return 'outdated'
elif raw_state == '=' or raw_state == '>': # Grab matched string
return 'present' pkgname_without_version = pkg_search_obj.group(1)
else:
return False if name != pkgname_without_version:
continue
# The package was found; now return its state
if raw_state == '<':
return 'outdated'
elif raw_state == '=' or raw_state == '>':
return 'present'
else:
return False
# no fall-through
# No packages were matched, so return False
return False
def format_action_message(module, action, count): def format_action_message(module, action, count):

Loading…
Cancel
Save