Skip to content

Add sort scope to semantic version concern

Laura Montemayor requested to merge add-sorting-to-semver into master

What does this MR do and why?

Adds two scopes to SemanticVersionable to sort by semantic version ascending or descending.

Screenshots or screen recordings

The following releases for a catalog resource were created in this order: 3.0.1, 4.0.1, 5.0.1, 3.1.2, 4.1.6

Timestamps and creation order:
[#<Ci::Catalog::Resources::Version:0x0000000167879f98
  id: 24,
  release_id: 55,
  catalog_resource_id: 15,
  project_id: 38,
  created_at: Wed, 07 Feb 2024 14:44:27.026547000 UTC +00:00,
  released_at: Wed, 07 Feb 2024 14:44:27.013120000 UTC +00:00,
  semver_major: 3,
  semver_minor: 0,
  semver_patch: 1,
  semver_prerelease: nil>,
 #<Ci::Catalog::Resources::Version:0x000000016ff38ac0
  id: 25,
  release_id: 56,
  catalog_resource_id: 15,
  project_id: 38,
  created_at: Wed, 07 Feb 2024 14:44:34.474368000 UTC +00:00,
  released_at: Wed, 07 Feb 2024 14:44:34.458959000 UTC +00:00,
  semver_major: 4,
  semver_minor: 0,
  semver_patch: 1,
  semver_prerelease: nil>,
 #<Ci::Catalog::Resources::Version:0x000000016ff38a20
  id: 26,
  release_id: 57,
  catalog_resource_id: 15,
  project_id: 38,
  created_at: Wed, 07 Feb 2024 14:44:47.170977000 UTC +00:00,
  released_at: Wed, 07 Feb 2024 14:44:47.162068000 UTC +00:00,
  semver_major: 5,
  semver_minor: 0,
  semver_patch: 1,
  semver_prerelease: nil>,
 #<Ci::Catalog::Resources::Version:0x000000016ff38980
  id: 27,
  release_id: 58,
  catalog_resource_id: 15,
  project_id: 38,
  created_at: Wed, 07 Feb 2024 14:45:03.764354000 UTC +00:00,
  released_at: Wed, 07 Feb 2024 14:45:03.756205000 UTC +00:00,
  semver_major: 3,
  semver_minor: 1,
  semver_patch: 2,
  semver_prerelease: nil>,
 #<Ci::Catalog::Resources::Version:0x000000016ff388e0
  id: 28,
  release_id: 59,
  catalog_resource_id: 15,
  project_id: 38,
  created_at: Wed, 07 Feb 2024 14:45:33.038902000 UTC +00:00,
  released_at: Wed, 07 Feb 2024 14:45:33.028747000 UTC +00:00,
  semver_major: 4,
  semver_minor: 1,
  semver_patch: 6,
  semver_prerelease: nil>]

When using project.catalog_resource.versions.order_by_semantic_version_asc, the results are: 3.0.1, 3.1.2, 4.0.1, 4.1.6, 5.0.1

