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