You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
rust-packaging/0008-add-support-for-depend...

75 lines
2.7 KiB

From a1d3a84645aa7bbe5ca07b60bead1ddf90a21cc1 Mon Sep 17 00:00:00 2001
From: Igor Gnatenko <ignatenkobrain@fedoraproject.org>
Date: Tue, 30 Oct 2018 20:37:38 +0100
Subject: [PATCH 08/14] add support for dependencies with same name
Reported-by: Josh Stone <jistone@redhat.com>
References: https://internals.rust-lang.org/t/optional-dependencies-with-same-name/8728
Signed-off-by: Igor Gnatenko <ignatenkobrain@fedoraproject.org>
---
rust2rpm/metadata.py | 32 ++++++++++++++++++++------------
1 file changed, 20 insertions(+), 12 deletions(-)
diff --git a/rust2rpm/metadata.py b/rust2rpm/metadata.py
index 4929cdd..328b67a 100644
--- a/rust2rpm/metadata.py
+++ b/rust2rpm/metadata.py
@@ -1,5 +1,6 @@
__all__ = ["Dependency", "Metadata"]
+import collections
import copy
import json
import subprocess
@@ -126,9 +127,11 @@ class Metadata:
self.description = md.get("description")
# dependencies + build-dependencies → runtime
- deps_by_name = {dep["name"]: Dependency.from_json(dep)
- for dep in md["dependencies"]
- if dep["kind"] != "dev"}
+ deps_by_name = collections.defaultdict(list)
+ for dep in md["dependencies"]:
+ if dep["kind"] == "dev":
+ continue
+ deps_by_name[dep["name"]].append(Dependency.from_json(dep))
deps_by_feature = {}
for feature, f_deps in md["features"].items():
@@ -139,18 +142,23 @@ class Metadata:
features.add(dep)
else:
pkg, _, f = dep.partition("/")
- dep = copy.deepcopy(deps_by_name[pkg])
- if f:
- dep.features = {f}
- deps.add(dep)
+ for dep in deps_by_name[pkg]:
+ dep = copy.deepcopy(dep)
+ if f:
+ dep.features = {f}
+ deps.add(dep)
deps_by_feature[feature] = (features, deps)
mandatory_deps = set()
- for dep in deps_by_name.values():
- if dep.optional:
- deps_by_feature[dep.name] = ({None}, {copy.deepcopy(dep)})
- else:
- mandatory_deps.add(copy.deepcopy(dep))
+ for name, deps in deps_by_name.items():
+ fdeps = set()
+ for dep in deps:
+ if dep.optional:
+ fdeps.add(copy.deepcopy(dep))
+ else:
+ mandatory_deps.add(copy.deepcopy(dep))
+ if fdeps:
+ deps_by_feature[name] = ({None}, fdeps)
deps_by_feature[None] = (set(), mandatory_deps)
if "default" not in deps_by_feature:
--
2.20.1