Proposing a new Perl Module Versioning Scheme

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

I'm working at SUSE, and for about a year I have been in charge of updating
the CPAN modules in SUSE Open Build Service:
https://build.opensuse.org/project/show/devel:languages:perl

This is half automated. The spec file is generated with the cpanspec script,
and we manually look over the diff and then request the package to be updated.

I would like to make a suggestion and will explain the problems in detail, so
that we are all on the same page.

# Status Quo

As you probably know, the versioning scheme of Perl modules differs from rpm.
For perl, the versions are decimal, so it can happen that for a given module A
versions 0.23 and 0.3 are released. The latter one is higher for perl.
Semantically, 0.23 is 0.230.0 and 0.3 is 0.300.0, when correctly translated to a
rpm like version.

You can also use versions like 1.2.3 in perl. In that case, they are already
semantically equal to rpm like versions. The majority of perl modules still uses
decimal versions, though.

Many distributions including openSUSE and Fedora are just taking over the perl
module version literally.

This sometimes leads to problems, for example if module B requires module A:

    Requires: perl(A) >= 0.23

When module A is uploaded with version 0.3, this will result in an unresolvable
dependency.

In those cases we have to manually fix the requirement.
Granted, this doesn't happen very often, but when, it's annoying.

There might also be cases where it is the other way around, e.g. module A
has versions 0.02 and 0.1. 0.02 is just the same as 0.2 in rpm.

Module B has:

    Requires: perl(A) >= 0.1

If module A is still at version 0.02, the dependency will be satisfied,
because 0.1 is lower in rpm than 0.02.
But that is wrong. In this case we don't see the mistake though.

Here is a discussion about this that started when I posted my Howto
for creating a CPAN module with correct Metadata:
https://github.com/perlpunk/perl5-module-meta/issues/5

# Alternative

The correct way to translate the versions for the spec would be:

    perl -wE'say version->parse($ARGV[0])->normal;' 0.23
    v0.230.0

and then we just have to cut off the 'v' at the beginning.
This should work correctly for all module versions, and it is the right thing
to do.
We wouldn't need any manual handling anymore.

# Problem

As it is impossible to just change all modules in the distributions at the same
time, we need backwards compatibility.

# Proposal

I discussed this on IRC #opensuse-factory. A suggestion came up how to avoid
having to be backward compatible.

The versions of each module inside a CPAN distribution are usually generated
at build time with perl.prov
(https://github.com/rpm-software-management/rpm/blob/master/scripts/perl.prov).

Some distributions also use
https://github.com/rpm-software-management/rpm/blob/master/scripts/perl.req
but openSUSE doesn't. The dependencies are extracted at the time when the spec
file is generated.

We could add a new capability additionally to perl(). Maybe cpan(). This can
use the new versioning scheme.
The packages could be built with both capabilities.
As soon as all packages are rebuilt, we can start to adjust the Requires
lines to use the new capability.

This part is actually pretty easy and shouldn't require much work. Please
correct me if I'm wrong.

However, there is also the package version, and instead of

    Require: perl(A::B) >= x.y

one can do

    Require: perl-A-B >= x.y

so for those package versions we need backward compatibility.

My idea is to take a snapshot of all CPAN modules we have in our repository
and save the package id and the version.

The migration strategy to the new versioning scheme would be:

All modulues having 1, 2 or 3 decimals can update to the new scheme whenever
a new version is uploaded.

Let's take module A as the example again. The current (CPAN) version would be
0.23.

When a new version 0.3 is uploaded, we compare the version for A to our saved
version 0.23. If it is (decimally) higher, we use the new scheme: 0.300.0.
Same thing for other modules requiring A (although we mostly use capability
requirements anyway).

For all modules having 4 or more decimals, the switch to the version scheme
has to wait until the major version is updated (which might be never for some
modules).
E.g. module B has 1.201703. Then we have to wait until the major version is
incremented to 2.

I made some statistics for our devel:languages:perl repo to see how many
decimals the packages have:

a:           21
a.b:        120
a.bb:      2045
a.bbb:      497
a.bbbb:     100
a.bbbbb:     25
a.bbbbbb:   165
a.bbbbbbb+:  11
a.b.c+:     129

So the large majority uses 3 or less decimals.

I know the second part is a lot of work, and it feels it comes a bit too
late, considered how long perl has been around. OTOH perl will probably
stay around for a while.

What do you think? Do you think it's worth it? Are there any flaws in my
migration strategy? Or do you have alternative suggestions?

Would be glad to hear from you.

cheers,
tina

_______________________________________________
perl-devel mailing list -- perl-devel@xxxxxxxxxxxxxxxxxxxxxxx
To unsubscribe send an email to perl-devel-leave@xxxxxxxxxxxxxxxxxxxxxxx
Fedora Code of Conduct: https://docs.fedoraproject.org/en-US/project/code-of-conduct/
List Guidelines: https://fedoraproject.org/wiki/Mailing_list_guidelines
List Archives: https://lists.fedoraproject.org/archives/list/perl-devel@xxxxxxxxxxxxxxxxxxxxxxx




[Index of Archives]     [Fedora Announce]     [Fedora Kernel]     [Fedora Testing]     [Fedora Legacy Announce]     [Fedora PHP Devel]     [Kernel Devel]     [Fedora Legacy]     [Fedora Maintainers]     [Fedora Desktop]     [PAM]     [Red Hat Development]     [Big List of Linux Books]     [Gimp]     [Yosemite Information]

  Powered by Linux