alpm.py 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. import ctypes
  2. from ctypes.util import find_library
  3. import operator
  4. def load_alpm(name=None):
  5. # Load the alpm library and set up some of the functions we might use
  6. if name is None:
  7. name = find_library('alpm')
  8. if name is None:
  9. # couldn't locate the correct library
  10. return None
  11. try:
  12. alpm = ctypes.cdll.LoadLibrary(name)
  13. except OSError:
  14. return None
  15. try:
  16. alpm.alpm_version.argtypes = ()
  17. alpm.alpm_version.restype = ctypes.c_char_p
  18. alpm.alpm_pkg_vercmp.argtypes = (ctypes.c_char_p, ctypes.c_char_p)
  19. alpm.alpm_pkg_vercmp.restype = ctypes.c_int
  20. except AttributeError:
  21. return None
  22. return alpm
  23. ALPM = load_alpm()
  24. class AlpmAPI(object):
  25. OPERATOR_MAP = {
  26. '=': operator.eq,
  27. '==': operator.eq,
  28. '!=': operator.ne,
  29. '<': operator.lt,
  30. '<=': operator.le,
  31. '>': operator.gt,
  32. '>=': operator.ge,
  33. }
  34. def __init__(self):
  35. self.alpm = ALPM
  36. self.available = ALPM is not None
  37. def version(self):
  38. if not self.available:
  39. return None
  40. return ALPM.alpm_version()
  41. def vercmp(self, ver1, ver2):
  42. if not self.available:
  43. return None
  44. return ALPM.alpm_pkg_vercmp(str(ver1), str(ver2))
  45. def compare_versions(self, ver1, oper, ver2):
  46. func = self.OPERATOR_MAP.get(oper, None)
  47. if func is None:
  48. raise Exception("Invalid operator %s specified" % oper)
  49. if not self.available:
  50. return None
  51. res = self.vercmp(ver1, ver2)
  52. return func(res, 0)
  53. def main():
  54. api = AlpmAPI()
  55. print api.version()
  56. print api.vercmp(1, 2)
  57. print api.compare_versions(1, '<', 2)
  58. if __name__ == '__main__':
  59. main()
  60. # vim: set ts=4 sw=4 et: