unofficial mirror of guix-devel@gnu.org 
 help / color / mirror / code / Atom feed
* [PATCH] scripts: hash: Add --exclude-.git option.
@ 2016-09-05  8:43 Jan Nieuwenhuizen
  2016-09-05  9:20 ` Hartmut Goebel
                   ` (2 more replies)
  0 siblings, 3 replies; 16+ messages in thread
From: Jan Nieuwenhuizen @ 2016-09-05  8:43 UTC (permalink / raw)
  To: guix-devel

[-- Attachment #1: Type: text/plain, Size: 134 bytes --]

Hi!

Added an -g/--exclude-.git option for guix hash.  It is very specific:
it skips toplevel .git directory.  WDYT?

Greetings,
Jan


[-- Attachment #2: 0001-scripts-hash-Add-exclude-.git-option.patch --]
[-- Type: text/x-patch, Size: 3623 bytes --]

From 86a580840f21f858b757cb7f421b0ba1c169e09d 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-.git option.

* guix/scripts/hash.scm (show-help): Add help text for --exclude-.git option.
(%options): Add --exclude-.git option.
(guix-hash): Handle exclude-.git option.
* doc/guix.texi ("invoking guix hash"): Update doc.
* tests/guix-hash.sh: Add test.
---
 doc/guix.texi         | 11 ++++++++++-
 guix/scripts/hash.scm | 14 ++++++++++++--
 2 files changed, 22 insertions(+), 3 deletions(-)

diff --git a/doc/guix.texi b/doc/guix.texi
index 5330238..3393a1f 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -4616,10 +4616,14 @@ 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-.git
+@itemx -g
+Exclude the @var{.git} directory when computing a recursive hash.
+
 @item --format=@var{fmt}
 @itemx -f @var{fmt}
 Write the hash in the format specified by @var{fmt}.
@@ -4655,6 +4659,11 @@ $ cd foo
 $ rm -rf .git
 $ guix hash -r .
 @end example
+@noindent
+or simply use the -g (--exclude-.git) option
+@example
+$ guix hash -r -g .
+@end example
 @end table
 
 @node Invoking guix import
diff --git a/guix/scripts/hash.scm b/guix/scripts/hash.scm
index d440953..2933011 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.
 ;;;
@@ -51,6 +52,8 @@ and 'hexadecimal' can be used as well).\n"))
   (format #t (_ "
   -f, --format=FMT       write the hash in the given format"))
   (format #t (_ "
+  -g, --exclude-.git     exclude .git directory"))
+  (format #t (_ "
   -r, --recursive        compute the hash on FILE recursively"))
   (newline)
   (display (_ "
@@ -78,6 +81,10 @@ and 'hexadecimal' can be used as well).\n"))
 
                   (alist-cons 'format fmt-proc
                               (alist-delete 'format result))))
+        (option '(#\g "exclude-.git") #f #f
+                (lambda (opt name arg result)
+                  (alist-cons 'exclude-.git #t result)))
+
         (option '(#\r "recursive") #f #f
                 (lambda (opt name arg result)
                   (alist-cons 'recursive? #t result)))
@@ -113,7 +120,10 @@ and 'hexadecimal' can be used as well).\n"))
                              value)
                             (_ #f))
                            (reverse opts)))
-         (fmt  (assq-ref opts 'format)))
+         (fmt  (assq-ref opts 'format))
+         (select? (if (assq-ref opts 'exclude-.git)
+                      (lambda (f s) (not (string= f "./.git")))
+                      (const #t))))
 
     (define (file-hash file)
       ;; Compute the hash of FILE.
@@ -121,7 +131,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))))
-- 
2.9.3


[-- Attachment #3: Type: text/plain, Size: 154 bytes --]


-- 
Jan Nieuwenhuizen <janneke@gnu.org> | GNU LilyPond http://lilypond.org
Freelance IT http://JoyofSource.com | Avatar®  http://AvatarAcademy.nl  

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* Re: [PATCH] scripts: hash: Add --exclude-.git option.
  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 20:49 ` Danny Milosavljevic
  2016-09-05 21:33 ` Ludovic Courtès
  2 siblings, 1 reply; 16+ messages in thread
From: Hartmut Goebel @ 2016-09-05  9:20 UTC (permalink / raw)
  To: guix-devel


[-- Attachment #1.1: Type: text/plain, Size: 631 bytes --]

Am 05.09.2016 um 10:43 schrieb Jan Nieuwenhuizen:
> Added an -g/--exclude-.git option for guix hash.  It is very specific:
> it skips toplevel .git directory.  WDYT?

+1.

What about make i the default?

-- 
Schönen Gruß
Hartmut Goebel
Dipl.-Informatiker (univ), CISSP, CSSLP, ISO 27001 Lead Implementer
Information Security Management, Security Governance, Secure Software
Development

Goebel Consult, Landshut
http://www.goebel-consult.de

Blog:
http://www.goebel-consult.de/blog/filmgesprach-zu-201ecitizenfour201c-in-herrsching

Kolumne: http://www.cissp-gefluester.de/2010-01-hinterturen-allen-ortes


[-- Attachment #1.2: Type: text/html, Size: 1766 bytes --]

[-- Attachment #2: S/MIME Cryptographic Signature --]
[-- Type: application/pkcs7-signature, Size: 2430 bytes --]

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH] scripts: hash: Add --exclude-.git option.
  2016-09-05  9:20 ` Hartmut Goebel
@ 2016-09-05 10:56   ` Vincent Legoll
  2016-09-05 11:36     ` Jan Nieuwenhuizen
  0 siblings, 1 reply; 16+ messages in thread
From: Vincent Legoll @ 2016-09-05 10:56 UTC (permalink / raw)
  To: Hartmut Goebel; +Cc: guix-devel

Hello, here are my 2 cts

On Mon, Sep 5, 2016 at 11:20 AM, Hartmut Goebel
<h.goebel@goebel-consult.de> wrote:
> Am 05.09.2016 um 10:43 schrieb Jan Nieuwenhuizen:
>
> Added an -g/--exclude-.git option for guix hash.  It is very specific:
> it skips toplevel .git directory.  WDYT?

I'd rather name it "--exclude-git" or something less strange than
--exclude-.git,
even --exclude-dot-git...

> +1.
>
> What about make i the default?

OK with defaulting

-- 
Vincent Legoll

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH] scripts: hash: Add --exclude-.git option.
  2016-09-05 10:56   ` Vincent Legoll
@ 2016-09-05 11:36     ` Jan Nieuwenhuizen
  2016-09-05 20:20       ` Efraim Flashner
  2016-09-05 20:50       ` Leo Famulari
  0 siblings, 2 replies; 16+ messages in thread
From: Jan Nieuwenhuizen @ 2016-09-05 11:36 UTC (permalink / raw)
  To: Vincent Legoll; +Cc: guix-devel, Hartmut Goebel

Vincent Legoll writes:

>> Added an -g/--exclude-.git option for guix hash.  It is very specific:
>> it skips toplevel .git directory.  WDYT?
>
> I'd rather name it "--exclude-git" or something less strange than
> --exclude-.git,
> even --exclude-dot-git...

>> What about make i the default?
>
> OK with defaulting

Drop the option altogether, or make it --include-git?

Greetings,
Jan

-- 
Jan Nieuwenhuizen <janneke@gnu.org> | GNU LilyPond http://lilypond.org
Freelance IT http://JoyofSource.com | Avatar®  http://AvatarAcademy.nl  

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH] scripts: hash: Add --exclude-.git option.
  2016-09-05 11:36     ` Jan Nieuwenhuizen
@ 2016-09-05 20:20       ` Efraim Flashner
  2016-09-05 21:04         ` Jan Nieuwenhuizen
  2016-09-05 20:50       ` Leo Famulari
  1 sibling, 1 reply; 16+ messages in thread
From: Efraim Flashner @ 2016-09-05 20:20 UTC (permalink / raw)
  To: Jan Nieuwenhuizen; +Cc: guix-devel, Hartmut Goebel

[-- Attachment #1: Type: text/plain, Size: 853 bytes --]

On Mon, Sep 05, 2016 at 01:36:43PM +0200, Jan Nieuwenhuizen wrote:
> Vincent Legoll writes:
> 
> >> Added an -g/--exclude-.git option for guix hash.  It is very specific:
> >> it skips toplevel .git directory.  WDYT?
> >
> > I'd rather name it "--exclude-git" or something less strange than
> > --exclude-.git,
> > even --exclude-dot-git...
> 
> >> What about make i the default?
> >
> > OK with defaulting
> 
> Drop the option altogether, or make it --include-git?
> 
> Greetings,
> Jan
> 

Can this be generalized? `grep \\-download\) gnu/packages/*scm' shows also
svn-download, cvs-download and a lone hg-download.

-- 
Efraim Flashner   <efraim@flashner.co.il>   אפרים פלשנר
GPG key = A28B F40C 3E55 1372 662D  14F7 41AA E7DC CA3D 8351
Confidentiality cannot be guaranteed on emails sent or received unencrypted

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 819 bytes --]

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH] scripts: hash: Add --exclude-.git option.
  2016-09-05  8:43 [PATCH] scripts: hash: Add --exclude-.git option Jan Nieuwenhuizen
  2016-09-05  9:20 ` Hartmut Goebel
@ 2016-09-05 20:49 ` Danny Milosavljevic
  2016-09-05 20:52   ` Leo Famulari
  2016-09-05 21:33 ` Ludovic Courtès
  2 siblings, 1 reply; 16+ messages in thread
From: Danny Milosavljevic @ 2016-09-05 20:49 UTC (permalink / raw)
  To: Jan Nieuwenhuizen; +Cc: guix-devel

Hi Jan,

On Mon, 05 Sep 2016 10:43:28 +0200
Jan Nieuwenhuizen <janneke@gnu.org> wrote:
> Added an -g/--exclude-.git option for guix hash.  It is very specific:
> it skips toplevel .git directory.  

Why?

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH] scripts: hash: Add --exclude-.git option.
  2016-09-05 11:36     ` Jan Nieuwenhuizen
  2016-09-05 20:20       ` Efraim Flashner
@ 2016-09-05 20:50       ` Leo Famulari
  1 sibling, 0 replies; 16+ messages in thread
From: Leo Famulari @ 2016-09-05 20:50 UTC (permalink / raw)
  To: Jan Nieuwenhuizen; +Cc: guix-devel, Hartmut Goebel

On Mon, Sep 05, 2016 at 01:36:43PM +0200, Jan Nieuwenhuizen wrote:
> Vincent Legoll writes:
> 
> >> Added an -g/--exclude-.git option for guix hash.  It is very specific:
> >> it skips toplevel .git directory.  WDYT?
> >
> > I'd rather name it "--exclude-git" or something less strange than
> > --exclude-.git,
> > even --exclude-dot-git...
> 
> >> What about make i the default?
> >
> > OK with defaulting
> 
> Drop the option altogether, or make it --include-git?

One way or another, we should have a way to `guix hash -r` .git directories
if we really want to.

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH] scripts: hash: Add --exclude-.git option.
  2016-09-05 20:49 ` Danny Milosavljevic
@ 2016-09-05 20:52   ` Leo Famulari
  0 siblings, 0 replies; 16+ messages in thread
From: Leo Famulari @ 2016-09-05 20:52 UTC (permalink / raw)
  To: Danny Milosavljevic; +Cc: guix-devel

On Mon, Sep 05, 2016 at 10:49:23PM +0200, Danny Milosavljevic wrote:
> Hi Jan,
> 
> On Mon, 05 Sep 2016 10:43:28 +0200
> Jan Nieuwenhuizen <janneke@gnu.org> wrote:
> > Added an -g/--exclude-.git option for guix hash.  It is very specific:
> > it skips toplevel .git directory.  
> 
> Why?

To calculate the hash of a source that is a Git repository, one clones
the Git repository, checks out the desired commit, removes the '.git'
metadata directory, and then runs `guix hash -r` on the remaining Git
tree.

If the Git repository is very large, it's tedious to make a copy or
re-clone it in order to experiment with different commits. It would be
easier if `guix hash` could skip the '.git' metadata in that case.

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH] scripts: hash: Add --exclude-.git option.
  2016-09-05 20:20       ` Efraim Flashner
@ 2016-09-05 21:04         ` Jan Nieuwenhuizen
  2016-09-05 21:14           ` Leo Famulari
  0 siblings, 1 reply; 16+ messages in thread
From: Jan Nieuwenhuizen @ 2016-09-05 21:04 UTC (permalink / raw)
  To: Efraim Flashner; +Cc: guix-devel, Hartmut Goebel

[-- Attachment #1: Type: text/plain, Size: 287 bytes --]

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

See attached.  (Missing test included this time).

Greetings,
Jan


[-- Attachment #2: 0001-scripts-hash-Add-exclude-option.patch --]
[-- Type: text/x-patch, Size: 5294 bytes --]

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


[-- Attachment #3: Type: text/plain, Size: 154 bytes --]


-- 
Jan Nieuwenhuizen <janneke@gnu.org> | GNU LilyPond http://lilypond.org
Freelance IT http://JoyofSource.com | Avatar®  http://AvatarAcademy.nl  

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* Re: [PATCH] scripts: hash: Add --exclude-.git option.
  2016-09-05 21:04         ` Jan Nieuwenhuizen
@ 2016-09-05 21:14           ` Leo Famulari
  0 siblings, 0 replies; 16+ messages in thread
From: Leo Famulari @ 2016-09-05 21:14 UTC (permalink / raw)
  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 <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  

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH] scripts: hash: Add --exclude-.git option.
  2016-09-05  8:43 [PATCH] scripts: hash: Add --exclude-.git option Jan Nieuwenhuizen
  2016-09-05  9:20 ` Hartmut Goebel
  2016-09-05 20:49 ` Danny Milosavljevic
@ 2016-09-05 21:33 ` Ludovic Courtès
  2016-09-06  6:36   ` Jan Nieuwenhuizen
  2016-09-06  6:48   ` Vincent Legoll
  2 siblings, 2 replies; 16+ messages in thread
From: Ludovic Courtès @ 2016-09-05 21:33 UTC (permalink / raw)
  To: Jan Nieuwenhuizen; +Cc: guix-devel

Hello!

Jan Nieuwenhuizen <janneke@gnu.org> skribis:

> Added an -g/--exclude-.git option for guix hash.  It is very specific:
> it skips toplevel .git directory.  WDYT?

Good idea!

> From 86a580840f21f858b757cb7f421b0ba1c169e09d 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-.git option.
>
> * guix/scripts/hash.scm (show-help): Add help text for --exclude-.git option.
> (%options): Add --exclude-.git option.
> (guix-hash): Handle exclude-.git option.
> * doc/guix.texi ("invoking guix hash"): Update doc.
                    ^
Capital I.  :-)

> * tests/guix-hash.sh: Add test.
>  @table @code
>  
> +@item --exclude-.git
> +@itemx -g

What about --exclude-vcs/-x?  Tar uses that name, although with slightly
different semantics (info "(tar) exclude").

> +         (select? (if (assq-ref opts 'exclude-.git)
> +                      (lambda (f s) (not (string= f "./.git")))

Rather make the lambda a top-level procedure, like:

  (define (vcs-file? file stat)
    (case (stat:type stat)
      ((directory)
       (member (basename file) '(".git" ".svn" "CVS" …)))
      (else
       #f)))

… and then:

  (if (assq-ref opts 'exclude-vcs?)
      (negate vcs-file?)
      (const #t))

Could you send an updated patch?

Thank you for making our lives easier!  :-)

Ludo’.

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH] scripts: hash: Add --exclude-.git option.
  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
  1 sibling, 2 replies; 16+ messages in thread
From: Jan Nieuwenhuizen @ 2016-09-06  6:36 UTC (permalink / raw)
  To: Ludovic Courtès; +Cc: guix-devel, Hartmut Goebel

[-- Attachment #1: Type: text/plain, Size: 823 bytes --]

Ludovic Courtès writes:

Hi!

>> Added an -g/--exclude-.git option for guix hash.  It is very specific:
>> it skips toplevel .git directory.  WDYT?
>
> Good idea!

Thanks...

> What about --exclude-vcs/-x?  Tar uses that name, although with slightly
> different semantics (info "(tar) exclude").

Yes, I like this even better than my 2nd --exclude=FILE patch.

> Rather make the lambda a top-level procedure, like:
>
>   (define (vcs-file? file stat)
>     (case (stat:type stat)
>       ((directory)
>        (member (basename file) '(".git" ".svn" "CVS" …)))
>       (else
>        #f)))

Nice!

> Could you send an updated patch?

Sure, attached.

> Thank you for making our lives easier!  :-)

:-)  Exactly, the mv .git ../dot-git ... drill was getting boring.

Greetings,
Jan


[-- Attachment #2: 0001-scripts-hash-Add-exclude-vcs-option.patch --]
[-- Type: text/x-patch, Size: 5584 bytes --]

From 060f9123acd4c6771e976c5442361285f8c8bc89 Mon Sep 17 00:00:00 2001
From: Jan Nieuwenhuizen <janneke@gnu.org>
Date: Tue, 6 Sep 2016 08:28:33 +0200
Subject: [PATCH] scripts: hash: Add --exclude-vcs option.

* guix/scripts/hash.scm (show-help): Add help text for --exclude-vcs option.
(%options): Add --exclude-vcs option.
(guix-hash): Handle exclude-vcs option.
* doc/guix.texi ("Invoking guix hash"): Update doc.
* tests/guix-hash.sh: Add test.
---
 doc/guix.texi         | 15 ++++++++++++++-
 guix/scripts/hash.scm | 25 ++++++++++++++++++++-----
 tests/guix-hash.sh    | 16 ++++++++++++++++
 3 files changed, 50 insertions(+), 6 deletions(-)

diff --git a/doc/guix.texi b/doc/guix.texi
index 5330238..68a0707 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -4616,10 +4616,18 @@ 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-vcs
+@itemx -x
+Exclude version control system-directories (.bzr, .git, .hg, .svn, CVS)
+when computing a recursive hash, e.g.:
+@example
+$ guix hash -r -x .
+@end example
+
 @item --format=@var{fmt}
 @itemx -f @var{fmt}
 Write the hash in the format specified by @var{fmt}.
@@ -4655,6 +4663,11 @@ $ cd foo
 $ rm -rf .git
 $ guix hash -r .
 @end example
+@noindent
+or simply use the -x (--exclude-vcs) option
+@example
+$ guix hash -r -x .
+@end example
 @end table
 
 @node Invoking guix import
diff --git a/guix/scripts/hash.scm b/guix/scripts/hash.scm
index d440953..a57602a 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 © 2012, 2013, 2014, 2016 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 (_ "
+  -x, --exclude-vcs      exclude version control directories"))
+  (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 '(#\x "exclude-vcs") #f #f
+                (lambda (opt name arg result)
+                  (alist-cons 'exclude-vcs? #t result)))
+        (option '(#\f "format") #t #f
                 (lambda (opt name arg result)
                   (define fmt-proc
                     (match arg
@@ -81,7 +87,6 @@ and 'hexadecimal' can be used as well).\n"))
         (option '(#\r "recursive") #f #f
                 (lambda (opt name arg result)
                   (alist-cons 'recursive? #t result)))
-
         (option '(#\h "help") #f #f
                 (lambda args
                   (show-help)
@@ -107,13 +112,23 @@ and 'hexadecimal' can be used as well).\n"))
                   (alist-cons 'argument arg result))
                 %default-options))
 
+  (define (vcs-file? file stat)
+    (case (stat:type stat)
+      ((directory)
+       (member (basename file) '(".bzr" ".git" ".hg" ".svn" "CVS")))
+      (else
+       #f)))
+
   (let* ((opts (parse-options))
          (args (filter-map (match-lambda
                             (('argument . value)
                              value)
                             (_ #f))
                            (reverse opts)))
-         (fmt  (assq-ref opts 'format)))
+         (fmt  (assq-ref opts 'format))
+         (select? (if (assq-ref opts 'exclude-vcs?)
+                      (negate vcs-file?)
+                      (const #t))))
 
     (define (file-hash file)
       ;; Compute the hash of FILE.
@@ -121,7 +136,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..44213d5 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.
 #
@@ -46,3 +47,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 `-x'
+test `guix hash -r $tmpdir -x` = 10k1lw41wyrjf9mxydi0is5nkpynlsvgslinics4ppir13g7d74p
+
+# Without '-r', this should fail.
+if guix hash "$tmpdir"
+then false; else true; fi
+
-- 
2.9.3


[-- Attachment #3: Type: text/plain, Size: 154 bytes --]


-- 
Jan Nieuwenhuizen <janneke@gnu.org> | GNU LilyPond http://lilypond.org
Freelance IT http://JoyofSource.com | Avatar®  http://AvatarAcademy.nl  

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* Re: [PATCH] scripts: hash: Add --exclude-.git option.
  2016-09-05 21:33 ` Ludovic Courtès
  2016-09-06  6:36   ` Jan Nieuwenhuizen
@ 2016-09-06  6:48   ` Vincent Legoll
  2016-09-06 12:24     ` Ludovic Courtès
  1 sibling, 1 reply; 16+ messages in thread
From: Vincent Legoll @ 2016-09-06  6:48 UTC (permalink / raw)
  To: Ludovic Courtès; +Cc: guix-devel

On Mon, Sep 5, 2016 at 11:33 PM, Ludovic Courtès <ludo@gnu.org> wrote:
> Hello!
>
> Jan Nieuwenhuizen <janneke@gnu.org> skribis:
>
>> Added an -g/--exclude-.git option for guix hash.  It is very specific:
>> it skips toplevel .git directory.  WDYT?
>
> Good idea!
>
>> From 86a580840f21f858b757cb7f421b0ba1c169e09d 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-.git option.
>>
>> * guix/scripts/hash.scm (show-help): Add help text for --exclude-.git option.
>> (%options): Add --exclude-.git option.
>> (guix-hash): Handle exclude-.git option.
>> * doc/guix.texi ("invoking guix hash"): Update doc.
>                     ^
> Capital I.  :-)
>
>> * tests/guix-hash.sh: Add test.
>>  @table @code
>>
>> +@item --exclude-.git
>> +@itemx -g
>
> What about --exclude-vcs/-x?  Tar uses that name, although with slightly
> different semantics (info "(tar) exclude").
>
>> +         (select? (if (assq-ref opts 'exclude-.git)
>> +                      (lambda (f s) (not (string= f "./.git")))
>
> Rather make the lambda a top-level procedure, like:
>
>   (define (vcs-file? file stat)
>     (case (stat:type stat)
>       ((directory)
>        (member (basename file) '(".git" ".svn" "CVS" …)))

Could this not come from each vcs package ?

i.e. each vcs package defines a vcs-dir which get put together in a global
%vcs-dirs variable that is used here ?

I ask because that's how I did it in meld (which I'll try to package for guix)
in a distant past...

WDYT, overdesigned ?

I also like the generic proposal from Efraim (--exclude/-x)

-- 
Vincent Legoll

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH] scripts: hash: Add --exclude-.git option.
  2016-09-06  6:48   ` Vincent Legoll
@ 2016-09-06 12:24     ` Ludovic Courtès
  0 siblings, 0 replies; 16+ messages in thread
From: Ludovic Courtès @ 2016-09-06 12:24 UTC (permalink / raw)
  To: Vincent Legoll; +Cc: guix-devel

Vincent Legoll <vincent.legoll@gmail.com> skribis:

> On Mon, Sep 5, 2016 at 11:33 PM, Ludovic Courtès <ludo@gnu.org> wrote:
>> Hello!
>>
>> Jan Nieuwenhuizen <janneke@gnu.org> skribis:
>>
>>> Added an -g/--exclude-.git option for guix hash.  It is very specific:
>>> it skips toplevel .git directory.  WDYT?
>>
>> Good idea!
>>
>>> From 86a580840f21f858b757cb7f421b0ba1c169e09d 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-.git option.
>>>
>>> * guix/scripts/hash.scm (show-help): Add help text for --exclude-.git option.
>>> (%options): Add --exclude-.git option.
>>> (guix-hash): Handle exclude-.git option.
>>> * doc/guix.texi ("invoking guix hash"): Update doc.
>>                     ^
>> Capital I.  :-)
>>
>>> * tests/guix-hash.sh: Add test.
>>>  @table @code
>>>
>>> +@item --exclude-.git
>>> +@itemx -g
>>
>> What about --exclude-vcs/-x?  Tar uses that name, although with slightly
>> different semantics (info "(tar) exclude").
>>
>>> +         (select? (if (assq-ref opts 'exclude-.git)
>>> +                      (lambda (f s) (not (string= f "./.git")))
>>
>> Rather make the lambda a top-level procedure, like:
>>
>>   (define (vcs-file? file stat)
>>     (case (stat:type stat)
>>       ((directory)
>>        (member (basename file) '(".git" ".svn" "CVS" …)))
>
> Could this not come from each vcs package ?
>
> i.e. each vcs package defines a vcs-dir which get put together in a global
> %vcs-dirs variable that is used here ?
>
> I ask because that's how I did it in meld (which I'll try to package for guix)
> in a distant past...
>
> WDYT, overdesigned ?

Respectfully, I think so.  :-)

Ludo’.

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH] scripts: hash: Add --exclude-.git option.
  2016-09-06  6:36   ` Jan Nieuwenhuizen
@ 2016-09-06 12:26     ` Ludovic Courtès
  2016-09-07 10:02     ` Ludovic Courtès
  1 sibling, 0 replies; 16+ messages in thread
From: Ludovic Courtès @ 2016-09-06 12:26 UTC (permalink / raw)
  To: Jan Nieuwenhuizen; +Cc: guix-devel, Hartmut Goebel

Jan Nieuwenhuizen <janneke@gnu.org> skribis:

>> What about --exclude-vcs/-x?  Tar uses that name, although with slightly
>> different semantics (info "(tar) exclude").
>
> Yes, I like this even better than my 2nd --exclude=FILE patch.

I prefer --exclude-vcs too because that’s the main use case, so it’s
best to have a shortcut.

> From 060f9123acd4c6771e976c5442361285f8c8bc89 Mon Sep 17 00:00:00 2001
> From: Jan Nieuwenhuizen <janneke@gnu.org>
> Date: Tue, 6 Sep 2016 08:28:33 +0200
> Subject: [PATCH] scripts: hash: Add --exclude-vcs option.
>
> * guix/scripts/hash.scm (show-help): Add help text for --exclude-vcs option.
> (%options): Add --exclude-vcs option.
> (guix-hash): Handle exclude-vcs option.
> * doc/guix.texi ("Invoking guix hash"): Update doc.
> * tests/guix-hash.sh: Add test.

OK for me!  If there are no objections, I’ll commit this one.

Ludo’.

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH] scripts: hash: Add --exclude-.git option.
  2016-09-06  6:36   ` Jan Nieuwenhuizen
  2016-09-06 12:26     ` Ludovic Courtès
@ 2016-09-07 10:02     ` Ludovic Courtès
  1 sibling, 0 replies; 16+ messages in thread
From: Ludovic Courtès @ 2016-09-07 10:02 UTC (permalink / raw)
  To: Jan Nieuwenhuizen; +Cc: guix-devel, Hartmut Goebel

Jan Nieuwenhuizen <janneke@gnu.org> skribis:

> From 060f9123acd4c6771e976c5442361285f8c8bc89 Mon Sep 17 00:00:00 2001
> From: Jan Nieuwenhuizen <janneke@gnu.org>
> Date: Tue, 6 Sep 2016 08:28:33 +0200
> Subject: [PATCH] scripts: hash: Add --exclude-vcs option.
>
> * guix/scripts/hash.scm (show-help): Add help text for --exclude-vcs option.
> (%options): Add --exclude-vcs option.
> (guix-hash): Handle exclude-vcs option.
> * doc/guix.texi ("Invoking guix hash"): Update doc.
> * tests/guix-hash.sh: Add test.

Pushed as 392a4e122350367c4b4ac331db5ec28360c7f38c with minor edits to
guix.texi, thanks!

Ludo’.

^ permalink raw reply	[flat|nested] 16+ messages in thread

end of thread, other threads:[~2016-09-07 10:02 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
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
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

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/guix.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).