From f2e3fa95080f4d50b910d8063ba099740b1eeb16 Mon Sep 17 00:00:00 2001 From: Andreas Kaiser Date: Wed, 24 Jul 2013 16:18:14 +0200 Subject: [PATCH] Fix pkgin search (yielding wrong results under certain conditions, see inline comments). --- library/packaging/pkgin | 44 +++++++++++++++++++++++++++++++++-------- 1 file changed, 36 insertions(+), 8 deletions(-) diff --git a/library/packaging/pkgin b/library/packaging/pkgin index cc0d012f7b..024e8756eb 100644 --- a/library/packaging/pkgin +++ b/library/packaging/pkgin @@ -3,7 +3,7 @@ # (c) 2013, Shaun Zinck # Written by Shaun Zinck -# Based on pacman module written by Afterburn +# Based on pacman module written by Afterburn # that was based on apt module written by Matthew Williams # # This module is free software: you can redistribute it and/or modify @@ -49,7 +49,7 @@ EXAMPLES = ''' # remove package foo - pkgin: name=foo state=absent -# remove packages foo and bar +# remove packages foo and bar - pkgin: name=foo,bar state=absent ''' @@ -59,6 +59,7 @@ import shlex import os import sys + def query_package(module, pkgin_path, name, state="present"): if state == "present": @@ -66,13 +67,40 @@ def query_package(module, pkgin_path, name, state="present"): rc, out, err = module.run_command("%s list | grep ^%s" % (pkgin_path, name)) if rc == 0: - return True + # At least one package with a package name that starts with ``name`` + # is installed. For some cases this is not sufficient to determine + # wether the queried package is installed. + # + # E.g. for ``name='gcc47'``, ``gcc47`` not being installed, but + # ``gcc47-libs`` being installed, ``out`` would be: + # + # gcc47-libs-4.7.2nb4 The GNU Compiler Collection (GCC) support shared libraries. + # + # Multiline output is also possible, for example with the same query + # and bot ``gcc47`` and ``gcc47-libs`` being installed: + # + # gcc47-libs-4.7.2nb4 The GNU Compiler Collection (GCC) support shared libraries. + # gcc47-4.7.2nb3 The GNU Compiler Collection (GCC) - 4.7 Release Series + + # Loop over lines in ``out`` + for line in out.split('\n'): + + # Strip description + # (results in sth. like 'gcc47-libs-4.7.2nb4') + pkgname_with_version = out.split(' ')[0] + + # Strip version + # (results in sth like 'gcc47-libs') + pkgname_without_version = '-'.join(pkgname_with_version.split('-')[:-1]) + + if name == pkgname_without_version: + return True return False def remove_packages(module, pkgin_path, packages): - + remove_c = 0 # Using a for loop incase of error, we can report the package that failed for package in packages: @@ -84,7 +112,7 @@ def remove_packages(module, pkgin_path, packages): if query_package(module, pkgin_path, package): module.fail_json(msg="failed to remove %s: %s" % (package, out)) - + remove_c += 1 if remove_c > 0: @@ -108,7 +136,7 @@ def install_packages(module, pkgin_path, packages): module.fail_json(msg="failed to install %s: %s" % (package, out)) install_c += 1 - + if install_c > 0: module.exit_json(changed=True, msg="present %s package(s)" % (install_c)) @@ -136,5 +164,5 @@ def main(): # this is magic, see lib/ansible/module_common.py #<> - -main() + +main()