~ruther/guix-local

7770aafc7561897ff1d3c706420f76843c5182c0 — Ludovic Courtès 10 years ago c63d940
guix gc: Add '--verify'.

* guix/scripts/gc.scm (show-help, %options): Add --verify.
  (guix-gc): Handle it.
* doc/guix.texi (Invoking guix gc): Document --verify, and move --optimize
  description right below it.
2 files changed, 66 insertions(+), 13 deletions(-)

M doc/guix.texi
M guix/scripts/gc.scm
M doc/guix.texi => doc/guix.texi +44 -13
@@ 1541,8 1541,9 @@ is achieved by running @code{guix package --delete-generations}

The @command{guix gc} command has three modes of operation: it can be
used to garbage-collect any dead files (the default), to delete specific
files (the @code{--delete} option), or to print garbage-collector
information.  The available options are listed below:
files (the @code{--delete} option), to print garbage-collector
information, or for more advanced queries.  The garbage collection
options are as follows:

@table @code
@item --collect-garbage[=@var{min}]


@@ 1564,17 1565,6 @@ Attempt to delete all the store files and directories specified as
arguments.  This fails if some of the files are not in the store, or if
they are still live.

@item --optimize
@cindex deduplication
Optimize the store by hard-linking identical files---this is
@dfn{deduplication}.

The daemon performs deduplication after each successful build or archive
import, unless it was started with @code{--disable-deduplication}
(@pxref{Invoking guix-daemon, @code{--disable-deduplication}}).  Thus,
this option is primarily useful when the daemon was running with
@code{--disable-deduplication}.

@item --list-dead
Show the list of dead files and directories still present in the
store---i.e., files and directories no longer reachable from any root.


@@ 1602,6 1592,47 @@ of these, recursively.  In other words, the returned list is the

@end table

Lastly, the following options allow you to check the integrity of the
store and to control disk usage.

@table @option

@item --verify[=@var{options}]
@cindex integrity, of the store
@cindex integrity checking
Verify the integrity of the store.

By default, make sure that all the store items marked as valid in the
daemon's database actually exist in @file{/gnu/store}.

When provided, @var{options} must a comma-separated list containing one
or more of @code{contents} and @code{repair}.

When passing @option{--verify=contents}, the daemon will compute the
content hash of each store item and compare it against its hash in the
database.  Hash mismatches are reported as data corruptions.  Because it
traverses @emph{all the files in the store}, this command can take a
long time, especially on systems with a slow disk drive.

@cindex repairing the store
Using @option{--verify=repair} or @option{--verify=contents,repair}
causes the daemon to try to repair corrupt store items by fetching
substitutes for them (@pxref{Substitutes}).  Because repairing is not
atomic, and thus potentially dangerous, it is available only to the
system administrator.

@item --optimize
@cindex deduplication
Optimize the store by hard-linking identical files---this is
@dfn{deduplication}.

The daemon performs deduplication after each successful build or archive
import, unless it was started with @code{--disable-deduplication}
(@pxref{Invoking guix-daemon, @code{--disable-deduplication}}).  Thus,
this option is primarily useful when the daemon was running with
@code{--disable-deduplication}.

@end table

@node Invoking guix pull
@section Invoking @command{guix pull}

M guix/scripts/gc.scm => guix/scripts/gc.scm +22 -0
@@ 58,6 58,11 @@ Invoke the garbage collector.\n"))
      --referrers        list the referrers of PATHS"))
  (newline)
  (display (_ "
      --verify[=OPTS]    verify the integrity of the store; OPTS is a
                         comma-separated combination of 'repair' and
                         'contents'"))
  (newline)
  (display (_ "
  -h, --help             display this help and exit"))
  (display (_ "
  -V, --version          display version information and exit"))


@@ 94,6 99,17 @@ Invoke the garbage collector.\n"))
                (lambda (opt name arg result)
                  (alist-cons 'action 'optimize
                              (alist-delete 'action result))))
        (option '("verify") #f #t
                (let ((not-comma (char-set-complement (char-set #\,))))
                  (lambda (opt name arg result)
                    (let ((options (if arg
                                       (map string->symbol
                                            (string-tokenize arg not-comma))
                                       '())))
                      (alist-cons 'action 'verify
                                  (alist-cons 'verify-options options
                                              (alist-delete 'action
                                                            result)))))))
        (option '("list-dead") #f #f
                (lambda (opt name arg result)
                  (alist-cons 'action 'list-dead


@@ 177,6 193,12 @@ Invoke the garbage collector.\n"))
         (list-relatives referrers))
        ((optimize)
         (optimize-store store))
        ((verify)
         (let ((options (assoc-ref opts 'verify-options)))
           (exit
            (verify-store store
                          #:check-contents? (memq 'contents options)
                          #:repair? (memq 'repair options)))))
        ((list-dead)
         (for-each (cut simple-format #t "~a~%" <>)
                   (dead-paths store)))