/* Try to remove all packages causing refcounts in this tracking record */ static retvalue removesourcepackage(trackingdb t, struct trackedpackage *pkg, struct distribution *distribution) { struct target *target; retvalue result, r; int i; result = RET_NOTHING; for (target = distribution->targets ; target != NULL ; target = target->next) { r = target_initpackagesdb(target, READWRITE); RET_ENDUPDATE(result, r); if (RET_IS_OK(r)) { r = targetremovesourcepackage(t, pkg, distribution, target); RET_UPDATE(result, r); RET_UPDATE(distribution->status, r); r = target_closepackagesdb(target); RET_ENDUPDATE(result, r); RET_ENDUPDATE(distribution->status, r); if (RET_WAS_ERROR(result)) return result; } } for (i = 0 ; i < pkg->filekeys.count ; i++) { const char *filekey = pkg->filekeys.values[i]; if (pkg->refcounts[i] <= 0) continue; if (pkg->filetypes[i] != ft_ALL_BINARY && pkg->filetypes[i] != ft_SOURCE && pkg->filetypes[i] != ft_ARCH_BINARY) continue; fprintf(stderr, "There was an inconsistency in the tracking data of '%s':\n" "'%s' has refcount > 0, but was nowhere found.\n", distribution->codename, filekey); pkg->refcounts[i] = 0; } return result; }
retvalue target_free(struct target *target) { retvalue result = RET_OK; if (target == NULL) return RET_OK; if (target->packages != NULL) { result = target_closepackagesdb(target); } else result = RET_OK; if (target->wasmodified && !target->noexport) { fprintf(stderr, "Warning: database '%s' was modified but no index file was exported.\n" "Changes will only be visible after the next 'export'!\n", target->identifier); } target->distribution = NULL; free(target->identifier); free(target->relativedirectory); free(target); return result; }