Ordered by semantic version ascending
[#<Ci::Catalog::Resources::Version:0x000000016ff9f018
  id: 24,
  release_id: 55,
  catalog_resource_id: 15,
  project_id: 38,
  created_at: Wed, 07 Feb 2024 14:44:27.026547000 UTC +00:00,
  released_at: Wed, 07 Feb 2024 14:44:27.013120000 UTC +00:00,
  semver_major: 3,
  semver_minor: 0,
  semver_patch: 1,
  semver_prerelease: nil>,
 #<Ci::Catalog::Resources::Version:0x000000016ff9ef78
  id: 27,
  release_id: 58,
  catalog_resource_id: 15,
  project_id: 38,
  created_at: Wed, 07 Feb 2024 14:45:03.764354000 UTC +00:00,
  released_at: Wed, 07 Feb 2024 14:45:03.756205000 UTC +00:00,
  semver_major: 3,
  semver_minor: 1,
  semver_patch: 2,
  semver_prerelease: nil>,
 #<Ci::Catalog::Resources::Version:0x000000016ff9eed8
  id: 25,
  release_id: 56,
  catalog_resource_id: 15,
  project_id: 38,
  created_at: Wed, 07 Feb 2024 14:44:34.474368000 UTC +00:00,
  released_at: Wed, 07 Feb 2024 14:44:34.458959000 UTC +00:00,
  semver_major: 4,
  semver_minor: 0,
  semver_patch: 1,
  semver_prerelease: nil>,
 #<Ci::Catalog::Resources::Version:0x000000016ff9ee38
  id: 28,
  release_id: 59,
  catalog_resource_id: 15,
  project_id: 38,
  created_at: Wed, 07 Feb 2024 14:45:33.038902000 UTC +00:00,
  released_at: Wed, 07 Feb 2024 14:45:33.028747000 UTC +00:00,
  semver_major: 4,
  semver_minor: 1,
  semver_patch: 6,
  semver_prerelease: nil>,
 #<Ci::Catalog::Resources::Version:0x000000016ff9ed98
  id: 26,
  release_id: 57,
  catalog_resource_id: 15,
  project_id: 38,
  created_at: Wed, 07 Feb 2024 14:44:47.170977000 UTC +00:00,
  released_at: Wed, 07 Feb 2024 14:44:47.162068000 UTC +00:00,
  semver_major: 5,
  semver_minor: 0,
  semver_patch: 1,
  semver_prerelease: nil>]

When using project.catalog_resource.versions.order_by_semantic_version_desc, the results are: 5.0.1, 4.1.6,4.0.1, 3.1.2, ,3.0.1

Ordered by semantic version descending
[#<Ci::Catalog::Resources::Version:0x000000016ff95518
  id: 26,
  release_id: 57,
  catalog_resource_id: 15,
  project_id: 38,
  created_at: Wed, 07 Feb 2024 14:44:47.170977000 UTC +00:00,
  released_at: Wed, 07 Feb 2024 14:44:47.162068000 UTC +00:00,
  semver_major: 5,
  semver_minor: 0,
  semver_patch: 1,
  semver_prerelease: nil>,
 #<Ci::Catalog::Resources::Version:0x000000016ff95478
  id: 28,
  release_id: 59,
  catalog_resource_id: 15,
  project_id: 38,
  created_at: Wed, 07 Feb 2024 14:45:33.038902000 UTC +00:00,
  released_at: Wed, 07 Feb 2024 14:45:33.028747000 UTC +00:00,
  semver_major: 4,
  semver_minor: 1,
  semver_patch: 6,
  semver_prerelease: nil>,
 #<Ci::Catalog::Resources::Version:0x000000016ff953d8
  id: 25,
  release_id: 56,
  catalog_resource_id: 15,
  project_id: 38,
  created_at: Wed, 07 Feb 2024 14:44:34.474368000 UTC +00:00,
  released_at: Wed, 07 Feb 2024 14:44:34.458959000 UTC +00:00,
  semver_major: 4,
  semver_minor: 0,
  semver_patch: 1,
  semver_prerelease: nil>,
 #<Ci::Catalog::Resources::Version:0x000000016ff95338
  id: 27,
  release_id: 58,
  catalog_resource_id: 15,
  project_id: 38,
  created_at: Wed, 07 Feb 2024 14:45:03.764354000 UTC +00:00,
  released_at: Wed, 07 Feb 2024 14:45:03.756205000 UTC +00:00,
  semver_major: 3,
  semver_minor: 1,
  semver_patch: 2,
  semver_prerelease: nil>,
 #<Ci::Catalog::Resources::Version:0x000000016ff95298
  id: 24,
  release_id: 55,
  catalog_resource_id: 15,
  project_id: 38,
  created_at: Wed, 07 Feb 2024 14:44:27.026547000 UTC +00:00,
  released_at: Wed, 07 Feb 2024 14:44:27.013120000 UTC +00:00,
  semver_major: 3,
  semver_minor: 0,
  semver_patch: 1,
  semver_prerelease: nil>]

How to set up and validate locally

This can only be validated by adding the concern to an existing model and sorting. You can see an implementation of this here: !144052 (diffs), which is using the sorting.

Edited by Laura Montemayor

Merge request reports