Re: [PATCH] guix package: Add '--delete-generations'.

2013-09-25 Thread Nikita Karetnikov
> Frankly, I don’t like it.  I think the default behavior should not be to
> let the user shoot themself in the foot.

> WDYT?

OK, what about these patches?  Can I push them?

From 86d29a8b233d5cf6549fbcddf43b185086b7d178 Mon Sep 17 00:00:00 2001
From: Nikita Karetnikov 
Date: Wed, 25 Sep 2013 03:34:49 +
Subject: [PATCH 2/3] guix package: Add 'link-to-empty-profile'.

* guix/scripts/package.scm (link-to-empty-profile): New function.
  (roll-back): Use it.
---
 guix/scripts/package.scm |   18 +++---
 1 file changed, 11 insertions(+), 7 deletions(-)

diff --git a/guix/scripts/package.scm b/guix/scripts/package.scm
index ed1e72c..7865027 100644
--- a/guix/scripts/package.scm
+++ b/guix/scripts/package.scm
@@ -214,6 +214,15 @@ all of PACKAGES, a list of name/version/output/path/deps tuples."
  (compose string->number (cut match:substring <> 1)))
   0))
 
+(define (link-to-empty-profile generation)
+  "Link GENERATION, a string, to the empty profile."
+  (let* ((drv  (profile-derivation (%store) '()))
+ (prof (derivation->output-path drv "out")))
+(when (not (build-derivations (%store) (list drv)))
+  (leave (_ "failed to build the empty profile~%")))
+
+(switch-symlinks generation prof)))
+
 (define (roll-back profile)
   "Roll back to the previous generation of PROFILE."
   (let* ((number  (generation-number profile))
@@ -236,13 +245,8 @@ all of PACKAGES, a list of name/version/output/path/deps tuples."
(_ "nothing to do: already at the empty profile~%")))
   ((or (zero? previous-number); going to emptiness
(not (file-exists? previous-generation)))
-   (let* ((drv  (profile-derivation (%store) '()))
-  (prof (derivation->output-path drv "out")))
- (when (not (build-derivations (%store) (list drv)))
-   (leave (_ "failed to build the empty profile~%")))
-
- (switch-symlinks previous-generation prof)
- (switch-link)))
+   (link-to-empty-profile previous-generation)
+   (switch-link))
   (else (switch-link) ; anything else
 
 (define (generation-time profile number)
-- 
1.7.9.5

From c246f4a72ade85dffa95d7c598e24539896ca5a5 Mon Sep 17 00:00:00 2001
From: Nikita Karetnikov 
Date: Thu, 26 Sep 2013 02:36:24 +
Subject: [PATCH 3/3] guix package: Add '--delete-generations'.

* guix/scripts/package.scm (switch-to-previous-generation): New function.
  (roll-back): Use the new function instead of 'switch-link'.
  (show-help): Add '--delete-generations'.
  (%options): Likewise.
  (guix-package)[process-actions]: Add 'current-generation-number',
  'display-and-delete', and 'delete-generation'.  Add support for
  '--delete-generations', and reindent the code.
* tests/guix-package.sh: Test '--delete-generations'.
* doc/guix.texi (Invoking guix-package): Document '--delete-generations'.
---
 doc/guix.texi|   10 ++
 guix/scripts/package.scm |  256 +-
 tests/guix-package.sh|   11 ++
 3 files changed, 185 insertions(+), 92 deletions(-)

diff --git a/doc/guix.texi b/doc/guix.texi
index 442cef2..2e6bdc5 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -714,6 +714,16 @@ or months by passing an integer along with the first letter of the
 duration, e.g., @code{--list-generations=20d}.
 @end itemize
 
+@item --delete-generations[=@var{pattern}]
+@itemx -d [@var{pattern}]
+Delete all generations except the current one.  Note that the zeroth
+generation is never deleted.
+
+This command accepts the same patterns as @option{--list-generations}.
+When @var{pattern} is specified, delete the matching generations.  If
+the current generation matches, it is deleted atomically, i.e., by
+switching to the previous available generation.
+
 @end table
 
 @node Packages with Multiple Outputs
diff --git a/guix/scripts/package.scm b/guix/scripts/package.scm
index 7865027..35a5129 100644
--- a/guix/scripts/package.scm
+++ b/guix/scripts/package.scm
@@ -223,6 +223,16 @@ all of PACKAGES, a list of name/version/output/path/deps tuples."
 
 (switch-symlinks generation prof)))
 
+(define (switch-to-previous-generation profile)
+  "Atomically switch PROFILE to the previous generation."
+  (let* ((number  (generation-number profile))
+ (previous-number (previous-generation-number profile number))
+ (previous-generation (format #f "~a-~a-link"
+  profile previous-number)))
+(format #t (_ "switching from generation ~a to ~a~%")
+number previous-number)
+(switch-symlinks profile previous-generation)))
+
 (define (roll-back profile)
   "Roll back to the previous generation of PROFILE."
   (let* ((number  (generation-number profile))
@@ -230,24 +240,18 @@ all of PACKAGES, a list of name/version/output/path/deps tuples."
  (previous-generation (format #

Re: Generation 0

2013-09-25 Thread Nikita Karetnikov
>> There are two cases:
>>
>> 1. A generation does not exist.
>>
>> 2. The profile points to the zeroth generation, and there are no other
>>generations.
>>
>> ‘tests/guix-package.sh’ tests the first case.  Should we test the second
>> case too?  What would be the best way to do so?

> The second case is valid.  Thus it’s OK for --list-generations to not
> print anything, but it must exit with 0.

> Likewise, --delete-generations should do nothing and exit with 0 with
> the only generation that would be deleted is Generation 0.

> Does it make sense?

I was asking a different question, that is, whether we should test both
cases in ‘tests/guix-package.sh’ or it’s OK to test only the first case.
Currently, there’s a test for the first case.  (Note that by the word
“cases” I mean the ‘cond’ cases.)

Anyway, can I push this patch?

From 00188949e6c49592f6f2dc30bf21731ae142afc0 Mon Sep 17 00:00:00 2001
From: Nikita Karetnikov 
Date: Thu, 26 Sep 2013 02:00:06 +
Subject: [PATCH 1/3] guix package: Exit with 0 when there is nothing to list.

* guix/scripts/package.scm (guix-package)[process-query]: Exit with 0
  when there are no generations containing packages or no profiles.
---
 guix/scripts/package.scm |2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/guix/scripts/package.scm b/guix/scripts/package.scm
index 66505f1..ed1e72c 100644
--- a/guix/scripts/package.scm
+++ b/guix/scripts/package.scm
@@ -983,7 +983,7 @@ more information.~%"))
((string-null? pattern)
 (let ((numbers (generation-numbers profile)))
   (if (equal? numbers '(0))
-  (exit 1)
+  (exit 0)
   (for-each list-generation numbers
((matching-generations pattern profile)
 =>
-- 
1.7.9.5



pgpMpMoVZSJxL.pgp
Description: PGP signature


Re: Generation 0

2013-09-25 Thread Ludovic Courtès
Nikita Karetnikov  skribis:

>>> What about these patches?  Should the first patch also test the
>>> following case?
>>>
>>> +(let ((numbers (generation-numbers profile)))
>>> +  (if (equal? numbers '(0))
>>> +  (exit 1)
>>> +  (for-each list-generation numbers
>
>> The first patch below already contains that snippet, so I’m not sure
>> what you mean.
>
> There are two cases:
>
> 1. A generation does not exist.
>
> 2. The profile points to the zeroth generation, and there are no other
>generations.
>
> ‘tests/guix-package.sh’ tests the first case.  Should we test the second
> case too?  What would be the best way to do so?

The second case is valid.  Thus it’s OK for --list-generations to not
print anything, but it must exit with 0.

Likewise, --delete-generations should do nothing and exit with 0 with
the only generation that would be deleted is Generation 0.

Does it make sense?

Ludo’.



Re: FAIL: tests/guix-register.sh

2013-09-25 Thread Nikita Karetnikov
> Are you using a distro-provide SQLite package, or something you built
> yourself?

> If the problem is widespread, we can just remove this test.

No need.  I solved the problem by installing SQLite from Guix.


pgpwaGLweKqG9.pgp
Description: PGP signature


Re: Generation 0

2013-09-25 Thread Nikita Karetnikov
>> What about these patches?  Should the first patch also test the
>> following case?
>>
>> +(let ((numbers (generation-numbers profile)))
>> +  (if (equal? numbers '(0))
>> +  (exit 1)
>> +  (for-each list-generation numbers

> The first patch below already contains that snippet, so I’m not sure
> what you mean.

There are two cases:

1. A generation does not exist.

2. The profile points to the zeroth generation, and there are no other
   generations.

‘tests/guix-package.sh’ tests the first case.  Should we test the second
case too?  What would be the best way to do so?  Note that you can’t
specify the pattern in that case because of the (string-null? pattern)
bit.


pgpJjM6fs4hiB.pgp
Description: PGP signature


Re: FAIL: tests/guix-register.sh

2013-09-25 Thread Ludovic Courtès
Nikita Karetnikov  skribis:

>> Could it be that something’s wrong with your setup?  (Erroneous
>> LD_LIBRARY_PATH, etc.)
>
> Maybe.  This test also fails on a different machine of mine.
> LD_LIBRARY_PATH is not set.

Are you using a distro-provide SQLite package, or something you built
yourself?

If the problem is widespread, we can just remove this test.

Thanks,
Ludo’.



Re: FAIL: tests/guix-register.sh

2013-09-25 Thread Nikita Karetnikov
> Could it be that something’s wrong with your setup?  (Erroneous
> LD_LIBRARY_PATH, etc.)

Maybe.  This test also fails on a different machine of mine.
LD_LIBRARY_PATH is not set.


pgpMTcknFjC6O.pgp
Description: PGP signature


Re: Goals for 0.4

2013-09-25 Thread Ludovic Courtès
Andreas Enge  skribis:

> On Thu, Aug 29, 2013 at 10:42:23PM +0200, Andreas Enge wrote:
>> On Thu, Aug 29, 2013 at 02:34:27PM +0200, Ludovic Courtès wrote:
>> >   • Manual: improve as we see fit; notably add a section on font usage
>> > for X applications.
>> I would volunteer for this one.
>
> The main problem that gtk+ applications would not find a font unless the
> user installed gs-fonts should be solved by the latest commit. I added
> gs-fonts as an input to fontconfig and added it to its configuration file.

Yes, so normally installed GTK+ apps will work out of the box now.  The
only thing we could document is that fonts installed in the user profile
will automatically be picked up.

Thanks,
Ludo’.



Re: [PATCH] guix package: Add '--delete-generations'.

2013-09-25 Thread Ludovic Courtès
Nikita Karetnikov  skribis:

>> Oh.  I’d prefer if it would delete all generations but the current one.
>
>> That’s a fairly useful pattern: suppose you want to make space on your
>> disk (and you know you won’t need to roll back), it’d be handy to run:
>
>>   guix package --delete-generations && guix gc
>
>> Whereas if you have to use ranges, you end up doing something like:
>
>>   guix package --list-generations |grep ^G
>>   # check the number of the last generation...
>>   guix package --delete-generations=..42 && guix gc
>
>> Conversely, removing *all* the generations is something you’re unlikely
>> to do very often.
>
> ‘--delete-generations’ could accept an additional argument, say,
> ‘keep-current’.  It’d be easier to implement, and I find it less
> confusing.
>
> Would you accept such a solution?

Frankly, I don’t like it.  I think the default behavior should not be to
let the user shoot themself in the foot.

WDYT?

Ludo’.



Re: [PATCH] guix package: Show which generation is the current one.

2013-09-25 Thread Ludovic Courtès
Nikita Karetnikov  skribis:

>> I’m suggesting to have a procedure like this:
>
>>   (define (current-generation-number profile)
>> ;; Return the current generation number of PROFILE.
>> ...)
>
> We already have such a procedure.  It’s called ‘generation-number’.

Oh, OK.

> What do you think about this patch?  Can I push it to ‘master’?

Yes!

> From 5ed5be5c786683cd5ec86d9834afca88d965d5f0 Mon Sep 17 00:00:00 2001
> From: Nikita Karetnikov 
> Date: Wed, 25 Sep 2013 01:55:27 +
> Subject: [PATCH] guix package: Show which generation is the current one.
>
> * guix/scripts/package.scm (guix-package)[process-query]: Show that a
>   generation is the current one if the profile points to it.
> * tests/guix-package.sh: Test it.

Thanks,
Ludo’.



Re: Generation 0

2013-09-25 Thread Ludovic Courtès
Nikita Karetnikov  skribis:

> What about these patches?  Should the first patch also test the
> following case?
>
> +(let ((numbers (generation-numbers profile)))
> +  (if (equal? numbers '(0))
> +  (exit 1)
> +  (for-each list-generation numbers

The first patch below already contains that snippet, so I’m not sure
what you mean.

> From f42056aa768a405a893b5846dad8f8fa576b1156 Mon Sep 17 00:00:00 2001
> From: Nikita Karetnikov 
> Date: Tue, 24 Sep 2013 22:11:16 +
> Subject: [PATCH 1/2] guix package: Exit with 1 when a generation cannot be
>  listed.
>
> * guix/scripts/package.scm (guix-package)[process-query]: Exit with 1
>   when a generation does not exist or the profile points to the zeroth
>   generation.
> * tests/guix-package.sh: Test the former case.

OK, please push.

> From bea0168c28932921e6e2d6dcf3e9a26c555b698c Mon Sep 17 00:00:00 2001
> From: Nikita Karetnikov 
> Date: Tue, 24 Sep 2013 22:18:09 +
> Subject: [PATCH 2/2] guix package: Do not list the zeroth generation.
>
> * guix/scripts/package.scm (guix-package)[process-query]: Change
>   'list-generation' to not list the zeroth generation.
> * tests/guix-package.sh: Test it.
> * doc/guix.texi (Invoking guix package): Document it, and use the
>   right term when talking about generations.

OK, push as well.

Thanks,
Ludo’.



Re: Goals for 0.4

2013-09-25 Thread Andreas Enge
On Thu, Aug 29, 2013 at 10:42:23PM +0200, Andreas Enge wrote:
> On Thu, Aug 29, 2013 at 02:34:27PM +0200, Ludovic Courtès wrote:
> >   • Manual: improve as we see fit; notably add a section on font usage
> > for X applications.
> I would volunteer for this one.

The main problem that gtk+ applications would not find a font unless the
user installed gs-fonts should be solved by the latest commit. I added
gs-fonts as an input to fontconfig and added it to its configuration file.

Andreas