return pakfire_repo_refresh_metadata(repo, force);
}
-static int pakfire_repo_write_database(struct pakfire_repo* repo, const char* path) {
+static int pakfire_repo_write_database(struct pakfire_repo* repo, const char* path,
+ char* filename, size_t length) {
char database[PATH_MAX];
- char filename[NAME_MAX];
char tmp[PATH_MAX];
int r;
f = NULL;
// Create a filename for the database file
- r = pakfire_strftime_now(filename, "repodata/%Y-%m-%d-%H%M.%s.db");
+ r = __pakfire_strftime_now(filename, length, "%Y-%m-%d-%H%M.%s.solv");
if (r) {
ERROR(repo->pakfire, "Could not format database filename: %m\n");
goto ERROR;
}
// Make final database path
- r = pakfire_path_join(database, path, filename);
+ r = pakfire_string_format(database, "%s/repodata/%s", path, filename);
if (r < 0) {
ERROR(repo->pakfire, "Could not join database path: %m\n");
goto ERROR;
}
static int pakfire_repo_write_metadata(struct pakfire_repo* repo) {
+ struct json_object* repomd = NULL;
+ FILE* f = NULL;
int r = 1;
// This can only be called for local repositories
if (!path)
return 1;
+ char database[PATH_MAX];
+
// Write the database
- r = pakfire_repo_write_database(repo, path);
+ r = pakfire_repo_write_database(repo, path, database, sizeof(database) - 1);
if (r)
return r;
- return 0;
+ // Compose JSON object
+ repomd = json_object_new_object();
+ if (!repomd) {
+ ERROR(repo->pakfire, "Could not allocate a new JSON object: %m\n");
+ r = 1;
+ goto ERROR;
+ }
+
+ // Set version
+ struct json_object* repomd_version = json_object_new_int64(0);
+ if (!repomd_version) {
+ ERROR(repo->pakfire, "Could not create version: %m\n");
+ r = 1;
+ goto ERROR;
+ }
+
+ r = json_object_object_add(repomd, "version", repomd_version);
+ if (r) {
+ ERROR(repo->pakfire, "Could not add version to repomd.json: %m\n");
+ goto ERROR;
+ }
+
+ time_t revision = time(NULL);
+
+ // Set revision
+ struct json_object* repomd_revision = json_object_new_int64(revision);
+ if (!repomd_revision) {
+ ERROR(repo->pakfire, "Could not create revision: %m\n");
+ r = 1;
+ goto ERROR;
+ }
+
+ r = json_object_object_add(repomd, "revision", repomd_revision);
+ if (r) {
+ ERROR(repo->pakfire, "Could not add revision to repomd.json: %m\n");
+ goto ERROR;
+ }
+
+ // Set database
+ struct json_object* repomd_database = json_object_new_string(database);
+ if (!repomd_database) {
+ ERROR(repo->pakfire, "Could not create database string: %m\n");
+ r = 1;
+ goto ERROR;
+ }
+
+ r = json_object_object_add(repomd, "database", repomd_database);
+ if (r) {
+ ERROR(repo->pakfire, "Could not add database to repomd.json: %m\n");
+ goto ERROR;
+ }
+
+ // XXX database hash is missing
+
+ char repomd_path[PATH_MAX];
+
+ // Make path to repomd.json
+ r = pakfire_string_format(repomd_path, "%s/repodata/repomd.json", path);
+ if (r < 0)
+ goto ERROR;
+
+ // Open repomd.json for writing
+ f = fopen(repomd_path, "w");
+ if (!f) {
+ ERROR(repo->pakfire, "Could not open %s for writing: %m\n", repomd_path);
+ r = 1;
+ goto ERROR;
+ }
+
+ // Write out repomd.json
+ r = json_object_to_fd(fileno(f), repomd, JSON_C_TO_STRING_PRETTY);
+ if (r) {
+ ERROR(repo->pakfire, "Could not write repomd.json: %m\n");
+ goto ERROR;
+ }
+
+ // Success
+ r = 0;
+
+ERROR:
+ if (f)
+ fclose(f);
+ json_object_put(repomd);
+
+ return r;
}
PAKFIRE_EXPORT int pakfire_repo_compose(struct pakfire* pakfire, const char* path,