static void write_info(Repo *repo, FILE *fp, int (*keyfilter)(Repo *repo, Repokey *key, void *kfdata), void *kfdata, Repodata *info, const char *location) { Id h, *keyarray = 0; int i; repo_write(repo, fp, keyfilter, kfdata, &keyarray); h = repodata_new_handle(info); if (keyarray) { for (i = 0; keyarray[i]; i++) repodata_add_idarray(info, h, REPOSITORY_KEYS, keyarray[i]); } solv_free(keyarray); repodata_set_str(info, h, REPOSITORY_LOCATION, location); repodata_add_flexarray(info, SOLVID_META, REPOSITORY_EXTERNAL, h); }
PyObject *Repo_write(RepoObject *self, PyObject *args) { const char *filename; char exception[STRING_SIZE]; if (!PyArg_ParseTuple(args, "s", &filename)) { return NULL; } // Prepare the pool and internalize all attributes. //_Pool_prepare(self->_repo->pool); FILE *fp = NULL; if ((fp = fopen(filename, "wb")) == NULL) { snprintf(exception, STRING_SIZE - 1, "Could not open file for writing: %s (%s).", filename, strerror(errno)); PyErr_SetString(PyExc_RuntimeError, exception); return NULL; } repo_write(self->_repo, fp); fclose(fp); Py_RETURN_NONE; }
int tool_write(Repo *repo, const char *basename, const char *attrname) { Repodata *data; Repodata *info = 0; Repokey *key; char **languages = 0; int nlanguages = 0; int i, j, k, l; Id *addedfileprovides = 0; struct keyfilter_data kd; memset(&kd, 0, sizeof(kd)); info = repo_add_repodata(repo, 0); repodata_set_str(info, SOLVID_META, REPOSITORY_TOOLVERSION, LIBSOLV_TOOLVERSION); pool_addfileprovides_ids(repo->pool, 0, &addedfileprovides); if (addedfileprovides && *addedfileprovides) { kd.haveaddedfileprovides = 1; for (i = 0; addedfileprovides[i]; i++) repodata_add_idarray(info, SOLVID_META, REPOSITORY_ADDEDFILEPROVIDES, addedfileprovides[i]); } solv_free(addedfileprovides); pool_freeidhashes(repo->pool); /* free some mem */ if (basename) { char fn[4096]; FILE *fp; int has_DU = 0; int has_FL = 0; /* find languages and other info */ FOR_REPODATAS(repo, i, data) { for (j = 1, key = data->keys + j; j < data->nkeys; j++, key++) { const char *keyname = pool_id2str(repo->pool, key->name); if (key->name == SOLVABLE_DISKUSAGE) has_DU = 1; if (key->name == SOLVABLE_FILELIST) has_FL = 1; for (k = 0; languagetags[k] != 0; k++) if (!strncmp(keyname, languagetags[k], strlen(languagetags[k]))) break; if (!languagetags[k]) continue; l = strlen(languagetags[k]); if (strlen(keyname + l) > 5) continue; for (k = 0; k < nlanguages; k++) if (!strcmp(languages[k], keyname + l)) break; if (k < nlanguages) continue; languages = solv_realloc2(languages, nlanguages + 1, sizeof(char *)); languages[nlanguages++] = strdup(keyname + l); } } /* write language subfiles */ for (i = 0; i < nlanguages; i++) { sprintf(fn, "%s.%s.solv", basename, languages[i]); if (!(fp = fopen(fn, "w"))) { perror(fn); exit(1); } write_info(repo, fp, keyfilter_language, languages[i], info, fn); fclose(fp); kd.haveexternal = 1; } /* write DU subfile */ if (has_DU) { sprintf(fn, "%s.DU.solv", basename); if (!(fp = fopen(fn, "w"))) { perror(fn); exit(1); } write_info(repo, fp, keyfilter_DU, 0, info, fn); fclose(fp); kd.haveexternal = 1; } /* write filelist */ if (has_FL) { sprintf(fn, "%s.FL.solv", basename); if (!(fp = fopen(fn, "w"))) { perror(fn); exit(1); } write_info(repo, fp, keyfilter_FL, 0, info, fn); fclose(fp); kd.haveexternal = 1; } /* write everything else */ sprintf(fn, "%s.solv", basename); if (!(fp = fopen(fn, "w"))) { perror(fn); exit(1); } kd.languages = languages; kd.nlanguages = nlanguages; repodata_internalize(info); repo_write(repo, fp, keyfilter_other, &kd, 0); fclose(fp); for (i = 0; i < nlanguages; i++) free(languages[i]); solv_free(languages); repodata_free(info); return 0; } if (attrname) { FILE *fp; test_separate = 1; fp = fopen(attrname, "w"); write_info(repo, fp, keyfilter_attr, 0, info, attrname); fclose(fp); kd.haveexternal = 1; } repodata_internalize(info); repo_write(repo, stdout, keyfilter_solv, &kd, 0); repodata_free(info); return 0; }