]> git.ipfire.org Git - pakfire.git/commitdiff
package: Cache nevra in package object
authorMichael Tremer <michael.tremer@ipfire.org>
Tue, 27 Apr 2021 11:50:25 +0000 (11:50 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Tue, 27 Apr 2021 11:50:25 +0000 (11:50 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/archive.c
src/libpakfire/include/pakfire/package.h
src/libpakfire/package.c
src/libpakfire/step.c

index 77bbba0ca773d1e6afb884b7ecdfc8519d4d2743..28102909b19b76db2f90793511b2da090a6cfd70 100644 (file)
@@ -770,7 +770,7 @@ PAKFIRE_EXPORT char* pakfire_archive_extraction_path(PakfireArchive archive, con
        if (pakfire_package_is_source(pkg) && !target)
                target = "/usr/src/packages";
 
-       char* nevra = pakfire_package_get_nevra(pkg);
+       const char* nevra = pakfire_package_get_nevra(pkg);
 
        // Append package name and version to path
        int r = pakfire_path_join(prefix, target, nevra);
@@ -778,7 +778,6 @@ PAKFIRE_EXPORT char* pakfire_archive_extraction_path(PakfireArchive archive, con
        // Cleanup
        pakfire_package_unref(pkg);
        pakfire_repo_unref(repo);
-       free(nevra);
 
        if (r < 0)
                return NULL;
@@ -1380,10 +1379,9 @@ PAKFIRE_EXPORT PakfirePackage pakfire_archive_make_package(PakfireArchive archiv
                free(arch);
 
 #ifdef ENABLE_DEBUG
-       char* nevra = pakfire_package_get_nevra(pkg);
+       const char* nevra = pakfire_package_get_nevra(pkg);
        DEBUG(archive->pakfire, "Created package %s (%p) from archive %p\n",
                nevra, pkg, archive);
-       free(nevra);
 #endif
 
        // Set path
index 671ba8ec2d62d5a82af9b412d30f4bc586dbe84e..6d8cbc8c21dfd0dc18fae7bd605e8e0957e3e8f8 100644 (file)
@@ -39,7 +39,7 @@ int pakfire_package_identical(PakfirePackage pkg1, PakfirePackage pkg2);
 int pakfire_package_cmp(PakfirePackage pkg1, PakfirePackage pkg2);
 int pakfire_package_evr_cmp(PakfirePackage pkg1, PakfirePackage pkg2);
 
-char* pakfire_package_get_nevra(PakfirePackage pkg);
+const char* pakfire_package_get_nevra(PakfirePackage pkg);
 const char* pakfire_package_get_name(PakfirePackage pkg);
 void pakfire_package_set_name(PakfirePackage pkg, const char* name);
 const char* pakfire_package_get_evr(PakfirePackage pkg);
index f20aaf034549404b37e6b8535a0a82a3fb89c1ba..28d6dddb5482a08119953e024ea8183b49247f83 100644 (file)
@@ -51,6 +51,8 @@ struct _PakfirePackage {
        Id id;
        PakfireRepo repo;
 
+       char nevra[NAME_MAX];
+
        char filename[NAME_MAX];
        char path[PATH_MAX];
 };
@@ -190,13 +192,15 @@ Id pakfire_package_id(PakfirePackage pkg) {
        return pkg->id;
 }
 
-PAKFIRE_EXPORT char* pakfire_package_get_nevra(PakfirePackage pkg) {
-       Pool* pool = pakfire_get_solv_pool(pkg->pakfire);
-       Solvable* s = get_solvable(pkg);
+PAKFIRE_EXPORT const char* pakfire_package_get_nevra(PakfirePackage pkg) {
+       if (!*pkg->nevra) {
+               Pool* pool = pakfire_get_solv_pool(pkg->pakfire);
+               Solvable* s = get_solvable(pkg);
 
-       const char* nevra = pool_solvable2str(pool, s);
+               pakfire_string_set(pkg->nevra, pool_solvable2str(pool, s));
+       }
 
-       return strdup(nevra);
+       return pkg->nevra;
 }
 
 PAKFIRE_EXPORT const char* pakfire_package_get_name(PakfirePackage pkg) {
index e9a69a905459ed3ed450b70803254c66a0862962..764ca040e7279e6de821a35021357bca0041f003 100644 (file)
@@ -200,10 +200,9 @@ static int pakfire_step_verify(PakfireStep step) {
        // Fetch the archive
        step->archive = pakfire_package_get_archive(step->package);
        if (!step->archive) {
-               char* nevra = pakfire_package_get_nevra(step->package);
+               const char* nevra = pakfire_package_get_nevra(step->package);
                ERROR(step->pakfire, "Could not open package archive for %s: %s\n",
                        nevra, strerror(errno));
-               free(nevra);
 
                return -1;
        }
@@ -294,9 +293,8 @@ static int pakfire_step_extract(PakfireStep step) {
        // Extract payload to the root of the Pakfire instance
        int r = pakfire_archive_extract(step->archive, NULL);
        if (r) {
-               char* nevra = pakfire_package_get_nevra(step->package);
+               const char* nevra = pakfire_package_get_nevra(step->package);
                ERROR(step->pakfire, "Could not extract package %s: %d\n", nevra, r);
-               free(nevra);
        }
 
        // Is it necessary to call ldconfig?