mbox series

[bug#63571,00/14] 'guix refresh -u' updates input fields

Message ID cover.1684421459.git.ludo@gnu.org
Headers show
Series 'guix refresh -u' updates input fields | expand

Message

Ludovic Courtès May 18, 2023, 3:11 p.m. UTC
Hello!

Until now, ‘guix refresh -u’ would tell you what inputs need to
be changed in your packages, for the ‘cran’, ‘pypi’, and ‘stackage’
updaters.  With this change it changes them right away.

Furthermore, ‘guix refresh -u’ will now also update inputs when the
‘cpan’ and ‘elpa’ updaters are used.  Doing that for other updaters
is left as an exercise to the reader.  :-)

I’d like to get feedback from those who use ‘guix refresh -u’
frequently, which is why I Cc’d Ricardo and Lars-Dominik, but
surely they’re not the only ones!

This is implemented by reifying dependency information
as <upstream-input> records part of <upstream-source>.

In the future, we could improve importers so that they fill in
the ‘min-version’ and ‘max-version’ fields.  In turn, ‘guix refresh’
could let you know when the version of a dependency doesn’t match,
or it could add the right one or something.  This would be particularly
useful for PyPI, which doesn’t provide a consistent package set like
package.

Another thing we should do longer-term is decouple how we fetch the
latest version number and latest source code (from the catalog of
PyPI/ELPA/etc., from Git, etc.) and how we obtain metadata (from
PyPI/ELPA/etc., from ‘requirements.txt’, etc.)  Right now, many
Python packages for example are handled by the ‘generic-git’ updater;
consequently they do not get dependency info that the ‘pypi’ updater
would get them.  Decoupling would address that.

One last thing: Crates remain out of the scope.  As I mentioned
at the Guix Days¹, I think Crates packaging as currently done is
not sustainable: this new feature won’t work for Crates, just like
‘guix refresh -l’ doesn’t work for them.  There’s Antioxydant and
there’s <https://issues.guix.gnu.org/53127>, but if nobody
champions to push these over the finish line, this will all get
out of control for good.

Thoughts?

Ludo’.

¹ https://gitlab.com/pjotrp/guix-days-fosdem-2023/-/blob/main/state-of-guix-2023.org

Ludovic Courtès (14):
  tests: pypi: Factorize tarball and wheel file creation.
  tests: http: Allow responses to specify a path.
  tests: pypi: Rewrite tests using a local HTTP server.
  import: utils: 'call-with-networking-exception-handler' doesn't
    unwind.
  import: json: Add #:timeout to 'json-fetch'.
  upstream: Replace 'input-changes' field by 'inputs'.
  diagnostics: Factorize 'absolute-location'.
  upstream: 'update-package-source' edits input fields.
  upstream: Remove <upstream-input-change> and related code.
  tests: upstream: Restore test that was skipped.
  import: cpan: Remove unary 'string-append' call.
  import: cpan: Represent dependencies as <upstream-input> records.
  import: cpan: Updater provides input list.
  import: elpa: Updater provides input list.

 guix/diagnostics.scm     |  20 +-
 guix/import/cpan.scm     | 103 +++++----
 guix/import/cran.scm     | 180 ++++++++++-----
 guix/import/elpa.scm     |  28 ++-
 guix/import/hackage.scm  |  90 +++++---
 guix/import/json.scm     |   5 +-
 guix/import/pypi.scm     | 216 ++++++++++--------
 guix/import/stackage.scm |   9 +-
 guix/import/test.scm     |  13 +-
 guix/import/utils.scm    |  33 ++-
 guix/scripts/refresh.scm |  38 +---
 guix/scripts/style.scm   |  17 --
 guix/tests/http.scm      |  46 +++-
 guix/upstream.scm        | 181 ++++++++-------
 tests/cpan.scm           |  34 ++-
 tests/cran.scm           |   2 +-
 tests/elpa.scm           |  48 +++-
 tests/guix-refresh.sh    |   7 +-
 tests/pypi.scm           | 473 +++++++++++++++++++++------------------
 tests/upstream.scm       | 199 ++--------------
 20 files changed, 946 insertions(+), 796 deletions(-)


base-commit: c5fa9dd0e96493307cc76ea098a6bca9b076e012

Comments

