From: Leo Famulari <leo@famulari.name>
To: Jan Nieuwenhuizen <janneke@gnu.org>
Cc: guix-devel <guix-devel@gnu.org>,
Hartmut Goebel <h.goebel@goebel-consult.de>
Subject: Re: [PATCH] scripts: hash: Add --exclude-.git option.
Date: Mon, 5 Sep 2016 17:14:02 -0400 [thread overview]
Message-ID: <20160905211402.GA8220@jasmine> (raw)
In-Reply-To: <87fupexdmc.fsf@gnu.org>
On Mon, Sep 05, 2016 at 11:04:11PM +0200, Jan Nieuwenhuizen wrote:
> Efraim Flashner writes:
>
> > Can this be generalized? `grep \\-download\) gnu/packages/*scm' shows also
> > svn-download, cvs-download and a lone hg-download.
>
> Okay. What about simply having non-default
>
> --exclude=FILE
I like this way the best. Hashing source code checkouts is still rare
enough in my experience that it makes sense to take a generalized
approach like this, in my opinion.
>
> See attached. (Missing test included this time).
>
> Greetings,
> Jan
>
> From ae738ad845f6d9e7576c42c53db6f7036b006e6c Mon Sep 17 00:00:00 2001
> From: Jan Nieuwenhuizen <janneke@gnu.org>
> Date: Mon, 5 Sep 2016 10:27:19 +0200
> Subject: [PATCH] scripts: hash: Add --exclude option.
>
> * guix/scripts/hash.scm (show-help): Add help text for --exclude option.
> (%options): Add --exclude option.
> (guix-hash): Handle exclude option.
> * doc/guix.texi ("invoking guix hash"): Update doc.
> * tests/guix-hash.sh: Add test.
> ---
> doc/guix.texi | 14 +++++++++++++-
> guix/scripts/hash.scm | 18 +++++++++++++++---
> tests/guix-hash.sh | 17 +++++++++++++++++
> 3 files changed, 45 insertions(+), 4 deletions(-)
>
> diff --git a/doc/guix.texi b/doc/guix.texi
> index 5330238..b5c0a7d 100644
> --- a/doc/guix.texi
> +++ b/doc/guix.texi
> @@ -4616,10 +4616,17 @@ The general syntax is:
> guix hash @var{option} @var{file}
> @end example
>
> -@command{guix hash} has the following option:
> +@command{guix hash} has the following options:
>
> @table @code
>
> +@item --exclude=@var{file}
> +@itemx -e @var{file}
> +Exclude @var{file} when computing a recursive hash, e.g.:
> +@example
> +$ guix hash -r -e .git .
> +@end example
> +
> @item --format=@var{fmt}
> @itemx -f @var{fmt}
> Write the hash in the format specified by @var{fmt}.
> @@ -4655,6 +4662,11 @@ $ cd foo
> $ rm -rf .git
> $ guix hash -r .
> @end example
> +@noindent
> +or simply use the -e (--exclude) option
> +@example
> +$ guix hash -r -e .git .
> +@end example
> @end table
>
> @node Invoking guix import
> diff --git a/guix/scripts/hash.scm b/guix/scripts/hash.scm
> index d440953..642e1c0 100644
> --- a/guix/scripts/hash.scm
> +++ b/guix/scripts/hash.scm
> @@ -1,6 +1,7 @@
> ;;; GNU Guix --- Functional package management for GNU
> ;;; Copyright © 2012, 2013, 2014 Ludovic Courtès <ludo@gnu.org>
> ;;; Copyright © 2013 Nikita Karetnikov <nikita@karetnikov.org>
> +;;; Copyright © 2016 Jan Nieuwenhuizen <janneke@gnu.org>
> ;;;
> ;;; This file is part of GNU Guix.
> ;;;
> @@ -49,6 +50,8 @@ Return the cryptographic hash of FILE.
> Supported formats: 'nix-base32' (default), 'base32', and 'base16' ('hex'
> and 'hexadecimal' can be used as well).\n"))
> (format #t (_ "
> + -e, --exclude=FILE exclude FILE when computing hash"))
> + (format #t (_ "
> -f, --format=FMT write the hash in the given format"))
> (format #t (_ "
> -r, --recursive compute the hash on FILE recursively"))
> @@ -62,7 +65,10 @@ and 'hexadecimal' can be used as well).\n"))
>
> (define %options
> ;; Specification of the command-line options.
> - (list (option '(#\f "format") #t #f
> + (list (option '(#\e "exclude") #t #f
> + (lambda (opt name arg result)
> + (alist-cons 'exclude arg result)))
> + (option '(#\f "format") #t #f
> (lambda (opt name arg result)
> (define fmt-proc
> (match arg
> @@ -78,6 +84,7 @@ and 'hexadecimal' can be used as well).\n"))
>
> (alist-cons 'format fmt-proc
> (alist-delete 'format result))))
> +
> (option '(#\r "recursive") #f #f
> (lambda (opt name arg result)
> (alist-cons 'recursive? #t result)))
> @@ -113,7 +120,12 @@ and 'hexadecimal' can be used as well).\n"))
> value)
> (_ #f))
> (reverse opts)))
> - (fmt (assq-ref opts 'format)))
> + (fmt (assq-ref opts 'format))
> + (exclude (assq-ref opts 'exclude))
> + (select? (if exclude
> + (lambda (f s)
> + (not (string= f (string-append (car args) "/" exclude))))
> + (const #t))))
>
> (define (file-hash file)
> ;; Compute the hash of FILE.
> @@ -121,7 +133,7 @@ and 'hexadecimal' can be used as well).\n"))
> (with-error-handling
> (if (assoc-ref opts 'recursive?)
> (let-values (((port get-hash) (open-sha256-port)))
> - (write-file file port)
> + (write-file file port #:select? select?)
> (flush-output-port port)
> (get-hash))
> (call-with-input-file file port-sha256))))
> diff --git a/tests/guix-hash.sh b/tests/guix-hash.sh
> index 23df01d..b59939e 100644
> --- a/tests/guix-hash.sh
> +++ b/tests/guix-hash.sh
> @@ -1,5 +1,6 @@
> # GNU Guix --- Functional package management for GNU
> # Copyright © 2013, 2014 Ludovic Courtès <ludo@gnu.org>
> +# Copyright © 2016 Jan Nieuwenhuizen <janneke@gnu.org>
> #
> # This file is part of GNU Guix.
> #
> @@ -20,6 +21,7 @@
> # Test the `guix hash' command-line utility.
> #
>
> +set -x
> guix hash --version
>
> tmpdir="guix-hash-$$"
> @@ -46,4 +48,18 @@ then false; else true; fi
> # the archive format doesn't support.
> if guix hash -r /dev/null
> then false; else true; fi
> +
> +# Adding a .git directory
> +mkdir "$tmpdir/.git"
> +touch "$tmpdir/.git/foo"
> +
> +# ...changes the hash
> +test `guix hash -r $tmpdir` = 0a50z04zyzf7pidwxv0nwbj82pgzbrhdy9562kncnvkcfvb48m59
> +
> +# ...but remains the same when using `-e .git'
> +test `guix hash -r $tmpdir -e .git` = 10k1lw41wyrjf9mxydi0is5nkpynlsvgslinics4ppir13g7d74p
> +
> +# Without '-r', this should fail.
> +if guix hash "$tmpdir"
> +then false; else true; fi
> +
> --
> 2.9.3
>
>
> --
> Jan Nieuwenhuizen <janneke@gnu.org> | GNU LilyPond http://lilypond.org
> Freelance IT http://JoyofSource.com | Avatar® http://AvatarAcademy.nl
next prev parent reply other threads:[~2016-09-05 21:14 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-09-05 8:43 [PATCH] scripts: hash: Add --exclude-.git option Jan Nieuwenhuizen
2016-09-05 9:20 ` Hartmut Goebel
2016-09-05 10:56 ` Vincent Legoll
2016-09-05 11:36 ` Jan Nieuwenhuizen
2016-09-05 20:20 ` Efraim Flashner
2016-09-05 21:04 ` Jan Nieuwenhuizen
2016-09-05 21:14 ` Leo Famulari [this message]
2016-09-05 20:50 ` Leo Famulari
2016-09-05 20:49 ` Danny Milosavljevic
2016-09-05 20:52 ` Leo Famulari
2016-09-05 21:33 ` Ludovic Courtès
2016-09-06 6:36 ` Jan Nieuwenhuizen
2016-09-06 12:26 ` Ludovic Courtès
2016-09-07 10:02 ` Ludovic Courtès
2016-09-06 6:48 ` Vincent Legoll
2016-09-06 12:24 ` Ludovic Courtès
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20160905211402.GA8220@jasmine \
--to=leo@famulari.name \
--cc=guix-devel@gnu.org \
--cc=h.goebel@goebel-consult.de \
--cc=janneke@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/guix.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.