]> git.ipfire.org Git - pakfire.git/commitdiff
build: Create a new repository for the build result
authorMichael Tremer <michael.tremer@ipfire.org>
Mon, 31 Oct 2022 15:12:14 +0000 (15:12 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Mon, 31 Oct 2022 15:12:14 +0000 (15:12 +0000)
That will allow us to perform some post-build checks.

Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/build.c
src/libpakfire/include/pakfire/repo.h

index 12b8a5a25df65355d23ed426f6f61c08ac47aa55..decfec879296a8d8d6b0b779782342767da3340c 100644 (file)
@@ -74,6 +74,9 @@ struct pakfire_build {
        // Local build repo
        struct pakfire_repo* repo;
 
+       // The result repository
+       struct pakfire_repo* result;
+
        // Buildroot
        char buildroot[PATH_MAX];
 
@@ -643,6 +646,11 @@ static int pakfire_build_packages(struct pakfire_build* build,
                        goto ERROR;
        }
 
+       // Rescan the build repository to import all packages again
+       r = pakfire_repo_scan(build->result, 0);
+       if (r)
+               goto ERROR;
+
        // Success
        r = 0;
 
@@ -737,6 +745,11 @@ static int pakfire_build_run_post_build_scripts(struct pakfire_build* build) {
 }
 
 static void pakfire_build_free(struct pakfire_build* build) {
+       if (build->result) {
+               pakfire_repo_clean(build->result, PAKFIRE_REPO_CLEAN_FLAGS_DESTROY);
+               pakfire_repo_unref(build->result);
+       }
+
        if (build->repo)
                pakfire_repo_unref(build->repo);
 
@@ -933,14 +946,14 @@ static int pakfire_build_setup_ccache(struct pakfire_build* build) {
        return 0;
 }
 
-static int pakfire_build_setup_repos(struct pakfire_build* build) {
+static int pakfire_build_setup_local_repo(struct pakfire_build* build) {
        int r;
 
        // Create a new repository
        r = pakfire_repo_create(&build->repo, build->pakfire, PAKFIRE_REPO_LOCAL);
        if (r) {
                ERROR(build->pakfire, "Could not create repository %s: %m\n", PAKFIRE_REPO_LOCAL);
-               return 1;
+               return r;
        }
 
        // Set description
@@ -955,6 +968,55 @@ static int pakfire_build_setup_repos(struct pakfire_build* build) {
        return 0;
 }
 
+static int pakfire_build_setup_result_repo(struct pakfire_build* build) {
+       char path[PATH_MAX] = "/var/tmp/.pakfire-build-repo.XXXXXX";
+       char url[PATH_MAX];
+       int r;
+
+       // Create a new repository
+       r = pakfire_repo_create(&build->result, build->pakfire, PAKFIRE_REPO_RESULT);
+       if (r) {
+               ERROR(build->pakfire, "Could not create repository %s: %m", PAKFIRE_REPO_RESULT);
+               return r;
+       }
+
+       // Set description
+       pakfire_repo_set_description(build->result, _("Build Repository"));
+
+       // Create a temporary directory
+       const char* p = pakfire_mkdtemp(path);
+       if (!p) {
+               ERROR(build->pakfire, "Could not create a the build repository: %m\n");
+               return 1;
+       }
+
+       // Format the URL
+       r = pakfire_string_format(url, "file://%s", path);
+       if (r)
+               return r;
+
+       // Set the URL
+       pakfire_repo_set_baseurl(build->result, url);
+
+       return r;
+}
+
+static int pakfire_build_setup_repos(struct pakfire_build* build) {
+       int r;
+
+       // Set up the local repository
+       r = pakfire_build_setup_local_repo(build);
+       if (r)
+               return r;
+
+       // Setup the result repository
+       r = pakfire_build_setup_result_repo(build);
+       if (r)
+               return r;
+
+       return 0;
+}
+
 PAKFIRE_EXPORT int pakfire_build_create(struct pakfire_build** build,
                struct pakfire* pakfire, const char* id, int flags) {
        int r;
index e1a0ffd44d60a0b03b9fa5a6ea91280532ab2705..fa47ce3374e66513b8f2a3ddb1fb61bc3c1644df 100644 (file)
@@ -106,6 +106,7 @@ int pakfire_repo_compose(struct pakfire* pakfire, const char* path, int flags,
 #define PAKFIRE_REPO_LOCAL              "local"
 #define PAKFIRE_REPO_LOCAL_PATH         "file://" PAKFIRE_PRIVATE_DIR "/local/%{distro}/%{version}"
 #define PAKFIRE_REPO_LOCAL_PRIORITY      1000
+#define PAKFIRE_REPO_RESULT             "@build"
 #define PAKFIRE_REPO_SYSTEM                            "@system"
 
 int pakfire_repo_name_equals(struct pakfire_repo* repo, const char* name);