Liliana Marie Prikler May 18, 2023, 4:01 p.m. UTC | #1
Am Donnerstag, dem 18.05.2023 um 17:11 +0200 schrieb Ludovic Courtès:
> Hello!
> 
> Until now, ‘guix refresh -u’ would tell you what inputs need to
> be changed in your packages, for the ‘cran’, ‘pypi’, and ‘stackage’
> updaters.  With this change it changes them right away.
> 
> [...]
> Thoughts?
Sounds useful, but we should still look over the additions and removals
to check whether they are adequate.  When I refreshed python-mpi4py
today, it suggested to remove the openmpi input :)

Cheers
Ludovic Courtès May 18, 2023, 5:02 p.m. UTC | #2
Hi,

Liliana Marie Prikler <liliana.prikler@gmail.com> skribis:

> Am Donnerstag, dem 18.05.2023 um 17:11 +0200 schrieb Ludovic Courtès:
>> Hello!
>> 
>> Until now, ‘guix refresh -u’ would tell you what inputs need to
>> be changed in your packages, for the ‘cran’, ‘pypi’, and ‘stackage’
>> updaters.  With this change it changes them right away.
>> 
>> [...]
>> Thoughts?
> Sounds useful, but we should still look over the additions and removals
> to check whether they are adequate.

Yes, definitely!

> When I refreshed python-mpi4py today, it suggested to remove the
> openmpi input :)

Yeah, in general these per-language repositories don’t express
foreign-language dependencies, or they do it in a way that’s hard to
translate.  So this is the typical case where one needs to pay
attention, indeed.

Ludo’.
Ludovic Courtès May 29, 2023, 2:44 p.m. UTC | #3
Hi!

Ludovic Courtès <ludo@gnu.org> skribis:

> Until now, ‘guix refresh -u’ would tell you what inputs need to
> be changed in your packages, for the ‘cran’, ‘pypi’, and ‘stackage’
> updaters.  With this change it changes them right away.
>
> Furthermore, ‘guix refresh -u’ will now also update inputs when the
> ‘cpan’ and ‘elpa’ updaters are used.  Doing that for other updaters
> is left as an exercise to the reader.  :-)

One thing discussed with Ricardo on #guix-hpc is the need for
exceptions for cases where the importer gets inputs wrong.  Examples:

  • The CRAN updater might suggest adding ‘r-knitr’ as an input to a
    dependency of ‘r-knitr’.

  • There are other more complicated cases such as ‘r-dt’, which depends
    on JavaScript code.

  • The PyPI updater doesn’t know about the ‘openmpi’ input of
    ‘python-mpi4py’ so it would remove it.

This is addressed in v2 of this patch series, along with other
improvements (changes since v1):

  • honors ‘updater-extra-inputs’ and ‘updater-ignored-inputs’ package
    properties (and similarly for native and propagated inputs);

  • add those properties to a few packages;

  • ‘cran’ updater keeps inputs alphabetically sorted;

  • ‘gem’ updater now updates inputs as well.

Surely this will reveal limitations of updaters/importers but I’d like
to see it as an opportunity to improve them; more importantly, we have
to reduce the maintenance cost of all these imported packages, and this
is a step in that direction.

If there are no objections, I’d like to apply this series within a few
days.

Feedback welcome!

Ludo’.
Ludovic Courtès May 31, 2023, 9:54 p.m. UTC | #4
Ludovic Courtès <ludo@gnu.org> skribis:

> This is addressed in v2 of this patch series, along with other
> improvements (changes since v1):
>
>   • honors ‘updater-extra-inputs’ and ‘updater-ignored-inputs’ package
>     properties (and similarly for native and propagated inputs);
>
>   • add those properties to a few packages;
>
>   • ‘cran’ updater keeps inputs alphabetically sorted;
>
>   • ‘gem’ updater now updates inputs as well.
>
> Surely this will reveal limitations of updaters/importers but I’d like
> to see it as an opportunity to improve them; more importantly, we have
> to reduce the maintenance cost of all these imported packages, and this
> is a step in that direction.
>
> If there are no objections, I’d like to apply this series within a few
> days.

Pushed as 9f7cd1fcaf99c8e8430d0b29335220701664dc54!

Let me know how it works for you!

Ludo’.