]> git.ipfire.org Git - people/ms/pakfire.git/commitdiff
repo: Write repomd.json after composing a repository
authorMichael Tremer <michael.tremer@ipfire.org>
Fri, 20 Aug 2021 15:49:43 +0000 (15:49 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Fri, 20 Aug 2021 15:49:43 +0000 (15:49 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
configure.ac
src/libpakfire/repo.c

index 3143d6873130d874aa1ed212c2e749241c5e28dd..18bb4057d1b473db1f462a6fa6c6080e2c97581e 100644 (file)
@@ -221,7 +221,7 @@ PKG_CHECK_MODULES([ARCHIVE], [libarchive >= 3.5.0])
 PKG_CHECK_MODULES([CURL], [libcurl])
 PKG_CHECK_MODULES([PYTHON_DEVEL], [python-${PYTHON_VERSION}-embed],
        [], [PKG_CHECK_MODULES([PYTHON_DEVEL], [python-${PYTHON_VERSION}])])
-PKG_CHECK_MODULES([JSON_C], [json-c])
+PKG_CHECK_MODULES([JSON_C], [json-c >= 0.15])
 PKG_CHECK_MODULES([LZMA], [liblzma])
 PKG_CHECK_MODULES([OPENSSL], [openssl >= 1.1.1])
 PKG_CHECK_MODULES([PCRE2], [libpcre2-8])
index 6857606fdfd8d3ee611d10a13e2116dffa30bffd..404de777dd749615435c69e0672175d93b556648 100644 (file)
@@ -1017,9 +1017,9 @@ PAKFIRE_EXPORT int pakfire_repo_refresh(struct pakfire_repo* repo, int force) {
        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;
 
@@ -1047,14 +1047,14 @@ static int pakfire_repo_write_database(struct pakfire_repo* repo, const char* pa
        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;
@@ -1078,6 +1078,8 @@ 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
@@ -1091,12 +1093,98 @@ static int pakfire_repo_write_metadata(struct pakfire_repo* repo) {
        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,