From mboxrd@z Thu Jan 1 00:00:00 1970 From: Leo Famulari Subject: Re: [PATCH] scripts: hash: Add --exclude-.git option. Date: Mon, 5 Sep 2016 17:14:02 -0400 Message-ID: <20160905211402.GA8220@jasmine> References: <87zinmybwv.fsf@gnu.org> <57CD38D2.6050807@goebel-consult.de> <87vayay3w4.fsf@gnu.org> <20160905202009.GB16662@macbook42.flashner.co.il> <87fupexdmc.fsf@gnu.org> Mime-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: 8bit Return-path: Received: from eggs.gnu.org ([2001:4830:134:3::10]:53293) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bh1Dm-00010l-KV for guix-devel@gnu.org; Mon, 05 Sep 2016 17:14:31 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bh1Di-00021P-C7 for guix-devel@gnu.org; Mon, 05 Sep 2016 17:14:26 -0400 Content-Disposition: inline In-Reply-To: <87fupexdmc.fsf@gnu.org> List-Id: "Development of GNU Guix and the GNU System distribution." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guix-devel-bounces+gcggd-guix-devel=m.gmane.org@gnu.org Sender: "Guix-devel" To: Jan Nieuwenhuizen Cc: guix-devel , Hartmut Goebel 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 > 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 > ;;; Copyright © 2013 Nikita Karetnikov > +;;; Copyright © 2016 Jan Nieuwenhuizen > ;;; > ;;; 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 > +# Copyright © 2016 Jan Nieuwenhuizen > # > # 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 | GNU LilyPond http://lilypond.org > Freelance IT http://JoyofSource.com | Avatar® http://AvatarAcademy.nl