return pkg->filename;
}
+static int pakfire_package_make_cache_path(struct pakfire_package* pkg) {
+ const char* filename = pakfire_package_get_string(pkg, PAKFIRE_PKG_FILENAME);
+
+ enum pakfire_digest_types digest_type = PAKFIRE_DIGEST_UNDEFINED;
+ size_t digest_length = 0;
+
+ // Fetch the digest
+ const unsigned char* digest = pakfire_package_get_digest(pkg,
+ &digest_type, &digest_length);
+
+ if (digest && digest_length >= 4)
+ return pakfire_cache_path(pkg->pakfire, pkg->path,
+ "%02x/%02x/%02x/%02x/%s", digest[0], digest[1], digest[2], digest[3], filename);
+
+ return pakfire_cache_path(pkg->pakfire, pkg->path, "%s", filename);
+}
+
PAKFIRE_EXPORT const char* pakfire_package_get_string(
struct pakfire_package* pkg, const enum pakfire_package_key key) {
const char* ret = NULL;
ret = solvable_lookup_str(s, SOLVABLE_PACKAGER);
break;
+ case PAKFIRE_PKG_PATH:
+ if (!*pkg->path) {
+ const char* base = solvable_lookup_str(s, SOLVABLE_MEDIABASE);
+ if (base) {
+ const char* filename = pakfire_package_get_string(pkg, PAKFIRE_PKG_FILENAME);
+ if (!filename)
+ return NULL;
+
+ pakfire_string_format(pkg->path, "%s/%s", base, filename);
+ } else {
+ r = pakfire_package_make_cache_path(pkg);
+ if (r)
+ return NULL;
+ }
+ }
+
+ return pkg->path;
+
case PAKFIRE_PKG_FILENAME:
ret = solvable_lookup_str(s, SOLVABLE_MEDIAFILE);
Pool* pool = pakfire_get_solv_pool(pkg->pakfire);
Solvable* s = get_solvable(pkg);
+ const char* basename = NULL;
+ const char* dirname = NULL;
+
switch (key) {
// Do not allow to change name, evr, or arch
case PAKFIRE_PKG_NAME:
id = SOLVABLE_PACKAGER;
break;
+ case PAKFIRE_PKG_PATH:
+ if (value) {
+ basename = pakfire_basename(value);
+ dirname = pakfire_dirname(value);
+ }
+
+ if (basename)
+ solvable_set_str(s, SOLVABLE_MEDIAFILE, basename);
+ else
+ solvable_unset(s, SOLVABLE_MEDIAFILE);
+
+ if (dirname)
+ solvable_set_str(s, SOLVABLE_MEDIABASE, dirname);
+ else
+ solvable_unset(s, SOLVABLE_MEDIABASE);
+
+ // Cache the path
+ pakfire_string_set(pkg->path, value);
+
+ // Mark the package as changed
+ pakfire_package_has_changed(pkg);
+
+ return 0;
+
case PAKFIRE_PKG_FILENAME:
id = SOLVABLE_MEDIAFILE;
break;
return r;
}
-static int pakfire_package_make_cache_path(struct pakfire_package* pkg) {
- const char* filename = pakfire_package_get_string(pkg, PAKFIRE_PKG_FILENAME);
-
- enum pakfire_digest_types digest_type = PAKFIRE_DIGEST_UNDEFINED;
- size_t digest_length = 0;
-
- // Fetch the digest
- const unsigned char* digest = pakfire_package_get_digest(pkg,
- &digest_type, &digest_length);
-
- if (digest && digest_length >= 4)
- return pakfire_cache_path(pkg->pakfire, pkg->path,
- "%02x/%02x/%02x/%02x/%s", digest[0], digest[1], digest[2], digest[3], filename);
-
- return pakfire_cache_path(pkg->pakfire, pkg->path, "%s", filename);
-}
-
-PAKFIRE_EXPORT const char* pakfire_package_get_path(struct pakfire_package* pkg) {
- int r;
-
- if (!*pkg->path) {
- const char* base = pakfire_package_get_string(pkg, SOLVABLE_MEDIABASE);
- if (base) {
- const char* filename = pakfire_package_get_string(pkg, PAKFIRE_PKG_FILENAME);
- if (!filename)
- return NULL;
-
- pakfire_string_format(pkg->path, "%s/%s", base, filename);
- } else {
- r = pakfire_package_make_cache_path(pkg);
- if (r)
- return NULL;
- }
- }
-
- return pkg->path;
-}
-
-PAKFIRE_EXPORT void pakfire_package_set_path(struct pakfire_package* pkg, const char* path) {
- const char* basename = pakfire_basename(path);
- const char* dirname = pakfire_dirname(path);
-
- if (basename)
- pakfire_package_set_string(pkg, SOLVABLE_MEDIAFILE, basename);
-
- if (dirname)
- pakfire_package_set_string(pkg, SOLVABLE_MEDIABASE, dirname);
-
- pakfire_string_set(pkg->path, path);
-}
-
int pakfire_package_is_installed(struct pakfire_package* pkg) {
Pool* pool = pakfire_get_solv_pool(pkg->pakfire);
Solvable* s = get_solvable(pkg);
struct pakfire_archive* archive = NULL;
// Otherwise open the archive from the cache
- const char* path = pakfire_package_get_path(pkg);
+ const char* path = pakfire_package_get_string(pkg, PAKFIRE_PKG_PATH);
if (!path)
return NULL;