generator: define upstream_version / crate_version as necessary
- crate_version is defined if crate version != package version - upstream_version is defined if crate version != crate version
This commit is contained in:
parent
6087084fa0
commit
e9cfd222be
5 changed files with 30 additions and 15 deletions
|
@ -46,7 +46,7 @@ def main():
|
||||||
parser.error("crate/path argument missing and autodetection failed")
|
parser.error("crate/path argument missing and autodetection failed")
|
||||||
|
|
||||||
try:
|
try:
|
||||||
project, diffs, metadata, doc_files, license_files = process_project(
|
project, version, diffs, metadata, doc_files, license_files = process_project(
|
||||||
args.crate, args.version, args.patch, args.patch_foreign, args.store_crate
|
args.crate, args.version, args.patch, args.patch_foreign, args.store_crate
|
||||||
)
|
)
|
||||||
except NoVersionsError:
|
except NoVersionsError:
|
||||||
|
@ -132,6 +132,7 @@ def main():
|
||||||
|
|
||||||
spec_contents = spec_render_crate(
|
spec_contents = spec_render_crate(
|
||||||
metadata=metadata,
|
metadata=metadata,
|
||||||
|
upstream_version=version,
|
||||||
target=args.target,
|
target=args.target,
|
||||||
rpm_name=rpm_name,
|
rpm_name=rpm_name,
|
||||||
patch_file_automatic=patch_files[0],
|
patch_file_automatic=patch_files[0],
|
||||||
|
|
|
@ -140,13 +140,14 @@ def project_is_path(path: str) -> bool:
|
||||||
return "/" in path or path in {".", ".."}
|
return "/" in path or path in {".", ".."}
|
||||||
|
|
||||||
|
|
||||||
def guess_local_project_name_from_path(project: str) -> str:
|
def guess_local_project_version_from_path(project: str) -> tuple[str, str]:
|
||||||
if os.path.isdir(project):
|
if os.path.isdir(project):
|
||||||
dir_name = os.path.split(os.path.abspath(project))[1]
|
dir_name = os.path.split(os.path.abspath(project))[1]
|
||||||
else:
|
else:
|
||||||
dir_name = os.path.split(os.path.dirname(os.path.abspath(project)))[1]
|
dir_name = os.path.split(os.path.dirname(os.path.abspath(project)))[1]
|
||||||
name = dir_name.rstrip("0123456789.").removesuffix("-")
|
project = dir_name.rstrip("0123456789.").removesuffix("-")
|
||||||
return name
|
version = dir_name.removeprefix(f"{project}-")
|
||||||
|
return project, version
|
||||||
|
|
||||||
|
|
||||||
@contextlib.contextmanager
|
@contextlib.contextmanager
|
||||||
|
@ -161,7 +162,7 @@ def toml_temp_copy(toml_path: str):
|
||||||
|
|
||||||
def process_project_local(
|
def process_project_local(
|
||||||
project: str, patch: bool, patch_foreign: bool
|
project: str, patch: bool, patch_foreign: bool
|
||||||
) -> tuple[str, tuple[Optional[list[str]], Optional[list[str]]], Metadata, list[str], list[str]]:
|
) -> tuple[str, str, tuple[Optional[list[str]], Optional[list[str]]], Metadata, list[str], list[str]]:
|
||||||
if os.path.isdir(project):
|
if os.path.isdir(project):
|
||||||
toml_path, doc_files, license_files = local_cargo_dir(project)
|
toml_path, doc_files, license_files = local_cargo_dir(project)
|
||||||
else:
|
else:
|
||||||
|
@ -175,7 +176,7 @@ def process_project_local(
|
||||||
|
|
||||||
# fall back to the directory name for determining the name / version
|
# fall back to the directory name for determining the name / version
|
||||||
# of the project heuristically
|
# of the project heuristically
|
||||||
name = guess_local_project_name_from_path(project)
|
name, version = guess_local_project_version_from_path(project)
|
||||||
|
|
||||||
log.warn(f"Falling back to {name!r} as the name of the project (based on the name of the containing folder).")
|
log.warn(f"Falling back to {name!r} as the name of the project (based on the name of the containing folder).")
|
||||||
diffs = (None, None)
|
diffs = (None, None)
|
||||||
|
@ -183,6 +184,7 @@ def process_project_local(
|
||||||
else:
|
else:
|
||||||
package = metadata.packages[0]
|
package = metadata.packages[0]
|
||||||
name = package.name
|
name = package.name
|
||||||
|
version = package.version
|
||||||
features = package.get_feature_names()
|
features = package.get_feature_names()
|
||||||
|
|
||||||
with toml_temp_copy(toml_path) as temp_toml:
|
with toml_temp_copy(toml_path) as temp_toml:
|
||||||
|
@ -191,7 +193,7 @@ def process_project_local(
|
||||||
# ensure metadata is up-to-date with changes from patches
|
# ensure metadata is up-to-date with changes from patches
|
||||||
metadata = Metadata.from_cargo(toml_path)
|
metadata = Metadata.from_cargo(toml_path)
|
||||||
|
|
||||||
return name, diffs, metadata, doc_files, license_files
|
return name, version, diffs, metadata, doc_files, license_files
|
||||||
|
|
||||||
|
|
||||||
def process_project(
|
def process_project(
|
||||||
|
@ -200,7 +202,7 @@ def process_project(
|
||||||
patch: bool,
|
patch: bool,
|
||||||
patch_foreign: bool,
|
patch_foreign: bool,
|
||||||
store_crate: bool,
|
store_crate: bool,
|
||||||
) -> tuple[str, tuple[Optional[list[str]], Optional[list[str]]], Metadata, list[str], list[str]]:
|
) -> tuple[str, str, tuple[Optional[list[str]], Optional[list[str]]], Metadata, list[str], list[str]]:
|
||||||
if project_is_path(project) and not project.endswith(".crate"):
|
if project_is_path(project) and not project.endswith(".crate"):
|
||||||
# project points into unpacked sources:
|
# project points into unpacked sources:
|
||||||
if store_crate:
|
if store_crate:
|
||||||
|
@ -241,10 +243,11 @@ def process_project(
|
||||||
raise ValueError("Failed to process invalid .crate file (cargo workspace)")
|
raise ValueError("Failed to process invalid .crate file (cargo workspace)")
|
||||||
|
|
||||||
package = metadata.packages[0]
|
package = metadata.packages[0]
|
||||||
|
version = package.version
|
||||||
features = package.get_feature_names()
|
features = package.get_feature_names()
|
||||||
diffs = make_patches(name, version, patch, patch_foreign, toml_path, features)
|
diffs = make_patches(name, version, patch, patch_foreign, toml_path, features)
|
||||||
|
|
||||||
# ensure metadata is up-to-date with changes from patches
|
# ensure metadata is up-to-date with changes from patches
|
||||||
metadata = Metadata.from_cargo(toml_path)
|
metadata = Metadata.from_cargo(toml_path)
|
||||||
|
|
||||||
return name, diffs, metadata, doc_files, license_files
|
return name, version, diffs, metadata, doc_files, license_files
|
||||||
|
|
|
@ -115,6 +115,7 @@ def template_args_plain(date: Optional[time.struct_time], packager: Optional[str
|
||||||
def spec_render_crate(
|
def spec_render_crate(
|
||||||
*,
|
*,
|
||||||
metadata: Metadata,
|
metadata: Metadata,
|
||||||
|
upstream_version: str,
|
||||||
target: str,
|
target: str,
|
||||||
rpm_name: str,
|
rpm_name: str,
|
||||||
patch_file_automatic: Optional[str],
|
patch_file_automatic: Optional[str],
|
||||||
|
@ -239,6 +240,7 @@ def spec_render_crate(
|
||||||
"crate_name": package.name,
|
"crate_name": package.name,
|
||||||
"crate_version": package.version,
|
"crate_version": package.version,
|
||||||
"crate_license": package.license,
|
"crate_license": package.license,
|
||||||
|
"upstream_version": upstream_version,
|
||||||
# Parameters derived from rust2rpm.conf
|
# Parameters derived from rust2rpm.conf
|
||||||
"conf_buildrequires": distconf.buildrequires,
|
"conf_buildrequires": distconf.buildrequires,
|
||||||
"conf_test_requires": distconf.testrequires,
|
"conf_test_requires": distconf.testrequires,
|
||||||
|
|
|
@ -9,6 +9,9 @@
|
||||||
{% if crate_version != rpm_version %}
|
{% if crate_version != rpm_version %}
|
||||||
%global crate_version {{ crate_version }}
|
%global crate_version {{ crate_version }}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
{% if crate_version != upstream_version %}
|
||||||
|
%global upstream_version {{ upstream_version }}
|
||||||
|
{% endif %}
|
||||||
{% if conf_supported_arches %}
|
{% if conf_supported_arches %}
|
||||||
|
|
||||||
# compile and run tests only on supported architectures
|
# compile and run tests only on supported architectures
|
||||||
|
@ -35,10 +38,12 @@ License: {{ rpm_license|default("# FIXME") }}
|
||||||
{{ rpm_license_comments }}
|
{{ rpm_license_comments }}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
URL: https://crates.io/crates/{{ crate_name }}
|
URL: https://crates.io/crates/{{ crate_name }}
|
||||||
{% if crate_version == rpm_version %}
|
{% if crate_version != rpm_version %}
|
||||||
Source: %{crates_source}
|
|
||||||
{% else %}
|
|
||||||
Source: %{crates_source %{crate} %{crate_version}}
|
Source: %{crates_source %{crate} %{crate_version}}
|
||||||
|
{% elif crate_version != upstream_version %}
|
||||||
|
Source: %{crates_source %{crate} %{upstream_version}}
|
||||||
|
{% else %}
|
||||||
|
Source: %{crates_source}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if rpm_patch_file_automatic is not none %}
|
{% if rpm_patch_file_automatic is not none %}
|
||||||
# Automatically generated patch to strip dependencies and normalize metadata
|
# Automatically generated patch to strip dependencies and normalize metadata
|
||||||
|
@ -181,10 +186,12 @@ use {% if feature is not none %}the "{{ feature }}" feature of {% endif %}the "%
|
||||||
{% endif -%}
|
{% endif -%}
|
||||||
|
|
||||||
%prep
|
%prep
|
||||||
{% if crate_version == rpm_version %}
|
{% if crate_version != rpm_version %}
|
||||||
%autosetup -n %{crate}-%{version} -p1
|
|
||||||
{% else %}
|
|
||||||
%autosetup -n %{crate}-%{crate_version} -p1
|
%autosetup -n %{crate}-%{crate_version} -p1
|
||||||
|
{% elif crate_version != upstream_version %}
|
||||||
|
%autosetup -n %{crate}-%{upstream_version} -p1
|
||||||
|
{% else %}
|
||||||
|
%autosetup -n %{crate}-%{version} -p1
|
||||||
{% endif %}
|
{% endif %}
|
||||||
%cargo_prep
|
%cargo_prep
|
||||||
|
|
||||||
|
|
|
@ -34,6 +34,7 @@ FIXED_DATE = time.gmtime(12345)
|
||||||
def test_spec_file_render_crate(filename: str, target: str):
|
def test_spec_file_render_crate(filename: str, target: str):
|
||||||
crate_name_version = filename.removesuffix(".json")
|
crate_name_version = filename.removesuffix(".json")
|
||||||
crate = crate_name_version.rsplit("-", 1)[0]
|
crate = crate_name_version.rsplit("-", 1)[0]
|
||||||
|
version = crate_name_version.rsplit("-", 1)[1]
|
||||||
|
|
||||||
args = get_parser().parse_args(["foobar", f"--target={target}", "-a" if target == "fedora" else "--no-rpmautospec"])
|
args = get_parser().parse_args(["foobar", f"--target={target}", "-a" if target == "fedora" else "--no-rpmautospec"])
|
||||||
rpm_name = package_name_suffixed(crate, args.suffix)
|
rpm_name = package_name_suffixed(crate, args.suffix)
|
||||||
|
@ -43,6 +44,7 @@ def test_spec_file_render_crate(filename: str, target: str):
|
||||||
|
|
||||||
rendered = spec_render_crate(
|
rendered = spec_render_crate(
|
||||||
target=target,
|
target=target,
|
||||||
|
upstream_version=version,
|
||||||
metadata=metadata,
|
metadata=metadata,
|
||||||
rpm_name=rpm_name,
|
rpm_name=rpm_name,
|
||||||
patch_file_automatic=f"{crate}-patch1.diff",
|
patch_file_automatic=f"{crate}-patch1.diff",
|
||||||
|
|
Loading…
Reference in a new issue