From mboxrd@z Thu Jan 1 00:00:00 1970 From: Alex Kost Subject: Re: Counting Packages yields wrong result Date: Tue, 23 Aug 2016 13:56:39 +0300 Message-ID: <871t1fg3dk.fsf@gmail.com> References: <20160822231044.4ac945f9@alma-ubu> 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]:48589) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bc9Nu-0003IP-3S for help-guix@gnu.org; Tue, 23 Aug 2016 06:56:47 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bc9Np-00085f-Sw for help-guix@gnu.org; Tue, 23 Aug 2016 06:56:45 -0400 Received: from mail-lf0-x242.google.com ([2a00:1450:4010:c07::242]:35271) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bc9Np-00085W-JX for help-guix@gnu.org; Tue, 23 Aug 2016 06:56:41 -0400 Received: by mail-lf0-x242.google.com with SMTP id l89so7589259lfi.2 for ; Tue, 23 Aug 2016 03:56:41 -0700 (PDT) In-Reply-To: <20160822231044.4ac945f9@alma-ubu> (=?utf-8?Q?=22Bj=C3=B6rn?= =?utf-8?Q?_H=C3=B6fling=22's?= message of "Mon, 22 Aug 2016 23:10:44 +0200") List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: help-guix-bounces+gcggh-help-guix=m.gmane.org@gnu.org Sender: "Help-Guix" To: =?utf-8?Q?Bj=C3=B6rn_H=C3=B6fling?= Cc: Guix-Help Bj=C3=B6rn H=C3=B6fling (2016-08-23 00:10 +0300) wrote: > I tried to count the number of packages in GuixSD for myself, but my > result differs from the package list on the home page > (https://www.gnu.org/software/guix/packages/). Why? > > Here is how I did it: > > #!/run/current-system/profile/bin/guile -s > !# > > ; Counting number of packages in current system. > ; This also includes packages with the same name, > ; but different version string. > > (use-modules (gnu)) > (use-modules (guix)) Only (use-modules (gnu packages)) is needed. > (display "Number of packages: ") > (define cnt > (fold-packages > (lambda (pkg ctr) > (+ 1 ctr)) > 0)) > (display cnt) > (newline) > > Is that the correct way to walk through the list of packages anyway? Yes (btw it gives me 3886 on the latest guix master). Also note that it will also count your packages placed in GUIX_PACKAGE_PATH. So to make a pure experiment you need to unset this environment variable at first (if you use it of course). > I always get the number 3747 back, even after a guix pull. The homepage > gives me 3881, and counting. > > guix --version give me: > > 20160822.18 > > > Looking at %load-path I figured out that > > /run/current-system/profile/share/guile/site/2.0/guix > > points to the ...guix-0.11.0-1 store path. > > Is that my problem? How can I script over the newest pull? "guix pull" updates "~/.config/guix/latest" link, and when you run "guix" command, it uses the packages from that directory. So after "guix pull" you'll get the latest package recipes for "guix ..." commands. But "guix pull" doesn't influence your guile script that uses guix modules from some directories that come from GUILE_LOAD_PATH and GUILE_LOAD_COMPILED_PATH. So to make your script use those fresh "guix-pulled" modules, you can modify these environment variables to include "/home//.config/guix/latest". An alternative is to use guix directly from a git checkout. See (info "(guix) Building from Git") for details. Finally, note that 'fold-packages' folds over package objects, while packages may have multiple outputs (for example "git" has 4 outputs), which can be installed separately, so if you consider each output as a separate package, then the number is bigger. The following blatant violation of functional style gives me 4078 outputs: (use-modules (gnu packages) (guix packages)) (define number-of-packages 0) (define number-of-outputs 0) (fold-packages (lambda (package _) (set! number-of-packages (1+ number-of-packages)) (set! number-of-outputs (+ number-of-outputs (length (package-outputs package))))) #f) (format #t "Number of packages: ~d~%" number-of-packages) (format #t "Number of outputs: ~d~%" number-of-outputs) --=20 Alex