profiles: Extract a procedure for getting relative generation numbers.

* guix/profiles.scm (relative-generation-spec->number): New procedure.
* guix/scripts/package.scm (switch-generation-action): Use it.

Signed-off-by: Ludovic Courtès <ludo@gnu.org>
This commit is contained in:
Chris Marusich 2016-11-01 22:48:11 -07:00 committed by Ludovic Courtès
parent 3382bfe9ea
commit 9008debc54
No known key found for this signature in database
GPG key ID: 090B11993D9AEBB5
2 changed files with 21 additions and 6 deletions

View file

@ -5,6 +5,7 @@
;;; Copyright © 2015 Mark H Weaver <mhw@netris.org>
;;; Copyright © 2015 Sou Bunnbu <iyzsong@gmail.com>
;;; Copyright © 2016 Ricardo Wurmus <rekado@elephly.net>
;;; Copyright © 2016 Chris Marusich <cmmarusich@gmail.com>
;;;
;;; This file is part of GNU Guix.
;;;
@ -97,6 +98,7 @@ (define-module (guix profiles)
generation-number
generation-numbers
profile-generations
relative-generation-spec->number
relative-generation
previous-generation-number
generation-time
@ -1039,6 +1041,23 @@ (define (profile-generations profile)
'()
generations)))
(define (relative-generation-spec->number profile spec)
"Return PROFILE's generation specified by SPEC, which is a string. The SPEC
may be a N, -N, or +N, where N is a number. If the spec is N, then the number
returned is N. If it is -N, then the number returned is the profile's current
generation number minus N. If it is +N, then the number returned is the
profile's current generation number plus N. Return #f if there is no such
generation."
(let ((number (string->number spec)))
(and number
(case (string-ref spec 0)
((#\+ #\-)
(relative-generation profile number))
(else (if (memv number (profile-generations profile))
number
#f))))))
(define* (relative-generation profile shift #:optional
(current (generation-number profile)))
"Return PROFILE's generation shifted from the CURRENT generation by SHIFT.

View file

@ -5,6 +5,7 @@
;;; Copyright © 2014, 2016 Alex Kost <alezost@gmail.com>
;;; Copyright © 2016 Roel Janssen <roel@gnu.org>
;;; Copyright © 2016 Benz Schenk <benz.schenk@uzh.ch>
;;; Copyright © 2016 Chris Marusich <cmmarusich@gmail.com>
;;;
;;; This file is part of GNU Guix.
;;;
@ -782,12 +783,7 @@ (define* (switch-generation-action store profile spec opts
#:key dry-run?)
"Switch PROFILE to the generation specified by SPEC."
(unless dry-run?
(let* ((number (string->number spec))
(number (and number
(case (string-ref spec 0)
((#\+ #\-)
(relative-generation profile number))
(else number)))))
(let ((number (relative-generation-spec->number profile spec)))
(if number
(switch-to-generation* profile number)
(leave (_ "cannot switch to generation '~a'~%") spec)))))