From ae59ba471de8c4fbf9b5b99030f71b5758ce1a2e Mon Sep 17 00:00:00 2001 From: Igor Gnatenko Date: Nov 02 2018 16:00:14 +0000 Subject: Support .rust2rpm.conf Signed-off-by: Igor Gnatenko --- diff --git a/0001-name-spec-patch_file-by-real-crate-name.patch b/0001-name-spec-patch_file-by-real-crate-name.patch index 27fbbfa..3049ab2 100644 --- a/0001-name-spec-patch_file-by-real-crate-name.patch +++ b/0001-name-spec-patch_file-by-real-crate-name.patch @@ -1,7 +1,7 @@ From 0dc9fc182edf0791ca697f587e48dd39948d63c1 Mon Sep 17 00:00:00 2001 From: Igor Gnatenko Date: Mon, 10 Sep 2018 23:37:40 +0200 -Subject: [PATCH 1/8] name spec/patch_file by real crate name +Subject: [PATCH 01/10] name spec/patch_file by real crate name When renaming using patch file, we really want to change file names too. diff --git a/0002-generate-doc-statements.patch b/0002-generate-doc-statements.patch index fb5ec59..fb8f36b 100644 --- a/0002-generate-doc-statements.patch +++ b/0002-generate-doc-statements.patch @@ -1,7 +1,7 @@ From 561280a0ea35f226ef243526be2bbb656db44af6 Mon Sep 17 00:00:00 2001 From: Igor Gnatenko Date: Mon, 10 Sep 2018 23:40:18 +0200 -Subject: [PATCH 2/8] generate %doc statements +Subject: [PATCH 02/10] generate %doc statements Signed-off-by: Igor Gnatenko --- diff --git a/0003-do-better-for-renamed-crates.patch b/0003-do-better-for-renamed-crates.patch index 0c9c3fd..e70a367 100644 --- a/0003-do-better-for-renamed-crates.patch +++ b/0003-do-better-for-renamed-crates.patch @@ -1,7 +1,7 @@ From 2050880140d4953b9ebdc7211e30df3ccf5dd61d Mon Sep 17 00:00:00 2001 From: Igor Gnatenko Date: Tue, 11 Sep 2018 00:06:50 +0200 -Subject: [PATCH 3/8] do better for renamed crates +Subject: [PATCH 03/10] do better for renamed crates Signed-off-by: Igor Gnatenko --- diff --git a/0004-remove-pre-3.6-leftovers.patch b/0004-remove-pre-3.6-leftovers.patch index 79d041d..0f2a391 100644 --- a/0004-remove-pre-3.6-leftovers.patch +++ b/0004-remove-pre-3.6-leftovers.patch @@ -1,7 +1,7 @@ From e6e9cbbb71199c2773b47fa21f1c917a167c1743 Mon Sep 17 00:00:00 2001 From: Igor Gnatenko Date: Tue, 11 Sep 2018 10:43:53 +0200 -Subject: [PATCH 4/8] remove pre-3.6 leftovers +Subject: [PATCH 04/10] remove pre-3.6 leftovers Signed-off-by: Igor Gnatenko --- diff --git a/0005-Remove-half-downloaded-crate-on-C.patch b/0005-Remove-half-downloaded-crate-on-C.patch index ef0eb21..6daebcc 100644 --- a/0005-Remove-half-downloaded-crate-on-C.patch +++ b/0005-Remove-half-downloaded-crate-on-C.patch @@ -1,7 +1,7 @@ From 2f12c83d14afe71e9efed2d1be62e1e610e602e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Fri, 17 Aug 2018 10:03:48 +0200 -Subject: [PATCH 5/8] Remove half-downloaded crate on ^C +Subject: [PATCH 05/10] Remove half-downloaded crate on ^C Subsequent invocations would fail with an error about a corrupted file. We don't have support for resuming a failed download, so let's remove the diff --git a/0006-Throw-an-error-if-s-is-used-without-a-crate.patch b/0006-Throw-an-error-if-s-is-used-without-a-crate.patch index 44bc5b1..1f2a4e0 100644 --- a/0006-Throw-an-error-if-s-is-used-without-a-crate.patch +++ b/0006-Throw-an-error-if-s-is-used-without-a-crate.patch @@ -1,7 +1,7 @@ From 5a1cde5b8dcaea74ebb2050879036bf46df63adc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Fri, 17 Aug 2018 10:18:59 +0200 -Subject: [PATCH 6/8] Throw an error if -s is used without a crate +Subject: [PATCH 06/10] Throw an error if -s is used without a crate In the future we might want to be smarter and find the crate, but let's at least not ignore the option completely. diff --git a/0007-split-features-into-subpackages.patch b/0007-split-features-into-subpackages.patch index fe96334..0d4c7e2 100644 --- a/0007-split-features-into-subpackages.patch +++ b/0007-split-features-into-subpackages.patch @@ -1,7 +1,7 @@ -From d7caa1148d5fcac70030e3fb1eb698927e69960f Mon Sep 17 00:00:00 2001 +From 6f95899a21799054165858cacbe588a2a8bc6020 Mon Sep 17 00:00:00 2001 From: Igor Gnatenko Date: Fri, 26 Oct 2018 11:20:13 +0200 -Subject: [PATCH 7/8] split features into subpackages +Subject: [PATCH 07/10] split features into subpackages References: https://discussion.fedoraproject.org/t/rfc-new-crates-packaging-design-features-have-their-own-subpackages/563?u=ignatenkobrain Signed-off-by: Igor Gnatenko diff --git a/0008-add-support-for-dependencies-with-same-name.patch b/0008-add-support-for-dependencies-with-same-name.patch index dbbad89..490338c 100644 --- a/0008-add-support-for-dependencies-with-same-name.patch +++ b/0008-add-support-for-dependencies-with-same-name.patch @@ -1,7 +1,7 @@ -From 129d556d19d2e41135f5e98ed028d7d00e66b524 Mon Sep 17 00:00:00 2001 +From a5fd01ecd0fd600a096c060ddfe77a21f54b045f Mon Sep 17 00:00:00 2001 From: Igor Gnatenko Date: Tue, 30 Oct 2018 20:37:38 +0100 -Subject: [PATCH 8/8] add support for dependencies with same name +Subject: [PATCH 08/10] add support for dependencies with same name Reported-by: Josh Stone References: https://internals.rust-lang.org/t/optional-dependencies-with-same-name/8728 diff --git a/0009-add-support-for-feeding-user-configuration.patch b/0009-add-support-for-feeding-user-configuration.patch new file mode 100644 index 0000000..1a33fae --- /dev/null +++ b/0009-add-support-for-feeding-user-configuration.patch @@ -0,0 +1,148 @@ +From 52b6ff8d55d59ace29950621ed41175ac31fa90c Mon Sep 17 00:00:00 2001 +From: Igor Gnatenko +Date: Wed, 31 Oct 2018 18:03:21 +0100 +Subject: [PATCH 09/10] add support for feeding user configuration + +Signed-off-by: Igor Gnatenko +--- + README.md | 26 ++++++++++++++++++++++++++ + README.rst | 5 ----- + rust2rpm/__main__.py | 13 +++++++++++++ + rust2rpm/templates/main.spec | 17 ++++++++++++++++- + 4 files changed, 55 insertions(+), 6 deletions(-) + create mode 100644 README.md + delete mode 100644 README.rst + +diff --git a/README.md b/README.md +new file mode 100644 +index 0000000..22b4b30 +--- /dev/null ++++ b/README.md +@@ -0,0 +1,26 @@ ++# rust2rpm ++ ++Convert Rust crates to RPM. ++ ++## `.rust2rpm.conf` ++ ++You can place configuration file which is used as source for additional ++information for spec generation. ++ ++Some simple example would be better than many words ;) ++ ++```ini ++[DEFAULT] ++buildrequires = ++ pkgconfig(foo) >= 1.2.3 ++lib.requires = ++ pkgconfig(foo) >= 1.2.3 ++ ++[fedora] ++bin.requires = ++ findutils ++buildrequires = ++lib.requires = ++lib+default.requires = ++ pkgconfig(bar) >= 2.0.0 ++``` +diff --git a/README.rst b/README.rst +deleted file mode 100644 +index 8866027..0000000 +--- a/README.rst ++++ /dev/null +@@ -1,5 +0,0 @@ +-======== +-rust2rpm +-======== +- +-Convert Rust crates to RPM. +diff --git a/rust2rpm/__main__.py b/rust2rpm/__main__.py +index d19cb47..18fac5c 100644 +--- a/rust2rpm/__main__.py ++++ b/rust2rpm/__main__.py +@@ -199,6 +199,11 @@ def make_diff_metadata(crate, version, patch=False, store=False): + shutil.copy2(cratef, os.path.join(os.getcwd(), f"{metadata.name}-{version}.crate")) + return crate, diff, metadata + ++def to_list(s): ++ if not s: ++ return [] ++ return list(filter(None, (l.strip() for l in s.splitlines()))) ++ + def main(): + parser = argparse.ArgumentParser("rust2rpm", + formatter_class=argparse.RawTextHelpFormatter) +@@ -232,6 +237,7 @@ def main(): + store=args.store_crate) + + JINJA_ENV.globals["normalize_deps"] = normalize_deps ++ JINJA_ENV.globals["to_list"] = to_list + template = JINJA_ENV.get_template("main.spec") + + if args.patch and len(diff) > 0: +@@ -287,6 +293,13 @@ def main(): + kwargs["license"] = license + kwargs["license_comments"] = comments + ++ conf = configparser.ConfigParser() ++ conf.read(".rust2rpm.conf") ++ if args.target not in conf: ++ conf.add_section(args.target) ++ ++ kwargs["distconf"] = conf[args.target] ++ + spec_file = f"rust-{metadata.name}.spec" + spec_contents = template.render(md=metadata, patch_file=patch_file, **kwargs) + if args.stdout: +diff --git a/rust2rpm/templates/main.spec b/rust2rpm/templates/main.spec +index 0d9a80b..d901e6d 100644 +--- a/rust2rpm/templates/main.spec ++++ b/rust2rpm/templates/main.spec +@@ -65,6 +65,9 @@ BuildRequires: {{ req }} + {% endfor %} + %endif + {% endif %} ++{% for req in to_list(distconf.get("buildrequires"))|sort %} ++BuildRequires: {{ req }} ++{% endfor %} + + %global _description \ + {% if md.description is none %} +@@ -81,6 +84,9 @@ Summary: %{summary} + {% if rust_group is defined %} + Group: # FIXME + {% endif %} ++ {% for req in to_list(distconf.get("bin.requires"))|sort %} ++Requires: {{ req }} ++ {% endfor %} + + %description -n %{crate} + %{summary}. +@@ -106,7 +112,13 @@ Group: # FIXME + {% do features.insert(0, None) %} + {% do features.insert(1, "default") %} + {% for feature in features %} +- {% set pkg = "-n %%{name}+%s-devel"|format(feature) if feature is not none else " devel" %} ++ {% if feature is none %} ++ {% set pkg = " devel" %} ++ {% set conf_prefix = "lib" %} ++ {% else %} ++ {% set pkg = "-n %%{name}+%s-devel"|format(feature) %} ++ {% set conf_prefix = "lib+%s"|format(feature) %} ++ {% endif %} + %package {{ pkg }} + Summary: %{summary} + {% if rust_group is defined %} +@@ -122,6 +134,9 @@ Requires: cargo + Requires: {{ req }} + {% endfor %} + {% endif %} ++ {% for req in to_list(distconf.get("%s.requires"|format(conf_prefix)))|sort %} ++Requires: {{ req }} ++ {% endfor %} + + %description {{ pkg }} %{_description} + +-- +2.19.1 + diff --git a/0010-trivial-use-f-strings-everywhere.patch b/0010-trivial-use-f-strings-everywhere.patch new file mode 100644 index 0000000..3d8ca14 --- /dev/null +++ b/0010-trivial-use-f-strings-everywhere.patch @@ -0,0 +1,94 @@ +From 00ed1ce05d9dd4c8042f27ca959350ce34fb1be5 Mon Sep 17 00:00:00 2001 +From: Igor Gnatenko +Date: Wed, 31 Oct 2018 17:00:58 +0100 +Subject: [PATCH 10/10] trivial: use f-strings everywhere + +Signed-off-by: Igor Gnatenko +--- + rust2rpm/__main__.py | 22 +++++++++++----------- + 1 file changed, 11 insertions(+), 11 deletions(-) + +diff --git a/rust2rpm/__main__.py b/rust2rpm/__main__.py +index 18fac5c..b4eb624 100644 +--- a/rust2rpm/__main__.py ++++ b/rust2rpm/__main__.py +@@ -79,7 +79,7 @@ def detect_packager(): + if git is not None: + name = subprocess.check_output([git, "config", "user.name"], universal_newlines=True).strip() + email = subprocess.check_output([git, "config", "user.email"], universal_newlines=True).strip() +- return "{} <{}>".format(name, email) ++ return f"{name} <{email}>" + + return None + +@@ -108,23 +108,23 @@ def local_crate(crate, version): + def download(crate, version): + if version is None: + # Now we need to get latest version +- url = requests.compat.urljoin(API_URL, "crates/{}/versions".format(crate)) ++ url = requests.compat.urljoin(API_URL, f"crates/{crate}/versions") + req = requests.get(url) + req.raise_for_status() + versions = req.json()["versions"] + version = next(version["num"] for version in versions if not version["yanked"]) + + os.makedirs(CACHEDIR, exist_ok=True) +- cratef_base = "{}-{}.crate".format(crate, version) ++ cratef_base = f"{crate}-{version}.crate" + cratef = os.path.join(CACHEDIR, cratef_base) + if not os.path.isfile(cratef): +- url = requests.compat.urljoin(API_URL, "crates/{}/{}/download#".format(crate, version)) ++ url = requests.compat.urljoin(API_URL, f"crates/{crate}/{version}/download#") + req = requests.get(url, stream=True) + req.raise_for_status() + total = int(req.headers["Content-Length"]) + with remove_on_error(cratef), \ + open(cratef, "wb") as f: +- for chunk in tqdm.tqdm(req.iter_content(), "Downloading {}".format(cratef_base), ++ for chunk in tqdm.tqdm(req.iter_content(), f"Downloading {cratef_base}".format(cratef_base), + total=total, unit="B", unit_scale=True): + f.write(chunk) + return cratef, crate, version +@@ -132,14 +132,14 @@ def download(crate, version): + @contextlib.contextmanager + def toml_from_crate(cratef, crate, version): + with tempfile.TemporaryDirectory() as tmpdir: +- target_dir = "{}/".format(tmpdir) ++ target_dir = f"{tmpdir}/" + with tarfile.open(cratef, "r") as archive: + for n in archive.getnames(): + if not os.path.abspath(os.path.join(target_dir, n)).startswith(target_dir): + raise Exception("Unsafe filenames!") + archive.extractall(target_dir) +- toml_relpath = "{}-{}/Cargo.toml".format(crate, version) +- toml = "{}/{}".format(tmpdir, toml_relpath) ++ toml_relpath = f"{crate}-{version}/Cargo.toml" ++ toml = f"{tmpdir}/{toml_relpath}" + if not os.path.isfile(toml): + raise IOError("crate does not contain Cargo.toml file") + yield toml +@@ -270,7 +270,7 @@ def main(): + kwargs["include_provides"] = True + kwargs["include_requires"] = True + else: +- assert False, "Unknown target {!r}".format(args.target) ++ assert False, f"Unknown target {args.target!r}" + + if args.target == "mageia": + kwargs["pkg_release"] = "%mkrel 1" +@@ -303,10 +303,10 @@ def main(): + spec_file = f"rust-{metadata.name}.spec" + spec_contents = template.render(md=metadata, patch_file=patch_file, **kwargs) + if args.stdout: +- print("# {}".format(spec_file)) ++ print(f"# {spec_file}") + print(spec_contents) + if patch_file is not None: +- print("# {}".format(patch_file)) ++ print(f"# {patch_file}") + print("".join(diff), end="") + else: + with open(spec_file, "w") as fobj: +-- +2.19.1 + diff --git a/rust-packaging.spec b/rust-packaging.spec index 21198c6..524b739 100644 --- a/rust-packaging.spec +++ b/rust-packaging.spec @@ -4,7 +4,7 @@ Name: rust-packaging Version: 6 -Release: 14%{?dist} +Release: 15%{?dist} Summary: RPM macros for building Rust packages on various architectures License: MIT @@ -19,6 +19,8 @@ Patch0006: 0006-Throw-an-error-if-s-is-used-without-a-crate.patch # Still in PR Patch0007: 0007-split-features-into-subpackages.patch Patch0008: 0008-add-support-for-dependencies-with-same-name.patch +Patch0009: 0009-add-support-for-feeding-user-configuration.patch +Patch0010: 0010-trivial-use-f-strings-everywhere.patch BuildArch: noarch ExclusiveArch: %{rust_arches} noarch @@ -80,6 +82,9 @@ py.test-%{python3_version} -vv test.py %{python3_sitelib}/rust2rpm/ %changelog +* Fri Nov 02 2018 Igor Gnatenko - 6-15 +- Support .rust2rpm.conf + * Wed Oct 31 2018 Igor Gnatenko - 6-14 - Fix syntax error