1 |
commit: d1442dee24b0760665a103c5c1b3ad838eef02f9 |
2 |
Author: Fabian Groffen <grobian <AT> gentoo <DOT> org> |
3 |
AuthorDate: Sat Nov 30 16:25:18 2019 +0000 |
4 |
Commit: Fabian Groffen <grobian <AT> gentoo <DOT> org> |
5 |
CommitDate: Sat Nov 30 16:26:43 2019 +0000 |
6 |
URL: https://gitweb.gentoo.org/proj/portage-utils.git/commit/?id=d1442dee |
7 |
|
8 |
misc fixes for valgrind |
9 |
|
10 |
mainly memory and socket leaks, sometimes using invalid data, this is |
11 |
related to bug #701402 |
12 |
|
13 |
Signed-off-by: Fabian Groffen <grobian <AT> gentoo.org> |
14 |
|
15 |
libq/atom.c | 5 +++++ |
16 |
main.c | 58 +++++++++++++++++++++++++++++++++++++++-------------- |
17 |
q.c | 4 ++-- |
18 |
qatom.c | 2 +- |
19 |
qdepends.c | 14 +++++++++---- |
20 |
qlop.c | 39 ++++++++++++++++++++++++++++++++++- |
21 |
qmanifest.c | 49 ++++++++++++++++++++++++++++++-------------- |
22 |
qmerge.c | 11 ++++++++-- |
23 |
tests/qmerge/dotest | 25 +++++++++++++---------- |
24 |
tests/quse/dotest | 4 ++++ |
25 |
10 files changed, 160 insertions(+), 51 deletions(-) |
26 |
|
27 |
diff --git a/libq/atom.c b/libq/atom.c |
28 |
index 6e12c0a..efd32d1 100644 |
29 |
--- a/libq/atom.c |
30 |
+++ b/libq/atom.c |
31 |
@@ -335,6 +335,11 @@ atom_implode(depend_atom *atom) |
32 |
{ |
33 |
if (!atom) |
34 |
errf("Atom is empty !"); |
35 |
+ while (atom->usedeps != NULL) { |
36 |
+ atom_usedep *n = atom->usedeps->next; |
37 |
+ free(atom->usedeps); |
38 |
+ atom->usedeps = n; |
39 |
+ } |
40 |
free(atom->suffixes); |
41 |
free(atom); |
42 |
} |
43 |
|
44 |
diff --git a/main.c b/main.c |
45 |
index ba15c8c..d6bbacf 100644 |
46 |
--- a/main.c |
47 |
+++ b/main.c |
48 |
@@ -224,8 +224,6 @@ makeargv(const char *string, int *argc, char ***argv) |
49 |
|
50 |
*argc = 1; |
51 |
(*argv)[0] = xstrdup(argv0); |
52 |
- q = xstrdup(string); |
53 |
- str = q; |
54 |
|
55 |
/* shortcut empty strings */ |
56 |
while (isspace((int)*string)) |
57 |
@@ -233,6 +231,9 @@ makeargv(const char *string, int *argc, char ***argv) |
58 |
if (*string == '\0') |
59 |
return; |
60 |
|
61 |
+ q = xstrdup(string); |
62 |
+ str = q; |
63 |
+ |
64 |
remove_extra_space(str); |
65 |
rmspace(str); |
66 |
|
67 |
@@ -744,18 +745,44 @@ initialize_portage_env(void) |
68 |
snprintf(pathbuf, sizeof(pathbuf), "%.*s", (int)i, configroot); |
69 |
read_repos_conf(pathbuf, "/usr/share/portage/config/repos.conf"); |
70 |
read_repos_conf(pathbuf, "/etc/portage/repos.conf"); |
71 |
- if (orig_main_overlay != main_overlay) |
72 |
- free(orig_main_overlay); |
73 |
- if (array_cnt(overlays) == 0) { |
74 |
- xarraypush_ptr(overlays, main_overlay); |
75 |
- xarraypush_str(overlay_names, "<PORTDIR>"); |
76 |
- xarraypush_str(overlay_src, STR_DEFAULT); |
77 |
- } else if (orig_main_overlay == main_overlay) { |
78 |
- /* if no explicit overlay was flagged as main, take the first one */ |
79 |
+ /* special handling of PORTDIR envvar, else it comes too late, see |
80 |
+ * also below where we handle the environment */ |
81 |
+ if ((s = getenv("PORTDIR")) != NULL) { |
82 |
+ char *overlay; |
83 |
+ |
84 |
+ array_for_each(overlays, i, overlay) { |
85 |
+ if (strcmp(overlay, s) == 0) |
86 |
+ break; |
87 |
+ overlay = NULL; |
88 |
+ } |
89 |
+ if (overlay == NULL) { |
90 |
+ main_overlay = xarraypush_str(overlays, s); |
91 |
+ xarraypush_str(overlay_names, "<PORTDIR>"); |
92 |
+ xarraypush_str(overlay_src, "PORTDIR"); |
93 |
+ } else { |
94 |
+ free(array_get_elem(overlay_src, i)); |
95 |
+ array_get_elem(overlay_src, i) = xstrdup("PORTDIR"); |
96 |
+ main_overlay = overlay; |
97 |
+ } |
98 |
+ free(vars_to_read[11 /* PORTDIR */].src); |
99 |
+ vars_to_read[11 /* PORTDIR */].src = xstrdup("PORTDIR"); |
100 |
+ } |
101 |
+ if (orig_main_overlay != main_overlay) { |
102 |
free(orig_main_overlay); |
103 |
- main_overlay = array_get_elem(overlays, 0); |
104 |
- set_portage_env_var(&vars_to_read[11] /* PORTDIR */, main_overlay, |
105 |
- (char *)array_get_elem(overlay_src, 0)); |
106 |
+ } else { |
107 |
+ if (array_cnt(overlays) == 0) { |
108 |
+ xarraypush_ptr(overlays, main_overlay); |
109 |
+ xarraypush_str(overlay_names, "<PORTDIR>"); |
110 |
+ xarraypush_str(overlay_src, STR_DEFAULT); |
111 |
+ } else { |
112 |
+ /* if no explicit overlay was flagged as main, take the |
113 |
+ * first one */ |
114 |
+ free(orig_main_overlay); |
115 |
+ main_overlay = array_get_elem(overlays, 0); |
116 |
+ free(vars_to_read[11 /* PORTDIR */].src); |
117 |
+ vars_to_read[11 /* PORTDIR */].src = |
118 |
+ xstrdup((char *)array_get_elem(overlay_src, 0)); |
119 |
+ } |
120 |
} |
121 |
|
122 |
/* consider Portage's defaults */ |
123 |
@@ -781,10 +808,11 @@ initialize_portage_env(void) |
124 |
read_portage_env_file(pathbuf, vars_to_read); |
125 |
|
126 |
/* finally, check the env */ |
127 |
- for (i = 0; vars_to_read[i].name; ++i) { |
128 |
+ for (i = 0; vars_to_read[i].name; i++) { |
129 |
var = &vars_to_read[i]; |
130 |
s = getenv(var->name); |
131 |
- if (s != NULL) |
132 |
+ /* PORTDIR was already added to overlays above, ignore it */ |
133 |
+ if (s != NULL && strcmp(var->name, "PORTDIR") != 0) |
134 |
set_portage_env_var(var, s, var->name); |
135 |
} |
136 |
|
137 |
|
138 |
diff --git a/q.c b/q.c |
139 |
index 40cdc2a..a974df8 100644 |
140 |
--- a/q.c |
141 |
+++ b/q.c |
142 |
@@ -238,12 +238,12 @@ int q_main(int argc, char **argv) |
143 |
|
144 |
switch (var->type) { |
145 |
case _Q_BOOL: |
146 |
- printf("%s%s%s\n", |
147 |
+ printf("%s%s%s", |
148 |
YELLOW, *var->value.b ? "1" : "0", NORM); |
149 |
break; |
150 |
case _Q_STR: |
151 |
case _Q_ISTR: |
152 |
- printf("%s%s%s\n", RED, *var->value.s, NORM); |
153 |
+ printf("%s%s%s", RED, *var->value.s, NORM); |
154 |
break; |
155 |
} |
156 |
if (verbose) |
157 |
|
158 |
diff --git a/qatom.c b/qatom.c |
159 |
index 4ad6116..23d10d8 100644 |
160 |
--- a/qatom.c |
161 |
+++ b/qatom.c |
162 |
@@ -55,7 +55,7 @@ int qatom_main(int argc, char **argv) |
163 |
if (action == _COMPARE && (argc - optind) % 2) |
164 |
err("compare needs even number of arguments"); |
165 |
|
166 |
- for (i = optind; i < argc; ++i) { |
167 |
+ for (i = optind; i < argc; i++) { |
168 |
atom = atom_explode(argv[i]); |
169 |
if (atom == NULL) { |
170 |
warnf("invalid atom: %s\n", argv[i]); |
171 |
|
172 |
diff --git a/qdepends.c b/qdepends.c |
173 |
index b5e8993..6f89835 100644 |
174 |
--- a/qdepends.c |
175 |
+++ b/qdepends.c |
176 |
@@ -345,17 +345,23 @@ int qdepends_main(int argc, char **argv) |
177 |
state.qmode &= ~QMODE_INSTALLED; |
178 |
} |
179 |
|
180 |
- if ((argc == optind) && !do_pretty) |
181 |
+ if ((argc == optind) && !do_pretty) { |
182 |
+ free_set(state.udeps); |
183 |
qdepends_usage(EXIT_FAILURE); |
184 |
+ } |
185 |
|
186 |
if (do_pretty) { |
187 |
+ ret = EXIT_SUCCESS; |
188 |
while (optind < argc) { |
189 |
- if (!qdepends_print_depend(stdout, argv[optind++])) |
190 |
- return EXIT_FAILURE; |
191 |
+ if (!qdepends_print_depend(stdout, argv[optind++])) { |
192 |
+ ret = EXIT_FAILURE; |
193 |
+ break; |
194 |
+ } |
195 |
if (optind < argc) |
196 |
fprintf(stdout, "\n"); |
197 |
} |
198 |
- return EXIT_SUCCESS; |
199 |
+ free_set(state.udeps); |
200 |
+ return ret; |
201 |
} |
202 |
|
203 |
argc -= optind; |
204 |
|
205 |
diff --git a/qlop.c b/qlop.c |
206 |
index dcf1d47..d8e1d58 100644 |
207 |
--- a/qlop.c |
208 |
+++ b/qlop.c |
209 |
@@ -1014,6 +1014,42 @@ static int do_emerge_log( |
210 |
printf("\n"); |
211 |
} |
212 |
} |
213 |
+ |
214 |
+ { |
215 |
+ DECLARE_ARRAY(t); |
216 |
+ values_set(merge_averages, t); |
217 |
+ array_for_each(t, i, pkgw) { |
218 |
+ atom_implode(pkgw->atom); |
219 |
+ free(pkgw); |
220 |
+ } |
221 |
+ xarrayfree_int(t); |
222 |
+ values_set(unmerge_averages, t); |
223 |
+ array_for_each(t, i, pkgw) { |
224 |
+ atom_implode(pkgw->atom); |
225 |
+ free(pkgw); |
226 |
+ } |
227 |
+ xarrayfree_int(t); |
228 |
+ } |
229 |
+ free_set(merge_averages); |
230 |
+ free_set(unmerge_averages); |
231 |
+ array_for_each_rev(merge_matches, i, pkgw) { |
232 |
+ atom_implode(pkgw->atom); |
233 |
+ xarraydelete(merge_matches, i); |
234 |
+ } |
235 |
+ xarrayfree(merge_matches); |
236 |
+ array_for_each_rev(unmerge_matches, i, pkgw) { |
237 |
+ atom_implode(pkgw->atom); |
238 |
+ xarraydelete(unmerge_matches, i); |
239 |
+ } |
240 |
+ xarrayfree(unmerge_matches); |
241 |
+ if (atomset != NULL) { |
242 |
+ DECLARE_ARRAY(t); |
243 |
+ values_set(atomset, t); |
244 |
+ array_for_each(t, i, atom) |
245 |
+ atom_implode(atom); |
246 |
+ xarrayfree_int(t); |
247 |
+ free_set(atomset); |
248 |
+ } |
249 |
return 0; |
250 |
} |
251 |
|
252 |
@@ -1073,7 +1109,8 @@ static array_t *probe_proc(array_t *atoms) |
253 |
rpath[rpathlen] = '\0'; |
254 |
/* check if this points to a portage build: |
255 |
* <somepath>/portage/<cat>/<pf>/temp/build.log */ |
256 |
- if (strcmp(rpath + rpathlen - |
257 |
+ if (rpathlen > sizeof("/temp/build.log") && |
258 |
+ strcmp(rpath + rpathlen - |
259 |
(sizeof("/temp/build.log") - 1), |
260 |
"/temp/build.log") == 0 && |
261 |
(p = strstr(rpath, "/portage/")) != NULL) |
262 |
|
263 |
diff --git a/qmanifest.c b/qmanifest.c |
264 |
index fee0151..c4c1322 100644 |
265 |
--- a/qmanifest.c |
266 |
+++ b/qmanifest.c |
267 |
@@ -752,6 +752,7 @@ process_dir_gen(void) |
268 |
gerr = gpgme_signers_add(gctx, gkey); |
269 |
if (gerr != GPG_ERR_NO_ERROR) |
270 |
return "failed to add GPG key to sign list, is it a suitable key?"; |
271 |
+ gpgme_key_unref(gkey); |
272 |
|
273 |
gpg_pass = NULL; |
274 |
if (gpg_get_password) { |
275 |
@@ -859,11 +860,6 @@ verify_gpg_sig(const char *path, verify_msg **msgs) |
276 |
struct tm *ctime; |
277 |
gpg_sig *ret = NULL; |
278 |
|
279 |
- if ((f = fopen(path, "r")) == NULL) { |
280 |
- msgs_add(msgs, path, NULL, "failed to open: %s", strerror(errno)); |
281 |
- return NULL; |
282 |
- } |
283 |
- |
284 |
if (gpgme_new(&g_ctx) != GPG_ERR_NO_ERROR) { |
285 |
msgs_add(msgs, path, NULL, "failed to create gpgme context"); |
286 |
return NULL; |
287 |
@@ -871,17 +867,32 @@ verify_gpg_sig(const char *path, verify_msg **msgs) |
288 |
|
289 |
if (gpgme_data_new(&out) != GPG_ERR_NO_ERROR) { |
290 |
msgs_add(msgs, path, NULL, "failed to create gpgme data"); |
291 |
+ gpgme_release(g_ctx); |
292 |
+ return NULL; |
293 |
+ } |
294 |
+ |
295 |
+ if ((f = fopen(path, "r")) == NULL) { |
296 |
+ msgs_add(msgs, path, NULL, "failed to open: %s", strerror(errno)); |
297 |
+ gpgme_data_release(out); |
298 |
+ gpgme_release(g_ctx); |
299 |
return NULL; |
300 |
} |
301 |
|
302 |
if (gpgme_data_new_from_stream(&manifest, f) != GPG_ERR_NO_ERROR) { |
303 |
msgs_add(msgs, path, NULL, |
304 |
"failed to create new gpgme data from stream"); |
305 |
+ gpgme_data_release(out); |
306 |
+ gpgme_release(g_ctx); |
307 |
+ fclose(f); |
308 |
return NULL; |
309 |
} |
310 |
|
311 |
if (gpgme_op_verify(g_ctx, manifest, NULL, out) != GPG_ERR_NO_ERROR) { |
312 |
msgs_add(msgs, path, NULL, "failed to verify signature"); |
313 |
+ gpgme_data_release(out); |
314 |
+ gpgme_data_release(manifest); |
315 |
+ gpgme_release(g_ctx); |
316 |
+ fclose(f); |
317 |
return NULL; |
318 |
} |
319 |
|
320 |
@@ -891,6 +902,9 @@ verify_gpg_sig(const char *path, verify_msg **msgs) |
321 |
if (vres == NULL || vres->signatures == NULL) { |
322 |
msgs_add(msgs, path, NULL, |
323 |
"verification failed due to a missing gpg keyring"); |
324 |
+ gpgme_data_release(out); |
325 |
+ gpgme_data_release(manifest); |
326 |
+ gpgme_release(g_ctx); |
327 |
return NULL; |
328 |
} |
329 |
|
330 |
@@ -971,6 +985,8 @@ verify_gpg_sig(const char *path, verify_msg **msgs) |
331 |
} |
332 |
} |
333 |
|
334 |
+ gpgme_data_release(out); |
335 |
+ gpgme_data_release(manifest); |
336 |
gpgme_release(g_ctx); |
337 |
|
338 |
return ret; |
339 |
@@ -1529,8 +1545,10 @@ process_dir_vrfy(void) |
340 |
char *timestamp; |
341 |
verify_msg topmsg; |
342 |
verify_msg *walk = &topmsg; |
343 |
+ verify_msg *next; |
344 |
gpg_sig *gs; |
345 |
|
346 |
+ walk->next = NULL; |
347 |
gettimeofday(&startt, NULL); |
348 |
|
349 |
snprintf(buf, sizeof(buf), "metadata/layout.conf"); |
350 |
@@ -1581,10 +1599,12 @@ process_dir_vrfy(void) |
351 |
* be there |
352 |
* - recurse into directories for which Manifest files are defined |
353 |
*/ |
354 |
- walk->next = NULL; |
355 |
if (verify_manifest(".\0", str_manifest, &walk) != 0) |
356 |
ret = "manifest verification failed"; |
357 |
|
358 |
+ gettimeofday(&finisht, NULL); |
359 |
+ |
360 |
+ /* produce a report */ |
361 |
{ |
362 |
char *mfest; |
363 |
char *ebuild; |
364 |
@@ -1593,7 +1613,6 @@ process_dir_vrfy(void) |
365 |
char *lastebuild = (char *)"-"; |
366 |
char *msgline; |
367 |
const char *pfx; |
368 |
- verify_msg *next; |
369 |
|
370 |
for (walk = topmsg.next; walk != NULL; walk = walk->next) { |
371 |
mfest = walk->msg; |
372 |
@@ -1651,16 +1670,16 @@ process_dir_vrfy(void) |
373 |
format_line(pfx, msg); |
374 |
} |
375 |
} |
376 |
- |
377 |
- walk = topmsg.next; |
378 |
- while (walk != NULL) { |
379 |
- next = walk->next; |
380 |
- free(walk); |
381 |
- walk = next; |
382 |
- } |
383 |
} |
384 |
|
385 |
- gettimeofday(&finisht, NULL); |
386 |
+ /* clean up messages */ |
387 |
+ walk = topmsg.next; |
388 |
+ while (walk != NULL) { |
389 |
+ next = walk->next; |
390 |
+ free(walk->msg); |
391 |
+ free(walk); |
392 |
+ walk = next; |
393 |
+ } |
394 |
|
395 |
etime = ((double)((finisht.tv_sec - startt.tv_sec) * 1000000 + |
396 |
finisht.tv_usec) - (double)startt.tv_usec) / 1000000.0; |
397 |
|
398 |
diff --git a/qmerge.c b/qmerge.c |
399 |
index c7b234e..5b7a298 100644 |
400 |
--- a/qmerge.c |
401 |
+++ b/qmerge.c |
402 |
@@ -481,6 +481,7 @@ install_mask_check_dir( |
403 |
*npth = '\0'; |
404 |
} |
405 |
} |
406 |
+ scandir_free(files, cnt); |
407 |
} |
408 |
|
409 |
static void |
410 |
@@ -620,6 +621,9 @@ install_mask_pwd(int iargc, char **iargv, const struct stat * const st, int fd) |
411 |
qpth[cnt] = '\0'; |
412 |
|
413 |
install_mask_check_dir(masksv, masksc, st, fd, 1, INCLUDE, qpth); |
414 |
+ |
415 |
+ free(masks); |
416 |
+ free(masksv); |
417 |
} |
418 |
|
419 |
static char |
420 |
@@ -917,11 +921,13 @@ merge_tree_at(int fd_src, const char *src, int fd_dst, const char *dst, |
421 |
|
422 |
/* Make sure owner/mode is sane before we write out data */ |
423 |
if (fchown(fd_dstf, st.st_uid, st.st_gid)) { |
424 |
- warnp("could not set ownership %s", cpath); |
425 |
+ warnp("could not set ownership (%zu/%zu) for %s", |
426 |
+ (size_t)st.st_uid, (size_t)st.st_gid, cpath); |
427 |
continue; |
428 |
} |
429 |
if (fchmod(fd_dstf, st.st_mode)) { |
430 |
- warnp("could not set permission %s", cpath); |
431 |
+ warnp("could not set permission (%u) for %s", |
432 |
+ (int)st.st_mode, cpath); |
433 |
continue; |
434 |
} |
435 |
|
436 |
@@ -1439,6 +1445,7 @@ pkg_merge(int level, const depend_atom *atom, const struct pkg_t *pkg) |
437 |
printf("%s>>>%s %s%s%s/%s%s%s\n", |
438 |
YELLOW, NORM, WHITE, atom->CATEGORY, NORM, CYAN, pkg->PF, NORM); |
439 |
|
440 |
+ tree_close_cat(cat_ctx); |
441 |
tree_close(vdb); |
442 |
} |
443 |
|
444 |
|
445 |
diff --git a/tests/qmerge/dotest b/tests/qmerge/dotest |
446 |
index 86c6147..1563595 100755 |
447 |
--- a/tests/qmerge/dotest |
448 |
+++ b/tests/qmerge/dotest |
449 |
@@ -20,17 +20,20 @@ mkdir -p "${ROOT}/var/db/pkg" |
450 |
|
451 |
set +e |
452 |
|
453 |
+# sanity check on environment |
454 |
+q -Cev |
455 |
+ |
456 |
# Do a merge into an empty tree. |
457 |
|
458 |
out=$(yes | qmerge -F qmerge-test) |
459 |
-tend $? "qmerge-test: [N] basic merge" || echo "${out}" |
460 |
+tend $? "qmerge-test: [N] basic merge" || die "${out}" |
461 |
|
462 |
[[ ${out} != *"FAIL"* ]] |
463 |
-tend $? "qmerge-test: [N] FAIL messages" || echo "${out}" |
464 |
+tend $? "qmerge-test: [N] FAIL messages" || die "${out}" |
465 |
|
466 |
order=$(echo "${out}" | awk '$1 == ">>>" && $2 ~ /^pkg_/ { printf "%s ", $NF }') |
467 |
[[ ${order} == "pkg_pretend pkg_setup pkg_preinst pkg_postinst " ]] |
468 |
-tend $? "qmerge-test: [N] pkg_* order of execution" || printf '%s\n' "${order}" "${out}" |
469 |
+tend $? "qmerge-test: [N] pkg_* order of execution" || die "$(printf '%s\n' "${order}" "${out}")" |
470 |
|
471 |
ls -d "${ROOT}"/var/db/pkg/sys-devel/qmerge-test-* >/dev/null |
472 |
tend $? "qmerge-test: [N] vdb installed" |
473 |
@@ -38,25 +41,25 @@ tend $? "qmerge-test: [N] vdb installed" |
474 |
[[ -x ${ROOT}/usr/bin/qmerge-test && \ |
475 |
-f ${ROOT}/etc/some.conf && \ |
476 |
-f ${ROOT}/etc/another.conf ]] |
477 |
-tend $? "qmerge-test: [N] installed expected files" || treedir "${ROOT}" |
478 |
+tend $? "qmerge-test: [N] installed expected files" || die "$(treedir "${ROOT}")" |
479 |
|
480 |
# Now do a re-emerge. |
481 |
|
482 |
out=$(yes | qmerge -F qmerge-test) |
483 |
-tend $? "qmerge-test: [R] re-emerge" || echo "${out}" |
484 |
+tend $? "qmerge-test: [R] re-emerge" || die "${out}" |
485 |
|
486 |
[[ -x ${ROOT}/usr/bin/qmerge-test ]] |
487 |
-tend $? "qmerge-test: [R] installed expected files" || treedir "${ROOT}" |
488 |
+tend $? "qmerge-test: [R] installed expected files" || die "$(treedir "${ROOT}")" |
489 |
|
490 |
order=$(echo "${out}" | awk '$1 == ">>>" && $2 ~ /^pkg_/ { printf "%s ", $NF }') |
491 |
[[ ${order} == "pkg_pretend pkg_setup pkg_preinst pkg_postinst " ]] |
492 |
-tend $? "qmerge-test: [R] pkg_* order of execution" || printf '%s\n' "${order}" "${out}" |
493 |
+tend $? "qmerge-test: [R] pkg_* order of execution" || die "$(printf '%s\n' "${order}" "${out}")" |
494 |
|
495 |
[[ -x ${ROOT}/usr/bin/qmerge-test && \ |
496 |
-f ${ROOT}/etc/some.conf && \ |
497 |
-f ${ROOT}/etc/another.conf && \ |
498 |
-f ${ROOT}/etc/._cfg0000_some.conf ]] |
499 |
-tend $? "qmerge-test: [R] re-installed expected files" || treedir "${ROOT}" |
500 |
+tend $? "qmerge-test: [R] re-installed expected files" || die "$(treedir "${ROOT}")" |
501 |
|
502 |
# Finally do an unmerge. |
503 |
|
504 |
@@ -64,17 +67,17 @@ echo alkdsjfalksdf > "${ROOT}/etc/some.conf" |
505 |
|
506 |
rm -f "${ROOT}/etc/._cfg0000_some.conf" |
507 |
out=$(yes | qmerge -FU qmerge-test) |
508 |
-tend $? "qmerge-test: [C] uninstall" || echo "${out}" |
509 |
+tend $? "qmerge-test: [C] uninstall" || die "${out}" |
510 |
|
511 |
order=$(echo "${out}" | awk '$1 == ">>>" { printf "%s ", $NF }') |
512 |
[[ ${order} == "pkg_prerm pkg_postrm " ]] |
513 |
-tend $? "qmerge-test: [C] pkg_* order of execution" || printf '%s\n' "${order}" "${out}" |
514 |
+tend $? "qmerge-test: [C] pkg_* order of execution" || die "$(printf '%s\n' "${order}" "${out}")" |
515 |
|
516 |
[[ ! -x ${ROOT}/usr/bin/qmerge-test && \ |
517 |
-f ${ROOT}/etc/some.conf && \ |
518 |
! -f ${ROOT}/etc/another.conf && \ |
519 |
! -d ${ROOT}/var/db/pkg/sys-devel ]] |
520 |
-tend $? "qmerge-test: [C] uninstalled expected files" || treedir "${ROOT}" |
521 |
+tend $? "qmerge-test: [C] uninstalled expected files" || die "$(treedir "${ROOT}")" |
522 |
|
523 |
set -e |
524 |
|
525 |
|
526 |
diff --git a/tests/quse/dotest b/tests/quse/dotest |
527 |
index ada7bd9..93bef56 100755 |
528 |
--- a/tests/quse/dotest |
529 |
+++ b/tests/quse/dotest |
530 |
@@ -8,6 +8,10 @@ mktmpdir |
531 |
|
532 |
mkportdir "${as}/portdir" |
533 |
|
534 |
+# check inference of PORTDIR with repos.conf |
535 |
+q -evC PORTDIR |
536 |
+q -ovC |
537 |
+ |
538 |
d=${PORTDIR}/profiles |
539 |
entries() { |
540 |
sed -e 's:#.*::' -e '/^$/d' "$1" |