]>
Commit | Line | Data |
---|---|---|
dfff8bd5 MM |
1 | # vi: encoding=utf-8 ts=8 sts=4 sw=4 et |
2 | ||
deda9a51 MM |
3 | import re |
4 | import string | |
73bdb36b | 5 | import StringIO |
deda9a51 MM |
6 | |
7 | import chroot | |
816ecd49 | 8 | import util |
73bdb36b AM |
9 | import log |
10 | ||
11 | hold = [ | |
12 | 'dev', | |
13 | 'poldek', | |
14 | 'rpm-build', | |
15 | 'pdksh', | |
16 | 'coreutils' | |
17 | ] | |
18 | ||
19 | def close_killset(killset): | |
20 | k = killset.keys() | |
feb26777 AM |
21 | if len(k) == 0: |
22 | return True | |
44e63f67 | 23 | rx = re.compile(r'^.* marks (?P<name>[^\s]+?)-[^-]+-[^-]+\s.*$') |
73bdb36b AM |
24 | errors = "" |
25 | for p in k: | |
26 | if p in hold: | |
27 | del killset[p] | |
28 | errors += "cannot remove %s because it's crucial\n" % p | |
29 | else: | |
64dbb5be | 30 | f = chroot.popen("poldek --noask --test --test --erase %s" % p, user = "root") |
73bdb36b AM |
31 | crucial = 0 |
32 | e = [] | |
33 | for l in f.xreadlines(): | |
34 | m = rx.search(l) | |
35 | if m: | |
44e63f67 | 36 | pkg = m.group('name') |
73bdb36b AM |
37 | if pkg in hold: |
38 | errors += "cannot remove %s because it's required " \ | |
39 | "by %s, that is crucial\n" % (p, pkg) | |
40 | crucial = 1 | |
41 | e.append(pkg) | |
42 | f.close() | |
43 | if crucial: | |
44 | del killset[p] | |
45 | else: | |
46 | for p in e: | |
47 | killset[p] = 2 | |
48 | return errors | |
49 | ||
50 | def upgrade_from_batch(r, b): | |
51 | f = chroot.popen("rpm --test -F %s 2>&1" % string.join(b.files), user = "root") | |
52 | killset = {} | |
44e63f67 | 53 | rx = re.compile(r' \(installed\) (?P<name>[^\s]+)-[^-]+-[^-]+$') |
73bdb36b AM |
54 | for l in f.xreadlines(): |
55 | m = rx.search(l) | |
44e63f67 | 56 | if m: killset[m.group('name')] = 1 |
73bdb36b AM |
57 | f.close() |
58 | if len(killset) != 0: | |
59 | err = close_killset(killset) | |
60 | if err != "": | |
61 | util.append_to(b.logfile, err) | |
62 | log.notice("cannot upgrade rpms") | |
63 | return False | |
64 | k = string.join(killset.keys()) | |
65 | if True: | |
66 | b.log_line("upgrade requires removal of %s" % k) | |
67 | res = chroot.run("rpm -e %s" % k, logfile = b.logfile, user = "root") | |
68 | if res != 0: | |
69 | b.log_line("package removal failed") | |
70 | return False | |
71 | else: | |
72 | b.log_line("packages removed sucessfuly") | |
73 | else: | |
74 | b.log_line("upgrade would need removal of %s" % k) | |
75 | return False | |
76 | b.log_line("upgrading packages") | |
77 | logbuf = StringIO.StringIO() | |
78 | res = chroot.run("rpm -Fvh %s" % string.join(b.files), user = "root", logfile = b.logfile) | |
79 | if res != 0: | |
80 | b.log_line("package upgrade failed") | |
81 | logbuf.close() | |
82 | return False | |
83 | logbuf.close() | |
84 | return True | |
deda9a51 | 85 | |
301f3b7f AM |
86 | def uninstall(conflicting, b): |
87 | b.log_line("uninstalling conflicting packages") | |
88 | err = close_killset(conflicting) | |
89 | if err != "": | |
90 | util.append_to(b.logfile, err) | |
91 | b.log_line("error: conflicting packages uninstallation failed") | |
92 | return False | |
93 | else: | |
94 | k = string.join(conflicting.keys()) | |
95 | b.log_line("removing %s" % k) | |
96 | res = chroot.run("poldek --noask --erase %s" % k, logfile = b.logfile, user = "root") | |
97 | if res != 0: | |
98 | b.log_line("package removal failed") | |
99 | return False | |
100 | return True | |
101 | ||
102 | def uninstall_self_conflict(b): | |
103 | b.log_line("checking BuildConflict-ing packages") | |
104 | rpmbuild_opt = "%s %s %s" % (b.target_string(), b.kernel_string(), b.bconds_string()) | |
57509625 | 105 | tmpdir = "/tmp/BR." + b.b_id[0:6] |
301f3b7f | 106 | f = chroot.popen("cd rpm/SPECS; TMPDIR=%s rpmbuild -bp --nobuild --short-circuit --define 'prep exit 0' %s %s 2>&1" \ |
822c7c5b | 107 | % (tmpdir, rpmbuild_opt, b.spec)) |
84c554a0 AM |
108 | # java-sun >= 1.5 conflicts with soprano-2.1.67-1.src |
109 | # java-sun conflicts with soprano-2.1.67-1.src | |
44e63f67 | 110 | rx = re.compile(r"\s+(?P<name>[\w-]+)\s+.*conflicts with [^\s]+-[^-]+-[^-]+\.src($| .*)") |
301f3b7f AM |
111 | conflicting = {} |
112 | for l in f.xreadlines(): | |
301f3b7f | 113 | m = rx.search(l) |
acc796cd AM |
114 | if m: |
115 | b.log_line("rpmbuild: %s" % l.rstrip()) | |
44e63f67 | 116 | conflicting[m.group('name')] = 1 |
301f3b7f | 117 | f.close() |
7fe3e937 | 118 | if len(conflicting) and not uninstall(conflicting, b): |
feb26777 AM |
119 | return False |
120 | b.log_line("no BuildConflicts found") | |
301f3b7f AM |
121 | return True |
122 | ||
deda9a51 | 123 | def install_br(r, b): |
638f3c7d AM |
124 | def get_missing_br(r, b): |
125 | # ignore internal rpm dependencies, see lib/rpmns.c for list | |
126 | ignore_br = re.compile(r'^\s*(rpmlib|cpuinfo|getconf|uname|soname|user|group|mounted|diskspace|digest|gnupg|macro|envvar|running|sanitycheck|vcheck|signature|verify|exists|executable|readable|writable)\(.*') | |
127 | ||
128 | tmpdir = "/tmp/BR." + b.b_id[0:6] | |
129 | chroot.run("install -m 700 -d %s" % tmpdir) | |
130 | cmd = "cd rpm/SPECS; TMPDIR=%s rpmbuild --nobuild %s %s 2>&1" \ | |
131 | % (tmpdir, b.bconds_string(), b.spec) | |
132 | f = chroot.popen(cmd) | |
133 | rx = re.compile(r"^\s*(?P<name>[^\s]+) .*is needed by") | |
134 | needed = {} | |
135 | b.log_line("checking BR") | |
136 | for l in f.xreadlines(): | |
137 | b.log_line("rpm: %s" % l.rstrip()) | |
138 | m = rx.search(l) | |
139 | if m and not ignore_br.match(l): | |
140 | needed[m.group('name')] = 1 | |
141 | f.close() | |
142 | chroot.run("rm -rf %s" % tmpdir) | |
143 | return needed | |
144 | ||
145 | needed = get_missing_br(r, b); | |
83e50e5b | 146 | |
dfff8bd5 MM |
147 | if len(needed) == 0: |
148 | b.log_line("no BR needed") | |
feb26777 | 149 | return True |
638f3c7d | 150 | |
dfff8bd5 MM |
151 | nbr = "" |
152 | for bre in needed.keys(): | |
153 | nbr = nbr + " " + re.escape(bre) | |
154 | br = string.strip(nbr) | |
caaac412 | 155 | b.log_line("updating poldek cache...") |
371eb1b9 | 156 | chroot.run("poldek --up --upa", user = "root", logfile = b.logfile) |
caaac412 AM |
157 | # check conflicts in BRed packages |
158 | b.log_line("checking conflicting packages in BRed packages") | |
64dbb5be | 159 | f = chroot.popen("poldek --test --test --noask --caplookup -Q -v --upgrade %s" % br, user = "root") |
cc7a77b7 | 160 | # phonon-devel-4.3.1-1.i686 conflicts with qt4-phonon-devel-4.5.0-6.i686 |
e81b20ed | 161 | # jdbc-stdext >= 2.0 is required by installed java-struts-1.3.10-1.noarch |
51deed6d | 162 | rx = re.compile(r".*(conflicts with|is required by|is needed by)( installed| \(installed\)|) (?P<name>[^\s]+)-[^-]+-[^-]+($| .*)") |
caaac412 AM |
163 | conflicting = {} |
164 | for l in f.xreadlines(): | |
05f294ad | 165 | b.log_line("poldek: %s" % l.rstrip()) |
caaac412 | 166 | m = rx.search(l) |
34226c1a | 167 | if m: conflicting[m.group('name')] = 1 |
caaac412 AM |
168 | f.close() |
169 | if len(conflicting) == 0: | |
170 | b.log_line("no conflicts found") | |
171 | else: | |
67a9d800 | 172 | if not uninstall(conflicting, b): |
301f3b7f | 173 | return False |
638f3c7d AM |
174 | |
175 | # recheck BuildRequires since above uninstallation could remove some required deps | |
176 | needed = get_missing_br(r, b); | |
177 | ||
178 | if len(needed) == 0: | |
179 | b.log_line("no BR needed") | |
180 | return True | |
181 | ||
182 | nbr = "" | |
183 | for bre in needed.keys(): | |
184 | nbr = nbr + " " + re.escape(bre) | |
185 | br = string.strip(nbr) | |
186 | ||
dfff8bd5 | 187 | b.log_line("installing BR: %s" % br) |
711d8238 | 188 | res = chroot.run("poldek --noask --caplookup -Q -v --upgrade %s" % br, |
caaac412 AM |
189 | user = "root", |
190 | logfile = b.logfile) | |
dfff8bd5 MM |
191 | if res != 0: |
192 | b.log_line("error: BR installation failed") | |
feb26777 AM |
193 | return False |
194 | return True |