Fixed a test syntax error.
[gnucomo.git] / scripts / report_repository.py
1 #
2 # Gnucomo repository report.
3 #
4 # Create a 'rpm -qa' - like report from a directory of (rpm)
5 # packages. Select the latest version of each package if there
6 # are multiple files of the same package available.
7
8 import glob
9 import os
10 import sys
11
12 #
13 #  Tokenize a string into parts of consequetive letters or digits.
14 #
15
16 def tokenize(version):
17    tokens = []
18    word = ""
19    state = 0   #  0:  No alphanumeric, 1: digits, 2: letters
20    for letter in version:
21       if state == 0:
22          if letter.isdigit():
23             word = word + letter
24             state = 1
25          if letter.isalpha():
26             word = word + letter
27             state = 2
28       elif state == 1:
29          if letter.isdigit():
30             word = word + letter
31          else:
32             tokens.append(word)
33             if letter.isalpha():
34                word = letter
35                state = 2
36             else:
37                word = ""
38                state = 0
39       elif state == 2:
40          if letter.isalpha():
41             word = word + letter
42          else:
43             tokens.append(word)
44             if letter.isdigit():
45                word = letter
46                state = 1
47             else:
48                word = ""
49                state = 0
50
51    if word != "":
52       tokens.append(word)
53
54    return tokens
55
56 # compare alpha and numeric segments of two versions
57 # return 1: a is newer than b
58 #        0: a and b are the same version
59 #       -1: b is newer than a
60
61 def compare_versions(a, b):
62    rc = 0
63    version1 = tokenize(a)
64    version2 = tokenize(b)
65    for v1, v2 in zip(version1, version2):
66       if rc == 0 and v1 != v2:
67          if v1.isdigit() and v2.isdigit():
68             v1 = int(v1)
69             v2 = int(v2)
70          if v1 > v2:
71             rc = 1
72          else:
73             rc = -1
74
75    if rc == 0 and len(version1) != len(version2):
76       if len(version1) > len(version2):
77          rc = 1
78       else:
79          rc = -1
80
81    return rc
82
83 #
84 #  The string method rsplit() is available in python version 2.4 and later.
85 #  This is a limited implementation for older python versions.
86 #
87
88 def rsplit2(src, sep):
89    result = []
90    words = src.split(sep)
91
92    result.append(sep.join(words[0:-2]))
93    if len(words) > 2:
94       result.append(words[-2])
95       result.append(words[-1])
96
97    return result
98
99 # Make sure we have the repository directory as argument.
100
101 if len(sys.argv) != 2:
102    print "Usage: ", sys.argv[0], " <directory>"
103    sys.exit(1)
104
105 packages = []
106 for name in glob.glob(os.path.join(sys.argv[1],"*.rpm")):
107    pack = rsplit2(os.path.basename(name),".")
108    if pack[0] != "":
109       packages.append(pack[0])
110
111 packages.sort()
112
113 latest_packages = []
114 previous = ""
115
116 # Select the latest package in case of duplicates.
117
118 for name in packages:
119    p1 = rsplit2(previous,"-")
120    p2 = rsplit2(name,"-")
121    if p1[0] == p2[0]:
122       if compare_versions(p1[1], p2[1]) < 0:
123          #print "Skipping old package ", previous
124          previous = name
125       elif compare_versions(p1[1], p2[1]) == 0 and compare_versions(p1[2], p2[2]) < 0:
126          #print "Skipping old package ", previous
127          previous = name
128    else:
129       if previous != "":
130          latest_packages.append(previous)
131       previous = name
132
133 latest_packages.append(previous)
134
135 for p in latest_packages:
136    print p