all messages for Guix-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: "Ludovic Courtès" <ludo@gnu.org>
To: Pierre Neidhardt <mail@ambrevar.xyz>
Cc: Guix Devel <guix-devel@gnu.org>
Subject: Re: Store channel specification in profile
Date: Wed, 05 Feb 2020 12:08:58 +0100	[thread overview]
Message-ID: <87wo91p9yt.fsf@gnu.org> (raw)
In-Reply-To: <87zhe4px2a.fsf@ambrevar.xyz> (Pierre Neidhardt's message of "Thu, 30 Jan 2020 20:24:13 +0100")

Hello!

Pierre Neidhardt <mail@ambrevar.xyz> skribis:

> Ideas that are not that good on second thought:
>
> - Create a profile specification file from CLI options,
>   like --export PROFILE or --convert MANIFEST.
>
>   The problem is that those are extra steps that the user would have to run
>   manually.  We can save those extra steps by dumping the specification file
>   automatically into the profile.
>
> The Plan©:
>
> On every profile installation, we generate a "specifications.scm" file alongside
> the internal "manifest".

One thing to keep in mind, though, is that if the ‘specifications.scm’
is part of the profile, it must be future-proof.  That is, the APIs it
uses must essentially be guaranteed to remain forever.  That’s a very
strong constraint.

In contrast, versioned data formats like the famous ‘manifest’ file
don’t have this problem at all, but they’re less directly usable from
the CLI.

> Problems:
>
> - There may be too many provenances, we need to add a CLI flag to
>   ignore provenance.

Like Konrad wrote, just write if there are too many of them.

> Proposed format for "specifications.scm": we can reuse
> `specifications->manifest`.  Each entry is either or string, in which case it
> acts as before, or a list, with the following self-explanatory elements:
>
> (specifications->manifest
>  '(("my-package"
>     #:outputs '("out")
>     #:version "2.3"
>     #:channel (channel
>                (name 'guix)
>                (branch "master")
>                (url "https://git.savannah.gnu.org/git/guix.git")
>                (commit
>                 "704719edade1368f798c9301f3a8197a0df5c930")))
>    ("my-package2")
>    "old-style-package"))

As a rule of thumb, I think ‘specifications->manifest’ must remain what
it is: it should take a specification as is currently defined and return
a manifest.  I think that if we need a new concept, we should not
overload an existing one.

We also need to distinguish between APIs, which should use first-class
objects (<channel>, etc.), and data formats, which are plain sexps.
(The above example is a mixture of both and in fact looks very similar
to what’s already in the ‘manifest’ file.)  But then again, that means
relying on a larger chunk of the API.

So, all in all, I think I’d rather see it implemented as ‘guix package
--export’ or similar.  The generated Scheme file could use all the parts
of the current API (and we could adjust the generator as we change the
API).  So it could generate something similar to the example in the
manual (info "(guix) Inferiors"):

--8<---------------cut here---------------start------------->8---
(use-modules (guix inferior) (guix channels)
             (srfi srfi-1))   ;for 'first'

(define channels
  ;; This is the old revision from which we want to
  ;; extract guile-json.
  (list (channel
         (name 'guix)
         (url "https://git.savannah.gnu.org/git/guix.git")
         (commit
          "65956ad3526ba09e1f7a40722c96c6ef7c0936fe"))))

(define inferior
  ;; An inferior representing the above revision.
  (inferior-for-channels channels))

;; Now create a manifest with the current "guile" package
;; and the old "guile-json" package.
(packages->manifest
 (list (first (lookup-inferior-packages inferior "guile-json"))
       (specification->package "guile")))
--8<---------------cut here---------------end--------------->8---

There could also be an option to generate a “symbolic” manifest: one
that would install packages of the same name, but not resorting to
inferiors.  The result would not be a faithful translation of what’s
actually in the store, but an approximation thereof that could be useful
for people transitioning.  In fact it would be easier to start by
prototyping this before going further.

As far as faithfulness is concerned, we should also keep in mind that we
don’t always have all the information needed to reconstruct what’s in a
profile.  For example, we lack information about the package
transformation options that were used (if any), and we lack information
about arbitrary user code that might have been used to generate manifest
entries.

Thus, as we design this, I think we must keep in mind that the result is
necessarily an approximation.

> A somewhat unrelated propostion: To avoid further confusion between the internal
> "manifest" and the user-facing "--manifest", we could rename the internal
> manifest to $profile/internal-maifest.

Renaming ‘manifest’ is not really an option because, as we discussed,
it’s a contract over time: today’s Guix can interact with a profile
created 5 years ago just fine.

Thanks for sharing your thoughts!

Ludo’.

  parent reply	other threads:[~2020-02-05 11:09 UTC|newest]

Thread overview: 41+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-11-26 14:55 Store channel specification in profile Pierre Neidhardt
2019-11-26 16:40 ` Konrad Hinsen
2019-11-26 19:12   ` Pierre Neidhardt
2019-11-26 19:35     ` Konrad Hinsen
2019-12-02 15:58       ` zimoun
2019-12-09 17:11   ` Ludovic Courtès
2019-12-09 17:21     ` Pierre Neidhardt
2019-12-12 19:50       ` zimoun
2019-12-12 22:35         ` Pierre Neidhardt
2019-12-13 12:16           ` zimoun
2019-12-19 16:12             ` Ludovic Courtès
2019-12-19 17:18               ` zimoun
2020-01-06 20:07         ` Pierre Neidhardt
2020-01-06 21:09           ` zimoun
2020-01-08 15:17             ` Pierre Neidhardt
2020-01-08 19:31               ` zimoun
2020-01-11 23:48               ` Ludovic Courtès
2020-01-13 14:02                 ` Pierre Neidhardt
2020-01-13 14:46                   ` zimoun
2020-01-13 14:37                 ` zimoun
2020-01-13 14:59                   ` Pierre Neidhardt
2020-01-13 15:53                     ` zimoun
2020-01-13 16:53                       ` Pierre Neidhardt
2020-01-30 19:24                         ` Pierre Neidhardt
2020-01-31  8:51                           ` zimoun
2020-01-31  9:21                           ` Konrad Hinsen
2020-01-31 11:21                             ` Pierre Neidhardt
2020-01-31 12:15                               ` Pierre Neidhardt
2020-01-31 16:01                                 ` Konrad Hinsen
2020-02-05 11:08                           ` Ludovic Courtès [this message]
2020-02-06 10:59                             ` Pierre Neidhardt
2020-02-07 21:28                               ` Ludovic Courtès
2020-02-08 17:09                                 ` Pierre Neidhardt
2020-02-11 14:10                                   ` Ludovic Courtès
2020-02-11 14:18                                     ` Pierre Neidhardt
2020-02-24 16:16                                       ` Ludovic Courtès
2020-02-25 10:32                                         ` Pierre Neidhardt
2020-03-03 21:43                                           ` zimoun
2020-03-04  8:09                                             ` Pierre Neidhardt
2020-03-04 13:24                                               ` zimoun
2020-03-03 21:49                                         ` zimoun

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87wo91p9yt.fsf@gnu.org \
    --to=ludo@gnu.org \
    --cc=guix-devel@gnu.org \
    --cc=mail@ambrevar.xyz \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/guix.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.