NoPaste

parse_debian_versions.py

von TRex

SNIPPET_TEXT:
  1. #!/usr/bin/env python3
  2.  
  3. import re
  4. import sys
  5.  
  6. version_regex = re.compile(
  7.         r'^'
  8.         '((?P<epoch>[0-9]):)?'
  9.         '(?P<upstream>('
  10.             '(?P<major>[0-9][a-zA-Z0-9~]*)'
  11.             '(\.(?P<minor>[a-zA-Z0-9~]+))?'
  12.             '(\.(?P<patch>[a-zA-Z0-9~]+))?'
  13.             '[^-]*'
  14.         '))'
  15.         '(-(?P<debian_revision>'
  16.             '[a-zA-Z0-9~]+'
  17.             '(\+(?P<dpatch>[a-zA-Z0-9~.]+))?'
  18.         '))?',
  19. )
  20.  
  21. def process_version(version_string):
  22.     match = version_regex.search(version_string)
  23.  
  24.     if match:
  25.         groups = match.groups()
  26.         epoch = match.group('epoch')
  27.         upstream = match.group('upstream')
  28.  
  29.         major = match.group('major')
  30.         minor = match.group('minor')
  31.         patch = match.group('patch')
  32.  
  33.         debian_rev = match.group('debian_revision')
  34.         dpatch = match.group('dpatch')
  35.  
  36.         return epoch, major, minor, patch, debian_rev, dpatch
  37.  
  38.     else:
  39.         if version_string == '(none)':
  40.             return ['0']*6
  41.         raise ValueError("Unknown version format: {}".format(version_string))
  42.  
  43. def compare_versions_fancy(v1, v2):
  44.     sev = ''
  45.  
  46.     names = ['E','M','m','p','D','d']
  47.  
  48.     for n, (p1, p2) in enumerate(zip(v1, v2)):
  49.         if p2 != p1:
  50.             sev = sev + names[n]
  51.         else:
  52.             sev = sev + '_'
  53.     return sev
  54.  
  55.  
  56. def main():
  57.     debug = False
  58.     for line in sys.stdin:
  59.         v1, v2, name = line.split()
  60.         v1_p = process_version(v1)
  61.  
  62.         sev = compare_versions_fancy(
  63.             v1_p,
  64.             process_version(v2)
  65.         )
  66.         if debug:
  67.             print(sev,
  68.                 '  ',
  69.                 name.ljust(25),
  70.                 v1.ljust(25), #'\t',
  71.                 ' '.join([str(x).ljust(5) for x in v1_p]), '->',
  72.                 v2,
  73.              )
  74.         else:
  75.             print(sev, '\t', name.ljust(35), v1.ljust(25), '->', v2)
  76.  
  77.  
  78. if __name__ == '__main__':
  79.     main()

Quellcode

Hier kannst du den Code kopieren und ihn in deinen bevorzugten Editor einfügen. PASTEBIN_DOWNLOAD_SNIPPET_EXPLAIN