#67 Add support for prerelease versions
Merged 5 years ago by ignatenkobrain. Opened 5 years ago by ignatenkobrain.
fedora-rust/ ignatenkobrain/rust2rpm prerelease  into  master

file modified
+38
@@ -1,1 +1,39 @@ 

  %rust_arches x86_64 i686 armv7hl aarch64 ppc64 ppc64le s390x

+ %version_no_tilde() %{lua:

+     local sep = rpm.expand('%1')

+     local ver = rpm.expand('%2')

+ \

+     if sep == '%1' then

+         sep = '-'

+     end

+ \

+     if ver == '%2' then

+         ver = rpm.expand('%version')

+     end

+     ver = ver:gsub('~', sep)

+ \

+     print(ver)

+ }

+ %__crates_url https://crates.io/api/v1/crates/

+ %crates_source() %{lua:

+     local crate = rpm.expand('%1')

+     local version = rpm.expand('%2')

+     local url = rpm.expand('%__crates_url')

+ \

+     if crate == '%1' then

+         crate = rpm.expand('%real_crate')

+     end

+     if crate == '%real_crate' then

+         crate = rpm.expand('%crate')

+     end

+     if crate == '%crate' then

+         crate = rpm.expand('%name')

+     end

+ \

+     if version == '%2' then

+         version = rpm.expand('%version')

+     end

+     version = version:gsub('~', '-')

+ \

+     print(url .. crate .. '/' .. version .. '/download#/' .. crate .. '-' .. version .. '.crate')

+ }

file modified
+12 -6
@@ -45,11 +45,13 @@ 

                  # Any means any

                  continue

              ver = req.spec

-             if ver.prerelease:

-                 raise NotImplementedError(f"Pre-release requirement is not supported: {ver}")

              if req.kind in (req.KIND_NEQ, req.KIND_EMPTY):

                  raise NotImplementedError(f"'!=' and empty kinds are not supported: {req}")

-             coerced = semver.Version.coerce(str(ver))

+             coerced = str(semver.Version.coerce(str(ver)))

+             if ver.prerelease:

+                 coerced = coerced.replace("-", "~")

+                 # This will advance us to closest stable version (2.0.0-beta.6 → 2.0.0)

+                 ver = ver.next_patch()

Is this going to increase the patch version for each pre-release version?

              if req.kind == req.KIND_EQUAL:

                  req.kind = req.KIND_SHORTEQ

              if req.kind in (req.KIND_CARET, req.KIND_COMPATIBLE):
@@ -107,7 +109,11 @@ 

  class Metadata:

      def __init__(self, name, version):

          self.name = name

-         self.version = version

+         self._version = version

+         version_normalized = Dependency._normalize_req(f"={self._version}")

+         if len(version_normalized) != 1:

+             raise Exception(f"Incorrect version: {self._version}")

+         self.version = version_normalized[0][1]

          self.license = None

          self.license_file = None

          self.readme = None
@@ -187,7 +193,7 @@ 

      def provides(self, feature=None):

          if feature not in self.dependencies:

              raise KeyError(f"Feature {feature!r} doesn't exist")

-         return Dependency(self.name, f"={self.version}", features={feature})

+         return Dependency(self.name, f"={self._version}", features={feature})

  

      @classmethod

      def _resolve(cls, deps_by_feature, feature):
@@ -207,7 +213,7 @@ 

              return self._resolve(self.dependencies, feature)[1]

          else:

              features, deps = self.dependencies[feature]

-             fdeps = set(Dependency(self.name, f"={self.version}", features={feature})

+             fdeps = set(Dependency(self.name, f"={self._version}", features={feature})

                          for feature in features)

              return fdeps | deps

  

file modified
+3 -7
@@ -31,11 +31,7 @@ 

  {{ license_comments }}

  {% endif %}

  URL:            https://crates.io/crates/{{ crate }}

- {% if md.name != crate %}

- Source0:        https://crates.io/api/v1/crates/%{real_crate}/%{version}/download#/%{crate}-%{version}.crate

- {% else %}

- Source0:        https://crates.io/api/v1/crates/%{crate}/%{version}/download#/%{crate}-%{version}.crate

- {% endif %}

+ Source:         %{crates_source}

  {% if patch_file is not none %}

  {% if target == "opensuse" %}

  # PATCH-FIX-OPENSUSE {{ patch_file }} -- Initial patched metadata
@@ -161,9 +157,9 @@ 

  

  %prep

  {% if md.name != crate %}

- %autosetup -n %{real_crate}-%{version} -p1

+ %autosetup -n %{real_crate}-%{version_no_tilde} -p1

  {% else %}

- %autosetup -n %{crate}-%{version} -p1

+ %autosetup -n %{crate}-%{version_no_tilde} -p1

  {% endif %}

  %cargo_prep

  

file modified
+8
@@ -37,6 +37,14 @@ 

       "crate(test) = 1.2.3"),

      (">= 1.2, < 1.5",

       "(crate(test) >= 1.2.0 with crate(test) < 1.5.0)"),

+     ("^2.0.0-alpha.6",

+      "(crate(test) >= 2.0.0~alpha.6 with crate(test) < 3.0.0)"),

+     ("^0.1.0-alpha.6",

+      "(crate(test) >= 0.1.0~alpha.6 with crate(test) < 0.2.0)"),

+     ("^0.0.1-alpha.6",

+      "(crate(test) >= 0.0.1~alpha.6 with crate(test) < 0.0.2)"),

+     ("^0.0.0-alpha.6",

+      "(crate(test) >= 0.0.0~alpha.6 with crate(test) < 0.0.1)"),

  ])

  def test_dependency(req, rpmdep):

      dep = rust2rpm.Dependency("test", req)

rebased onto cfe4e77674ccb6e25e54a3749f4ef91b377e808f

5 years ago

@ignatenkobrain I'm more surprised we didn't already have support for pre-release and post-release versions...

Is this going to increase the patch version for each pre-release version?

@msehnout yes. basically dependency on 0.0.0-alpha should be transformed to 0.0.0~alpha <= x < 0.0.1

rebased onto 00c0c5c

5 years ago

Pull-Request has been merged by ignatenkobrain

5 years ago