Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/rpm-software-management/createrepo_c.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTomas Mlcoch <tmlcoch@redhat.com>2016-12-26 12:44:05 +0300
committerTomas Mlcoch <tmlcoch@redhat.com>2016-12-26 12:44:05 +0300
commit375cb752bc2ce1e2d7ecb898f926b5f33933b9f0 (patch)
tree28fa4fe8ffa8c7cd41321ed71e70c40c74d83384
parent748891ff8ee524c2d37926c608cd2794f88013f3 (diff)
Consider versions during dep filtering for requires/provides (Issue #67)my_versions_in_dep_filtering
This should avoid situations where a package provides and requires same capability (a dependency) with different versions but createrepo_c strip the require down (because it already saw it in provides). This should fix the issue in a better way than PR #68
-rw-r--r--src/parsehdr.c21
1 files changed, 16 insertions, 5 deletions
diff --git a/src/parsehdr.c b/src/parsehdr.c
index ceaf884..5a14f7b 100644
--- a/src/parsehdr.c
+++ b/src/parsehdr.c
@@ -319,7 +319,10 @@ cr_package_from_header(Header hdr,
};
// Hastable with filenames from provided
- GHashTable *provided_hashtable = g_hash_table_new(g_str_hash, g_str_equal);
+ GHashTable *provided_hashtable = g_hash_table_new_full(g_str_hash,
+ g_str_equal,
+ g_free,
+ NULL);
// Hashtable with already processed files from requires
GHashTable *ap_hashtable = g_hash_table_new_full(g_str_hash,
@@ -350,6 +353,12 @@ cr_package_from_header(Header hdr,
const char *flags = cr_flag_to_str(num_flags);
const char *full_version = rpmtdGetString(fileversions);
+ _cleanup_free_ char *depnfv = NULL; // Dep NameFlagsVersion
+ depnfv = g_strconcat(filename,
+ flags ? flags : "",
+ full_version ? full_version : "",
+ NULL);
+
// Requires specific stuff
if (deptype == DEP_REQUIRES) {
// Skip requires which start with "rpmlib("
@@ -358,14 +367,14 @@ cr_package_from_header(Header hdr,
}
// Skip package primary files
- if (g_hash_table_lookup_extended(filenames_hashtable, filename, NULL, NULL)) {
+ if (*filename == '/' && g_hash_table_lookup_extended(filenames_hashtable, filename, NULL, NULL)) {
if (cr_is_primary(filename)) {
continue;
}
}
// Skip files which are provided
- if (g_hash_table_lookup_extended(provided_hashtable, filename, NULL, NULL)) {
+ if (g_hash_table_lookup_extended(provided_hashtable, depnfv, NULL, NULL)) {
continue;
}
@@ -412,10 +421,12 @@ cr_package_from_header(Header hdr,
g_free(evr);
switch (deptype) {
- case DEP_PROVIDES:
- g_hash_table_replace(provided_hashtable, dependency->name, dependency->name);
+ case DEP_PROVIDES: {
+ char *depnfv_dup = g_strdup(depnfv);
+ g_hash_table_replace(provided_hashtable, depnfv_dup, NULL);
pkg->provides = g_slist_prepend(pkg->provides, dependency);
break;
+ }
case DEP_CONFLICTS:
pkg->conflicts = g_slist_prepend(pkg->conflicts, dependency);
break;