From mboxrd@z Thu Jan 1 00:00:00 1970 From: David Thompson Subject: Re: Reproducible profiles Date: Sun, 17 May 2015 15:23:11 -0400 Message-ID: <87zj5380v4.fsf@fsf.org> References: <87pp62iqmn.fsf@fsf.org> <87egmgu609.fsf@gnu.org> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Return-path: Received: from eggs.gnu.org ([2001:4830:134:3::10]:34622) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Yu49i-0005Z1-Lk for guix-devel@gnu.org; Sun, 17 May 2015 15:23:23 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Yu49h-0003gi-HV for guix-devel@gnu.org; Sun, 17 May 2015 15:23:22 -0400 In-Reply-To: <87egmgu609.fsf@gnu.org> List-Id: "Development of GNU Guix and the GNU System distribution." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guix-devel-bounces+gcggd-guix-devel=m.gmane.org@gnu.org Sender: guix-devel-bounces+gcggd-guix-devel=m.gmane.org@gnu.org To: Ludovic =?utf-8?Q?Court=C3=A8s?= Cc: guix-devel@gnu.org Ludovic Court=C3=A8s writes: > David Thompson skribis: > >> Lately I've been wanting to version control the list of packages that I >> install in my user profile so that I can sync it amongst many machines. >> So, I took a stab at adding a new '--apply' option to 'guix package' >> that reads in a package list from a Scheme file and creates a new >> generation of the profile with only those packages are installed. >> Here's an example configuration: >> >> (use-modules (gnu)) >> (use-package-modules base less guile emacs admin ruby mail pumpio ma= n) >>=20=20=20=20=20 >> (list ruby >> coreutils >> less >> man-db >> notmuch >> guile-2.0 >> emacs >> dmd >> offlineimap >> pumpa) > > Yes, that sounds very useful. > > As usual though, there=E2=80=99s the issue of multiple-output packages. = The > above snippet is nice, but doesn=E2=80=99t allow you to specify a particu= lar > output of a package. I left it out of my example, but I figured one could specify the output like so: (list ruby coreutils `(,glib "bin")) > What about instead requiring people to return a manifest: > > (use-modules (guix profiles)) > (use-package-modules base emacs guile) > > (manifest (cons (package->manifest-entry gcc-toolchain "debug") > (map package->entry > (list gcc-toolchain emacs guile-2.0)))) > > That means we=E2=80=99ll have to document (guix profiles). > > It=E2=80=99s more verbose than what you suggest, though. If you insist ;= -), we > could allow a list of packages instead of a manifest, though I=E2=80=99d = prefer > not to do that. Expecting a manifest always sounds good. How about adding a convenience procedure for the (map package->entry ...) pattern since I think it will be the most common thing users will want to do? (packages->manifest (list guile-2.0 guile-opengl guile-sdl)) It could even support using other outputs like in that other example I gave: (packages->manifest (list guile-2.0 guile-opengl guile-sdl `(,gcc-toolchain "debug")) >> Below is a naive patch that does the job, but is unideal because it >> doesn't do some nice things like display the diff between generations >> before building. > > For that you would need a procedure to infer the manifest transaction: > > (manifests->transaction m1 m2) > ;; returns a > > and then that could be passed to =E2=80=98show-manifest-transaction=E2=80= =99. > > However, I=E2=80=99m not sure it=E2=80=99s very useful. Perhaps it would= be enough to > write =E2=80=9Cinstalling new manifest from foo.scm with 42 entries.=E2= =80=9D > WDYT? Okay, I'll do that instead. I would be interested in seeing what has changed when I apply a new manifest, but it's probably not worth the effort right now. >> + (option '("apply") #t #f >> + (lambda (opt name arg result arg-handler) >> + (values (alist-cons 'apply (load arg) result) >> + arg-handler))) > > It would be better to delay loading until after arguments have been > parsed, as in =E2=80=98guix system=E2=80=99. The procedure to load the f= ile should be > similar to =E2=80=98read-operating-system=E2=80=99. Sure. The use of 'load' was a quick hack for this prototype. :) > We=E2=80=99ll need documentation and tests, too. :-) Naturally. Thanks, now I have enough direction to do another iteration. :) --=20 David Thompson GPG Key: 0FF1D807