summaryrefslogtreecommitdiff
path: root/wwwbin/ftp-freshness.py
blob: 1f71180755a5ff2e9eba0c1dc69eee1dc7883e30 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
#!/usr/bin/python3
# arekm, 2007

from __future__ import print_function

import os
import rpm
import subprocess
import sys

# earlier == more important
dirs = [ "/home/ftp/pub/Linux/PLD/dists/th/test/SRPMS/RPMS/",
         "/home/ftp/pub/Linux/PLD/dists/th/ready/SRPMS/RPMS/",
         "/home/ftp/pub/Linux/PLD/dists/th/PLD/SRPMS/RPMS/" ]
#dirs = [ "/home/pld/admins/th/1" ]
specsdir = "/home/pld/admins/th/SPECS"

if os.path.isdir(specsdir):
    os.chdir(specsdir)
    cmd = ['git', 'pull']
else:
    cmd = ['git', 'clone', '--depth=1', 'git://git.pld-linux.org/SPECS', specsdir]

p = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
(out, err) = p.communicate(None)

os.chdir(specsdir)
class Pkgs(object):
    def __init__(self):
        self.pkg = {}
        self.cvs = {}
        self.cvs_new_nvr = []
        self.cvs_new_nv = []
        rpm.addMacro('patch', '%{nil}')
        rpm.addMacro('requires_eq', '#')
        rpm.addMacro('requires_eq_to', '#')
        rpm.addMacro('requires_releq', '#')
        rpm.addMacro('requires_ge', '#')
        rpm.addMacro('requires_ge_to', '#')
        rpm.setVerbosity(rpm.RPMLOG_ERR)
        if sys.version_info[0] == 2:
            self.ts = rpm.ts()

    def __print_stderr(self, msg):
        if sys.version_info[0] == 3:
            print(msg, file=sys.stderr, flush=True)
        else:
            print(msg, file=sys.stderr)

    def __clean_macros(self):
        if sys.version_info[0] == 3:
            rpm.reloadConfig()
        for macro in ['rel', '_rel', 'snap', '_snap', 'rc', '_rc', 'subver', 'githash']:
            rpm.delMacro(macro)
        if sys.version_info[0] == 2:
            macros = rpm.getMacros()
            for macro in iter(macros.keys()):
                if macro[:5] == 'with_' or macro[:8] == 'without_':
                    rpm.delMacro(macro.split()[0])

    def __get_from_cvs(self, name):
        spec = os.path.join(specsdir, name + '.spec')
        if not os.path.isfile(spec):
            self.__print_stderr('Spec file does not exist: %s' % spec)
            return ('','','')
        self.__print_stderr('Processing: %s.spec' % name)
        self.__clean_macros()
        try:
            if sys.version_info[0] == 2:
                s = self.ts.parseSpec(spec)
                header = s.headers()[0]
            else:
                s = rpm.spec(spec)
                header = s.sourceHeader
            name = header[rpm.RPMTAG_NAME]
            version = header[rpm.RPMTAG_VERSION]
            release = header[rpm.RPMTAG_RELEASE].partition('@')[0]
            return (name, version, release)
        except (ValueError, rpm.error):
            self.__print_stderr('Failed to parse: %s.spec' % name)
            return ('','','')

    def __update_cvs(self, name):
        if name not in self.cvs:
            self.cvs[name] = self.__get_from_cvs(name)

    def __update_new(self, name):
        cvs_nvr = self.cvs[name]
        pkg_nvr = self.pkg[name]

        try:
            cvs_rpm_vr = rpm.labelCompare(cvs_nvr, pkg_nvr)
        except ValueError:
            cvs_rpm_vr = -1
        try:
            cvs_rpm_v = rpm.labelCompare((cvs_nvr[0], cvs_nvr[1], ""), (pkg_nvr[0], pkg_nvr[1], ""))
        except ValueError:
            cvs_rpm_v = -1

        if cvs_rpm_v > 0:
            self.cvs_new_nv.append(name)
            return
        if cvs_rpm_vr > 0:
            self.cvs_new_nvr.append(name)

    def prepare(self):
        self.cvs_new_nvr.sort()
        self.cvs_new_nvr = list(set(self.cvs_new_nvr))
        self.cvs_new_nv.sort()
        self.cvs_new_nv = list(set(self.cvs_new_nv))

        pkgs = list(self.pkg) + list(self.cvs)

        for name in list(set(pkgs)):
            self.__update_new(name)

    def add_rpm(self, file_name):
        nvr = tuple(file_name.rsplit('-', 2))
        name = nvr[0]
        if name in self.pkg:
            try:
                if rpm.labelCompare(nvr, self.pkg[name]) > 0:
                    self.pkg[name] = nvr
            except ValueError:
                pass
        else:
            self.pkg[name] = nvr
        self.__update_cvs(name)

    def print_nvr(self):
        ver_int = "*** VERSION-RELEASE COMPARE FOR THE SAME VERSIONS ONLY ***\n"
        ver_frac = "*** PACKAGES WITH FRACTIONAL RELEASE ***\n"
        for name in self.cvs_new_nvr:
            self.cvs_new_nvr.sort()
            cvs_nvr = self.cvs[name]
            pkg_nvr = self.pkg[name]
            msg = "GIT: [%s.spec] %s-%s-%s vs FTP: %s-%s-%s\n" % (name, cvs_nvr[0], cvs_nvr[1], cvs_nvr[2], pkg_nvr[0], pkg_nvr[1], pkg_nvr[2])
            if '.' in cvs_nvr[2]:
                ver_frac += msg
            else:
                ver_int += msg
        print(ver_int)
        print(ver_frac)

    def print_nv(self):
        ver_int = "*** VERSION COMPARE ONLY ***\n"
        ver_frac = "*** PACKAGES WITH FRACTIONAL RELEASE ***\n"
        self.cvs_new_nv.sort()
        for name in self.cvs_new_nv:
            cvs_nvr = self.cvs[name]
            pkg_nvr = self.pkg[name]
            msg = "GIT: [%s.spec] %s-%s-%s vs FTP: %s-%s-%s\n" % (name, cvs_nvr[0], cvs_nvr[1], cvs_nvr[2], pkg_nvr[0], pkg_nvr[1], pkg_nvr[2])
            if '.' in cvs_nvr[2]:
                ver_frac += msg
            else:
                ver_int += msg
        print(ver_int)
        print(ver_frac)

p = Pkgs()

for d in dirs:
    rpm_files = [f for f in os.listdir(d) if f[-8:] == '.src.rpm']
    for rpm_file_name in rpm_files:
        p.add_rpm(rpm_file_name[:-8])

p.prepare()

p.print_nv()
print("\n\n")
p.print_nvr()