X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=tools%2Ffindfileconflicts.c;h=712602d99f6ee350e6c685334e771d0a8f596573;hb=294b4f8038f0914011ebd93e77383690c862e19c;hp=88833d53993e7b52336accf0e87aafc50d1ea56f;hpb=0a5fdc05f0d01e810270f75c52492837415e9fe3;p=platform%2Fupstream%2Flibsolv.git diff --git a/tools/findfileconflicts.c b/tools/findfileconflicts.c index 88833d5..712602d 100644 --- a/tools/findfileconflicts.c +++ b/tools/findfileconflicts.c @@ -1,3 +1,6 @@ +/* vim: sw=2 et + */ + #include #include @@ -14,21 +17,20 @@ iterate_handle(Pool *pool, Id p, void *cbdata) { Solvable *s = pool->solvables + p; Id rpmdbid; + void *handle; - if (!p) - { - rpm_byrpmdbid(0, 0, (void **)cbdata); - return 0; - } if (!s->repo->rpmdbid) return 0; rpmdbid = s->repo->rpmdbid[p - s->repo->start]; if (!rpmdbid) return 0; - return rpm_byrpmdbid(rpmdbid, 0, (void **)cbdata); + handle = rpm_byrpmdbid(cbdata, rpmdbid); + if (!handle) + fprintf(stderr, "rpm_byrpmdbid: %s\n", pool_errstr(pool)); + return handle; } -int main() +int main(int argc, char **argv) { Pool *pool; Repo *installed; @@ -37,32 +39,60 @@ int main() int i; Queue todo, conflicts; void *state = 0; + char *rootdir = 0; + if (argc == 3 && !strcmp(argv[1], "--root")) + rootdir = argv[2]; pool = pool_create(); + if (rootdir) + pool_set_rootdir(pool, rootdir); + pool_setdebuglevel(pool, 1); installed = repo_create(pool, "@System"); pool_set_installed(pool, installed); - repo_add_rpmdb(installed, 0, 0, 0); + if (repo_add_rpmdb(installed, 0, REPO_USE_ROOTDIR)) + { + fprintf(stderr, "findfileconflicts: %s\n", pool_errstr(pool)); + exit(1); + } queue_init(&todo); queue_init(&conflicts); FOR_REPO_SOLVABLES(installed, p, s) queue_push(&todo, p); - pool_findfileconflicts(pool, &todo, &conflicts, &iterate_handle, (void *)&state); + state = rpm_state_create(pool, pool_get_rootdir(pool)); + pool_findfileconflicts(pool, &todo, 0, &conflicts, FINDFILECONFLICTS_USE_SOLVABLEFILELIST | FINDFILECONFLICTS_CHECK_DIRALIASING | FINDFILECONFLICTS_USE_ROOTDIR, &iterate_handle, state); + rpm_state_free(state); queue_free(&todo); - for (i = 0; i < conflicts.count; i += 5) - printf("%s: %s[%s] %s[%s]\n", id2str(pool, conflicts.elements[i]), solvid2str(pool, conflicts.elements[i + 1]), id2str(pool, conflicts.elements[i + 2]), solvid2str(pool, conflicts.elements[i + 3]), id2str(pool, conflicts.elements[i + 4])); + for (i = 0; i < conflicts.count; i += 6) + { + if (conflicts.elements[i] != conflicts.elements[i + 3]) + printf("%s - %s: %s[%s] %s[%s]\n", pool_id2str(pool, conflicts.elements[i]), pool_id2str(pool, conflicts.elements[i + 3]), pool_solvid2str(pool, conflicts.elements[i + 1]), pool_id2str(pool, conflicts.elements[i + 2]), pool_solvid2str(pool, conflicts.elements[i + 4]), pool_id2str(pool, conflicts.elements[i + 5])); + else + printf("%s: %s[%s] %s[%s]\n", pool_id2str(pool, conflicts.elements[i]), pool_solvid2str(pool, conflicts.elements[i + 1]), pool_id2str(pool, conflicts.elements[i + 2]), pool_solvid2str(pool, conflicts.elements[i + 4]), pool_id2str(pool, conflicts.elements[i + 5])); + } if (conflicts.count) { Queue job; + int problemcnt; + queue_init(&job); pool_add_fileconflicts_deps(pool, &conflicts); pool_addfileprovides(pool); pool_createwhatprovides(pool); pool_setdebuglevel(pool, 0); Solver *solv = solver_create(pool); - solv->fixsystem = 1; - solver_solve(solv, &job); - if (solv->problems.count) + queue_push2(&job, SOLVER_VERIFY|SOLVER_SOLVABLE_ALL, 0); +#if 0 + solver_set_flag(solv, SOLVER_FLAG_ALLOW_UNINSTALL, 1); +#endif + problemcnt = solver_solve(solv, &job); + if (problemcnt) solver_printallsolutions(solv); + else + { + Transaction *trans = solver_create_transaction(solv); + transaction_print(trans); + transaction_free(trans); + } queue_free(&job); solver_free(solv); }